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.
Files changed (71) hide show
  1. xml2rfc/__init__.py +68 -0
  2. xml2rfc/boilerplate_id_guidelines.py +28 -0
  3. xml2rfc/boilerplate_rfc_7841.py +575 -0
  4. xml2rfc/boilerplate_tlp.py +258 -0
  5. xml2rfc/data/SVG-1.2-RFC.rnc +1666 -0
  6. xml2rfc/data/SVG-1.2-RFC.rng +7460 -0
  7. xml2rfc/data/Scripts.txt +2693 -0
  8. xml2rfc/data/metadata.js +218 -0
  9. xml2rfc/data/metadata.min.js +1 -0
  10. xml2rfc/data/reference.rnc +955 -0
  11. xml2rfc/data/reference.rng +2158 -0
  12. xml2rfc/data/referencegroup.rnc +16 -0
  13. xml2rfc/data/referencegroup.rng +2180 -0
  14. xml2rfc/data/rfc7991.rnc +955 -0
  15. xml2rfc/data/rfc7991.rng +2143 -0
  16. xml2rfc/data/v2.rnc +309 -0
  17. xml2rfc/data/v2.rng +720 -0
  18. xml2rfc/data/v3.rnc +1144 -0
  19. xml2rfc/data/v3.rng +2538 -0
  20. xml2rfc/data/v3compat.dtd +630 -0
  21. xml2rfc/data/v3compat.rnc +985 -0
  22. xml2rfc/data/xml2rfc-v3-emacs-nxml.rnc +1083 -0
  23. xml2rfc/data/xml2rfc.css +1171 -0
  24. xml2rfc/data/xml2rfc.js +7 -0
  25. xml2rfc/debug.py +221 -0
  26. xml2rfc/log.py +54 -0
  27. xml2rfc/parser.py +815 -0
  28. xml2rfc/run.py +801 -0
  29. xml2rfc/scripts.py +52 -0
  30. xml2rfc/strings.py +26 -0
  31. xml2rfc/templates/address_card.html +21 -0
  32. xml2rfc/templates/base.html +415 -0
  33. xml2rfc/templates/doc.xml +367 -0
  34. xml2rfc/templates/doc.yaml +2138 -0
  35. xml2rfc/templates/rfc2629-other.ent +61 -0
  36. xml2rfc/templates/rfc2629-xhtml.ent +170 -0
  37. xml2rfc/templates/rfc2629.dtd +328 -0
  38. xml2rfc/uniscripts/__init__.py +97 -0
  39. xml2rfc/uniscripts/unidata.py +306 -0
  40. xml2rfc/uniscripts/update/make_unidata.py +94 -0
  41. xml2rfc/util/__init__.py +7 -0
  42. xml2rfc/util/date.py +94 -0
  43. xml2rfc/util/fonts.py +53 -0
  44. xml2rfc/util/name.py +229 -0
  45. xml2rfc/util/num.py +119 -0
  46. xml2rfc/util/postal.py +285 -0
  47. xml2rfc/util/unicode.py +441 -0
  48. xml2rfc/utils.py +672 -0
  49. xml2rfc/walkpdf.py +113 -0
  50. xml2rfc/writers/__init__.py +25 -0
  51. xml2rfc/writers/base.py +2248 -0
  52. xml2rfc/writers/bib.py +43 -0
  53. xml2rfc/writers/doc.py +354 -0
  54. xml2rfc/writers/expand.py +51 -0
  55. xml2rfc/writers/expanded_xml.py +39 -0
  56. xml2rfc/writers/html.py +3110 -0
  57. xml2rfc/writers/legacy_html.py +860 -0
  58. xml2rfc/writers/nroff.py +345 -0
  59. xml2rfc/writers/paginated_txt.py +432 -0
  60. xml2rfc/writers/pdf.py +230 -0
  61. xml2rfc/writers/preptool.py +2428 -0
  62. xml2rfc/writers/raw_txt.py +1453 -0
  63. xml2rfc/writers/text.py +5000 -0
  64. xml2rfc/writers/unprep.py +187 -0
  65. xml2rfc/writers/v2v3.py +1150 -0
  66. xml2rfc-3.26.0.dist-info/LICENSE +29 -0
  67. xml2rfc-3.26.0.dist-info/METADATA +178 -0
  68. xml2rfc-3.26.0.dist-info/RECORD +71 -0
  69. xml2rfc-3.26.0.dist-info/WHEEL +5 -0
  70. xml2rfc-3.26.0.dist-info/entry_points.txt +2 -0
  71. 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
+ ]