В настоящее время я делаю пользовательский скрипт для интерпретации языка программирования APL в окне чата Stackexchange. Это код, который я придумал:
// ==UserScript==
// @name APL chat
// @version 2
// @grant GM_xmlhttpRequest
// @grant GM_listValues
// @match https://chat.stackexchange.com/*
// @run-at document-start
// @require https://cdn.jsdelivr.net/npm/[email protected]/lib/apl.min.js
// ==/UserScript==
// thanks to @cvzi for making it work correctly!
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(function(mutations, observer) {
// fired when a mutation occurs
console.info(mutations, observer);
let codes = document.getElementsByTagName("code");
for (let elem of codes) {
if (elem.innerText && !('interpreted' in elem.dataset) && elem.innerText[0] == '⋄') {
elem.dataset.interpreted = true; // see https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes#JavaScript_access
let result = ''
let color = 'red'
// Catch apl error and show it in orange color
try {
result = apl(elem.innerText).toString()
} catch(e) {
result = e.toString()
color = 'orange'
}
let tmp = document.createElement("div");
tmp.innerHTML = "<pre style=\"color:"+color+"\">"+result.replace("\n","<br>")+"</pre>";
let parent = elem.parentElement;
parent.appendChild(tmp.firstChild);
//console.info(result);
}
}
});
window.addEventListener('DOMContentLoaded', (event) => {
alert = function() {}; // Prevents ⎕← and ⍞← from trggering alerts
window.alert = function(){};
observer.observe(document, {
subtree: true,
ChildList:true,
attributes: true
});
});
Когда в тело записывается блок кода с символом ⋄
, он должен выполняться и отображаться красным цветом под кодом.
Функция apl()
принимает одну строку и интерпретирует ее на языке APL, и она импортируется из инструкции @require
с использованием интерпретатора ngn javascript APL. После подтверждения ngn могу сказать, что никакие глобалы не мешают.
Он отлично работает в Firefox (Greasemonkey), но в Chrome Tampermonkey любая chat.stackexchange.com
страница, которую я посещаю, никогда не перестает загружаться. Он застревает в этом месте:
И это ошибки консоли:
Uncaught TypeError: o.substr is not a function
at HTMLLIElement.<anonymous> (master-chat-with-millinery.js?v=93a5b9100f35:1)
at Function.each (jquery.min.js:2)
at n.fn.init.each (jquery.min.js:2)
at o (master-chat-with-millinery.js?v=93a5b9100f35:1)
at Sidebar (master-chat-with-millinery.js?v=93a5b9100f35:1)
at Vt (master-chat-with-millinery.js?v=93a5b9100f35:3)
at StartChat (master-chat-with-millinery.js?v=93a5b9100f35:3)
at HTMLDocument.<anonymous> (the-nineteenth-byte:182)
at i (jquery.min.js:2)
at Object.fireWith [as resolveWith] (jquery.min.js:2)
master-chat-with-millinery.js?v=93a5b9100f35:7 Uncaught TypeError: Cannot read property 'resolve' of undefined
at Object.<anonymous> (master-chat-with-millinery.js?v=93a5b9100f35:7)
at i (jquery.min.js:2)
at Object.fireWith [as resolveWith] (jquery.min.js:2)
at y (jquery.min.js:4)
at XMLHttpRequest.c (jquery.min.js:4)
DevTools failed to load SourceMap: Could not load content for chrome-extension://dhdgffkkebhmkfjojejmpbldmpobfkfo/sm/66503b0e4799e2375dd4e11269326fc0fcb9a65474ff19f45c7f956fd381cea8.map: HTTP error: status code 404, net::ERR_UNKNOWN_URL_SCHEME
У меня есть подозрения на MutationObserver
и @grant
, но я не уверен, что именно вызывает эту проблему. Это может быть что-то еще.
Каково правильное решение этой проблемы?
@cuzi конечно, попробую.
@cuzi, похоже, та же проблема с 10-секундным тайм-аутом. Я также пробовал очищать куки и кеш.
@cuzi хорошо, кажется, это работает, когда я встраиваю минимизированный js вместо того, чтобы требовать его.
Проблема здесь была решена путем перемещения скрипта @require
внутрь слушателя DOMContentLoaded
, как в этой ссылке .
Я думаю, что основная проблема заключалась в том, что интерпретатор вызывал конфликты, поскольку он загружался до загрузки страницы. Я был бы признателен, если бы кто-нибудь нашел способ заставить это работать с @require
в нем.
Вы устанавливаете @ run-at document-start в своем пользовательском скрипте, это заставляет скрипт запускаться до загрузки страницы, если вы удалите его, скрипт внедряется после запуска DOMContentLoaded. Если это не поможет, вы можете попробовать использовать исходный код из gitlab @require gitlab.com/n9n/apl/-/raw/master/apl.js вам нужно будет изменить вызов apl на result = apl .fmt(apl(elem.innerText)).toString()
@cuzi Это работает отлично. Не стесняйтесь добавлять ответ, чтобы я мог присудить награду.
Вы устанавливаете @run-at document-start
в своем пользовательском скрипте, это заставляет скрипт запускаться до загрузки страницы, если вы удаляете его, скрипт внедряется после запуска DOMContentLoaded
.
Если это не поможет, вы можете попробовать использовать исходный код из gitlab @require https://gitlab.com/n9n/apl/-/raw/master/apl.js
вам нужно будет изменить вызов apl на result = apl.fmt(apl(elem.innerText)).toString()
Я предполагаю, что конфликт возникает из-за того, что библиотека apl (https://cdn.jsdelivr.net/npm/[email protected]/lib/apl.js ) имеет некоторые вспомогательные функции сценария кофе, включенные в верхнюю часть файла. , в частности, есть некоторые объявленные методы Array.prototype.*
, которые также будут доступны на странице. Это может сломать страницу, см. этот вопрос для получения дополнительной информации: Почему расширение нативных объектов является плохой практикой?
Я не могу воспроизвести проблему. Пробовали ли вы запускать скрипт позже, когда чат полностью загрузится. Например, window.setTimeout для всего скрипта, чтобы подождать несколько секунд перед выполнением.