Помогите написать функцию для оборачивания текста в теги с атрибутами. В тексте и в атрибутах могут быть спец символы, которые должны заменяться на мнемоники. Код написан, но он не очень рациональный, длинный, не получается правильно подобрать замены в функцию, чтобы реплейс не повторялся (и еще без использования createHtmlElement).
Вот такой код:
function BuildW(tag) {
return function(text, attrObj) {
var attr = '';
if (typeof attrObj === 'object')
for (var k in attrObj)
attr += " " + k + "='" + attrObj[k].replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'") + "'";
return ('<' + tag + attr + '>' + text.replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'") + '</' + tag + '>');
}
}
var wrapH1 = new BuildW("P");
console.log( wrapP("Однажды в <студёную> зимнюю пору",{align:"center",title:"M&M's"}) ); // <P align='center' title='M&M's'>Однажды в <студёную> зимнюю пору</P>
function BuildW(tag) {
function encode(str) {
return str.replace(/&/g, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, '"').replace(/‘/g, "'")
}
return function(text, attrObj) {
let attr = '';
if (typeof attrObj === 'object')
for (let attrName in attrObj) {
const nextAttr = attrName + `="` + encode(attrObj[attrName]) + `"`;
attr += " " + nextAttr;
}
return ('<' + tag + attr + '>' + encode(text) + '</' + tag + '>');
}
}
var wrapP = new BuildW("p");
console.log( wrapP("Однажды в <студёную> зимнюю пору",{align:"center",title:"M&M's"}) );
Сделал небольшое исправление - замена спецсимволов на мнемоники, а не опять на те же спецсимволы
Если не принципиально, чтобы была именно замена на мнемоники, а подойдет замена на коды символов, то может подойти такая универсальная функция (которую можно дополнять необходимыми спецсимволами):