2012-10-20 19 views
5

Jestem w trakcie kodowania edytora HTML w Javie. Chcę, żeby wspierało automatyczne wcięcie. Mam zaimplementowany wzór złożony do reprezentowania obiektów znaczników HTML w aktualnie edytowanym pliku. Na przykład, kod:Manipulacja ciągiem lub funkcja rekursywna?

<table> <tr> <th>Col1</th> <th>Col2</th> </tr> <tr> <td>Data1</td> <td>Data2</td> </tr> </table>

skutkowałoby tym wzorem strukturalnym kompozytowej:

  • tabeli -> tr (I), tR (sekundy)
  • tr (I) -> p (Col1), th (Col2)
  • tR (s) -> TD (Dane 1) TD (Dane 2)

gdzie x -> y, z oznacza, że ​​x jest rodzicem y i z.

mam dwie możliwości:

  1. stworzyć funkcji rekurencyjnej, aby powrócić ciąg z wcięcia zawarte.
  2. Utwórz funkcję rekursywną, która po prostu zwraca niesformatowany ciąg bieżącego kodu HTML, a następnie dodaj wcięcie.

Łatwo jest zrobić pierwszy; jednak trudno jest kontynuować automatyczne wcięcie zgodnie z wzorcem wcięcia użytkownika, jeśli zmienia wzór. Z tego powodu myślę, że opcja 2 jest lepsza. Wydaje mi się, że to może być bardziej dynamiczne, jeśli mogę sprawić, że działa poprawnie. Problem polega na tym, że nie jestem całkiem pewien, jak manipulować ciągiem znaków.

Myślałem, że mogę jakoś wykorzystać stos. Mogłem wcisnąć na nie otwarty znacznik i wyjąć go, gdy jest zamknięty. Liczba tagów na stosie określałaby liczbę razy, w których potrzebuję wcięcia przed następnym znacznikiem w nowej linii. Zamiast tego mógłbym użyć liczby całkowitej, ale ta sama zasada obowiązuje. Problem polega na tym, że nie wiem, jak wykonać iterację poprzez znaczniki w łańcuchu, aby móc nim manipulować.

Czy istnieje sposób na manipulowanie ciągami w sposób opisany przeze mnie? A może lepiej skorzystać z funkcji rekursywnej?

Odpowiedz

1

Biorąc pod uwagę twoje tak dobrze sformułowane pytanie, myślę, że jesteś najlepszą osobą, która na nie odpowie, a potrzebujesz tylko więcej informacji.

wymyślić tych informacji, może to być pomocne:

  1. uwzględniać cały cykl życia tekście. Będziesz musiał reagować na naciskanie klawiszy itd. To, że model i prezentacja są wyraźnie rozdzielone, jest dużo lepsze niż manipulowanie wyściełanymi sznurkami. Inną korzyścią jest to, że można wybrać istniejący komponent edycji tekstu względnie niezależnie od modelu

  2. Rozważmy przykłady: edytorów tekstowych, open source jak jEdit itp

+0

Myślę, że najlepszą opcją jest prawdopodobnie użycie funkcji rekursywnej. Dziękuję Ci bardzo. – CouchCommando

0

Dla XHTML, zadanie może być wykonane bardzo łatwo przy użyciu arkusza stylów XSLT i XSL.

+0

Niestety, nie będzie to miało zastosowania w moim przypadku.Mówię o pisaniu na końcu programu. Oto prosty diagram UML przedstawiający, co się dzieje: http://imgur.com/Aivc6 Kontener buforowy zawiera ciąg - bieżący plik HTML, który jest edytowany, zbudowany na podstawie połączonej z nim struktury złożonej. HTMLConstruct to po prostu interfejs definiujący wszystkie konkretne konstrukcje, które są obiektami reprezentującymi znaczniki HTML i ich wewnętrzne informacje. Zauważ, że BufferContext jest częścią Modelu, a nie częścią Widoku. – CouchCommando