xml2rfc 3.26.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- xml2rfc/__init__.py +68 -0
- xml2rfc/boilerplate_id_guidelines.py +28 -0
- xml2rfc/boilerplate_rfc_7841.py +575 -0
- xml2rfc/boilerplate_tlp.py +258 -0
- xml2rfc/data/SVG-1.2-RFC.rnc +1666 -0
- xml2rfc/data/SVG-1.2-RFC.rng +7460 -0
- xml2rfc/data/Scripts.txt +2693 -0
- xml2rfc/data/metadata.js +218 -0
- xml2rfc/data/metadata.min.js +1 -0
- xml2rfc/data/reference.rnc +955 -0
- xml2rfc/data/reference.rng +2158 -0
- xml2rfc/data/referencegroup.rnc +16 -0
- xml2rfc/data/referencegroup.rng +2180 -0
- xml2rfc/data/rfc7991.rnc +955 -0
- xml2rfc/data/rfc7991.rng +2143 -0
- xml2rfc/data/v2.rnc +309 -0
- xml2rfc/data/v2.rng +720 -0
- xml2rfc/data/v3.rnc +1144 -0
- xml2rfc/data/v3.rng +2538 -0
- xml2rfc/data/v3compat.dtd +630 -0
- xml2rfc/data/v3compat.rnc +985 -0
- xml2rfc/data/xml2rfc-v3-emacs-nxml.rnc +1083 -0
- xml2rfc/data/xml2rfc.css +1171 -0
- xml2rfc/data/xml2rfc.js +7 -0
- xml2rfc/debug.py +221 -0
- xml2rfc/log.py +54 -0
- xml2rfc/parser.py +815 -0
- xml2rfc/run.py +801 -0
- xml2rfc/scripts.py +52 -0
- xml2rfc/strings.py +26 -0
- xml2rfc/templates/address_card.html +21 -0
- xml2rfc/templates/base.html +415 -0
- xml2rfc/templates/doc.xml +367 -0
- xml2rfc/templates/doc.yaml +2138 -0
- xml2rfc/templates/rfc2629-other.ent +61 -0
- xml2rfc/templates/rfc2629-xhtml.ent +170 -0
- xml2rfc/templates/rfc2629.dtd +328 -0
- xml2rfc/uniscripts/__init__.py +97 -0
- xml2rfc/uniscripts/unidata.py +306 -0
- xml2rfc/uniscripts/update/make_unidata.py +94 -0
- xml2rfc/util/__init__.py +7 -0
- xml2rfc/util/date.py +94 -0
- xml2rfc/util/fonts.py +53 -0
- xml2rfc/util/name.py +229 -0
- xml2rfc/util/num.py +119 -0
- xml2rfc/util/postal.py +285 -0
- xml2rfc/util/unicode.py +441 -0
- xml2rfc/utils.py +672 -0
- xml2rfc/walkpdf.py +113 -0
- xml2rfc/writers/__init__.py +25 -0
- xml2rfc/writers/base.py +2248 -0
- xml2rfc/writers/bib.py +43 -0
- xml2rfc/writers/doc.py +354 -0
- xml2rfc/writers/expand.py +51 -0
- xml2rfc/writers/expanded_xml.py +39 -0
- xml2rfc/writers/html.py +3110 -0
- xml2rfc/writers/legacy_html.py +860 -0
- xml2rfc/writers/nroff.py +345 -0
- xml2rfc/writers/paginated_txt.py +432 -0
- xml2rfc/writers/pdf.py +230 -0
- xml2rfc/writers/preptool.py +2428 -0
- xml2rfc/writers/raw_txt.py +1453 -0
- xml2rfc/writers/text.py +5000 -0
- xml2rfc/writers/unprep.py +187 -0
- xml2rfc/writers/v2v3.py +1150 -0
- xml2rfc-3.26.0.dist-info/LICENSE +29 -0
- xml2rfc-3.26.0.dist-info/METADATA +178 -0
- xml2rfc-3.26.0.dist-info/RECORD +71 -0
- xml2rfc-3.26.0.dist-info/WHEEL +5 -0
- xml2rfc-3.26.0.dist-info/entry_points.txt +2 -0
- xml2rfc-3.26.0.dist-info/top_level.txt +1 -0
xml2rfc/walkpdf.py
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright The IETF Trust 2018, All Rights Reserved
|
|
4
|
+
|
|
5
|
+
from __future__ import unicode_literals, print_function, division
|
|
6
|
+
|
|
7
|
+
import dict2xml
|
|
8
|
+
import io
|
|
9
|
+
import json
|
|
10
|
+
import lxml
|
|
11
|
+
import os
|
|
12
|
+
import pypdf
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
def walk(obj, seen):
|
|
16
|
+
dobj = {} # Direct objects
|
|
17
|
+
iobj = [] # Indirect objects
|
|
18
|
+
if isinstance(obj, pypdf.generic.DictionaryObject):
|
|
19
|
+
for key in obj.keys():
|
|
20
|
+
k = key[1:] if key.startswith('/') else key
|
|
21
|
+
d, i = walk(obj[key], seen)
|
|
22
|
+
dobj[k] = d
|
|
23
|
+
iobj += i
|
|
24
|
+
if hasattr(obj, 'extract_text'):
|
|
25
|
+
dobj['text'] = obj.extract_text(extraction_mode="layout")
|
|
26
|
+
elif isinstance(obj, pypdf.generic.ArrayObject):
|
|
27
|
+
dobj = []
|
|
28
|
+
for o in obj:
|
|
29
|
+
d, i = walk(o, seen)
|
|
30
|
+
dobj.append(d)
|
|
31
|
+
iobj += i
|
|
32
|
+
elif isinstance(obj, pypdf.generic.BooleanObject):
|
|
33
|
+
dobj = obj.value
|
|
34
|
+
elif isinstance(obj, pypdf.generic.NameObject):
|
|
35
|
+
dobj = str(obj)
|
|
36
|
+
elif isinstance(obj, pypdf.generic.NumberObject):
|
|
37
|
+
dobj = int(obj)
|
|
38
|
+
elif isinstance(obj, pypdf.generic.FloatObject):
|
|
39
|
+
dobj = float(obj)
|
|
40
|
+
elif isinstance(obj, pypdf.generic.IndirectObject):
|
|
41
|
+
dobj = str(obj)
|
|
42
|
+
if (obj.idnum, obj.generation) not in seen:
|
|
43
|
+
seen.add((obj.idnum, obj.generation))
|
|
44
|
+
d, i = walk(obj.get_object(), seen)
|
|
45
|
+
if isinstance(d, dict):
|
|
46
|
+
d['IdNum'] = obj.idnum
|
|
47
|
+
d['Generation'] = obj.generation
|
|
48
|
+
else:
|
|
49
|
+
dobj = d
|
|
50
|
+
iobj += i
|
|
51
|
+
iobj.append(d)
|
|
52
|
+
elif isinstance(obj, pypdf.generic.TextStringObject):
|
|
53
|
+
dobj = str(obj)
|
|
54
|
+
else:
|
|
55
|
+
raise RuntimeError("Unexpected object type: %s" % type(obj))
|
|
56
|
+
|
|
57
|
+
if hasattr(obj, 'idnum'):
|
|
58
|
+
seen.add((obj.idnum, obj.generation))
|
|
59
|
+
|
|
60
|
+
return dobj, iobj
|
|
61
|
+
|
|
62
|
+
def pyobj(filename=None, bytes=None):
|
|
63
|
+
seen = set()
|
|
64
|
+
#
|
|
65
|
+
pdffile = io.BytesIO(bytes) if bytes else io.open(filename, 'br')
|
|
66
|
+
reader = pypdf.PdfReader(pdffile, strict=False)
|
|
67
|
+
info = reader.metadata
|
|
68
|
+
doc = {}
|
|
69
|
+
for key in info.keys():
|
|
70
|
+
k = key[1:] if key.startswith('/') else key
|
|
71
|
+
doc[k] = info[key]
|
|
72
|
+
iobj = []
|
|
73
|
+
pages = []
|
|
74
|
+
for num in range(len(reader.pages)):
|
|
75
|
+
page = reader.pages[num]
|
|
76
|
+
obj = page.get_object()
|
|
77
|
+
d, i = walk(obj, seen)
|
|
78
|
+
#pages[num+1] = d
|
|
79
|
+
pages.append(d)
|
|
80
|
+
iobj += i
|
|
81
|
+
pdffile.close()
|
|
82
|
+
#
|
|
83
|
+
doc['Page'] = pages
|
|
84
|
+
doc['IndirectObject'] = iobj
|
|
85
|
+
return doc
|
|
86
|
+
|
|
87
|
+
def xmltext(filename=None, obj=None, bytes=None):
|
|
88
|
+
if obj is None:
|
|
89
|
+
obj = pyobj(filename=filename, bytes=bytes)
|
|
90
|
+
# for i,p in enumerate(obj['Pages']):
|
|
91
|
+
# obj['Pages'][i] = {'Page': p}
|
|
92
|
+
return dict2xml.dict2xml(obj, wrap="Document")
|
|
93
|
+
|
|
94
|
+
def xmldoc(filename, text=None, bytes=None):
|
|
95
|
+
if text is None:
|
|
96
|
+
text = xmltext(filename=filename, bytes=bytes)
|
|
97
|
+
return lxml.etree.fromstring(text)
|
|
98
|
+
|
|
99
|
+
def main():
|
|
100
|
+
for filename in sys.argv[1:]:
|
|
101
|
+
if not os.path.exists(filename):
|
|
102
|
+
print('Could not find "%s"' % filename)
|
|
103
|
+
print('File: %s' % filename)
|
|
104
|
+
doc = pyobj(filename)
|
|
105
|
+
with io.open(filename+'.json', 'w', encoding='utf-8') as j:
|
|
106
|
+
json.dump(doc, j, indent=2)
|
|
107
|
+
print('Wrote: %s' % j.name)
|
|
108
|
+
with io.open(filename+'.xml', 'w', encoding='utf-8') as x:
|
|
109
|
+
x.write(xmltext(filename, doc))
|
|
110
|
+
print('Wrote: %s' % x.name)
|
|
111
|
+
|
|
112
|
+
if __name__ == "__main__":
|
|
113
|
+
main()
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
from xml2rfc.writers.base import RfcWriterError
|
|
3
|
+
from xml2rfc.writers.base import BaseRfcWriter
|
|
4
|
+
from xml2rfc.writers.raw_txt import RawTextRfcWriter
|
|
5
|
+
from xml2rfc.writers.paginated_txt import PaginatedTextRfcWriter
|
|
6
|
+
from xml2rfc.writers.legacy_html import HtmlRfcWriter
|
|
7
|
+
from xml2rfc.writers.nroff import NroffRfcWriter
|
|
8
|
+
from xml2rfc.writers.expanded_xml import ExpandedXmlWriter
|
|
9
|
+
from xml2rfc.writers.v2v3 import V2v3XmlWriter
|
|
10
|
+
from xml2rfc.writers.preptool import PrepToolWriter
|
|
11
|
+
from xml2rfc.writers.text import TextWriter
|
|
12
|
+
from xml2rfc.writers.html import HtmlWriter
|
|
13
|
+
from xml2rfc.writers.expand import ExpandV3XmlWriter
|
|
14
|
+
from xml2rfc.writers.pdf import PdfWriter
|
|
15
|
+
from xml2rfc.writers.unprep import UnPrepWriter
|
|
16
|
+
from xml2rfc.writers.doc import DocWriter
|
|
17
|
+
from xml2rfc.writers.bib import DatatrackerToBibConverter
|
|
18
|
+
|
|
19
|
+
# This defines what 'from xml2rfc.writers import *' actually imports:
|
|
20
|
+
__all__ = ['BaseRfcWriter', 'RawTextRfcWriter', 'PaginatedTextRfcWriter',
|
|
21
|
+
'HtmlRfcWriter', 'NroffRfcWriter', 'ExpandedXmlWriter',
|
|
22
|
+
'RfcWriterError', 'V2v3XmlWriter', 'PrepToolWriter', 'TextWriter',
|
|
23
|
+
'HtmlWriter', 'PdfWriter', 'ExpandV3XmlWriter', 'UnPrepWriter',
|
|
24
|
+
'DocWriter', 'DatatrackerToBibConverter',
|
|
25
|
+
]
|