konto usunięte

Temat: Dopełnianie HTML'a

Cześć,

posiadam taką strukturę ( string ) na przykład,

tekst tekst
<ul>
<li>asdasd</li>
<li>asdasdasd

pytanie,
jak dopełnić taką strukturę aby była poprawna w stosunku do HTML'a? Dodam, że jestem ograniczony do czystego JavaScriptu.

Pozdrawiam
Piotr Koszuliński

Piotr Koszuliński JavaScript ninja

Temat: Dopełnianie HTML'a

O ile "czysty JS" nie oznacza JS bez DOM-a, to...

CKEditor używa takiego tricku że wrzuca to w jakiś element (np. body) i pobiera z powrotem. Przeglądarka poprawia wiele rzeczy sama.


var fixbin = document.createElement( 'body' );
fixBin.innerHTML = input;
var output = fixBin.innerHTML;


Niestety:

* Różne przeglądarki potrafią przy tym popsuć różne rzeczy. Np. pozmieniać adresy z relatywnych na pełne. Tak więc jeśli nie chcesz naprawiać takich rzeczy, to musiałbyś je wcześniej zabezpieczyć (co CKEditor też robi).
* Nie wszystko przeglądarki naprawią i nie będziesz również miał jednolitego wyniku. Np. HTML z IE będzie czasem jeszcze gorszy :D. Dlatego CKE następnie wszystko parsuje do drzewa obiektów i następnie z powrotem serializuje.

I tak naprawdę jeśli bym szukał rozwiązania to w postaci parsera HTML + writera (choć tego można łatwo samemu napisać). Jeśli parser jest porządny, to nie musisz używać tego tricku z przepuszczaniem przez fixBin. CKE go stosuje by później móc użyć parsera opartego na Regepx, który w tym wypadku daje dobre rezultaty i jest optymalny.Piotr Koszuliński edytował(a) ten post dnia 20.03.13 o godzinie 16:47
Mirosław Ratman

Mirosław Ratman Manager IT,
Architekt systemów
@Avast, Founder
@aSyncro ...

Temat: Dopełnianie HTML'a

Konrad Mariusz Kur:
jak dopełnić taką strukturę aby była poprawna w stosunku do HTML'a?

użyc odpowiednich tagów ;)Mirosław Ratman edytował(a) ten post dnia 20.03.13 o godzinie 16:51

konto usunięte

Temat: Dopełnianie HTML'a

Pamiętam że robiłem coś takiego w ograniczonym stopniu zakładając że

1. < otwiera znacznik i zaraz po nim (bez spacji itp jak być powinno) następuje znacznik.
2. Nie obchodziły mnie kompletnie atrybuty, wymagałem tylko zamknięcia > i parzystej liczby "" lub ''. Nie wdawałem się w szczegóły
3. W momencie gdy trafiałem na <(znacznik)+śmieci> odkładałem go na stos.
4. Jak znajdywałem </(znacznik)> to zdejmowałem go ze stosu.

Teraz kilka prostych trików:
- zamknięcie musi być ZAWSZE takie jak ostatni element na stosie. Dlaczego ? Bo html nie dopuszcza np:
<p><a>test</p></a>
Jeżeli warunku nie spełniono to ręcznie dopisuje zamknięcie i lecę dalej ze skryptem na tej samej zasadzie.

- Jeżeli stos zejdzie do zera a pojawi się znacznik zamykający - zostanie on zignorowany

A dokument sprawdzałem znak po znaku. <[a-zA-Z] triggerował procedurę otwarcia tagu a </a-zA-Z procedurę zamknięcia wraz z całym sprawdzaniem.

Prosty parser a sprawdzał się wręcz idealnie. Sugerowałem bym coś w ten deseń. Nie jest to skomplikowane rozwiązanie i pozostawia wiele do życzenia ale dopóki dokument chociaż przypominał HTML - okiełznał go bez problemu.Dariusz Półtorak edytował(a) ten post dnia 20.03.13 o godzinie 18:24

konto usunięte

Temat: Dopełnianie HTML'a

Ten task załatwiłem na poziomie niżej za pomocą Pythona. Dzięki za odpowiedzi.

konto usunięte

Temat: Dopełnianie HTML'a

a w jaki sposób? poprzez HTMLParser czy inaczej?

konto usunięte

Temat: Dopełnianie HTML'a

Dopełnienie za pomocą beautifulsoup, okazało się, że mogę ten krok wykonać na niższym poziomie. Wtedy znika wtedy trochę zależność jak np. wersja przeglądarki ;-)

konto usunięte

Temat: Dopełnianie HTML'a

Oftopicznie: zmień zdjęcie na zgodne z regulaminem GL.

Następna dyskusja:

jak zapobiec przeskakiwaniu...




Wyślij zaproszenie do