leforestier / yattag

Python library to generate HTML or XML in a readable, concise and pythonic way.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Add a tag to an existing string? How?

bschollnick opened this issue · comments

I'm a bit confused on how to do this with yattag...

I have a string, that is going to be passed to a table cell, but it contains \r\n, which I want to convert to a
tag...

row["Ordernote"] = row["Ordernote"].replace("\r\n", "
") - results in
showing in the text field.

But I can't figure out in the yattag frame work, the best way to do this?

Can you point me in the right direction...?

Good question. Actually, it seems strange that I haven't considered that use case before since it seems pretty common.
You could create your custom Doc subclass and override the text method so that it behaves how you like.

Maybe we should have a method for this, though. It would insert the texts after escaping the '<', '>', and '&' characters and replacing the '\n' or '\r\n' sequences with <br> or <br />. What would be good short name for this? Maybe nl2br?

Actually, I think I'm just going to add a nl2br parameter to the SimpleDoc() constructor.
You'll have to call
doc, tag, text = Doc(nl2br=True).tagtext() and the text() method would act as you describe in your first post.

Sorry about the delay, I was busy with other things.
You can now use the nl2br option as stated in the previous post.

>>> doc = SimpleDoc(nl2br=True)
>>> doc.text("One\r\nTwo\r\nThree\r\n")
>>> doc.getvalue()
"One<br />Two<br />Three<br />"

If you want simple <br> tags you can use the stag_end option:

>>> doc = SimpleDoc(nl2br=True, stag_end = '>')
>>> doc.text("One\r\nTwo\r\nThree\r\n")
>>> doc.getvalue()
"One<br>Two<br>Three<br>"

By default the stag_end parameter is set to ' />', that's why you get <br /> tags in the first example.

Of course it also works with Unix style newlines (without the '\r'), and the nl2br and stag_end options are also available on the Doc class (which is a subclass of SimpleDoc)

>>> doc = Doc(nl2br=True, stag_end = '>')
>>> doc.text("One\nTwo\nThree\n")
>>> doc.getvalue()
"One<br>Two<br>Three<br>"