вариант использования моего расширения Chrome - выделить текст и создать выделенный текст как гиперссылку в сообщениях Gmail, если текст соответствует списку тем.Для этого я попытался только с 6 темами, хотя gmail терпит крах.В действительности, список тем будет 1000 +
Что я сделал, это при загрузке документа, я вызвал функцию fetchTopics (в реальном API вызывается для получения тем) и внутри этой функции я повторилповерх объекта topicData и передайте тему одну за другой в функцию searchPage и назначьте ее переменной re
, чтобы проверить, соответствует ли предоставленная тема тексту во входящем сообщении gmail.
Вот мой код
var topicData = [
{
id: 1,
name: 'Courses'
},
{
id: 2,
name: 'miss'
},
{
id: 3,
name: 'out'
},
{
id: 4,
name: 'your'
},
{
id: 5,
name: 'savings'
},
{
id: 6,
name: 'and'
}
];
function fetchTopics() {
// const apiUrl = `http://localhost:3020/v2/emails`;
// const headers = new Headers();
// headers.append('Content-Type', 'application/json');
return topicData.map(datum => {
return searchPage(datum.name);
});
// fetch(apiUrl, {
// method: 'GET',
// headers
// })
// .then(function(response) {
// return response.json();
// })
// .then(function(data) {
// topicData.map(datum => searchPage(data.name));
// })
// .catch(function(err) {
// console.log('err', err);
// });
}
/* the searchPage function takes an argument which is going
to set the variable re. Then iterate through topic array and call the searchPage function
for each value inside it while passing that value to the function
*/
function searchPage(topic) {
console.log('topic', topic);
var re = new RegExp(topic, 'g'); // example regex that the function will use for search
var regs;
var walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_TEXT,
function(node) {
if ((regs = re.exec(node.textContent))) {
if (!node.parentNode.classList.contains('highlighted_text')) {
var match = document.createElement('A');
match.appendChild(document.createTextNode(regs[0]));
match.href = `https://app.com/CustomTopic/${
regs[0]
}`;
match.classList.add('highlighted_text');
var after = node.splitText(regs.index);
after.nodeValue = after.nodeValue.substring(regs[0].length);
node.parentNode.insertBefore(match, after);
}
}
return NodeFilter.FILTER_SKIP;
},
false
);
walker.nextNode();
}
// Run when the whole document loads
$(window).bind('load', function() {
document.addEventListener('click', init);
fetchTopics();
});