diff --git a/doc/scripts/wikiparser.py b/doc/scripts/wikiparser.py index ed348b984..ffceef246 100644 --- a/doc/scripts/wikiparser.py +++ b/doc/scripts/wikiparser.py @@ -100,13 +100,15 @@ class Url(Text): class ItalicText(Text): def to_docbook(self, context=None): - return f'{escape(self.content)}' + xml = ''.join([item.to_docbook() for item in self.content]) + return f'{xml}' class BoldText(Text): def to_docbook(self, context=None): - return f'{escape(self.content)}' + xml = ''.join([item.to_docbook() for item in self.content]) + return f'{xml}' class MonospaceText(Text): @@ -630,32 +632,14 @@ def parse_text(line, context=None, parse_links=True): # Bold text content, line = split_formatted(line, "'''") if content: - result.append(BoldText(content)) + result.append(BoldText(parse_text(content, context))) continue # Italic text content, line = split_formatted(line, "''") if content: - if content.startswith('[[') and content.endswith(']]'): - # Special handling for links within emphasis - content = content.lstrip('[[').rstrip(']]') - target, _, remaining = content.partition('|') - text = None - if remaining: - text, _, remaining = remaining.partition('|') - - params = None - if remaining: - params, _, remaining = remaining.partition('|') - - text = text or get_url_text(target) - link = Link(target.strip(), [ItalicText(text.strip())], params) - result.append(link) - continue - - else: - result.append(ItalicText(content)) - continue + result.append(ItalicText(parse_text(content, context))) + continue # Monospace text content, line = split_formatted(line, '`') @@ -940,12 +924,12 @@ def parse_wiki(text, context=None, begin_marker=None, end_marker=None): >>> parse_wiki('https://freedombox.org') [Paragraph([Url('https://freedombox.org'), PlainText(' ')])] >>> parse_wiki("''italic''") - [Paragraph([ItalicText('italic'), PlainText(' ')])] + [Paragraph([ItalicText([PlainText('italic')]), PlainText(' ')])] >>> parse_wiki("'''bold'''") - [Paragraph([BoldText('bold'), PlainText(' ')])] + [Paragraph([BoldText([PlainText('bold')]), PlainText(' ')])] >>> parse_wiki("normal text followed by '''bold text'''") - [Paragraph([PlainText('normal text followed by '), BoldText('bold text'), \ -PlainText(' ')])] + [Paragraph([PlainText('normal text followed by '), \ +BoldText([PlainText('bold text')]), PlainText(' ')])] >>> parse_wiki('`monospace`') [Paragraph([MonospaceText('monospace'), PlainText(' ')])] >>> parse_wiki('``not-monospace``') @@ -1034,9 +1018,9 @@ Paragraph([PlainText('multipara item ')])])])] [HorizontalRule(10)] >>> parse_wiki("||'''A'''||'''B'''||'''C'''||\\n||1 ||2 ||3 ||") - [Table([TableRow([TableItem([Paragraph([BoldText('A')])]), \ -TableItem([Paragraph([BoldText('B')])]), \ -TableItem([Paragraph([BoldText('C')])])]), \ + [Table([TableRow([TableItem([Paragraph([BoldText([PlainText('A')])])]), \ +TableItem([Paragraph([BoldText([PlainText('B')])])]), \ +TableItem([Paragraph([BoldText([PlainText('C')])])])]), \ TableRow([TableItem([Paragraph([PlainText('1 ')])]), \ TableItem([Paragraph([PlainText('2 ')])]), \ TableItem([Paragraph([PlainText('3 ')])])])])] @@ -1186,9 +1170,9 @@ calendar/addressbook ')])])])])])])])] ''[[https://creativecommons.org/licenses/by-sa/4.0/|Creative Commons \ Attribution-ShareAlike 4.0 International]]'' (from June 13rd 2016).") [List('bulleted', [ListItem([Paragraph([PlainText('New wiki and manual \ -content licence: '), Link('https://creativecommons.org/licenses/by-sa/4.0/', \ -[ItalicText('Creative Commons Attribution-ShareAlike 4.0 International')]), \ -PlainText(' (from June 13rd 2016). ')])])])] +content licence: '), ItalicText([Link('https://creativecommons.org/licenses/\ +by-sa/4.0/', [PlainText('Creative Commons Attribution-ShareAlike 4.0 \ +International')])]), PlainText(' (from June 13rd 2016). ')])])])] >>> parse_wiki('An alternative to downloading these images is to \ [[InstallingDebianOn/TI/BeagleBone|install Debian]] on the !BeagleBone and \ @@ -1204,8 +1188,8 @@ existing accounts or \\"Create ...\\" in case of new accounts (see the second \ screenshot below).\\n 1. Check the checkboxes for the address books and \ calendars you want to synchronize and click on the sync button in the header. \ (see the third screenshot below)") - [Paragraph([BoldText('Synchronizing contacts'), PlainText(' ')]), \ -List('numbered', \ + [Paragraph([BoldText([PlainText('Synchronizing contacts')]), \ +PlainText(' ')]), List('numbered', \ [ListItem([Paragraph([PlainText('Click on the hamburger menus of CalDAV and \ CardDAV and select either "Refresh ..." in case of existing accounts or \ "Create ..." in case of new accounts (see the second screenshot below). ')])]),\ @@ -1227,17 +1211,18 @@ server address. For example, ''imaps://imap.example.org''.") [Paragraph([PlainText('After Roundcube is installed, it can be accessed \ at '), CodeText('https:///roundcube'), PlainText('. Enter \ your username and password. The username for many mail services will be the \ -full email address such as '), ItalicText('exampleuser@example.org'), \ -PlainText(' and not just the username like '), ItalicText('exampleuser'), \ -PlainText(". Enter the address of your email service's IMAP server address in \ -the "), ItalicText('Server'), PlainText(' field. You can try providing your \ -domain name here such as '), ItalicText('example.org'), PlainText(' for email \ -address '), ItalicText('exampleuser@example.org'), PlainText(" and if this \ +full email address such as '), ItalicText([PlainText('exampleuser@example.org'\ +)]), PlainText(' and not just the username like '), ItalicText([PlainText(\ +'exampleuser')]), PlainText(". Enter the address of your email service's IMAP \ +server address in the "), ItalicText([PlainText('Server')]), PlainText(' \ +field. You can try providing your domain name here such as '), ItalicText(\ +[PlainText('example.org')]), PlainText(' for email address '), ItalicText(\ +[PlainText('exampleuser@example.org')]), PlainText(" and if this \ does not work, consult your email provider's documentation for the address \ of the IMAP server. Using encrypted connection to your IMAP server is \ strongly recommended. To do this, prepend 'imaps://' at the beginning of \ -your IMAP server address. For example, "), \ -ItalicText('imaps://imap.example.org'), PlainText('. ')])] +your IMAP server address. For example, "), ItalicText([PlainText(\ +'imaps://imap.example.org')]), PlainText('. ')])] >>> parse_wiki('Tor Browser is the recommended way to browse the web \ using Tor. You can download the Tor Browser from \ @@ -1295,8 +1280,9 @@ that this exposes the !FreedomBox's services to your entire local network.") the virtual machine's Settings -> [Network] -> [Adapter 1]->[Attached to:] \ and choose the network type your want the machine to use according to the \ explanation in Network Configuration below. The recommended type is the "), \ -ItalicText('Bridged adapter'), PlainText(" option, but be aware that this \ -exposes the FreedomBox's services to your entire local network. ")])])])] +ItalicText([PlainText('Bridged adapter')]), PlainText(" option, but be aware \ +that this exposes the FreedomBox's services to your entire local network. \ +")])])])] >>> parse_wiki('After logging in, you can become root with the command \ `sudo su`.\\n \\n=== Build Image ===') @@ -1613,14 +1599,15 @@ Heading(2, 'heading 2nd level'), \ >>> generate_inner_docbook([Paragraph([Url('https://freedombox.org')])]) '' - >>> generate_inner_docbook([Paragraph([ItalicText('italic')])]) + >>> generate_inner_docbook([Paragraph([ItalicText([\ +PlainText('italic')])])]) 'italic' - >>> generate_inner_docbook([Paragraph([BoldText('bold')])]) + >>> generate_inner_docbook([Paragraph([BoldText([PlainText('bold')])])]) 'bold' >>> generate_inner_docbook([Paragraph([\ -PlainText('normal text followed by '), BoldText('bold text')])]) +PlainText('normal text followed by '), BoldText([PlainText('bold text')])])]) 'normal text followed by \ bold text'