微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Web Worker 中用字符替换所有 html 实体的替代方法

如何解决在 Web Worker 中用字符替换所有 html 实体的替代方法

我正在尝试让我的脚本(jQuery 终端库)在 Web Worker 中运行,并且使用最少的 jQuery 替换并且没有 JS-DOM。我有 bare_text 这样的函数

// -------------------------------------------------------------------------
function bare_text(string) {
    if (!string.match(/&/)) {
        return string;
    }
    return $('<span>' + safe(string) + '</span>').text();
}
// -------------------------------------------------------------------------
function text(string) {
    return bare_text($.terminal.strip(string));
}
// -------------------------------------------------------------------------
function safe(string) {
    if (!string.match(/[<>&]/)) {
        return string;
    }
    return string.replace(/&(?![^;]+;)/g,'&amp;')
        .replace(/>/g,'&gt;').replace(/</g,'&lt;');
}

我需要改变这个函数来做同样的事情,但没有 DOM 和 jQuery。有什么选择吗?

此外,如果您知道如何以其他方式简化这些功能,我将非常感激。那么这些函数的作用(代码很旧)它会用适当的字符替换任何 html 实体,并忽略被视为普通文本的 html 标签

解决方法

我的解决方案是访问显示所有 html 实体的网站(例如:https://www.freeformatter.com/html-entities.html

并在控制台中运行此代码:

[].concat.apply([],[...document.querySelectorAll('.bordered-table')].map(table => {
    var t = [...table.querySelectorAll('tbody tr')];
    return t.map(tr => ({
      entity: tr.querySelector('td:nth-child(2)').innerText,char: tr.querySelector('td:nth-child(1)').innerText
    })).filter(o => o.entity);
})).reduce((acc,obj) => (acc[obj.entity] = obj.code,acc),{});

然后您可以使用 JSON.stringify(arr,true,4); 将其转换为字符串,您可以复制/粘贴到您的代码中并像这样使用:

var entities = {...}; // map from above

function renderEntities(str) {
    return str.replace(/&#(x?)([0-9]+);/g,function(_,hex,code) {
        code = parseInt(code,hex ? 16 : 10);
        return String.fromCharCode(code);
    }).replace(/(&[^;]+;)/g,entity) {
        // if entity is not recognized it need to be
        // inserted as is example &foo;
        return entities[entity] || entity;
    });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。