Sto lavorando a una semplice schermata di testo/emulatore di terminale (simile al plug-in di terminale JQuery, ma senza elementi RPC e con funzionalità di finestra). Ogni riga dello schermo è una riga della tabella (una stringa HTML) e un comando di stampa può inserire testo con alcuni attributi (ad esempio colore di primo piano e sfondo). Ogni testo stampato è racchiuso da un arco con gli attributi di stile, per esempio:Ottieni gli attributi del tag di inclusione nella stringa HTML
<span style="color:#000000;background-color:#111111">A</span><span style="color:#222222;background-color:#333333>BC</span>
Questo funziona bene. Ora voglio aggiungere una funzione che mi dà tutti gli attributi di un personaggio in una data posizione dello schermo, nella riga sopra il carattere in posizione 0 (A) ha il colore # 000000. Quindi devo contare i caratteri che non appartengono al tag span e ottengono gli ultimi stili precedenti. La mia prima soluzione piuttosto soggetta a errori è:
function getAttr(line, position) {
var result = {foreground:'', background:''},
ch = '', i, j = -1, tag = false;
// Count characters
for (i = 0; i < line.length && j < position; i++) {
ch = line.charAt(i);
if (ch == '<') {
tag = true;
}
if (ch == '>') {
tag = false;
}
else if (!tag) {
j++;
}
}
i--;
// Find styles
while (i > 0 && line.charAt(i) != '<') {
if (line.substr(i, 6) == 'color:') {
result.foreground = line.substr(i + 6, 7);
}
if (line.substr(i, 17) == 'background-color:') {
result.background = line.substr(i + 17, 7);
}
i--;
}
return result;
}
Esiste una soluzione più semplice, senza contare i personaggi (forse JQuery o un regex)?
Questo è simile a Get parent element of a selected text ma non ho bisogno di una selezione, solo un indice di carattere.