Full Code of mete0r/pyhwp for AI

master 83239f0d3bdf cached
811 files
11.1 MB
3.0M tokens
2236 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (11,898K chars total). Download the full file to get everything.
Repository: mete0r/pyhwp
Branch: master
Commit: 83239f0d3bdf
Files: 811
Total size: 11.1 MB

Directory structure:
gitextract_0w5mfwgg/

├── .gitattributes
├── .github/
│   └── dependabot.yml
├── .gitignore
├── .travis.yml
├── CHANGES
├── COPYING
├── MANIFEST.in
├── Makefile
├── README
├── VERSION.txt
├── buildout.cfg
├── buildouts/
│   ├── components/
│   │   ├── jxml.cfg
│   │   ├── virtualenv-1.9.1.cfg
│   │   ├── virtualenv-jython.cfg
│   │   ├── xalan-j-2.7.1.cfg
│   │   └── xalan-j-2.7.2.cfg
│   ├── developer.cfg
│   ├── maintainer.cfg
│   ├── tester.cfg
│   ├── translator.cfg
│   └── user.cfg
├── classifiers.txt
├── docs/
│   ├── .gitignore
│   ├── Makefile
│   ├── conf.py
│   ├── converters.rst
│   ├── hacking/
│   │   ├── directory-layout/
│   │   │   ├── bin.rst
│   │   │   └── root.rst
│   │   ├── directory-layout.rst
│   │   ├── hack-n-test.rst
│   │   ├── index.rst
│   │   └── setup-env.rst
│   ├── hwp5.rst
│   ├── hwp5proc.rst
│   ├── index.rst
│   ├── static/
│   │   └── .gitignore
│   ├── templates/
│   │   └── .gitignore
│   └── translated/
│       ├── en/
│       │   └── LC_MESSAGES/
│       │       ├── converters.po
│       │       ├── hwp5proc.po
│       │       ├── index.po
│       │       └── intro.po
│       └── ko/
│           └── LC_MESSAGES/
│               ├── converters.po
│               ├── hwp5proc.po
│               ├── index.po
│               └── intro.po
├── etc/
│   ├── pylint.rc
│   └── testlog.conf
├── ez_setup.py
├── misc/
│   ├── cleanup-pyc.py
│   ├── copylxml.py
│   ├── docs-upload
│   ├── fix-coverage.py
│   ├── install-lxml.py.in
│   ├── mkdir.py
│   ├── oxt-build.in
│   ├── prepare-hwp5-xsl-fixtures.py
│   ├── redirect.py
│   ├── test-cli.in
│   ├── test-cli.py
│   ├── test-coverage
│   ├── test-for-bisect
│   ├── test-in-lo.py
│   ├── test-pypi.in
│   ├── test-sdist
│   ├── test-sdist.in
│   ├── test-upload.in
│   ├── test-xsl.in
│   └── upload
├── notebooks/
│   └── .gitignore
├── oxt/
│   ├── Addons.xcu
│   ├── Filter.xcu
│   ├── META-INF/
│   │   └── manifest.xml
│   ├── Makefile
│   ├── Types.xcu
│   ├── components.py
│   ├── description/
│   │   ├── desc_en.txt
│   │   └── desc_ko.txt
│   ├── description.xml
│   ├── doc/
│   │   └── references.txt
│   └── registration/
│       └── COPYING.txt
├── pyhwp_uno/
│   ├── hwp5_uno/
│   │   ├── __init__.py
│   │   └── tests/
│   │       ├── __init__.py
│   │       └── test_hwp5_uno.py
│   └── setup.py
├── release-hooks/
│   ├── prerelease.after/
│   │   └── 10-docs-build
│   ├── prerelease.before/
│   │   └── 0-docs-update-po
│   ├── release.after/
│   │   ├── 10-test-pypi
│   │   └── 20-docs-upload
│   └── release.before/
│       └── 20-upload-to-testpypi
├── requirements/
│   ├── dev.in
│   ├── dev.txt
│   ├── docs.in
│   ├── docs.txt
│   ├── lint.in
│   ├── lint.txt
│   ├── test.in
│   └── test.txt
├── requirements.in
├── requirements.txt
├── setup.cfg
├── setup.py
├── src/
│   ├── README.rst
│   └── hwp5/
│       ├── __init__.py
│       ├── binmodel/
│       │   ├── __init__.py
│       │   ├── _shared.py
│       │   ├── controlchar.py
│       │   ├── controls/
│       │   │   ├── __init__.py
│       │   │   ├── _shared.py
│       │   │   ├── bookmark_control.py
│       │   │   ├── columns_def.py
│       │   │   ├── common_controls.py
│       │   │   ├── dutmal.py
│       │   │   ├── field.py
│       │   │   ├── gshape_object_control.py
│       │   │   ├── header_footer.py
│       │   │   ├── hidden_comment.py
│       │   │   ├── index_marker.py
│       │   │   ├── note.py
│       │   │   ├── numbering.py
│       │   │   ├── page_hide.py
│       │   │   ├── page_number_position.py
│       │   │   ├── page_odd_even.py
│       │   │   ├── section_def.py
│       │   │   ├── table_control.py
│       │   │   └── tcps_control.py
│       │   ├── tagid16_document_properties.py
│       │   ├── tagid17_id_mappings.py
│       │   ├── tagid18_bin_data.py
│       │   ├── tagid19_face_name.py
│       │   ├── tagid20_border_fill.py
│       │   ├── tagid21_char_shape.py
│       │   ├── tagid22_tab_def.py
│       │   ├── tagid23_numbering.py
│       │   ├── tagid24_bullet.py
│       │   ├── tagid25_para_shape.py
│       │   ├── tagid26_style.py
│       │   ├── tagid27_doc_data.py
│       │   ├── tagid28_distribute_doc_data.py
│       │   ├── tagid30_compatible_document.py
│       │   ├── tagid31_layout_compatibility.py
│       │   ├── tagid32_unknown.py
│       │   ├── tagid50_para_header.py
│       │   ├── tagid51_para_text.py
│       │   ├── tagid52_para_char_shape.py
│       │   ├── tagid53_para_line_seg.py
│       │   ├── tagid54_para_range_tag.py
│       │   ├── tagid55_ctrl_header.py
│       │   ├── tagid56_list_header.py
│       │   ├── tagid57_page_def.py
│       │   ├── tagid58_footnote_shape.py
│       │   ├── tagid59_page_border_fill.py
│       │   ├── tagid60_shape_component.py
│       │   ├── tagid61_table.py
│       │   ├── tagid62_shape_component_line.py
│       │   ├── tagid63_shape_component_rectangle.py
│       │   ├── tagid64_shape_component_ellipse.py
│       │   ├── tagid65_shape_component_arc.py
│       │   ├── tagid66_shape_component_polygon.py
│       │   ├── tagid67_shape_component_curve.py
│       │   ├── tagid68_shape_component_ole.py
│       │   ├── tagid69_shape_component_picture.py
│       │   ├── tagid70_shape_component_container.py
│       │   ├── tagid71_ctrl_data.py
│       │   ├── tagid72_ctrl_eqedit.py
│       │   ├── tagid74_shape_component_textart.py
│       │   ├── tagid75_form_object.py
│       │   ├── tagid76_memo_shape.py
│       │   ├── tagid77_memo_list.py
│       │   ├── tagid78_forbidden_char.py
│       │   ├── tagid79_chart_data.py
│       │   └── tagid99_shape_component_unknown.py
│       ├── binspec.py
│       ├── bintype.py
│       ├── charsets.py
│       ├── cli.py
│       ├── compressed.py
│       ├── dataio.py
│       ├── distdoc.py
│       ├── errors.py
│       ├── filestructure.py
│       ├── hwp5html.py
│       ├── hwp5odt.py
│       ├── hwp5proc.py
│       ├── hwp5txt.py
│       ├── hwp5view.py
│       ├── importhelper.py
│       ├── locale/
│       │   ├── hwp5html.pot
│       │   ├── hwp5odt.pot
│       │   ├── hwp5proc.pot
│       │   ├── hwp5txt.pot
│       │   ├── hwp5view.pot
│       │   └── ko/
│       │       └── LC_MESSAGES/
│       │           ├── hwp5html.po
│       │           ├── hwp5odt.po
│       │           ├── hwp5proc.po
│       │           ├── hwp5txt.po
│       │           └── hwp5view.po
│       ├── msoleprops.py
│       ├── odf-relaxng/
│       │   ├── OpenDocument-manifest-schema-v1.0-os.rng
│       │   ├── OpenDocument-manifest-schema-v1.1.rng
│       │   ├── OpenDocument-schema-v1.0-os.rng
│       │   ├── OpenDocument-schema-v1.1.rng
│       │   ├── OpenDocument-strict-schema-v1.1.rng
│       │   ├── OpenDocument-v1.2-os-dsig-schema.rng
│       │   ├── OpenDocument-v1.2-os-manifest-schema.rng
│       │   ├── OpenDocument-v1.2-os-metadata.owl
│       │   ├── OpenDocument-v1.2-os-package-metadata.owl
│       │   └── OpenDocument-v1.2-os-schema.rng
│       ├── plat/
│       │   ├── __init__.py
│       │   ├── _lxml.py
│       │   ├── _uno/
│       │   │   ├── __init__.py
│       │   │   ├── adapters.py
│       │   │   ├── services.py
│       │   │   └── ucb.py
│       │   ├── gir_gsf.py
│       │   ├── javax_transform.py
│       │   ├── jython_poifs.py
│       │   ├── olefileio.py
│       │   ├── xmllint.py
│       │   └── xsltproc.py
│       ├── proc/
│       │   ├── __init__.py
│       │   ├── cat.py
│       │   ├── diststream.py
│       │   ├── find.py
│       │   ├── header.py
│       │   ├── ls.py
│       │   ├── models.py
│       │   ├── rawunz.py
│       │   ├── records.py
│       │   ├── summaryinfo.py
│       │   ├── unpack.py
│       │   ├── version.py
│       │   └── xml.py
│       ├── recordstream.py
│       ├── storage/
│       │   ├── __init__.py
│       │   ├── fs.py
│       │   └── ole.py
│       ├── summaryinfo.py
│       ├── tagids.py
│       ├── transforms/
│       │   └── __init__.py
│       ├── treeop.py
│       ├── utils.py
│       ├── xmldump_flat.py
│       ├── xmlformat.py
│       ├── xmlmodel.py
│       ├── xsl/
│       │   ├── binspec2html.xsl
│       │   ├── hwp5css-common.xsl
│       │   ├── hwp5css.xsl
│       │   ├── hwp5fodt.xsl
│       │   ├── hwp5html.xsl
│       │   ├── odt/
│       │   │   ├── common.xsl
│       │   │   ├── content.xsl
│       │   │   ├── document.xsl
│       │   │   └── styles.xsl
│       │   └── plaintext.xsl
│       └── zlib_raw_codec.py
├── stdeb.cfg
├── tests/
│   ├── README.rst
│   ├── cli_tests/
│   │   ├── hwp5html.txt
│   │   ├── hwp5odt.txt
│   │   ├── hwp5proc.txt
│   │   └── hwp5txt.txt
│   ├── hwp5_cli_tests.sh
│   ├── hwp5_tests/
│   │   ├── __init__.py
│   │   ├── fixtures/
│   │   │   ├── 5006-controldata.record
│   │   │   ├── __init__.py
│   │   │   ├── aligns.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── aligns.hwp
│   │   │   ├── aligns.hwp.bodytext.section0.json
│   │   │   ├── aligns.hwp.docinfo.json
│   │   │   ├── aligns.hwp.formatted.xml
│   │   │   ├── aligns.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── borderfill.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── borderfill.hwp
│   │   │   ├── borderfill.hwp.bodytext.section0.json
│   │   │   ├── borderfill.hwp.docinfo.json
│   │   │   ├── borderfill.hwp.formatted.xml
│   │   │   ├── borderfill.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── charshape.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── charshape.hwp
│   │   │   ├── charshape.hwp.bodytext.section0.json
│   │   │   ├── charshape.hwp.docinfo.json
│   │   │   ├── charshape.hwp.formatted.xml
│   │   │   ├── charshape.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── charstyle.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── charstyle.hwp
│   │   │   ├── charstyle.hwp.bodytext.section0.json
│   │   │   ├── charstyle.hwp.docinfo.json
│   │   │   ├── charstyle.hwp.formatted.xml
│   │   │   ├── charstyle.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── facename.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── facename.hwp
│   │   │   ├── facename.hwp.bodytext.section0.json
│   │   │   ├── facename.hwp.docinfo.json
│   │   │   ├── facename.hwp.formatted.xml
│   │   │   ├── facename.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── facename2.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── facename2.hwp
│   │   │   ├── facename2.hwp.bodytext.section0.json
│   │   │   ├── facename2.hwp.docinfo.json
│   │   │   ├── facename2.hwp.formatted.xml
│   │   │   ├── facename2.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── footnote-endnote.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── footnote-endnote.hwp
│   │   │   ├── footnote-endnote.hwp.bodytext.section0.json
│   │   │   ├── footnote-endnote.hwp.docinfo.json
│   │   │   ├── footnote-endnote.hwp.formatted.xml
│   │   │   ├── footnote-endnote.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── headerfooter.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── headerfooter.hwp
│   │   │   ├── headerfooter.hwp.bodytext.section0.json
│   │   │   ├── headerfooter.hwp.docinfo.json
│   │   │   ├── headerfooter.hwp.formatted.xml
│   │   │   ├── headerfooter.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.hwp
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.hwp.bodytext.section0.json
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.hwp.docinfo.json
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.hwp.formatted.xml
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── issue30.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── issue30.hwp
│   │   │   ├── issue30.hwp.bodytext.section0.json
│   │   │   ├── issue30.hwp.docinfo.json
│   │   │   ├── issue30.hwp.formatted.xml
│   │   │   ├── issue30.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── linespacing.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── linespacing.hwp
│   │   │   ├── linespacing.hwp.bodytext.section0.json
│   │   │   ├── linespacing.hwp.docinfo.json
│   │   │   ├── linespacing.hwp.formatted.xml
│   │   │   ├── linespacing.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── lists-bullet.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── lists-bullet.hwp
│   │   │   ├── lists-bullet.hwp.bodytext.section0.json
│   │   │   ├── lists-bullet.hwp.docinfo.json
│   │   │   ├── lists-bullet.hwp.formatted.xml
│   │   │   ├── lists-bullet.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── lists.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── lists.hwp
│   │   │   ├── lists.hwp.bodytext.section0.json
│   │   │   ├── lists.hwp.docinfo.json
│   │   │   ├── lists.hwp.formatted.xml
│   │   │   ├── lists.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── matrix.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── matrix.hwp
│   │   │   ├── matrix.hwp.bodytext.section0.json
│   │   │   ├── matrix.hwp.docinfo.json
│   │   │   ├── matrix.hwp.formatted.xml
│   │   │   ├── matrix.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── multicolumns-in-common-controls.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── multicolumns-in-common-controls.hwp
│   │   │   ├── multicolumns-in-common-controls.hwp.bodytext.section0.json
│   │   │   ├── multicolumns-in-common-controls.hwp.docinfo.json
│   │   │   ├── multicolumns-in-common-controls.hwp.formatted.xml
│   │   │   ├── multicolumns-in-common-controls.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── multicolumns-layout.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── multicolumns-layout.hwp
│   │   │   ├── multicolumns-layout.hwp.bodytext.section0.json
│   │   │   ├── multicolumns-layout.hwp.docinfo.json
│   │   │   ├── multicolumns-layout.hwp.formatted.xml
│   │   │   ├── multicolumns-layout.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── multicolumns-widths.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── multicolumns-widths.hwp
│   │   │   ├── multicolumns-widths.hwp.bodytext.section0.json
│   │   │   ├── multicolumns-widths.hwp.docinfo.json
│   │   │   ├── multicolumns-widths.hwp.formatted.xml
│   │   │   ├── multicolumns-widths.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── multicolumns.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── multicolumns.hwp
│   │   │   ├── multicolumns.hwp.bodytext.section0.json
│   │   │   ├── multicolumns.hwp.docinfo.json
│   │   │   ├── multicolumns.hwp.formatted.xml
│   │   │   ├── multicolumns.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── nonhwp5stg/
│   │   │   │   └── dummy
│   │   │   ├── nonole.txt
│   │   │   ├── pagedefs.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── pagedefs.hwp
│   │   │   ├── pagedefs.hwp.bodytext.section0.json
│   │   │   ├── pagedefs.hwp.docinfo.json
│   │   │   ├── pagedefs.hwp.formatted.xml
│   │   │   ├── pagedefs.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── paragraph-split-page.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── paragraph-split-page.hwp
│   │   │   ├── paragraph-split-page.hwp.bodytext.section0.json
│   │   │   ├── paragraph-split-page.hwp.docinfo.json
│   │   │   ├── paragraph-split-page.hwp.formatted.xml
│   │   │   ├── paragraph-split-page.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── parashape.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── parashape.hwp
│   │   │   ├── parashape.hwp.bodytext.section0.json
│   │   │   ├── parashape.hwp.docinfo.json
│   │   │   ├── parashape.hwp.formatted.xml
│   │   │   ├── parashape.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── password-12345.hwp
│   │   │   ├── sample-5017-pics.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── sample-5017-pics.hwp
│   │   │   ├── sample-5017-pics.hwp.bodytext.section0.json
│   │   │   ├── sample-5017-pics.hwp.docinfo.json
│   │   │   ├── sample-5017-pics.hwp.formatted.xml
│   │   │   ├── sample-5017-pics.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── sample-5017.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── sample-5017.hwp
│   │   │   ├── sample-5017.hwp.bodytext.section0.json
│   │   │   ├── sample-5017.hwp.docinfo.json
│   │   │   ├── sample-5017.hwp.formatted.xml
│   │   │   ├── sample-5017.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shapecomponent-rect-fill.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shapecomponent-rect-fill.hwp
│   │   │   ├── shapecomponent-rect-fill.hwp.bodytext.section0.json
│   │   │   ├── shapecomponent-rect-fill.hwp.docinfo.json
│   │   │   ├── shapecomponent-rect-fill.hwp.formatted.xml
│   │   │   ├── shapecomponent-rect-fill.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shapecontainer-2.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shapecontainer-2.hwp
│   │   │   ├── shapecontainer-2.hwp.bodytext.section0.json
│   │   │   ├── shapecontainer-2.hwp.docinfo.json
│   │   │   ├── shapecontainer-2.hwp.formatted.xml
│   │   │   ├── shapecontainer-2.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shapeline.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shapeline.hwp
│   │   │   ├── shapeline.hwp.bodytext.section0.json
│   │   │   ├── shapeline.hwp.docinfo.json
│   │   │   ├── shapeline.hwp.formatted.xml
│   │   │   ├── shapeline.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shapepict-scaled.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shapepict-scaled.hwp
│   │   │   ├── shapepict-scaled.hwp.bodytext.section0.json
│   │   │   ├── shapepict-scaled.hwp.docinfo.json
│   │   │   ├── shapepict-scaled.hwp.formatted.xml
│   │   │   ├── shapepict-scaled.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shaperect.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shaperect.hwp
│   │   │   ├── shaperect.hwp.bodytext.section0.json
│   │   │   ├── shaperect.hwp.docinfo.json
│   │   │   ├── shaperect.hwp.formatted.xml
│   │   │   ├── shaperect.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── tabdef.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── tabdef.hwp
│   │   │   ├── tabdef.hwp.bodytext.section0.json
│   │   │   ├── tabdef.hwp.docinfo.json
│   │   │   ├── tabdef.hwp.formatted.xml
│   │   │   ├── tabdef.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── table-caption.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── table-caption.hwp
│   │   │   ├── table-caption.hwp.bodytext.section0.json
│   │   │   ├── table-caption.hwp.docinfo.json
│   │   │   ├── table-caption.hwp.formatted.xml
│   │   │   ├── table-caption.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── table-position.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── table-position.hwp
│   │   │   ├── table-position.hwp.bodytext.section0.json
│   │   │   ├── table-position.hwp.docinfo.json
│   │   │   ├── table-position.hwp.formatted.xml
│   │   │   ├── table-position.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── table.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── table.hwp
│   │   │   ├── table.hwp.bodytext.section0.json
│   │   │   ├── table.hwp.docinfo.json
│   │   │   ├── table.hwp.formatted.xml
│   │   │   ├── table.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── textbox.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── textbox.hwp
│   │   │   ├── textbox.hwp.bodytext.section0.json
│   │   │   ├── textbox.hwp.docinfo.json
│   │   │   ├── textbox.hwp.formatted.xml
│   │   │   ├── textbox.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── underline-styles.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── underline-styles.hwp
│   │   │   ├── underline-styles.hwp.bodytext.section0.json
│   │   │   ├── underline-styles.hwp.docinfo.json
│   │   │   ├── underline-styles.hwp.formatted.xml
│   │   │   ├── underline-styles.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── viewtext.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── viewtext.hwp
│   │   │   ├── viewtext.hwp.bodytext.section0.json
│   │   │   ├── viewtext.hwp.docinfo.json
│   │   │   ├── viewtext.hwp.formatted.xml
│   │   │   └── viewtext.odt.d/
│   │   │       ├── META-INF/
│   │   │       │   └── manifest.xml
│   │   │       ├── content.xml
│   │   │       ├── manifest.rdf
│   │   │       ├── mimetype
│   │   │       └── styles.xml
│   │   ├── mixin_olestg.py
│   │   ├── mixin_relaxng.py
│   │   ├── mixin_xslt.py
│   │   ├── test_binmodel.py
│   │   ├── test_bintype.py
│   │   ├── test_compressed.py
│   │   ├── test_dataio.py
│   │   ├── test_distdoc.py
│   │   ├── test_filestructure.py
│   │   ├── test_hwp5html.py
│   │   ├── test_hwp5odt.py
│   │   ├── test_odtxsl.py
│   │   ├── test_ole.py
│   │   ├── test_plat_gir_gsf.py
│   │   ├── test_plat_javax_transform.py
│   │   ├── test_plat_jython_poifs.py
│   │   ├── test_plat_lxml.py
│   │   ├── test_plat_olefileio.py
│   │   ├── test_plat_uno.py
│   │   ├── test_plat_xmllint.py
│   │   ├── test_plat_xsltproc.py
│   │   ├── test_recordstream.py
│   │   ├── test_storage.py
│   │   ├── test_treeop.py
│   │   ├── test_utils.py
│   │   ├── test_xmlformat.py
│   │   └── test_xmlmodel.py
│   ├── hwp5_xsl_tests/
│   │   ├── odt-common.xml
│   │   ├── odt-content.xml
│   │   └── odt-styles.xml
│   └── setup.py
├── tools/
│   ├── README.rst
│   ├── constants/
│   │   ├── pyhwp_dev_constants.py
│   │   └── setup.py
│   ├── discover.lo/
│   │   ├── discover_lo.py
│   │   └── setup.py
│   ├── discover.lxml/
│   │   ├── discover_lxml.py
│   │   └── setup.py
│   ├── discover.python/
│   │   ├── discover_python.py
│   │   └── setup.py
│   ├── download/
│   │   ├── pyhwp_download.py
│   │   └── setup.py
│   ├── egg.path/
│   │   ├── egg_path.py
│   │   └── setup.py
│   ├── gpl/
│   │   ├── gpl/
│   │   │   ├── Pysec.py
│   │   │   ├── __init__.py
│   │   │   ├── parsers.py
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       └── test_gpl.py
│   │   └── setup.py
│   ├── jingodf/
│   │   ├── jingodf/
│   │   │   ├── __init__.py
│   │   │   └── schema/
│   │   │       ├── OpenDocument-manifest-schema-v1.0-os.rng
│   │   │       ├── OpenDocument-manifest-schema-v1.1.rng
│   │   │       ├── OpenDocument-schema-v1.0-os.rng
│   │   │       ├── OpenDocument-schema-v1.1.rng
│   │   │       ├── OpenDocument-strict-schema-v1.1.rng
│   │   │       ├── OpenDocument-v1.2-os-dsig-schema.rng
│   │   │       ├── OpenDocument-v1.2-os-manifest-schema.rng
│   │   │       ├── OpenDocument-v1.2-os-metadata.owl
│   │   │       ├── OpenDocument-v1.2-os-package-metadata.owl
│   │   │       └── OpenDocument-v1.2-os-schema.rng
│   │   └── setup.py
│   ├── jxml/
│   │   ├── jxml/
│   │   │   ├── __init__.py
│   │   │   └── etree/
│   │   │       └── __init__.py
│   │   ├── jxml.coverage/
│   │   │   ├── jxml_coverage.py
│   │   │   └── setup.py
│   │   ├── lxml/
│   │   │   ├── lxml/
│   │   │   │   ├── __init__.py
│   │   │   │   └── etree/
│   │   │   │       └── __init__.py
│   │   │   └── setup.py
│   │   ├── setup.py
│   │   └── tests/
│   │       ├── Makefile
│   │       ├── hello.xml
│   │       ├── sample.xml
│   │       ├── test_jaxp.py
│   │       ├── test_lxml.py
│   │       ├── text-output.xsl
│   │       └── xsl/
│   │           ├── import-test.xsl
│   │           └── imported.xsl
│   ├── oxt.tool/
│   │   ├── oxt_tool/
│   │   │   ├── __init__.py
│   │   │   ├── backend.py
│   │   │   ├── description.py
│   │   │   ├── manifest.py
│   │   │   ├── package.py
│   │   │   ├── remote.py
│   │   │   ├── storage/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── _zipfile.py
│   │   │   │   ├── fs.py
│   │   │   │   └── path.py
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       ├── mixin_storage.py
│   │   │       ├── test_fs.py
│   │   │       ├── test_package.py
│   │   │       ├── test_storage_path.py
│   │   │       └── test_zipfile.py
│   │   └── setup.py
│   ├── pyhwp.zestreleaser.cmds/
│   │   ├── CHANGES
│   │   ├── COPYING
│   │   ├── README.rst
│   │   ├── pyhwp_zestreleaser_cmds.py
│   │   └── setup.py
│   ├── unpack/
│   │   ├── pyhwp_unpack.py
│   │   └── setup.py
│   └── xsltest/
│       ├── setup.py
│       └── xsltest/
│           ├── __init__.py
│           └── xmltool/
│               ├── __init__.py
│               ├── subtree.py
│               ├── wrap.py
│               └── xslt.py
├── tox.ini
├── tox.ini.in
└── unokit/
    ├── setup.py
    └── unokit/
        ├── __init__.py
        ├── adapters.py
        ├── configuration.py
        ├── contexts.py
        ├── services.py
        ├── singletons.py
        ├── tests/
        │   ├── __init__.py
        │   ├── test_configuration.py
        │   ├── test_singletons.py
        │   └── test_ucb.py
        ├── ucb.py
        └── util.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
pyhwp/hwp5/_version.py export-subst


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "daily"
    target-branch: "develop"


================================================
FILE: .gitignore
================================================
*$py.class
*.egg-info
*.log
*.mo
*.po~
*.pyc
.*.sw?
.coverage*
/*.egg
/.eggs
/.installed.cfg
/.jip
/.jip_index
/.tox
/.venv
/bin
/build
/develop-eggs
/data/pom.tpl
/dist
/docs/.build
/downloads
/eggs
/include
/javalib
/lib
/local
/oxt/pyhwp.egg.record
/oxt/pyhwp.oxt
/oxt/pythonpath
/parts
/pip-selfcheck.json
/pyhwp/build
/pyhwp/dist
/pyhwp/localtest.py
/pyhwp/pyhwp.egg-info
/releases
/samples.local
/share
/test-xsl
/testpypi
/venv
/xsltcoverage.xml
coverage-original.xml
coverage.xml
deb_dist
pep8.out
pylint.out


================================================
FILE: .travis.yml
================================================
language: python
python:
- "2.7"
env:
- TOXENV=py27
matrix:
  include:
    - python: "3.8"
      env: TOXENV=lint
    - python: "2.7"
      env: TOXENV=py27
    - python: "3.5"
      env: TOXENV=py35
    - python: "3.6"
      env: TOXENV=py36
    - python: "3.7"
      env: TOXENV=py37
      dist: xenial
      sudo: yes
    - python: "3.8"
      env: TOXENV=py38
      dist: xenial
      sudo: yes
    - python: "pypy"
      env: TOXENV=pypy
    - python: "pypy3"
      env: TOXENV=pypy3
    - python: "2.7"
      env: TOXENV=jy27
  allow_failures:
    - python: "pypy"
      env: TOXENV=pypy
    - python: "pypy3"
      env: TOXENV=pypy3
    - python: "2.7"
      env: TOXENV=jy27
before_install:
  - sudo apt-get -qq update
  - sudo apt-get install -y libxml2-utils xsltproc
install:
  - pip install -U setuptools pip wheel jip
  - pip install -U zc.buildout tox coverage python-coveralls
  - buildout
  - tox --version
  - sort --version
  - env | sort
  - if [ "$TOXENV" == "jy27" ]; then make install-jython; fi
script:
  - tox
after_success:
  - coverage combine .tox/*/tmp
  - coverage report
  - coveralls


================================================
FILE: CHANGES
================================================
CHANGES
=======

0.1b16 (unreleased)
-------------------

- [CVE-2023-0286] Depends on cryptography >= 40.0.1
- [CVE-2022-2309] Depends on lxml >= 4.9,2


0.1b15 (2020-05-30)
-------------------

- Unknown Numbering.Kind value of 6, which is not described in the official
  specification docs, has been added. See #177.


0.1b14 (2020-05-17)
-------------------

- Fix xmldump_flat for Python 3.8


0.1b13 (2020-05-17)
-------------------

- Replace docopt with argparse.
- Workaround for BinData decompression (#175, #176)


0.1b12 (2019-04-08)
-------------------

- Add Python 3.x support.
- Add an optional dependency on colorlog for colorful logging
- Remove dependency on hypua2jamo, resulting no automatic conversion of
  Hanyang PUA to Hangul Jamo


0.1b11 (2019-03-21)
-------------------

- Remove dependency on PyCrypto.
  - [CVE-2013-7458], [CVE-2018-6594]
- Add dependency on cryptography.


0.1b10 (2019-03-21)
-------------------

- Drop support for Python 2.5, 2.6.
- Prefer 'olefile' to 'OleFileIO_PL'.
- Fix 'Dutmal' control attribute names.
- hwp5html: represent path names in bytes
- Declare some dependencies with environment markers: olefile, lxml, pycrypto
- Update dependency on hypua2jamo >= 0.4.4


0.1b9 (2016-02-26)
------------------

- hwp5html: serveral improvements
  - lang-* classes of span elements and associated css font-family
  - horizontal page layouts
  - Single page layout
  - enhance horizontal positioning of TableControl, GShapeObject
- distdoc: fix sha1offset (by Hodong Kim)

0.1b8 (2014-11-03)
------------------

- hwp5view: experimental viewer with webkitgtk+
- hwp5proc: xml --formats ("flat", "nested")
- hwp5proc: models --events (experimental)
- hwp5proc: models --seqno --format (incompatible changes)
- hwp5proc: find --from-stdin
- hwp5proc: find --format
- binmodels: GShapeObjectCaption
- olestorage: Gsf implementation through python-gi
- olestorage: use new olefile instead of OleFileIO_PL


0.1b7 (2014-01-31)
------------------

- support distribution docs. (based on `Changwoo Ryu's algorithm <https://groups.google.com/forum/#!topic/hwp-foss/d2KL2ypR89Q>`_)

0.1b6 (2014-01-20)
------------------

- binmodel: change type of TableCell dimensions to signed integer
- hwp5odt: fix NCName for style:name (close #140)
- hwp5proc: fix with-statement in 'xml' command for Python 2.5
- hwp5proc: mark 'xml' command experimental

0.1b5 (2013-10-29)
------------------

- close #134
- hwp5html generates .xhtml instead of .html
- hwp5proc: new '--no-xml-decl' option
- hwp5odt: fix to not use '/' in resulting style names
- hwp5proc: IdMappings.memoshape only if version > 5.0.1.6

0.1b4 (2013-07-03)
------------------

- hwp5proc records: new option '--raw-header'
- hwp5odt: new '--document' option produces single ODT XML files (``*.fodt``)
- hwp5odt: new '--styles', '--content' option produces styles/content XML files
- ODT XSL files restructured

0.1b3 (2013-06-18)
------------------

- Fix IdMappings (#125)
- hwp5proc records: new option '--raw-payload'
- hwp5proc xml: FlagsType as xsd:hexBinary
- Various binary/xml models changes

0.1b2 (2013-06-08)
------------------

- Add PyPy support


================================================
FILE: COPYING
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.


================================================
FILE: MANIFEST.in
================================================
include .coveragerc
include CHANGES
include COPYING
include LICENSE
include Makefile
include VERSION.txt
include README
include README.rst
include buildout.cfg
include classifiers.txt
include ez_setup.py
exclude notebooks
include src/README.rst
include src/hwp5/COPYING
include src/hwp5/README
include src/hwp5/VERSION.txt
include src/hwp5/xsl/*.xsl
include src/hwp5/xsl/odt/*
include requirements.in
include requirements.txt
include requirements/dev.in
include requirements/dev.txt
include requirements/docs.in
include requirements/docs.txt
include requirements/lint.in
include requirements/lint.txt
include requirements/test.in
include requirements/test.txt
exclude samples
include stdeb.cfg
include tox.ini
include tox.ini.in
recursive-include src/hwp5/locale *.po
recursive-include src/hwp5/locale *.pot
prune buildouts
prune docs
prune etc
prune misc
prune oxt
prune release-hooks
prune tests
prune tools
prune unokit
prune src/hwp5/odf-relaxng
include src/hwp5/odf-relaxng/OpenDocument-v1.2-os-*.rng
prune pyhwp_uno


================================================
FILE: Makefile
================================================
define ALL
	update-requirements
	install-jython
endef
ALL:=$(shell echo $(ALL))  # to remove line-feeds

define REQUIREMENTS_FILES
	requirements/dev.txt
	requirements/docs.txt
	requirements/lint.txt
	requirements/test.txt
	requirements.txt
endef
REQUIREMENTS_FILES:=$(shell echo $(REQUIREMENTS_FILES))

define REQUIREMENTS_IN
	requirements.in
endef
REQUIREMENTS_IN:=$(shell echo $(REQUIREMENTS_IN))

define REQUIREMENTS_IN_TEST
	requirements/test.in
	requirements.in
endef
REQUIREMENTS_IN_TEST:=$(shell echo $(REQUIREMENTS_IN_TEST))

define REQUIREMENTS_IN_LINT
	requirements/lint.in
endef
REQUIREMENTS_IN_LINT:=$(shell echo $(REQUIREMENTS_IN_LINT))

define REQUIREMENTS_IN_DOCS
	requirements/docs.in
endef
REQUIREMENTS_IN_DOCS:=$(shell echo $(REQUIREMENTS_IN_DOCS))

define REQUIREMENTS_IN_DEV
	requirements/dev.in
	requirements/docs.in
	requirements/lint.in
	requirements/test.in
	requirements.in
endef
REQUIREMENTS_IN_DEV:=$(shell echo $(REQUIREMENTS_IN_DEV))

offline?=0

ifeq (1,$(offline))
PIP_NO_INDEX:=--no-index
endif

FIND_LINKS?=
VENV	:= . .venv/bin/activate &&


.PHONY: all
all: $(ALL)

.PHONY: bootstrap
bootstrap:
	[ -e bin/activate ] || virtualenv -p python2.7 .
	$(VENV) pip install -U setuptools pip wheel pip-tools
	make update-requirements
	$(VENV) buildout

.PHONY: update-requirements
update-requirements: $(REQUIREMENTS_FILES)
	$(VENV) pip-sync $(FIND_LINKS) $(PIP_NO_INDEX) requirements/dev.txt

requirements.txt: $(REQUIREMENTS_IN)
	$(VENV)	pip-compile $(FIND_LINKS) $(PIP_NO_INDEX) $(pip-compile-options) -o $@ $^

requirements/test.txt: $(REQUIREMENTS_IN_TEST)
	$(VENV) pip-compile $(FIND_LINKS) $(PIP_NO_INDEX) $(pip-compile-options) -o $@ $^

requirements/lint.txt: $(REQUIREMENTS_IN_LINT)
	$(VENV) pip-compile $(FIND_LINKS) $(PIP_NO_INDEX) $(pip-compile-options) -o $@ $^

requirements/docs.txt: $(REQUIREMENTS_IN_DOCS)
	$(VENV) pip-compile $(FIND_LINKS) $(PIP_NO_INDEX) $(pip-compile-options) -o $@ $^

requirements/dev.txt: $(REQUIREMENTS_IN_DEV)
	$(VENV) pip-compile $(FIND_LINKS) $(PIP_NO_INDEX) $(pip-compile-options) -o $@ $^


.PHONY: extract-messages
extract-messages:
	$(VENV) python setup.py extract_messages --input-paths=pyhwp/hwp5/proc --output-file=pyhwp/hwp5/locale/hwp5proc.pot
	$(VENV) python setup.py extract_messages --input-paths=pyhwp/hwp5/hwp5html.py --output-file=pyhwp/hwp5/locale/hwp5html.pot
	$(VENV) python setup.py extract_messages --input-paths=pyhwp/hwp5/hwp5odt.py --output-file=pyhwp/hwp5/locale/hwp5odt.pot
	$(VENV) python setup.py extract_messages --input-paths=pyhwp/hwp5/hwp5txt.py --output-file=pyhwp/hwp5/locale/hwp5txt.pot
	$(VENV) python setup.py extract_messages --input-paths=pyhwp/hwp5/hwp5view.py --output-file=pyhwp/hwp5/locale/hwp5view.pot

.PHONY: init-catalog
init-catalog:
	$(VENV) python setup.py init_catalog --domain=hwp5proc --input-file=pyhwp/hwp5/locale/hwp5proc.pot --locale=ko
	$(VENV) python setup.py init_catalog --domain=hwp5html --input-file=pyhwp/hwp5/locale/hwp5html.pot --locale=ko
	$(VENV) python setup.py init_catalog --domain=hwp5odt --input-file=pyhwp/hwp5/locale/hwp5odt.pot --locale=ko
	$(VENV) python setup.py init_catalog --domain=hwp5txt --input-file=pyhwp/hwp5/locale/hwp5txt.pot --locale=ko
	$(VENV) python setup.py init_catalog --domain=hwp5view --input-file=pyhwp/hwp5/locale/hwp5view.pot --locale=ko

.PHONY: update-catalog
update-catalog:
	$(VENV) python setup.py update_catalog --domain=hwp5proc --input-file=pyhwp/hwp5/locale/hwp5proc.pot
	$(VENV) python setup.py update_catalog --domain=hwp5html --input-file=pyhwp/hwp5/locale/hwp5html.pot
	$(VENV) python setup.py update_catalog --domain=hwp5odt --input-file=pyhwp/hwp5/locale/hwp5odt.pot
	$(VENV) python setup.py update_catalog --domain=hwp5txt --input-file=pyhwp/hwp5/locale/hwp5txt.pot
	$(VENV) python setup.py update_catalog --domain=hwp5view --input-file=pyhwp/hwp5/locale/hwp5view.pot

.PHONY: compile-catalog
compile-catalog:
	$(VENV) python setup.py compile_catalog --domain=hwp5proc
	$(VENV) python setup.py compile_catalog --domain=hwp5html
	$(VENV) python setup.py compile_catalog --domain=hwp5odt
	$(VENV) python setup.py compile_catalog --domain=hwp5txt
	$(VENV) python setup.py compile_catalog --domain=hwp5view

.PHONY: notebook
notebook:
	$(VENV)	jupyter notebook --notebook-dir=notebooks


.PHONY: test
test:
	$(VENV) tox --parallel 2 -e py27,py38

.PHONY: test-report
test-report:
	$(VENV) coverage combine .tox/*/tmp
	$(VENV) coverage report
	$(VENV) coverage html
	$(VENV) coverage xml

.PHONY: clitest
clitest:
	$(VENV) env LANG=C clitest -1 --prefix 3 tests/cli_tests/hwp5proc.txt tests/cli_tests/hwp5odt.txt tests/cli_tests/hwp5html.txt tests/cli_tests/hwp5txt.txt


.PHONY: install-jython
install-jython: parts/jython2.7/bin/jython
parts/jython2.7/bin/jython:
	rm -rf parts/jython2.7
	mkdir -p parts
	$(VIRTUAL_ENV)/bin/jip install org.python:jython-installer:2.7.1
	java -jar $(VIRTUAL_ENV)/javalib/jython-installer-2.7.1.jar -s -d $(PWD)/parts/jython2.7


================================================
FILE: README
================================================
pyhwp
=====

HWP Document Format v5 parser & processor.

Features
--------

- Analyze and extract internal streams out from a HWP Document Format v5 file
- (*Experimental*) Conversion to OpenDocument format (.odt) or plain text (.txt)

Installation
------------

from `pypi <http://pypi.org/project/pyhwp>`_::

   virtualenv pyhwp
   pyhwp/bin/pip install --pre pyhwp  # Install pyhwp into a virtualenv directory

Or::

   pip install --user --pre pyhwp  # Install pyhwp into user's home directory

Requirements
------------

- Python 2.7, 3.5, 3.6, 3.7 or 3.8
- `cryptography <https://pypi.org/project/cryptography>`_
- `lxml <https://pypi.org/project/lxml>`_
- `olefile <https://pypi.org/project/olefile>`_

Documentation & Development
---------------------------

- Documentation: `https://pyhwp.readthedocs.io <https://pyhwp.readthedocs.io>`_ [`한국/조선어 <https://pyhwp.readthedocs.io/ko/latest>`_]
- Distribution: `https://pypi.org/project/pyhwp/ <https://pypi.org/project/pyhwp/>`_
- Development: `https://github.com/mete0r/pyhwp <https://github.com/mete0r/pyhwp>`_
- Issue tracker: `https://github.com/mete0r/pyhwp/issues <https://github.com/mete0r/pyhwp/issues>`_
- Feedbacks & contributions are welcome!

Contributors
------------

Maintainer: `mete0r <https://github.com/mete0r>`_

License
-------

Copyright (C) 2010-2023 mete0r <https://github.com/mete0r>

.. image:: http://www.gnu.org/graphics/agplv3-155x51.png

`GNU Affero General Public License v3.0 <http://www.gnu.org/licenses/agpl-3.0.html>`_
`(text version) <http://www.gnu.org/licenses/agpl-3.0.txt>`_

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Disclosure
----------

This program has been developed in accordance with a public document named "HWP
Binary Specification 1.1" published by `Hancom Inc. <http://www.hancom.co.kr>`_


================================================
FILE: VERSION.txt
================================================
0.1b16.dev0


================================================
FILE: buildout.cfg
================================================
[buildout]
develop = .
parts =
	pyhwp
	clitest


[pyhwp]
recipe = zc.recipe.egg
eggs =
	pyhwp


[clitest]
recipe = hexagonit.recipe.download
url = https://raw.githubusercontent.com/aureliojargas/clitest/0.3.0/clitest
download-only = true
mode = 0700
destination = ${buildout:bin-directory}


================================================
FILE: buildouts/components/jxml.cfg
================================================
[buildout]
extends= virtualenv-jython.cfg

[jxml]
recipe = collective.recipe.cmd
cmds = ${jxml-install:output} "${:location}"
on_install = true
on_update = true

location = ${buildout:parts-directory}/jxml

[jxml-install]
recipe = collective.recipe.template
output = ${buildout:parts-directory}/jxml-install.sh
mode=755
input =inline:
       #!/bin/sh
       set -e

       usage() {
              echo "usage: $0 <location>"
              exit
       }

       location="$1"
       [ -n "$location" ] || usage;

       ${virtualenv-jython:output} "$location"
       jython="$location/bin/jython"
       installed="$location/installed"
       "$location/bin/pip" list > "$installed"
       grep pyhwp "$installed" || "$jython" "${buildout:directory}/setup.py" develop
       grep xsltest "$installed" || "$jython" "${buildout:directory}/tools/xsltest/setup.py" develop
       grep jxml "$installed" || "$jython" "${buildout:directory}/tools/jxml/setup.py" develop
       grep jxml.lxml "$installed" || "$jython" "${buildout:directory}/tools/jxml/lxml/setup.py" develop
       grep jxml.coverage "$installed" || "$jython" "${buildout:directory}/tools/jxml/jxml.coverage/setup.py" develop


================================================
FILE: buildouts/components/virtualenv-1.9.1.cfg
================================================
[virtualenv-1.9.1]
recipe = hexagonit.recipe.download
url = https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.9.1.tar.gz
destination = ${buildout:parts-directory}/virtualenv-1.9.1
strip-top-level-dir = true


================================================
FILE: buildouts/components/virtualenv-jython.cfg
================================================
[buildout]
extends= virtualenv-1.9.1.cfg

[virtualenv-jython]
recipe = collective.recipe.template
output = ${buildout:bin-directory}/virtualenv-jython
mode=755
input =inline:
       #!/bin/sh
       set -e

       usage() {
              echo "usage: $0 <location>"
              exit 1
       }

       location="$1"
       [ -n "$location" ] || usage

       activate="$location/bin/activate"
       [ -e "$activate" ] || jython ${virtualenv-1.9.1:destination}/virtualenv.py $location



================================================
FILE: buildouts/components/xalan-j-2.7.1.cfg
================================================
[xalan-j-2.7.1]
recipe = hexagonit.recipe.download
url = ${xalan-j-2.7.1.tar.gz:downloaded}
destination = ${buildout:parts-directory}/xalan-j-2.7.1
strip-top-level-dir = true

jars = ${:destination}/xalan.jar:${:destination}/xercesImpl.jar:${:destination}/serializer.jar:${:destination}/xml-apis.jar

[xalan-j-2.7.1.tar.gz]
recipe = hexagonit.recipe.download
url = http://mirror.apache-kr.org/xalan/xalan-j/binaries/xalan-j_2_7_1-bin-2jars.tar.gz
md5sum = 3ccda39bcd08b780436dfd2f22fb23d5
destination = ${buildout:parts-directory}
filename = xalan-j-2.7.1.tar.gz
download-only = true

downloaded = ${:destination}/${:filename}



================================================
FILE: buildouts/components/xalan-j-2.7.2.cfg
================================================
[xalan-j-2.7.2]
recipe = hexagonit.recipe.download
url = ${xalan-j-2.7.2.tar.gz:downloaded}
destination = ${buildout:parts-directory}/xalan-j-2.7.2
strip-top-level-dir = true

jars = ${:destination}/xalan.jar:${:destination}/xercesImpl.jar:${:destination}/serializer.jar:${:destination}/xml-apis.jar

[xalan-j-2.7.2.tar.gz]
recipe = hexagonit.recipe.download
url = http://apache.tt.co.kr/xalan/xalan-j/binaries/xalan-j_2_7_2-bin-2jars.tar.gz
# md5sum = 3ccda39bcd08b780436dfd2f22fb23d5
destination = ${buildout:parts-directory}
filename = xalan-j-2.7.2.tar.gz
download-only = true

downloaded = ${:destination}/${:filename}




================================================
FILE: buildouts/developer.cfg
================================================
[buildout]
extends = translator.cfg
          components/jxml.cfg
          components/xalan-j-2.7.2.cfg
develop+= pyhwp-tests
          tools/xsltest
          tools/gpl
parts+= test-core
	test-coverage
	test-cli
        test-xsl
        test-xsl-cov
	test-sdist
        test-tools
	test-for-bisect
        xsltest
        code-analysis
        collect-samples
        masstest-failed
        massfind-unknowntag
        massfind-incomplete
        expected-output-update

[pyhwp]
eggs+= nose
       coverage
       gpl
       pyroma

[test-core]
recipe = collective.xmltestreport
eggs = pyhwp-tests
defaults = ['--auto-color', '--auto-progress', '--xml', '--tests-pattern=hwp5_tests']

[test-xsl]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/test-xsl.in
output = ${buildout:directory}/bin/test-xsl
mode = 755

[test-xsl-cov]
recipe = collective.recipe.template
mode=755
output=${buildout:bin-directory}/test-xsl-cov
input =inline:
       #!/bin/sh
       CLASSPATH=${xalan-j-2.7.2:jars} ${jxml:location}/bin/jxml-cov-test $*

[test-coverage]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/test-coverage
output = ${buildout:directory}/bin/test-coverage
mode = 755

[test-cli]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/test-cli.in
output = ${buildout:directory}/bin/test-cli
mode = 755

[test-sdist]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/test-sdist.in
output = ${buildout:directory}/bin/test-sdist
mode = 755

[test-tools]
recipe = collective.xmltestreport
eggs = gpl
defaults = ['--auto-color', '--auto-progress', '--xml']

[test-for-bisect]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/test-for-bisect
output = ${buildout:directory}/bin/test-for-bisect
mode = 755

[xsltest]
recipe = zc.recipe.egg
eggs = xsltest

[code-analysis]
recipe = plone.recipe.codeanalysis
directory = ${buildout:directory}/pyhwp

# Default is 10
flake8-max-complexity = 30

utf8-header = True

[collect-samples]
recipe = collective.recipe.template
mode = 755
output = ${buildout:bin-directory}/${:_buildout_section_name_}
input =
       inline:
       #!/bin/sh

       set -e

       dir="$1"
       find "$dir" -iname '*.hwp' -print0 | parallel --gnu -0 "${save-sample:output}"

[save-sample]
recipe = collective.recipe.template
mode = 755
output = ${buildout:bin-directory}/${:_buildout_section_name_}
input =
       inline:
       #!/bin/sh

       set -e

       src="$1"

       [ -e "$src" ] || (echo "$src not found"; exit 1)

       ${:abspath}

       version=$(${buildout:bin-directory}/hwp5proc version "$src")
       srcpath=$(abspath "$src")
       sha1sum=$(sha1sum -b "$srcpath" | awk '{ print $1 }')

       echo "$version/$sha1sum $srcpath"

       repo="${buildout:directory}/samples.local"

       blob_dir="${buildout:directory}/samples.local/blob"
       [ -d "$blob_dir" ] || mkdir -p "$blob_dir"

       blob_path="$blob_dir/$sha1sum"
       [ -e "$blob_path" ] || cp "$srcpath" "$blob_path"

       dst_path="$repo/$version/$sha1sum.hwp"
       dst_dir=$(dirname "$dst_path")
       [ -d "$dst_dir" ] || mkdir -p "$dst_dir"
       [ -e $dst_path ] || ln -s "$blob_path" "$dst_path"

abspath=
       abspath() {
              if [ $(echo "$1" | head -c 1) = "/" ]; then
                     echo "$1"
              else
                     echo "$PWD/$1"
              fi
       }

[masstest-failed]
recipe = collective.recipe.template
mode = 755
output = ${buildout:bin-directory}/${:_buildout_section_name_}
input =
       inline:
       #!/bin/sh

       set -e

       ${masstest:output} "${masstest-worker:failed-dir}"

[masstest]
recipe = collective.recipe.template
mode = 755
output = ${buildout:bin-directory}/${:_buildout_section_name_}
input =
       inline:
       #!/bin/sh

       set -e

       ${:def-masstest}

       sample_dir="${buildout:directory}/samples.local/"
       [ -z "$1" ] || sample_dir="$1"

       masstest "$sample_dir" | tee ${buildout:parts-directory}/masstest.log

def-masstest=
       masstest() {
              find "$1" -iname '*.hwp' -print0 | parallel --gnu -0 ${masstest-worker:output}
       }

[masstest-worker]
recipe = collective.recipe.template
mode = 755
output = ${buildout:bin-directory}/${:_buildout_section_name_}
input =
       inline:
       #!/bin/sh

       set -e

       [ -e "$1" ] || (echo "$1: not found"; exit 1)
       testee="$1"

       failed_dir="${:failed-dir}"
       [ -d "$failed_dir" ] || mkdir -p "$failed_dir"

       errors_dir="${:errors-dir}"
       [ -d "$errors_dir" ] || mkdir -p "$errors_dir"

       testee_filename=$(basename "$testee")
       testee_error_hwp5proc="$errors_dir/$testee_filename.hwp5proc.err"
       testee_error_xmllint="$errors_dir/$testee_filename.xmllint.err"

       test_xml() {
              ${buildout:bin-directory}/hwp5proc xml "$testee" 2> "$testee_error_hwp5proc" | xmllint --format - > /dev/null 2> "$testee_error_xmllint"
       }

       handle_success() {
              echo ""
              filename=$(basename "$testee")
              failed_path="$failed_dir/$filename"
              [ ! -e "$failed_path" ] || rm -f "$failed_path"
              rm -f "$testee_error_hwp5proc"
              rm -f "$testee_error_xmllint"
       }

       handle_failed() {
              echo " FAILED"
              [ -e "$failed_path" ] || ln -s "$testee" "$failed_dir"
       }

       echo -n "$testee"
       test_xml && handle_success || handle_failed

failed-dir=${buildout:parts-directory}/masstest/failed
errors-dir=${buildout:parts-directory}/masstest/errors


[massfind-unknowntag]
recipe = collective.recipe.template
output = ${buildout:bin-directory}/${:_buildout_section_name_}
mode = 755
input =
       inline:
       #!/bin/sh

       set -e

       samples='${buildout:directory}/samples.local'
       find "$samples/" -iname '*.hwp' | parallel --gnu ${buildout:bin-directory}/hwp5proc find --model=UnknownTagModel | tee ${buildout:parts-directory}/massfind-unknowntag


[massfind-incomplete]
recipe = collective.recipe.template
output = ${buildout:bin-directory}/${:_buildout_section_name_}
mode = 755
input =
       inline:
       #!/bin/sh

       set -e

       samples='${buildout:directory}/samples.local'
       find "$samples/" -iname '*.hwp' | parallel --gnu ${buildout:bin-directory}/hwp5proc find --incomplete | tee ${buildout:parts-directory}/massfind-incomplete


[expected-output-update]
recipe = collective.recipe.template
output = ${buildout:bin-directory}/${:_buildout_section_name_}
mode = 755
input =
       inline:
       #!/bin/sh

       set -e

       samples='${buildout:directory}/samples'
       find "$samples/" -iname '*.hwp' | parallel --gnu ${expected-output-update-worker:output}

[expected-output-update-worker]
recipe = collective.recipe.template
output = ${buildout:bin-directory}/${:_buildout_section_name_}
mode = 755
input =
       inline:
       #!/bin/sh

       set -e

       filename=$1
       docinfo="$filename.docinfo.json"
       section0="$filename.bodytext.section0.json"
       xmlformat="$filename.formatted.xml"
       odt_output="$filename.odt"
       odt_filename=`basename "$odt_output"`

       hwp5proc_xml() {
              ${buildout:bin-directory}/hwp5proc xml "$1" 2> "$xmlformat.err"
       }

       hwp5odt() {
              local orgdir="$PWD"
              local filename=`basename "$1"`
              local odt_file=`echo $filename | sed -e "s/.hwp$/.odt/g"`
              cd `dirname "$1"`
              ${buildout:bin-directory}/hwp5odt "$filename"
              rm -rf "$odt_file.d"
              mkdir "$odt_file.d"
              unzip "$odt_file" -d "$odt_file.d"
              rm -f "$odt_file"
              cd "$orgdir"
       }

       hwp5html() {
              local html_dir=`echo $1 | sed -e "s/.hwp$/.html.d/g"`
              rm -rf "$html_dir"
              ${buildout:bin-directory}/hwp5html "$1" --output "$html_dir"
              xmllint --c14n --nonet --encode utf-8 "$html_dir/index.xhtml" | xmllint --format --encode utf-8 - > "$html_dir/index.formatted.xhtml"
       }

       xml_c14n() {
              xmllint --c14n --encode utf-8 - 2> "$xmlformat.c14n.err"
       }
       xml_format() {
              xmllint --format --encode utf-8 - 2> "$xmlformat.format.err"
       }

       if ${buildout:bin-directory}/hwp5proc header "$filename" | grep password | grep 0 > /dev/null; then
              dummy=''
       else
              echo "$filename: SKIPPING"
              rm -f "$docinfo.err"
              rm -f "$section0.err"
              rm -f "$xmlformat.err"
              rm -f "$xmlformat.c14n.err"
              rm -f "$xmlformat.format.err"
              exit 0
       fi

       ${buildout:bin-directory}/hwp5proc models "$filename" docinfo > "$docinfo" 2> "$docinfo.err" && echo "$filename: docinfo" && rm -f "$docinfo.err"

       ${buildout:bin-directory}/hwp5proc models "$filename" bodytext/0 > "$section0" 2> "$section0.err" && echo "$filename: bodytext/0" && rm -f "$section0.err"

       hwp5proc_xml "$filename" | xml_c14n | xml_format > "$xmlformat" && echo "$filename: xml" && rm -f "$xmlformat.err" "$xmlformat.c14n.err" "$xmlformat.format.err"
       hwp5odt "$filename"
       hwp5html "$filename"


================================================
FILE: buildouts/maintainer.cfg
================================================
[buildout]
extends = tester.cfg
develop+= tools/pyhwp.zestreleaser.cmds
parts+= test-upload
        docs-upload
	upload
        test-pypi

[pyhwp]
eggs+= zest.releaser
       pyhwp.zestreleaser.cmds

[docs-upload]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/docs-upload
output = ${buildout:directory}/bin/docs-upload
mode = 755

[test-upload]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/test-upload.in
output = ${buildout:directory}/bin/test-upload
mode = 755

[upload]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/upload
output = ${buildout:directory}/bin/upload
mode = 755

[test-pypi]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/test-pypi.in
output = ${buildout:directory}/bin/test-pypi
mode = 755


================================================
FILE: buildouts/tester.cfg
================================================
[buildout]
extends = developer.cfg
          https://raw.github.com/mete0r/mkvenv/master/lib/buildout.extends/mkvenv.cfg
develop+= tools/constants
          tools/jingodf
parts+= tox-ini
        tox-py25
        tox-jy25
        wheelhouse

[versions]
collective.xmltestreport = 1.2.6

[constants]
recipe = pyhwp.dev.constants

[wheelhouse]
recipe = z3c.recipe.mkdir
paths=wheelhouse

[tox]
recipe = zc.recipe.egg
eggs = tox

[tox-ini]
recipe = collective.recipe.template
input = ${buildout:directory}/tox.ini.in
output = ${buildout:directory}/tox.ini
mode = 755

[tox-shim]
recipe = collective.recipe.template
mode = 755
output = ${buildout:bin-directory}/${:name}
input = inline:
        #!/bin/sh
        set -e

        # build virtualenv
        ${:mkvenv} ${:envdir}
        . ${:envbindir}/activate

        # sdist & install
        ${:envpython} setup.py install

        ${:environment-variables}

        # ---- commands ----
	${:envpython} ${:toxinidir}/misc/cleanup-pyc.py ${:toxinidir}/pyhwp ${:toxinidir}/pyhwp_uno ${:toxinidir}/unokit
	${:envpython} ${:toxinidir}/misc/mkdir.py ${:envtmpdir}

        ${:envbindir}/pip install nose coverage
        ${:install-crypto}
        ${:install-lxml}
        
	${:envbindir}/coverage run -p ${:coverage-options} ${:envbindir}/nosetests${constants:script_py_suffix} -v -w ${:envtmpdir} ${:toxinidir}/pyhwp-tests --logging-config=${:toxinidir}/etc/testlog.conf --with-xunit --xunit-file=${:envtmpdir}/nosetests.xml
	${:envpython} ${:toxinidir}/misc/test-cli.py
	${:envpython} ${:toxinidir}/misc/prepare-hwp5-xsl-fixtures.py --fixtures-dir=${:toxinidir}/pyhwp-tests/hwp5_tests/fixtures --out-dir=${:envtmpdir}/hwp5_xsl_fixtures
	${:toxinidir}/bin/xsltest --styles-dir=${:toxinidir}/pyhwp/hwp5/xsl --import-dir=${:envtmpdir}/hwp5_xsl_fixtures --gen-dir=${:envtmpdir}/hwp5_xsl_tests ${:toxinidir}/pyhwp-tests/hwp5_xsl_tests

        echo '${:name} successful.'

name=${:_buildout_section_name_}
mkvenv=
envdir=${buildout:parts-directory}/${:name}
envbindir=${:envdir}/bin
envtmpdir=${:envdir}/tmp
envpython=${:envdir}/bin/python
toxinidir=${buildout:directory}

environment-variables=
install-lxml=
install-crypto=
coverage-options=--source=hwp5,hwp5_tests 


[tox-py25]
<=tox-shim
mkvenv=${mkvenv-CPython-2.5:output}

install-lxml=[ -e ${:lxml-built} ] && tar -C ${:site-packages} -xzf ${:lxml-built} || ${:envbindir}/pip install lxml && tar -C ${:site-packages} -czf ${:lxml-built} lxml
site-packages=${:envdir}/lib/python2.5/site-packages
lxml-built=${buildout:parts-directory}/tox-py25-lxml-built.tar.gz

install-crypto=[ -e ${:pycrypto-built} ] && tar -C ${:site-packages} -xzf ${:pycrypto-built} || ${:envbindir}/pip install pycrypo && tar -C ${:site-packages} -czf ${:pycrypto-built} Crypto
pycrypto-built=${buildout:parts-directory}/tox-py25-pycrypto-built.tar.gz

[tox-jy25]
<=tox-shim
mkvenv=${mkvenv-Jython-2.5:output}

environment-variables = export JYTHONPATH=${poi-3.9:destination}/poi-3.9-20121203.jar
                        export PIP_INSECURE=1

# WORKAROUND: 현재 jython 2.5.3, coverage 3.5.3에서 coverage run 실행 시
# --source=hwp5,hwp5_tests 옵션을 주면 이상하게도 hwp5_tests의 결과만 저장된다.
# 따라서 --source 대신 -L을 주어 모든 파일에 대해 coverage 결과를 얻은 후,
# coverage xml에서 필터링한다.
coverage-options=--source=hwp5,hwp5_tests 

[poi-3.9]
recipe = hexagonit.recipe.download
url = ${poi-bin-3.9-20121203.tar.gz:downloaded}
destination=${buildout:parts-directory}/poi-3.9
strip-top-level-dir=true

[poi-bin-3.9-20121203.tar.gz]
recipe = hexagonit.recipe.download
url = http://archive.apache.org/dist/poi/release/bin/${:filename}
md5sum = 09c4dfd63317bb9eb37fe12d6febea74
download-only = true
destination=${buildout:parts-directory}
filename=poi-bin-3.9-20121203.tar.gz 

downloaded=${:destination}/${:filename}


================================================
FILE: buildouts/translator.cfg
================================================
[buildout]
extends = user.cfg
parts+= docs-update-po
	docs-build
	docs-build-latex

[pyhwp]
eggs+= sphinx
interpreter = console

[docs-update-po]
recipe = collective.recipe.template
output = ${buildout:directory}/bin/docs-update-po
mode = 755
input=inline:
      #!/bin/sh
      
      # exit if any statement returns non-true return value
      set -e
      
      # exit on uninitialized variable
      set -u
      
      SRC_DIR=${buildout:directory}/docs
      POT_DIR=${buildout:directory}/docs/.build/gettext
      PO_BASE=${buildout:directory}/docs/translated
      
      ${buildout:directory}/bin/sphinx-build -b gettext $SRC_DIR $POT_DIR
      
      for LANG in ko en; do
      for FILE in index intro hwp5proc converters; do
      PO_FILE=$PO_BASE/$LANG/LC_MESSAGES/$FILE.po
      POT_FILE=$POT_DIR/$FILE.pot
      echo $PO_FILE
      [ -e $PO_FILE ] && msgmerge --update $PO_FILE $POT_FILE
      [ -e $PO_FILE ] || cp $POT_FILE $PO_FILE
      
      done
      done

[docs-build]
recipe = collective.recipe.template
input = ${buildout:directory}/misc/docs-build
output = ${buildout:directory}/bin/docs-build
mode = 755
input=inline:
      #!/bin/sh
      
      # exit if any statement returns non-true return value
      set -e
      
      # exit on uninitialized variable
      set -u
      
      SRC_DIR=${buildout:directory}/docs
      PO_BASE=${buildout:directory}/docs/translated
      HTML_BASE=${buildout:directory}/docs/.build/html
      BUILD_DIR=${buildout:directory}/build
      
      cd ${buildout:directory}
      
      for LANG in ko en; do
      for FILE in index intro hwp5proc converters; do
      PO_FILE=$PO_BASE/$LANG/LC_MESSAGES/$FILE.po
      MO_FILE=$PO_BASE/$LANG/LC_MESSAGES/$FILE.mo
      echo $MO_FILE
      msgfmt $PO_FILE -o $MO_FILE
      done
      OUT_DIR=$HTML_BASE/$LANG
      echo $OUT_DIR
      # sphinx does not detect changes in .mo files
      # see https://bitbucket.org/birkenfeld/sphinx/issue/830
      rm -rf $OUT_DIR
      ${buildout:directory}/bin/sphinx-build -b html -Dlanguage=$LANG $SRC_DIR $OUT_DIR
      done
      
      EN_DIR=$HTML_BASE/en
      KO_DIR=$HTML_BASE/ko
      
      mkdir -p $BUILD_DIR
      rm -rf $BUILD_DIR/docs
      
      cp -r $EN_DIR $BUILD_DIR/docs	# en becomes docs/
      cp -r $KO_DIR $BUILD_DIR/docs/	# ko becomes docs/ko

[docs-build-latex]
recipe = collective.recipe.template
output = ${buildout:bin-directory}/${:_buildout_section_name_}
mode = 755
input =
	inline:
	#!/bin/sh

	# exit if any statement returns non-true return value
	set -e

	# exit on uninitialized variable
	set -u

	SRC_DIR=${buildout:directory}/docs
	PO_BASE=${buildout:directory}/docs/translated
	LATEX_BASE=${buildout:directory}/docs/.build/latex
	DIST_DIR=${buildout:directory}/dist

	cd ${buildout:directory}

	for LANG in ko en; do
		for FILE in index intro hwp5proc converters; do
			PO_FILE=$PO_BASE/$LANG/LC_MESSAGES/$FILE.po
			MO_FILE=$PO_BASE/$LANG/LC_MESSAGES/$FILE.mo
			echo $MO_FILE
			msgfmt $PO_FILE -o $MO_FILE
		done
		OUT_DIR=$LATEX_BASE/$LANG
		echo $OUT_DIR
		# sphinx does not detect changes in .mo files
		# see https://bitbucket.org/birkenfeld/sphinx/issue/830
		rm -rf $OUT_DIR
		${buildout:directory}/bin/sphinx-build -b latex -Dlanguage=$LANG $SRC_DIR $OUT_DIR
		make -C $OUT_DIR
	done


	cp $LATEX_BASE/en/pyhwp.pdf $DIST_DIR/pyhwp.en.pdf
	cp $LATEX_BASE/ko/pyhwp.pdf $DIST_DIR/pyhwp.ko.pdf


================================================
FILE: buildouts/user.cfg
================================================
[buildout]
develop+= .
parts+= pyhwp

[pyhwp]
recipe = zc.recipe.egg
eggs = pyhwp


================================================
FILE: classifiers.txt
================================================
Development Status :: 4 - Beta
Intended Audience :: Developers
License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
Operating System :: OS Independent
Programming Language :: Python
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3.5
Programming Language :: Python :: 3.6
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
Programming Language :: Python :: Implementation :: CPython
Programming Language :: Python :: Implementation :: Jython
Programming Language :: Python :: Implementation :: PyPy
Topic :: Software Development :: Libraries :: Python Modules
Topic :: Text Processing
Topic :: Text Processing :: Filters


================================================
FILE: docs/.gitignore
================================================
_build


================================================
FILE: docs/Makefile
================================================
# Makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = ../build/docs

# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS  = -d $(BUILDDIR)/doctrees.i18n $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .

.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext intl

help:
	@echo "Please use \`make <target>' where <target> is one of"
	@echo "  html       to make standalone HTML files"
	@echo "  dirhtml    to make HTML files named index.html in directories"
	@echo "  singlehtml to make a single large HTML file"
	@echo "  pickle     to make pickle files"
	@echo "  json       to make JSON files"
	@echo "  htmlhelp   to make HTML files and a HTML help project"
	@echo "  qthelp     to make HTML files and a qthelp project"
	@echo "  applehelp  to make an Apple Help Book"
	@echo "  devhelp    to make HTML files and a Devhelp project"
	@echo "  epub       to make an epub"
	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
	@echo "  text       to make text files"
	@echo "  man        to make manual pages"
	@echo "  texinfo    to make Texinfo files"
	@echo "  info       to make Texinfo files and run them through makeinfo"
	@echo "  gettext    to make PO message catalogs"
	@echo "  changes    to make an overview of all changed/added/deprecated items"
	@echo "  xml        to make Docutils-native XML files"
	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
	@echo "  linkcheck  to check all external links for integrity"
	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
	@echo "  coverage   to run coverage check of the documentation (if enabled)"

clean:
	rm -rf $(BUILDDIR)/*

html:
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

dirhtml:
	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."

singlehtml:
	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
	@echo
	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."

pickle:
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
	@echo
	@echo "Build finished; now you can process the pickle files."

json:
	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
	@echo
	@echo "Build finished; now you can process the JSON files."

htmlhelp:
	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
	@echo
	@echo "Build finished; now you can run HTML Help Workshop with the" \
	      ".hhp project file in $(BUILDDIR)/htmlhelp."

qthelp:
	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
	@echo
	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/METE0R-PROJECT.qhcp"
	@echo "To view the help file:"
	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/METE0R-PROJECT.qhc"

applehelp:
	$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
	@echo
	@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
	@echo "N.B. You won't be able to view it unless you put it in" \
	      "~/Library/Documentation/Help or install it in your application" \
	      "bundle."

devhelp:
	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
	@echo
	@echo "Build finished."
	@echo "To view the help file:"
	@echo "# mkdir -p $$HOME/.local/share/devhelp/METE0R-PROJECT"
	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/METE0R-PROJECT"
	@echo "# devhelp"

epub:
	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
	@echo
	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."

latex:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo
	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
	@echo "Run \`make' in that directory to run these through (pdf)latex" \
	      "(use \`make latexpdf' here to do that automatically)."

latexpdf:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through pdflatex..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

latexpdfja:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through platex and dvipdfmx..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

text:
	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
	@echo
	@echo "Build finished. The text files are in $(BUILDDIR)/text."

man:
	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
	@echo
	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."

texinfo:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo
	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
	@echo "Run \`make' in that directory to run these through makeinfo" \
	      "(use \`make info' here to do that automatically)."

info:
	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
	@echo "Running Texinfo files through makeinfo..."
	make -C $(BUILDDIR)/texinfo info
	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."

gettext:
	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) locale/pot
	@echo
	@echo "Build finished. The message catalogs are in locale."

intl:
	sphinx-intl update --pot-dir locale/pot --language=en --language=ko

changes:
	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
	@echo
	@echo "The overview file is in $(BUILDDIR)/changes."

linkcheck:
	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
	@echo
	@echo "Link check complete; look for any errors in the above output " \
	      "or in $(BUILDDIR)/linkcheck/output.txt."

doctest:
	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
	@echo "Testing of doctests in the sources finished, look at the " \
	      "results in $(BUILDDIR)/doctest/output.txt."

coverage:
	$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
	@echo "Testing of coverage in the sources finished, look at the " \
	      "results in $(BUILDDIR)/coverage/python.txt."

xml:
	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
	@echo
	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."

pseudoxml:
	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
	@echo
	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."


================================================
FILE: docs/conf.py
================================================
# -*- coding: utf-8 -*-
#
# pyhwp documentation build configuration file, created by
# sphinx-quickstart on Sat Mar 10 15:30:24 2012.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.

import sys, os
import os.path

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),
                                                '..', 'src')))

# -- General configuration -----------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'

# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
  'sphinx.ext.autodoc',
  'sphinx.ext.coverage',
  'sphinxarg.ext',
]

# Add any paths that contain templates here, relative to this directory.
templates_path = ['templates']
locale_dirs = ['translated']

# The suffix of source filenames.
source_suffix = '.rst'

# The encoding of source files.
#source_encoding = 'utf-8-sig'

# The master toctree document.
master_doc = 'index'

# General information about the project.
project = u'pyhwp'
copyright = u'2012, mete0r'

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The full version, including alpha/beta/rc tags.
from hwp5 import __version__ as hwp5_release
release = hwp5_release
if release.endswith('-dirty'):
    release = release[:-len('-dirty')]

# The short X.Y version.
import re
version_match = re.match(r'([0-9]+\.[0-9]+).*', release)
if version_match:
  version = version_match.group(1)
else:
  version = 'develop'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['.build']

# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None

# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'

# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []


# -- Options for HTML output ---------------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
html_theme = 'default'

# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}

# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []

# The name for this set of Sphinx documents.  If None, it defaults to
# "<project> v<release> documentation".
#html_title = None

# A shorter title for the navigation bar.  Default is the same as html_title.
#html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None

# The name of an image file (within the static path) to use as favicon of the
# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['static']

# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}

# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}

# If false, no module index is generated.
#html_domain_indices = True

# If false, no index is generated.
#html_use_index = True

# If true, the index is split into individual pages for each letter.
#html_split_index = False

# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True

# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it.  The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''

# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None

# Output file base name for HTML help builder.
htmlhelp_basename = 'pyhwpdoc'


# -- Options for LaTeX output --------------------------------------------------

latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
'papersize': 'a4paper',

# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',

# Additional stuff for the LaTeX preamble.
'preamble': '\\usepackage{kotex}',

# Workaround for latex babel language; there are no korean support currently
# Just force it to english documentclass
# see https://bitbucket.org/birkenfeld/sphinx/src/
#     87eb42dafb5c172e085893d57224fa58e3df80e8/sphinx/writers/latex.py
#     ?at=default#cl-238
'extraclassoptions': 'english',
}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
  ('index', 'pyhwp.tex', u'pyhwp Documentation',
   u'mete0r', 'manual'),
]

# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False

# If true, show page references after internal links.
#latex_show_pagerefs = False

# If true, show URL addresses after external links.
#latex_show_urls = False

# Documents to append as an appendix to all manuals.
#latex_appendices = []

# If false, no module index is generated.
#latex_domain_indices = True


# -- Options for manual page output --------------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
    ('index', 'pyhwp', u'pyhwp Documentation',
     [u'mete0r'], 1)
]

# If true, show URL addresses after external links.
#man_show_urls = False


# -- Options for Texinfo output ------------------------------------------------

# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
#  dir menu entry, description, category)
texinfo_documents = [
  ('index', 'pyhwp', u'pyhwp Documentation',
   u'mete0r', 'pyhwp', 'One line description of project.',
   'Miscellaneous'),
]

# Documents to append as an appendix to all manuals.
#texinfo_appendices = []

# If false, no module index is generated.
#texinfo_domain_indices = True

# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'


================================================
FILE: docs/converters.rst
================================================
Converters (*Experimental*)
===========================

Convert HWPv5 documents into other document formats.

Requirements
------------
The conversions are performed with `XSLT <http://www.w3.org/TR/xslt>`_
internally and verified with `Relax NG <http://relaxng.org/>`_ if possible.

For these processing, the converters requires
`lxml <http://pypi.python.org/pypi/lxml>`_ (`homepage <http://lxml.de>`_) or
`libxml2 <http://www.xmlsoft.org/>`_'s
`xsltproc <http://xmlsoft.org/XSLT/xsltproc2.html>`_ /
`xmllint <http://infohost.nmt.edu/tcc/help/xml/lint.html>`_ programs.

For lxml installation::

   pip install --user lxml # install to user directory
   pip install lxml        # install with virtualenv

or see `Installing lxml <http://lxml.de/installation.html>`_.

(Currently conversions with lxml 2.3.5 is tested and verified to be working.
lxml versions below that may work too, but those are not tested.)

For ``xsltproc`` / ``xmllint`` installation::

   sudo apt-get install xsltproc libxml2-utils  # Debian/Ubuntu

Optional environment variables ``PYHWP_XSLTPROC`` and ``PYHWP_XMLLINT``
specifies the paths of the each programs. (If not set, ``xsltproc`` and/or
``xmllint`` should be in the one of the directories specified in ``PATH``.)

``hwp5odt``: ODT conversion
---------------------------

.. argparse::
   :module: hwp5.hwp5odt
   :func: main_argparser
   :prog: hwp5odt

``hwp5html``: HTML conversion
-----------------------------

.. argparse::
   :module: hwp5.hwp5html
   :func: main_argparser
   :prog: hwp5html

``hwp5txt``: text conversion
----------------------------

.. argparse::
   :module: hwp5.hwp5txt
   :func: main_argparser
   :prog: hwp5txt


================================================
FILE: docs/hacking/directory-layout/bin.rst
================================================
``bin/`` - Buildout generated scripts
-------------------------------------

This directory will be populated with scripts generated from the ``pyhwp``
package and the various development helper packages/scripts.

``pyhwp`` generate following scripts:

:program:`hwp5proc`
   HWP format version 5 files processor. See :doc:`../hwp5proc`.
:program:`hwp5odt`, :program:`hwp5txt`, :program:`hwp5html`
   Experimental converters. See :doc:`../converters`.

Development helper scripts (incomplete):

:program:`buildout`
   (Re)generate the development environment.
:program:`test-core`
   Run a quick unit test.


================================================
FILE: docs/hacking/directory-layout/root.rst
================================================
``/`` - project root directory
------------------------------

The project root directory contains project configuration files.

:file:`buildout.cfg`
   `buildout <http://www.buildout.org>`_ configuration file.

:file:`setup.py`, :file:`setup.cfg`
   ``pyhwp`` setup files.

:file:`tox.ini`
   `tox <http://tox.testrun.org>`_ configuration file. This file will be
   automatically generated from :file:`tox.ini.in` by :program:`bin/buildout`.
   See ``[tox]`` parts in :file:`buildout.cfg`.

:file:`tox.ini.in`
   tox_ configuration template file.  If you want to modify tox_ configuration,
   edit this file and run :program:`bin/buildout` again.


================================================
FILE: docs/hacking/directory-layout.rst
================================================
================
Directory Layout
================

::

   pyhwp                   Project Root
     |
     +-- pyhwp/            Source packages root
     |     |
     |     +-- hwp5/       Source package
     |
     +-- pyhwp-tests/      Test packages root
     |     |
     |     +-- hwp5_tests/ Test package
     |
     +-- docs/             Documentations, i.e. this document!
     |
     +-- bin/              hwp5proc, hwp5odt, build/testing scripts, etc.,
     |
     +-- etc/              development configuration files
     |
     +-- misc/             development configuration templates / helper scripts
     |
     +-- tools/            development helper packages
     |
     .
     . (various directories)
     .

After the initial :ref:`invocation of buildout <invoke-buildout>` completes
successfully, your directory will have a few more new generated directories,
e.g. :file:`bin/`, :file:`develop-eggs/`. These are the standard buildout
directories, which we will not cover the every details of them here. For general
information, see `Directory Structure of a Buildout
<http://www.buildout.org/docs/dirstruct.html>`_.

Followings are ``pyhwp`` specific informations:

.. include:: directory-layout/root.rst

.. include:: directory-layout/bin.rst

.. include:: directory-layout/pyhwp.rst

.. include:: directory-layout/pyhwp-tests.rst

.. include:: directory-layout/tools.rst


================================================
FILE: docs/hacking/hack-n-test.rst
================================================
===========
Hack & Test
===========

If you modify some modules in ``hwp5`` package in the ``pyhwp/`` directory, you
can test the modification with the ``hwp5proc`` script in the ``bin/``
directory.

You can test the ``hwp5`` package by executing ``bin/test-core``, but it's just
a quick test and not a complete test suite.  If you want to run a full-blown
test suite, run ``tox``, which tries to test ``pyhwp`` in various
`virtualenv <http://pypi.python.org/pypi/virtualenv>`_-isolated python
platforms, including Python 2.5, 2.6, 2.7, Jython 2.5 and PyPy.

::

   $ bin/buildout

   (...)

   $ vim pyhwp/hwp5/proc/__init__.py

   (HACK HACK HACK)

   $ bin/test-core

   $ bin/hwp5proc ...

   $ bin/tox


================================================
FILE: docs/hacking/index.rst
================================================
Hacking Guide
=============

Standard procedures to hacking on ``pyhwp``.

Contents:

.. toctree::
   :maxdepth: 2

   setup-env
   directory-layout
   hack-n-test


================================================
FILE: docs/hacking/setup-env.rst
================================================
=============================
Setup development environment
=============================

1. Install prerequisites
------------------------

* CPython 2.7
* `virtualenv`
* GNU `Make`


2. Clone the source repository
------------------------------

::

   $ git clone https://github.com/mete0r/pyhwp.git

3. Initialize the environment
------------------------------

Bootstrap development environment::

   $ make bootstrap
   $ . bin/activate

4. Check basic stuffs
---------------------

Run `hwp5proc`::

   $ hwp5proc --help

To run tests::

   $ tox


================================================
FILE: docs/hwp5.rst
================================================
package hwp5
************

module :mod:`hwp5.filestructure`
================================
.. automodule:: hwp5.filestructure
   :members:

module :mod:`hwp5.recordstream`
===============================
.. automodule:: hwp5.recordstream
   :members:

module :mod:`hwp5.binmodel`
===========================
.. automodule:: hwp5.binmodel
   :members:

module :mod:`hwp5.xmlmodel`
===========================
.. automodule:: hwp5.xmlmodel
   :members:

module :mod:`hwp5.xmlformat`
============================
.. automodule:: hwp5.xmlformat
   :members:

module :mod:`hwp5.storage`
==========================
.. automodule:: hwp5.storage
   :members:

module :mod:`hwp5.dataio`
=========================
.. automodule:: hwp5.dataio
   :members:

module :mod:`hwp5.tagids`
=========================
.. automodule:: hwp5.tagids
   :members:

module :mod:`hwp5.plat`
===========================
.. automodule:: hwp5.plat
   :members:

module :mod:`hwp5.importhelper`
===============================
.. automodule:: hwp5.importhelper
   :members:

module :mod:`hwp5.treeop`
=========================
.. automodule:: hwp5.treeop
   :members:

module :mod:`hwp5.utils`
=========================
.. automodule:: hwp5.utils
   :members:


================================================
FILE: docs/hwp5proc.rst
================================================
``hwp5proc``: HWPv5 processor
=============================

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :nosubcommands:

Subcommands
===========

version
-------

Print the file format version of .hwp files.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: version


header
------

Print file headers of .hwp files.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: header


summaryinfo
-----------

Print summary informations of .hwp files.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: summaryinfo


ls
--
List streams in .hwp files.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: ls


cat
---

Extract out internal streams of .hwp files

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: cat

Example::

    $ hwp5proc cat samples/sample-5017.hwp BinData/BIN0002.jpg | file -

    $ hwp5proc cat samples/sample-5017.hwp BinData/BIN0002.jpg > BIN0002.jpg

    $ hwp5proc cat samples/sample-5017.hwp PrvText | iconv -f utf-16le -t utf-8

    $ hwp5proc cat --vstreams samples/sample-5017.hwp PrvText.utf8

    $ hwp5proc cat --vstreams samples/sample-5017.hwp FileHeader.txt

    ccl: 0
    cert_drm: 0
    cert_encrypted: 0
    cert_signature_extra: 0
    cert_signed: 0
    compressed: 1
    distributable: 0
    drm: 0
    history: 0
    password: 0
    script: 0
    signature: HWP Document File
    version: 5.0.1.7
    xmltemplate_storage: 0

unpack
------

Extract out internal streams of .hwp files into a directory.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: unpack

Example::

    $ hwp5proc unpack samples/sample-5017.hwp
    $ ls sample-5017

Example::

    $ hwp5proc unpack --vstreams samples/sample-5017.hwp
    $ cat sample-5017/PrvText.utf8

records
-------

Print the record structure of .hwp file record streams.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: records

Example::

    $ hwp5proc records samples/sample-5017.hwp DocInfo

Example::

    $ hwp5proc records samples/sample-5017.hwp DocInfo --range=0-2

If neither <hwp5file> nor <record-stream> is specified, the record stream is
read from the standard input with an assumption that the input is in the format
version specified by -V option.

Example::

    $ hwp5proc records --raw samples/sample-5017.hwp DocInfo --range=0-2 > tmp.rec
    $ hwp5proc records < tmp.rec

models
-------

Print parsed binary models of .hwp file record streams.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: models

Example::

    $ hwp5proc models samples/sample-5017.hwp DocInfo
    $ hwp5proc models samples/sample-5017.hwp BodyText/Section0

    $ hwp5proc models samples/sample-5017.hwp docinfo
    $ hwp5proc models samples/sample-5017.hwp bodytext/0

Example::

    $ hwp5proc models --simple samples/sample-5017.hwp bodytext/0
    $ hwp5proc models --format='%(level)s %(tagname)s\\n' \\
            samples/sample-5017.hwp bodytext/0

Example::

    $ hwp5proc models --simple --treegroup=1 samples/sample-5017.hwp bodytext/0
    $ hwp5proc models --simple --seqno=4 samples/sample-5017.hwp bodytext/0

If neither <hwp5file> nor <record-stream> is specified, the record stream is
read from the standard input with an assumption that the input is in the format
version specified by -V option.

Example::

    $ hwp5proc cat samples/sample-5017.hwp BodyText/Section0 > Section0.bin
    $ hwp5proc models -V 5.0.1.7 < Section0.bin

find
----

Find record models with specified predicates.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: find

Example: Find paragraphs::

    $ hwp5proc find --model=Paragraph samples/*.hwp
    $ hwp5proc find --tag=HWPTAG_PARA_TEXT samples/*.hwp
    $ hwp5proc find --tag=66 samples/*.hwp

Example: Find and dump records of ``HWPTAG_LIST_HEADER`` which is parsed
incompletely::

    $ hwp5proc find --tag=HWPTAG_LIST_HEADER --incomplete --dump samples/*.hwp

xml
---

Transform .hwp files into an XML.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: xml

Example::

    $ hwp5proc xml samples/sample-5017.hwp > sample-5017.xml
    $ xmllint --format sample-5017.xml

With ``--embedbin`` option, you can embed base64-encoded ``BinData/*`` files in
the output XML.

Example::

    $ hwp5proc xml --embedbin samples/sample-5017.hwp > sample-5017.xml
    $ xmllint --format sample-5017.xml

rawunz
------

Deflate an headerless zlib-compressed stream.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: rawunz

diststream
----------

Decode a distribute document stream.

.. argparse::
   :module: hwp5.hwp5proc
   :func: main_argparser
   :prog: hwp5proc
   :path: diststream


================================================
FILE: docs/index.rst
================================================
.. pyhwp documentation master file, created by
   sphinx-quickstart on Sat Mar 10 15:30:24 2012.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Welcome to pyhwp's documentation!
=================================

Contents:

.. toctree::
   :maxdepth: 2

   intro
   hwp5proc
   converters
   hacking/index
   changes



Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`



================================================
FILE: docs/static/.gitignore
================================================


================================================
FILE: docs/templates/.gitignore
================================================


================================================
FILE: docs/translated/en/LC_MESSAGES/converters.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, mete0r
# This file is distributed under the same license as the pyhwp package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pyhwp 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-29 04:47\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# eafb3e22bc3740cb9f41f4f2df9e7800
#: ../../converters.rst:2
msgid "Converters (*Experimental*)"
msgstr ""

# 6b4bc6aa159144d4bb3a51e48e5909da
#: ../../converters.rst:4
msgid "Convert HWPv5 documents into other document formats."
msgstr ""

# 5d38e3678e074ca2b766734ae5247217
#: ../../converters.rst:7
msgid "Requirements"
msgstr ""

# 67f8cb2c410f45559ea36edddc5f3bd6
#: ../../converters.rst:8
msgid ""
"The conversions are performed with `XSLT <http://www.w3.org/TR/xslt>`_ "
"internally and verified with `Relax NG <http://relaxng.org/>`_ if possible."
msgstr ""

# 45e757bc017d449a95192776960d8b5d
#: ../../converters.rst:11
msgid ""
"For these processing, the converters requires `lxml <http://pypi.python.org/"
"pypi/lxml>`_ (`homepage <http://lxml.de>`_) or `libxml2 <http://www.xmlsoft."
"org/>`_'s `xsltproc <http://xmlsoft.org/XSLT/xsltproc2.html>`_ / `xmllint "
"<http://infohost.nmt.edu/tcc/help/xml/lint.html>`_ programs."
msgstr ""

# 4bbc12c733e64021b1e57753c362e03f
#: ../../converters.rst:17
msgid "For lxml installation::"
msgstr ""

# 87c456830c3f40b0b0922d11b45e7f7a
#: ../../converters.rst:22
msgid "or see `Installing lxml <http://lxml.de/installation.html>`_."
msgstr ""

# 279b07aa798c48238be60111a825bd7a
#: ../../converters.rst:24
msgid ""
"(Currently conversions with lxml 2.3.5 is tested and verified to be working. "
"lxml versions below that may work too, but those are not tested.)"
msgstr ""

# 173347f476564817bd87068b394dbd6a
#: ../../converters.rst:27
msgid "For ``xsltproc`` / ``xmllint`` installation::"
msgstr ""

# 50fa23c1a25a4330bab200b3d4c5d753
#: ../../converters.rst:31
msgid ""
"Optional environment variables ``PYHWP_XSLTPROC`` and ``PYHWP_XMLLINT`` "
"specifies the paths of the each programs. (If not set, ``xsltproc`` and/or "
"``xmllint`` should be in the one of the directories specified in ``PATH``.)"
msgstr ""

# bc95c4ff391e4201a6ed44a1d0d56e5e
#: ../../converters.rst:36
msgid "``hwp5odt``: ODT conversion"
msgstr ""

# c4f68ae4a1294abfb389633cdbfbd335
#: ../../../pyhwp/hwp5/hwp5odt.py:docstring of hwp5.hwp5odt:1
msgid "HWPv5 to ODT converter"
msgstr ""

# 3de42de0b2fe408280df0c1236fad4e0
# 6d65211ee5dc4aae9509848ed33ad453
# db61f8ccd1b24c80b24fc45cef56d189
#: ../../../pyhwp/hwp5/hwp5odt.py:docstring of hwp5.hwp5odt:3
#: ../../../pyhwp/hwp5/hwp5html.py:docstring hwp5.hwp5html:3
#: ../../../pyhwp/hwp5/hwp5txt.py:docstring hwp5.hwp5txt:3
msgid "Usage::"
msgstr ""

# 8e52e64968d9457da967a7f1b5826470
# b650b764f0bc40d68cf0b3cff9bec9fc
# ea68666462574d1da0411b50c9aaa33b
#: ../../../pyhwp/hwp5/hwp5odt.py:docstring of hwp5.hwp5odt:12
#: ../../../pyhwp/hwp5/hwp5html.py:docstring hwp5.hwp5html:9
#: ../../../pyhwp/hwp5/hwp5txt.py:docstring hwp5.hwp5txt:9
msgid "Options::"
msgstr ""

# 41a0562c7de84f6087262873b7090b36
#: ../../converters.rst:40
msgid "``hwp5html``: HTML conversion"
msgstr ""

# 7aa5783ccbe141a4b84397507548a5fb
#: ../../../pyhwp/hwp5/hwp5html.py:docstring of hwp5.hwp5html:1
msgid "HWPv5 to HTML converter"
msgstr ""

# c0616df18e5148faa66eeeecbe6920d3
#: ../../converters.rst:44
msgid "``hwp5txt``: text conversion"
msgstr ""

# 991947c6361e4eb3b2cf1ed6cfd4c15b
#: ../../../pyhwp/hwp5/hwp5txt.py:docstring of hwp5.hwp5txt:1
msgid "HWPv5 to text converter"
msgstr ""


================================================
FILE: docs/translated/en/LC_MESSAGES/hwp5proc.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, mete0r
# This file is distributed under the same license as the pyhwp package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pyhwp 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-03 12:05+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# 8ae66890d3c34537b90c78f06ac868ef
#: ../../hwp5proc.rst:2
msgid "``hwp5proc``: HWPv5 processor"
msgstr ""

# bed00d76e0724575a465d3780b90d7fd
#: ../../../pyhwp/hwp5/proc/__init__.py:docstring of hwp5.proc:1
msgid "Do various operations on HWPv5 files."
msgstr ""

# cf8a544eee554bbcb012724d966509dc
#: ../../../pyhwp/hwp5/proc/__init__.py:docstring of hwp5.proc:3
#: ../../../pyhwp/hwp5/proc/version.py:docstring hwp5.proc.version:3
#: ../../../pyhwp/hwp5/proc/header.py:docstring hwp5.proc.header:3
#: ../../../pyhwp/hwp5/proc/summaryinfo.py:docstring hwp5.proc.summaryinfo:3
#: ../../../pyhwp/hwp5/proc/ls.py:docstring hwp5.proc.ls:3
#: ../../../pyhwp/hwp5/proc/cat.py:docstring hwp5.proc.cat:3
#: ../../../pyhwp/hwp5/proc/unpack.py:docstring hwp5.proc.unpack:3
#: ../../../pyhwp/hwp5/proc/records.py:docstring hwp5.proc.records:3
#: ../../../pyhwp/hwp5/proc/models.py:docstring hwp5.proc.models:3
#: ../../../pyhwp/hwp5/proc/find.py:docstring hwp5.proc.find:3
#: ../../../pyhwp/hwp5/proc/xml.py:docstring hwp5.proc.xml:8
msgid "Usage::"
msgstr ""

# 3d0680517061451580552a8980218e48
#: ../../hwp5proc.rst:7
msgid "command: ``version``"
msgstr ""

# cad75aaf5f6a42ae8910807b46c6a1ef
#: ../../../pyhwp/hwp5/proc/version.py:docstring of hwp5.proc.version:1
msgid "Print HWP file format version of <hwp5file>."
msgstr ""

# 71d2980c664e45d397af9734a5494c43
#: ../../../pyhwp/hwp5/proc/version.py:docstring of hwp5.proc.version:8
#: ../../../pyhwp/hwp5/proc/header.py:docstring hwp5.proc.header:8
#: ../../../pyhwp/hwp5/proc/summaryinfo.py:docstring hwp5.proc.summaryinfo:8
#: ../../../pyhwp/hwp5/proc/ls.py:docstring hwp5.proc.ls:10
#: ../../../pyhwp/hwp5/proc/cat.py:docstring hwp5.proc.cat:10
#: ../../../pyhwp/hwp5/proc/unpack.py:docstring hwp5.proc.unpack:10
#: ../../../pyhwp/hwp5/proc/records.py:docstring hwp5.proc.records:14
#: ../../../pyhwp/hwp5/proc/models.py:docstring hwp5.proc.models:11
#: ../../../pyhwp/hwp5/proc/find.py:docstring hwp5.proc.find:11
#: ../../../pyhwp/hwp5/proc/xml.py:docstring hwp5.proc.xml:18
msgid "Options::"
msgstr ""

# 4c8936ae2aab43778971aa79502a721e
#: ../../hwp5proc.rst:12
msgid "command: ``header``"
msgstr ""

# cad75aaf5f6a42ae8910807b46c6a1ef
#: ../../../pyhwp/hwp5/proc/header.py:docstring of hwp5.proc.header:1
msgid "Print HWP file header."
msgstr ""

# 5d77d4ca0f394422b709faccc50cfec9
#: ../../hwp5proc.rst:17
msgid "command: ``summaryinfo``"
msgstr ""

# f8011d33ac684c2b8378e18b9e3abedc
#: ../../../pyhwp/hwp5/proc/summaryinfo.py:docstring of
#: hwp5.proc.summaryinfo:1
msgid "Print summary information of <hwp5file>."
msgstr ""

# b7b04b5b3eb74f0eb111194985e01b0d
#: ../../hwp5proc.rst:22
msgid "command: ``ls``"
msgstr ""

# b44ddef0cd314f458485388b49c636ca
#: ../../../pyhwp/hwp5/proc/ls.py:docstring of hwp5.proc.ls:1
msgid "List streams in the <hwp5file>."
msgstr ""

# 43a9eab8ec344cfdb4a33aa848da2a56
#: ../../../pyhwp/hwp5/proc/ls.py:docstring of hwp5.proc.ls:22
msgid "Example: List without virtual streams::"
msgstr ""

# ecd90dc2d4094b3c8052a495648ff78f
#: ../../../pyhwp/hwp5/proc/ls.py:docstring of hwp5.proc.ls:39
msgid "Example: List virtual streams too::"
msgstr ""

# 192f6f50cb544c27ad3479b914ef7222
#: ../../hwp5proc.rst:27
msgid "command: ``cat``"
msgstr ""

# 15eb8617d1d944949717d81ebb9456f1
#: ../../../pyhwp/hwp5/proc/cat.py:docstring of hwp5.proc.cat:1
msgid ""
"Extract out the specified stream in the <hwp5file> to the standard output."
msgstr ""

# dcb71948aa8f47e9b064023f21957a35
# 71ecad71cb0f4fe9ba80cf55082e5f8a
# ef37227f045746b8997f0c2eb30319cd
# 737e619d6b524f69af7005f5ef92ada8
# 07ef11c376cb4d308967be19edcc2881
# 3ae85a74884d4ad9b5c6a8e89747e224
# 6f312dd686584fa4a9dff6f49bbc56b4
# 35fb8b185a6a48dabea56e256d85bfb4
# 4fd7a028c7ff4c11b87ba598655a7907
# 170f201e5a0c4a44abcb0dcea95905d9
# 8329c429e5674eee8022ec39cceed432
# cbf2341d2c7c4149bdc3f07da885e0ae
#: ../../../pyhwp/hwp5/proc/cat.py:docstring of hwp5.proc.cat:22
#: ../../../pyhwp/hwp5/proc/unpack.py:docstring hwp5.proc.unpack:22
#: hwp5.proc.unpack:27 ../../../pyhwp/hwp5/proc/records.py:docstring
#: hwp5.proc.records:38 hwp5.proc.records:42 hwp5.proc.records:50
#: ../../../pyhwp/hwp5/proc/models.py:docstring hwp5.proc.models:34
#: hwp5.proc.models:42 hwp5.proc.models:48 hwp5.proc.models:57
#: ../../../pyhwp/hwp5/proc/xml.py:docstring hwp5.proc.xml:31 hwp5.proc.xml:39
msgid "Example::"
msgstr ""

# 8113891b61bb4b339c77d078336391f4
#: ../../hwp5proc.rst:32
msgid "command: ``unpack``"
msgstr ""

# 8acb7c74c7c748c6b7874f5e33b25dac
#: ../../../pyhwp/hwp5/proc/unpack.py:docstring of hwp5.proc.unpack:1
msgid "Extract out streams in the specified <hwp5file> to a directory."
msgstr ""

# 414f684ce5a540d0a5cd18ab8b2a5f24
#: ../../hwp5proc.rst:37
msgid "command: ``records``"
msgstr ""

# f521cdaf60f4451b88faab8a6235b5a4
#: ../../../pyhwp/hwp5/proc/records.py:docstring of hwp5.proc.records:1
msgid "Print the record structure."
msgstr ""

# 241ea6ff890d49db8d765402e0c7b6b5
# 2a49fc3eff194012a083bf9bc0426d93
#: ../../../pyhwp/hwp5/proc/records.py:docstring of hwp5.proc.records:46
#: ../../../pyhwp/hwp5/proc/models.py:docstring hwp5.proc.models:53
msgid ""
"If neither <hwp5file> nor <record-stream> is specified, the record stream is "
"read from the standard input with an assumption that the input is in the "
"format version specified by -V option."
msgstr ""

# a7dfeeb3a6464db18f930dc3747acc77
#: ../../hwp5proc.rst:42
msgid "command: ``models``"
msgstr ""

# 058aa45f4ec8463080526f955a7ff2fd
#: ../../../pyhwp/hwp5/proc/models.py:docstring of hwp5.proc.models:1
msgid "Print parsed binary models in the specified <record-stream>."
msgstr ""

# 7375606379a84a7688a05b9939f6b47d
#: ../../hwp5proc.rst:47
msgid "command: ``find``"
msgstr ""

# 8cdcfec208464d1a9dbafb8d0489fe4b
#: ../../../pyhwp/hwp5/proc/find.py:docstring of hwp5.proc.find:1
msgid "Find record models with specified predicates."
msgstr ""

# 78f39cd8bb2c46a89417b59931917868
#: ../../../pyhwp/hwp5/proc/find.py:docstring of hwp5.proc.find:29
msgid "Example: Find paragraphs::"
msgstr ""

# 9e23e53b35ca4aefb5e8c1ffa99d3d26
#: ../../../pyhwp/hwp5/proc/find.py:docstring of hwp5.proc.find:35
msgid ""
"Example: Find and dump records of ``HWPTAG_LIST_HEADER`` which is parsed "
"incompletely::"
msgstr ""

# 7778883e65f849bf99fad8697e25308d
#: ../../hwp5proc.rst:52
msgid "command: ``xml`` (*Experimental*)"
msgstr ""

# b8814a65f0fe49e78ffc380bfa9ce629
#: ../../../pyhwp/hwp5/proc/xml.py:docstring of hwp5.proc.xml:1
msgid "Transform an HWPv5 file into an XML."
msgstr ""

# 412afcfa0f324982801d3cfacaf69b86
#: ../../../pyhwp/hwp5/proc/xml.py:docstring of hwp5.proc.xml:5
msgid ""
"This command is experimental. Its output format is subject to change at any "
"time."
msgstr ""

# d89687875f5d4135963346b8e2de3a53
#: ../../../pyhwp/hwp5/proc/xml.py:docstring of hwp5.proc.xml:36
msgid ""
"With ``--embedbin`` option, you can embed base64-encoded ``BinData/*`` files "
"in the output XML."
msgstr ""


================================================
FILE: docs/translated/en/LC_MESSAGES/index.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, mete0r
# This file is distributed under the same license as the pyhwp package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pyhwp 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-29 04:47\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# e67bfb841934418fb9aa8d6803ae6f61
#: ../../index.rst:7
msgid "Welcome to pyhwp's documentation!"
msgstr ""

# fce4f4f87ace4bd79507f35f9f31fc09
#: ../../index.rst:9
msgid "Contents:"
msgstr ""

# c7b2c8ef52e84e3294e7003ff9087ee0
#: ../../index.rst:23
msgid "Indices and tables"
msgstr ""

# 8caf5884bb214dacaf993c38e939ca98
#: ../../index.rst:25
msgid ":ref:`genindex`"
msgstr ""

# 7d2787c7551040dd8500264c58449cc9
#: ../../index.rst:26
msgid ":ref:`modindex`"
msgstr ""

# a3f0175d485c4314b9d7204608644b95
#: ../../index.rst:27
msgid ":ref:`search`"
msgstr ""


================================================
FILE: docs/translated/en/LC_MESSAGES/intro.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, mete0r
# This file is distributed under the same license as the pyhwp package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pyhwp 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-31 08:31+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# 229d7f6cb6e94b80b3ed276154632ea7
#: ../../intro.rst:2
msgid "pyhwp"
msgstr ""

# 75c5f1d6ce704cfb987f218ddac8e5c9
#: ../../intro.rst:4
msgid "HWP Document Format v5 parser & processor."
msgstr ""

# bdea2ae9aea14b619ceab66b9f6d685c
#: ../../intro.rst:7
msgid "Features"
msgstr ""

# 6b057a4ced754848bd138b559238556f
#: ../../intro.rst:9
msgid ""
"Analyze and extract internal streams out from a HWP Document Format v5 file"
msgstr ""

# a68f3e9e704d45dda4278f0efaf64d8a
#: ../../intro.rst:10
msgid ""
"(*Experimental*) Conversion to OpenDocument format (.odt) or plain text (."
"txt)"
msgstr ""

# ea5a3a8d49cc413eb9ef1fa6f58633ff
#: ../../intro.rst:13
msgid "Installation"
msgstr ""

# 0d7548139cea4b37bb2298584800bffc
#: ../../intro.rst:15
msgid "from `pypi <http://pypi.python.org/pypi/pyhwp>`_::"
msgstr ""

# 33cd4af4dc6f496bbea8284505308c83
#: ../../intro.rst:20
msgid "Or::"
msgstr ""

# da4c2f33f39048e9a72ad43807cd7e37
#: ../../intro.rst:25
msgid "Requirements"
msgstr ""

# db6d63914fb2413d92e5701b694e2b22
#: ../../intro.rst:27
msgid "CPython 2.5, 2.6, 2.7, Jython 2.5.3 or PyPy 2.0.2"
msgstr ""

# 62d6fe10634a497f8d1ced5bbc8343f7
#: ../../intro.rst:28
msgid "`setuptools <http://pypi.python.org/pypi/setuptools>`_"
msgstr ""

# 2cab7c2a85d34ff7adc294b7e48d5575
#: ../../intro.rst:29
msgid ""
"`pycrypto <https://pypi.python.org/pypi/pycrypto>`_ (optional, to decode "
"distribution docs)"
msgstr ""

# 070821d20ddc4c6cb15fa70632bf6523
#: ../../intro.rst:32
msgid "Documentation & Development"
msgstr ""

# f1aaad2952f54b7b9649f8a60173486c
#: ../../intro.rst:34
msgid ""
"Documentation: `http://pythonhosted.org/pyhwp/ <http://pythonhosted.org/"
"pyhwp/>`_ [`한국/조선어 <http://pythonhosted.org/pyhwp/ko/>`_] [`develop "
"branch <http://pyhwp.readthedocs.org>`_]"
msgstr ""

# 85285a15a8574742b5e7e57d5ce9c7bb
#: ../../intro.rst:35
msgid ""
"Distribution: `http://pypi.python.org/pypi/pyhwp <http://pypi.python.org/"
"pypi/pyhwp>`_"
msgstr ""

# e638ce10db3e4e07ae412b24bf350d53
#: ../../intro.rst:36
msgid ""
"Development: `https://github.com/mete0r/pyhwp <https://github.com/mete0r/"
"pyhwp>`_"
msgstr ""

# f0f93a1ed81747dc9c7a3c631b971e86
#: ../../intro.rst:37
msgid ""
"Issue tracker: `https://github.com/mete0r/pyhwp/issues <https://github.com/"
"mete0r/pyhwp/issues>`_"
msgstr ""

# 317c633c180a4bda8045e2a5b1e757cf
#: ../../intro.rst:38
msgid "Feedbacks & contributions are welcome!"
msgstr ""

# b200736b60a04a8480b72cb24a513db0
#: ../../intro.rst:41
msgid "Contributors"
msgstr ""

# 242f97c427344df39bad7d586d5e60c0
#: ../../intro.rst:43
msgid "Maintainer: `mete0r <https://github.com/mete0r>`_"
msgstr ""

# 3968cb8206a14f398a248eed814ad9aa
#: ../../intro.rst:46
msgid "License"
msgstr ""

# d64dabb371984d2ba250f37e220aa39a
#: ../../intro.rst:48
msgid "Copyright (C) 2010-2023 mete0r <https://github.com/mete0r>"
msgstr ""

# 32ed7d69ae9f4bf5bff4e8d68c113f4c
#: ../../intro.rst:52
msgid ""
"`GNU Affero General Public License v3.0 <http://www.gnu.org/licenses/"
"agpl-3.0.html>`_ `(text version) <http://www.gnu.org/licenses/agpl-3.0.txt>`_"
msgstr ""

# 164415d866774a9e9e7ad1008447cf74
#: ../../intro.rst:55
msgid ""
"This program is free software: you can redistribute it and/or modify it "
"under the terms of the GNU Affero General Public License as published by the "
"Free Software Foundation, either version 3 of the License, or (at your "
"option) any later version."
msgstr ""

# 6cc8ef94865e4196898a83b1b80dd2e5
#: ../../intro.rst:60
msgid ""
"This program is distributed in the hope that it will be useful, but WITHOUT "
"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
"FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License "
"for more details."
msgstr ""

# d54697f2f7dc44869d43637b7e5dcb68
#: ../../intro.rst:65
msgid ""
"You should have received a copy of the GNU Affero General Public License "
"along with this program.  If not, see <http://www.gnu.org/licenses/>."
msgstr ""

# c3270c668ef7418e951ef0bc8ac17fdd
#: ../../intro.rst:69
msgid "Disclosure"
msgstr ""

# df57575778df4329940de5a8a2999e73
#: ../../intro.rst:71
msgid ""
"This program has been developed in accordance with a public document named "
"\"HWP Binary Specification 1.1\" published by `Hancom Inc. <http://www."
"hancom.co.kr>`_"
msgstr ""


================================================
FILE: docs/translated/ko/LC_MESSAGES/converters.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, mete0r
# This file is distributed under the same license as the pyhwp package.
# mete0r <EMAIL@ADDRESS>, 2012.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pyhwp 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-29 04:47\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: mete0r <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# eafb3e22bc3740cb9f41f4f2df9e7800
#: ../../converters.rst:2
msgid "Converters (*Experimental*)"
msgstr "변환기들 (*실험적*)"

# 6b4bc6aa159144d4bb3a51e48e5909da
#: ../../converters.rst:4
msgid "Convert HWPv5 documents into other document formats."
msgstr "HWPv5 문서를 다른 문서 형식으로 변환한다."

# 5d38e3678e074ca2b766734ae5247217
#: ../../converters.rst:7
msgid "Requirements"
msgstr "필요한 것"

# 67f8cb2c410f45559ea36edddc5f3bd6
#: ../../converters.rst:8
msgid ""
"The conversions are performed with `XSLT <http://www.w3.org/TR/xslt>`_ "
"internally and verified with `Relax NG <http://relaxng.org/>`_ if possible."
msgstr ""
"이 변환들은 내부적으로 `XSLT <http://www.w3.org/TR/xslt>`_ 를 사용하며, 가능"
"한 경우 `Relax NG <http://relaxng.org/>`_ 로 결과물이 검증된다."

# 45e757bc017d449a95192776960d8b5d
#: ../../converters.rst:11
msgid ""
"For these processing, the converters requires `lxml <http://pypi.python.org/"
"pypi/lxml>`_ (`homepage <http://lxml.de>`_) or `libxml2 <http://www.xmlsoft."
"org/>`_'s `xsltproc <http://xmlsoft.org/XSLT/xsltproc2.html>`_ / `xmllint "
"<http://infohost.nmt.edu/tcc/help/xml/lint.html>`_ programs."
msgstr ""
"이를 수행하려면 `lxml <http://pypi.python.org/pypi/lxml>`_ (`homepage "
"<http://lxml.de>`_)이나 `libxml2 <http://www.xmlsoft.org/>`_ 의 `xsltproc "
"<http://xmlsoft.org/XSLT/xsltproc2.html>`_ / `xmllint <http://infohost.nmt."
"edu/tcc/help/xml/lint.html>`_ 프로그램이 필요하다."

# 4bbc12c733e64021b1e57753c362e03f
#: ../../converters.rst:17
msgid "For lxml installation::"
msgstr "lxml를 설치하려면::"

# 87c456830c3f40b0b0922d11b45e7f7a
#: ../../converters.rst:22
msgid "or see `Installing lxml <http://lxml.de/installation.html>`_."
msgstr ""
"혹은 `Installing lxml <http://lxml.de/installation.html>`_ 을 참조하라."

# 279b07aa798c48238be60111a825bd7a
#: ../../converters.rst:24
msgid ""
"(Currently conversions with lxml 2.3.5 is tested and verified to be working. "
"lxml versions below that may work too, but those are not tested.)"
msgstr ""
"(현재 lxml 2.3.5 을 이용한 변환은 테스트되었고 잘 작동하는 것으로 확인되었"
"다. 그보다 낮은 버전의 lxml으로도 될 수 있으나, 테스트되지는 않았다.)"

# 173347f476564817bd87068b394dbd6a
#: ../../converters.rst:27
msgid "For ``xsltproc`` / ``xmllint`` installation::"
msgstr "``xsltproc`` / ``xmllint`` 를 설치하려면::"

# 50fa23c1a25a4330bab200b3d4c5d753
#: ../../converters.rst:31
msgid ""
"Optional environment variables ``PYHWP_XSLTPROC`` and ``PYHWP_XMLLINT`` "
"specifies the paths of the each programs. (If not set, ``xsltproc`` and/or "
"``xmllint`` should be in the one of the directories specified in ``PATH``.)"
msgstr ""
"선택적으로 설정될 수 있는 ``PYHWP_XSLTPROC`` 과 ``PYHWP_XMLLINT`` 환경변수는 "
"각 프로그램의 위치를 지정한다. (만약 설정되지 않으면, ``xsltproc`` 과 "
"``xmllint`` 는 환경변수 ``PATH`` 가 지정하는 디렉토리 중 하나에 존재해야 한"
"다."

# bc95c4ff391e4201a6ed44a1d0d56e5e
#: ../../converters.rst:36
msgid "``hwp5odt``: ODT conversion"
msgstr "``hwp5odt``: ODT 변환"

# c4f68ae4a1294abfb389633cdbfbd335
#: ../../../pyhwp/hwp5/hwp5odt.py:docstring of hwp5.hwp5odt:1
msgid "HWPv5 to ODT converter"
msgstr "HWPv5-to-ODT 변환기"

# 3de42de0b2fe408280df0c1236fad4e0
# 6d65211ee5dc4aae9509848ed33ad453
# db61f8ccd1b24c80b24fc45cef56d189
#: ../../../pyhwp/hwp5/hwp5odt.py:docstring of hwp5.hwp5odt:3
#: ../../../pyhwp/hwp5/hwp5html.py:docstring hwp5.hwp5html:3
#: ../../../pyhwp/hwp5/hwp5txt.py:docstring hwp5.hwp5txt:3
msgid "Usage::"
msgstr "사용법::"

# 8e52e64968d9457da967a7f1b5826470
# b650b764f0bc40d68cf0b3cff9bec9fc
# ea68666462574d1da0411b50c9aaa33b
#: ../../../pyhwp/hwp5/hwp5odt.py:docstring of hwp5.hwp5odt:12
#: ../../../pyhwp/hwp5/hwp5html.py:docstring hwp5.hwp5html:9
#: ../../../pyhwp/hwp5/hwp5txt.py:docstring hwp5.hwp5txt:9
msgid "Options::"
msgstr "옵션::"

# 41a0562c7de84f6087262873b7090b36
#: ../../converters.rst:40
msgid "``hwp5html``: HTML conversion"
msgstr "``hwp5html``: HTML 변환"

# 7aa5783ccbe141a4b84397507548a5fb
#: ../../../pyhwp/hwp5/hwp5html.py:docstring of hwp5.hwp5html:1
msgid "HWPv5 to HTML converter"
msgstr "HWPv5-to-HTML 변환기"

# c0616df18e5148faa66eeeecbe6920d3
#: ../../converters.rst:44
msgid "``hwp5txt``: text conversion"
msgstr "``hwp5txt``: 텍스트 변환"

# 991947c6361e4eb3b2cf1ed6cfd4c15b
#: ../../../pyhwp/hwp5/hwp5txt.py:docstring of hwp5.hwp5txt:1
msgid "HWPv5 to text converter"
msgstr "HWPv5-to-텍스트 변환기"


================================================
FILE: docs/translated/ko/LC_MESSAGES/hwp5proc.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, mete0r
# This file is distributed under the same license as the pyhwp package.
# mete0r <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pyhwp 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-11-03 12:05+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: mete0r <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# 8ae66890d3c34537b90c78f06ac868ef
#: ../../hwp5proc.rst:2
msgid "``hwp5proc``: HWPv5 processor"
msgstr "``hwp5proc``: HWPv5 처리기"

# bed00d76e0724575a465d3780b90d7fd
#: ../../../pyhwp/hwp5/proc/__init__.py:docstring of hwp5.proc:1
msgid "Do various operations on HWPv5 files."
msgstr "HWPv5 파일에 여러가지 작업을 수행한다."

# cf8a544eee554bbcb012724d966509dc
#: ../../../pyhwp/hwp5/proc/__init__.py:docstring of hwp5.proc:3
#: ../../../pyhwp/hwp5/proc/version.py:docstring hwp5.proc.version:3
#: ../../../pyhwp/hwp5/proc/header.py:docstring hwp5.proc.header:3
#: ../../../pyhwp/hwp5/proc/summaryinfo.py:docstring hwp5.proc.summaryinfo:3
#: ../../../pyhwp/hwp5/proc/ls.py:docstring hwp5.proc.ls:3
#: ../../../pyhwp/hwp5/proc/cat.py:docstring hwp5.proc.cat:3
#: ../../../pyhwp/hwp5/proc/unpack.py:docstring hwp5.proc.unpack:3
#: ../../../pyhwp/hwp5/proc/records.py:docstring hwp5.proc.records:3
#: ../../../pyhwp/hwp5/proc/models.py:docstring hwp5.proc.models:3
#: ../../../pyhwp/hwp5/proc/find.py:docstring hwp5.proc.find:3
#: ../../../pyhwp/hwp5/proc/xml.py:docstring hwp5.proc.xml:8
msgid "Usage::"
msgstr "사용법::"

# 3d0680517061451580552a8980218e48
#: ../../hwp5proc.rst:7
msgid "command: ``version``"
msgstr "명령: ``version``"

# cad75aaf5f6a42ae8910807b46c6a1ef
#: ../../../pyhwp/hwp5/proc/version.py:docstring of hwp5.proc.version:1
msgid "Print HWP file format version of <hwp5file>."
msgstr "<hwp5file>의 HWP 파일 포맷 버전을 출력한다."

# 71d2980c664e45d397af9734a5494c43
#: ../../../pyhwp/hwp5/proc/version.py:docstring of hwp5.proc.version:8
#: ../../../pyhwp/hwp5/proc/header.py:docstring hwp5.proc.header:8
#: ../../../pyhwp/hwp5/proc/summaryinfo.py:docstring hwp5.proc.summaryinfo:8
#: ../../../pyhwp/hwp5/proc/ls.py:docstring hwp5.proc.ls:10
#: ../../../pyhwp/hwp5/proc/cat.py:docstring hwp5.proc.cat:10
#: ../../../pyhwp/hwp5/proc/unpack.py:docstring hwp5.proc.unpack:10
#: ../../../pyhwp/hwp5/proc/records.py:docstring hwp5.proc.records:14
#: ../../../pyhwp/hwp5/proc/models.py:docstring hwp5.proc.models:11
#: ../../../pyhwp/hwp5/proc/find.py:docstring hwp5.proc.find:11
#: ../../../pyhwp/hwp5/proc/xml.py:docstring hwp5.proc.xml:18
msgid "Options::"
msgstr "옵션::"

# 4c8936ae2aab43778971aa79502a721e
#: ../../hwp5proc.rst:12
msgid "command: ``header``"
msgstr "명령: ``header``"

# cad75aaf5f6a42ae8910807b46c6a1ef
#: ../../../pyhwp/hwp5/proc/header.py:docstring of hwp5.proc.header:1
msgid "Print HWP file header."
msgstr "HWP 파일 헤더를 출력한다."

# 5d77d4ca0f394422b709faccc50cfec9
#: ../../hwp5proc.rst:17
msgid "command: ``summaryinfo``"
msgstr "명령: ``summaryinfo``"

# f8011d33ac684c2b8378e18b9e3abedc
#: ../../../pyhwp/hwp5/proc/summaryinfo.py:docstring of
#: hwp5.proc.summaryinfo:1
msgid "Print summary information of <hwp5file>."
msgstr "<hwp5file>의 요약정보(summary information)을 출력한다."

# b7b04b5b3eb74f0eb111194985e01b0d
#: ../../hwp5proc.rst:22
msgid "command: ``ls``"
msgstr "명령: ``ls``"

# b44ddef0cd314f458485388b49c636ca
#: ../../../pyhwp/hwp5/proc/ls.py:docstring of hwp5.proc.ls:1
msgid "List streams in the <hwp5file>."
msgstr "<hwp5file>의 스트림 목록을 출력한다."

# 43a9eab8ec344cfdb4a33aa848da2a56
#: ../../../pyhwp/hwp5/proc/ls.py:docstring of hwp5.proc.ls:22
msgid "Example: List without virtual streams::"
msgstr "예: 가상 스트림을 제외한 목록을 출력한다::"

# ecd90dc2d4094b3c8052a495648ff78f
#: ../../../pyhwp/hwp5/proc/ls.py:docstring of hwp5.proc.ls:39
msgid "Example: List virtual streams too::"
msgstr "예: 가상 스트림을 포함한 목록을 출력한다::"

# 192f6f50cb544c27ad3479b914ef7222
#: ../../hwp5proc.rst:27
msgid "command: ``cat``"
msgstr "명령: ``cat``"

# 15eb8617d1d944949717d81ebb9456f1
#: ../../../pyhwp/hwp5/proc/cat.py:docstring of hwp5.proc.cat:1
msgid ""
"Extract out the specified stream in the <hwp5file> to the standard output."
msgstr "<hwp5file>의 지정된 스트림을 표준출력으로 출력한다."

# dcb71948aa8f47e9b064023f21957a35
# 71ecad71cb0f4fe9ba80cf55082e5f8a
# ef37227f045746b8997f0c2eb30319cd
# 737e619d6b524f69af7005f5ef92ada8
# 07ef11c376cb4d308967be19edcc2881
# 3ae85a74884d4ad9b5c6a8e89747e224
# 6f312dd686584fa4a9dff6f49bbc56b4
# 35fb8b185a6a48dabea56e256d85bfb4
# 4fd7a028c7ff4c11b87ba598655a7907
# 170f201e5a0c4a44abcb0dcea95905d9
# 8329c429e5674eee8022ec39cceed432
# cbf2341d2c7c4149bdc3f07da885e0ae
#: ../../../pyhwp/hwp5/proc/cat.py:docstring of hwp5.proc.cat:22
#: ../../../pyhwp/hwp5/proc/unpack.py:docstring hwp5.proc.unpack:22
#: hwp5.proc.unpack:27 ../../../pyhwp/hwp5/proc/records.py:docstring
#: hwp5.proc.records:38 hwp5.proc.records:42 hwp5.proc.records:50
#: ../../../pyhwp/hwp5/proc/models.py:docstring hwp5.proc.models:34
#: hwp5.proc.models:42 hwp5.proc.models:48 hwp5.proc.models:57
#: ../../../pyhwp/hwp5/proc/xml.py:docstring hwp5.proc.xml:31 hwp5.proc.xml:39
msgid "Example::"
msgstr "예::"

# 8113891b61bb4b339c77d078336391f4
#: ../../hwp5proc.rst:32
msgid "command: ``unpack``"
msgstr "명령: ``unpack``"

# 5c354689e91c40c69ad6d750bd240d1c
#: ../../../pyhwp/hwp5/proc/unpack.py:docstring of hwp5.proc.unpack:1
msgid "Extract out streams in the specified <hwp5file> to a directory."
msgstr "<hwpfile>의 스트림들을 디렉터리로 풀어낸다."

# 414f684ce5a540d0a5cd18ab8b2a5f24
#: ../../hwp5proc.rst:37
msgid "command: ``records``"
msgstr "명령: ``records``"

# f521cdaf60f4451b88faab8a6235b5a4
#: ../../../pyhwp/hwp5/proc/records.py:docstring of hwp5.proc.records:1
msgid "Print the record structure."
msgstr "레코드 구조를 출력한다."

# 241ea6ff890d49db8d765402e0c7b6b5
# 2a49fc3eff194012a083bf9bc0426d93
#: ../../../pyhwp/hwp5/proc/records.py:docstring of hwp5.proc.records:46
#: ../../../pyhwp/hwp5/proc/models.py:docstring hwp5.proc.models:53
msgid ""
"If neither <hwp5file> nor <record-stream> is specified, the record stream is "
"read from the standard input with an assumption that the input is in the "
"format version specified by -V option."
msgstr ""
"<hwp5file>과 <record-stream>이 주어지지 않으면, 레코드 스트림을 표준 출력에서"
"읽어들인다. 이 때 입력의 포맷 버전은 -V 옵션으로 주어진 값인 것으로 가정한다."

# a7dfeeb3a6464db18f930dc3747acc77
#: ../../hwp5proc.rst:42
msgid "command: ``models``"
msgstr "명령: ``models``"

# 058aa45f4ec8463080526f955a7ff2fd
#: ../../../pyhwp/hwp5/proc/models.py:docstring of hwp5.proc.models:1
msgid "Print parsed binary models in the specified <record-stream>."
msgstr "지정된 <record-stream>을 파싱한 바이너리 모델들을 출력한다."

# 7375606379a84a7688a05b9939f6b47d
#: ../../hwp5proc.rst:47
msgid "command: ``find``"
msgstr "명령: ``find``"

# 8cdcfec208464d1a9dbafb8d0489fe4b
#: ../../../pyhwp/hwp5/proc/find.py:docstring of hwp5.proc.find:1
msgid "Find record models with specified predicates."
msgstr "지정된 조건을 만족하는 레코드 모델들을 찾는다."

# 78f39cd8bb2c46a89417b59931917868
#: ../../../pyhwp/hwp5/proc/find.py:docstring of hwp5.proc.find:29
msgid "Example: Find paragraphs::"
msgstr "예: 문단 찾기::"

# 9e23e53b35ca4aefb5e8c1ffa99d3d26
#: ../../../pyhwp/hwp5/proc/find.py:docstring of hwp5.proc.find:35
msgid ""
"Example: Find and dump records of ``HWPTAG_LIST_HEADER`` which is parsed "
"incompletely::"
msgstr ""
"예: 온전히 파싱되지 않은 ``HWPTAG_LIST_HEADER`` 레코드들을 찾아 출력한다::"

# e531df3e57a1451a8fc331069f009f25
#: ../../hwp5proc.rst:52
msgid "command: ``xml`` (*Experimental*)"
msgstr "명령: ``xml`` (*실험적*)"

# 36611ef624fe4bec815a5f8e03567251
#: ../../../pyhwp/hwp5/proc/xml.py:docstring of hwp5.proc.xml:1
msgid "Transform an HWPv5 file into an XML."
msgstr "HWPv5 파일을 XML로 변환한다."

# 412afcfa0f324982801d3cfacaf69b86
#: ../../../pyhwp/hwp5/proc/xml.py:docstring of hwp5.proc.xml:5
msgid ""
"This command is experimental. Its output format is subject to change at any "
"time."
msgstr "이 명령은 실험적입니다. 출력 형식은 언제든 바뀔 수 있습니다."

# d89687875f5d4135963346b8e2de3a53
#: ../../../pyhwp/hwp5/proc/xml.py:docstring of hwp5.proc.xml:36
msgid ""
"With ``--embedbin`` option, you can embed base64-encoded ``BinData/*`` files "
"in the output XML."
msgstr ""
"``--embedbin`` 옵션을 주면, ``BinData/*`` 의 파일들을 base64로 인코딩하여 출"
"력 XML에 내장한다."

# 63b15ef0ee354277b5963fba9147a8f9
#~ msgid "Print FileHeader of <hwp5file>."
#~ msgstr "<hwp5file>의 FileHeader를 출력한다."

# f521cdaf60f4451b88faab8a6235b5a4
#~ msgid "Print records in the specified <record-stream>."
#~ msgstr "지정된 <record-stream>의 레코드들을 출력한다."


================================================
FILE: docs/translated/ko/LC_MESSAGES/index.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, mete0r
# This file is distributed under the same license as the pyhwp package.
# mete0r <EMAIL@ADDRESS>, 2012.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pyhwp 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-29 04:47\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: mete0r <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# e67bfb841934418fb9aa8d6803ae6f61
#: ../../index.rst:7
msgid "Welcome to pyhwp's documentation!"
msgstr ""

# fce4f4f87ace4bd79507f35f9f31fc09
#: ../../index.rst:9
msgid "Contents:"
msgstr "목차:"

# c7b2c8ef52e84e3294e7003ff9087ee0
#: ../../index.rst:23
msgid "Indices and tables"
msgstr "색인과 목록"

# 8caf5884bb214dacaf993c38e939ca98
#: ../../index.rst:25
msgid ":ref:`genindex`"
msgstr ""

# 7d2787c7551040dd8500264c58449cc9
#: ../../index.rst:26
msgid ":ref:`modindex`"
msgstr ""

# a3f0175d485c4314b9d7204608644b95
#: ../../index.rst:27
msgid ":ref:`search`"
msgstr ""


================================================
FILE: docs/translated/ko/LC_MESSAGES/intro.po
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) 2012, mete0r
# This file is distributed under the same license as the pyhwp package.
# mete0r <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: pyhwp 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-31 08:31+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: mete0r <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

# 229d7f6cb6e94b80b3ed276154632ea7
#: ../../intro.rst:2
msgid "pyhwp"
msgstr ""

# 75c5f1d6ce704cfb987f218ddac8e5c9
#: ../../intro.rst:4
msgid "HWP Document Format v5 parser & processor."
msgstr "HWP 문서 포맷 버젼5 파서 & 처리기"

# bdea2ae9aea14b619ceab66b9f6d685c
#: ../../intro.rst:7
msgid "Features"
msgstr "기능"

# 6b057a4ced754848bd138b559238556f
#: ../../intro.rst:9
msgid ""
"Analyze and extract internal streams out from a HWP Document Format v5 file"
msgstr "HWP 문서 버젼 5 파일의 내부 스트림을 분석/분리"

# a68f3e9e704d45dda4278f0efaf64d8a
#: ../../intro.rst:10
msgid ""
"(*Experimental*) Conversion to OpenDocument format (.odt) or plain text (."
"txt)"
msgstr "(*실험적*) OpenDocument 포맷(.odt)나 일반 텍스트 문서로 변환"

# ea5a3a8d49cc413eb9ef1fa6f58633ff
#: ../../intro.rst:13
msgid "Installation"
msgstr "설치"

# 0d7548139cea4b37bb2298584800bffc
#: ../../intro.rst:15
msgid "from `pypi <http://pypi.python.org/pypi/pyhwp>`_::"
msgstr "`pypi <http://pypi.python.org/pypi/pyhwp>`_ 에서::"

# 33cd4af4dc6f496bbea8284505308c83
#: ../../intro.rst:20
msgid "Or::"
msgstr "혹은::"

# da4c2f33f39048e9a72ad43807cd7e37
#: ../../intro.rst:25
msgid "Requirements"
msgstr "필요한 것"

# db6d63914fb2413d92e5701b694e2b22
#: ../../intro.rst:27
msgid "CPython 2.5, 2.6, 2.7, Jython 2.5.3 or PyPy 2.0.2"
msgstr "CPython 2.5, 2.6, 2.7, Jython 2.5.3 혹은 PyPy 2.0.2"

# 0d7548139cea4b37bb2298584800bffc
#: ../../intro.rst:28
msgid "`setuptools <http://pypi.python.org/pypi/setuptools>`_"
msgstr ""

# 2cab7c2a85d34ff7adc294b7e48d5575
#: ../../intro.rst:29
msgid ""
"`pycrypto <https://pypi.python.org/pypi/pycrypto>`_ (optional, to decode "
"distribution docs)"
msgstr ""
"`pycrypto <https://pypi.python.org/pypi/pycrypto>`_ (선택적, 배포용 문서"
"읽기에 필요)"

# 070821d20ddc4c6cb15fa70632bf6523
#: ../../intro.rst:32
msgid "Documentation & Development"
msgstr "문서화 및 개발"

# 8228a1248e8b4f6fb82be453d4ef4135
#: ../../intro.rst:34
msgid ""
"Documentation: `http://pythonhosted.org/pyhwp/ <http://pythonhosted.org/"
"pyhwp/>`_ [`한국/조선어 <http://pythonhosted.org/pyhwp/ko/>`_] [`develop "
"branch <http://pyhwp.readthedocs.org>`_]"
msgstr ""
"문서화: `http://pythonhosted.org/pyhwp/ko <http://pythonhosted.org/pyhwp/"
"ko>`_ [`English <http://pythonhosted.org/pyhwp>`_] [`개발 branch <http://"
"pyhwp.readthedocs.org>`_]"

# 0d7548139cea4b37bb2298584800bffc
#: ../../intro.rst:35
msgid ""
"Distribution: `http://pypi.python.org/pypi/pyhwp <http://pypi.python.org/"
"pypi/pyhwp>`_"
msgstr ""
"배포: `http://pypi.python.org/pypi/pyhwp <http://pypi.python.org/pypi/"
"pyhwp>`_"

# f0f93a1ed81747dc9c7a3c631b971e86
#: ../../intro.rst:36
msgid ""
"Development: `https://github.com/mete0r/pyhwp <https://github.com/mete0r/"
"pyhwp>`_"
msgstr ""
"개발: `https://github.com/mete0r/pyhwp <https://github.com/mete0r/pyhwp>`_"

# f0f93a1ed81747dc9c7a3c631b971e86
#: ../../intro.rst:37
msgid ""
"Issue tracker: `https://github.com/mete0r/pyhwp/issues <https://github.com/"
"mete0r/pyhwp/issues>`_"
msgstr ""
"버그 추적: `https://github.com/mete0r/pyhwp/issues <https://github.com/"
"mete0r/pyhwp/issues>`_"

# 317c633c180a4bda8045e2a5b1e757cf
#: ../../intro.rst:38
msgid "Feedbacks & contributions are welcome!"
msgstr "피드백이나 기여 환영합니다."

# b200736b60a04a8480b72cb24a513db0
#: ../../intro.rst:41
msgid "Contributors"
msgstr "기여한 이들"

# 38b9e22103b4432eaf4fdf9f452bc3e3
#: ../../intro.rst:43
msgid "Maintainer: `mete0r <https://github.com/mete0r>`_"
msgstr "Maintainer: `mete0r <https://github.com/mete0r>`_"

# 3968cb8206a14f398a248eed814ad9aa
#: ../../intro.rst:46
msgid "License"
msgstr "사용허가"

# d64dabb371984d2ba250f37e220aa39a
#: ../../intro.rst:48
msgid "Copyright (C) 2010-2023 mete0r <https://github.com/mete0r>"
msgstr ""

# 32ed7d69ae9f4bf5bff4e8d68c113f4c
#: ../../intro.rst:52
msgid ""
"`GNU Affero General Public License v3.0 <http://www.gnu.org/licenses/"
"agpl-3.0.html>`_ `(text version) <http://www.gnu.org/licenses/agpl-3.0.txt>`_"
msgstr ""

# 164415d866774a9e9e7ad1008447cf74
#: ../../intro.rst:55
msgid ""
"This program is free software: you can redistribute it and/or modify it "
"under the terms of the GNU Affero General Public License as published by the "
"Free Software Foundation, either version 3 of the License, or (at your "
"option) any later version."
msgstr ""

# 6cc8ef94865e4196898a83b1b80dd2e5
#: ../../intro.rst:60
msgid ""
"This program is distributed in the hope that it will be useful, but WITHOUT "
"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
"FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License "
"for more details."
msgstr ""

# d54697f2f7dc44869d43637b7e5dcb68
#: ../../intro.rst:65
msgid ""
"You should have received a copy of the GNU Affero General Public License "
"along with this program.  If not, see <http://www.gnu.org/licenses/>."
msgstr ""

# c3270c668ef7418e951ef0bc8ac17fdd
#: ../../intro.rst:69
msgid "Disclosure"
msgstr "공개"

# df57575778df4329940de5a8a2999e73
#: ../../intro.rst:71
msgid ""
"This program has been developed in accordance with a public document named "
"\"HWP Binary Specification 1.1\" published by `Hancom Inc. <http://www."
"hancom.co.kr>`_"
msgstr ""
"pyhwp는 `(주)한글과컴퓨터 <http://www.hancom.co.kr>`_ 의 한/글 문서 파일(."
"hwp) 공개 문서를 참고하여 개발하였습니다."

# d21d1a96770c48399bf7d7962f96c816
#~ msgid ""
#~ "Documentation: `http://pyhwp.readthedocs.org <http://pyhwp.readthedocs."
#~ "org>`_"
#~ msgstr ""
#~ "문서화: `http://pyhwp.readthedocs.org <http://pyhwp.readthedocs.org>`_"


================================================
FILE: etc/pylint.rc
================================================
[MASTER]

# Specify a configuration file.
#rcfile=

# Python code to execute, usually for sys.path manipulation such as
# pygtk.require().
#init-hook=

# Profiled execution.
profile=no

# Add files or directories to the blacklist. They should be base names, not
# paths.
ignore=CVS

# Pickle collected data for later comparisons.
persistent=yes

# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
load-plugins=


[MESSAGES CONTROL]

# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=

# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=


[REPORTS]

# Set the output format. Available formats are text, parseable, colorized, msvs
# (visual studio) and html
output-format=text

# Include message's id in output
include-ids=no

# Put messages in a separate file for each module / package specified on the
# command line instead of printing them on stdout. Reports (if any) will be
# written in a file name "pylint_global.[txt|html]".
files-output=no

# Tells whether to display a full report or only the messages
reports=yes

# Python expression which should return a note less than 10 (10 is the highest
# note). You have access to the variables errors warning, statement which
# respectively contain the number of errors / warnings messages and the total
# number of statements analyzed. This is used by the global evaluation report
# (RP0004).
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)

# Add a comment according to your evaluation note. This is used by the global
# evaluation report (RP0004).
comment=no


[FORMAT]

# Maximum number of characters on a single line.
max-line-length=80

# Maximum number of lines in a module
max-module-lines=1000

# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
indent-string='    '


[TYPECHECK]

# Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive).
ignore-mixin-members=yes

# List of classes names for which member attributes should not be checked
# (useful for classes with attributes dynamically set).
ignored-classes=SQLObject

# When zope mode is activated, add a predefined set of Zope acquired attributes
# to generated-members.
zope=no

# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E0201 when accessed. Python regular
# expressions are accepted.
generated-members=REQUEST,acl_users,aq_parent


[SIMILARITIES]

# Minimum lines number of a similarity.
min-similarity-lines=4

# Ignore comments when computing similarities.
ignore-comments=yes

# Ignore docstrings when computing similarities.
ignore-docstrings=yes


[BASIC]

# Required attributes for module, separated by a comma
required-attributes=

# List of builtins function names that should not be used, separated by a comma
bad-functions=map,filter,apply,input

# Regular expression which should only match correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$

# Regular expression which should only match correct module level names
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$

# Regular expression which should only match correct class names
class-rgx=[A-Z_][a-zA-Z0-9]+$

# Regular expression which should only match correct function names
function-rgx=[a-z_][a-z0-9_]{2,30}$

# Regular expression which should only match correct method names
method-rgx=[a-z_][a-z0-9_]{2,30}$

# Regular expression which should only match correct instance attribute names
attr-rgx=[a-z_][a-z0-9_]{2,30}$

# Regular expression which should only match correct argument names
argument-rgx=[a-z_][a-z0-9_]{2,30}$

# Regular expression which should only match correct variable names
variable-rgx=[a-z_][a-z0-9_]{2,30}$

# Regular expression which should only match correct list comprehension /
# generator expression variable names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$

# Good variable names which should always be accepted, separated by a comma
good-names=f,i,j,k,ex,Run,_

# Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,baz,toto,tutu,tata

# Regular expression which should only match functions or classes name which do
# not require a docstring
no-docstring-rgx=__.*__


[VARIABLES]

# Tells whether we should check for unused import in __init__ files.
init-import=no

# A regular expression matching the beginning of the name of dummy variables
# (i.e. not used).
dummy-variables-rgx=_|dummy

# List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible.
additional-builtins=


[MISCELLANEOUS]

# List of note tags to take in consideration, separated by a comma.
notes=FIXME,XXX,TODO


[CLASSES]

# List of interface methods to ignore, separated by a comma. This is used for
# instance to not check methods defines in Zope's Interface base class.
ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by

# List of method names used to declare (i.e. assign) instance attributes.
defining-attr-methods=__init__,__new__,setUp

# List of valid names for the first argument in a class method.
valid-classmethod-first-arg=cls


[IMPORTS]

# Deprecated modules which should not be used, separated by a comma
deprecated-modules=regsub,string,TERMIOS,Bastion,rexec

# Create a graph of every (i.e. internal and external) dependencies in the
# given file (report RP0402 must not be disabled)
import-graph=

# Create a graph of external dependencies in the given file (report RP0402 must
# not be disabled)
ext-import-graph=

# Create a graph of internal dependencies in the given file (report RP0402 must
# not be disabled)
int-import-graph=


[DESIGN]

# Maximum number of arguments for function / method
max-args=5

# Argument names that match this expression will be ignored. Default to name
# with leading underscore
ignored-argument-names=_.*

# Maximum number of locals for function / method body
max-locals=15

# Maximum number of return / yield for function / method body
max-returns=6

# Maximum number of branch for function / method body
max-branchs=12

# Maximum number of statements in function / method body
max-statements=50

# Maximum number of parents for a class (see R0901).
max-parents=7

# Maximum number of attributes for a class (see R0902).
max-attributes=7

# Minimum number of public methods for a class (see R0903).
min-public-methods=0

# Maximum number of public methods for a class (see R0904).
max-public-methods=20


[EXCEPTIONS]

# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
overgeneral-exceptions=Exception


================================================
FILE: etc/testlog.conf
================================================
[loggers]
keys=root,hwp5

[handlers]
keys=file

[formatters]
keys=simple

[logger_root]
handlers=file
level=DEBUG

[logger_hwp5]
qualname=hwp5
handlers=file
level=DEBUG

[handler_file]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=simple
args=('nosetests.log', 'a', 10*1024*1024)

[formatter_simple]
format=%(name)s:%(levelname)s:%(message)s
datefmt=


================================================
FILE: ez_setup.py
================================================
#!python
"""Bootstrap setuptools installation

If you want to use setuptools in your package's setup.py, just include this
file in the same directory with it, and add this to the top of your setup.py::

    from ez_setup import use_setuptools
    use_setuptools()

If you want to require a specific version of setuptools, set a download
mirror, or use an alternate download directory, you can do so by supplying
the appropriate options to ``use_setuptools()``.

This file can also be run as a script to install or upgrade setuptools.
"""
import sys
DEFAULT_VERSION = "0.6c11"
DEFAULT_URL     = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]

md5_data = {
    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
    'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090',
    'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4',
    'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7',
    'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5',
    'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de',
    'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b',
    'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2',
    'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086',
    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
    'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
    'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
    'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
    'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
    'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
    'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
    'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
    'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
    'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
    'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
    'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
    'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
    'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
}

import sys, os
try: from hashlib import md5
except ImportError: from md5 import md5

def _validate_md5(egg_name, data):
    if egg_name in md5_data:
        digest = md5(data).hexdigest()
        if digest != md5_data[egg_name]:
            print >>sys.stderr, (
                "md5 validation of %s failed!  (Possible download problem?)"
                % egg_name
            )
            sys.exit(2)
    return data

def use_setuptools(
    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
    download_delay=15
):
    """Automatically find/download setuptools and make it available on sys.path

    `version` should be a valid setuptools version number that is available
    as an egg for download under the `download_base` URL (which should end with
    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
    it is not already available.  If `download_delay` is specified, it should
    be the number of seconds that will be paused before initiating a download,
    should one be required.  If an older version of setuptools is installed,
    this routine will print a message to ``sys.stderr`` and raise SystemExit in
    an attempt to abort the calling script.
    """
    was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
    def do_download():
        egg = download_setuptools(version, download_base, to_dir, download_delay)
        sys.path.insert(0, egg)
        import setuptools; setuptools.bootstrap_install_from = egg
    try:
        import pkg_resources
    except ImportError:
        return do_download()       
    try:
        pkg_resources.require("setuptools>="+version); return
    except pkg_resources.VersionConflict, e:
        if was_imported:
            print >>sys.stderr, (
            "The required version of setuptools (>=%s) is not available, and\n"
            "can't be installed while this script is running. Please install\n"
            " a more recent version first, using 'easy_install -U setuptools'."
            "\n\n(Currently using %r)"
            ) % (version, e.args[0])
            sys.exit(2)
    except pkg_resources.DistributionNotFound:
        pass

    del pkg_resources, sys.modules['pkg_resources']    # reload ok
    return do_download()

def download_setuptools(
    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
    delay = 15
):
    """Download setuptools from a specified location and return its filename

    `version` should be a valid setuptools version number that is available
    as an egg for download under the `download_base` URL (which should end
    with a '/'). `to_dir` is the directory where the egg will be downloaded.
    `delay` is the number of seconds to pause before an actual download attempt.
    """
    import urllib2, shutil
    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
    url = download_base + egg_name
    saveto = os.path.join(to_dir, egg_name)
    src = dst = None
    if not os.path.exists(saveto):  # Avoid repeated downloads
        try:
            from distutils import log
            if delay:
                log.warn("""
---------------------------------------------------------------------------
This script requires setuptools version %s to run (even to display
help).  I will attempt to download it for you (from
%s), but
you may need to enable firewall access for this script first.
I will start the download in %d seconds.

(Note: if this machine does not have network access, please obtain the file

   %s

and place it in this directory before rerunning this script.)
---------------------------------------------------------------------------""",
                    version, download_base, delay, url
                ); from time import sleep; sleep(delay)
            log.warn("Downloading %s", url)
            src = urllib2.urlopen(url)
            # Read/write all in one block, so we don't create a corrupt file
            # if the download is interrupted.
            data = _validate_md5(egg_name, src.read())
            dst = open(saveto,"wb"); dst.write(data)
        finally:
            if src: src.close()
            if dst: dst.close()
    return os.path.realpath(saveto)




































def main(argv, version=DEFAULT_VERSION):
    """Install or upgrade setuptools and EasyInstall"""
    try:
        import setuptools
    except ImportError:
        egg = None
        try:
            egg = download_setuptools(version, delay=0)
            sys.path.insert(0,egg)
            from setuptools.command.easy_install import main
            return main(list(argv)+[egg])   # we're done here
        finally:
            if egg and os.path.exists(egg):
                os.unlink(egg)
    else:
        if setuptools.__version__ == '0.0.1':
            print >>sys.stderr, (
            "You have an obsolete version of setuptools installed.  Please\n"
            "remove it from your system entirely before rerunning this script."
            )
            sys.exit(2)

    req = "setuptools>="+version
    import pkg_resources
    try:
        pkg_resources.require(req)
    except pkg_resources.VersionConflict:
        try:
            from setuptools.command.easy_install import main
        except ImportError:
            from easy_install import main
        main(list(argv)+[download_setuptools(delay=0)])
        sys.exit(0) # try to force an exit
    else:
        if argv:
            from setuptools.command.easy_install import main
            main(argv)
        else:
            print "Setuptools version",version,"or greater has been installed."
            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'

def update_md5(filenames):
    """Update our built-in md5 registry"""

    import re

    for name in filenames:
        base = os.path.basename(name)
        f = open(name,'rb')
        md5_data[base] = md5(f.read()).hexdigest()
        f.close()

    data = ["    %r: %r,\n" % it for it in md5_data.items()]
    data.sort()
    repl = "".join(data)

    import inspect
    srcfile = inspect.getsourcefile(sys.modules[__name__])
    f = open(srcfile, 'rb'); src = f.read(); f.close()

    match = re.search("\nmd5_data = {\n([^}]+)}", src)
    if not match:
        print >>sys.stderr, "Internal error!"
        sys.exit(2)

    src = src[:match.start(1)] + repl + src[match.end(1):]
    f = open(srcfile,'w')
    f.write(src)
    f.close()


if __name__=='__main__':
    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
        update_md5(sys.argv[2:])
    else:
        main(sys.argv[1:])








================================================
FILE: misc/cleanup-pyc.py
================================================
# -*- coding: utf-8 -*-
import logging
import os.path


logger = logging.getLogger(os.path.splitext(os.path.basename(__file__))[0])


def find_files(root):
    import os
    import os.path
    for name in os.listdir(root):
        path = os.path.join(root, name)
        yield path
        if os.path.isdir(path):
            for x in find_files(path):
                yield x


def find_pyc_files(root):
    for path in find_files(root):
        if path.endswith('.pyc') or path.endswith('$py.class'):
            yield path


def main():
    import sys
    import os.path

    logging.basicConfig(level=logging.INFO)

    for root in sys.argv[1:]:
        if os.path.isdir(root):
            for path in find_pyc_files(root):
                if not os.path.isdir(path):
                    logger.info('unlink %s', path)
                    os.unlink(path)


if __name__ == '__main__':
    main()


================================================
FILE: misc/copylxml.py
================================================
import sys
import os.path
import shutil

def main():
    if sys.platform == 'win32':
        try:
            import lxml
        except ImportError:
            print 'no lxml found'
        else:
            lxml_path = os.path.dirname(lxml.__file__)
            dest_path = os.path.join(sys.argv[1], 'lxml')
            shutil.copytree(lxml_path, dest_path)
        sys.exit(0)
    else:
        sys.exit(os.system('pip install lxml'))


if __name__ == '__main__':
    main()


================================================
FILE: misc/docs-upload
================================================
#!/bin/sh

# exit if any statement returns non-true return value
set -e

# exit on uninitialized variable
set -u

HTML_BASE=${buildout:directory}/docs/.build/html
BUILD_DIR=${buildout:directory}/build

cd ${buildout:directory}

[ -d $BUILD_DIR/docs/ ] || (echo $BUILD_DIR/docs/ missing; exit 1)
[ -d $BUILD_DIR/docs/ko/ ] || (echo $BUILD_DIR/docs/ko/ missing; exit 1)

python setup.py upload_docs -r https://pypi.python.org/pypi --upload-dir=$BUILD_DIR/docs


================================================
FILE: misc/fix-coverage.py
================================================
# -*- coding: utf-8 -*-
''' fix pyhwp source paths in coverage.xml
'''
import re
import sys


def main():
    f = file(sys.argv[2], 'w')
    try:
        for line in file(sys.argv[1]):
            line = re.sub('filename="[^"]*/hwp5/', 'filename="pyhwp/hwp5/', line)
            f.write(line)
    finally:
        f.close()


if __name__ == '__main__':
    main()


================================================
FILE: misc/install-lxml.py.in
================================================
# -*- coding: utf-8 -*-

def main():
    import sys
    import os.path
    from subprocess import check_call
    from subprocess import Popen
    import shutil

    if sys.platform == 'win32':
        src = '${lxml-location}'
        dst = sys.argv[1]
        src_path = os.path.join(src, 'lxml')
        dst_path = os.path.join(dst, 'lxml')
        print('lxml src: %s' % src_path)
        print('lxml dst: %s' % dst_path)
        if os.path.exists(src_path):
            print('lxml: copytree-ing...')
            shutil.copytree(src_path, dst_path)
        else:
            print('lxml: not found. skipping...')
        sys.exit(0)
    else:
        check_call(['pip', 'install', 'lxml'])

if __name__ == '__main__':
    main()


================================================
FILE: misc/mkdir.py
================================================
# -*- coding: utf-8 -*-

import sys
import os.path
import shutil

if __name__ == '__main__':
    d = sys.argv[1]
    if os.path.exists(d):
        print('rmtree: %s' % d)
        shutil.rmtree(d)
    print('mkdir: %s' % d)
    os.makedirs(d)


================================================
FILE: misc/oxt-build.in
================================================
#!/bin/sh
DIST_DIR=${buildout:directory}/dist
SRC_DIR=${buildout:directory}/oxt
BIN_DIR=${buildout:directory}/bin
VERSION=`git describe --dirty`
OUTPUT=$DIST_DIR/hwp5-$VERSION.oxt

[ ! -e $DIST_DIR ] && mkdir $DIST_DIR
cp $SRC_DIR/description.xml description.xml
$BIN_DIR/oxt-desc-version description.xml $VERSION
$BIN_DIR/oxt-pkg-build -d description.xml -o $OUTPUT $SRC_DIR pythonpath -E '*.pyc:*.class:*/docopt*:*/OleFileIO*:'
$BIN_DIR/oxt-pkg-check $OUTPUT || exit 1
$BIN_DIR/oxt-pkg-show $OUTPUT
ln -sf $OUTPUT $DIST_DIR/hwp5.oxt
rm -f description.xml


================================================
FILE: misc/prepare-hwp5-xsl-fixtures.py
================================================
# -*- coding: utf-8 -*-
from __future__ import with_statement
import os.path
import logging
import sys


logger = logging.getLogger('hwp5.xsltests')


def find_hwp5files(dir):
    import glob
    return glob.glob(os.path.join(dir, '*.hwp'))


def main():
    doc = ''' convert fixture hwp5 files into *.xml

    Usage:
        prepare [--fixtures-dir=<dir>] [--out-dir=<dir>]
        prepare --help

    Options:
        -h --help               Show this screen
           --fixtures-dir=<dir> Fixture directory
           --out-dir=<dir>      Output directory
    '''
    from docopt import docopt
    from hwp5.xmlmodel import Hwp5File

    args = docopt(doc, version='0.0')

    logging.getLogger().addHandler(logging.StreamHandler())
    logging.getLogger('hwp5.xsltests').setLevel(logging.INFO)

    if args['--fixtures-dir']:
        fixture_dir = args['--fixtures-dir']
    else:
        import hwp5
        hwp5_pkgdir = os.path.dirname(hwp5.__file__)
        fixture_dir = os.path.join(hwp5_pkgdir, 'tests', 'fixtures')

    out_dir = args['--out-dir']

    for path in find_hwp5files(fixture_dir):
        name = os.path.basename(path)
        rootname = os.path.splitext(name)[0]
        out_path = rootname + '.xml'
        if out_dir is not None:
            if not os.path.exists(out_dir):
                os.makedirs(out_dir)
            out_path = os.path.join(out_dir, out_path)

        logger.info('%s', out_path)

        opts = {}
        try:
            hwp5file = Hwp5File(path)
            with file(out_path, 'w') as f:
                hwp5file.xmlevents(**opts).dump(f)
        except Exception:
            e = sys.exc_info()[1]
            logger.exception(e)


if __name__ == '__main__':
    sys.exit(main())


================================================
FILE: misc/redirect.py
================================================
from __future__ import with_statement
import subprocess
import sys

if __name__ == '__main__':
    with file(sys.argv[1], 'wb') as f:
        p = subprocess.Popen(sys.argv[2:], stdout=f)
        p.wait()
        raise SystemExit(p.returncode)


================================================
FILE: misc/test-cli.in
================================================
#!/bin/sh
PATH=${buildout:bin-directory}:$PATH
. ${buildout:directory}/pyhwp-tests/hwp5_cli_tests.sh


================================================
FILE: misc/test-cli.py
================================================
# -*- coding: utf-8 -*-
import os.path
import logging


logger = logging.getLogger('test-cli')


def main():
    logging.basicConfig(level=logging.INFO)

    if not os.path.exists('/bin/sh'):
        logger.warning('/bin/sh: not-found')
        logger.warning('skipping test-cli')
        return 0

    d = 'pyhwp-tests'
    shscript = os.path.join(d, 'hwp5_cli_tests.sh')

    cmd = ['/bin/sh', shscript]
    cmd = ' '.join(cmd)
    logger.info('running: %s', cmd)
    ret = os.system(cmd)
    logger.info('exit with %d', ret)
    if ret != 0:
        raise SystemExit(-1)


if __name__ == '__main__':
    main()


================================================
FILE: misc/test-coverage
================================================
#!/bin/sh
# Remove old results
${buildout:directory}/bin/coverage erase

# Collect test coverage results for all packages
# Runs a code coverage analysis on top of the "bin/test" script for
# all packages. The data will be collected in a ".coverage" output file
# in the buildout directory.

${buildout:directory}/bin/coverage run -p --source=hwp5 ${buildout:directory}/bin/test

# Combine all package analysis
${buildout:directory}/bin/coverage combine
# Generates a "coverage.xml" file that Jenkins can read and process from the
# ".coverage" file that the coverage report created.
${buildout:directory}/bin/coverage xml -i -o ${buildout:directory}/coverage.xml


================================================
FILE: misc/test-for-bisect
================================================
#!/bin/sh

# usage: git bisect run bin/test-for-bisect

cd ${buildout:directory}
bin/buildout -o && bin/test && exit 0 || exit 1


================================================
FILE: misc/test-in-lo.py
================================================
#!/usr/bin/python
# -*- coding: utf-8 -*-

def main():
    import os
    args = ['${buildout:bin-directory}/oxt-test',
            '${buildout:parts-directory}/test']
    os.system(' '.join(args))


if __name__ == '__main__':
    main()


================================================
FILE: misc/test-pypi.in
================================================
#!/bin/sh

# exit if any statement returns non-true return value
set -e

# exit on uninitialized variable
set -u

cd ${buildout:directory}

VERSION=`cat VERSION.txt`

mkdir -p releases
rm -rf releases/$VERSION
mkvenv cp2 releases/$VERSION
set +u
. releases/$VERSION/bin/activate
set -u
pip install pyhwp==$VERSION
hwp5proc --version | head -n 1 | grep "$VERSION$"


================================================
FILE: misc/test-sdist
================================================
#!/bin/bash

# exit if any statement returns non-true return value
set -e

# exit on uninitialized variable
set -u

VERSION=`python setup.py --version`
echo pyhwp version: $VERSION
VENV=venv-$VERSION
SDIST=dist/pyhwp-$VERSION.tar.gz

[ -f $SDIST ] && rm -f $SDIST
python setup.py sdist > sdist.log
tar tfz $SDIST | grep -F "pyhwp-$VERSION/README"
tar tfz $SDIST | grep -F "pyhwp-$VERSION/COPYING"
tar tfz $SDIST | grep -F "pyhwp-$VERSION/pyhwp/hwp5/README"
tar tfz $SDIST | grep -F "pyhwp-$VERSION/pyhwp/hwp5/COPYING"

[ -f $VENV/bin/activate ] || mkvenv cp2 $VENV
set +eu
. $VENV/bin/activate
set -eu

pip install $SDIST
python -c 'print __import__("pkg_resources").resource_filename("hwp5", "README")' | grep README
python -c 'print __import__("pkg_resources").resource_filename("hwp5", "COPYING")' | grep COPYING
hwp5proc --version | grep -F "$VERSION"
hwp5odt --version | grep -F "$VERSION"
bin/test-cli > test-cli.log

pip uninstall pyhwp --yes
rm -rf $VENV
echo 'test-sdist SUCCESSFUL'


================================================
FILE: misc/test-sdist.in
================================================
#!/bin/sh
bash ${buildout:directory}/misc/test-sdist


================================================
FILE: misc/test-upload.in
================================================
#!/bin/sh

# exit if any statement returns non-true return value
set -e

# exit on uninitialized variable
set -u

cd ${buildout:directory}

VERSION=`cat VERSION.txt`
python setup.py sdist upload -r https://testpypi.python.org/pypi | tee upload.log
tail -n 1 upload.log | grep 200

rm -rf testpypi
mkvenv cp2 testpypi
set +u
. testpypi/bin/activate
set -u
pip install --download=testpypi --no-deps --index-url https://testpypi.python.org/simple/ pyhwp==$VERSION
pip install --extra-index-url https://testpypi.python.org/simple/ pyhwp==$VERSION
hwp5proc --version | head -n 1 | grep "$VERSION$"


================================================
FILE: misc/test-xsl.in
================================================
#!/bin/sh

set -e
set -u

cd ${buildout:directory}
rm -rf test-xsl
mkdir -p test-xsl

IMPORT_DIR=${buildout:directory}/test-xsl/fixtures
GEN_DIR=${buildout:directory}/test-xsl/gen

mkdir -p $IMPORT_DIR
mkdir -p $GEN_DIR

${buildout:bin-directory}/console ${buildout:directory}/misc/prepare-hwp5-xsl-fixtures.py --fixtures-dir=${buildout:directory}/pyhwp-tests/hwp5_tests/fixtures --out-dir=$IMPORT_DIR
${buildout:bin-directory}/xsltest --styles-dir=${buildout:directory}/pyhwp/hwp5/xsl --import-dir=$IMPORT_DIR --gen-dir=$GEN_DIR ${buildout:directory}/pyhwp-tests/hwp5_xsl_tests

test_xsl_cov="${buildout:bin-directory}/test-xsl-cov"
[ ! -e "$test_xsl_cov" ] || "$test_xsl_cov" xsltcoverage.xml ${buildout:directory}/test-xsl/gen/*.py


================================================
FILE: misc/upload
================================================
#!/bin/sh
cd ${buildout:directory}
python setup.py sdist upload --sign


================================================
FILE: notebooks/.gitignore
================================================
.ipynb_checkpoints


================================================
FILE: oxt/Addons.xcu
================================================
<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
        oor:name="Addons"
        oor:package="org.openoffice.Office">

  <node oor:name="AddonUI">
    <node oor:name="OfficeMenuBar">
      <node oor:name="pyhwp.HelloWorld" oor:op="replace">
        <prop oor:name="Title" oor:type="xs:string">
          <value/>
          <value xml:lang="en-US">pyhwp</value>
        </prop>
        <prop oor:name="Target" oor:type="xs:string">
          <value>_self</value>
        </prop>
        <prop oor:name="ImageIdentifier" oor:type="xs:string">
          <value/>
        </prop>
        <node oor:name="Submenu">
          <node oor:name="m1" oor:op="replace">
            <prop oor:name="URL" oor:type="xs:string">
              <value>service:pyhwp.HelloWorld?insert</value>
            </prop>
            <prop oor:name="Title" oor:type="xs:string">
              <value xml:lang="en-US">Insert Hello World</value>
            </prop>
            <prop oor:name="Target" oor:type="xs:string">
              <value>_self</value>
            </prop>
            <prop oor:name="Context" oor:type="xs:string">
              <value>com.sun.star.text.TextDocument</value>
            </prop>
          </node>
        </node>
      </node>
    </node>
  </node>
</oor:component-data>


================================================
FILE: oxt/Filter.xcu
================================================
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE oor:component-data SYSTEM "../../../../component-update.dtd">
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:package="org.openoffice.TypeDetection" oor:name="Filter">
  <node oor:name="Filters">
    <node oor:name="hwp5" oor:op="fuse">
      <prop oor:name="FileFormatVersion"><value>5</value></prop>
      <prop oor:name="Type"><value>hwp5</value></prop>
      <prop oor:name="DocumentService"><value>com.sun.star.text.TextDocument</value></prop>
      <prop oor:name="UIComponent"/>
      <prop oor:name="UserData"><value></value></prop>
      <prop oor:name="FilterService"><value>hwp5.Importer</value></prop>
      <prop oor:name="UIName">
        <value xml:lang="x-default">HWP Document Format v5</value>
      </prop>
      <prop oor:name="Flags"><value>IMPORT ALIEN 3RDPARTYFILTER</value></prop>
    </node>
  </node>
</oor:component-data>


================================================
FILE: oxt/META-INF/manifest.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
  <manifest:file-entry manifest:media-type="application/vnd.sun.star.configuration-data"
                       manifest:full-path="Types.xcu" />
  <manifest:file-entry manifest:media-type="application/vnd.sun.star.configuration-data"
                       manifest:full-path="Filter.xcu" />
  <manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-component;type=Python"
                       manifest:full-path="components.py" />
</manifest:manifest>


================================================
FILE: oxt/Makefile
================================================
OXTPKG:=../dist/hwp5-$(shell git describe --dirty).oxt
UNOPKG=unopkg

$(OXTPKG):
	../bin/oxt-build

validate: $(OXTPKG)
	$(UNOPKG) validate -v hwp5.oxt

install: $(OXTPKG)
	$(UNOPKG) add -v -s $(OXTPKG)

uninstall:
	$(UNOPKG) remove -f hwp5.oxt

reinstall: uninstall install

clean:
	$(RM) $(OXTPKG)

.PHONY: validate install uninstall clean


================================================
FILE: oxt/Types.xcu
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE oor:component-data SYSTEM "../../../../component-update.dtd">
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry"
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    oor:package="org.openoffice.TypeDetection"
                    oor:name="Types">
  <node oor:name="Types">
    <node oor:name="hwp5" oor:op="fuse">
      <prop oor:name="DetectService"><value>hwp5.Detector</value></prop>
      <prop oor:name="URLPattern"/>
      <prop oor:name="Extensions"><value>hwp</value></prop>
      <prop oor:name="MediaType"><value>application/x-hwp</value></prop>
      <prop oor:name="Preferred"><value>true</value></prop>
      <prop oor:name="PreferredFilter"><value>hwp5</value></prop>
      <prop oor:name="UIName">
          <value xml:lang="x-default">HWP Document Format v5</value>
      </prop>
      <prop oor:name="ClipboardFormat"/>
    </node>
  </node>
</oor:component-data>


================================================
FILE: oxt/components.py
================================================
# -*- coding: utf-8 -*-
#
#   pyhwp : hwp file format parser in python
#   Copyright (C) 2010,2011,2012 https://github.com/mete0r
#
#   This program is free software: you can redistribute it and/or modify
#   it under the terms of the GNU Affero General Public License as published by
#   the Free Software Foundation, either version 3 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU Affero General Public License for more details.
#
#   You should have received a copy of the GNU Affero General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
import logging
import os


# initialize logging system
logger = logging.getLogger('hwp5')

loglevel = os.environ.get('PYHWP_LOGLEVEL')
if loglevel:
    loglevel = dict(DEBUG=logging.DEBUG,
                    INFO=logging.INFO,
                    WARNING=logging.WARNING,
                    ERROR=logging.ERROR,
                    CRITICAL=logging.CRITICAL).get(loglevel.upper(),
                                                   logging.WARNING)
    logger.setLevel(loglevel)
del loglevel

filename = os.environ.get('PYHWP_LOGFILE')
if filename:
    logger.addHandler(logging.FileHandler(filename))
del filename


import sys
logger.info('sys.executable = %s', sys.executable)
logger.info('sys.version = %s', sys.version)
logger.info('sys.path:')
for path in sys.path:
    logger.info('- %s', path)


try:
    import uno
    import unohelper
    import unokit
    from unokit.util import propseq_to_dict
    from unokit.util import dict_to_propseq
    from unokit.util import xenumeration_list
    from unokit.adapters import InputStreamFromFileLike

    from com.sun.star.lang import XInitialization
    from com.sun.star.document import XFilter, XImporter, XExtendedFilterDetection
    from com.sun.star.task import XJobExecutor

    def log_exception(f):
        def wrapper(*args, **kwargs):
            try:
                return f(*args, **kwargs)
            except Exception as e:
                logger.exception(e)
                raise
        return wrapper

    g_ImplementationHelper = unohelper.ImplementationHelper()

    def implementation(component_name, *services):
        def decorator(cls):
            g_ImplementationHelper.addImplementation(cls, component_name, services)
            return cls
        return decorator


    @implementation('hwp5.Detector', 'com.sun.star.document.ExtendedTypeDetection')
    class Detector(unokit.Base, XExtendedFilterDetection):

        @log_exception
        @unokit.component_context
        def detect(self, mediadesc):
            from hwp5_uno import typedetect

            logger.info('hwp5.Detector detect()')

            desc = propseq_to_dict(mediadesc)
            for k, v in desc.items():
                logger.debug('\t%s: %s', k, v)

            inputstream = desc['InputStream']

            typename = typedetect(inputstream)

            logger.info('hwp5.Detector: %s detected.', typename)
            return typename, mediadesc


    @implementation('hwp5.Importer', 'com.sun.star.document.ImportFilter')
    class Importer(unokit.Base, XInitialization, XFilter, XImporter):

        @log_exception
        @unokit.component_context
        def initialize(self, args):
            logger.debug('Importer initialize: %s', args)

        @log_exception
        @unokit.component_context
        def setTargetDocument(self, target):
            logger.debug('Importer setTargetDocument: %s', target)
            self.target = target

        @log_exception
        @unokit.component_context
        def filter(self, mediadesc):
            from hwp5.dataio import ParseError
            from hwp5_uno import HwpFileFromInputStream
            from hwp5_uno import load_hwp5file_into_doc

            logger.debug('Importer filter')
            desc = propseq_to_dict(mediadesc)

            logger.debug('mediadesc: %s', str(desc.keys()))
            for k, v in desc.items():
                logger.debug('%s: %s', k, str(v))

            statusindicator = desc.get('StatusIndicator')

            inputstream = desc['InputStream']
            hwpfile = HwpFileFromInputStream(inputstream)
            try:
                load_hwp5file_into_doc(hwpfile, self.target, statusindicator)
            except ParseError as e:
                e.print_to_logger(logger)
                return False
            except Exception as e:
                logger.exception(e)
                return False
            else:
                return True

        @unokit.component_context
        def cancel(self):
            logger.debug('Importer cancel')


    @implementation('hwp5.TestJob')
    class TestJob(unokit.Base, XJobExecutor):

        @unokit.component_context
        def trigger(self, args):
            logger.debug('testjob %s', args)

            wd = args

            import os
            original_wd = os.getcwd()
            try:
                os.chdir(wd)

                from unittest import TextTestRunner
                testrunner = TextTestRunner()

                from unittest import TestSuite
                testrunner.run(TestSuite(self.tests()))
            finally:
                os.chdir(original_wd)

        def tests(self):
            from unittest import defaultTestLoader
            yield defaultTestLoader.loadTestsFromTestCase(DetectorTest)
            yield defaultTestLoader.loadTestsFromTestCase(ImporterTest)
            from hwp5_uno.tests import test_hwp5_uno
            yield defaultTestLoader.loadTestsFromModule(test_hwp5_uno)
            from hwp5.tests import test_suite
            yield test_suite()


    from unittest import TestCase
    class DetectorTest(TestCase):

        def test_detect(self):
            context = uno.getComponentContext()

            from hwp5.tests.fixtures import open_fixture
            f = open_fixture('sample-5017.hwp', 'rb')
            stream = InputStreamFromFileLike(f)
            mediadesc = dict_to_propseq(dict(InputStream=stream))

            svm = context.ServiceManager
            detector = svm.createInstanceWithContext('hwp5.Detector', context)
            typename, mediadesc2 = detector.detect(mediadesc)
            self.assertEqual('hwp5', typename)

    class ImporterTest(TestCase):

        def test_filter(self):
            context = uno.getComponentContext()
            from hwp5.tests.fixtures import open_fixture
            f = open_fixture('sample-5017.hwp', 'rb')
            stream = InputStreamFromFileLike(f)
            mediadesc = dict_to_propseq(dict(InputStream=stream))

            svm = context.ServiceManager
            importer = svm.createInstanceWithContext('hwp5.Importer', context)
            desktop = svm.createInstanceWithContext('com.sun.star.frame.Desktop',
                                                    context)
            doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank',
                                               0, ())

            importer.setTargetDocument(doc)
            importer.filter(mediadesc)

            text = doc.getText()

            paragraphs = text.createEnumeration()
            paragraphs = xenumeration_list(paragraphs)
            for paragraph_ix, paragraph in enumerate(paragraphs):
                logger.info('Paragraph %s', paragraph_ix)
                logger.debug('%s', paragraph)

                services = paragraph.SupportedServiceNames
                if 'com.sun.star.text.Paragraph' in services:
                    portions = xenumeration_list(paragraph.createEnumeration())
                    for portion_ix, portion in enumerate(portions):
                        logger.info('Portion %s: %s', portion_ix,
                                     portion.TextPortionType)
                        if portion.TextPortionType == 'Text':
                            logger.info('- %s', portion.getString())
                        elif portion.TextPortionType == 'Frame':
                            logger.debug('%s', portion)
                            textcontent_name = 'com.sun.star.text.TextContent'
                            en = portion.createContentEnumeration(textcontent_name)
                            contents = xenumeration_list(en)
                            for content in contents:
                                logger.debug('content: %s', content)
                                content_services = content.SupportedServiceNames
                                if ('com.sun.star.drawing.GraphicObjectShape' in
                                    content_services):
                                    logger.info('graphic url: %s',
                                                 content.GraphicURL)
                                    logger.info('graphic stream url: %s',
                                                 content.GraphicStreamURL)
                if 'com.sun.star.text.TextTable' in services:
                    pass
                else:
                    pass

            paragraph_portions = paragraphs[0].createEnumeration()
            paragraph_portions = xenumeration_list(paragraph_portions)
            self.assertEqual(u'한글 ', paragraph_portions[0].getString())

            paragraph_portions = paragraphs[16].createEnumeration()
            paragraph_portions = xenumeration_list(paragraph_portions)
            contents = paragraph_portions[1].createContentEnumeration('com.sun.star.text.TextContent')
            contents = xenumeration_list(contents)
            self.assertEqual('image/x-vclgraphic', contents[0].Bitmap.MimeType)
            #self.assertEqual('vnd.sun.star.Package:bindata/BIN0003.png',
            #                  contents[0].GraphicStreamURL)

            graphics = doc.getGraphicObjects()
            graphics = xenumeration_list(graphics.createEnumeration())
            logger.debug('graphic: %s', graphics)

            frames = doc.getTextFrames()
            frames = xenumeration_list(frames.createEnumeration())
            logger.debug('frames: %s', frames)
except Exception as e:
    logger.exception(e)
    raise


================================================
FILE: oxt/description/desc_en.txt
================================================
This extension enables you to read HWP Documents (v5 formats only).


================================================
FILE: oxt/description/desc_ko.txt
================================================
한글(HWP) 문서 (포맷 버젼 5)을 읽을 수 있습니다.


================================================
FILE: oxt/description.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<description xmlns="http://openoffice.org/extensions/description/2006"
             xmlns:d="http://openoffice.org/extensions/description/2006"
             xmlns:xlink="http://www.w3.org/1999/xlink">
  <identifier value="hwp5.oxt" />

  <version value="0.1b1" />

  <display-name>
    <name lang="en">HWP Document Format v5 Filter</name>
    <name lang="ko">HWP 문서 포맷 (버젼 5) 필터</name>
  </display-name>

  <platform value="all" />

  <dependencies>
    <OpenOffice.org-minimal-version value="3.3"/>
    <OpenOffice.org-maximal-version value="3.6"/>
  </dependencies>

  <registration>
    <simple-license accept-by="admin">
      <license-text xlink:href="registration/COPYING.txt" lang="en"/>
    </simple-license>
  </registration>

  <publisher>
    <name xlink:href="https://github.com/mete0r/pyhwp" lang="en">mete0r</name>
    <name xlink:href="https://github.com/mete0r/pyhwp" lang="ko">mete0r</name>
  </publisher>

  <extension-description>
    <src xlink:href="description/desc_ko.txt" lang="ko" />
    <src xlink:href="description/desc_en.txt" lang="en" />
  </extension-description>

</description>


================================================
FILE: oxt/doc/references.txt
================================================

http://www.openoffice.org/framework/documentation/filters/example.html
- reading of the entire filters configuration
- register a new filter

libreoffice-wiki-publisher
- how to write Types.xcu, Filter.xcu


TypeDetection:
	filter/source/config/cache/typedetection.cxx

FilterFactory:
	filter/source/config/cache/filterfactory.cxx

OwnSubFilter:
	sfx2/source/doc/ownsubfilterservice.cxx

xmloff

writer8 'Deep' DetectService: com.sun.star.text.FormatDetector
	sw/source/ui/uno/swdetect.cxx


from framework/source/loadenv/loadenv.cxx:

726│     // (iii) If a FrameLoader service (or at least
727│     //      a Filter) can be found, which supports
728│     //      this URL - it must be a loadable content.
729│     //      Because both items are registered for types
730│     //      its enough to check for frame loaders only.
731│     //      Mos of our filters are handled by our global
732│     //      default loader. But there exist some specialized
733│     //      loader, which does not work on top of filters!
734│     //      So its not enough to search on the filter configuration.
735│     //      Further its not enough to search for types!
736│     //      Because there exist some types, which are referenced by
737│     //      other objects ... but not by filters nor frame loaders!

create FrameLoaderFactory
FrameLoaderFactory.createSubSetEnumerationByProperties( "Types" = [ types... ] ) 
-> create a com.sun.star.comp.office.FrameLoader()
and FrameLoader->load(descriptor, frame)

sfx2/source/view/frmloader.cxx
SfxFrameLoaderImpl::impl_determineFilter()

sfx2/source/doc/sfxbasemodel.cxx
SfxBaseModel::load(seqArguments)
arg[0] = ''
MacroExecutionMode = 3
UpdateDocMode = 2
FileName = fullurl
Stream = stream
StatusIndicator =
Frame =
UCBContent =
FrameName =
URL =
InputStream = stream
Referer = private:user
InteractionHandler = interactionhandler
TypeName = writer8
FilterName = writer8
DocumentService = com.sun.star.text.TextDocument

SfxObjectShell::DoLoad (this=0x8ae3100, pMed=0x8d111a8) at 
/home/mete0r/prj/libreoffice/sfx2/source/doc/objstor.cxx:584

	SfxObjectShell::HandleFilter at
	/home/mete0r/prj/libreoffice/sfx2/source/doc/objstor.cxx:841

	at 647: xStorage = pMedium->GetStorage()
	at sfx2/source/doc/docfile.cxx:1303 : 
	comphelper::OStorageHelper::GetStorageFactory->createInstanceWithArguments( 
	(inputstream, embed::ElementModes::Read)

SfxObjectShell::LoadOwnFormat at
/home/mete0r/prj/libreoffice/sfx2/source/doc/objstor.cxx:2962

SwDocShell::Load() at
/home/mete0r/prj/libreoffice/sfx2/source/ui/app/docshini.cxx:540

SfxObjectShell::Load() at
/home/mete0r/prj/libreoffice/sfx2/source/doc/objstor.cxx:460

SfxObjectShell::GeneralInit_Impl() at
/home/mete0r/prj/libreoffice/sfx2/source/doc/objstor.cxx:415

SwReader::Read() at
/home/mete0r/prj/libreoffice/sfx2/source/filter/basflt/shellio.cxx

XMLReader::Read() at
/home/mete0r/prj/libreoffice/sw/source/filter/xml/swxml.cxx

line 562:
	xGraphicResolver = SvXMLGraphicHelper::Create(xStorage)
	xObjectResolver = create SvXMLEmbeddedObjectHelper(xStorage,
							   rDoc.GetPersist())

line 728
- filterargs:
	xInfoSet = create a XPropertySet
	xStatusIndicator
	xGraphicResolver = xGraphicResolver
	xObjectResolver = xObjectResolver
	aLateInitSettings = NamedValue("LateInitSettings",
					com.sun.star.document.NamedPropertyValues())

line 892
- XDocumentMetadataAccess xDMA = xModel
- baseuri = sfx2::createBaseURI(context, storage, 
  "file:///home/mete0r/prj/pyhwp/5017.odt", "");
- xDMA.loadMetadataFromStorage(storage, baseuri, interactionhandler)
	SfxBaseModel::loadMetadataFromStorage() at 
	sfx2/source/doc/sfxbasemodel.cxx:4325
	DocumentMetadataAccess::loadMetadataFromStorage() at
	sfx2/source/doc/DocumentMetadataAccess.cxx:1098
	- baseuri = "file:///home/mete0r/prj/pyhwp/5017.odt/"

line 922
parse streams:
	Meta.xml com.sun.star.comp.Writer.XMLOasisMetaImporter
	settings.xml com.sun.star.comp.Writer.XMLOasisSettingsImporter
	styles.xml
	content.xml

XMLReader::ReadThroughComponent() at
/home/mete0r/prj/libreoffice/sfx2/source/filter/filter/xml/swxml.cxx:142
- create ""com.sun.star.comp.Writer.XMLOasisStylesImporter" and SAX Parser
- parse styles.xml

- create ""com.sun.star.comp.Writer.XMLOasisContentImporter" and SAX Parser
- parse content.xml



그림 객체 Import

SvXMLImport 초기화

SvXMLImport::initialize() (from SwXMLImport)
- BaseURI: file:///home/mete0r/prj/pyhwp/5017.odt -> mpImpl->aBaseURL/aDocBaseURL
- StreamRelPath: '' -> sRelPath
- StreamName: 'styles.xml' -> sName

ResolveGraphicObjectURL()이 호출되는 건 XMLOasisContentImporter


[xxx.odt, 5017.odt]
in xmloff/source/text/XMLTextFrameContext.cxx:1418
XMLTextCreateFrameContext::CreateChildContext()

at line 1450:
pContext = GetImport().GetShapeImport()
		->CreateFrameChildContext(rLocalName='image'...)
pContext: an instance of SvXMLImportContext
m_xImplContext = pContext

[xxx.odt]
in XMLTextFrameContext_Impl::Create()
sHRef: "Picture/123.jpg"

in xmloff/source/text/XMLTextFrameContext.cxx:566
create an instance of "com.sun.star.text.GraphicObject" and get PropertySet

get XMLTextImportHelper

at line 724:
sHRef = GetImport().ResolveGraphicObjectURL(sHRef, load_on_demand = true)
sHRef: "vnd.sun.star.Package:Picture/123.jpg"

at line 758:
xTxtCntnt = xPropSet
xTextImportHelper->insertTextContent(xTxtCntnt)



[5017.odt]:

GetImport() : an instance of SvXMLImport
SvXMLImport has a mxGraphicResolver
mxGraphicResolver: XGraphicObjectResolver

#1  0x038e4dc1 in SvXMLImport::startElement (this=0x9620f80, rName="draw:image", xAttrList=...) at /home/mete0r/prj/libreoffice/xmloff/source/core/xmlimp.cxx:647
	#0  XMLTextFrameContext::CreateChildContext (this=0x9515558, p_nPrefix=4, rLocalName="image", xAttrList=...) at /home/mete0r/prj/libreoffice/xmloff/source/text/XMLTextFrameContext.cxx:1418
		namespace: draw (XML_TEXT_FRAME_GRAPHIC)
		m_HasAutomaticStyleWithoutParentStyle = 1
		at 1450: pContext = GetImport()->GetShapeImport()->CreateFrameChildChildContext()
			#0  XMLShapeImportHelper::CreateFrameChildContext (this=0x8fc3ab0, rImport=..., p_nPrefix=4, rLocalName="image", rAttrList=..., rShapes=..., rFrameAttrList=...) at /home/mete0r/prj/libreoffice/xmloff/source/draw/shapeimport.cxx:689
				pContext = new SdXMLGraphicObjectShapeContext()
				at 734: pContext->processAttribute() for attr in xAttrList
					href: 'bindata/BIN0002.jpg' --> maURL
					style-name: 'DrawFrame-1'
					x: '111.73pt'
					y: '4.9pt'
					anchor-type: 'paragraph'
					z-index: '2'
					width: 57.68mm
					height: 34.61mm

		returns

#1  0x038e4dc1 in SvXMLImport::startElement (this=0x9620f80, rName="draw:image", xAttrList=...) at /home/mete0r/prj/libreoffice/xmloff/source/core/xmlimp.cxx:687
	#3  0x0395b743 in SdXMLGraphicObjectShapeContext::StartElement (this=0x95bca30)
		at /home/mete0r/prj/libreoffice/xmloff/source/draw/ximpshap.cxx:2362
			pService: "com.sun.star.drawing.GraphicShapeObject"
			#2  0x039576e9 in SdXMLShapeContext::AddShape (this=0x95bca30, pServiceName=0x3a97430 "com.sun.star.drawing.GraphicObjectShape") at /home/mete0r/prj/libreoffice/xmloff/source/draw/ximpshap.cxx:523
				xShape = createInstance of pServiceName
			#1  0x03957063 in SdXMLShapeContext::AddShape (this=0x95bca30, xShape=...)
				XMLShapeImportHelper = GetImport().GetShapeImport()
				at /home/mete0r/prj/libreoffice/xmloff/source/draw/ximpshap.cxx:446
			#0  XMLTextShapeImportHelper::addShape (this=0x8e85588, rShape=..., xAttrList=..., rShapes=...)
				rImport: maybe TextDocument
				xTxtImport = rImport.GetTextImport() at line 94

				at /home/mete0r/prj/libreoffice/xmloff/source/text/XMLTextShapeImportHelper.cxx:140
				XTextContent->InsertTextContent()
		at 2388
			mbIsPlaceholder: false
			maURL: 'bindata/BIN0002.jpg'
			aAny = GetImport().ResolveGraphicObjectURL( maURL, GetImport().isGraphicLoadOnDemandSupported() )
			aAny: 'vnd.sun.star.Package:bindata/BIN0002.jpg'
			mxShape.setPropertyValue('GraphicURL', aAny)
			mxShape.setPropertyValue('GraphicStreamURL', aAny)


[xxx.odt]:
#1  0x038e4dc1 in SvXMLImport::startElement (this=0x9620f80, rName="draw:image", xAttrList=...) at /home/mete0r/prj/libreoffice/xmloff/source/core/xmlimp.cxx:647
	#0  XMLTextFrameContext::CreateChildContext (this=0x9515558, p_nPrefix=4, rLocalName="image", xAttrList=...) at /home/mete0r/prj/libreoffice/xmloff/source/text/XMLTextFrameContext.cxx:1418
		namespace: draw (XML_TEXT_FRAME_GRAPHIC)
		m_HasAutomaticStyleWithoutParentStyle = 0

		at line 1492
		pContext = new XMLTextFrameContext_Impl()
	#1  0x03a180c8 in XMLTextFrameContext_Impl (this=0x93cd8a0, rImport=..., nPrfx=<value optimized out>, rLName="image", rAttrList=..., eATyp=com::sun::star::text::TextContentAnchorType_AT_PARAGRAPH, nNewType=2, rFrameAttrList=...) at /home/mete0r/prj/libreoffice/xmloff/source/text/XMLTextFrameContext.cxx:1067
	#0  XMLTextFrameContext_Impl::Create (this=0x93cd8a0) at /home/mete0r/prj/libreoffice/xmloff/source/text/XMLTextFrameContext.cxx:758
		nType = 2
		XMLTextImportHeler xTextImportHelper.InsertTextContent()
		sHRef = 'vnd.sun.star.Package:Pictures/1234...1234.jpg'



sdr::contact::ViewObjectContactOfGraphic::doAsynchGraphicLoading() 에서부터 이미지 로딩


1. ODT 패키지를 로딩할 때, 패키지에 포함된 그림 파일들을 바로 이어서 로딩하거나, LoadOnDemand 할 수 있음.
   SvXMLImport::ResolveGraphicObjectURL(url, loadondemand) 참조.

   그런데 SdXMLGraphicObjectShapeContext::StartElement()는 (line 2388 부근에서) SvXMLImport::ResolveGraphicObjectURL을 호출할 때
   SvXMLImport::IsGraphicLoadOnDemandSupported()를 호출하는데, SvXMLImport는 기본값으로 true를 반환하며, SwXMLImport도 마찬가지인 듯 하다.

   그래서 패키지를 처음 로딩할 때 이미지가 로딩되지 않고, 이후에 UI에서 on demand로 이미지를 로딩하는 듯 하다.
   (sdr::contact::ViewObjectContactOfGraphic::doAsynchGraphicLoading()에서부터 추적)

   그런데 실제로는 load on demand 과정에서 실패하는데, Storage에서 그림 스트림을 얻어내는 과정에서 실패한다.
   (comphelper::OStorageHelper::GetStreamAtPackageURL()에서부터 추적)
   
   일단 패키지 Storage가 (hwp에서 odt로 변환한) 임시 파일에 기반해 있기 때문에
   추후 on demand 과정에서는 이 파일이 이미 사라졌기 때문이 아닌가 추측해볼 수 있는데,
   hwp5file_convert_to_odtpkg_file()에서 임시파일 대신 특정한 위치에 고정된 파일을 만들어서
   실험해봤을 때도 역시 그림 스트림을 얻어내는데서 실패하는 것으로 보아, 다른 이유일 수도 있음.

2. on demand 로딩을 포기하고 content.xml을 로딩하면서 그림들도 함께 로딩되도록 하면, 그림들이 제대로 로딩되는 것을
   확인할 수 있다:

   com.sun.star.comp.Writer.XMLOasisContentImporter를 초기화할 때, 필터 인자로 graphic resolver를 다음처럼 초기화하여 넘겨준다.

   createInstanceWithArguments('com.sun.star.comp.Svx.GraphicImportHelper', (storage,))
   
   그리고 디버거상에서 SvXMLImporter::initialize()를 수행한 뒤, mbIsGraphicLoadOnDemandSupported = false로 강제로
   설정
Download .txt
gitextract_0w5mfwgg/

├── .gitattributes
├── .github/
│   └── dependabot.yml
├── .gitignore
├── .travis.yml
├── CHANGES
├── COPYING
├── MANIFEST.in
├── Makefile
├── README
├── VERSION.txt
├── buildout.cfg
├── buildouts/
│   ├── components/
│   │   ├── jxml.cfg
│   │   ├── virtualenv-1.9.1.cfg
│   │   ├── virtualenv-jython.cfg
│   │   ├── xalan-j-2.7.1.cfg
│   │   └── xalan-j-2.7.2.cfg
│   ├── developer.cfg
│   ├── maintainer.cfg
│   ├── tester.cfg
│   ├── translator.cfg
│   └── user.cfg
├── classifiers.txt
├── docs/
│   ├── .gitignore
│   ├── Makefile
│   ├── conf.py
│   ├── converters.rst
│   ├── hacking/
│   │   ├── directory-layout/
│   │   │   ├── bin.rst
│   │   │   └── root.rst
│   │   ├── directory-layout.rst
│   │   ├── hack-n-test.rst
│   │   ├── index.rst
│   │   └── setup-env.rst
│   ├── hwp5.rst
│   ├── hwp5proc.rst
│   ├── index.rst
│   ├── static/
│   │   └── .gitignore
│   ├── templates/
│   │   └── .gitignore
│   └── translated/
│       ├── en/
│       │   └── LC_MESSAGES/
│       │       ├── converters.po
│       │       ├── hwp5proc.po
│       │       ├── index.po
│       │       └── intro.po
│       └── ko/
│           └── LC_MESSAGES/
│               ├── converters.po
│               ├── hwp5proc.po
│               ├── index.po
│               └── intro.po
├── etc/
│   ├── pylint.rc
│   └── testlog.conf
├── ez_setup.py
├── misc/
│   ├── cleanup-pyc.py
│   ├── copylxml.py
│   ├── docs-upload
│   ├── fix-coverage.py
│   ├── install-lxml.py.in
│   ├── mkdir.py
│   ├── oxt-build.in
│   ├── prepare-hwp5-xsl-fixtures.py
│   ├── redirect.py
│   ├── test-cli.in
│   ├── test-cli.py
│   ├── test-coverage
│   ├── test-for-bisect
│   ├── test-in-lo.py
│   ├── test-pypi.in
│   ├── test-sdist
│   ├── test-sdist.in
│   ├── test-upload.in
│   ├── test-xsl.in
│   └── upload
├── notebooks/
│   └── .gitignore
├── oxt/
│   ├── Addons.xcu
│   ├── Filter.xcu
│   ├── META-INF/
│   │   └── manifest.xml
│   ├── Makefile
│   ├── Types.xcu
│   ├── components.py
│   ├── description/
│   │   ├── desc_en.txt
│   │   └── desc_ko.txt
│   ├── description.xml
│   ├── doc/
│   │   └── references.txt
│   └── registration/
│       └── COPYING.txt
├── pyhwp_uno/
│   ├── hwp5_uno/
│   │   ├── __init__.py
│   │   └── tests/
│   │       ├── __init__.py
│   │       └── test_hwp5_uno.py
│   └── setup.py
├── release-hooks/
│   ├── prerelease.after/
│   │   └── 10-docs-build
│   ├── prerelease.before/
│   │   └── 0-docs-update-po
│   ├── release.after/
│   │   ├── 10-test-pypi
│   │   └── 20-docs-upload
│   └── release.before/
│       └── 20-upload-to-testpypi
├── requirements/
│   ├── dev.in
│   ├── dev.txt
│   ├── docs.in
│   ├── docs.txt
│   ├── lint.in
│   ├── lint.txt
│   ├── test.in
│   └── test.txt
├── requirements.in
├── requirements.txt
├── setup.cfg
├── setup.py
├── src/
│   ├── README.rst
│   └── hwp5/
│       ├── __init__.py
│       ├── binmodel/
│       │   ├── __init__.py
│       │   ├── _shared.py
│       │   ├── controlchar.py
│       │   ├── controls/
│       │   │   ├── __init__.py
│       │   │   ├── _shared.py
│       │   │   ├── bookmark_control.py
│       │   │   ├── columns_def.py
│       │   │   ├── common_controls.py
│       │   │   ├── dutmal.py
│       │   │   ├── field.py
│       │   │   ├── gshape_object_control.py
│       │   │   ├── header_footer.py
│       │   │   ├── hidden_comment.py
│       │   │   ├── index_marker.py
│       │   │   ├── note.py
│       │   │   ├── numbering.py
│       │   │   ├── page_hide.py
│       │   │   ├── page_number_position.py
│       │   │   ├── page_odd_even.py
│       │   │   ├── section_def.py
│       │   │   ├── table_control.py
│       │   │   └── tcps_control.py
│       │   ├── tagid16_document_properties.py
│       │   ├── tagid17_id_mappings.py
│       │   ├── tagid18_bin_data.py
│       │   ├── tagid19_face_name.py
│       │   ├── tagid20_border_fill.py
│       │   ├── tagid21_char_shape.py
│       │   ├── tagid22_tab_def.py
│       │   ├── tagid23_numbering.py
│       │   ├── tagid24_bullet.py
│       │   ├── tagid25_para_shape.py
│       │   ├── tagid26_style.py
│       │   ├── tagid27_doc_data.py
│       │   ├── tagid28_distribute_doc_data.py
│       │   ├── tagid30_compatible_document.py
│       │   ├── tagid31_layout_compatibility.py
│       │   ├── tagid32_unknown.py
│       │   ├── tagid50_para_header.py
│       │   ├── tagid51_para_text.py
│       │   ├── tagid52_para_char_shape.py
│       │   ├── tagid53_para_line_seg.py
│       │   ├── tagid54_para_range_tag.py
│       │   ├── tagid55_ctrl_header.py
│       │   ├── tagid56_list_header.py
│       │   ├── tagid57_page_def.py
│       │   ├── tagid58_footnote_shape.py
│       │   ├── tagid59_page_border_fill.py
│       │   ├── tagid60_shape_component.py
│       │   ├── tagid61_table.py
│       │   ├── tagid62_shape_component_line.py
│       │   ├── tagid63_shape_component_rectangle.py
│       │   ├── tagid64_shape_component_ellipse.py
│       │   ├── tagid65_shape_component_arc.py
│       │   ├── tagid66_shape_component_polygon.py
│       │   ├── tagid67_shape_component_curve.py
│       │   ├── tagid68_shape_component_ole.py
│       │   ├── tagid69_shape_component_picture.py
│       │   ├── tagid70_shape_component_container.py
│       │   ├── tagid71_ctrl_data.py
│       │   ├── tagid72_ctrl_eqedit.py
│       │   ├── tagid74_shape_component_textart.py
│       │   ├── tagid75_form_object.py
│       │   ├── tagid76_memo_shape.py
│       │   ├── tagid77_memo_list.py
│       │   ├── tagid78_forbidden_char.py
│       │   ├── tagid79_chart_data.py
│       │   └── tagid99_shape_component_unknown.py
│       ├── binspec.py
│       ├── bintype.py
│       ├── charsets.py
│       ├── cli.py
│       ├── compressed.py
│       ├── dataio.py
│       ├── distdoc.py
│       ├── errors.py
│       ├── filestructure.py
│       ├── hwp5html.py
│       ├── hwp5odt.py
│       ├── hwp5proc.py
│       ├── hwp5txt.py
│       ├── hwp5view.py
│       ├── importhelper.py
│       ├── locale/
│       │   ├── hwp5html.pot
│       │   ├── hwp5odt.pot
│       │   ├── hwp5proc.pot
│       │   ├── hwp5txt.pot
│       │   ├── hwp5view.pot
│       │   └── ko/
│       │       └── LC_MESSAGES/
│       │           ├── hwp5html.po
│       │           ├── hwp5odt.po
│       │           ├── hwp5proc.po
│       │           ├── hwp5txt.po
│       │           └── hwp5view.po
│       ├── msoleprops.py
│       ├── odf-relaxng/
│       │   ├── OpenDocument-manifest-schema-v1.0-os.rng
│       │   ├── OpenDocument-manifest-schema-v1.1.rng
│       │   ├── OpenDocument-schema-v1.0-os.rng
│       │   ├── OpenDocument-schema-v1.1.rng
│       │   ├── OpenDocument-strict-schema-v1.1.rng
│       │   ├── OpenDocument-v1.2-os-dsig-schema.rng
│       │   ├── OpenDocument-v1.2-os-manifest-schema.rng
│       │   ├── OpenDocument-v1.2-os-metadata.owl
│       │   ├── OpenDocument-v1.2-os-package-metadata.owl
│       │   └── OpenDocument-v1.2-os-schema.rng
│       ├── plat/
│       │   ├── __init__.py
│       │   ├── _lxml.py
│       │   ├── _uno/
│       │   │   ├── __init__.py
│       │   │   ├── adapters.py
│       │   │   ├── services.py
│       │   │   └── ucb.py
│       │   ├── gir_gsf.py
│       │   ├── javax_transform.py
│       │   ├── jython_poifs.py
│       │   ├── olefileio.py
│       │   ├── xmllint.py
│       │   └── xsltproc.py
│       ├── proc/
│       │   ├── __init__.py
│       │   ├── cat.py
│       │   ├── diststream.py
│       │   ├── find.py
│       │   ├── header.py
│       │   ├── ls.py
│       │   ├── models.py
│       │   ├── rawunz.py
│       │   ├── records.py
│       │   ├── summaryinfo.py
│       │   ├── unpack.py
│       │   ├── version.py
│       │   └── xml.py
│       ├── recordstream.py
│       ├── storage/
│       │   ├── __init__.py
│       │   ├── fs.py
│       │   └── ole.py
│       ├── summaryinfo.py
│       ├── tagids.py
│       ├── transforms/
│       │   └── __init__.py
│       ├── treeop.py
│       ├── utils.py
│       ├── xmldump_flat.py
│       ├── xmlformat.py
│       ├── xmlmodel.py
│       ├── xsl/
│       │   ├── binspec2html.xsl
│       │   ├── hwp5css-common.xsl
│       │   ├── hwp5css.xsl
│       │   ├── hwp5fodt.xsl
│       │   ├── hwp5html.xsl
│       │   ├── odt/
│       │   │   ├── common.xsl
│       │   │   ├── content.xsl
│       │   │   ├── document.xsl
│       │   │   └── styles.xsl
│       │   └── plaintext.xsl
│       └── zlib_raw_codec.py
├── stdeb.cfg
├── tests/
│   ├── README.rst
│   ├── cli_tests/
│   │   ├── hwp5html.txt
│   │   ├── hwp5odt.txt
│   │   ├── hwp5proc.txt
│   │   └── hwp5txt.txt
│   ├── hwp5_cli_tests.sh
│   ├── hwp5_tests/
│   │   ├── __init__.py
│   │   ├── fixtures/
│   │   │   ├── 5006-controldata.record
│   │   │   ├── __init__.py
│   │   │   ├── aligns.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── aligns.hwp
│   │   │   ├── aligns.hwp.bodytext.section0.json
│   │   │   ├── aligns.hwp.docinfo.json
│   │   │   ├── aligns.hwp.formatted.xml
│   │   │   ├── aligns.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── borderfill.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── borderfill.hwp
│   │   │   ├── borderfill.hwp.bodytext.section0.json
│   │   │   ├── borderfill.hwp.docinfo.json
│   │   │   ├── borderfill.hwp.formatted.xml
│   │   │   ├── borderfill.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── charshape.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── charshape.hwp
│   │   │   ├── charshape.hwp.bodytext.section0.json
│   │   │   ├── charshape.hwp.docinfo.json
│   │   │   ├── charshape.hwp.formatted.xml
│   │   │   ├── charshape.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── charstyle.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── charstyle.hwp
│   │   │   ├── charstyle.hwp.bodytext.section0.json
│   │   │   ├── charstyle.hwp.docinfo.json
│   │   │   ├── charstyle.hwp.formatted.xml
│   │   │   ├── charstyle.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── facename.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── facename.hwp
│   │   │   ├── facename.hwp.bodytext.section0.json
│   │   │   ├── facename.hwp.docinfo.json
│   │   │   ├── facename.hwp.formatted.xml
│   │   │   ├── facename.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── facename2.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── facename2.hwp
│   │   │   ├── facename2.hwp.bodytext.section0.json
│   │   │   ├── facename2.hwp.docinfo.json
│   │   │   ├── facename2.hwp.formatted.xml
│   │   │   ├── facename2.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── footnote-endnote.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── footnote-endnote.hwp
│   │   │   ├── footnote-endnote.hwp.bodytext.section0.json
│   │   │   ├── footnote-endnote.hwp.docinfo.json
│   │   │   ├── footnote-endnote.hwp.formatted.xml
│   │   │   ├── footnote-endnote.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── headerfooter.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── headerfooter.hwp
│   │   │   ├── headerfooter.hwp.bodytext.section0.json
│   │   │   ├── headerfooter.hwp.docinfo.json
│   │   │   ├── headerfooter.hwp.formatted.xml
│   │   │   ├── headerfooter.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.hwp
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.hwp.bodytext.section0.json
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.hwp.docinfo.json
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.hwp.formatted.xml
│   │   │   ├── issue144-fields-crossing-lineseg-boundary.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── issue30.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── issue30.hwp
│   │   │   ├── issue30.hwp.bodytext.section0.json
│   │   │   ├── issue30.hwp.docinfo.json
│   │   │   ├── issue30.hwp.formatted.xml
│   │   │   ├── issue30.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── linespacing.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── linespacing.hwp
│   │   │   ├── linespacing.hwp.bodytext.section0.json
│   │   │   ├── linespacing.hwp.docinfo.json
│   │   │   ├── linespacing.hwp.formatted.xml
│   │   │   ├── linespacing.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── lists-bullet.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── lists-bullet.hwp
│   │   │   ├── lists-bullet.hwp.bodytext.section0.json
│   │   │   ├── lists-bullet.hwp.docinfo.json
│   │   │   ├── lists-bullet.hwp.formatted.xml
│   │   │   ├── lists-bullet.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── lists.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── lists.hwp
│   │   │   ├── lists.hwp.bodytext.section0.json
│   │   │   ├── lists.hwp.docinfo.json
│   │   │   ├── lists.hwp.formatted.xml
│   │   │   ├── lists.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── matrix.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── matrix.hwp
│   │   │   ├── matrix.hwp.bodytext.section0.json
│   │   │   ├── matrix.hwp.docinfo.json
│   │   │   ├── matrix.hwp.formatted.xml
│   │   │   ├── matrix.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── multicolumns-in-common-controls.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── multicolumns-in-common-controls.hwp
│   │   │   ├── multicolumns-in-common-controls.hwp.bodytext.section0.json
│   │   │   ├── multicolumns-in-common-controls.hwp.docinfo.json
│   │   │   ├── multicolumns-in-common-controls.hwp.formatted.xml
│   │   │   ├── multicolumns-in-common-controls.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── multicolumns-layout.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── multicolumns-layout.hwp
│   │   │   ├── multicolumns-layout.hwp.bodytext.section0.json
│   │   │   ├── multicolumns-layout.hwp.docinfo.json
│   │   │   ├── multicolumns-layout.hwp.formatted.xml
│   │   │   ├── multicolumns-layout.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── multicolumns-widths.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── multicolumns-widths.hwp
│   │   │   ├── multicolumns-widths.hwp.bodytext.section0.json
│   │   │   ├── multicolumns-widths.hwp.docinfo.json
│   │   │   ├── multicolumns-widths.hwp.formatted.xml
│   │   │   ├── multicolumns-widths.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── multicolumns.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── multicolumns.hwp
│   │   │   ├── multicolumns.hwp.bodytext.section0.json
│   │   │   ├── multicolumns.hwp.docinfo.json
│   │   │   ├── multicolumns.hwp.formatted.xml
│   │   │   ├── multicolumns.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── nonhwp5stg/
│   │   │   │   └── dummy
│   │   │   ├── nonole.txt
│   │   │   ├── pagedefs.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── pagedefs.hwp
│   │   │   ├── pagedefs.hwp.bodytext.section0.json
│   │   │   ├── pagedefs.hwp.docinfo.json
│   │   │   ├── pagedefs.hwp.formatted.xml
│   │   │   ├── pagedefs.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── paragraph-split-page.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── paragraph-split-page.hwp
│   │   │   ├── paragraph-split-page.hwp.bodytext.section0.json
│   │   │   ├── paragraph-split-page.hwp.docinfo.json
│   │   │   ├── paragraph-split-page.hwp.formatted.xml
│   │   │   ├── paragraph-split-page.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── parashape.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── parashape.hwp
│   │   │   ├── parashape.hwp.bodytext.section0.json
│   │   │   ├── parashape.hwp.docinfo.json
│   │   │   ├── parashape.hwp.formatted.xml
│   │   │   ├── parashape.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── password-12345.hwp
│   │   │   ├── sample-5017-pics.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── sample-5017-pics.hwp
│   │   │   ├── sample-5017-pics.hwp.bodytext.section0.json
│   │   │   ├── sample-5017-pics.hwp.docinfo.json
│   │   │   ├── sample-5017-pics.hwp.formatted.xml
│   │   │   ├── sample-5017-pics.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── sample-5017.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── sample-5017.hwp
│   │   │   ├── sample-5017.hwp.bodytext.section0.json
│   │   │   ├── sample-5017.hwp.docinfo.json
│   │   │   ├── sample-5017.hwp.formatted.xml
│   │   │   ├── sample-5017.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shapecomponent-rect-fill.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shapecomponent-rect-fill.hwp
│   │   │   ├── shapecomponent-rect-fill.hwp.bodytext.section0.json
│   │   │   ├── shapecomponent-rect-fill.hwp.docinfo.json
│   │   │   ├── shapecomponent-rect-fill.hwp.formatted.xml
│   │   │   ├── shapecomponent-rect-fill.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shapecontainer-2.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shapecontainer-2.hwp
│   │   │   ├── shapecontainer-2.hwp.bodytext.section0.json
│   │   │   ├── shapecontainer-2.hwp.docinfo.json
│   │   │   ├── shapecontainer-2.hwp.formatted.xml
│   │   │   ├── shapecontainer-2.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shapeline.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shapeline.hwp
│   │   │   ├── shapeline.hwp.bodytext.section0.json
│   │   │   ├── shapeline.hwp.docinfo.json
│   │   │   ├── shapeline.hwp.formatted.xml
│   │   │   ├── shapeline.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shapepict-scaled.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shapepict-scaled.hwp
│   │   │   ├── shapepict-scaled.hwp.bodytext.section0.json
│   │   │   ├── shapepict-scaled.hwp.docinfo.json
│   │   │   ├── shapepict-scaled.hwp.formatted.xml
│   │   │   ├── shapepict-scaled.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── shaperect.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── shaperect.hwp
│   │   │   ├── shaperect.hwp.bodytext.section0.json
│   │   │   ├── shaperect.hwp.docinfo.json
│   │   │   ├── shaperect.hwp.formatted.xml
│   │   │   ├── shaperect.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── tabdef.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── tabdef.hwp
│   │   │   ├── tabdef.hwp.bodytext.section0.json
│   │   │   ├── tabdef.hwp.docinfo.json
│   │   │   ├── tabdef.hwp.formatted.xml
│   │   │   ├── tabdef.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── table-caption.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── table-caption.hwp
│   │   │   ├── table-caption.hwp.bodytext.section0.json
│   │   │   ├── table-caption.hwp.docinfo.json
│   │   │   ├── table-caption.hwp.formatted.xml
│   │   │   ├── table-caption.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── table-position.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── table-position.hwp
│   │   │   ├── table-position.hwp.bodytext.section0.json
│   │   │   ├── table-position.hwp.docinfo.json
│   │   │   ├── table-position.hwp.formatted.xml
│   │   │   ├── table-position.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── table.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── table.hwp
│   │   │   ├── table.hwp.bodytext.section0.json
│   │   │   ├── table.hwp.docinfo.json
│   │   │   ├── table.hwp.formatted.xml
│   │   │   ├── table.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── textbox.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── textbox.hwp
│   │   │   ├── textbox.hwp.bodytext.section0.json
│   │   │   ├── textbox.hwp.docinfo.json
│   │   │   ├── textbox.hwp.formatted.xml
│   │   │   ├── textbox.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── underline-styles.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── underline-styles.hwp
│   │   │   ├── underline-styles.hwp.bodytext.section0.json
│   │   │   ├── underline-styles.hwp.docinfo.json
│   │   │   ├── underline-styles.hwp.formatted.xml
│   │   │   ├── underline-styles.odt.d/
│   │   │   │   ├── META-INF/
│   │   │   │   │   └── manifest.xml
│   │   │   │   ├── content.xml
│   │   │   │   ├── manifest.rdf
│   │   │   │   ├── mimetype
│   │   │   │   └── styles.xml
│   │   │   ├── viewtext.html.d/
│   │   │   │   ├── index.formatted.xhtml
│   │   │   │   ├── index.xhtml
│   │   │   │   └── styles.css
│   │   │   ├── viewtext.hwp
│   │   │   ├── viewtext.hwp.bodytext.section0.json
│   │   │   ├── viewtext.hwp.docinfo.json
│   │   │   ├── viewtext.hwp.formatted.xml
│   │   │   └── viewtext.odt.d/
│   │   │       ├── META-INF/
│   │   │       │   └── manifest.xml
│   │   │       ├── content.xml
│   │   │       ├── manifest.rdf
│   │   │       ├── mimetype
│   │   │       └── styles.xml
│   │   ├── mixin_olestg.py
│   │   ├── mixin_relaxng.py
│   │   ├── mixin_xslt.py
│   │   ├── test_binmodel.py
│   │   ├── test_bintype.py
│   │   ├── test_compressed.py
│   │   ├── test_dataio.py
│   │   ├── test_distdoc.py
│   │   ├── test_filestructure.py
│   │   ├── test_hwp5html.py
│   │   ├── test_hwp5odt.py
│   │   ├── test_odtxsl.py
│   │   ├── test_ole.py
│   │   ├── test_plat_gir_gsf.py
│   │   ├── test_plat_javax_transform.py
│   │   ├── test_plat_jython_poifs.py
│   │   ├── test_plat_lxml.py
│   │   ├── test_plat_olefileio.py
│   │   ├── test_plat_uno.py
│   │   ├── test_plat_xmllint.py
│   │   ├── test_plat_xsltproc.py
│   │   ├── test_recordstream.py
│   │   ├── test_storage.py
│   │   ├── test_treeop.py
│   │   ├── test_utils.py
│   │   ├── test_xmlformat.py
│   │   └── test_xmlmodel.py
│   ├── hwp5_xsl_tests/
│   │   ├── odt-common.xml
│   │   ├── odt-content.xml
│   │   └── odt-styles.xml
│   └── setup.py
├── tools/
│   ├── README.rst
│   ├── constants/
│   │   ├── pyhwp_dev_constants.py
│   │   └── setup.py
│   ├── discover.lo/
│   │   ├── discover_lo.py
│   │   └── setup.py
│   ├── discover.lxml/
│   │   ├── discover_lxml.py
│   │   └── setup.py
│   ├── discover.python/
│   │   ├── discover_python.py
│   │   └── setup.py
│   ├── download/
│   │   ├── pyhwp_download.py
│   │   └── setup.py
│   ├── egg.path/
│   │   ├── egg_path.py
│   │   └── setup.py
│   ├── gpl/
│   │   ├── gpl/
│   │   │   ├── Pysec.py
│   │   │   ├── __init__.py
│   │   │   ├── parsers.py
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       └── test_gpl.py
│   │   └── setup.py
│   ├── jingodf/
│   │   ├── jingodf/
│   │   │   ├── __init__.py
│   │   │   └── schema/
│   │   │       ├── OpenDocument-manifest-schema-v1.0-os.rng
│   │   │       ├── OpenDocument-manifest-schema-v1.1.rng
│   │   │       ├── OpenDocument-schema-v1.0-os.rng
│   │   │       ├── OpenDocument-schema-v1.1.rng
│   │   │       ├── OpenDocument-strict-schema-v1.1.rng
│   │   │       ├── OpenDocument-v1.2-os-dsig-schema.rng
│   │   │       ├── OpenDocument-v1.2-os-manifest-schema.rng
│   │   │       ├── OpenDocument-v1.2-os-metadata.owl
│   │   │       ├── OpenDocument-v1.2-os-package-metadata.owl
│   │   │       └── OpenDocument-v1.2-os-schema.rng
│   │   └── setup.py
│   ├── jxml/
│   │   ├── jxml/
│   │   │   ├── __init__.py
│   │   │   └── etree/
│   │   │       └── __init__.py
│   │   ├── jxml.coverage/
│   │   │   ├── jxml_coverage.py
│   │   │   └── setup.py
│   │   ├── lxml/
│   │   │   ├── lxml/
│   │   │   │   ├── __init__.py
│   │   │   │   └── etree/
│   │   │   │       └── __init__.py
│   │   │   └── setup.py
│   │   ├── setup.py
│   │   └── tests/
│   │       ├── Makefile
│   │       ├── hello.xml
│   │       ├── sample.xml
│   │       ├── test_jaxp.py
│   │       ├── test_lxml.py
│   │       ├── text-output.xsl
│   │       └── xsl/
│   │           ├── import-test.xsl
│   │           └── imported.xsl
│   ├── oxt.tool/
│   │   ├── oxt_tool/
│   │   │   ├── __init__.py
│   │   │   ├── backend.py
│   │   │   ├── description.py
│   │   │   ├── manifest.py
│   │   │   ├── package.py
│   │   │   ├── remote.py
│   │   │   ├── storage/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── _zipfile.py
│   │   │   │   ├── fs.py
│   │   │   │   └── path.py
│   │   │   └── tests/
│   │   │       ├── __init__.py
│   │   │       ├── mixin_storage.py
│   │   │       ├── test_fs.py
│   │   │       ├── test_package.py
│   │   │       ├── test_storage_path.py
│   │   │       └── test_zipfile.py
│   │   └── setup.py
│   ├── pyhwp.zestreleaser.cmds/
│   │   ├── CHANGES
│   │   ├── COPYING
│   │   ├── README.rst
│   │   ├── pyhwp_zestreleaser_cmds.py
│   │   └── setup.py
│   ├── unpack/
│   │   ├── pyhwp_unpack.py
│   │   └── setup.py
│   └── xsltest/
│       ├── setup.py
│       └── xsltest/
│           ├── __init__.py
│           └── xmltool/
│               ├── __init__.py
│               ├── subtree.py
│               ├── wrap.py
│               └── xslt.py
├── tox.ini
├── tox.ini.in
└── unokit/
    ├── setup.py
    └── unokit/
        ├── __init__.py
        ├── adapters.py
        ├── configuration.py
        ├── contexts.py
        ├── services.py
        ├── singletons.py
        ├── tests/
        │   ├── __init__.py
        │   ├── test_configuration.py
        │   ├── test_singletons.py
        │   └── test_ucb.py
        ├── ucb.py
        └── util.py
Download .txt
SYMBOL INDEX (2236 symbols across 209 files)

FILE: ez_setup.py
  function _validate_md5 (line 69) | def _validate_md5(egg_name, data):
  function use_setuptools (line 80) | def use_setuptools(
  function download_setuptools (line 121) | def download_setuptools(
  function main (line 203) | def main(argv, version=DEFAULT_VERSION):
  function update_md5 (line 244) | def update_md5(filenames):

FILE: misc/cleanup-pyc.py
  function find_files (line 9) | def find_files(root):
  function find_pyc_files (line 20) | def find_pyc_files(root):
  function main (line 26) | def main():

FILE: misc/copylxml.py
  function main (line 5) | def main():

FILE: misc/fix-coverage.py
  function main (line 8) | def main():

FILE: misc/prepare-hwp5-xsl-fixtures.py
  function find_hwp5files (line 11) | def find_hwp5files(dir):
  function main (line 16) | def main():

FILE: misc/test-cli.py
  function main (line 9) | def main():

FILE: misc/test-in-lo.py
  function main (line 4) | def main():

FILE: oxt/components.py
  function log_exception (line 64) | def log_exception(f):
  function implementation (line 75) | def implementation(component_name, *services):
  class Detector (line 83) | class Detector(unokit.Base, XExtendedFilterDetection):
    method detect (line 87) | def detect(self, mediadesc):
  class Importer (line 105) | class Importer(unokit.Base, XInitialization, XFilter, XImporter):
    method initialize (line 109) | def initialize(self, args):
    method setTargetDocument (line 114) | def setTargetDocument(self, target):
    method filter (line 120) | def filter(self, mediadesc):
    method cancel (line 148) | def cancel(self):
  class TestJob (line 153) | class TestJob(unokit.Base, XJobExecutor):
    method trigger (line 156) | def trigger(self, args):
    method tests (line 174) | def tests(self):
  class DetectorTest (line 185) | class DetectorTest(TestCase):
    method test_detect (line 187) | def test_detect(self):
  class ImporterTest (line 200) | class ImporterTest(TestCase):
    method test_filter (line 202) | def test_filter(self):

FILE: pyhwp_uno/hwp5_uno/__init__.py
  class OleStorageAdapter (line 33) | class OleStorageAdapter(object):
    method __init__ (line 35) | def __init__(self, oless):
    method __iter__ (line 42) | def __iter__(self):
    method __getitem__ (line 45) | def __getitem__(self, name):
  class OleStorageStream (line 59) | class OleStorageStream(object):
    method __init__ (line 61) | def __init__(self, oless, name):
    method open (line 65) | def open(self):
  function HwpFileFromInputStream (line 70) | def HwpFileFromInputStream(inputstream):
  function StorageFromInputStream (line 78) | def StorageFromInputStream(inputstream):
  function XSLTTransformer (line 83) | def XSLTTransformer(stylesheet_url, source_url, source_url_base):
  function haveXSLTTransformer (line 92) | def haveXSLTTransformer():
  class OneshotEvent (line 97) | class OneshotEvent(object):
    method __init__ (line 99) | def __init__(self):
    method wait (line 105) | def wait(self):
    method signal (line 109) | def signal(self):
  class XSLTListener (line 113) | class XSLTListener(unohelper.Base, XStreamListener):
    method __init__ (line 114) | def __init__(self):
    method started (line 117) | def started(self):
    method closed (line 120) | def closed(self):
    method terminated (line 124) | def terminated(self):
    method error (line 128) | def error(self, exception):
    method disposing (line 132) | def disposing(self, source):
  function xslt_with_libreoffice (line 137) | def xslt_with_libreoffice(xsl_path, inp_path, out_path):
  function load_hwp5file_into_doc (line 169) | def load_hwp5file_into_doc(hwp5file, doc, statusindicator=None):
  function convert_hwp5file_into_odtpkg (line 176) | def convert_hwp5file_into_odtpkg(hwp5file):
  function load_odt_from_storage (line 210) | def load_odt_from_storage(doc, storage, statusindicator=None):
  function InputSourceFromStorage (line 252) | def InputSourceFromStorage(storage, streamname):
  function InputSourceFromStream (line 258) | def InputSourceFromStream(stream):
  function let_document_import_xml (line 267) | def let_document_import_xml(doc, filter, inputsource):
  function inputstream_is_hwp5file (line 274) | def inputstream_is_hwp5file(inputstream):
  function typedetect (line 286) | def typedetect(inputstream):

FILE: pyhwp_uno/hwp5_uno/tests/test_hwp5_uno.py
  class TestBase (line 5) | class TestBase(TestCase):
    method get_fixture_path (line 7) | def get_fixture_path(self, filename):
    method open_fixture (line 11) | def open_fixture(self, filename, *args, **kwargs):
  class OleStorageAdapterTest (line 16) | class OleStorageAdapterTest(TestBase):
    method get_adapter (line 18) | def get_adapter(self):
    method test_iter (line 27) | def test_iter(self):
    method test_getitem (line 34) | def test_getitem(self):
  class HwpFileFromInputStreamTest (line 55) | class HwpFileFromInputStreamTest(TestBase):
    method test_basic (line 57) | def test_basic(self):
  class StorageFromInputStreamTest (line 66) | class StorageFromInputStreamTest(TestBase):
    method test_basic (line 68) | def test_basic(self):
  class TypedetectTest (line 95) | class TypedetectTest(TestBase):
    method test_basic (line 96) | def test_basic(self):
  class LoadHwp5FileTest (line 106) | class LoadHwp5FileTest(TestBase):
    method get_paragraphs (line 108) | def get_paragraphs(self, text):
    method get_text_portions (line 112) | def get_text_portions(self, paragraph):
    method get_text_contents (line 116) | def get_text_contents(self, text_portion):
    method test_basic (line 123) | def test_basic(self):

FILE: setup.py
  function setupdir (line 27) | def setupdir(f):
  function import_setuptools (line 44) | def import_setuptools():
  function readfile (line 58) | def readfile(filename):
  function get_version (line 63) | def get_version():
  function get_long_description (line 69) | def get_long_description():
  function get_classifiers (line 74) | def get_classifiers():
  function get_install_requires (line 82) | def get_install_requires():
  class build (line 90) | class build(_build):
    method run (line 91) | def run(self):
  function main (line 196) | def main():

FILE: src/hwp5/binmodel/__init__.py
  class UnknownTagModel (line 243) | class UnknownTagModel(RecordModel):
  class Text (line 247) | class Text(object):
  function _check_tag_models (line 251) | def _check_tag_models():
  function init_record_parsing_context (line 259) | def init_record_parsing_context(base, record):
  function parse_models (line 275) | def parse_models(context, records):
  function parse_models_intern (line 280) | def parse_models_intern(context, records):
  function parse_models_with_parent (line 292) | def parse_models_with_parent(context_models):
  function parse_model (line 303) | def parse_model(context, model):
  function raise_on_errorevent (line 316) | def raise_on_errorevent(context, events):
  function resolve_models (line 334) | def resolve_models(context, records):
  function resolve_model_events (line 357) | def resolve_model_events(context, model):
  function get_extension_mro (line 398) | def get_extension_mro(cls, up_to_cls=None):
  class ModelJsonEncoder (line 406) | class ModelJsonEncoder(json.JSONEncoder):
    method default (line 408) | def default(self, obj):
  function model_to_json (line 414) | def model_to_json(model, *args, **kwargs):
  function chain_iterables (line 428) | def chain_iterables(iterables):
  class ModelStream (line 434) | class ModelStream(recordstream.RecordStream):
    method models (line 436) | def models(self, **kwargs):
    method models_treegrouped (line 452) | def models_treegrouped(self, **kwargs):
    method model (line 460) | def model(self, idx):
    method models_json (line 463) | def models_json(self, **kwargs):
    method other_formats (line 467) | def other_formats(self):
    method parse_model_events (line 472) | def parse_model_events(self):
  class DocInfo (line 499) | class DocInfo(ModelStream):
    method idmappings (line 502) | def idmappings(self):
    method facenames_by_lang (line 508) | def facenames_by_lang(self):
    method charshapes (line 521) | def charshapes(self):
    method get_charshape (line 525) | def get_charshape(self, charshape_id):
    method charshape_lang_facename (line 528) | def charshape_lang_facename(self, charshape_id, lang):
  class Sections (line 534) | class Sections(recordstream.Sections):
  class Hwp5File (line 539) | class Hwp5File(recordstream.Hwp5File):
  function create_context (line 545) | def create_context(file=None, **context):

FILE: src/hwp5/binmodel/_shared.py
  class RecordModelType (line 49) | class RecordModelType(StructType):
    method __new__ (line 51) | def __new__(mcs, name, bases, attrs):
  class RecordModel (line 60) | class RecordModel(with_metaclass(RecordModelType, object)):
  class BinStorageId (line 64) | class BinStorageId(UINT16):
  class COLORREF (line 68) | class COLORREF(with_metaclass(PrimitiveType, int)):
    method __getattr__ (line 72) | def __getattr__(self, name):
    method __str__ (line 84) | def __str__(self):
    method __repr__ (line 87) | def __repr__(self):
  class Margin (line 93) | class Margin(Struct):
    method attributes (line 94) | def attributes():
  class Coord (line 102) | class Coord(Struct):
    method attributes (line 103) | def attributes():
  class Border (line 109) | class Border(Struct):
    method attributes (line 142) | def attributes(cls):
  class BorderLine (line 149) | class BorderLine(Struct):
    method attributes (line 169) | def attributes(cls):
  class Fill (line 176) | class Fill(Struct):
  class FillNone (line 180) | class FillNone(Fill):
    method attributes (line 181) | def attributes():
  class FillColorPattern (line 186) | class FillColorPattern(Fill):
    method attributes (line 193) | def attributes(cls):
  class FillImage (line 200) | class FillImage(Fill):
    method attributes (line 227) | def attributes(cls):
  class Coord32 (line 236) | class Coord32(Struct):
    method attributes (line 237) | def attributes():
  class FillGradation (line 248) | class FillGradation(Fill):
    method attributes (line 249) | def attributes():
  function ref_parent_member (line 260) | def ref_parent_member(member_name):

FILE: src/hwp5/binmodel/controlchar.py
  class CHID (line 38) | class CHID(with_metaclass(PrimitiveType, str)):
    method decode (line 109) | def decode(bytes, context=None):
  class ControlChar (line 122) | class ControlChar(object):
    class CHAR (line 123) | class CHAR(object):
    class INLINE (line 126) | class INLINE(object):
    class EXTENDED (line 129) | class EXTENDED(object):
    method _populate (line 161) | def _populate(cls):
    method find (line 167) | def find(cls, data, start_idx):
    method decode (line 185) | def decode(cls, bytes):
    method get_kind_by_code (line 204) | def get_kind_by_code(cls, code):
    method get_name_by_code (line 209) | def get_name_by_code(cls, code):

FILE: src/hwp5/binmodel/controls/_shared.py
  class ControlType (line 34) | class ControlType(RecordModelType):
    method __new__ (line 36) | def __new__(mcs, name, bases, attrs):
  class Control (line 45) | class Control(with_metaclass(ControlType, RecordModel)):
    method attributes (line 50) | def attributes():
    method get_extension_key (line 56) | def get_extension_key(cls, context, model):

FILE: src/hwp5/binmodel/controls/bookmark_control.py
  class BookmarkControl (line 31) | class BookmarkControl(Control):
    method attributes (line 35) | def attributes():
  class BookmarkControlData (line 41) | class BookmarkControlData(ControlData):
    method attributes (line 45) | def attributes():

FILE: src/hwp5/binmodel/controls/columns_def.py
  class Column0 (line 36) | class Column0(Struct):
    method attributes (line 39) | def attributes():
  class Column (line 43) | class Column(Struct):
    method attributes (line 45) | def attributes():
  class ColumnsDef (line 50) | class ColumnsDef(Control):
    method attributes (line 62) | def attributes(cls):

FILE: src/hwp5/binmodel/controls/common_controls.py
  class CommonControl (line 34) | class CommonControl(Control):
    method attributes (line 68) | def attributes(cls):

FILE: src/hwp5/binmodel/controls/dutmal.py
  class Dutmal (line 31) | class Dutmal(Control):
    method attributes (line 38) | def attributes(cls):

FILE: src/hwp5/binmodel/controls/field.py
  class Field (line 32) | class Field(Control):
    method attributes (line 40) | def attributes(cls):
  class FieldUnknown (line 48) | class FieldUnknown(Field):
  class FieldDate (line 52) | class FieldDate(Field):
  class FieldDocDate (line 56) | class FieldDocDate(Field):
  class FieldPath (line 60) | class FieldPath(Field):
  class FieldBookmark (line 64) | class FieldBookmark(Field):
  class FieldMailMerge (line 68) | class FieldMailMerge(Field):
  class FieldCrossRef (line 72) | class FieldCrossRef(Field):
  class FieldFormula (line 76) | class FieldFormula(Field):
  class FieldClickHere (line 80) | class FieldClickHere(Field):
  class FieldClickHereData (line 84) | class FieldClickHereData(ControlData):
  class FieldSummary (line 88) | class FieldSummary(Field):
  class FieldUserInfo (line 92) | class FieldUserInfo(Field):
  class FieldHyperLink (line 96) | class FieldHyperLink(Field):
    method geturl (line 99) | def geturl(self):
  class FieldRevisionSign (line 104) | class FieldRevisionSign(Field):
  class FieldRevisionDelete (line 108) | class FieldRevisionDelete(Field):
  class FieldRevisionAttach (line 112) | class FieldRevisionAttach(Field):
  class FieldRevisionClipping (line 116) | class FieldRevisionClipping(Field):
  class FieldRevisionSawtooth (line 120) | class FieldRevisionSawtooth(Field):
  class FieldRevisionThinking (line 124) | class FieldRevisionThinking(Field):
  class FieldRevisionPraise (line 128) | class FieldRevisionPraise(Field):
  class FieldRevisionLine (line 132) | class FieldRevisionLine(Field):
  class FieldRevisionSimpleChange (line 136) | class FieldRevisionSimpleChange(Field):
  class FieldRevisionHyperlink (line 140) | class FieldRevisionHyperlink(Field):
  class FieldRevisionLineAttach (line 144) | class FieldRevisionLineAttach(Field):
  class FieldRevisionLineLink (line 148) | class FieldRevisionLineLink(Field):
  class FieldRevisionLineTransfer (line 152) | class FieldRevisionLineTransfer(Field):
  class FieldRevisionRightMove (line 156) | class FieldRevisionRightMove(Field):
  class FieldRevisionLeftMove (line 160) | class FieldRevisionLeftMove(Field):
  class FieldRevisionTransfer (line 164) | class FieldRevisionTransfer(Field):
  class FieldRevisionSimpleInsert (line 168) | class FieldRevisionSimpleInsert(Field):
  class FieldRevisionSplit (line 172) | class FieldRevisionSplit(Field):
  class FieldRevisionChange (line 176) | class FieldRevisionChange(Field):
  class FieldMemo (line 180) | class FieldMemo(Field):
  class FieldPrivateInfoSecurity (line 184) | class FieldPrivateInfoSecurity(Field):

FILE: src/hwp5/binmodel/controls/gshape_object_control.py
  class GShapeObjectControl (line 27) | class GShapeObjectControl(CommonControl):

FILE: src/hwp5/binmodel/controls/header_footer.py
  class HeaderFooter (line 30) | class HeaderFooter(Control):
    method attributes (line 36) | def attributes(cls):
  class Header (line 41) | class Header(HeaderFooter):
  class Footer (line 46) | class Footer(HeaderFooter):

FILE: src/hwp5/binmodel/controls/hidden_comment.py
  class HiddenComment (line 27) | class HiddenComment(Control):
    method attributes (line 31) | def attributes():

FILE: src/hwp5/binmodel/controls/index_marker.py
  class IndexMarker (line 29) | class IndexMarker(Control):
    method attributes (line 33) | def attributes():

FILE: src/hwp5/binmodel/controls/note.py
  class Note (line 29) | class Note(Control):
    method attributes (line 31) | def attributes():
  class FootNote (line 40) | class FootNote(Note):
  class EndNote (line 45) | class EndNote(Note):

FILE: src/hwp5/binmodel/controls/numbering.py
  class NumberingControl (line 32) | class NumberingControl(Control):
    method attributes (line 42) | def attributes(cls):
  class AutoNumbering (line 48) | class AutoNumbering(NumberingControl):
    method attributes (line 52) | def attributes(cls):
    method __unicode__ (line 58) | def __unicode__(self):
  class NewNumbering (line 67) | class NewNumbering(NumberingControl):

FILE: src/hwp5/binmodel/controls/page_hide.py
  class PageHide (line 29) | class PageHide(Control):
    method attributes (line 40) | def attributes(cls):

FILE: src/hwp5/binmodel/controls/page_number_position.py
  class PageNumberPosition (line 31) | class PageNumberPosition(Control):
    method attributes (line 43) | def attributes(cls):

FILE: src/hwp5/binmodel/controls/page_odd_even.py
  class PageOddEven (line 30) | class PageOddEven(Control):
    method attributes (line 37) | def attributes(cls):

FILE: src/hwp5/binmodel/controls/section_def.py
  class SectionDef (line 34) | class SectionDef(Control):
    method attributes (line 52) | def attributes(cls):
  class SectionDefData (line 68) | class SectionDefData(ControlData):
    method attributes (line 71) | def attributes():

FILE: src/hwp5/binmodel/controls/table_control.py
  class TableControl (line 28) | class TableControl(CommonControl):
    method on_child (line 31) | def on_child(cls, attributes, context, child):

FILE: src/hwp5/binmodel/controls/tcps_control.py
  class TCPSControl (line 28) | class TCPSControl(Control):
    method attributes (line 32) | def attributes():

FILE: src/hwp5/binmodel/tagid16_document_properties.py
  class DocumentProperties (line 29) | class DocumentProperties(RecordModel):
    method attributes (line 34) | def attributes():

FILE: src/hwp5/binmodel/tagid17_id_mappings.py
  class IdMappings (line 28) | class IdMappings(RecordModel):
    method attributes (line 33) | def attributes():

FILE: src/hwp5/binmodel/tagid18_bin_data.py
  class BinDataLink (line 35) | class BinDataLink(Struct):
    method attributes (line 36) | def attributes():
  class BinDataEmbedding (line 42) | class BinDataEmbedding(Struct):
    method attributes (line 43) | def attributes():
  class BinDataStorage (line 49) | class BinDataStorage(Struct):
    method attributes (line 50) | def attributes():
  class BinData (line 55) | class BinData(RecordModel):
    method attributes (line 69) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid19_face_name.py
  class AlternateFont (line 32) | class AlternateFont(Struct):
    method attributes (line 33) | def attributes():
  class Panose1 (line 39) | class Panose1(Struct):
    method attributes (line 86) | def attributes():
  class FaceName (line 100) | class FaceName(RecordModel):
    method attributes (line 115) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid20_border_fill.py
  class BorderFill (line 36) | class BorderFill(RecordModel):
    method attributes (line 54) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid21_char_shape.py
  function LanguageStruct (line 37) | def LanguageStruct(name, basetype):
  class ShadowSpace (line 47) | class ShadowSpace(Struct):
    method attributes (line 48) | def attributes():
  class CharShape (line 54) | class CharShape(RecordModel):
    method attributes (line 73) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid22_tab_def.py
  class Tab (line 33) | class Tab(Struct):
    method attributes (line 42) | def attributes(cls):
  class TabDef (line 47) | class TabDef(RecordModel):
    method attributes (line 58) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid23_numbering.py
  class NumberingLevel (line 36) | class NumberingLevel(Struct):
    method attributes (line 48) | def attributes(cls):
  class Numbering (line 57) | class Numbering(RecordModel):
    method attributes (line 65) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid24_bullet.py
  class Bullet (line 40) | class Bullet(RecordModel):
    method attributes (line 46) | def attributes():

FILE: src/hwp5/binmodel/tagid25_para_shape.py
  class ParaShape (line 34) | class ParaShape(RecordModel):
    method attributes (line 78) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid26_style.py
  class Style (line 33) | class Style(RecordModel):
    method attributes (line 42) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid27_doc_data.py
  class DocData (line 27) | class DocData(RecordModel):

FILE: src/hwp5/binmodel/tagid28_distribute_doc_data.py
  class DistributeDocData (line 27) | class DistributeDocData(RecordModel):

FILE: src/hwp5/binmodel/tagid30_compatible_document.py
  class CompatibleDocument (line 30) | class CompatibleDocument(RecordModel):
    method attributes (line 39) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid31_layout_compatibility.py
  class LayoutCompatibility (line 28) | class LayoutCompatibility(RecordModel):
    method attributes (line 32) | def attributes():

FILE: src/hwp5/binmodel/tagid32_unknown.py
  class TagModel32 (line 27) | class TagModel32(RecordModel):

FILE: src/hwp5/binmodel/tagid50_para_header.py
  class Paragraph (line 31) | class Paragraph(RecordModel):
    method attributes (line 50) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid51_para_text.py
  class ParaTextChunks (line 32) | class ParaTextChunks(with_metaclass(ArrayType, list)):
    method read (line 34) | def read(cls, f):
    method parse_chunks (line 39) | def parse_chunks(bytes):
  class ParaText (line 55) | class ParaText(RecordModel):
    method attributes (line 59) | def attributes():

FILE: src/hwp5/binmodel/tagid52_para_char_shape.py
  class ParaCharShape (line 35) | class ParaCharShape(RecordModel):
    method attributes (line 39) | def attributes():
  class ParaCharShapeList (line 47) | class ParaCharShapeList(with_metaclass(ArrayType, list)):
    method read (line 51) | def read(cls, f, context):
    method decode (line 56) | def decode(payload, context=None):

FILE: src/hwp5/binmodel/tagid53_para_line_seg.py
  class LineSeg (line 37) | class LineSeg(Struct):
    method attributes (line 48) | def attributes(cls):
  class ParaLineSeg (line 61) | class ParaLineSeg(RecordModel):
    method attributes (line 66) | def attributes(cls):
  class ParaLineSegList (line 73) | class ParaLineSegList(with_metaclass(ArrayType, list)):
    method read (line 77) | def read(cls, f, context):
    method decode (line 82) | def decode(cls, context, payload):

FILE: src/hwp5/binmodel/tagid54_para_range_tag.py
  class RangeTag (line 32) | class RangeTag(Struct):
    method attributes (line 40) | def attributes(cls):
  class ParaRangeTag (line 46) | class ParaRangeTag(RecordModel):
    method attributes (line 52) | def attributes():

FILE: src/hwp5/binmodel/tagid56_list_header.py
  class ListHeaderType (line 47) | class ListHeaderType(RecordModelType):
    method __new__ (line 49) | def __new__(mcs, name, bases, attrs):
  class ListHeader (line 60) | class ListHeader(with_metaclass(ListHeaderType, RecordModel)):
    method attributes (line 71) | def attributes(cls):
    method get_extension_key (line 80) | def get_extension_key(context, model):
  class TableCaption (line 89) | class TableCaption(ListHeader):
    method attributes (line 101) | def attributes(cls):
  class TableCell (line 110) | class TableCell(ListHeader):
    method attributes (line 115) | def attributes():
  class GShapeObjectCaption (line 128) | class GShapeObjectCaption(TableCaption):
  class TextboxParagraphList (line 132) | class TextboxParagraphList(ListHeader):
    method attributes (line 136) | def attributes():
  class HeaderFooterParagraphList (line 142) | class HeaderFooterParagraphList(ListHeader):
    method attributes (line 144) | def attributes():
  class HeaderParagraphList (line 152) | class HeaderParagraphList(HeaderFooterParagraphList):
  class FooterParagraphList (line 156) | class FooterParagraphList(HeaderFooterParagraphList):

FILE: src/hwp5/binmodel/tagid57_page_def.py
  class PageDef (line 31) | class PageDef(RecordModel):
    method attributes (line 39) | def attributes(cls):
    method getDimension (line 53) | def getDimension(self):
    method getHeight (line 64) | def getHeight(self):
    method getWidth (line 76) | def getWidth(self):

FILE: src/hwp5/binmodel/tagid58_footnote_shape.py
  class FootnoteShape (line 34) | class FootnoteShape(RecordModel):
    method attributes (line 38) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid59_page_border_fill.py
  class PageBorderFill (line 32) | class PageBorderFill(RecordModel):
    method attributes (line 42) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid60_shape_component.py
  class Matrix (line 47) | class Matrix(Struct):
    method attributes (line 56) | def attributes():
  class ScaleRotationMatrix (line 66) | class ScaleRotationMatrix(Struct):
    method attributes (line 67) | def attributes():
  function parent_must_be_gso (line 73) | def parent_must_be_gso(context, values):
  function chid_is_container (line 82) | def chid_is_container(context, values):
  function chid_is_rect (line 87) | def chid_is_rect(context, values):
  function chid_is_rect_and_fill_colorpattern (line 92) | def chid_is_rect_and_fill_colorpattern(context, values):
  function chid_is_rect_and_fill_image (line 98) | def chid_is_rect_and_fill_image(context, values):
  function chid_is_rect_and_fill_gradation (line 104) | def chid_is_rect_and_fill_gradation(context, values):
  function chid_is_line (line 110) | def chid_is_line(context, values):
  class ShapeComponent (line 115) | class ShapeComponent(RecordModel):
    method attributes (line 125) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid61_table.py
  class ZoneInfo (line 37) | class ZoneInfo(Struct):
    method attributes (line 38) | def attributes():
  class TableBody (line 48) | class TableBody(RecordModel):
    method attributes (line 58) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid62_shape_component_line.py
  class ShapeLine (line 29) | class ShapeLine(RecordModel):
    method attributes (line 33) | def attributes():

FILE: src/hwp5/binmodel/tagid63_shape_component_rectangle.py
  class ShapeRectangle (line 29) | class ShapeRectangle(RecordModel):
    method attributes (line 33) | def attributes():

FILE: src/hwp5/binmodel/tagid64_shape_component_ellipse.py
  class ShapeEllipse (line 30) | class ShapeEllipse(RecordModel):
    method attributes (line 40) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid65_shape_component_arc.py
  class ShapeArc (line 28) | class ShapeArc(RecordModel):
    method attributes (line 32) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid66_shape_component_polygon.py
  class ShapePolygon (line 30) | class ShapePolygon(RecordModel):
    method attributes (line 34) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid67_shape_component_curve.py
  class ShapeCurve (line 30) | class ShapeCurve(RecordModel):
    method attributes (line 35) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid68_shape_component_ole.py
  class ShapeOLE (line 32) | class ShapeOLE(RecordModel):
    method attributes (line 47) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid69_shape_component_picture.py
  class PictureInfo (line 37) | class PictureInfo(Struct):
    method attributes (line 39) | def attributes():
  class PictureEffect (line 47) | class PictureEffect(Struct):
    method attributes (line 53) | def attributes(cls):
  class ImageRect (line 59) | class ImageRect(Struct):
    method attributes (line 62) | def attributes():
  class ImageClip (line 71) | class ImageClip(Struct):
    method attributes (line 74) | def attributes():
  class ShapePicture (line 82) | class ShapePicture(RecordModel):
    method attributes (line 86) | def attributes():

FILE: src/hwp5/binmodel/tagid70_shape_component_container.py
  class ShapeContainer (line 27) | class ShapeContainer(RecordModel):

FILE: src/hwp5/binmodel/tagid71_ctrl_data.py
  class ControlDataType (line 33) | class ControlDataType(RecordModelType):
    method __new__ (line 35) | def __new__(mcs, name, bases, attrs):
  class ControlData (line 44) | class ControlData(with_metaclass(ControlDataType, RecordModel)):
    method get_extension_key (line 51) | def get_extension_key(cls, context, model):

FILE: src/hwp5/binmodel/tagid72_ctrl_eqedit.py
  class EqEdit (line 30) | class EqEdit(RecordModel):
    method attributes (line 39) | def attributes(cls):

FILE: src/hwp5/binmodel/tagid74_shape_component_textart.py
  class ShapeTextArt (line 27) | class ShapeTextArt(RecordModel):

FILE: src/hwp5/binmodel/tagid75_form_object.py
  class FormObject (line 27) | class FormObject(RecordModel):

FILE: src/hwp5/binmodel/tagid76_memo_shape.py
  class MemoShape (line 27) | class MemoShape(RecordModel):

FILE: src/hwp5/binmodel/tagid77_memo_list.py
  class MemoList (line 27) | class MemoList(RecordModel):

FILE: src/hwp5/binmodel/tagid78_forbidden_char.py
  class ForbiddenChar (line 27) | class ForbiddenChar(RecordModel):

FILE: src/hwp5/binmodel/tagid79_chart_data.py
  class ChartData (line 27) | class ChartData(RecordModel):

FILE: src/hwp5/binmodel/tagid99_shape_component_unknown.py
  class ShapeUnknown (line 27) | class ShapeUnknown(RecordModel):

FILE: src/hwp5/binspec.py
  function define_enum_type (line 41) | def define_enum_type(enum_type):
  function define_bitfield (line 54) | def define_bitfield(bitgroup_name, bitgroup_desc):
  function define_flags_type (line 63) | def define_flags_type(flags_type):
  function define_fixed_array_type (line 81) | def define_fixed_array_type(array_type):
  function define_variable_length_array_type (line 90) | def define_variable_length_array_type(array_type):
  function define_x_array_type (line 99) | def define_x_array_type(t):
  function define_selective_type (line 106) | def define_selective_type(t):
  function reference_type (line 116) | def reference_type(t):
  function referenced_types_by_member (line 144) | def referenced_types_by_member(member):
  function define_member (line 152) | def define_member(struct_type, member):
  function direct_referenced_types (line 177) | def direct_referenced_types(t):
  function referenced_types_by_struct_type (line 204) | def referenced_types_by_struct_type(t):
  function extension_sort_key (line 211) | def extension_sort_key(cls):
  function sort_extensions (line 219) | def sort_extensions(extension_types):
  function extensions_of_tag_model (line 228) | def extensions_of_tag_model(tag_model):
  function define_struct_type (line 238) | def define_struct_type(t):
  function define_tag_model (line 250) | def define_tag_model(tag_id):
  function define_base_type (line 267) | def define_base_type(t):
  function make_condition_value (line 272) | def make_condition_value(value):
  function define_extension (line 285) | def define_extension(t, up_to_type, name, value):
  function get_extends (line 301) | def get_extends(t, up_to_type=None):
  function define_extends (line 320) | def define_extends(t):
  function define_primitive_type (line 326) | def define_primitive_type(t):
  function main (line 342) | def main():

FILE: src/hwp5/bintype.py
  function bintype_map_events (line 44) | def bintype_map_events(bin_item):
  function filter_with_version (line 89) | def filter_with_version(events, version):
  function make_items_immutable (line 104) | def make_items_immutable(events):
  function compile_type_definition (line 117) | def compile_type_definition(bin_item):
  function get_compiled_typedef (line 126) | def get_compiled_typedef(type):
  function get_compiled_typedef_with_version (line 137) | def get_compiled_typedef_with_version(type, version):
  class ERROREVENT (line 155) | class ERROREVENT(object):
  function static_to_mutable (line 159) | def static_to_mutable(events):
  function pop_subevents (line 172) | def pop_subevents(events_deque):
  function resolve_typedefs (line 186) | def resolve_typedefs(typedef_events, context):
  function evaluate_bin_values (line 286) | def evaluate_bin_values(events):
  function construct_composite_values (line 295) | def construct_composite_values(events):
  function log_events (line 328) | def log_events(events, log_fn):
  function eval_typedef_events (line 356) | def eval_typedef_events(typedef_events, context, resolve_values):
  function resolve_values_from_stream (line 366) | def resolve_values_from_stream(stream):
  function resolve_value_from_stream (line 380) | def resolve_value_from_stream(item, stream):
  function resolve_type_events (line 412) | def resolve_type_events(type, context, resolve_values):
  function read_type_events (line 425) | def read_type_events(type, context, stream):
  function read_type_item (line 442) | def read_type_item(type, context, stream, binevents=None):
  function read_type (line 453) | def read_type(type, context, stream, binevents=None):
  function dump_events (line 458) | def dump_events(events):
  function main (line 497) | def main():

FILE: src/hwp5/charsets.py
  function get_unichr_lang (line 24) | def get_unichr_lang(uch):
  function tokenize_unicode_by_lang (line 92) | def tokenize_unicode_by_lang(text):

FILE: src/hwp5/cli.py
  function init_logger (line 33) | def init_logger(args):
  function init_with_environ (line 77) | def init_with_environ():
  function open_hwpfile (line 87) | def open_hwpfile(args):
  function parse_recordstream_name (line 98) | def parse_recordstream_name(hwpfile, streamname):

FILE: src/hwp5/compressed.py
  class ZLibIncrementalDecoder (line 29) | class ZLibIncrementalDecoder(codecs.IncrementalDecoder):
    method __init__ (line 30) | def __init__(self, errors='strict', wbits=15):
    method decode (line 36) | def decode(self, input, final=False):
    method reset (line 42) | def reset(self):
  function decompress_gen (line 46) | def decompress_gen(source, bufsize=4096):
  function decompress_experimental (line 56) | def decompress_experimental(source, bufsize=4096):
  function decompress (line 65) | def decompress(stream):

FILE: src/hwp5/dataio.py
  class Eof (line 45) | class Eof(Exception):
    method __init__ (line 46) | def __init__(self, *args):
  class OutOfData (line 50) | class OutOfData(Exception):
  function readn (line 54) | def readn(f, size):
  class PrimitiveType (line 66) | class PrimitiveType(type):
    method __new__ (line 67) | def __new__(mcs, name, bases, attrs):
  function Primitive (line 106) | def Primitive(name, basetype, binfmt, **attrs):
  class HexBytes (line 131) | class HexBytes(type):
    method __new__ (line 132) | def __new__(mcs, size):
  function decode_uint16le_array_default (line 138) | def decode_uint16le_array_default(bytes):
  function decode_uint16le_array_in_jython (line 145) | def decode_uint16le_array_in_jython(bytes):
  class BSTR (line 162) | class BSTR(with_metaclass(PrimitiveType, unicode)):
    method read (line 164) | def read(f):
  function decode_utf16le_with_hypua (line 173) | def decode_utf16le_with_hypua(bytes):
  class BitGroupDescriptor (line 183) | class BitGroupDescriptor(object):
    method __init__ (line 184) | def __init__(self, bitgroup):
    method __get__ (line 197) | def __get__(self, instance, owner):
    method get_int_value (line 201) | def get_int_value(self, instance):
  class FlagsType (line 207) | class FlagsType(type):
    method __new__ (line 208) | def __new__(mcs, name, bases, attrs):
  function _lex_flags_args (line 230) | def _lex_flags_args(args):
  function _parse_flags_args (line 240) | def _parse_flags_args(args):
  function Flags (line 287) | def Flags(basetype, *args):
  class EnumType (line 296) | class EnumType(type):
    method __new__ (line 297) | def __new__(mcs, enum_type_name, bases, attrs):
    method __init__ (line 373) | def __init__(cls, *args, **kwargs):
  function Enum (line 377) | def Enum(*items, **moreitems):
  class CompoundType (line 382) | class CompoundType(type):
    method __new__ (line 383) | def __new__(mcs, name, bases, attrs):
  class ArrayType (line 387) | class ArrayType(CompoundType):
    method __init__ (line 388) | def __init__(self, *args, **kwargs):
  class FixedArrayType (line 392) | class FixedArrayType(ArrayType):
    method __new__ (line 396) | def __new__(mcs, itemtype, size):
  class VariableLengthArrayType (line 413) | class VariableLengthArrayType(ArrayType):
    method __new__ (line 417) | def __new__(mcs, counttype, itemtype):
  function ref_member (line 434) | def ref_member(member_name):
  function ref_member_flag (line 441) | def ref_member_flag(member_name, bitfield_name):
  class X_ARRAY (line 448) | class X_ARRAY(object):
    method __init__ (line 450) | def __init__(self, itemtype, count_reference):
    method __call__ (line 457) | def __call__(self, context, values):
  class SelectiveType (line 462) | class SelectiveType(object):
    method __init__ (line 464) | def __init__(self, selector_reference, selections):
    method __call__ (line 469) | def __call__(self, context, values):
  class ParseError (line 474) | class ParseError(Exception):
    method __init__ (line 478) | def __init__(self, *args, **kwargs):
    method print_to_logger (line 486) | def print_to_logger(self, logger):
  function typed_struct_attributes (line 523) | def typed_struct_attributes(struct, attributes, context):
  class StructType (line 541) | class StructType(CompoundType):
    method __init__ (line 542) | def __init__(cls, name, bases, attrs):
    method parse_members (line 557) | def parse_members(cls, context, getvalue):
    method parse_members_with_inherited (line 581) | def parse_members_with_inherited(cls, context, getvalue, up_to_cls=None):
  class Struct (line 591) | class Struct(with_metaclass(StructType, object)):
  function dumpbytes (line 595) | def dumpbytes(data, crust=False):
  function hexdump (line 622) | def hexdump(data, crust=False):
  class IndentedOutput (line 626) | class IndentedOutput:
    method __init__ (line 627) | def __init__(self, base, level):
    method write (line 631) | def write(self, x):
  class Printer (line 639) | class Printer:
    method __init__ (line 640) | def __init__(self, baseout):
    method prints (line 643) | def prints(self, *args):

FILE: src/hwp5/distdoc.py
  function decode (line 37) | def decode(stream):
  class Random (line 48) | class Random:
    method __init__ (line 52) | def __init__(self, seed):
    method rand (line 55) | def rand(self):
  function decode_head_to_sha1 (line 61) | def decode_head_to_sha1(record_payload):
  function decode_head_to_key (line 93) | def decode_head_to_key(record_payload):
  function decrypt_tail (line 98) | def decrypt_tail(key, encrypted_tail):

FILE: src/hwp5/errors.py
  class InvalidOleStorageError (line 24) | class InvalidOleStorageError(Exception):
  class InvalidHwp5FileError (line 29) | class InvalidHwp5FileError(Exception):
  class ImplementationNotAvailable (line 34) | class ImplementationNotAvailable(Exception):
  class ValidationFailed (line 38) | class ValidationFailed(Exception):
  class RelaxNGValidationFailed (line 42) | class RelaxNGValidationFailed(ValidationFailed):

FILE: src/hwp5/filestructure.py
  class BYTES (line 52) | class BYTES(type):
    method __new__ (line 53) | def __new__(mcs, size):
  class VERSION (line 59) | class VERSION(object):
    method decode (line 63) | def decode(cls, bytes):
    method decode (line 66) | def decode(cls, bytes):
  class FileHeader (line 72) | class FileHeader(Struct):
    method attributes (line 87) | def attributes(cls):
  function is_hwp5file (line 95) | def is_hwp5file(filename):
  function storage_is_hwp5file (line 104) | def storage_is_hwp5file(stg):
  class CompressedStream (line 118) | class CompressedStream(ItemWrapper):
    method open (line 120) | def open(self):
  class CompressedStorage (line 124) | class CompressedStorage(StorageWrapper):
    method __getitem__ (line 126) | def __getitem__(self, name):
  class PasswordProtectedStream (line 134) | class PasswordProtectedStream(ItemWrapper):
    method open (line 136) | def open(self):
  class PasswordProtectedStorage (line 143) | class PasswordProtectedStorage(StorageWrapper):
    method __getitem__ (line 144) | def __getitem__(self, name):
  class Hwp5PasswordProtectedDoc (line 152) | class Hwp5PasswordProtectedDoc(ItemConversionStorage):
    method resolve_conversion_for (line 154) | def resolve_conversion_for(self, name):
  class VersionSensitiveItem (line 161) | class VersionSensitiveItem(ItemWrapper):
    method __init__ (line 163) | def __init__(self, item, version):
    method open (line 167) | def open(self):
    method other_formats (line 170) | def other_formats(self):
  class Hwp5FileBase (line 174) | class Hwp5FileBase(ItemConversionStorage):
    method __init__ (line 185) | def __init__(self, stg):
    method resolve_conversion_for (line 198) | def resolve_conversion_for(self, name):
    method get_fileheader (line 202) | def get_fileheader(self):
  class Hwp5DistDocStream (line 210) | class Hwp5DistDocStream(VersionSensitiveItem):
    method open (line 212) | def open(self):
    method head_record (line 217) | def head_record(self):
    method head_record_stream (line 222) | def head_record_stream(self):
    method head (line 228) | def head(self):
    method head_stream (line 232) | def head_stream(self):
    method head_sha1 (line 235) | def head_sha1(self):
    method head_key (line 240) | def head_key(self):
    method tail (line 245) | def tail(self):
    method tail_decrypted (line 252) | def tail_decrypted(self):
    method tail_stream (line 258) | def tail_stream(self):
  class Hwp5DistDocStorage (line 262) | class Hwp5DistDocStorage(ItemConversionStorage):
    method resolve_conversion_for (line 264) | def resolve_conversion_for(self, name):
  class Hwp5DistDoc (line 270) | class Hwp5DistDoc(ItemConversionStorage):
    method resolve_conversion_for (line 272) | def resolve_conversion_for(self, name):
  class Hwp5Compression (line 277) | class Hwp5Compression(ItemConversionStorage):
    method resolve_conversion_for (line 280) | def resolve_conversion_for(self, name):
  class PreviewText (line 289) | class PreviewText(object):
    method __init__ (line 291) | def __init__(self, item):
    method other_formats (line 294) | def other_formats(self):
    method open_utf8 (line 297) | def open_utf8(self):
    method get_utf8 (line 301) | def get_utf8(self):
    method get_text (line 310) | def get_text(self):
    method __str__ (line 320) | def __str__(self):
    method __unicode__ (line 325) | def __unicode__(self):
  class Sections (line 329) | class Sections(ItemConversionStorage):
    method __init__ (line 333) | def __init__(self, stg, version):
    method resolve_conversion_for (line 337) | def resolve_conversion_for(self, name):
    method other_formats (line 342) | def other_formats(self):
    method section (line 345) | def section(self, idx):
    method section_indexes (line 348) | def section_indexes(self):
    method sections (line 364) | def sections(self):
  class HwpFileHeader (line 369) | class HwpFileHeader(object):
    method __init__ (line 371) | def __init__(self, item):
    method to_dict (line 374) | def to_dict(self):
    method get_version (line 383) | def get_version(self):
    method get_signature (line 388) | def get_signature(self):
    method get_flags (line 393) | def get_flags(self):
    method open_text (line 398) | def open_text(self):
    method other_formats (line 412) | def other_formats(self):
  class HwpSummaryInfo (line 416) | class HwpSummaryInfo(VersionSensitiveItem):
    method other_formats (line 418) | def other_formats(self):
    method getPropertySetStream (line 421) | def getPropertySetStream(self):
    method getHwpSummaryInfoPropertySet (line 440) | def getHwpSummaryInfoPropertySet(self):
    method title (line 448) | def title(self):
    method subject (line 453) | def subject(self):
    method author (line 458) | def author(self):
    method keywords (line 463) | def keywords(self):
    method comments (line 468) | def comments(self):
    method lastSavedBy (line 473) | def lastSavedBy(self):
    method revisionNumber (line 478) | def revisionNumber(self):
    method lastPrintedTime (line 483) | def lastPrintedTime(self):
    method createdTime (line 488) | def createdTime(self):
    method lastSavedTime (line 493) | def lastSavedTime(self):
    method numberOfPages (line 498) | def numberOfPages(self):
    method dateString (line 503) | def dateString(self):
    method numberOfParagraphs (line 508) | def numberOfParagraphs(self):
    method plaintext_lines (line 513) | def plaintext_lines(self):
    method open_text (line 519) | def open_text(self):
  class Hwp5File (line 528) | class Hwp5File(ItemConversionStorage):
    method __init__ (line 536) | def __init__(self, stg):
    method resolve_conversion_for (line 556) | def resolve_conversion_for(self, name):
    method with_version (line 568) | def with_version(self, f):
    method summaryinfo (line 578) | def summaryinfo(self):
    method docinfo (line 582) | def docinfo(self):
    method preview_text (line 586) | def preview_text(self):
    method bodytext (line 590) | def bodytext(self):
    method viewtext (line 594) | def viewtext(self):
    method text (line 598) | def text(self):

FILE: src/hwp5/hwp5html.py
  class HTMLTransform (line 54) | class HTMLTransform(BaseTransform):
    method transform_hwp5_to_css (line 57) | def transform_hwp5_to_css(self):
    method transform_hwp5_to_xhtml (line 65) | def transform_hwp5_to_xhtml(self):
    method transform_hwp5_to_dir (line 72) | def transform_hwp5_to_dir(self, hwp5file, outdir):
    method transform_xhwp5_to_css (line 83) | def transform_xhwp5_to_css(self):
    method transform_xhwp5_to_xhtml (line 91) | def transform_xhwp5_to_xhtml(self):
    method transform_xhwp5_to_dir (line 98) | def transform_xhwp5_to_dir(self, xhwp5path, outdir):
    method extract_bindata_dir (line 110) | def extract_bindata_dir(self, hwp5file, bindata_dir):
  function main (line 121) | def main():
  function main_argparser (line 160) | def main_argparser():
  function open_dir (line 202) | def open_dir(path):
  function wrap_for_css (line 209) | def wrap_for_css(open_dest):
  function wrap_for_xml (line 219) | def wrap_for_xml(open_dest):

FILE: src/hwp5/hwp5odt.py
  class ODFValidate (line 64) | class ODFValidate:
    method __init__ (line 66) | def __init__(self, relaxng_compile=None):
    method get_default_relaxng_compile (line 78) | def get_default_relaxng_compile(cls):
    method odf_validator (line 85) | def odf_validator(self):
    method make_odf_validator (line 92) | def make_odf_validator(self):
  class ODTTransform (line 98) | class ODTTransform(BaseTransform, ODFValidate):
    method __init__ (line 100) | def __init__(self, xslt_compile=None, relaxng_compile=None,
    method transform_hwp5_to_styles (line 111) | def transform_hwp5_to_styles(self):
    method transform_hwp5_to_content (line 120) | def transform_hwp5_to_content(self):
    method transform_hwp5_to_single_document (line 129) | def transform_hwp5_to_single_document(self):
    method transform_hwp5_to_package (line 137) | def transform_hwp5_to_package(self, hwp5file, odtpkg):
    method transform_xhwp5_to_styles (line 154) | def transform_xhwp5_to_styles(self):
    method transform_xhwp5_to_content (line 163) | def transform_xhwp5_to_content(self):
    method transform_xhwp5_to_single_document (line 172) | def transform_xhwp5_to_single_document(self):
    method transform_xhwp5_into_package (line 181) | def transform_xhwp5_into_package(self):
    method transformed_styles_at_temp (line 199) | def transformed_styles_at_temp(self, xhwp5path):
    method transformed_content_at_temp (line 207) | def transformed_content_at_temp(self, xhwp5path):
    method transformed_single_document_at_temp (line 215) | def transformed_single_document_at_temp(self, xhwp5path):
    method make_odf_transform (line 223) | def make_odf_transform(self, resource_path):
  function transformed_at_temp_path (line 236) | def transformed_at_temp_path(inp_path, transform):
  class ODTPackage (line 243) | class ODTPackage(object):
    method __init__ (line 244) | def __init__(self, path_or_zipfile):
    method insert_path (line 254) | def insert_path(self, src_path, path, media_type):
    method insert_stream (line 258) | def insert_stream(self, f, path, media_type):
    method close (line 264) | def close(self):
  function manifest_xml (line 275) | def manifest_xml(f, files):
  function manifest_rdf (line 311) | def manifest_rdf(f):
  function main (line 326) | def main():
  function main_argparser (line 373) | def main_argparser():
  function replace_ext (line 430) | def replace_ext(path, ext):
  function open_odtpkg (line 437) | def open_odtpkg(path):
  function wrap_for_xml (line 443) | def wrap_for_xml(open_dest):

FILE: src/hwp5/hwp5proc.py
  function main (line 70) | def main():
  function main_argparser (line 91) | def main_argparser():

FILE: src/hwp5/hwp5txt.py
  class TextTransform (line 53) | class TextTransform(BaseTransform):
    method transform_hwp5_to_text (line 56) | def transform_hwp5_to_text(self):
    method transform_xhwp5_to_text (line 61) | def transform_xhwp5_to_text(self):
  function main (line 69) | def main():
  function main_argparser (line 92) | def main_argparser():

FILE: src/hwp5/hwp5view.py
  function main (line 66) | def main():
  function main_argparser (line 78) | def main_argparser():
  function runner_factory (line 106) | def runner_factory():
  function runner_factory_gi (line 122) | def runner_factory_gi():
  function runner_factory_pyside (line 183) | def runner_factory_pyside():
  function make_temporary_directory (line 218) | def make_temporary_directory(*args, **kwargs):
  function hwp5html (line 228) | def hwp5html(filename, out_dir):
  function fspath2url (line 234) | def fspath2url(path):

FILE: src/hwp5/importhelper.py
  function pkg_resources_filename (line 25) | def pkg_resources_filename(pkg_name, path):
  function pkg_resources_filename_fallback (line 35) | def pkg_resources_filename_fallback(pkg_name, path):

FILE: src/hwp5/msoleprops.py
  function PropertyType (line 47) | def PropertyType(code):
  class VT_I4 (line 58) | class VT_I4(object):
    method read_value (line 61) | def read_value(cls, context, f):
  class VT_LPWSTR (line 66) | class VT_LPWSTR(object):
    method read_value (line 69) | def read_value(cls, context, f):
  class VT_FILETIME (line 76) | class VT_FILETIME(object):
    method read_value (line 79) | def read_value(cls, context, f):
  class FILETIME (line 87) | class FILETIME(object):
    method __init__ (line 90) | def __init__(self, value):
    method __str__ (line 93) | def __str__(self):
    method datetime (line 97) | def datetime(self):
  class Property (line 230) | class Property(object):
    method __init__ (line 232) | def __init__(self, desc, idLabel, type, value):
    method id (line 239) | def id(self):
  class PropertyDesc (line 243) | class PropertyDesc(Struct):
    method __init__ (line 245) | def __init__(self, id, offset):
    method fromDict (line 250) | def fromDict(cls, d):
    method attributes (line 253) | def attributes():
  class PropertyReader (line 259) | class PropertyReader(object):
    method __init__ (line 261) | def __init__(self, propsetDesc, propDesc, idLabel, codepage,
    method read (line 269) | def read(self, f):
  class TypedPropertyValue (line 286) | class TypedPropertyValue(Struct):
    method __init__ (line 291) | def __init__(self, code):
    method fromDict (line 295) | def fromDict(cls, d):
    method attributes (line 301) | def attributes(cls):
    method vt_type (line 306) | def vt_type(self):
  class DictionaryEntry (line 313) | class DictionaryEntry(Struct):
    method __init__ (line 318) | def __init__(self, id, name):
    method fromDict (line 323) | def fromDict(cls, d):
    method attributes (line 329) | def attributes():
  class Dictionary (line 337) | class Dictionary(Struct):
    method __init__ (line 342) | def __init__(self, entries):
    method fromDict (line 346) | def fromDict(cls, d):
    method attributes (line 353) | def attributes():
    method get (line 358) | def get(self, id, defvalue=None):
  class DictionaryReader (line 365) | class DictionaryReader(object):
    method __init__ (line 367) | def __init__(self, propsetDesc, propDesc, idLabel, codepage):
    method read (line 373) | def read(self, f):
  class PropertySet (line 391) | class PropertySet(object):
    method __init__ (line 396) | def __init__(self, desc, header, properties):
    method fmtid (line 402) | def fmtid(self):
    method __getitem__ (line 405) | def __getitem__(self, propertyIdentifier):
  class PropertySetHeader (line 412) | class PropertySetHeader(Struct):
    method __init__ (line 414) | def __init__(self, bytesize, propDescList):
    method fromDict (line 419) | def fromDict(cls, d):
    method attributes (line 430) | def attributes():
  class PropertySetDesc (line 437) | class PropertySetDesc(Struct):
    method __init__ (line 439) | def __init__(self, fmtid, offset):
    method attributes (line 443) | def attributes():
    method fromDict (line 449) | def fromDict(cls, d):
  class PropertySetStreamHeader (line 456) | class PropertySetStreamHeader(Struct):
    method __init__ (line 458) | def __init__(self, byteOrder, version, systemIdentifier, clsid,
    method fromDict (line 467) | def fromDict(cls, d):
    method attributes (line 481) | def attributes():
  class PropertySetStream (line 490) | class PropertySetStream(object):
    method __init__ (line 495) | def __init__(self, header, propertysets):
    method byteOrder (line 500) | def byteOrder(self):
    method version (line 504) | def version(self):
    method systemIdentifier (line 508) | def systemIdentifier(self):
    method clsid (line 512) | def clsid(self):
  class PropertySetFormat (line 516) | class PropertySetFormat(object):
    method __init__ (line 518) | def __init__(self, fmtid, propertyIdentifiers):
    method idLabels (line 523) | def idLabels(self):
  class PropertySetStreamReader (line 530) | class PropertySetStreamReader(object):
    method __init__ (line 532) | def __init__(self, propertySetFormats):
    method read (line 538) | def read(self, f):
  class PropertySetStreamTextFormatter (line 621) | class PropertySetStreamTextFormatter(object):
    method formatTextLines (line 623) | def formatTextLines(self, stream):
  function uuid_from_bytes_tuple (line 669) | def uuid_from_bytes_tuple(t):
  function nullterminated_string (line 676) | def nullterminated_string(bs):

FILE: src/hwp5/plat/__init__.py
  function get_xslt (line 44) | def get_xslt():
  function get_xslt_compile (line 55) | def get_xslt_compile():
  function get_relaxng (line 73) | def get_relaxng():
  function get_relaxng_compile (line 80) | def get_relaxng_compile():
  function get_olestorage_class (line 96) | def get_olestorage_class():
  function get_aes128ecb_decrypt (line 107) | def get_aes128ecb_decrypt():
  function get_aes128ecb_decrypt_cryptography (line 126) | def get_aes128ecb_decrypt_cryptography():
  function get_aes128ecb_decrypt_javax (line 141) | def get_aes128ecb_decrypt_javax():
  function get_aes128ecb_decrypt_openssl (line 155) | def get_aes128ecb_decrypt_openssl():
  function openssl_reachable (line 191) | def openssl_reachable():

FILE: src/hwp5/plat/_lxml.py
  function is_enabled (line 39) | def is_enabled():
  function xslt (line 48) | def xslt(xsl_path, inp_path, out_path):
  function xslt_compile (line 60) | def xslt_compile(xsl_path, **params):
  class XSLT (line 65) | class XSLT:
    method __init__ (line 67) | def __init__(self, xsl_path, **params):
    method transform (line 82) | def transform(self, input, output):
    method transform_into_stream (line 90) | def transform_into_stream(self, input, output):
    method _transform (line 97) | def _transform(self, input, output):
  function relaxng (line 113) | def relaxng(rng_path, inp_path):
  function relaxng_compile (line 118) | def relaxng_compile(rng_path):
  class RelaxNG (line 127) | class RelaxNG:
    method __init__ (line 129) | def __init__(self, rng_path):
    method validating_output (line 139) | def validating_output(self, output):
    method validate (line 155) | def validate(self, input):
    method validate_stream (line 161) | def validate_stream(self, input):
    method _validate (line 166) | def _validate(self, doc):
  function errlog_to_dict (line 185) | def errlog_to_dict(error):

FILE: src/hwp5/plat/_uno/__init__.py
  function is_enabled (line 40) | def is_enabled():
  function enable (line 54) | def enable():
  function disable (line 65) | def disable():
  function XSLTTransformer (line 71) | def XSLTTransformer(context, stylesheet_url, source_url, source_url_base):
  class OneshotEvent (line 88) | class OneshotEvent(object):
    method __init__ (line 90) | def __init__(self):
    method wait (line 95) | def wait(self):
    method signal (line 99) | def signal(self):
  class XSLT (line 103) | class XSLT(object):
    method __init__ (line 105) | def __init__(self, context):
    method __call__ (line 108) | def __call__(self, xsl_path, inp_path, out_path):
  function xslt (line 167) | def xslt(xsl_path, inp_path, out_path):
  function oless_from_filename (line 174) | def oless_from_filename(filename):
  function inputstream_from_filename (line 179) | def inputstream_from_filename(filename):
  function oless_from_inputstream (line 185) | def oless_from_inputstream(inputstream):
  class OleStorage (line 194) | class OleStorage(object):
    method __init__ (line 196) | def __init__(self, stg):
    method __iter__ (line 212) | def __iter__(self):
    method __getitem__ (line 215) | def __getitem__(self, name):
    method close (line 228) | def close(self):
  class OleStorageStream (line 238) | class OleStorageStream(object):
    method __init__ (line 240) | def __init__(self, oless, name):
    method open (line 244) | def open(self):

FILE: src/hwp5/plat/_uno/adapters.py
  class InputStreamFromFileLike (line 24) | class InputStreamFromFileLike(unohelper.Base, XInputStream, XSeekable):
    method __init__ (line 31) | def __init__(self, f, dontclose=False):
    method readBytes (line 35) | def readBytes(self, aData, nBytesToRead):
    method skipBytes (line 41) | def skipBytes(self, nBytesToSkip):
    method available (line 44) | def available(self):
    method closeInput (line 47) | def closeInput(self):
    method seek (line 51) | def seek(self, location):
    method getPosition (line 54) | def getPosition(self):
    method getLength (line 58) | def getLength(self):
  class OutputStreamToFileLike (line 68) | class OutputStreamToFileLike(unohelper.Base, XOutputStream):
    method __init__ (line 75) | def __init__(self, f, dontclose=False):
    method writeBytes (line 79) | def writeBytes(self, bytesequence):
    method flush (line 82) | def flush(self):
    method closeOutput (line 85) | def closeOutput(self):
  class FileFromStream (line 90) | class FileFromStream(object):
    method __init__ (line 97) | def __init__(self, stream):
    method close (line 137) | def close(self):

FILE: src/hwp5/plat/_uno/services.py
  function create_service (line 21) | def create_service(context, name, *args):
  class Namespace (line 29) | class Namespace(object):
    method __init__ (line 30) | def __init__(self, dotted_name):
    method __getattr__ (line 33) | def __getattr__(self, name):
    method __call__ (line 36) | def __call__(self, context, *args):
    method bind (line 39) | def bind(self, context):
  class ContextBoundNamespace (line 43) | class ContextBoundNamespace(object):
    method __init__ (line 45) | def __init__(self, namespace, context):
    method __getattr__ (line 49) | def __getattr__(self, name):
    method __call__ (line 55) | def __call__(self, *args):
    method __iter__ (line 58) | def __iter__(self):

FILE: src/hwp5/plat/_uno/ucb.py
  function open_url (line 21) | def open_url(context, url):

FILE: src/hwp5/plat/gir_gsf.py
  function is_enabled (line 36) | def is_enabled():
  function open (line 46) | def open(path):
  function listdir (line 54) | def listdir(gsfole):
  class OleStorage (line 59) | class OleStorage:
    method __init__ (line 61) | def __init__(self, gsfole):
    method __iter__ (line 78) | def __iter__(self):
    method __getitem__ (line 81) | def __getitem__(self, name):
    method close (line 91) | def close(self):
  class OleStreamItem (line 95) | class OleStreamItem:
    method __init__ (line 97) | def __init__(self, parent, name):
    method open (line 101) | def open(self):
  class OleStream (line 109) | class OleStream:
    method __init__ (line 111) | def __init__(self, gsfole):
    method close (line 114) | def close(self):
    method read (line 117) | def read(self, size=None):
    method seek (line 130) | def seek(self, offset, whence=0):
    method tell (line 143) | def tell(self):

FILE: src/hwp5/plat/javax_transform.py
  function is_enabled (line 32) | def is_enabled():
  function xslt (line 47) | def xslt(xsl_path, inp_path, out_path):
  class XSLT (line 53) | class XSLT:
    method __init__ (line 55) | def __init__(self, xsl_path, **params):
    method transform (line 88) | def transform(self, input, output):
    method transform_into_stream (line 100) | def transform_into_stream(self, input, output):
    method _transform (line 110) | def _transform(self, input, output):
  function xslt_compile (line 119) | def xslt_compile(xsl_path, **params):
  function wrap_filelike_inputstream (line 124) | def wrap_filelike_inputstream(f):
  function wrap_filelike_outputstream (line 129) | def wrap_filelike_outputstream(f):

FILE: src/hwp5/plat/jython_poifs.py
  function is_enabled (line 33) | def is_enabled():
  class OleStorage (line 42) | class OleStorage(object):
    method __init__ (line 49) | def __init__(self, olefile):
    method __iter__ (line 70) | def __iter__(self):
    method __getitem__ (line 73) | def __getitem__(self, name):
    method close (line 87) | def close(self):
  class OleStream (line 91) | class OleStream(object):
    method __init__ (line 93) | def __init__(self, entry):
    method open (line 96) | def open(self):
  class FileFromDocumentInputStream (line 102) | class FileFromDocumentInputStream(object):
    method __init__ (line 104) | def __init__(self, dis):
    method read (line 109) | def read(self, size=None):
    method seek (line 124) | def seek(self, offset, whence=0):
    method tell (line 137) | def tell(self):
    method close (line 140) | def close(self):

FILE: src/hwp5/plat/olefileio.py
  function is_enabled (line 27) | def is_enabled():
  function import_isOleFile (line 45) | def import_isOleFile():
  function import_OleFileIO (line 61) | def import_OleFileIO():
  class OleStorageItem (line 77) | class OleStorageItem(object):
    method __init__ (line 79) | def __init__(self, olefile, path, parent=None):
    method get_name (line 83) | def get_name(self):
  class OleStream (line 92) | class OleStream(OleStorageItem):
    method open (line 94) | def open(self):
  class OleStorage (line 98) | class OleStorage(OleStorageItem):
    method __init__ (line 107) | def __init__(self, olefile, path='', parent=None):
    method __iter__ (line 118) | def __iter__(self):
    method __getitem__ (line 121) | def __getitem__(self, name):
    method close (line 136) | def close(self):
  function olefile_listdir (line 144) | def olefile_listdir(olefile, path):

FILE: src/hwp5/plat/xmllint.py
  function xmllint_reachable (line 34) | def xmllint_reachable():
  function is_enabled (line 49) | def is_enabled():
  function enable (line 56) | def enable():
  function disable (line 61) | def disable():
  function relaxng (line 66) | def relaxng(rng_path, inp_path):
  function relaxng_compile (line 74) | def relaxng_compile(rng_path):
  class RelaxNG (line 78) | class RelaxNG:
    method __init__ (line 80) | def __init__(self, rng_path):
    method validating_output (line 84) | def validating_output(self, output):

FILE: src/hwp5/plat/xsltproc.py
  function xslt_reachable (line 34) | def xslt_reachable():
  function is_enabled (line 49) | def is_enabled():
  function enable (line 56) | def enable():
  function disable (line 61) | def disable():
  function xslt (line 66) | def xslt(xsl_path, inp_path, out_path):
  class XSLT (line 71) | class XSLT:
    method __init__ (line 73) | def __init__(self, xsl_path, **params):
    method transform (line 79) | def transform(self, input, output):
    method transform_into_stream (line 92) | def transform_into_stream(self, input, output):
  function xslt_compile (line 106) | def xslt_compile(xsl_path, **params):

FILE: src/hwp5/proc/cat.py
  function main (line 31) | def main(args):
  function cat_argparser (line 52) | def cat_argparser(subparsers, _):

FILE: src/hwp5/proc/diststream.py
  function main (line 64) | def main(args):
  function diststream_argparser (line 90) | def diststream_argparser(subparsers, _):

FILE: src/hwp5/proc/find.py
  function main (line 86) | def main(args):
  function find_argparser (line 107) | def find_argparser(subparsers, _):
  function filenames_from_args (line 164) | def filenames_from_args(args):
  function filenames_from_stdin (line 170) | def filenames_from_stdin(args):
  function conditions_from_args (line 174) | def conditions_from_args(args):
  function hwp5file_models (line 200) | def hwp5file_models(filename):
  function flat_models (line 207) | def flat_models(hwp5file, **kwargs):
  function printer_from_args (line 218) | def printer_from_args(args):

FILE: src/hwp5/proc/header.py
  function main (line 29) | def main(args):
  function header_argparser (line 44) | def header_argparser(subparsers, _):

FILE: src/hwp5/proc/ls.py
  function main (line 93) | def main(args):
  function ls_argparser (line 98) | def ls_argparser(subparsers, _):

FILE: src/hwp5/proc/models.py
  function main (line 40) | def main(args):
  function models_argparser (line 77) | def models_argparser(subparsers, _):
  function stream_from_args (line 158) | def stream_from_args(args):
  function models_from_args (line 178) | def models_from_args(args):
  function print_models_from_args (line 192) | def print_models_from_args(args):
  function print_models_json (line 206) | def print_models_json(models):
  function print_models_with_print_model (line 213) | def print_models_with_print_model(print_model):
  function print_model_simple (line 220) | def print_model_simple(model):
  function print_model_with_format (line 226) | def print_model_with_format(fmt):
  function transform_model_formattable (line 233) | def transform_model_formattable(model):

FILE: src/hwp5/proc/rawunz.py
  function main (line 31) | def main(args):
  function rawunz_argparser (line 43) | def rawunz_argparser(subparsers, _):

FILE: src/hwp5/proc/records.py
  function main (line 35) | def main(args):
  function records_argparser (line 85) | def records_argparser(subparsers, _):

FILE: src/hwp5/proc/summaryinfo.py
  function main (line 31) | def main(args):
  function summaryinfo_argparser (line 48) | def summaryinfo_argparser(subparsers, _):

FILE: src/hwp5/proc/unpack.py
  function main (line 28) | def main(args):
  function unpack_argparser (line 40) | def unpack_argparser(subparsers, _):

FILE: src/hwp5/proc/version.py
  function main (line 26) | def main(args):
  function version_argparser (line 32) | def version_argparser(subparsers, _):

FILE: src/hwp5/proc/xml.py
  function xmldump_nested (line 38) | def xmldump_nested(hwp5file, output, embedbin=False, xml_declaration=True):
  function main (line 44) | def main(args):
  function xml_argparser (line 78) | def xml_argparser(subparsers, _):

FILE: src/hwp5/recordstream.py
  function tagname (line 36) | def tagname(tagid):
  function Record (line 40) | def Record(tagid, level, payload, size=None, seqno=None):
  function decode_record_header (line 50) | def decode_record_header(f):
  function encode_record_header (line 64) | def encode_record_header(rec):
  function read_record (line 76) | def read_record(f, seqno):
  function dump_record (line 85) | def dump_record(f, record):
  function read_records (line 91) | def read_records(f):
  function link_records (line 102) | def link_records(records):
  function record_to_json (line 115) | def record_to_json(record, *args, **kwargs):
  function nth (line 121) | def nth(iterable, n, default=None):
  function group_records_by_toplevel (line 128) | def group_records_by_toplevel(records, group_as_list=True):
  class RecordStream (line 154) | class RecordStream(filestructure.VersionSensitiveItem):
    method records (line 156) | def records(self, **kwargs):
    method record (line 166) | def record(self, idx):
    method records_json (line 170) | def records_json(self, **kwargs):
    method records_treegrouped (line 174) | def records_treegrouped(self, group_as_list=True):
    method records_treegroup (line 180) | def records_treegroup(self, n):
    method other_formats (line 185) | def other_formats(self):
  class Sections (line 189) | class Sections(filestructure.Sections):
  class Hwp5File (line 194) | class Hwp5File(filestructure.Hwp5File):

FILE: src/hwp5/storage/__init__.py
  function is_storage (line 32) | def is_storage(item):
  function is_stream (line 36) | def is_stream(item):
  class ItemWrapper (line 40) | class ItemWrapper(object):
    method __init__ (line 41) | def __init__(self, wrapped):
    method __getattr__ (line 44) | def __getattr__(self, name):
  class StorageWrapper (line 48) | class StorageWrapper(ItemWrapper):
    method __iter__ (line 49) | def __iter__(self):
    method __getitem__ (line 52) | def __getitem__(self, name):
  class ItemConversionStorage (line 56) | class ItemConversionStorage(StorageWrapper):
    method __getitem__ (line 58) | def __getitem__(self, name):
    method resolve_conversion_for (line 66) | def resolve_conversion_for(self, name):
  class ExtraItemStorage (line 71) | class ExtraItemStorage(StorageWrapper):
    method __iter__ (line 73) | def __iter__(self):
    method __getitem__ (line 84) | def __getitem__(self, name):
  class Open2Stream (line 103) | class Open2Stream(object):
    method __init__ (line 105) | def __init__(self, open):
  function iter_storage_leafs (line 109) | def iter_storage_leafs(stg, basepath=''):
  function unpack (line 124) | def unpack(stg, outbase):
  function open_storage_item (line 147) | def open_storage_item(stg, path):
  function printstorage (line 159) | def printstorage(stg, basepath=''):

FILE: src/hwp5/storage/fs.py
  class FileSystemStorage (line 26) | class FileSystemStorage(object):
    method __init__ (line 29) | def __init__(self, path):
    method __iter__ (line 32) | def __iter__(self):
    method __getitem__ (line 35) | def __getitem__(self, name):
  class FileSystemStream (line 45) | class FileSystemStream(object):
    method __init__ (line 48) | def __init__(self, path):
    method open (line 51) | def open(self):

FILE: src/hwp5/storage/ole.py
  class OleStorage (line 30) | class OleStorage(object):
    method __init__ (line 32) | def __init__(self, *args, **kwargs):
    method __iter__ (line 37) | def __iter__(self):
    method __getitem__ (line 40) | def __getitem__(self, name):
    method __getattr__ (line 43) | def __getattr__(self, name):

FILE: src/hwp5/summaryinfo.py
  class HwpSummaryInfoTextFormatter (line 51) | class HwpSummaryInfoTextFormatter(object):
    method formatTextLines (line 53) | def formatTextLines(self, hwpsummaryinfo):

FILE: src/hwp5/transforms/__init__.py
  class BaseTransform (line 34) | class BaseTransform:
    method __init__ (line 36) | def __init__(self, xslt_compile=None, embedbin=False):
    method get_default_xslt_compile (line 41) | def get_default_xslt_compile(cls):
    method make_transform_hwp5 (line 47) | def make_transform_hwp5(self, transform_xhwp5):
    method make_xsl_transform (line 53) | def make_xsl_transform(self, resource_path, **params):
    method transformed_xhwp5_at_temp (line 58) | def transformed_xhwp5_at_temp(self, hwp5file):

FILE: src/hwp5/treeop.py
  class STARTEVENT (line 24) | class STARTEVENT:
  class ENDEVENT (line 28) | class ENDEVENT:
  function prefix_event (line 32) | def prefix_event(level_prefixed_items, root_item=None):
  function prefix_ancestors (line 58) | def prefix_ancestors(event_prefixed_items, root_item=None):
  function prefix_ancestors_from_level (line 70) | def prefix_ancestors_from_level(level_prefixed_items, root_item=None):
  function build_subtree (line 96) | def build_subtree(event_prefixed_items):
  function iter_subevents (line 127) | def iter_subevents(event_prefixed_items):
  function tree_events (line 140) | def tree_events(rootitem, childs):
  function tree_events_multi (line 149) | def tree_events_multi(trees):

FILE: src/hwp5/utils.py
  class NIL (line 40) | class NIL:
  class cached_property (line 44) | class cached_property(object):
    method __init__ (line 46) | def __init__(self, func):
    method __get__ (line 51) | def __get__(self, obj, type=None):
    method __set__ (line 60) | def __set__(self, obj, value):
  function generate_json_array (line 64) | def generate_json_array(tokens):
  class JsonObjects (line 77) | class JsonObjects(object):
    method __init__ (line 79) | def __init__(self, objects, object_to_json):
    method generate (line 83) | def generate(self, **kwargs):
    method open (line 91) | def open(self, **kwargs):
    method dump (line 96) | def dump(self, outfile, **kwargs):
  function unicode_escape (line 101) | def unicode_escape(s):
  function unicode_unescape (line 117) | def unicode_unescape(s):
  function transcode (line 133) | def transcode(backend_stream, backend_encoding, frontend_encoding,
  function transcoder (line 142) | def transcoder(backend_encoding, frontend_encoding, errors='strict'):
  class GeneratorReader (line 149) | class GeneratorReader(object):
    method __init__ (line 161) | def __init__(self, gen):
    method read (line 165) | def read(self, size=None):
    method close (line 181) | def close(self):
  class GeneratorTextReader (line 185) | class GeneratorTextReader(object):
    method __init__ (line 197) | def __init__(self, gen):
    method read (line 201) | def read(self, size=None):
    method close (line 219) | def close(self):
  function hwp5_resources_path (line 224) | def hwp5_resources_path(res_path):
  function make_open_dest_file (line 243) | def make_open_dest_file(path):
  function wrap_open_dest_for_tty (line 263) | def wrap_open_dest_for_tty(open_dest, wrappers):
  function wrap_open_dest (line 276) | def wrap_open_dest(open_dest, wrappers):
  function cascade_contextmanager_filters (line 286) | def cascade_contextmanager_filters(arg, filters):
  function null_contextmanager_filter (line 297) | def null_contextmanager_filter(output):
  function output_thru_subprocess (line 301) | def output_thru_subprocess(cmd):
  function xmllint (line 325) | def xmllint(c14n=False, encode=None, format=False, nonet=True):
  function syntaxhighlight (line 339) | def syntaxhighlight(mimetype):
  function syntaxhighlight_pygments (line 347) | def syntaxhighlight_pygments(mimetype):
  function make_temp_file (line 366) | def make_temp_file():
  function unlink_path (line 374) | def unlink_path(path):
  function pager (line 382) | def pager():
  function mkstemp_open (line 394) | def mkstemp_open(*args, **kwargs):
  function unlink_or_warning (line 416) | def unlink_or_warning(path):

FILE: src/hwp5/xmldump_flat.py
  function xmldump_flat (line 40) | def xmldump_flat(hwp5file, output, xml_declaration=True):
  function xmlevents_from_hwp5file (line 49) | def xmlevents_from_hwp5file(hwp5file):
  function expand_item_value (line 86) | def expand_item_value(ev, data):
  function expand_item_values (line 108) | def expand_item_values(model_events):
  function xmlevents_from_modelevents (line 114) | def xmlevents_from_modelevents(model_events):  # noqa

FILE: src/hwp5/xmlformat.py
  function xmlattrval (line 56) | def xmlattrval(value):
  function expanded_xmlattribute (line 70) | def expanded_xmlattribute(ntv):
  function xmlattr_dashednames (line 129) | def xmlattr_dashednames(attrs):
  function xmlattr_uniqnames (line 134) | def xmlattr_uniqnames(attrs):
  function xmlattributes_for_plainvalues (line 142) | def xmlattributes_for_plainvalues(context, plainvalues):
  function is_complex_type (line 148) | def is_complex_type(type, value):
  function separate_plainvalues (line 159) | def separate_plainvalues(typed_attributes):
  function startelement (line 180) | def startelement(context, ma):
  function element (line 234) | def element(context, ma):
  function xmlevents_to_bytechunks (line 241) | def xmlevents_to_bytechunks(xmlevents, encoding='utf-8'):
  function xmlevents_to_textchunks (line 246) | def xmlevents_to_textchunks(xmlevents):

FILE: src/hwp5/xmlmodel.py
  function give_elements_unique_id (line 71) | def give_elements_unique_id(event_prefixed_mac):
  function make_ranged_shapes (line 94) | def make_ranged_shapes(shapes):
  function split_and_shape (line 103) | def split_and_shape(chunks, ranged_shapes):
  function line_segmented (line 149) | def line_segmented(chunks, ranged_linesegs):
  function make_texts_linesegmented_and_charshaped (line 165) | def make_texts_linesegmented_and_charshaped(event_prefixed_mac):
  function merge_paragraph_text_charshape_lineseg (line 199) | def merge_paragraph_text_charshape_lineseg(paratext, paracharshape,
  function range_shaped_textchunk_events (line 232) | def range_shaped_textchunk_events(paratext_context, range_shaped_textchu...
  function wrap_section (line 256) | def wrap_section(event_prefixed_mac, sect_id=None):
  class ColumnSet (line 281) | class ColumnSet:
  function wrap_columns (line 285) | def wrap_columns(event_prefixed_mac):
  function make_extended_controls_inline (line 318) | def make_extended_controls_inline(event_prefixed_mac, stack=None):
  function meci_paragraph (line 339) | def meci_paragraph(event, stack, item):
  function meci_controlchar (line 348) | def meci_controlchar(event, stack, item, attributes):
  function make_paragraphs_children_of_listheader (line 366) | def make_paragraphs_children_of_listheader(event_prefixed_mac,
  function match_field_start_end (line 397) | def match_field_start_end(event_prefixed_mac):
  function mfse_field (line 414) | def mfse_field(event, stack, item):
  function mfse_lineseg (line 422) | def mfse_lineseg(event, stack, item):
  function mfse_field_end (line 435) | def mfse_field_end(event, stack, item):
  class TableRow (line 443) | class TableRow:
  function restructure_tablebody (line 451) | def restructure_tablebody(event_prefixed_mac):
  function rstbody_tablebody (line 467) | def rstbody_tablebody(event, stack, item, attributes, context):
  function rstbody_tablecell (line 485) | def rstbody_tablecell(event, stack, item):
  function tokenize_text_by_lang (line 499) | def tokenize_text_by_lang(event_prefixed_mac):
  function embed_bindata (line 518) | def embed_bindata(event_prefixed_mac, bindata):
  function prefix_binmodels_with_event (line 548) | def prefix_binmodels_with_event(context, models):
  function wrap_modelevents (line 555) | def wrap_modelevents(wrapper_model, modelevents):
  function modelevents_to_xmlevents (line 562) | def modelevents_to_xmlevents(modelevents):
  class XmlEvents (line 580) | class XmlEvents(object):
    method __init__ (line 582) | def __init__(self, events):
    method __iter__ (line 585) | def __iter__(self):
    method bytechunks (line 588) | def bytechunks(self, xml_declaration=True, **kwargs):
    method dump (line 600) | def dump(self, outfile, **kwargs):
    method open (line 607) | def open(self, **kwargs):
  class XmlEventsMixin (line 619) | class XmlEventsMixin(object):
    method xmlevents (line 621) | def xmlevents(self, **kwargs):
  class ModelEventStream (line 625) | class ModelEventStream(binmodel.ModelStream, XmlEventsMixin):
    method modelevents (line 627) | def modelevents(self, **kwargs):
    method other_formats (line 634) | def other_formats(self):
  class HwpSummaryInfo (line 640) | class HwpSummaryInfo(filestructure.HwpSummaryInfo, XmlEventsMixin):
    method events (line 642) | def events(self, **context):
  class PropertySetStreamModelEventsGenerator (line 649) | class PropertySetStreamModelEventsGenerator(object):
    method __init__ (line 651) | def __init__(self, context):
    method generateModelEvents (line 654) | def generateModelEvents(self, stream):
    method getPropertySetStreamEvents (line 657) | def getPropertySetStreamEvents(self, stream):
    method getPropertySetEvents (line 678) | def getPropertySetEvents(self, propertyset):
    method getPropertyEvents (line 696) | def getPropertyEvents(self, property):
    method getDictionaryEvents (line 716) | def getDictionaryEvents(self, dictionary):
    method getDictionaryEntryEvents (line 721) | def getDictionaryEntryEvents(self, entry):
  class DocInfo (line 731) | class DocInfo(ModelEventStream):
    method events (line 733) | def events(self, **kwargs):
  class Section (line 742) | class Section(ModelEventStream):
    method events (line 744) | def events(self, **kwargs):
  class Sections (line 763) | class Sections(binmodel.Sections, XmlEventsMixin):
    method events (line 767) | def events(self, **kwargs):
    method other_formats (line 781) | def other_formats(self):
  class HwpDoc (line 787) | class HwpDoc(Struct):
    method attributes (line 789) | def attributes():
  class Hwp5File (line 794) | class Hwp5File(binmodel.Hwp5File, XmlEventsMixin):
    method events (line 800) | def events(self, **kwargs):

FILE: src/hwp5/zlib_raw_codec.py
  function zlib_raw_encode (line 28) | def zlib_raw_encode(input, errors='strict'):
  function zlib_raw_decode (line 34) | def zlib_raw_decode(input, errors='strict'):
  class Codec (line 40) | class Codec(codecs.Codec):
    method encode (line 42) | def encode(self, input, errors='strict'):
    method decode (line 45) | def decode(self, input, errors='strict'):
  class IncrementalEncoder (line 49) | class IncrementalEncoder(codecs.IncrementalEncoder):
    method __init__ (line 50) | def __init__(self, errors='strict'):
    method encode (line 56) | def encode(self, input, final=False):
    method reset (line 65) | def reset(self):
  class IncrementalDecoder (line 69) | class IncrementalDecoder(codecs.IncrementalDecoder):
    method __init__ (line 70) | def __init__(self, errors='strict'):
    method decode (line 75) | def decode(self, input, final=False):
    method reset (line 85) | def reset(self):
  class StreamWriter (line 89) | class StreamWriter(object):
    method __init__ (line 90) | def __init__(self, stream, errors='strict'):
    method write (line 95) | def write(self, data):
  class StreamReader (line 99) | class StreamReader(object):
    method __init__ (line 100) | def __init__(self, stream, errors='strict'):
    method read (line 107) | def read(self, size=-1):
    method tell (line 133) | def tell(self):

FILE: tests/hwp5_tests/__init__.py
  function test_suite (line 4) | def test_suite():

FILE: tests/hwp5_tests/fixtures/__init__.py
  function get_fixture_path (line 8) | def get_fixture_path(filename):
  function open_fixture (line 13) | def open_fixture(filename, *args, **kwargs):

FILE: tests/hwp5_tests/mixin_olestg.py
  class OleStorageTestMixin (line 21) | class OleStorageTestMixin(object):
    method get_fixture_file (line 26) | def get_fixture_file(self, filename):
    method hwp5file_path (line 30) | def hwp5file_path(self):
    method olestg (line 34) | def olestg(self):
    method test_OleStorage (line 37) | def test_OleStorage(self):
    method test_getitem0 (line 50) | def test_getitem0(self):
    method test_init_should_receive_string_olefile (line 83) | def test_init_should_receive_string_olefile(self):
    method test_iter (line 92) | def test_iter(self):
    method test_getitem (line 105) | def test_getitem(self):
    method test_stream_open (line 132) | def test_stream_open(self):
    method test_iter_storage_leafs (line 153) | def test_iter_storage_leafs(self):
    method test_unpack (line 165) | def test_unpack(self):

FILE: tests/hwp5_tests/mixin_relaxng.py
  class RelaxNGTestMixin (line 16) | class RelaxNGTestMixin(object):
    method test_relaxng_compile (line 39) | def test_relaxng_compile(self):
    method test_relaxng (line 78) | def test_relaxng(self):

FILE: tests/hwp5_tests/mixin_xslt.py
  class XsltTestMixin (line 13) | class XsltTestMixin(object):
    method test_xslt_compile (line 25) | def test_xslt_compile(self):
    method test_xslt (line 51) | def test_xslt(self):

FILE: tests/hwp5_tests/test_binmodel.py
  function TestContext (line 61) | def TestContext(**ctx):
  class TestRecordParsing (line 71) | class TestRecordParsing(TestCase):
    method test_init_record_parsing_context (line 72) | def test_init_record_parsing_context(self):
  class BinEmbeddedTest (line 80) | class BinEmbeddedTest(TestCase):
    method testParse (line 85) | def testParse(self):
  class LanguageStructTest (line 98) | class LanguageStructTest(TestCase):
    method test_cls_dict_has_attributes (line 99) | def test_cls_dict_has_attributes(self):
  class TestBase (line 104) | class TestBase(test_recordstream.TestBase):
    method hwp5file_bin (line 107) | def hwp5file_bin(self):
  class FaceNameTest (line 113) | class FaceNameTest(TestBase):
    method test_font_file_type (line 116) | def test_font_file_type(self):
  class DocInfoTest (line 139) | class DocInfoTest(TestBase):
    method test_charshape_lang_facename (line 142) | def test_charshape_lang_facename(self):
  class BorderFillTest (line 167) | class BorderFillTest(TestBase):
    method test_parse_borderfill (line 170) | def test_parse_borderfill(self):
  class StyleTest (line 240) | class StyleTest(TestBase):
    method test_charstyle (line 243) | def test_charstyle(self):
  class ParaCharShapeTest (line 272) | class ParaCharShapeTest(TestBase):
    method paracharshape_record (line 275) | def paracharshape_record(self):
    method test_read_paracharshape (line 278) | def test_read_paracharshape(self):
  class TableTest (line 292) | class TableTest(TestBase):
    method stream (line 295) | def stream(self):
    method tablecontrol_record (line 302) | def tablecontrol_record(self):
    method tablecaption_record (line 306) | def tablecaption_record(self):
    method tablebody_record (line 310) | def tablebody_record(self):
    method tablecell_record (line 314) | def tablecell_record(self):
    method testParsePass1 (line 317) | def testParsePass1(self):
    method test_parse_child_table_body (line 336) | def test_parse_child_table_body(self):
    method test_parse_child_table_cell (line 354) | def test_parse_child_table_cell(self):
    method test_parse_child_table_caption (line 384) | def test_parse_child_table_caption(self):
  class ShapeComponentTest (line 408) | class ShapeComponentTest(TestBase):
    method control_gso_record (line 413) | def control_gso_record(self):
    method shapecomponent_record (line 417) | def shapecomponent_record(self):
    method textbox_paragraph_list_record (line 421) | def textbox_paragraph_list_record(self):
    method test_parse_shapecomponent_textbox_paragraph_list (line 424) | def test_parse_shapecomponent_textbox_paragraph_list(self):
    method test_parse (line 445) | def test_parse(self):
    method test_rect_fill (line 464) | def test_rect_fill(self):
    method test_colorpattern_gradation (line 535) | def test_colorpattern_gradation(self):
    method test_colorpattern_gradation_5017 (line 593) | def test_colorpattern_gradation_5017(self):
  class HeaderFooterTest (line 620) | class HeaderFooterTest(TestBase):
    method header_record (line 625) | def header_record(self):
    method header_paragraph_list_record (line 629) | def header_paragraph_list_record(self):
    method test_parse_child (line 632) | def test_parse_child(self):
  class ListHeaderTest (line 656) | class ListHeaderTest(TestCase):
    method testParse (line 663) | def testParse(self):
  class TableBodyTest (line 676) | class TableBodyTest(TestCase):
    method test_parse_model (line 682) | def test_parse_model(self):
  class Pass2Test (line 703) | class Pass2Test(TestCase):
    method test_pass2_events (line 706) | def test_pass2_events(self):
  class LineSegTest (line 731) | class LineSegTest(TestCase):
    method testDecode (line 732) | def testDecode(self):
  class TableCaptionCellTest (line 744) | class TableCaptionCellTest(TestCase):
    method testParsePass1 (line 757) | def testParsePass1(self):
  class TestRecordModel (line 804) | class TestRecordModel(TestCase):
    method test_assign_enum_flags_name (line 805) | def test_assign_enum_flags_name(self):
  class TestControlType (line 814) | class TestControlType(TestCase):
    method test_ControlType (line 815) | def test_ControlType(self):
  class TestControlChar (line 828) | class TestControlChar(TestBase):
    method test_decode (line 830) | def test_decode(self):
    method test_find (line 838) | def test_find(self):
    method test_tab (line 842) | def test_tab(self):
  class TestFootnoteShape (line 901) | class TestFootnoteShape(TestBase):
    method test_footnote_shape (line 903) | def test_footnote_shape(self):
  class TestControlData (line 914) | class TestControlData(TestBase):
    method test_parse (line 915) | def test_parse(self):
  class TestModelJson (line 931) | class TestModelJson(TestBase):
    method test_model_to_json (line 932) | def test_model_to_json(self):
    method test_model_to_json_should_not_modify_input (line 939) | def test_model_to_json_should_not_modify_input(self):
    method test_model_to_json_with_controlchar (line 944) | def test_model_to_json_with_controlchar(self):
    method test_model_to_json_with_unparsed (line 954) | def test_model_to_json_with_unparsed(self):
    method test_generate_models_json_array (line 963) | def test_generate_models_json_array(self):
  class TestModelStream (line 971) | class TestModelStream(TestBase):
    method docinfo (line 973) | def docinfo(self):
    method test_models (line 977) | def test_models(self):
    method test_models_treegrouped (line 980) | def test_models_treegrouped(self):
    method test_model (line 991) | def test_model(self):
    method test_models_json_open (line 998) | def test_models_json_open(self):

FILE: tests/hwp5_tests/test_bintype.py
  class lazy_property (line 27) | class lazy_property(object):
    method __init__ (line 29) | def __init__(self, f):
    method __get__ (line 32) | def __get__(self, object, owner=None):
  class TestBinIO (line 39) | class TestBinIO(TestCase):
    method BasicStruct (line 42) | def BasicStruct(self):
    method NestedStruct (line 54) | def NestedStruct(self):
    method test_map_events (line 66) | def test_map_events(self):
    method test_map_events_nested (line 85) | def test_map_events_nested(self):
    method test_map_struct_with_xarray (line 120) | def test_map_struct_with_xarray(self):
    method test_filter_with_version (line 164) | def test_filter_with_version(self):
    method test_resolve_xarray (line 191) | def test_resolve_xarray(self):
    method test_resolve_xarray_struct (line 276) | def test_resolve_xarray_struct(self):
    method test_resolve_conditional_simple (line 367) | def test_resolve_conditional_simple(self):
    method test_resolve_conditional_struct (line 418) | def test_resolve_conditional_struct(self):
    method test_resolve_selective_type (line 478) | def test_resolve_selective_type(self):
    method test_resolve_values_from_stream (line 539) | def test_resolve_values_from_stream(self):
    method test_collect_values (line 597) | def test_collect_values(self):
  class TestReadEvents (line 627) | class TestReadEvents(TestCase):
    method test_struct_with_condition (line 628) | def test_struct_with_condition(self):

FILE: tests/hwp5_tests/test_compressed.py
  class TestUncompress (line 16) | class TestUncompress(TestCase):
    method original_data (line 19) | def original_data(self):
    method compressed_data (line 23) | def compressed_data(self):
    method test_incremental_decode (line 26) | def test_incremental_decode(self):
    method test_decompress (line 37) | def test_decompress(self):

FILE: tests/hwp5_tests/test_dataio.py
  class TestArray (line 38) | class TestArray(TestCase):
    method test_new (line 39) | def test_new(self):
    method test_BSTR (line 46) | def test_BSTR(self):
    method test_hello (line 49) | def test_hello(self):
    method test_slots (line 52) | def test_slots(self):
  class TestTypedAttributes (line 57) | class TestTypedAttributes(TestCase):
    method test_typed_struct_attributes (line 59) | def test_typed_struct_attributes(self):
    method test_typed_struct_attributes_inherited (line 78) | def test_typed_struct_attributes_inherited(self):
  class TestStructType (line 99) | class TestStructType(TestCase):
    method test_assign_enum_flags_name (line 100) | def test_assign_enum_flags_name(self):
    method test_parse_members (line 110) | def test_parse_members(self):
    method test_parse_members_condition (line 132) | def test_parse_members_condition(self):
    method test_parse_members_empty (line 161) | def test_parse_members_empty(self):
    method test_parse_members_inherited (line 176) | def test_parse_members_inherited(self):
  class TestEnumType (line 211) | class TestEnumType(TestCase):
    method test_enum (line 212) | def test_enum(self):
  class TestFlags (line 273) | class TestFlags(TestCase):
    method test_parse_args (line 274) | def test_parse_args(self):
    method test_basetype (line 296) | def test_basetype(self):
    method test_bitfields (line 300) | def test_bitfields(self):
    method ByteFlags (line 316) | def ByteFlags(self):
    method test_dictvalue (line 321) | def test_dictvalue(self):
  class TestReadStruct (line 327) | class TestReadStruct(TestCase):
    method test_read_parse_error (line 329) | def test_read_parse_error(self):
  class TestBSTR (line 350) | class TestBSTR(TestCase):
    method test_read (line 352) | def test_read(self):
  class TestDecodeUTF16LEPUA (line 371) | class TestDecodeUTF16LEPUA(TestCase):
    method test_decode (line 373) | def test_decode(self):

FILE: tests/hwp5_tests/test_distdoc.py
  class TestHwp5DistDocFunctions (line 21) | class TestHwp5DistDocFunctions(TestBase):
    method hwp5distdoc (line 27) | def hwp5distdoc(self):
    method section (line 31) | def section(self):
    method test_distdoc_decode_head_to_sha1 (line 34) | def test_distdoc_decode_head_to_sha1(self):
    method test_distdoc_decode_head_to_key (line 43) | def test_distdoc_decode_head_to_key(self):
    method test_distdoc_decrypt_tail (line 49) | def test_distdoc_decrypt_tail(self):
    method test_distdoc_decode (line 63) | def test_distdoc_decode(self):

FILE: tests/hwp5_tests/test_filestructure.py
  class TestBase (line 35) | class TestBase(test_ole.TestBase):
    method hwp5file_base (line 38) | def hwp5file_base(self):
    method hwp5file_fs (line 42) | def hwp5file_fs(self):
    method docinfo (line 48) | def docinfo(self):
    method bodytext (line 52) | def bodytext(self):
    method viewtext (line 56) | def viewtext(self):
  class TestModuleFunctions (line 60) | class TestModuleFunctions(TestBase):
    method test_is_hwp5file (line 62) | def test_is_hwp5file(self):
  class TestHwp5FileBase (line 68) | class TestHwp5FileBase(TestBase):
    method hwp5file_base (line 71) | def hwp5file_base(self):
    method test_create_with_filename (line 74) | def test_create_with_filename(self):
    method test_create_with_nonole (line 78) | def test_create_with_nonole(self):
    method test_create_with_nonhwp5_storage (line 82) | def test_create_with_nonhwp5_storage(self):
    method test_item_is_hwpfileheader (line 86) | def test_item_is_hwpfileheader(self):
    method test_header (line 90) | def test_header(self):
  class TestHwp5DistDocStream (line 95) | class TestHwp5DistDocStream(TestBase):
    method jscriptversion (line 100) | def jscriptversion(self):
    method test_head_record (line 106) | def test_head_record(self):
    method test_head_record_stream (line 110) | def test_head_record_stream(self):
    method test_head (line 118) | def test_head(self):
    method test_head_stream (line 122) | def test_head_stream(self):
    method test_tail (line 126) | def test_tail(self):
    method test_tail_stream (line 130) | def test_tail_stream(self):
  class TestHwp5DistDicStorage (line 135) | class TestHwp5DistDicStorage(TestBase):
    method scripts (line 140) | def scripts(self):
    method test_scripts_other_formats (line 143) | def test_scripts_other_formats(self):
  class TestHwp5DistDoc (line 148) | class TestHwp5DistDoc(TestBase):
    method hwp5distdoc (line 153) | def hwp5distdoc(self):
    method test_conversion_for (line 156) | def test_conversion_for(self):
    method test_getitem (line 160) | def test_getitem(self):
  class TestCompressedStorage (line 167) | class TestCompressedStorage(TestBase):
    method test_getitem (line 168) | def test_getitem(self):
  class TestHwp5Compression (line 184) | class TestHwp5Compression(TestBase):
    method hwp5file_compressed (line 187) | def hwp5file_compressed(self):
    method docinfo (line 191) | def docinfo(self):
    method bodytext (line 195) | def bodytext(self):
    method scripts (line 199) | def scripts(self):
    method test_docinfo_decompressed (line 202) | def test_docinfo_decompressed(self):
    method test_bodytext_decompressed (line 206) | def test_bodytext_decompressed(self):
    method test_scripts_version (line 210) | def test_scripts_version(self):
  class TestHwp5File (line 218) | class TestHwp5File(TestBase):
    method test_init_should_accept_string_path (line 220) | def test_init_should_accept_string_path(self):
    method test_init_should_accept_olestorage (line 224) | def test_init_should_accept_olestorage(self):
    method test_init_should_accept_fs (line 228) | def test_init_should_accept_fs(self):
    method test_fileheader (line 240) | def test_fileheader(self):
    method test_getitem_storage_classes (line 245) | def test_getitem_storage_classes(self):
    method test_prv_text (line 251) | def test_prv_text(self):
    method test_distdoc_layer_inserted (line 257) | def test_distdoc_layer_inserted(self):
    method test_unpack (line 262) | def test_unpack(self):
    method test_if_hwp5file_contains_other_formats (line 283) | def test_if_hwp5file_contains_other_formats(self):
    method test_resolve_conversion_for_bodytext (line 287) | def test_resolve_conversion_for_bodytext(self):
    method test_docinfo (line 290) | def test_docinfo(self):
    method test_bodytext (line 302) | def test_bodytext(self):
  class TestSections (line 308) | class TestSections(TestBase):
    method sections (line 311) | def sections(self):
  class TestGeneratorReader (line 318) | class TestGeneratorReader(TestCase):
    method test_generator_reader (line 319) | def test_generator_reader(self):

FILE: tests/hwp5_tests/test_hwp5html.py
  class TestBase (line 17) | class TestBase(test_xmlmodel.TestBase):
    method make_base_dir (line 19) | def make_base_dir(self):
  class HtmlConvTest (line 27) | class HtmlConvTest(TestBase):
    method xslt (line 30) | def xslt(self):
    method xhwp5_path (line 34) | def xhwp5_path(self):
    method transform (line 38) | def transform(self):
    method create_xhwp5 (line 41) | def create_xhwp5(self):
    method test_generate_css_file (line 47) | def test_generate_css_file(self):
    method test_generate_html_file (line 55) | def test_generate_html_file(self):
    method test_extract_bindata_dir (line 63) | def test_extract_bindata_dir(self):
    method test_extract_bindata_dir_without_bindata (line 76) | def test_extract_bindata_dir_without_bindata(self):

FILE: tests/hwp5_tests/test_hwp5odt.py
  class ResourcesTest (line 12) | class ResourcesTest(TestCase):
    method test_pkg_resources_filename_fallback (line 14) | def test_pkg_resources_filename_fallback(self):
    method test_hwp5_resources_filename (line 18) | def test_hwp5_resources_filename(self):

FILE: tests/hwp5_tests/test_odtxsl.py
  function example_path (line 17) | def example_path(filename):
  function open_example (line 21) | def open_example(filename):
  class TestPrecondition (line 26) | class TestPrecondition(TestCase):
    method test_example (line 27) | def test_example(self):
  class TestODTTransform (line 32) | class TestODTTransform(TestCase):
    method odt_path (line 35) | def odt_path(self):
    method transform (line 39) | def transform(self):
    method test_convert_bindata (line 46) | def test_convert_bindata(self):

FILE: tests/hwp5_tests/test_ole.py
  class TestBase (line 14) | class TestBase(TestCase):
    method get_fixture_file (line 18) | def get_fixture_file(self, filename):
    method open_fixture (line 21) | def open_fixture(self, filename, *args, **kwargs):
    method hwp5file_path (line 25) | def hwp5file_path(self):
    method olestg (line 29) | def olestg(self):
  class TestOleStorage (line 33) | class TestOleStorage(TestCase, OleStorageTestMixin):
    method setUp (line 35) | def setUp(self):

FILE: tests/hwp5_tests/test_plat_gir_gsf.py
  function skip_if_disabled (line 13) | def skip_if_disabled(f):
  class TestGirGsf (line 23) | class TestGirGsf(TestCase):
    method test_open (line 28) | def test_open(self):
    method test_listdir (line 32) | def test_listdir(self):
  class TestOleStorageGirGsf (line 43) | class TestOleStorageGirGsf(TestCase, OleStorageTestMixin):
    method setUp (line 45) | def setUp(self):

FILE: tests/hwp5_tests/test_plat_javax_transform.py
  class TestPlatJavaxTransform (line 13) | class TestPlatJavaxTransform(unittest.TestCase, XsltTestMixin):
    method test_is_enabled (line 15) | def test_is_enabled(self):
    method setUp (line 22) | def setUp(self):

FILE: tests/hwp5_tests/test_plat_jython_poifs.py
  class TestOleStorageJythonPoiFS (line 12) | class TestOleStorageJythonPoiFS(TestCase, OleStorageTestMixin):
    method setUp (line 14) | def setUp(self):

FILE: tests/hwp5_tests/test_plat_lxml.py
  class TestPlatLxml (line 13) | class TestPlatLxml(unittest.TestCase, XsltTestMixin, RelaxNGTestMixin):
    method test_is_enabled (line 15) | def test_is_enabled(self):
    method setUp (line 25) | def setUp(self):

FILE: tests/hwp5_tests/test_plat_olefileio.py
  class TestOleStorageOleFileIO (line 12) | class TestOleStorageOleFileIO(TestCase, OleStorageTestMixin):
    method setUp (line 14) | def setUp(self):

FILE: tests/hwp5_tests/test_plat_uno.py
  class TestPlatUNO (line 13) | class TestPlatUNO(unittest.TestCase, XsltTestMixin, OleStorageTestMixin):
    method setUp (line 15) | def setUp(self):

FILE: tests/hwp5_tests/test_plat_xmllint.py
  class TestPlatXmlLint (line 12) | class TestPlatXmlLint(unittest.TestCase, RelaxNGTestMixin):
    method setUp (line 17) | def setUp(self):

FILE: tests/hwp5_tests/test_plat_xsltproc.py
  class TestPlatXsltProc (line 12) | class TestPlatXsltProc(unittest.TestCase, XsltTestMixin):
    method setUp (line 17) | def setUp(self):

FILE: tests/hwp5_tests/test_recordstream.py
  class TestBase (line 22) | class TestBase(test_filestructure.TestBase):
    method hwp5file_rec (line 25) | def hwp5file_rec(self):
  class TestRecord (line 31) | class TestRecord(TestBase):
    method test_read_record (line 33) | def test_read_record(self):
    method test_dump_record (line 39) | def test_dump_record(self):
  class TestRecordStream (line 49) | class TestRecordStream(TestBase):
    method docinfo (line 52) | def docinfo(self):
    method test_records (line 56) | def test_records(self):
    method test_records_kwargs_treegroup (line 59) | def test_records_kwargs_treegroup(self):
    method test_record (line 72) | def test_record(self):
    method test_records_treegrouped (line 79) | def test_records_treegrouped(self):
    method test_records_treegrouped_as_iterable (line 91) | def test_records_treegrouped_as_iterable(self):
    method test_records_treegroped_as_list (line 96) | def test_records_treegroped_as_list(self):
    method test_records_treegroup (line 101) | def test_records_treegroup(self):
  class TestHwp5File (line 115) | class TestHwp5File(TestBase):
    method test_if_hwp5file_contains_other_formats (line 117) | def test_if_hwp5file_contains_other_formats(self):
    method test_docinfo (line 121) | def test_docinfo(self):
    method test_bodytext (line 127) | def test_bodytext(self):
  class TestJson (line 134) | class TestJson(TestBase):
    method test_record_to_json (line 135) | def test_record_to_json(self):
    method test_generate_json (line 148) | def test_generate_json(self):

FILE: tests/hwp5_tests/test_storage.py
  class TestStorageWrapper (line 11) | class TestStorageWrapper(TestCase):
    method storage (line 14) | def storage(self):
    method test_iter (line 18) | def test_iter(self):
    method test_getitem (line 23) | def test_getitem(self):

FILE: tests/hwp5_tests/test_treeop.py
  class Test_ancestors_from_level (line 14) | class Test_ancestors_from_level(TestCase):
    method test_ancestors_from_level (line 16) | def test_ancestors_from_level(self):
    method test_ancestors_from_level_from_nonzero_baselevel (line 40) | def test_ancestors_from_level_from_nonzero_baselevel(self):
    method test_ancestors_from_level_fails_at_level_below_baselevel (line 55) | def test_ancestors_from_level_fails_at_level_below_baselevel(self):
    method test_ancestors_from_level_assert_fails_at_invalid_level_jump (line 82) | def test_ancestors_from_level_assert_fails_at_invalid_level_jump(self):
  class TestTreeEvents (line 96) | class TestTreeEvents(TestCase):
    method test_tree_events (line 97) | def test_tree_events(self):
  class TestSubevents (line 133) | class TestSubevents(TestCase):
    method test_iter_subevents (line 135) | def test_iter_subevents(self):

FILE: tests/hwp5_tests/test_utils.py
  class UnicodeEscapeTest (line 28) | class UnicodeEscapeTest(TestCase):
    method test_escape (line 30) | def test_escape(self):
    method test_unescape (line 37) | def test_unescape(self):

FILE: tests/hwp5_tests/test_xmlformat.py
  class TestHello (line 16) | class TestHello(TestCase):
    method test_hello (line 17) | def test_hello(self):
    method test_xmlattr_uniqnames (line 61) | def test_xmlattr_uniqnames(self):

FILE: tests/hwp5_tests/test_xmlmodel.py
  class TestBase (line 39) | class TestBase(test_binmodel.TestBase):
    method hwp5file_xml (line 42) | def hwp5file_xml(self):
  class TestXmlEvents (line 48) | class TestXmlEvents(TestBase):
    method test_dump_quoteattr_cr (line 50) | def test_dump_quoteattr_cr(self):
    method test_bytechunks_quoteattr_cr (line 63) | def test_bytechunks_quoteattr_cr(self):
  class TestModelEventStream (line 76) | class TestModelEventStream(TestBase):
    method docinfo (line 79) | def docinfo(self):
    method test_modelevents (line 83) | def test_modelevents(self):
  class TestDocInfo (line 89) | class TestDocInfo(TestBase):
    method docinfo (line 92) | def docinfo(self):
    method test_events (line 96) | def test_events(self):
    method test_events_with_embedbin (line 104) | def test_events_with_embedbin(self):
  class TestSection (line 113) | class TestSection(TestBase):
    method test_events (line 115) | def test_events(self):
  class TestHwp5File (line 133) | class TestHwp5File(TestBase):
    method test_docinfo_class (line 135) | def test_docinfo_class(self):
    method test_events (line 138) | def test_events(self):
    method test_events_embedbin_without_bindata (line 141) | def test_events_embedbin_without_bindata(self):
    method test_xmlevents (line 148) | def test_xmlevents(self):
    method test_xmlevents_dump (line 155) | def test_xmlevents_dump(self):
  class TestShapedText (line 165) | class TestShapedText(TestCase):
    method test_make_shape_range (line 166) | def test_make_shape_range(self):
    method test_split (line 172) | def test_split(self):
  class TestLineSeg (line 207) | class TestLineSeg(TestCase):
    method test_line_segmented (line 208) | def test_line_segmented(self):
  class TestDistributionBodyText (line 222) | class TestDistributionBodyText(TestBase):
    method test_issue33_missing_paralineseg (line 226) | def test_issue33_missing_paralineseg(self):
  class TestMatchFieldStartEnd (line 249) | class TestMatchFieldStartEnd(TestCase):
    method test_match_field_start_end (line 251) | def test_match_field_start_end(self):
    method test_issue144_fields_crossing_lineseg_boundary (line 292) | def test_issue144_fields_crossing_lineseg_boundary(self):
  class TestEmbedBinData (line 321) | class TestEmbedBinData(TestBase):
    method test_embed_bindata (line 323) | def test_embed_bindata(self):

FILE: tools/constants/pyhwp_dev_constants.py
  class Recipe (line 6) | class Recipe(object):
    method __init__ (line 8) | def __init__(self, buildout, name, options):
    method install (line 16) | def install(self):
    method update (line 19) | def update(self):

FILE: tools/discover.lo/discover_lo.py
  function wellknown_locations (line 15) | def wellknown_locations():
  function discover_lo (line 26) | def discover_lo(in_wellknown=True, in_path=True):
  function discover_in_wellknown_locations (line 36) | def discover_in_wellknown_locations():
  function discover_in_path (line 49) | def discover_in_path():
  function contains_libreoffice (line 75) | def contains_libreoffice(dir):
  function contains_program (line 79) | def contains_program(location):
  function find_ure (line 107) | def find_ure(location):
  function python_import_uno (line 120) | def python_import_uno(python):
  function resolve_uno_components (line 128) | def resolve_uno_components(uno_python):
  function get_uno_locations (line 145) | def get_uno_locations(python, modules):
  function subprocess_check_output (line 157) | def subprocess_check_output(cmd):
  function log_discovered (line 180) | def log_discovered(installations):
  function original_pythonpath (line 191) | def original_pythonpath():
  class Discover (line 204) | class Discover(object):
    method __init__ (line 208) | def __init__(self, buildout, name, options):
    method install (line 265) | def install(self):

FILE: tools/discover.lxml/discover_lxml.py
  function discover_lxml (line 48) | def discover_lxml(executable):
  class DiscoverRecipe (line 83) | class DiscoverRecipe(object):
    method __init__ (line 87) | def __init__(self, buildout, name, options):
    method install (line 117) | def install(self):

FILE: tools/discover.lxml/setup.py
  function main (line 7) | def main():

FILE: tools/discover.python/discover_python.py
  function wellknown_locations (line 16) | def wellknown_locations():
  function discover_python (line 33) | def discover_python(in_wellknown=True, in_path=True):
  function search_in_wellknown_locations (line 44) | def search_in_wellknown_locations():
  function search_in_path (line 56) | def search_in_path():
  function contains_python_in_bin (line 70) | def contains_python_in_bin(dir):
  function contains_python (line 75) | def contains_python(dir):
  function executable_in_dir (line 92) | def executable_in_dir(name, dir):
  function executable_is_python (line 102) | def executable_is_python(executable):
  function log_discovered (line 133) | def log_discovered(qualify, found, names, log=logger.info):
  function expose_options (line 143) | def expose_options(options, names, found, not_found, logger=logger):
  class Discover (line 162) | class Discover(object):
    method __init__ (line 166) | def __init__(self, buildout, name, options):
    method install (line 219) | def install(self):

FILE: tools/discover.python/setup.py
  function main (line 6) | def main():

FILE: tools/download/pyhwp_download.py
  function main (line 16) | def main():
  function copy_stream (line 55) | def copy_stream(src, dst):
  function md5_file (line 63) | def md5_file(path):

FILE: tools/egg.path/egg_path.py
  class EggPath (line 5) | class EggPath(object):
    method __init__ (line 6) | def __init__(self, buildout, name, options):
    method install (line 27) | def install(self):

FILE: tools/gpl/gpl/Pysec.py
  function Record (line 5) | def Record(*props):
  class RecordBase (line 14) | class RecordBase(tuple):
    method __new__ (line 17) | def __new__(cls, *values):
    method fromValues (line 23) | def fromValues(cls, values):
    method __repr__ (line 26) | def __repr__(self):
    method prepare (line 31) | def prepare(cls, *args):
    method setProps (line 36) | def setProps(cls, props):
    method setProp (line 42) | def setProp(cls, index, prop):
    method makeGetter (line 50) | def makeGetter(cls, index, prop):
    method makeSetter (line 54) | def makeSetter(cls, index, prop):
  class ByteStream (line 64) | class ByteStream(Record("bytes", "index")):
    method prepare (line 66) | def prepare(cls, bytes, index = 0):
    method get (line 69) | def get(self, count):
  function make_decorator (line 76) | def make_decorator(func, *dec_args):
  class Monad (line 91) | class Monad:
    method bind (line 93) | def bind(self, func):
    method unit (line 97) | def unit(cls, val):
    method lift (line 101) | def lift(cls, func):
    method __rshift__ (line 105) | def __rshift__(self, bindee):
    method __and__ (line 108) | def __and__(self, monad):
    method shove (line 112) | def shove(self, monad):
  class StateChanger (line 116) | class StateChanger(Record("changer", "bindees"), Monad):
    method prepare (line 118) | def prepare(cls, changer, bindees = ()):
    method bind (line 122) | def bind(self, bindee):
    method __call__ (line 125) | def __call__(self, state):
    method run (line 128) | def run(self, state0):
    method unit (line 137) | def unit(cls, value):
  class ParserState (line 144) | class ParserState(Record("stream", "position")):
    method prepare (line 146) | def prepare(cls, stream, position = 0):
    method read (line 149) | def read(self, count):
  class Parser (line 154) | class Parser(StateChanger):
    method parseString (line 155) | def parseString(self, bytes):
    method parseStream (line 158) | def parseStream(self, stream):
  class ParseFailed (line 164) | class ParseFailed(Exception):
    method __init__ (line 165) | def __init__(self, message, state):
  function parser (line 172) | def parser(func, func_args, func_kargs):
  function tokens (line 183) | def tokens(state0, count, process):
  function read (line 193) | def read(count):
  function skip (line 198) | def skip(state0, parser):
  function option (line 204) | def option(state, default_value, parser):
  function choice (line 215) | def choice(state, parsers):
  function match (line 226) | def match(state0, expected):
  function between (line 234) | def between(before, inner, after):
  function quoted (line 238) | def quoted(before, inner, after):
  function quoted_collection (line 242) | def quoted_collection(start, space, inner, joiner, end):
  function many (line 247) | def many(state, parser, min_count = 0):
  function group (line 262) | def group(state, parsers):
  function pair (line 272) | def pair(parser1, parser2):
  function skip_many (line 278) | def skip_many(state, parser):
  function skip_before (line 286) | def skip_before(before, parser):
  function skip_after (line 291) | def skip_after(state0, parser, after):
  function option_many (line 298) | def option_many(state0, first, repeated, min_count = 0):
  function end_by (line 313) | def end_by(parser, sep_parser, min_count = 0):
  function sep_by (line 318) | def sep_by(parser, sep_parser, min_count = 0):
  function sep_end_by (line 323) | def sep_end_by(parser, sep_parser, min_count = 0):
  function satisfy (line 330) | def satisfy(name, passes):
  function one_of (line 334) | def one_of(chars):
  function none_of (line 339) | def none_of(chars):
  function maybe_match_parser (line 344) | def maybe_match_parser(parser):
  function maybe_match_parsers (line 348) | def maybe_match_parsers(parsers):
  function many_chars (line 352) | def many_chars(parser, min_count = 0):
  function option_chars (line 356) | def option_chars(parsers):
  function group_chars (line 360) | def group_chars(parsers):
  function join_chars (line 365) | def join_chars(parser):
  function while_one_of (line 369) | def while_one_of(chars, min_count = 0):
  function until_one_of (line 373) | def until_one_of(chars, min_count = 0):
  function char_range (line 377) | def char_range(begin, end):
  function quoted_chars (line 381) | def quoted_chars(start, end):
  function line (line 421) | def line(cell):
  function csv (line 424) | def csv(cell):

FILE: tools/gpl/gpl/__init__.py
  function main (line 20) | def main():
  function process_file (line 62) | def process_file(path, license_modifiers):
  function stringify_years (line 83) | def stringify_years(years):

FILE: tools/gpl/gpl/parsers.py
  function quoted_chars_inline (line 36) | def quoted_chars_inline(start, end):
  function until_one_of_inline (line 40) | def until_one_of_inline(chars):
  function skip_tailspace_of_line (line 44) | def skip_tailspace_of_line(parser):
  function until_not_but (line 50) | def until_not_but(state0, should_not, but):
  function py_comment (line 62) | def py_comment(parser):
  class Project (line 66) | class Project(Record('name', 'description')):
    method prepare (line 69) | def prepare(cls, name, description=None):
    method __str__ (line 75) | def __str__(self):
  class Span (line 96) | class Span(Record('start', 'end')):
    method prepare (line 99) | def prepare(cls, start, end=None):
    method as_set (line 105) | def as_set(self):
    method from_set (line 109) | def from_set(cls, valueset):
    method __str__ (line 125) | def __str__(self):
  class Author (line 138) | class Author(Record('name', 'email')):
    method prepare (line 141) | def prepare(self, name, email=None):
    method __str__ (line 147) | def __str__(self):
  class Copyright (line 165) | class Copyright(Record('years', 'authors')):
    method __str__ (line 166) | def __str__(self):
  class License (line 181) | class License(Record('prolog', 'project', 'copyright', 'epilog')):
    method __str__ (line 183) | def __str__(self):
  function parse_file (line 199) | def parse_file(path):

FILE: tools/gpl/gpl/tests/test_gpl.py
  class SpanTest (line 5) | class SpanTest(TestCase):
    method test_from_set (line 7) | def test_from_set(self):
    method test_str (line 18) | def test_str(self):
  class ProjectTest (line 31) | class ProjectTest(TestCase):
    method test_project_name (line 33) | def test_project_name(self):
    method test_project_desc (line 37) | def test_project_desc(self):
    method test_project_line_with_lf (line 42) | def test_project_line_with_lf(self):
    method test_project_line_without_lf (line 52) | def test_project_line_without_lf(self):
    method test_project_line_parser_doesnt_consume_after_lf (line 62) | def test_project_line_parser_doesnt_consume_after_lf(self):
  class CopyrightTest (line 71) | class CopyrightTest(TestCase):
    method test_stringify_years (line 73) | def test_stringify_years(self):
    method test_copyright (line 84) | def test_copyright(self):
    method test_generic_line (line 149) | def test_generic_line(self):
  class LicenseTest (line 155) | class LicenseTest(TestCase):
    method test_license (line 156) | def test_license(self):

FILE: tools/jingodf/jingodf/__init__.py
  class Jing (line 3) | class Jing(object):
    method __init__ (line 5) | def __init__(self, executable='jing'):
    method __call__ (line 12) | def __call__(self, *args, **kwargs):
    method validate (line 32) | def validate(self, rngfile, xmlfile):
  class XmlLint (line 36) | class XmlLint(object):
    method __init__ (line 37) | def __init__(self, executable='xmllint'):
    method __call__ (line 44) | def __call__(self, *args, **kwargs):
    method validate (line 79) | def validate(self, rngfile, xmlfile):
  class ODFValidator (line 83) | class ODFValidator(object):
    method __init__ (line 84) | def __init__(self, engine):
    method validate_manifest_xml (line 87) | def validate_manifest_xml(self, version, xmlfile):
    method validate_opendocument_xml (line 100) | def validate_opendocument_xml(self, version, xmlfile):
    method validate_odf (line 112) | def validate_odf(self, version, odffile):
  function validate (line 157) | def validate(odf_file,
  function main (line 175) | def main():

FILE: tools/jxml/jxml.coverage/jxml_coverage.py
  function colorama_init (line 16) | def colorama_init(f):
  function annotate_main (line 27) | def annotate_main():
  function load_tests (line 75) | def load_tests(filenames):
  function cov_test_main (line 89) | def cov_test_main():

FILE: tools/jxml/jxml/etree/__init__.py
  class XSLTCoverage (line 49) | class XSLTCoverage(object):
    method __init__ (line 51) | def __init__(self):
    method trace (line 54) | def trace(self, systemId, startline, endline):
    method writeto (line 60) | def writeto(self, f):
    method read_from (line 94) | def read_from(self, filename):
  function xsltcoverage (line 125) | def xsltcoverage(output=None):
  function instrument_xalan_transformer_factory (line 138) | def instrument_xalan_transformer_factory(transformfac):
  function split_prefix_and_localName (line 207) | def split_prefix_and_localName(tag):
  function split_jcnotation (line 214) | def split_jcnotation(tag):
  function get_prefix_for_uri (line 227) | def get_prefix_for_uri(namespaceURI, nsmap):
  function dom_element_from_tag (line 238) | def dom_element_from_tag(tag, nsmap=None):
  function dom_document_from_file (line 250) | def dom_document_from_file(f):
  function dom_document_from_inputstream (line 274) | def dom_document_from_inputstream(inputstream):
  function dom_tag (line 278) | def dom_tag(dom_element):
  function dom_jcnotation (line 282) | def dom_jcnotation(dom_node):
  function dom_nsmap_specified_here (line 295) | def dom_nsmap_specified_here(dom_element):
  function dom_ancestors (line 315) | def dom_ancestors(dom_node):
  function dom_ancestor_elements (line 324) | def dom_ancestor_elements(dom_node):
  function dom_siblings_next (line 329) | def dom_siblings_next(dom_node):
  function dom_siblings_previous (line 338) | def dom_siblings_previous(dom_node):
  function dom_nsmap (line 347) | def dom_nsmap(dom_element):
  function dom_set_attr (line 357) | def dom_set_attr(dom_element, key, value, nsmap):
  function Element (line 367) | def Element(tag, attrib=None, nsmap=None, **extra):
  function SubElement (line 384) | def SubElement(parent, tag, attrib=None, nsmap=None, **extra):
  function ElementTree (line 390) | def ElementTree(element=None, file=None, parser=None):
  class _Element (line 406) | class _Element(object):
    method __init__ (line 408) | def __init__(self, dom_element):
    method getroottree (line 414) | def getroottree(self):
    method attrib (line 419) | def attrib(self):
    method tag (line 430) | def tag(self):
    method nsmap (line 434) | def nsmap(self):
    method prefix (line 438) | def prefix(self):
    method text (line 443) | def text(self):
    method tail (line 449) | def tail(self):
    method base (line 455) | def base(self):
    method __deepcopy__ (line 459) | def __deepcopy__(self, memo):
    method __iter__ (line 464) | def __iter__(self):
    method __getitem__ (line 471) | def __getitem__(self, index):
    method __len__ (line 483) | def __len__(self):
    method __reversed__ (line 489) | def __reversed__(self):
    method __setitem__ (line 498) | def __setitem__(self, index, new_elem):
    method append (line 506) | def append(self, element):
    method get (line 512) | def get(self, key):
    method getchildren (line 515) | def getchildren(self):
    method getnext (line 519) | def getnext(self):
    method getparent (line 525) | def getparent(self):
    method getprevious (line 530) | def getprevious(self):
    method iterancestors (line 536) | def iterancestors(self, *tags):
    method keys (line 543) | def keys(self):
    method set (line 546) | def set(self, key, value):
    method values (line 551) | def values(self):
    method xpath (line 554) | def xpath(self, _path, namespaces=None, extensions=None,
  class _ElementTree (line 560) | class _ElementTree(object):
    method __init__ (line 562) | def __init__(self, dom_doc):
    method __copy__ (line 565) | def __copy__(self, dom_doc):
    method __deepcopy__ (line 568) | def __deepcopy__(self, memo):
    method docinfo (line 574) | def docinfo(self):
    method _setroot (line 578) | def _setroot(self, root):
    method _set_dom_doc (line 581) | def _set_dom_doc(self, dom_doc):
    method getroot (line 587) | def getroot(self):
    method find (line 592) | def find(self, path, namespaces=None):
    method findall (line 596) | def findall(self, path, namespaces=None):
    method findtext (line 600) | def findtext(self, path, default=None, namespaces=None):
    method iter (line 604) | def iter(self, **tags):
    method iterfind (line 608) | def iterfind(self, path, namespaces=None):
    method relaxng (line 612) | def relaxng(self, relaxng):
    method write (line 615) | def write(self, file, encoding=None, method='xml', pretty_print=False,
    method write_c14n (line 635) | def write_c14n(self, file, exlusive=False, with_comments=True,
    method xinclude (line 639) | def xinclude(self):
    method xmlschema (line 642) | def xmlschema(self, xmlschema):
    method xpath (line 645) | def xpath(self, _path, namespaces=None, extensions=None,
    method xslt (line 650) | def xslt(self, _xslt, extensions=None, access_control=None, **_kw):
  class DocInfo (line 656) | class DocInfo(object):
    method __init__ (line 658) | def __init__(self, dom_doc):
    method getURL (line 661) | def getURL(self):
    method setURL (line 664) | def setURL(self, uri):
    method doctype (line 670) | def doctype(self):
    method public_id (line 677) | def public_id(self):
    method system_url (line 683) | def system_url(self):
    method encoding (line 689) | def encoding(self):
    method root_name (line 693) | def root_name(self):
    method standalone (line 699) | def standalone(self):
    method xml_version (line 703) | def xml_version(self):
    method externalDTD (line 707) | def externalDTD(self):
    method internalDTD (line 712) | def internalDTD(self):
  class QName (line 717) | class QName(object):
    method __init__ (line 719) | def __init__(self, text_or_uri_or_element, tag=None):
    method text (line 740) | def text(self):
  class XPath (line 746) | class XPath(object):
    method __init__ (line 748) | def __init__(self, path, namespaces=None, extensions=None, regexp=True,
    method __call__ (line 758) | def __call__(self, _etree_or_element, **_variables):
    method _eval_nodeset (line 796) | def _eval_nodeset(self, node):
    method _eval_node (line 800) | def _eval_node(self, node):
    method _eval_string (line 804) | def _eval_string(self, node):
    method _eval_number (line 808) | def _eval_number(self, node):
    method _eval_boolean (line 812) | def _eval_boolean(self, node):
  function dom_xpath_result (line 818) | def dom_xpath_result(result):
  function dom_xpath_result_nodelist (line 823) | def dom_xpath_result_nodelist(nodelist):
  function dom_xpath_result_element (line 832) | def dom_xpath_result_element(element):
  function dom_xpath_result_attr (line 837) | def dom_xpath_result_attr(attr):
  class NamespaceContextImpl (line 841) | class NamespaceContextImpl(NamespaceContext):
    method __init__ (line 843) | def __init__(self, nsmap):
    method getNamespaceURI (line 846) | def getNamespaceURI(self, prefix):
    method getPrefixes (line 854) | def getPrefixes(self, namespaceURI):
    method getPrefix (line 859) | def getPrefix(self, namespaceURI):
    method iterPrefixes (line 864) | def iterPrefixes(self, namespaceURI):
  class IteratorImpl (line 872) | class IteratorImpl(Iterator):
    method __init__ (line 874) | def __init__(self, it):
    method hasNext (line 878) | def hasNext(self):
    method next (line 881) | def next(self):
    method _goNext (line 890) | def _goNext(self):
  class XSLT (line 899) | class XSLT(object):
    method __init__ (line 901) | def __init__(self, xsl_input, extensions=None, regexp=True,
    method __call__ (line 925) | def __call__(self, _input, profile_run=False, **kw):
  class _XSLTResultTree (line 986) | class _XSLTResultTree(_ElementTree):
    method __unicode__ (line 988) | def __unicode__(self):
    method __str__ (line 991) | def __str__(self):
  class __URIResolverImpl (line 995) | class __URIResolverImpl(URIResolver):
    method __init__ (line 997) | def __init__(self, tree):
    method resolve (line 1001) | def resolve(self, href, base):
  function parse (line 1020) | def parse(source, parser=None, base_url=None):
  function fromstring (line 1032) | def fromstring(text, parser=None, base_url=None):
  function tostring (line 1040) | def tostring(element_or_tree, encoding=None, method='xml',
  function XML (line 1069) | def XML(s):

FILE: tools/jxml/tests/test_jaxp.py
  function unsigned_byte (line 25) | def unsigned_byte(x):
  function Transformer (line 31) | def Transformer(xsl_source):
  function transform (line 41) | def transform(xsl_source, src_source):
  class TestXSLT (line 46) | class TestXSLT(unittest.TestCase):
    method test_xsl_dom (line 50) | def test_xsl_dom(self):
    method test_xsl_stream (line 60) | def test_xsl_stream(self):

FILE: tools/jxml/tests/test_lxml.py
  class ElementTreeTest (line 16) | class ElementTreeTest(TestCase):
    method test_etree_parse (line 18) | def test_etree_parse(self):
    method test_etree_fromstring (line 23) | def test_etree_fromstring(self):
    method test_etree_from_file (line 28) | def test_etree_from_file(self):
    method test_etree_tostring (line 43) | def test_etree_tostring(self):
    method test_from_element (line 49) | def test_from_element(self):
    method test_docinfo (line 62) | def test_docinfo(self):
    method test_parser (line 80) | def test_parser(self):
    method test__copy__ (line 83) | def test__copy__(self):
    method test__deepcopy__ (line 86) | def test__deepcopy__(self):
    method test_setroot (line 89) | def test_setroot(self):
    method test_find (line 96) | def test_find(self):
    method test_findall (line 99) | def test_findall(self):
    method test_findtext (line 102) | def test_findtext(self):
    method test_getiterator (line 105) | def test_getiterator(self):
    method test_getpath (line 108) | def test_getpath(self):
    method test_getroot (line 111) | def test_getroot(self):
    method test_iter (line 118) | def test_iter(self):
    method test_iterfind (line 121) | def test_iterfind(self):
    method test_parse (line 124) | def test_parse(self):
    method test_relaxng (line 127) | def test_relaxng(self):
    method test_write (line 130) | def test_write(self):
    method test_write_c14n (line 146) | def test_write_c14n(self):
    method test_xinclude (line 149) | def test_xinclude(self):
    method test_xmlschema (line 152) | def test_xmlschema(self):
    method test_xpath (line 155) | def test_xpath(self):
    method test_xslt (line 187) | def test_xslt(self):
  class ElementTest (line 195) | class ElementTest(TestCase):
    method setUp (line 197) | def setUp(self):
    method tearDown (line 202) | def tearDown(self):
    method test_Element (line 205) | def test_Element(self):
    method test_SubElement (line 227) | def test_SubElement(self):
    method test_base (line 234) | def test_base(self):
    method test_tag (line 241) | def test_tag(self):
    method test_nsmap (line 254) | def test_nsmap(self):
    method test_prefix (line 261) | def test_prefix(self):
    method test_text (line 265) | def test_text(self):
    method test_tail (line 269) | def test_tail(self):
    method test_attrib (line 273) | def test_attrib(self):
    method test__contains__ (line 281) | def test__contains__(self):
    method test__copy__ (line 284) | def test__copy__(self):
    method test__deepcopy__ (line 287) | def test__deepcopy__(self):
    method test__delitem__ (line 290) | def test__delitem__(self):
    method test__getitem__ (line 293) | def test__getitem__(self):
    method test__iter__ (line 309) | def test__iter__(self):
    method test__len__ (line 328) | def test__len__(self):
    method test__nonzero__ (line 332) | def test__nonzero__(self):
    method test__repr__ (line 335) | def test__repr__(self):
    method test__reversed__ (line 338) | def test__reversed__(self):
    method test__setitem__ (line 357) | def test__setitem__(self):
    method test_addnext (line 365) | def test_addnext(self):
    method test_addprevious (line 368) | def test_addprevious(self):
    method test_append (line 371) | def test_append(self):
    method test_clear (line 378) | def test_clear(self):
    method test_extend (line 381) | def test_extend(self):
    method test_find (line 384) | def test_find(self):
    method test_findall (line 387) | def test_findall(self):
    method test_findtext (line 390) | def test_findtext(self):
    method test_get (line 393) | def test_get(self):
    method test_getchildren (line 400) | def test_getchildren(self):
    method test_getiterator (line 417) | def test_getiterator(self):
    method test_getnext (line 420) | def test_getnext(self):
    method test_getparent (line 431) | def test_getparent(self):
    method test_getprevious (line 440) | def test_getprevious(self):
    method test_getroottree (line 453) | def test_getroottree(self):
    method test_index (line 457) | def test_index(self):
    method test_insert (line 460) | def test_insert(self):
    method test_items (line 463) | def test_items(self):
    method test_iter (line 466) | def test_iter(self):
    method test_iterancestors (line 469) | def test_iterancestors(self):
    method test_iterchildren (line 493) | def test_iterchildren(self):
    method test_descendants (line 496) | def test_descendants(self):
    method test_iterfind (line 499) | def test_iterfind(self):
    method test_siblings (line 502) | def test_siblings(self):
    method test_itertext (line 505) | def test_itertext(self):
    method test_keys (line 508) | def test_keys(self):
    method test_makeelement (line 515) | def test_makeelement(self):
    method test_remove (line 518) | def test_remove(self):
    method test_replace (line 521) | def test_replace(self):
    method test_set (line 524) | def test_set(self):
    method test_values (line 532) | def test_values(self):
    method test_xpath (line 535) | def test_xpath(self):
  class QNameTest (line 564) | class QNameTest(TestCase):
    method test_from_text (line 570) | def test_from_text(self):
    method test_from_nsuri_and_tag (line 581) | def test_from_nsuri_and_tag(self):
    method test_from_element (line 587) | def test_from_element(self):
  class XPathTest (line 595) | class XPathTest(TestCase):
    method test_xpath (line 597) | def test_xpath(self):
  class XSLTTest (line 639) | class XSLTTest(TestCase):
    method test_from_element (line 641) | def test_from_element(self):
    method test_xslt_with_default_parser (line 646) | def test_xslt_with_default_parser(self):
    method test_text_output (line 653) | def test_text_output(self):

FILE: tools/oxt.tool/oxt_tool/__init__.py
  function console (line 5) | def console(soffice='soffice'):
  function dict_to_namedvalue (line 23) | def dict_to_namedvalue(d):
  function test_remotely (line 36) | def test_remotely(soffice, discover_dirs, extra_path, logconf_path):
  function load_component (line 104) | def load_component(component_path, component_name):
  function console_in_proc (line 118) | def console_in_proc(soffice='soffice'):
  class LoEnviron (line 165) | class LoEnviron(object):
    method __init__ (line 167) | def __init__(self, program_dir):
    method rc_ext (line 171) | def rc_ext(self):
    method fundamentalrc (line 180) | def fundamentalrc(self):
    method ure_bootstrap (line 187) | def ure_bootstrap(self):
  function run_in_lo (line 191) | def run_in_lo(soffice='soffice'):
  function install (line 266) | def install(unopkg='unopkg'):
  class Console (line 277) | class Console(object):
    method __init__ (line 278) | def __init__(self, buildout, name, options):
    method install (line 299) | def install(self):
  class TestRunner (line 326) | class TestRunner(object):
    method __init__ (line 327) | def __init__(self, buildout, name, options):
    method install (line 345) | def install(self):
  class Installer (line 372) | class Installer(object):
    method __init__ (line 373) | def __init__(self, buildout, name, options):
    method install (line 389) | def install(self):

FILE: tools/oxt.tool/oxt_tool/backend.py
  function implementation (line 18) | def implementation(component_name, *services):
  class TestRunnerJob (line 28) | class TestRunnerJob(unohelper.Base, XJob):
    method __init__ (line 30) | def __init__(self, context):
    method execute (line 33) | def execute(self, arguments):
    method run (line 58) | def run(self, args):
  function sandbox (line 100) | def sandbox(working_dir, **kwargs):
  class RemoteRunJob (line 132) | class RemoteRunJob(unohelper.Base, XJob):
    method __init__ (line 134) | def __init__(self, context):
    method execute (line 137) | def execute(self, arguments):
    method run (line 155) | def run(self, args):
  class ConsoleJob (line 183) | class ConsoleJob(unohelper.Base, XJob):
    method __init__ (line 185) | def __init__(self, context):
    method execute (line 188) | def execute(self, arguments):
  class Console (line 216) | class Console(InteractiveConsole):
    method __init__ (line 218) | def __init__(self, inp, outfile):
    method write (line 223) | def write(self, data):
    method raw_input (line 227) | def raw_input(self, prompt=''):
  class FileFromStream (line 239) | class FileFromStream(object):
    method __init__ (line 246) | def __init__(self, stream, encoding='utf-8'):
    method close (line 290) | def close(self):

FILE: tools/oxt.tool/oxt_tool/description.py
  function as_dict (line 18) | def as_dict(f):
  function get_display_name (line 26) | def get_display_name(doc):
  function set_display_name (line 32) | def set_display_name(doc, display_name):
  function get_extension_description (line 43) | def get_extension_description(doc):
  function set_extension_description (line 49) | def set_extension_description(doc, description):
  function get_publisher (line 60) | def get_publisher(doc):
  function set_publisher (line 67) | def set_publisher(doc, publisher):
  function get_license_accept_by (line 78) | def get_license_accept_by(doc):
  function get_license (line 86) | def get_license(doc):
  function get_oo_min_version (line 94) | def get_oo_min_version(doc):
  class Description (line 101) | class Description(object):
    method parse (line 104) | def parse(cls, f):
    method __init__ (line 127) | def __init__(self,
    method write (line 219) | def write(self, f):
    method required_files (line 258) | def required_files(self):
  function print_human_readable (line 265) | def print_human_readable(desc, root_stg=None):
  function init_main (line 307) | def init_main():
  function show_main (line 328) | def show_main():
  function version_main (line 343) | def version_main():
  function ls_main (line 366) | def ls_main():

FILE: tools/oxt.tool/oxt_tool/manifest.py
  class Manifest (line 14) | class Manifest(object):
    method __init__ (line 18) | def __init__(self, namespace_uri=NS_URI):
    method NS (line 23) | def NS(self):
    method __setitem__ (line 26) | def __setitem__(self, full_path, value):
    method __getitem__ (line 31) | def __getitem__(self, full_path):
    method __delitem__ (line 34) | def __delitem__(self, full_path):
    method __iter__ (line 37) | def __iter__(self):
    method add_file (line 41) | def add_file(self, full_path, media_type):
    method load (line 44) | def load(self, f):
    method dump (line 57) | def dump(self, f):
    method save (line 73) | def save(self, path):
  function init_main (line 78) | def init_main():
  function ls_main (line 92) | def ls_main():
  function add_main (line 110) | def add_main():
  function rm_main (line 135) | def rm_main():

FILE: tools/oxt.tool/oxt_tool/package.py
  function is_package (line 20) | def is_package(folder):
  function add_file (line 32) | def add_file(stg, manifest, path, full_path, media_type):
  function add_component_file (line 47) | def add_component_file(stg, manifest, path, full_path, type, platform=No...
  function add_type_library (line 74) | def add_type_library(stg, manifest, path, full_path, type):
  function add_basic_library (line 96) | def add_basic_library(stg, manifest, path, full_path):
  function add_dialog_library (line 106) | def add_dialog_library(stg, manifest, path, full_path):
  function add_configuration_data_file (line 116) | def add_configuration_data_file(stg, manifest, path, full_path):
  function add_configuration_schema_file (line 126) | def add_configuration_schema_file(stg, manifest, path, full_path):
  function build (line 136) | def build(package_path, manifest, description, files=dict(),
  function build_from (line 171) | def build_from(package_path,
  function make_output_path (line 224) | def make_output_path(path, desc=None):
  function package_name_from_desc (line 240) | def package_name_from_desc(desc):
  function expand_folders (line 249) | def expand_folders(resolved_nodes):
  function exclude_files (line 258) | def exclude_files(patterns, resolved_nodes):
  function init_main (line 270) | def init_main():
  function show_main (line 292) | def show_main():
  function build_main (line 324) | def build_main():
  function check_main (line 358) | def check_main():

FILE: tools/oxt.tool/oxt_tool/remote.py
  function soffice_subprocess (line 28) | def soffice_subprocess(**kwargs):
  function connect_remote_context (line 77) | def connect_remote_context(uno_link, max_tries=10):
  function new_remote_context (line 101) | def new_remote_context(pipe='oxt.tool', retry=3, make_current=True, **kw...
  class RemoteContextLayer (line 139) | class RemoteContextLayer:
    method setUp (line 142) | def setUp(cls):
    method tearDown (line 147) | def tearDown(cls):

FILE: tools/oxt.tool/oxt_tool/storage/__init__.py
  function open_storage (line 10) | def open_storage(path, mode='r', default_storage_factory=None):
  function resolve_path (line 27) | def resolve_path(folder, path):
  function makedirs (line 54) | def makedirs(folder, path):
  function makedirs_to_file (line 65) | def makedirs_to_file(folder, path):
  function put_file (line 75) | def put_file(node, path, **kwargs):
  function get_file (line 86) | def get_file(node, path):
  function openable_path_on_filesystem (line 98) | def openable_path_on_filesystem(node, writeback=False):
  function copy_file (line 122) | def copy_file(src_node, dst_node):
  function stream_copy (line 131) | def stream_copy(src, dst):
  function iterate_nodes_recursively (line 139) | def iterate_nodes_recursively(folder, folder_path=''):
  function iterate_files_recursively (line 150) | def iterate_files_recursively(folder, folder_path=''):
  function ls_main (line 156) | def ls_main():
  function put_main (line 171) | def put_main():
  function get_main (line 194) | def get_main():

FILE: tools/oxt.tool/oxt_tool/storage/_zipfile.py
  function zipfile_nodes (line 13) | def zipfile_nodes(zipfile):
  class ZipFileNode (line 28) | class ZipFileNode(object):
    method __init__ (line 30) | def __init__(self, zipfile, path):
  class ZipFileFile (line 35) | class ZipFileFile(ZipFileNode):
    method open (line 37) | def open(self, mode='r', compress_type=ZIP_DEFLATED):
    method put (line 44) | def put(self, filesystem_path, compress_type=ZIP_DEFLATED):
  class ZipFileFolder (line 48) | class ZipFileFolder(ZipFileNode):
    method childs (line 50) | def childs(self):
    method __iter__ (line 59) | def __iter__(self):
    method __getitem__ (line 63) | def __getitem__(self, name):
    method file (line 69) | def file(self, name):
    method folder (line 73) | def folder(self, name):
  class ZipFileStorage (line 78) | class ZipFileStorage(ZipFileFolder):
    method __init__ (line 80) | def __init__(self, *args, **kwargs):
    method childs (line 85) | def childs(self):
    method close (line 91) | def close(self):
    method __enter__ (line 94) | def __enter__(self):
    method __exit__ (line 97) | def __exit__(self, *args, **kwargs):
  class ZipFileStream (line 101) | class ZipFileStream(object):
    method __init__ (line 103) | def __init__(self, stream):
    method __getattr__ (line 106) | def __getattr__(self, name):
    method __enter__ (line 109) | def __enter__(self):
    method __exit__ (line 112) | def __exit__(self, *args, **kwargs):
  class ZipFileWritable (line 116) | class ZipFileWritable(object):
    method __init__ (line 118) | def __init__(self, zipfile, path, compress_type=ZIP_DEFLATED):
    method __getattr__ (line 128) | def __getattr__(self, name):
    method close (line 131) | def close(self):

FILE: tools/oxt.tool/oxt_tool/storage/fs.py
  class FileSystemNode (line 11) | class FileSystemNode(object):
    method __init__ (line 13) | def __init__(self, path):
  class FileSystemFile (line 17) | class FileSystemFile(FileSystemNode):
    method open (line 19) | def open(self, *args, **kwargs):
    method path_on_filesystem (line 23) | def path_on_filesystem(self):
    method delete (line 26) | def delete(self):
  class FileSystemFolder (line 30) | class FileSystemFolder(FileSystemNode):
    method __iter__ (line 32) | def __iter__(self):
    method __getitem__ (line 35) | def __getitem__(self, name):
    method file (line 44) | def file(self, name):
    method folder (line 48) | def folder(self, name):
  class FileSystemStorage (line 54) | class FileSystemStorage(FileSystemFolder):
    method __init__ (line 56) | def __init__(self, path, mode='r'):
    method close (line 66) | def close(self):
    method __enter__ (line 69) | def __enter__(self):
    method __exit__ (line 72) | def __exit__(self, *args, **kwargs):

FILE: tools/oxt.tool/oxt_tool/storage/path.py
  function split (line 10) | def split(path):
  function get_ancestors (line 17) | def get_ancestors(path):

FILE: tools/oxt.tool/oxt_tool/tests/mixin_storage.py
  class StorageTestMixin (line 12) | class StorageTestMixin(object):
    method test_storage (line 14) | def test_storage(self):
    method test_folder_in (line 23) | def test_folder_in(self):
    method test_folder_iterate (line 30) | def test_folder_iterate(self):
    method test_folder_getitem (line 35) | def test_folder_getitem(self):
    method test_file_open_for_reading (line 46) | def test_file_open_for_reading(self):
    method test_file_open_for_writing (line 56) | def test_file_open_for_writing(self):
    method test_folder_new_file (line 74) | def test_folder_new_file(self):
    method test_folder_new_folder (line 94) | def test_folder_new_folder(self):
    method test_resolve_path (line 112) | def test_resolve_path(self):
    method test_makedirs (line 120) | def test_makedirs(self):
    method test_makedirs_to_file (line 168) | def test_makedirs_to_file(self):
    method test_file_put (line 179) | def test_file_put(self):
    method test_file_get (line 193) | def test_file_get(self):
    method test_openable_path_on_filesystem (line 201) | def test_openable_path_on_filesystem(self):
    method test_file_copy (line 216) | def test_file_copy(self):

FILE: tools/oxt.tool/oxt_tool/tests/test_fs.py
  class TestFileSystem (line 8) | class TestFileSystem(unittest.TestCase, StorageTestMixin):
    method fixture_path (line 11) | def fixture_path(self):
    method create_fixture_storage (line 14) | def create_fixture_storage(self):
    method create_fixture_folder (line 19) | def create_fixture_folder(self):
    method get_fixture_folder (line 35) | def get_fixture_folder(self):

FILE: tools/oxt.tool/oxt_tool/tests/test_package.py
  class PackageTest (line 12) | class PackageTest(unittest.TestCase):
    method test_package_name_from_desc (line 14) | def test_package_name_from_desc(self):
    method test_make_output_path (line 21) | def test_make_output_path(self):
  class BuildPackageTest (line 43) | class BuildPackageTest(unittest.TestCase):
    method test_build_minimal (line 45) | def test_build_minimal(self):
    method test_build_missing (line 55) | def test_build_missing(self):
    method test_build_typical (line 69) | def test_build_typical(self):

FILE: tools/oxt.tool/oxt_tool/tests/test_storage_path.py
  class TestStoragePath (line 7) | class TestStoragePath(unittest.TestCase):
    method test_path_split (line 9) | def test_path_split(self):
    method test_path_ancestors (line 18) | def test_path_ancestors(self):

FILE: tools/oxt.tool/oxt_tool/tests/test_zipfile.py
  class TestZipFile (line 9) | class TestZipFile(unittest.TestCase, StorageTestMixin):
    method zipfile_path (line 12) | def zipfile_path(self):
    method zipfile_create (line 15) | def zipfile_create(self):
    method zipfile_get (line 19) | def zipfile_get(self):
    method test_zipfile_folder (line 23) | def test_zipfile_folder(self):
    method test_zipfile_file (line 32) | def test_zipfile_file(self):
    method test_zipfile_file_put (line 42) | def test_zipfile_file_put(self):
    method create_fixture_storage (line 52) | def create_fixture_storage(self):
    method create_fixture_zipfile (line 56) | def create_fixture_zipfile(self):
    method create_fixture_folder (line 68) | def create_fixture_folder(self):
    method get_fixture_folder (line 73) | def get_fixture_folder(self):
    method test_zipfile_nodes (line 80) | def test_zipfile_nodes(self):

FILE: tools/pyhwp.zestreleaser.cmds/pyhwp_zestreleaser_cmds.py
  function call_hooks (line 29) | def call_hooks(hooks_root, hook_type):
  function prerelease_before (line 40) | def prerelease_before(data):
  function prerelease_middle (line 45) | def prerelease_middle(data):
  function prerelease_after (line 50) | def prerelease_after(data):
  function release_before (line 55) | def release_before(data):
  function release_middle (line 60) | def release_middle(data):
  function release_after (line 65) | def release_after(data):
  function postrelease_before (line 70) | def postrelease_before(data):
  function postrelease_middle (line 75) | def postrelease_middle(data):
  function postrelease_after (line 80) | def postrelease_after(data):

FILE: tools/pyhwp.zestreleaser.cmds/setup.py
  function read (line 11) | def read(filename):

FILE: tools/unpack/pyhwp_unpack.py
  function main (line 14) | def main():

FILE: tools/xsltest/xsltest/__init__.py
  function changed_working_dir (line 36) | def changed_working_dir(working_dir):
  function pretty_print (line 45) | def pretty_print(elem):
  function expand_files (line 66) | def expand_files(files):
  function main (line 76) | def main():
  function main_gen (line 91) | def main_gen():
  function main_run (line 118) | def main_run():
  function load_tests_from_files (line 144) | def load_tests_from_files(py_files):
  function generate_test_py_files_from_args (line 151) | def generate_test_py_files_from_args(args):
  function generate_testsuite_py (line 168) | def generate_testsuite_py(filename, context_tests):
  function generate_testsuite_source (line 175) | def generate_testsuite_source(context_tests):
  class ExpectHandler (line 192) | class ExpectHandler(object):
    method __init__ (line 194) | def __init__(self, elem):
    method generate_source (line 199) | def generate_source(self):
  function expect (line 207) | def expect(localname):
  class expect_elem (line 215) | class expect_elem(ExpectHandler):
    method params_from_elem (line 218) | def params_from_elem(cls, elem):
  class expect_attr (line 224) | class expect_attr(ExpectHandler):
    method params_from_elem (line 227) | def params_from_elem(cls, elem):
  class expect_empty (line 234) | class expect_empty(ExpectHandler):
    method params_from_elem (line 237) | def params_from_elem(cls, elem):
  class expect_true (line 243) | class expect_true(ExpectHandler):
    method params_from_elem (line 246) | def params_from_elem(cls, elem):
  class expect_equals (line 252) | class expect_equals(ExpectHandler):
    method params_from_elem (line 255) | def params_from_elem(cls, elem):
  class expect_text (line 269) | class expect_text(ExpectHandler):
    method params_from_elem (line 272) | def params_from_elem(cls, elem):
  class expect_shell (line 278) | class expect_shell(ExpectHandler):
    method params_from_elem (line 281) | def params_from_elem(cls, elem):
  class TestCase (line 285) | class TestCase(unittest.TestCase):
    method expect_elem (line 287) | def expect_elem(self, expected):
    method expect_attr (line 297) | def expect_attr(self, name, expected):
    method expect_empty (line 310) | def expect_empty(self, xpath_expr):
    method expect_true (line 317) | def expect_true(self, boolexpr):
    method expect_equals (line 328) | def expect_equals(self, tested, expected):
    method expect_text (line 341) | def expect_text(self, text):
    method expect_shell (line 349) | def expect_shell(self):
  class STARTEVENT (line 353) | class STARTEVENT: pass
  class ENDEVENT (line 354) | class ENDEVENT: pass
  function generate_events (line 357) | def generate_events(elem):
  class Processor (line 369) | class Processor(object):
    method __init__ (line 371) | def __init__(self, basepath, styles_dir=None, import_dir=None):
    method context (line 377) | def context(self):
    method stylesheet (line 381) | def stylesheet(self):
    method generate_testsuite_from_path (line 384) | def generate_testsuite_from_path(self, path, out_dir):
    method handle_events (line 401) | def handle_events(self, events):
    method resolve_href_to_path (line 426) | def resolve_href_to_path(self, href):
    method resolve_stylesheet_path (line 430) | def resolve_stylesheet_path(self, href):
    method resolve_import_path (line 437) | def resolve_import_path(self, href):
  class ContextTest (line 445) | class ContextTest(object):
    method __init__ (line 447) | def __init__(self, transform, context_elem):
    method generate_testcase_py (line 457) | def generate_testcase_py(self, parent):
  function xpath_inspect (line 480) | def xpath_inspect(context, result, xpath):
  function stylesheet_handler (line 508) | def stylesheet_handler(ns, localname):
  function xunit_stylesheet (line 516) | def xunit_stylesheet(self, elem):
  function context_handler (line 523) | def context_handler(ns, localname):
  class ContextTransform (line 530) | class ContextTransform(object):
    method __init__ (line 532) | def __init__(self, params):
    method from_elem (line 536) | def from_elem(cls, proc, elem):
    method gen_instantiate (line 541) | def gen_instantiate(self):
  class context_hwp5xml (line 546) | class context_hwp5xml(ContextTransform):
    method params_from_elem (line 549) | def params_from_elem(cls, proc, elem):
    method __call__ (line 555) | def __call__(self, parent_context):
  class context_import (line 567) | class context_import(ContextTransform):
    method params_from_elem (line 570) | def params_from_elem(cls, proc, elem):
    method __call__ (line 576) | def __call__(self, parent_context):
  class context_subtree (line 583) | class context_subtree(ContextTransform):
    method params_from_elem (line 586) | def params_from_elem(cls, proc, elem):
    method __call__ (line 592) | def __call__(self, parent_context):
  class context_wrap_subnodes (line 605) | class context_wrap_subnodes(ContextTransform):
    method params_from_elem (line 608) | def params_from_elem(cls, proc, elem):
    method __call__ (line 614) | def __call__(self, parent_context):
  class context_xslt (line 642) | class context_xslt(ContextTransform):
    method params_from_elem (line 645) | def params_from_elem(cls, proc, elem):
    method __call__ (line 661) | def __call__(self, parent_context):
  function evaluate (line 730) | def evaluate(elem):
  function get_select (line 734) | def get_select(elem):
  function interpret_as_qname (line 746) | def interpret_as_qname(value, nsmap):

FILE: tools/xsltest/xsltest/xmltool/__init__.py
  function main (line 32) | def main():

FILE: tools/xsltest/xsltest/xmltool/subtree.py
  function main (line 27) | def main():

FILE: tools/xsltest/xsltest/xmltool/wrap.py
  function main (line 27) | def main():

FILE: tools/xsltest/xsltest/xmltool/xslt.py
  function main (line 29) | def main():

FILE: unokit/unokit/__init__.py
  class Base (line 22) | class Base(unohelper.Base):
    method __init__ (line 24) | def __init__(self, context):
  function component_context (line 28) | def component_context(f):

FILE: unokit/unokit/adapters.py
  class InputStreamFromFileLike (line 24) | class InputStreamFromFileLike(unohelper.Base, XInputStream, XSeekable):
    method __init__ (line 31) | def __init__(self, f, dontclose=False):
    method readBytes (line 35) | def readBytes(self, aData, nBytesToRead):
    method skipBytes (line 41) | def skipBytes(self, nBytesToSkip):
    method available (line 44) | def available(self):
    method closeInput (line 47) | def closeInput(self):
    method seek (line 51) | def seek(self, location):
    method getPosition (line 54) | def getPosition(self):
    method getLength (line 58) | def getLength(self):
  class OutputStreamToFileLike (line 68) | class OutputStreamToFileLike(unohelper.Base, XOutputStream):
    method __init__ (line 75) | def __init__(self, f, dontclose=False):
    method writeBytes (line 79) | def writeBytes(self, bytesequence):
    method flush (line 82) | def flush(self):
    method closeOutput (line 85) | def closeOutput(self):
  class FileFromStream (line 90) | class FileFromStream(object):
    method __init__ (line 97) | def __init__(self, stream):
    method close (line 137) | def close(self):

FILE: unokit/unokit/configuration.py
  function open_config (line 20) | def open_config(nodepath):
  function get_soffice_product_info (line 29) | def get_soffice_product_info():

FILE: unokit/unokit/contexts.py
  function get_stack (line 27) | def get_stack():
  function push (line 35) | def push(context):
  function pop (line 39) | def pop():
  function get_current (line 43) | def get_current():

FILE: unokit/unokit/services.py
  function create_service (line 20) | def create_service(name, *args):
  class NamespaceNode (line 30) | class NamespaceNode(object):
    method __init__ (line 31) | def __init__(self, dotted_name):
    method __getattr__ (line 34) | def __getattr__(self, name):
    method __call__ (line 37) | def __call__(self, *args):
    method __iter__ (line 40) | def __iter__(self):

FILE: unokit/unokit/singletons.py
  function get_singleton (line 20) | def get_singleton(name):
  function iter_singleton_names (line 26) | def iter_singleton_names():
  class NamespaceNode (line 36) | class NamespaceNode(object):
    method __init__ (line 37) | def __init__(self, dotted_name):
    method __getattr__ (line 40) | def __getattr__(self, name):
    method __iter__ (line 49) | def __iter__(self):

FILE: unokit/unokit/tests/test_configuration.py
  class TestBase (line 22) | class TestBase(TestCase):
  class GetSofficeProductInfoTest (line 26) | class GetSofficeProductInfoTest(TestBase):
    method test_basic (line 27) | def test_basic(self):

FILE: unokit/unokit/tests/test_singletons.py
  class TestBase (line 22) | class TestBase(TestCase):
  class TestSingletons (line 26) | class TestSingletons(TestBase):
    method test_extman (line 27) | def test_extman(self):
    method test_pkginfo_prov (line 32) | def test_pkginfo_prov(self):

FILE: unokit/unokit/tests/test_ucb.py
  class TestBase (line 22) | class TestBase(TestCase):
  class OpenURLTest (line 26) | class OpenURLTest(TestBase):
    method test_basic (line 27) | def test_basic(self):

FILE: unokit/unokit/ucb.py
  function open_url (line 21) | def open_url(url):

FILE: unokit/unokit/util.py
  function unofy_value (line 22) | def unofy_value(value):
  function xenumeration_list (line 30) | def xenumeration_list(xenum):
  function dict_to_propseq (line 34) | def dict_to_propseq(d):
  function propseq_to_dict (line 41) | def propseq_to_dict(propvalues):
  function enumerate (line 45) | def enumerate(xenumaccess):
  function iterate (line 54) | def iterate(xenum):
  function dump (line 61) | def dump(obj):
  function dumpdir (line 84) | def dumpdir(obj):
Copy disabled (too large) Download .json
Condensed preview — 811 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (12,916K chars).
[
  {
    "path": ".gitattributes",
    "chars": 36,
    "preview": "pyhwp/hwp5/_version.py export-subst\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 135,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"pip\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n    target-bra"
  },
  {
    "path": ".gitignore",
    "chars": 517,
    "preview": "*$py.class\n*.egg-info\n*.log\n*.mo\n*.po~\n*.pyc\n.*.sw?\n.coverage*\n/*.egg\n/.eggs\n/.installed.cfg\n/.jip\n/.jip_index\n/.tox\n/.v"
  },
  {
    "path": ".travis.yml",
    "chars": 1115,
    "preview": "language: python\npython:\n- \"2.7\"\nenv:\n- TOXENV=py27\nmatrix:\n  include:\n    - python: \"3.8\"\n      env: TOXENV=lint\n    - "
  },
  {
    "path": "CHANGES",
    "chars": 3160,
    "preview": "CHANGES\n=======\n\n0.1b16 (unreleased)\n-------------------\n\n- [CVE-2023-0286] Depends on cryptography >= 40.0.1\n- [CVE-202"
  },
  {
    "path": "COPYING",
    "chars": 34520,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "MANIFEST.in",
    "chars": 1022,
    "preview": "include .coveragerc\ninclude CHANGES\ninclude COPYING\ninclude LICENSE\ninclude Makefile\ninclude VERSION.txt\ninclude README\n"
  },
  {
    "path": "Makefile",
    "chars": 4943,
    "preview": "define ALL\n\tupdate-requirements\n\tinstall-jython\nendef\nALL:=$(shell echo $(ALL))  # to remove line-feeds\n\ndefine REQUIREM"
  },
  {
    "path": "README",
    "chars": 2389,
    "preview": "pyhwp\n=====\n\nHWP Document Format v5 parser & processor.\n\nFeatures\n--------\n\n- Analyze and extract internal streams out f"
  },
  {
    "path": "VERSION.txt",
    "chars": 12,
    "preview": "0.1b16.dev0\n"
  },
  {
    "path": "buildout.cfg",
    "chars": 290,
    "preview": "[buildout]\ndevelop = .\nparts =\n\tpyhwp\n\tclitest\n\n\n[pyhwp]\nrecipe = zc.recipe.egg\neggs =\n\tpyhwp\n\n\n[clitest]\nrecipe = hexag"
  },
  {
    "path": "buildouts/components/jxml.cfg",
    "chars": 1187,
    "preview": "[buildout]\nextends= virtualenv-jython.cfg\n\n[jxml]\nrecipe = collective.recipe.cmd\ncmds = ${jxml-install:output} \"${:locat"
  },
  {
    "path": "buildouts/components/virtualenv-1.9.1.cfg",
    "chars": 223,
    "preview": "[virtualenv-1.9.1]\nrecipe = hexagonit.recipe.download\nurl = https://pypi.python.org/packages/source/v/virtualenv/virtual"
  },
  {
    "path": "buildouts/components/virtualenv-jython.cfg",
    "chars": 488,
    "preview": "[buildout]\nextends= virtualenv-1.9.1.cfg\n\n[virtualenv-jython]\nrecipe = collective.recipe.template\noutput = ${buildout:bi"
  },
  {
    "path": "buildouts/components/xalan-j-2.7.1.cfg",
    "chars": 628,
    "preview": "[xalan-j-2.7.1]\nrecipe = hexagonit.recipe.download\nurl = ${xalan-j-2.7.1.tar.gz:downloaded}\ndestination = ${buildout:par"
  },
  {
    "path": "buildouts/components/xalan-j-2.7.2.cfg",
    "chars": 626,
    "preview": "[xalan-j-2.7.2]\nrecipe = hexagonit.recipe.download\nurl = ${xalan-j-2.7.2.tar.gz:downloaded}\ndestination = ${buildout:par"
  },
  {
    "path": "buildouts/developer.cfg",
    "chars": 9273,
    "preview": "[buildout]\nextends = translator.cfg\n          components/jxml.cfg\n          components/xalan-j-2.7.2.cfg\ndevelop+= pyhwp"
  },
  {
    "path": "buildouts/maintainer.cfg",
    "chars": 808,
    "preview": "[buildout]\nextends = tester.cfg\ndevelop+= tools/pyhwp.zestreleaser.cmds\nparts+= test-upload\n        docs-upload\n\tupload\n"
  },
  {
    "path": "buildouts/tester.cfg",
    "chars": 3747,
    "preview": "[buildout]\nextends = developer.cfg\n          https://raw.github.com/mete0r/mkvenv/master/lib/buildout.extends/mkvenv.cfg"
  },
  {
    "path": "buildouts/translator.cfg",
    "chars": 3394,
    "preview": "[buildout]\nextends = user.cfg\nparts+= docs-update-po\n\tdocs-build\n\tdocs-build-latex\n\n[pyhwp]\neggs+= sphinx\ninterpreter = "
  },
  {
    "path": "buildouts/user.cfg",
    "chars": 82,
    "preview": "[buildout]\ndevelop+= .\nparts+= pyhwp\n\n[pyhwp]\nrecipe = zc.recipe.egg\neggs = pyhwp\n"
  },
  {
    "path": "classifiers.txt",
    "chars": 700,
    "preview": "Development Status :: 4 - Beta\nIntended Audience :: Developers\nLicense :: OSI Approved :: GNU Affero General Public Lice"
  },
  {
    "path": "docs/.gitignore",
    "chars": 7,
    "preview": "_build\n"
  },
  {
    "path": "docs/Makefile",
    "chars": 7538,
    "preview": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD "
  },
  {
    "path": "docs/conf.py",
    "chars": 8451,
    "preview": "# -*- coding: utf-8 -*-\n#\n# pyhwp documentation build configuration file, created by\n# sphinx-quickstart on Sat Mar 10 1"
  },
  {
    "path": "docs/converters.rst",
    "chars": 1677,
    "preview": "Converters (*Experimental*)\n===========================\n\nConvert HWPv5 documents into other document formats.\n\nRequireme"
  },
  {
    "path": "docs/hacking/directory-layout/bin.rst",
    "chars": 607,
    "preview": "``bin/`` - Buildout generated scripts\n-------------------------------------\n\nThis directory will be populated with scrip"
  },
  {
    "path": "docs/hacking/directory-layout/root.rst",
    "chars": 648,
    "preview": "``/`` - project root directory\n------------------------------\n\nThe project root directory contains project configuration"
  },
  {
    "path": "docs/hacking/directory-layout.rst",
    "chars": 1396,
    "preview": "================\nDirectory Layout\n================\n\n::\n\n   pyhwp                   Project Root\n     |\n     +-- pyhwp/  "
  },
  {
    "path": "docs/hacking/hack-n-test.rst",
    "chars": 707,
    "preview": "===========\nHack & Test\n===========\n\nIf you modify some modules in ``hwp5`` package in the ``pyhwp/`` directory, you\ncan"
  },
  {
    "path": "docs/hacking/index.rst",
    "chars": 164,
    "preview": "Hacking Guide\n=============\n\nStandard procedures to hacking on ``pyhwp``.\n\nContents:\n\n.. toctree::\n   :maxdepth: 2\n\n   s"
  },
  {
    "path": "docs/hacking/setup-env.rst",
    "chars": 555,
    "preview": "=============================\nSetup development environment\n=============================\n\n1. Install prerequisites\n----"
  },
  {
    "path": "docs/hwp5.rst",
    "chars": 1231,
    "preview": "package hwp5\n************\n\nmodule :mod:`hwp5.filestructure`\n================================\n.. automodule:: hwp5.filest"
  },
  {
    "path": "docs/hwp5proc.rst",
    "chars": 5039,
    "preview": "``hwp5proc``: HWPv5 processor\n=============================\n\n.. argparse::\n   :module: hwp5.hwp5proc\n   :func: main_argp"
  },
  {
    "path": "docs/index.rst",
    "chars": 484,
    "preview": ".. pyhwp documentation master file, created by\n   sphinx-quickstart on Sat Mar 10 15:30:24 2012.\n   You can adapt this f"
  },
  {
    "path": "docs/static/.gitignore",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/templates/.gitignore",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs/translated/en/LC_MESSAGES/converters.po",
    "chars": 3793,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2012, mete0r\n# This file is distributed under the same license as the pyhwp pa"
  },
  {
    "path": "docs/translated/en/LC_MESSAGES/hwp5proc.po",
    "chars": 7481,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2012, mete0r\n# This file is distributed under the same license as the pyhwp pa"
  },
  {
    "path": "docs/translated/en/LC_MESSAGES/index.po",
    "chars": 1109,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2012, mete0r\n# This file is distributed under the same license as the pyhwp pa"
  },
  {
    "path": "docs/translated/en/LC_MESSAGES/intro.po",
    "chars": 4850,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2012, mete0r\n# This file is distributed under the same license as the pyhwp pa"
  },
  {
    "path": "docs/translated/ko/LC_MESSAGES/converters.po",
    "chars": 4707,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2012, mete0r\n# This file is distributed under the same license as the pyhwp pa"
  },
  {
    "path": "docs/translated/ko/LC_MESSAGES/hwp5proc.po",
    "chars": 8546,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2012, mete0r\n# This file is distributed under the same license as the pyhwp pa"
  },
  {
    "path": "docs/translated/ko/LC_MESSAGES/index.po",
    "chars": 1109,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2012, mete0r\n# This file is distributed under the same license as the pyhwp pa"
  },
  {
    "path": "docs/translated/ko/LC_MESSAGES/intro.po",
    "chars": 5947,
    "preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) 2012, mete0r\n# This file is distributed under the same license as the pyhwp pa"
  },
  {
    "path": "etc/pylint.rc",
    "chars": 7280,
    "preview": "[MASTER]\n\n# Specify a configuration file.\n#rcfile=\n\n# Python code to execute, usually for sys.path manipulation such as\n"
  },
  {
    "path": "etc/testlog.conf",
    "chars": 362,
    "preview": "[loggers]\nkeys=root,hwp5\n\n[handlers]\nkeys=file\n\n[formatters]\nkeys=simple\n\n[logger_root]\nhandlers=file\nlevel=DEBUG\n\n[logg"
  },
  {
    "path": "ez_setup.py",
    "chars": 10240,
    "preview": "#!python\n\"\"\"Bootstrap setuptools installation\n\nIf you want to use setuptools in your package's setup.py, just include th"
  },
  {
    "path": "misc/cleanup-pyc.py",
    "chars": 899,
    "preview": "# -*- coding: utf-8 -*-\nimport logging\nimport os.path\n\n\nlogger = logging.getLogger(os.path.splitext(os.path.basename(__f"
  },
  {
    "path": "misc/copylxml.py",
    "chars": 479,
    "preview": "import sys\nimport os.path\nimport shutil\n\ndef main():\n    if sys.platform == 'win32':\n        try:\n            import lxm"
  },
  {
    "path": "misc/docs-upload",
    "chars": 458,
    "preview": "#!/bin/sh\n\n# exit if any statement returns non-true return value\nset -e\n\n# exit on uninitialized variable\nset -u\n\nHTML_B"
  },
  {
    "path": "misc/fix-coverage.py",
    "chars": 364,
    "preview": "# -*- coding: utf-8 -*-\n''' fix pyhwp source paths in coverage.xml\n'''\nimport re\nimport sys\n\n\ndef main():\n    f = file(s"
  },
  {
    "path": "misc/install-lxml.py.in",
    "chars": 732,
    "preview": "# -*- coding: utf-8 -*-\n\ndef main():\n    import sys\n    import os.path\n    from subprocess import check_call\n    from su"
  },
  {
    "path": "misc/mkdir.py",
    "chars": 242,
    "preview": "# -*- coding: utf-8 -*-\n\nimport sys\nimport os.path\nimport shutil\n\nif __name__ == '__main__':\n    d = sys.argv[1]\n    if "
  },
  {
    "path": "misc/oxt-build.in",
    "chars": 557,
    "preview": "#!/bin/sh\nDIST_DIR=${buildout:directory}/dist\nSRC_DIR=${buildout:directory}/oxt\nBIN_DIR=${buildout:directory}/bin\nVERSIO"
  },
  {
    "path": "misc/prepare-hwp5-xsl-fixtures.py",
    "chars": 1739,
    "preview": "# -*- coding: utf-8 -*-\nfrom __future__ import with_statement\nimport os.path\nimport logging\nimport sys\n\n\nlogger = loggin"
  },
  {
    "path": "misc/redirect.py",
    "chars": 243,
    "preview": "from __future__ import with_statement\nimport subprocess\nimport sys\n\nif __name__ == '__main__':\n    with file(sys.argv[1]"
  },
  {
    "path": "misc/test-cli.in",
    "chars": 101,
    "preview": "#!/bin/sh\nPATH=${buildout:bin-directory}:$PATH\n. ${buildout:directory}/pyhwp-tests/hwp5_cli_tests.sh\n"
  },
  {
    "path": "misc/test-cli.py",
    "chars": 614,
    "preview": "# -*- coding: utf-8 -*-\nimport os.path\nimport logging\n\n\nlogger = logging.getLogger('test-cli')\n\n\ndef main():\n    logging"
  },
  {
    "path": "misc/test-coverage",
    "chars": 664,
    "preview": "#!/bin/sh\n# Remove old results\n${buildout:directory}/bin/coverage erase\n\n# Collect test coverage results for all package"
  },
  {
    "path": "misc/test-for-bisect",
    "chars": 129,
    "preview": "#!/bin/sh\n\n# usage: git bisect run bin/test-for-bisect\n\ncd ${buildout:directory}\nbin/buildout -o && bin/test && exit 0 |"
  },
  {
    "path": "misc/test-in-lo.py",
    "chars": 237,
    "preview": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n\ndef main():\n    import os\n    args = ['${buildout:bin-directory}/oxt-test',\n "
  },
  {
    "path": "misc/test-pypi.in",
    "chars": 364,
    "preview": "#!/bin/sh\n\n# exit if any statement returns non-true return value\nset -e\n\n# exit on uninitialized variable\nset -u\n\ncd ${b"
  },
  {
    "path": "misc/test-sdist",
    "chars": 992,
    "preview": "#!/bin/bash\n\n# exit if any statement returns non-true return value\nset -e\n\n# exit on uninitialized variable\nset -u\n\nVERS"
  },
  {
    "path": "misc/test-sdist.in",
    "chars": 53,
    "preview": "#!/bin/sh\nbash ${buildout:directory}/misc/test-sdist\n"
  },
  {
    "path": "misc/test-upload.in",
    "chars": 593,
    "preview": "#!/bin/sh\n\n# exit if any statement returns non-true return value\nset -e\n\n# exit on uninitialized variable\nset -u\n\ncd ${b"
  },
  {
    "path": "misc/test-xsl.in",
    "chars": 735,
    "preview": "#!/bin/sh\n\nset -e\nset -u\n\ncd ${buildout:directory}\nrm -rf test-xsl\nmkdir -p test-xsl\n\nIMPORT_DIR=${buildout:directory}/t"
  },
  {
    "path": "misc/upload",
    "chars": 71,
    "preview": "#!/bin/sh\ncd ${buildout:directory}\npython setup.py sdist upload --sign\n"
  },
  {
    "path": "notebooks/.gitignore",
    "chars": 19,
    "preview": ".ipynb_checkpoints\n"
  },
  {
    "path": "oxt/Addons.xcu",
    "chars": 1385,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<oor:component-data xmlns:oor=\"http://openoffice.org/2001/registry\"\n\txmlns:xs=\"ht"
  },
  {
    "path": "oxt/Filter.xcu",
    "chars": 966,
    "preview": "<?xml version='1.0' encoding='UTF-8'?>\n<!DOCTYPE oor:component-data SYSTEM \"../../../../component-update.dtd\">\n<oor:comp"
  },
  {
    "path": "oxt/META-INF/manifest.xml",
    "chars": 676,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE manifest:manifest PUBLIC \"-//OpenOffice.org//DTD Manifest 1.0//EN\" \"Man"
  },
  {
    "path": "oxt/Makefile",
    "chars": 342,
    "preview": "OXTPKG:=../dist/hwp5-$(shell git describe --dirty).oxt\nUNOPKG=unopkg\n\n$(OXTPKG):\n\t../bin/oxt-build\n\nvalidate: $(OXTPKG)\n"
  },
  {
    "path": "oxt/Types.xcu",
    "chars": 978,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE oor:component-data SYSTEM \"../../../../component-update.dtd\">\n<oor:comp"
  },
  {
    "path": "oxt/components.py",
    "chars": 10326,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010,2011,2012 https://github.c"
  },
  {
    "path": "oxt/description/desc_en.txt",
    "chars": 68,
    "preview": "This extension enables you to read HWP Documents (v5 formats only).\n"
  },
  {
    "path": "oxt/description/desc_ko.txt",
    "chars": 33,
    "preview": "한글(HWP) 문서 (포맷 버젼 5)을 읽을 수 있습니다.\n"
  },
  {
    "path": "oxt/description.xml",
    "chars": 1150,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<description xmlns=\"http://openoffice.org/extensions/description/2006\"\n          "
  },
  {
    "path": "oxt/doc/references.txt",
    "chars": 10727,
    "preview": "\nhttp://www.openoffice.org/framework/documentation/filters/example.html\n- reading of the entire filters configuration\n- "
  },
  {
    "path": "oxt/registration/COPYING.txt",
    "chars": 34520,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "pyhwp_uno/hwp5_uno/__init__.py",
    "chars": 8740,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010,2011,2012 https://github.c"
  },
  {
    "path": "pyhwp_uno/hwp5_uno/tests/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pyhwp_uno/hwp5_uno/tests/test_hwp5_uno.py",
    "chars": 6828,
    "preview": "# -*- coding: utf-8 -*-\nfrom unittest import TestCase\n\n\nclass TestBase(TestCase):\n\n    def get_fixture_path(self, filena"
  },
  {
    "path": "pyhwp_uno/setup.py",
    "chars": 144,
    "preview": "from setuptools import setup, find_packages\nsetup(name='pyhwp_uno',\n      install_requires=['unokit', 'pyhwp'],\n      pa"
  },
  {
    "path": "release-hooks/prerelease.after/10-docs-build",
    "chars": 125,
    "preview": "#!/bin/sh\nset -e\necho '* docs: Building documentation...'\nbin/docs-build\necho '* docs: Check documentations in build/doc"
  },
  {
    "path": "release-hooks/prerelease.before/0-docs-update-po",
    "chars": 142,
    "preview": "#!/bin/sh\nset -e\necho '* docs: Updating PO files...'\nbin/docs-update-po\necho '* docs: Check if there are translations to"
  },
  {
    "path": "release-hooks/release.after/10-test-pypi",
    "chars": 71,
    "preview": "#!/bin/sh\nset -e\necho '* download/installing package...'\nbin/test-pypi\n"
  },
  {
    "path": "release-hooks/release.after/20-docs-upload",
    "chars": 335,
    "preview": "#!/bin/bash\nset -e\n\necho 'Do you wish to upload the documentation to http://pythonhosted.org/pyhwp?'\nselect yn in 'Yes' "
  },
  {
    "path": "release-hooks/release.before/20-upload-to-testpypi",
    "chars": 145,
    "preview": "#!/bin/sh\n\n# exit if any statement returns non-true return value\nset -e\n\n# exit on uninitialized variable\nset -u\n\nbin/te"
  },
  {
    "path": "requirements/dev.in",
    "chars": 214,
    "preview": "argcomplete\nbabel >= 2.12.1\ncolorlog\njip >= 0.9.16\njupyter\nlxml\nnotebook >= 6.5.4\npip-tools >= 6.13.0\nrequests >= 2.28.2"
  },
  {
    "path": "requirements/dev.txt",
    "chars": 8958,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.9\n# by the following command:\n#\n#    pip-compile --output-fi"
  },
  {
    "path": "requirements/docs.in",
    "chars": 115,
    "preview": "alabaster >= 0.7.10\njinja2 >= 3.1.2\nrepoze.sphinx.autointerface\nsphinx >= 1.5\nsphinx-argparse >= 0.4.0\nsphinx-intl\n"
  },
  {
    "path": "requirements/docs.txt",
    "chars": 1616,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.9\n# by the following command:\n#\n#    pip-compile --output-fi"
  },
  {
    "path": "requirements/lint.in",
    "chars": 29,
    "preview": "check-manifest\nflake8\npyroma\n"
  },
  {
    "path": "requirements/lint.txt",
    "chars": 685,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.9\n# by the following command:\n#\n#    pip-compile --output-fi"
  },
  {
    "path": "requirements/test.in",
    "chars": 18,
    "preview": "coverage >= 7.2.3\n"
  },
  {
    "path": "requirements/test.txt",
    "chars": 570,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.9\n# by the following command:\n#\n#    pip-compile --output-fi"
  },
  {
    "path": "requirements.in",
    "chars": 188,
    "preview": "cryptography >= 40.0.1 ; platform_python_implementation != \"Jython\"\nlxml >= 4.9.2 ; platform_python_implementation != \"J"
  },
  {
    "path": "requirements.txt",
    "chars": 494,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.9\n# by the following command:\n#\n#    pip-compile --output-fi"
  },
  {
    "path": "setup.cfg",
    "chars": 375,
    "preview": "[build_sphinx]\nsource-dir = docs/\nbuild-dir  = docs/.build\nall_files  = 1\n\n\n[extract_messages]\nsort-by-file = True\ncopyr"
  },
  {
    "path": "setup.py",
    "chars": 4828,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/README.rst",
    "chars": 174,
    "preview": "``pyhwp/`` - the main source code\n---------------------------------\n\n``hwp5/``\n   The main source package. For now, ther"
  },
  {
    "path": "src/hwp5/__init__.py",
    "chars": 1045,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/__init__.py",
    "chars": 17284,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/_shared.py",
    "chars": 7988,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controlchar.py",
    "chars": 6561,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/__init__.py",
    "chars": 3442,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/_shared.py",
    "chars": 1892,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/bookmark_control.py",
    "chars": 1629,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/columns_def.py",
    "chars": 2732,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/common_controls.py",
    "chars": 3329,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/dutmal.py",
    "chars": 1786,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/field.py",
    "chars": 4047,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/gshape_object_control.py",
    "chars": 1103,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/header_footer.py",
    "chars": 1539,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/hidden_comment.py",
    "chars": 1207,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/index_marker.py",
    "chars": 1324,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/note.py",
    "chars": 1555,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/numbering.py",
    "chars": 2204,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/page_hide.py",
    "chars": 1483,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/page_number_position.py",
    "chars": 1821,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/page_odd_even.py",
    "chars": 1421,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/section_def.py",
    "chars": 2711,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/table_control.py",
    "chars": 1416,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/controls/tcps_control.py",
    "chars": 1420,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid16_document_properties.py",
    "chars": 1745,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid17_id_mappings.py",
    "chars": 2256,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid18_bin_data.py",
    "chars": 2652,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid19_face_name.py",
    "chars": 5185,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid20_border_fill.py",
    "chars": 3228,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid21_char_shape.py",
    "chars": 3395,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid22_tab_def.py",
    "chars": 1843,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid23_numbering.py",
    "chars": 2409,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid24_bullet.py",
    "chars": 1779,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid25_para_shape.py",
    "chars": 3945,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid26_style.py",
    "chars": 1828,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid27_doc_data.py",
    "chars": 1118,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid28_distribute_doc_data.py",
    "chars": 1138,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid30_compatible_document.py",
    "chars": 1481,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid31_layout_compatibility.py",
    "chars": 1427,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid32_unknown.py",
    "chars": 1099,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid50_para_header.py",
    "chars": 2112,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid51_para_text.py",
    "chars": 2158,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid52_para_char_shape.py",
    "chars": 2208,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid53_para_line_seg.py",
    "chars": 3200,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid54_para_range_tag.py",
    "chars": 1723,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid55_ctrl_header.py",
    "chars": 1728,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid56_list_header.py",
    "chars": 5065,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid57_page_def.py",
    "chars": 3248,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid58_footnote_shape.py",
    "chars": 1960,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid59_page_border_fill.py",
    "chars": 1709,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid60_shape_component.py",
    "chars": 6400,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid61_table.py",
    "chars": 2445,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid62_shape_component_line.py",
    "chars": 1375,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid63_shape_component_rectangle.py",
    "chars": 1444,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid64_shape_component_ellipse.py",
    "chars": 1737,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid65_shape_component_arc.py",
    "chars": 1406,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid66_shape_component_polygon.py",
    "chars": 1388,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid67_shape_component_curve.py",
    "chars": 1410,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid68_shape_component_ole.py",
    "chars": 1797,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid69_shape_component_picture.py",
    "chars": 3140,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid70_shape_component_container.py",
    "chars": 1127,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid71_ctrl_data.py",
    "chars": 1923,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid72_ctrl_eqedit.py",
    "chars": 1675,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid74_shape_component_textart.py",
    "chars": 1121,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid75_form_object.py",
    "chars": 1095,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid76_memo_shape.py",
    "chars": 1092,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid77_memo_list.py",
    "chars": 1089,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid78_forbidden_char.py",
    "chars": 1104,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid79_chart_data.py",
    "chars": 1092,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binmodel/tagid99_shape_component_unknown.py",
    "chars": 1121,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/binspec.py",
    "chars": 13172,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/bintype.py",
    "chars": 17347,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/charsets.py",
    "chars": 2841,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/cli.py",
    "chars": 3421,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/compressed.py",
    "chars": 2409,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/dataio.py",
    "chars": 19422,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/distdoc.py",
    "chars": 3028,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/errors.py",
    "chars": 1290,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/filestructure.py",
    "chars": 16562,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/hwp5html.py",
    "chars": 6671,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/hwp5odt.py",
    "chars": 14512,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/hwp5proc.py",
    "chars": 4097,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/hwp5txt.py",
    "chars": 3342,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/hwp5view.py",
    "chars": 6293,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/importhelper.py",
    "chars": 1608,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/locale/hwp5html.pot",
    "chars": 1081,
    "preview": "# Translations template for pyhwp.\n# Copyright (C) 2019 https://github.com/mete0r\n# This file is distributed under the s"
  },
  {
    "path": "src/hwp5/locale/hwp5odt.pot",
    "chars": 1309,
    "preview": "# Translations template for pyhwp.\n# Copyright (C) 2019 https://github.com/mete0r\n# This file is distributed under the s"
  },
  {
    "path": "src/hwp5/locale/hwp5proc.pot",
    "chars": 7008,
    "preview": "# Translations template for pyhwp.\n# Copyright (C) 2019 https://github.com/mete0r\n# This file is distributed under the s"
  },
  {
    "path": "src/hwp5/locale/hwp5txt.pot",
    "chars": 949,
    "preview": "# Translations template for pyhwp.\n# Copyright (C) 2019 https://github.com/mete0r\n# This file is distributed under the s"
  },
  {
    "path": "src/hwp5/locale/hwp5view.pot",
    "chars": 903,
    "preview": "# Translations template for pyhwp.\n# Copyright (C) 2019 https://github.com/mete0r\n# This file is distributed under the s"
  },
  {
    "path": "src/hwp5/locale/ko/LC_MESSAGES/hwp5html.po",
    "chars": 1178,
    "preview": "# Korean translations for pyhwp.\n# Copyright (C) 2017 https://github.com/mete0r\n# This file is distributed under the sam"
  },
  {
    "path": "src/hwp5/locale/ko/LC_MESSAGES/hwp5odt.po",
    "chars": 1460,
    "preview": "# Korean translations for pyhwp.\n# Copyright (C) 2017 https://github.com/mete0r\n# This file is distributed under the sam"
  },
  {
    "path": "src/hwp5/locale/ko/LC_MESSAGES/hwp5proc.po",
    "chars": 8916,
    "preview": "# Korean translations for pyhwp.\n# pyhwp 한국/조선어 번역\n# Copyright (C) 2017 https://github.com/mete0r\n# This file is distrib"
  },
  {
    "path": "src/hwp5/locale/ko/LC_MESSAGES/hwp5txt.po",
    "chars": 1032,
    "preview": "# Korean translations for pyhwp.\n# Copyright (C) 2017 https://github.com/mete0r\n# This file is distributed under the sam"
  },
  {
    "path": "src/hwp5/locale/ko/LC_MESSAGES/hwp5view.po",
    "chars": 991,
    "preview": "# Korean translations for pyhwp.\n# Copyright (C) 2017 https://github.com/mete0r\n# This file is distributed under the sam"
  },
  {
    "path": "src/hwp5/msoleprops.py",
    "chars": 17331,
    "preview": "# -*- coding: utf-8 -*-\n#\n#   pyhwp : hwp file format parser in python\n#   Copyright (C) 2010-2023 mete0r <https://githu"
  },
  {
    "path": "src/hwp5/odf-relaxng/OpenDocument-manifest-schema-v1.0-os.rng",
    "chars": 3100,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n    OASIS OpenDocument v1.0\n    OASIS standard, 1 May 2005\n    Relax-NG Mani"
  },
  {
    "path": "src/hwp5/odf-relaxng/OpenDocument-manifest-schema-v1.1.rng",
    "chars": 3100,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n    OASIS OpenDocument v1.1\n    OASIS Standard, 1 Feb 2007\n    Relax-NG Mani"
  },
  {
    "path": "src/hwp5/odf-relaxng/OpenDocument-schema-v1.0-os.rng",
    "chars": 541981,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n    OASIS OpenDocument v1.0\n    OASIS Standard, 1 May 2005\n    Relax-NG Sche"
  }
]

// ... and 611 more files (download for full content)

About this extraction

This page contains the full source code of the mete0r/pyhwp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 811 files (11.1 MB), approximately 3.0M tokens, and a symbol index with 2236 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!