From: <bb...@ma...> - 2003-02-26 20:27:30
|
On Wednesday, Feb 26, 2003, at 15:21 US/Eastern, doc...@li... wrote: > This works, but it bypasses the processing of any inline elements, > like strong, emphasis, and inline literals. What's the better way to > handle this? Have a look at the Plain HTML writer in my sandbox within the docutils archive -- this situation is actually fairly common. It helps to think of something like visit_paragraph as a mode switch. That is, when you hit visit_paragraph and are in a sidebar (in your case), you need to push a mode switch onto a mode stack -- mode to be popped on depart_paragraph. Since everything is well nested, append()/pop() style of stack maintenance via a standard array works quite well. b.bum |
From: <po...@or...> - 2003-02-26 23:02:05
|
bb...@ma... writes: > On Wednesday, Feb 26, 2003, at 15:21 US/Eastern, > doc...@li... wrote: > > This works, but it bypasses the processing of any inline elements, > > like strong, emphasis, and inline literals. What's the better way to > > handle this? > > Have a look at the Plain HTML writer in my sandbox within the docutils > archive -- this situation is actually fairly common. > > It helps to think of something like visit_paragraph as a mode switch. > That is, when you hit visit_paragraph and are in a sidebar (in your > case), you need to push a mode switch onto a mode stack -- mode to be > popped on depart_paragraph. I understand what you are saying, but that isn't my problem. The sidebar stuff works fine. In fact, pretend it isn't even there: def visit_paragraph(self, node): lines = node.astext().split('\n') line = ' '.join(lines) self.part.append('\n%s\n' % line) raise nodes.SkipNode The problem is that I want to modify the paragraph node, but still allow the inline elements to be processed. Right now if I don't raise nodes.SkipNode then the paragraph will get appended twice, once by me (in compressed form) and once by the normal processing. But by raising nodes.SkipNode I eliminate all inline handlers. Make sense? -- Patrick K. O'Brien Orbtech http://www.orbtech.com/web/pobrien ----------------------------------------------- "Your source for Python programming expertise." ----------------------------------------------- |
From: <bb...@ma...> - 2003-02-27 14:16:43
|
On Wednesday, Feb 26, 2003, at 18:03 US/Eastern, Patrick K. O'Brien=20 wrote: > I understand what you are saying, but that isn't my problem. The > sidebar stuff works fine. In fact, pretend it isn't even there: > > def visit_paragraph(self, node): > lines =3D node.astext().split('\n') > line =3D ' '.join(lines) > self.part.append('\n%s\n' % line) > raise nodes.SkipNode > > The problem is that I want to modify the paragraph node, but still > allow the inline elements to be processed. Right now if I don't raise > nodes.SkipNode then the paragraph will get appended twice, once by me > (in compressed form) and once by the normal processing. But by raising > nodes.SkipNode I eliminate all inline handlers. Make sense? Yes -- makes sense. In effect, you want to filter all newlines from=20 the output when inside of a paragraph node? Or, at least, filter all=20= newlines from text emitted while in a paragraph tag. For the moment, let's assume that one wanted to do something similar in=20= HTML. In this case, it should not filter newline characters in all=20 situations. When handling a literal block:: such as this one The newlines and whitespace should be preserved. As such, a 'collect=20= all text in the paragraph node and filter newlines' style of=20 implementation will not work. Assuming your needs are similar -- assuming that your writer also needs=20= to be able to preserve whitespace/newline in some subset of the nodes=20 that may be found in the node tree hanging off of a paragraph node--=20 then you would want to do something like: def __init__(...): self.filterNewlines =3D [False] self.bodyContent =3D [] # the thing that collects the text to = be=20 output.... =13 def visit_paragraph(self, node): self.filterNewlines.append(True) def depart_paragraph(self, node): self.filterNewlines.pop() def visit_Text(self, node): self.bodyContent.append(self.encode(node.astext())) def depart_Text(self, node): pass def encode(self, text): if self.filterNewlines[-1]: lines =3D text.split('\n') line =3D ' '.join(lines) self.bodyContent.append(line) else: self.bodyContent.append(text) Anywhere else where you emit text that should also be filtered=20 conditionally depending on context, pass it through the encode() method. b.bum |
From: <po...@or...> - 2003-02-27 14:41:39
|
bb...@ma... writes: > Yes -- makes sense. In effect, you want to filter all newlines from > the output when inside of a paragraph node? Or, at least, filter all > newlines from text emitted while in a paragraph tag. Exactly. > For the moment, let's assume that one wanted to do something similar > in HTML. In this case, it should not filter newline characters in > all situations. When handling a literal block:: > > such as > this one > > The newlines and whitespace should be preserved. As such, a 'collect > all text in the paragraph node and filter newlines' style of > implementation will not work. Correct. > Assuming your needs are similar -- assuming that your writer also > needs to be able to preserve whitespace/newline in some subset of > the nodes that may be found in the node tree hanging off of a > paragraph node-- then you would want to do something like: > > def __init__(...): > self.filterNewlines = [False] > self.bodyContent = [] # the thing that collects the text to > be output.... > > def visit_paragraph(self, node): > self.filterNewlines.append(True) > > def depart_paragraph(self, node): > self.filterNewlines.pop() > > def visit_Text(self, node): > self.bodyContent.append(self.encode(node.astext())) > > def depart_Text(self, node): > pass > > def encode(self, text): > if self.filterNewlines[-1]: > lines = text.split('\n') > line = ' '.join(lines) > self.bodyContent.append(line) > else: > self.bodyContent.append(text) > > Anywhere else where you emit text that should also be filtered > conditionally depending on context, pass it through the encode() > method. Perfect. I'll buy you a beer when we meet in Portland. Btw, this makes more sense than my original code, which you based your example on (just in case anyone's watching <wink>): def encode(self, text): if self.filterNewlines[-1]: text = text.replace('\n', ' ') self.bodyContent.append(text) Thanks a lot, Bill. I don't know why I wasn't seeing this, but you got me over the hump. -- Patrick K. O'Brien Orbtech http://www.orbtech.com/web/pobrien ----------------------------------------------- "Your source for Python programming expertise." ----------------------------------------------- |
From: <po...@or...> - 2003-02-27 15:11:24
|
po...@or... (Patrick K. O'Brien) writes: > Btw, this makes more sense than my original code, which you based > your example on (just in case anyone's watching <wink>): > > def encode(self, text): > if self.filterNewlines[-1]: > text = text.replace('\n', ' ') > self.bodyContent.append(text) Aaarrrgggghhhh!!! Once more, with style:: def encode(self, text): if self.filterNewlines[-1]: text = text.replace('\n', ' ') return text -- Patrick K. O'Brien Orbtech http://www.orbtech.com/web/pobrien ----------------------------------------------- "Your source for Python programming expertise." ----------------------------------------------- |
From: <bb...@ma...> - 2003-02-27 15:26:09
|
On Thursday, Feb 27, 2003, at 10:13 US/Eastern, Patrick K. O'Brien wrote: > return text Oh. Yes. That. Forgot about that, too. Glad it helped. I'll take you up on that beer if I make it to Portland [still a question of that -- but should be possible]. |
From: engelbert g. <be...@ch...> - 2003-02-27 06:21:10
|
On Thu, 26 Feb 2003, Patrick K. O'Brien wrote: > bb...@ma... writes: > > > On Wednesday, Feb 26, 2003, at 15:21 US/Eastern, > > doc...@li... wrote: > > > This works, but it bypasses the processing of any inline elements, > > > like strong, emphasis, and inline literals. What's the better way to > > > handle this? > > > > Have a look at the Plain HTML writer in my sandbox within the docutils > > archive -- this situation is actually fairly common. > > > > It helps to think of something like visit_paragraph as a mode switch. > > That is, when you hit visit_paragraph and are in a sidebar (in your > > case), you need to push a mode switch onto a mode stack -- mode to be > > popped on depart_paragraph. > > I understand what you are saying, but that isn't my problem. The > sidebar stuff works fine. In fact, pretend it isn't even there: > > def visit_paragraph(self, node): > lines = node.astext().split('\n') > line = ' '.join(lines) > self.part.append('\n%s\n' % line) > raise nodes.SkipNode > > The problem is that I want to modify the paragraph node, but still > allow the inline elements to be processed. Right now if I don't raise > nodes.SkipNode then the paragraph will get appended twice, once by me > (in compressed form) and once by the normal processing. But by raising > nodes.SkipNode I eliminate all inline handlers. Make sense? in the latex writer i have the problem that every text needs to encoded (& and % ...) i did this in visit_text def encode(self, text): if self.insert_newline: text = text.replace("\n", '\\\\\n') elif self.mbox_newline: text = text.replace("\n", '}\\\\\n\\mbox{') text = text.replace(' ', '~') # unicode !!! text = text.replace(u'\u2020', '{$\\dagger$}') return text def visit_Text(self, node): self.body.append(self.encode(node.astext())) and in some situation insert_newline is set ... -- engelbert gruber email: eng...@ss... |
From: David G. <go...@py...> - 2003-02-27 14:32:15
|
I haven't had time to reply lately, sorry. [Patrick K. O'Brien] > The problem is that I want to modify the paragraph node, but still > allow the inline elements to be processed. Right now if I don't raise > nodes.SkipNode then the paragraph will get appended twice, once by me > (in compressed form) and once by the normal processing. But by raising > nodes.SkipNode I eliminate all inline handlers. Make sense? Engelbert's suggestion is the best way to do this. Check out the html4css1.py writer code for visit_Text; you can do any text encoding you like from there. Converting newlines to spaces is a form of encoding. As for raising nodes.SkipNode, do that only when you really want to skip the node. If you want to process the node and its contents, just let the tree be traversed normally and add special processing at the lowest possible level. -- David Goodger http://starship.python.net/~goodger Programmer/sysadmin for hire: http://starship.python.net/~goodger/cv |
From: <po...@or...> - 2003-02-27 15:08:55
|
engelbert gruber <be...@ch...> writes: > in the latex writer i have the problem that every text needs to encoded > (& and % ...) i did this in visit_text > > def encode(self, text): > if self.insert_newline: > text = text.replace("\n", '\\\\\n') > elif self.mbox_newline: > text = text.replace("\n", '}\\\\\n\\mbox{') > text = text.replace(' ', '~') > # unicode !!! > text = text.replace(u'\u2020', '{$\\dagger$}') > return text > > def visit_Text(self, node): > self.body.append(self.encode(node.astext())) > > and in some situation insert_newline is set ... Thank you very much. That helped. -- Patrick K. O'Brien Orbtech http://www.orbtech.com/web/pobrien ----------------------------------------------- "Your source for Python programming expertise." ----------------------------------------------- |