Quale struttura dati può utilizzare un elaboratore di testi per mappare la posizione del punto di inserimento dell'utente / la selezione del testo nella sua rappresentazione interna del documento?

3

I processori di testi (ad es. Microsoft Word) visualizzano i documenti all'utente come testo in stile. L'utente può selezionare una parte di questo testo e applicare gli stili ad esso, e modificare il testo.

Il word processor deve (suppongo) avere una rappresentazione interna del documento che indichi quali bit del testo visualizzato all'utente debbano essere stilizzati in modo diverso. Ma l'utente non interagisce con questa rappresentazione interna. Interagiscono con il testo, usando il cursore e selezionando porzioni di esso.

Quale struttura dati potrebbe utilizzare il word processor per mappare in modo efficiente il testo con cui l'utente interagisce con il suo modello interno del documento?

    
posta Paul D. Waite 27.12.2012 - 16:02
fonte

3 risposte

2

Ci sono un numero infinito di modi per farlo, ma il concetto di base non è così difficile. Supponiamo che tu abbia usato HTML per la tua rappresentazione interna:

<strong>bold text here</strong> non-bold.

Se il tuo widget GUI ti dice che il cursore è dopo il 4 ° personaggio, tutto ciò che devi fare è contare sul 4 ° carattere, ma quando arrivi a qualcosa all'interno di parentesi angolari, non lo contati, ma invece tieni traccia di quale formattazione sta applicando o non applicando.

Ovviamente, per un documento di grandi dimensioni non si desidera contare i caratteri dall'inizio ogni volta che si preme un tasto, quindi utilizzano strutture dati più efficienti, ma il concetto di base è lo stesso. Hai una sorta di mappatura tra i caratteri visibili e i loro metadati.

    
risposta data 27.12.2012 - 16:37
fonte
1

Vorrei premettere questo post dicendo che non ho ancora lavorato su alcun editor di testo. Potrebbe esserci qualche pratica standard di cui non sono a conoscenza ... detto questo, un albero non sembra avere molto senso qui; cosa avresti per i fratelli? Se hai provato ad usare un albero, penso che ti ritroverai con una lista collegata, che funziona bene qui.

Che cosa vuoi dalla tua struttura dati? Presumo che sia necessario spostare rapidamente il cursore, facendo copia / incolla velocemente, ecc. Con un elenco collegato, si hanno inserimenti a tempo costante, quindi spostare il cursore è semplice come rimuovere un nodo cursore speciale __c e inserire è un posto in avanti.

(T) -> (h) -> (__c) -> (i) -> (s) 
(T) -> (h) -> (i) -> (__c) -> (s)

Funziona bene anche perché la maggior parte della navigazione di un utente sarà "lineare"; probabilmente spostano il cursore uno spazio avanti o indietro alla volta. Il solito svantaggio delle liste collegate è l'indicizzazione, ma questo comportamento si presta bene a un iteratore.

Ci saranno sempre casi in cui l'utente usa il mouse per fare clic e spostare il cursore su una posizione molto precedente, e potresti voler cambiare la struttura del nodo per contenere più di una lettera o finirai per scorrere tra migliaia di nodi per spostare il cursore, ma questa è l'idea generale. Forse vuoi rendere ogni nodo un nodo "paragrafo" che punta a un altro elenco di caratteri collegati? Potresti voler rendere il nodo primario un nodo di "formattazione"; la scelta è tua.

    
risposta data 31.12.2012 - 18:42
fonte
-1

Presumo che stia usando una specie di rappresentazione ad albero. I nodi di questo albero definiscono lo stile, ad es. tutto il testo sotto questo nodo ha questo stile e le foglie finali di questo albero sarebbero testo non elaborato. Quindi modificando le foglie, si modifica il testo non elaborato, ma la formattazione rimane la stessa. Ciò consente anche l'annidamento di stili.

Selezionare il testo di solito significa selezionare il nodo da cui inizia la selezione e il nodo dove termina la selezione, consentendo così di selezionare diversi testi in stile e formattati. Quindi, applicando la formattazione alla selezione, si applicano modifiche complesse a questo albero.

La visualizzazione di questo albero potrebbe quindi comportare un complesso documento visivo.

Potresti anche controllare LaTex , che è praticamente la creazione di ricchi documenti visivi e DTP dalla sua rappresentazione interna. Poiché i documenti LaTex sono per definizione leggibili e processabili dai computer, potrebbero anche essere utilizzati come rappresentazione interna di tali documenti.

    
risposta data 27.12.2012 - 16:23
fonte

Leggi altre domande sui tag