a5d83ba5714c36f90f961dfb3198e4a76eec86e5
[philipp/winterrodeln/wrpylib.git] / wrpylib / mwmarkup.py
1 """For parsing MediaWiki text, we rely on the package mwparserfromhell (https://github.com/earwig/mwparserfromhell).
2 This module just contains a few additional useful functions.
3
4 Other Python MediaWiki parsers:
5 * py-wikimarkup https://github.com/dcramer/py-wikimarkup
6 * mwlib http://code.pediapress.com/wiki/wiki
7 * https://www.mediawiki.org/wiki/Alternative_parsers
8 """
9 from typing import Optional
10
11 from mwparserfromhell.nodes import Template
12
13
14 def format_template_table(template: Template, keylen: Optional[int] = None):
15     """Reformat the given template to be tabular. The template is modified in-place
16
17     >>> template
18     {{foo|bar|bazz=7}}
19     >>> format_template_table(template)
20     {{foo
21     | bar
22     | bazz = 7
23     }}
24
25     :param template: MediaWiki template to be formatted
26     :param keylen: length of the keys or None for automatic determination
27     """
28     if keylen is None:
29         shown_keys = [len(param.name.strip()) for param in template.params if param.showkey]
30         keylen = max(shown_keys) if shown_keys else 0
31     template.name = f'{template.name.strip()}\n'
32     for param in template.params:
33         if param.showkey:
34             param.name = ' {{:{}}} '.format(keylen).format(param.name.strip())
35         value = param.value.strip()
36         if len(value) > 0:
37             param.value = f' {value}\n'
38         else:
39             param.value = '\n'
40
41
42 def format_template_oneline(template: Template):
43     """Formats a template like this: {{template_name|param| }}
44     (whitespace is stripped and empty parameters are replaced with one space).
45     The template is modified in-place."""
46     template.name = template.name.strip()
47     for param in template.params:
48         if param.showkey:
49             param.name = param.name.strip()
50         value = param.value.strip()
51         if value == '':
52             value = ' '
53         param.value = value
54
55
56 def dbkey_to_title(value: str) -> str:
57     """Converts a article database key to a article title. Private function secureAndSplit() of the Title class
58     on line 3316 of includes/Title.php says:
59     $this->mTextform = str_replace( '_', ' ', $this->mDbkeyform );
60     No check for None because a missing title is an error."""
61     return value.replace('_', ' ')