Функция для оборачивания текста в теги

Помогите написать функцию для оборачивания текста в теги с атрибутами. В тексте и в атрибутах могут быть спец символы, которые должны заменяться на мнемоники. Код написан, но он не очень рациональный, длинный, не получается правильно подобрать замены в функцию, чтобы реплейс не повторялся (и еще без использования 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, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;") + "'";   
    return ('<' + tag + attr + '>' + text.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;") + '</' + tag + '>');
  }
}
 
var wrapH1 = new BuildW("P");
console.log( wrapP("Однажды в <студёную> зимнюю пору",{align:"center",title:"M&M's"}) ); // <P align='center' title='M&amp;M&apos;s'>Однажды в &lt;студёную&gt; зимнюю пору</P>

Спасибо

Привет!
Немного отрефакторил твой код:

function BuildW(tag) {
  function encode(str) {
    return str.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, '&quot;').replace(/‘/g, "&#039;")
  }
    
  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"}) );

Сделал небольшое исправление - замена спецсимволов на мнемоники, а не опять на те же спецсимволы

Если не принципиально, чтобы была именно замена на мнемоники, а подойдет замена на коды символов, то может подойти такая универсальная функция (которую можно дополнять необходимыми спецсимволами):

function escape (text) {
  return text.replace(/[<>\&\"\']/g, function(c) {
    return '&#' + c.charCodeAt(0) + ';';
  });
}
1 лайк

Спасибо большое, то, что надо!

1 лайк