[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Groff] grohtml patch
From: |
Gaius Mulley |
Subject: |
Re: [Groff] grohtml patch |
Date: |
11 Jul 2003 10:32:56 +0100 |
User-agent: |
Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 |
Werner LEMBERG <address@hidden> writes:
> > I'm attempting to implement the new tag mechanism that you outlined
> > back in April. I've implemented the state machine and can issue
> > `diff' tags.
>
> What exactly do you mean with `diff' tags?
just tags which are only emitted when some aspect of the state
changes.
> > The problem I'm currently struggling with is how to coordinate the
> > updating of the state machine relative to the node generation and
> > final tbuf printing.
> >
> > Currently I'm flushing state machine diffs when the tbuf goes from
> > an empty state into a non empty state. But this is wrong.
> >
> > I'm now considering creating a copy of the troff state machine (my
> > new class based on the list of troff attributes in your email)
> > during env::add_char and adding this copy to a node. Later when this
> > node appears during tprint I am going to diff the nodes state with
> > the driver state and generate the html tags.
> >
> > Can you see anything immediately wrong with this approach? I'm
> > hoping that it will fix the synchronisation issue..
>
> Here my idea of implementation:
>
> . We need one troff_state structure and a stack of html_state
> structures.
yes done.
> Most of the data for the troff state can be directly taken from
> the `environment' class (or rather, it holds only the stuff not in
> the `environment' class).
yes, currently it is populated from the environment class and a few
things outside. Whether we have seen an eol, br, or sp and the .ce value.
I had basically reached here (well actually I went further down a
wrong path :-)
> . We need two new node types, html_state_push and html_state_pop
> which both must be transparent to end-of-sentence recognition and
> similar things.
>
> . Set a flag diversion::diversion_start in the code for `.di xxx' to
> indicate that a diversion has just begun.
>
> Add an html_state_push node at the very beginning of the diversion
> to make troff push the html state during rereading.
>
> . In env::add_char, test diversion_start of curdiv. If set, emit
> the complete troff state as a series of
>
> \!\X'html-tag: ...'
>
> (or a new special tag which is equivalent to it) right before
> adding a glyph node. Then reset the flag.
>
> The \! stuff can be directly inserted using a non_interpreted_node
> structure.
>
> . In the code for `.di', add an html_state_pop node at the very end
> of the diversion to make troff pop the html state during
> rereading.
>
> I think you don't need a new node type to hold the troff state since
> its data has been already output as \!'...' stuff. Since pushing
> and popping the html state is indicated by nodes, implementing a
> proper tprint function for html_state_pop should be sufficient.
yes you're right. Thank you for the clear directions surrounding
diversions, this has cleared my mind considerably..
Gaius