Pracuję nad prostym emulatorem ekranu/terminalu (podobnym do wtyczki JQuery, ale bez funkcji RPC i funkcji okna). Każda linia ekranu jest rzędem tabeli (ciąg HTML), a polecenie drukowania może wstawiać tekst z niektórymi atrybutami (np. Kolor pierwszego planu i kolor tła). Każdy drukowany tekst jest otoczone przęsła z atrybutami stylu, na przykład:Uzyskaj atrybuty załączającego znacznika w ciągu HTML
<span style="color:#000000;background-color:#111111">A</span><span style="color:#222222;background-color:#333333>BC</span>
To działa prawidłowo. Teraz chcę dodać funkcję, która daje mi wszystkie atrybuty postaci na danej pozycji ekranu, w powyższym wierszu znak w pozycji 0 (A) ma kolor # 000000. Więc muszę policzyć znaki, które nie należą do znacznika zakresu i uzyskać ostatnie poprzednie style. Moje pierwsze rozwiązanie jest dość podatny na błędy:
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;
}
Czy istnieje prostsze rozwiązanie bez liczenia znaków (może JQuery lub regex)? To jest podobne do Get parent element of a selected text , ale nie potrzebuję selekcji, tylko indeks postaci.