diff --git a/index.js b/index.js index 2cc98e26f..7c7c0869f 100644 --- a/index.js +++ b/index.js @@ -136,6 +136,7 @@ URLS=[ "tf/convert/xml.html", "tf/convert/xmlCustom.html", "tf/convert/addnlp.html", +"tf/convert/makewatm.html", "tf/convert/tei.html", "tf/convert/watm.html", "tf/convert/mql.html", @@ -3585,7 +3586,7 @@ INDEX=[ { "ref":"tf.about.releases", "url":72, -"doc":" Release notes ! hint \"Consult the tutorials after changes\" When we change the API, we make sure that the tutorials show off all possibilities. See the app-specific tutorials via tf.about.corpora . - The TEI converter is still in active development. If you need the latest version, clone the TF repo and in its top-level directory run the command: sh pip install -e . 12 12.4 12.4.2 2024-04-24 Tiny fixes in the TEI and WATM conversions. 12.4.1 2024-04-24 Improvements in the TEI and WATM conversions. 12.4.0 2024-04-21 Support for [Marimo notebooks](https: docs.marimo.io/index.html). TF detects when its run in a notebook, and also in what kind of notebook: ipython (~ Jupyter) or marimo . When it needs to display material in the output of a cell, it will choose the methods that are suitable for the kind of notebook it is working in. 12.3 12.3.7 2024-04-19 Improvements in tf.convert.watm : the resulting data is much more compact, because: you can choose to export it as TSV instead of JSON; no annotations of type node are produced anymore, they only served to map annotations and text segments to TF nodes; now that mapping is exported as a simple TSV file; you can opt to exclude an arbitrary set of tags from being exported as WATM annotations. 12.3.6 2024-04-16 Minimal fixes in tf.convert.tei : it can handle a biography. Fixed prettyTuple() when passed _asString=True : it did not pass this on to pretty() which caused a Python error. 12.3.5 2024-03-26 extra functionality: When adding types with tf.dataset.modify you can link nodes of a newly added type to nodes that were added as the preiviously added type. This is a bit of a limited and ad hoc extension of the functionality of this function. I needed a quick fix to add nodes for entities and entity occurrences at the same time and link them with edges. This is for the corpus [ CLARIAH/wp6-missieven ](https: github.com/CLARIAH/wp6-missieven). fix: the express download of a dataset (complete.zip) was nit triggered in all cases where it should. 12.3.4 2024-02-26 The output of tf.convert.watm has been changed. It now generates token files per section, where you can configure the TF section level for that. The syntax for targets has been changed: more things are possible. Tests have been adapted and strengthened. 12.3.3 2024-02-20 Fix in tf.advanced.repo.publishRelease : it did not work if you are on a branch named main because master was hard-coded in the source code. Now it takes the branch name from the app context. Do not forget to specify branch: main under the provenanceSpecs in your /app/config.yaml . Many thanks to Tony Jorg for reporting this error. 12.3.1,2 2024-02-15 Minor improvements to the WATM converter, and an update of its docs. 12.3.0 2024-02-08 A new data export conversion, from TF to WATM. See tf.convert.watm . WATM is a not yet hardened data format that powers the publishing line for text and annotations built by Team Text at [KNAW/HuC Digital Infrastructure](https: di.huc.knaw.nl/text-analysis-en.html). Currently this export is used for the corpora [Mondriaan Proeftuin](https: github.com/annotation/mondriaan) [Suriano Letters](https: gitlab.huc.knaw.nl/suriano/letters) [TransLatin Corpus](https: gitlab.huc.knaw.nl/translatin/corpus) Small fixes in tf.convert.addnlp : when the NLP data is integrated in the TF dataset, the NLP-generated features will get some metadata 12.2 12.2.8,9,10 2024-01-24/25 TF can auto-download extra data with a TF dataset, e.g. a directory with named entities ( ner ) as in the [suriano corpus](https: gitlab.huc.knaw.nl/suriano/letters). However, this only worked when the repo was in the github backend and the extra data had been packed for express-download and attached to a release. Now it also works with the normal download methods using the GitHub and GitLab APIs. So, after the move of Suriano from GitHub to GitLab, this functionality is still available. There was a glitch in the layout of the NER tool which caused section labels to be chopped off at the margin, only in notebooks. Thats has been fixed by moving some CSS code from one file to an other. 12.2.7 2024-01-23 There were issues with starting up the Text-Fabric browser: If the system could not start the browser, the TF stopped the webserver. That is not helpful, because one can always open a browser and enter the url in the address bar. Now TF shows the url rather prominently when it does not open a browser. If debug mode is on, Flask reloads the whole process, and that might include opening the browser as well. Now Flask only opens the browser after the startup of the webserver, and not anymore after successive reloads. 12.2.6 2024-01-15 Somehow the express way of downloading data (via complete.zip attached to the latest release) did not get triggered in all cases where it should. It is now triggered in more cases than before. 12.2.5 2023-12-18 Small fix in NER browser: prevent submitting the form if the focus is in a textarea field or in an input field that does not have type=submit. 12.2.3,4 2023-12-09 Writing support for Ugaritic, thanks to Martijn Naaijer and Christian H\u00f8jgaard for converting a Ugaritic corpus to TF. Fix in display functions (continued): The logic of feature display, fixed in the previous version, was not effective when things are displayed in the TF browser. Because in the TF browser the features of the last query were passed as extraFeatures instead of tupleFeatures . This has been fixed by using tupleFeatures in the TF browser as well. 12.2.2 2023-12-02 Fix in display functions, thanks to Tony Jurg: if you do A.pretty(x, queryFeatures=False, extraFeatures=\"yy zz\") the extra features were not shown. So there was no obvious way to control exactly the features that you want to show in a display. That has been fixed. Further clarification: the node features that are used by a query are stored in the display option tupleFeatures . That is what causes them to be displayed in subsequent display statements. You can also explicitly set/pass the tupleFeatures parameter. However, the fact that queryFeatures=False prohibited the display of features mentioned in extraFeatures was against the intuitions. Improvements in the PageXML conversion. There are token features str , after that reflect the logical tokens There are token features rstr , rafter that reflect the physical tokens The distincition between logical and physical is that physical token triplets with the soft hyphen as the middle one, are joined to one logical token; this happens across line boundaries, but also region and page boundaries. 12.2.0,1 2023-11-28 New conversion tool: from PageXML. Still in its infancy. It uses the [PageXML tools](https: github.com/knaw-huc/pagexml) by Marijn Koolen. For an example see [translatin/logic](https: gitlab.huc.knaw.nl/translatin/logic/-/blob/main/tools/convertPlain.ipynb?ref_type=heads). Fix: TF did not fetch an earlier version of a corpus if the newest release contains a complete.zip (which only has the latest version). For some technical reason that still escapes me, the TF browser was slow to start. Fixed it by saying threaded=True to Flask, as suggested on [stackoverflow](https: stackoverflow.com/a/11150849/15236220) From now on: TF does not try to download complete.zip if you pass a version argument to the use() command. 12.1 12.1.6,7 2023-11-15 Various fixes: Some package data was not included for the NER annotation tool. In the NER tool, the highlighting of hits of the search pattern is now exact, it was sometimes off. Deleted tf.tools.docsright again, but developed it further in [docsright](https: github.com/annotation/docsright). 12.1.5 2023-11-02 Improvement in dependencies. Text-Fabric is no longer mandatory dependent on openpyxl , pandas , pyarrow , lxml . The optional dependencies on pygithub and python-gitlab remain, but most users will never need them, because TF can also fetch the complete.zip that is available as release asset for most corpora. Whenever TF invokes a module that is not in the mandatory dependencies, it will act gracefully, providing hints to install the modules in question. 12.1.3,4 2023-11-01 API change in the Annotator: Calling the annotator is now easier: A.makeNer() (No need to make an additional import statement.) This will give you access to all annotation methods, including using a spreadsheet to read annotation instructions from. Removal of deprecated commands (on the command line) in version 11: text-fabric (has become tf ) text-fabric-zip (has become tf-zip ) text-fabric-make (has become tf-make ) Bug fixes: [ 81](https: github.com/annotation/text-fabric/issues/81) and [ 82](https: github.com/annotation/text-fabric/issues/82) Spell-checked all bits of the TF docs here (33,000 lines). Wrote a script tf.tools.docsright to separate the code content from the markdown content, and to strip bits from the markdown content that lead to false positives for the spell checker. Then had the Vim spell checker run over those lines and corrected all mistakes by hand. Still, there might be grammar errors and content inaccuracies. 12.1.4 follows 12.1.3. quickly, because in corpora without a NER configuration file, TF did not start up properly. 12.1.1,2 2023-10-29 Bug fix: the mechanism to make individual exceptions when adding named entities in the tf.browser.ner.annotate tool was broken. Thanks to Daniel Swanson for spotting it. Additional fixes and enhancements. 12.1.0 2023-10-28 New stuff In the TF browser there will be a new tab in the vertical sidebar: Annotate , which will give access to manual annotation tools. I am developing the first one, a tool to annotate named entities efficiently, both in the TF browser and in a Jupyter Notebook. Reed more in tf.about.annotate . These tools will let you save your work as files on your own computer. In tf.convert.addnlp we can now extract more NLP information besides tokens and sentences: part-of-speech, morphological tagging, lemmatisation, named entity recognition Fixes in the TEI converter. 12.0 12.0.6,7 2023-09-13 Trivial fix in code that exports the data from a job in the TF browser. In the meanwhile there is unfinished business in the Annotate tab in the TF browser, that will come into production in the upcoming 12.1 release. The Chrome browser has an attractive feature that other browsers such as Safari lack: It supports the CSS property [content-visibility](https: developer.mozilla.org/en-US/docs/Web/CSS/content-visibility). With this property you can prevent the browser to do the expensive rendering of content that is not visible on the screen. That makes it possible to load a lot of content in a single page without tripping up the browser. You also need the [ IntersectionObserver API](https: developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API), but that is generally supported by browsers. With the help of that API you can restrict the binding of event listeners to elements that are visible on the screen. So, you can open the TF browser in Chrome by passing the option chrome . But if Chrome is not installed, it will open in the default browser anyway. Also, when the opening of the browser fails somehow, the web server is stopped. 12.0.5 2023-07-10 Fixed references to static files that still went to /server instead of /browser . This has to do with the new approach to the TF browser. 12.0.0-4 2023-07-05 Simplification The TF browser no longer works with a separate process that holds the TF corpus data. Instead, the web server (flask) loads the corpus itself. This will restrict the usage of the TF browser to local-single-user scenarios. TF no longer exposes the installation options [browser, pandas] pip install 'text-fabric[browser]' pip install 'text-fabric[pandas]' If you work with Pandas (like exporting to Pandas) you have to install it yourself: pip install pandas pyarrow The TF browser is always supported. The reason to have these distinct capabilities was that there are python libraries involved that do not install on the iPad. The simplification of the TF browser makes it possible to be no longer dependent on these modules. Hence, TF can be installed on the iPad, although the TF browser works is not working there yet. But the auto-downloading of data from GitHub / GitLab works. Minor things Header. After loading a dataset, a header is shown with shows all kinds of information about the corpus. But so far, it did not show the TF app settings. Now they are included in the header. There are two kinds: the explicitly given settings and the derived and computed settings. The latter ones will be suppressed when loading a dataset in a Jupyter notebook, because these settings can become quite big. You can still get them with A.showContext() . In the TF browser they will be always included, you find it in the Corpus tab. - Older releases See tf.about.releasesold ." +"doc":" Release notes ! hint \"Consult the tutorials after changes\" When we change the API, we make sure that the tutorials show off all possibilities. See the app-specific tutorials via tf.about.corpora . - The TEI converter is still in active development. If you need the latest version, clone the TF repo and in its top-level directory run the command: sh pip install -e . 12 12.4 12.4.3 2024-05-08 Fix in TF browser, spotted by Jorik Groen. When exporting query results, the values features used in the query were not written to the table at all. The expected behaviour was that features used in the query lead to extra columns in the exported table. It has been fixed. The cause was an earlier fix in the display of features in query results. This new fix only affects the export function from the browser, not the advanced.display.export function, which did not have this bug. 12.4.2 2024-04-24 Tiny fixes in the TEI and WATM conversions. 12.4.1 2024-04-24 Improvements in the TEI and WATM conversions. 12.4.0 2024-04-21 Support for [Marimo notebooks](https: docs.marimo.io/index.html). TF detects when its run in a notebook, and also in what kind of notebook: ipython (~ Jupyter) or marimo . When it needs to display material in the output of a cell, it will choose the methods that are suitable for the kind of notebook it is working in. 12.3 12.3.7 2024-04-19 Improvements in tf.convert.watm : the resulting data is much more compact, because: you can choose to export it as TSV instead of JSON; no annotations of type node are produced anymore, they only served to map annotations and text segments to TF nodes; now that mapping is exported as a simple TSV file; you can opt to exclude an arbitrary set of tags from being exported as WATM annotations. 12.3.6 2024-04-16 Minimal fixes in tf.convert.tei : it can handle a biography. Fixed prettyTuple() when passed _asString=True : it did not pass this on to pretty() which caused a Python error. 12.3.5 2024-03-26 extra functionality: When adding types with tf.dataset.modify you can link nodes of a newly added type to nodes that were added as the preiviously added type. This is a bit of a limited and ad hoc extension of the functionality of this function. I needed a quick fix to add nodes for entities and entity occurrences at the same time and link them with edges. This is for the corpus [ CLARIAH/wp6-missieven ](https: github.com/CLARIAH/wp6-missieven). fix: the express download of a dataset (complete.zip) was nit triggered in all cases where it should. 12.3.4 2024-02-26 The output of tf.convert.watm has been changed. It now generates token files per section, where you can configure the TF section level for that. The syntax for targets has been changed: more things are possible. Tests have been adapted and strengthened. 12.3.3 2024-02-20 Fix in tf.advanced.repo.publishRelease : it did not work if you are on a branch named main because master was hard-coded in the source code. Now it takes the branch name from the app context. Do not forget to specify branch: main under the provenanceSpecs in your /app/config.yaml . Many thanks to Tony Jorg for reporting this error. 12.3.1,2 2024-02-15 Minor improvements to the WATM converter, and an update of its docs. 12.3.0 2024-02-08 A new data export conversion, from TF to WATM. See tf.convert.watm . WATM is a not yet hardened data format that powers the publishing line for text and annotations built by Team Text at [KNAW/HuC Digital Infrastructure](https: di.huc.knaw.nl/text-analysis-en.html). Currently this export is used for the corpora [Mondriaan Proeftuin](https: github.com/annotation/mondriaan) [Suriano Letters](https: gitlab.huc.knaw.nl/suriano/letters) [TransLatin Corpus](https: gitlab.huc.knaw.nl/translatin/corpus) Small fixes in tf.convert.addnlp : when the NLP data is integrated in the TF dataset, the NLP-generated features will get some metadata 12.2 12.2.8,9,10 2024-01-24/25 TF can auto-download extra data with a TF dataset, e.g. a directory with named entities ( ner ) as in the [suriano corpus](https: gitlab.huc.knaw.nl/suriano/letters). However, this only worked when the repo was in the github backend and the extra data had been packed for express-download and attached to a release. Now it also works with the normal download methods using the GitHub and GitLab APIs. So, after the move of Suriano from GitHub to GitLab, this functionality is still available. There was a glitch in the layout of the NER tool which caused section labels to be chopped off at the margin, only in notebooks. Thats has been fixed by moving some CSS code from one file to an other. 12.2.7 2024-01-23 There were issues with starting up the Text-Fabric browser: If the system could not start the browser, the TF stopped the webserver. That is not helpful, because one can always open a browser and enter the url in the address bar. Now TF shows the url rather prominently when it does not open a browser. If debug mode is on, Flask reloads the whole process, and that might include opening the browser as well. Now Flask only opens the browser after the startup of the webserver, and not anymore after successive reloads. 12.2.6 2024-01-15 Somehow the express way of downloading data (via complete.zip attached to the latest release) did not get triggered in all cases where it should. It is now triggered in more cases than before. 12.2.5 2023-12-18 Small fix in NER browser: prevent submitting the form if the focus is in a textarea field or in an input field that does not have type=submit. 12.2.3,4 2023-12-09 Writing support for Ugaritic, thanks to Martijn Naaijer and Christian H\u00f8jgaard for converting a Ugaritic corpus to TF. Fix in display functions (continued): The logic of feature display, fixed in the previous version, was not effective when things are displayed in the TF browser. Because in the TF browser the features of the last query were passed as extraFeatures instead of tupleFeatures . This has been fixed by using tupleFeatures in the TF browser as well. 12.2.2 2023-12-02 Fix in display functions, thanks to Tony Jurg: if you do A.pretty(x, queryFeatures=False, extraFeatures=\"yy zz\") the extra features were not shown. So there was no obvious way to control exactly the features that you want to show in a display. That has been fixed. Further clarification: the node features that are used by a query are stored in the display option tupleFeatures . That is what causes them to be displayed in subsequent display statements. You can also explicitly set/pass the tupleFeatures parameter. However, the fact that queryFeatures=False prohibited the display of features mentioned in extraFeatures was against the intuitions. Improvements in the PageXML conversion. There are token features str , after that reflect the logical tokens There are token features rstr , rafter that reflect the physical tokens The distincition between logical and physical is that physical token triplets with the soft hyphen as the middle one, are joined to one logical token; this happens across line boundaries, but also region and page boundaries. 12.2.0,1 2023-11-28 New conversion tool: from PageXML. Still in its infancy. It uses the [PageXML tools](https: github.com/knaw-huc/pagexml) by Marijn Koolen. For an example see [translatin/logic](https: gitlab.huc.knaw.nl/translatin/logic/-/blob/main/tools/convertPlain.ipynb?ref_type=heads). Fix: TF did not fetch an earlier version of a corpus if the newest release contains a complete.zip (which only has the latest version). For some technical reason that still escapes me, the TF browser was slow to start. Fixed it by saying threaded=True to Flask, as suggested on [stackoverflow](https: stackoverflow.com/a/11150849/15236220) From now on: TF does not try to download complete.zip if you pass a version argument to the use() command. 12.1 12.1.6,7 2023-11-15 Various fixes: Some package data was not included for the NER annotation tool. In the NER tool, the highlighting of hits of the search pattern is now exact, it was sometimes off. Deleted tf.tools.docsright again, but developed it further in [docsright](https: github.com/annotation/docsright). 12.1.5 2023-11-02 Improvement in dependencies. Text-Fabric is no longer mandatory dependent on openpyxl , pandas , pyarrow , lxml . The optional dependencies on pygithub and python-gitlab remain, but most users will never need them, because TF can also fetch the complete.zip that is available as release asset for most corpora. Whenever TF invokes a module that is not in the mandatory dependencies, it will act gracefully, providing hints to install the modules in question. 12.1.3,4 2023-11-01 API change in the Annotator: Calling the annotator is now easier: A.makeNer() (No need to make an additional import statement.) This will give you access to all annotation methods, including using a spreadsheet to read annotation instructions from. Removal of deprecated commands (on the command line) in version 11: text-fabric (has become tf ) text-fabric-zip (has become tf-zip ) text-fabric-make (has become tf-make ) Bug fixes: [ 81](https: github.com/annotation/text-fabric/issues/81) and [ 82](https: github.com/annotation/text-fabric/issues/82) Spell-checked all bits of the TF docs here (33,000 lines). Wrote a script tf.tools.docsright to separate the code content from the markdown content, and to strip bits from the markdown content that lead to false positives for the spell checker. Then had the Vim spell checker run over those lines and corrected all mistakes by hand. Still, there might be grammar errors and content inaccuracies. 12.1.4 follows 12.1.3. quickly, because in corpora without a NER configuration file, TF did not start up properly. 12.1.1,2 2023-10-29 Bug fix: the mechanism to make individual exceptions when adding named entities in the tf.browser.ner.annotate tool was broken. Thanks to Daniel Swanson for spotting it. Additional fixes and enhancements. 12.1.0 2023-10-28 New stuff In the TF browser there will be a new tab in the vertical sidebar: Annotate , which will give access to manual annotation tools. I am developing the first one, a tool to annotate named entities efficiently, both in the TF browser and in a Jupyter Notebook. Reed more in tf.about.annotate . These tools will let you save your work as files on your own computer. In tf.convert.addnlp we can now extract more NLP information besides tokens and sentences: part-of-speech, morphological tagging, lemmatisation, named entity recognition Fixes in the TEI converter. 12.0 12.0.6,7 2023-09-13 Trivial fix in code that exports the data from a job in the TF browser. In the meanwhile there is unfinished business in the Annotate tab in the TF browser, that will come into production in the upcoming 12.1 release. The Chrome browser has an attractive feature that other browsers such as Safari lack: It supports the CSS property [content-visibility](https: developer.mozilla.org/en-US/docs/Web/CSS/content-visibility). With this property you can prevent the browser to do the expensive rendering of content that is not visible on the screen. That makes it possible to load a lot of content in a single page without tripping up the browser. You also need the [ IntersectionObserver API](https: developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API), but that is generally supported by browsers. With the help of that API you can restrict the binding of event listeners to elements that are visible on the screen. So, you can open the TF browser in Chrome by passing the option chrome . But if Chrome is not installed, it will open in the default browser anyway. Also, when the opening of the browser fails somehow, the web server is stopped. 12.0.5 2023-07-10 Fixed references to static files that still went to /server instead of /browser . This has to do with the new approach to the TF browser. 12.0.0-4 2023-07-05 Simplification The TF browser no longer works with a separate process that holds the TF corpus data. Instead, the web server (flask) loads the corpus itself. This will restrict the usage of the TF browser to local-single-user scenarios. TF no longer exposes the installation options [browser, pandas] pip install 'text-fabric[browser]' pip install 'text-fabric[pandas]' If you work with Pandas (like exporting to Pandas) you have to install it yourself: pip install pandas pyarrow The TF browser is always supported. The reason to have these distinct capabilities was that there are python libraries involved that do not install on the iPad. The simplification of the TF browser makes it possible to be no longer dependent on these modules. Hence, TF can be installed on the iPad, although the TF browser works is not working there yet. But the auto-downloading of data from GitHub / GitLab works. Minor things Header. After loading a dataset, a header is shown with shows all kinds of information about the corpus. But so far, it did not show the TF app settings. Now they are included in the header. There are two kinds: the explicitly given settings and the derived and computed settings. The latter ones will be suppressed when loading a dataset in a Jupyter notebook, because these settings can become quite big. You can still get them with A.showContext() . In the TF browser they will be always included, you find it in the Corpus tab. - Older releases See tf.about.releasesold ." }, { "ref":"tf.about.clientmanual", @@ -7133,96 +7134,148 @@ INDEX=[ "func":1 }, { -"ref":"tf.convert.tei", +"ref":"tf.convert.makewatm", +"url":137, +"doc":"" +}, +{ +"ref":"tf.convert.makewatm.MakeWATM", "url":137, +"doc":"Base class for running conversions to WATM. This class has methods to convert corpora from TEI or PageXML to TF and then to WATM. But if the corpus needs additional preparation, you can make a sub class based on this with additional tasks defined an implemented. Any class M in m.py based on this class can be called from the command line as follows: python m.py flags tasks If you base a superclass on this, you can register the additional tasks as follows: For each extra task xxx, write an method doTask_xxx(self) Then provide for each task a simple doc line and register them all by: self.setOptions( taskSpecs=( (task1, docLine1), (task2, docLine2), . ), flagSpecs=( (flag1, docLine1), (flag2, docLine2), . ), ) Localize upon creation. When an object of this class is initialized, we assume that the script doing it is localized in the programs directory in a corpus repo. Parameters fileLoc: string The full path of the file that creates an instance of this class." +}, +{ +"ref":"tf.convert.makewatm.MakeWATM.doTask_tei2tf", +"url":137, +"doc":"", +"func":1 +}, +{ +"ref":"tf.convert.makewatm.MakeWATM.doTask_page2tf", +"url":137, +"doc":"", +"func":1 +}, +{ +"ref":"tf.convert.makewatm.MakeWATM.doTask_watm", +"url":137, +"doc":"", +"func":1 +}, +{ +"ref":"tf.convert.makewatm.MakeWATM.doTask_watms", +"url":137, +"doc":"", +"func":1 +}, +{ +"ref":"tf.convert.makewatm.MakeWATM.run", +"url":137, +"doc":"", +"func":1 +}, +{ +"ref":"tf.convert.makewatm.MakeWATM.setOptions", +"url":137, +"doc":"", +"func":1 +}, +{ +"ref":"tf.convert.makewatm.MakeWATM.main", +"url":137, +"doc":"", +"func":1 +}, +{ +"ref":"tf.convert.tei", +"url":138, "doc":" TEI import You can convert any TEI source into TF by specifying a few details about the source. TF then invokes the tf.convert.walker machinery to produce a TF dataset out of the source. TF knows the TEI elements, because it will read and parse the complete TEI schema. From this the set of complex, mixed elements is distilled. If the TEI source conforms to a customised TEI schema, it will be detected and the importer will read it and override the generic information of the TEI elements. It is also possible to pass a choice of template and adaptation in a processing instruction. This does not influence validation, but it may influence further processing. If the TEI consists of multiple source files, it is possible to specify different templates and adaptations for different files. The possible values for models, templates, and adaptations should be declared in the configuration file. For each model there should be a corresponding schema in the schema directory, either an RNG or an XSD file. The converter goes the extra mile: it generates a TF app and documentation (an about.md file and a transcription.md file), in such a way that the TF browser is instantly usable. The TEI conversion is rather straightforward because of some conventions that cannot be changed. Configuration and customization We assume that you have a programs directory at the top-level of your repo. In this directory we'll look for two optional files: a file tei.yaml in which you specify a bunch of values to get the conversion off the ground. a file tei.py in which you define custom functions that are executed at certain specific hooks: transform(text) which takes a text string argument and delivers a text string as result. The converter will call this on every TEI input file it reads before feeding it to the XML parser. This can be used to solve some quirks in the input, e.g. replacing two consecutive commas ( ) by a single unicode character ( \u201e = 201E); beforeTag : just before the walker starts processing the start tag of a TEI element; beforeChildren : just after processing the start tag, but before processing the element content (text and child elements); afterChildren : just after processing the complete element content (text and child elements), but before processing the end tag of the TEI element; afterTag : just after processing the end tag of a TEI element. The before and after functions should take the following arguments cv : the walker converter object; cur : the dictionary with information that has been gathered during the conversion so far and that can be used to dump new information into; it is nonlocal, i.e. all invocations of the hooks get the same dictionary object passed to them; xnode : the LXML node corresponding to the TEI element; tag : the tag name of the element, without namespaces; this is a bit redundant, because it can also be extracted from the xnode , but it is convenient. atts : the attributes (names and values) of the element, without namespaces; this is a bit redundant, because it can also be extracted from the xnode , but it is convenient. These functions should not return anything, but they can write things to the cur dictionary. And they can create slots, nodes, and terminate them, in short, they can do every cv -based action that is needed. You can define these functions out of this context, but it is good to know what information in cur is guaranteed to be available: xnest : the stack of XML tag names seen at this point; tnest : the stack of TF nodes built at this point; tsiblings (only if sibling nodes are being recorded): the list of preceding TF nodes corresponding to the TEI sibling elements of the current TEI element. Keys and values of the tei.yaml file generic dict, optional {} Metadata for all generated TF features. The actual source version of the TEI files does not have to be stated here, it will be inserted based on the version that the converter will actually use. That version depends on the tei argument passed to the program. The key under which the source version will be inserted is teiVersion . extra dict, optional {} Instructions and metadata for specific generated TF features, namely those that have not been generated by the vanilla TEI conversion, but by extra code in one of the customised hooks. The dict is keyed by feature name, the values are again dictionaries. These value dictionaries have a key meta under which any number of metadata key value pairs, such as description=\"xxx\" . If you put the string \u00abbase\u00bb in such a field, it will be expanded on the basis of the contents of the path key, see below. You must provide the key valueType and pass int or str there, depending on the values of the feature. You may provide extra keys, such as conversionMethod=\"derived\" , so that other programs can determine what to do with these features. The information in this dict will also end up in the generated feature docs. Besides the meta key, there may also be the keys path , and nodeType . Together they contain an instruction to produce a feature value from element content that can be found on the current stack of XML nodes and attributes. The value found will be put in the feature in question for the node of type specified in nodeType that is recently constructed. Example: yaml extra: letterid: meta: description: The identifier of a letter; \u00abbase\u00bb valueType: str conversionMethod: derived conversionCode: tt path: - idno: type: letterId - altIdentifier - msIdentifier - msDesc - sourceDesc nodeType: letter feature: letterid The meaning is: if, while parsing the XML, I encounter an element idno , and if that element has an attribute type with value letterId , and if it has parent altIdentifier , and grandparent msIdentifier , and great-grandparent msDesc , and great-great-grandparent sourceDesc , then look up the last created node of type letter and get the text content of the current XML node (the idno one), and put it in the feature letterid for that node. Moreover, the feature letterid gets metadata as specified under the key meta , where the description will be filled with the text The identifier of a letter; the content is taken from sourceDesc/msDesc/msIdentifier/altIdentifier/idno[type=letterId] models list, optional [] Which TEI-based schemas are to be used. For each model there should be an XSD or RNG file with that name in the schema directory. The tei_all schema is known to TF, no need to specify that one. We'll try a RelaxNG schema ( .rng ) first. If that exists, we use it for validation with JING, and we also convert it with TRANG to an XSD schema, which we use for analysing the schema: we want to know which elements are mixed and pure. If there is no RelaxNG schema, we try an XSD schema ( .xsd ). If that exists, we can do the analysis, and we will use it also for validation. ! note \"Problems with RelaxNG validation\" RelaxNG validation is not always reliable when performed with LXML, or any tool based on libxml , for that matter. That's why we try to avoid it. Even if we translate the RelaxNG schema to an XSD schema by means of TRANG, the resulting validation is not always reliable. So we use JING to validate the RelaxNG schema. See also [JING-TRANG](https: code.google.com/archive/p/jing-trang/downloads). templates list, optional [] Which template(s) are to be used. A template is just a keyword, associated with an XML file, that can be used to switch to a specific kind of processing, such as letter , bibliolist , artworklist . You may specify an element or processing instruction with an attribute that triggers the template for the file in which it is found. This will be retrieved from the file before XML parsing starts. For example, python templateTrigger=\"?editem@template\" will read the file and extract the value of the template attribute of the editem processing instruction and use that as the template for this file. If no template is found in this way, the empty template is assumed. adaptations list, optional [] Which adaptations(s) are to be used. An adaptation is just a keyword, associated with an XML file, that can be used to switch to a specific kind of processing. It is meant to trigger tweaks on top of the behaviour of a template. You may specify an element or processing instruction with an attribute that triggers the adaptation for the file in which it is found. This will be retrieved from the file before XML parsing starts. For example, python adaptationTrigger=\"?editem@adaptation\" will read the file and extract the value of the adaptation attribute of the editem processing instruction and use that as the adaptation for this file. If no adaptation is found in this way, the empty adaptation is assumed. prelim boolean, optional True Whether to work with the pre TF versions. Use this if you convert TEI to a preliminary TF dataset, which will receive NLP additions later on. That version will then lose the pre . granularity string, optional token What to take the basic entities (slots). Possible values: word : words are slots, even if they cross element boundaries. This leads to some imprecisions: words containing an element boundary will belong to just one of both elements around the boundary. char : all individual characters are separate slots. Very precise, but the dataset gets expensive with so many slots. token : every sequence of alphanumeric characters becomes a token, in sofar there is no intervening markup. Non alphanumeric characters become separate tokens. There are some additional rules: . or , tightly surrounded by digits also count as tokens. The datasets with granularity word and token have features str for the string content of the slots, and after for the material after the slots. In the case of word , the feature after can contain whitespace and punctuation characters, in the case of token , it only contains whitespace. If not, the characters are taken as basic entities. If you use an NLP pipeline to detect tokens, use the value False . The preliminary dataset is then based on characters, but the final dataset that we build from there is based on tokens, which are mostly words and non-word characters. parentEdges boolean, optional True Whether to create edges between nodes that correspond to XML elements and their parents. siblingEdges boolean, optional False Whether to create edges between nodes that correspond to XML elements and siblings. Edges will be created between each sibling and its preceding siblings. If you use these edges in the binary way, you can also find the following siblings. The edges are labeled with the distance between the siblings, adjacent siblings get distance 1. ! caution \"Overwhelming space requirement\" If the corpus is divided into relatively few elements that each have very many direct children, the number of sibling edges is comparable to the size of the corpus squared. That means that the TF dataset will consist for 50-99% of sibling edges! An example is [ ETCBC/nestle1904 ](https: github.com/ETCBC/nestle1904) (Greek New Testament) where each book element has all of its sentences as direct children. In that dataset, the siblings would occupy 40% of the size, and we have taken care not to produce sibling edges for sentences. procins boolean, optional False If True, processing instructions will be treated. Processing instruction will be converted as if it were an empty element named foo with attribute bar with value xxx . lineModel dict, optional False If not passed, or an empty dict, line model I is assumed. A line model must be specified with the parameters relevant for the model: python dict( model=\"I\", ) (model I does not require any parameters) or python dict( model=\"II\", element=\"p\", nodeType=\"ln\", ) For model II, the default parameters are: python element=\"p\", nodeType=\"ln\", Model I is the default, and nothing special happens to the elements. In model II the elements translate to nodes of type ln , which span content, whereas the original lb elements just mark positions. Instead of ln , you can also specify another node type by the parameter element . We assume that the material that the elements divide up is the material that corresponds to their parent element. Instead of , you can also specify another element in the parameter element . We assume that lines start and end at the start and end of the elements and the elements. For the material etween these boundaries, we build ln nodes. If an element follows a start tag without intervening slots, a ln node will be created but not linked to slots, and it will be deleted later in the conversion. Likewise, if an element is followed by a end tag without intervening slots, a ln node is created that is not linked to slots. The attributes of the elements become features of the ln node that starts with that element. If there is no explicit element at the start of a paragraph, the first ln node of that paragraph gets no features. pageModel dict, optional False If not passed, or an empty dict, page model I is assumed. A page model must be specified with the parameters relevant for the model: python dict( model=\"I\", ) (model I does not require any parameters) or python dict( model=\"II\", element=\"div\", attributes=dict(type=[\"original\", \"translation\"]), pbAtTop=True, nodeType=\"page\", ) For model II, the default parameters are: python element=\"div\", pbAtTop=True, nodeType=\"page\", attributes={}, Model I is the default, and nothing special happens to the elements. In model II the elements translate to nodes of type page , which span content, whereas the original pb elements just mark positions. Instead of page , you can also specify another node type by the parameter element . We assume that the material that the elements divide up is the material that corresponds to their parent element. Instead of , you can also specify another element in the parameter element . If you want to restrict the parent elements of pages, you can do so by specifying attributes, like type=\"original\" . Then only parents that carry those attributes will be chopped up into pages. You can specify multiple values for each attribute. Elements that carry one of these values are candidates for having their content divided into pages. We assume that the material to be divided starts with a (as the TEI-guidelines prescribe) and we translate it to a page element that we close either at the next or at the end of the div . But if you specify pbAtTop=False , we assume that the marks the end of the corresponding page element. We start the first page at the start of the enclosing element. If there is material at between the last till the end of the enclosing element, we generate an extra page node without features. sectionModel dict, optional {} If not passed, or an empty dict, section model I is assumed. A section model must be specified with the parameters relevant for the model: python dict( model=\"II\", levels=[\"chapter\", \"chunk\"], element=\"head\", attributes=dict(rend=\"h3\"), ) (model I does not require the element and attribute parameters) or python dict( model=\"I\", levels=[\"folder\", \"file\", \"chunk\"], ) This section model (I) accepts a few other parameters: python backMatter=\"backmatter\" This is the name of the folder that should not be treated as an ordinary folder, but as the folder with the sources for the back-matter, such as references, lists, indices, bibliography, biographies, etc. python drillDownDivs=True Whether the chunks are the immediate children of body elements, or whether we should drill through all intervening div levels. For model II, the default parameters are: python element=\"head\" levels=[\"chapter\", \"chunk\"], attributes={} In model I, there are three section levels in total. The corpus is divided in folders (section level 1), files (section level 2), and chunks within files. The parameter levels allows you to choose names for the node types of these section levels. In model II, there are 2 section levels in total. The corpus consists of a single file, and section nodes will be added for nodes at various levels, mainly outermost and elements and their siblings of other element types. The section heading for the second level is taken from elements in the neighbourhood, whose name is given in the parameter element , but only if they carry some attributes, which can be specified in the attributes parameter. Usage Command-line sh tf-fromtei tasks flags From Python python from tf.convert.tei import TEI T = TEI() T.task( tasks, flags) For a short overview the tasks and flags, see HELP . Tasks We have the following conversion tasks: 1. check : makes and inventory of all XML elements and attributes used. 1. convert : produces actual TF files by converting XML files. 1. load : loads the generated TF for the first time, by which the pre-computation step is triggered. During pre-computation some checks are performed. Once this has succeeded, we have a workable TF dataset. 1. app : creates or updates a corpus specific TF app with minimal sensible settings, plus basic documentation. 1. apptoken : updates a corpus specific TF app from a character-based dataset to a token-based dataset. 1. browse : starts the TF browser on the newly created dataset. Tasks can be run by passing any choice of task keywords to the TEI.task() method. Note on versions The TEI source files come in versions, indicated with a data. The converter picks the most recent one, unless you specify an other one: python tf-from-tei tei=-2 previous version tf-from-tei tei=0 first version tf-from-tei tei=3 third version tf-from-tei tei=2019-12-23 explicit version The resulting TF data is independently versioned, like 1.2.3 or 1.2.3pre . When the converter runs, by default it overwrites the most recent version, unless you specify another one. It looks at the latest version and then bumps a part of the version number. python tf-fromtei tf=3 minor version, 1.2.3 becomes 1.2.4; 1.2.3pre becomes 1.2.4pre tf-fromtei tf=2 intermediate version, 1.2.3 becomes 1.3.0 tf-fromtei tf=1 major version, 1.2.3 becomes 2.0.0 tf-fromtei tf=1.8.3 explicit version Examples Exactly how you can call the methods of this module is demonstrated in the small corpus of 14 letter by the Dutch artist Piet Mondriaan. [Mondriaan](https: nbviewer.org/github/annotation/mondriaan/blob/master/programs/convertExpress.ipynb)." }, { "ref":"tf.convert.tei.makeCssInfo", -"url":137, +"url":138, "doc":"Make the CSS info for the style sheet.", "func":1 }, { "ref":"tf.convert.tei.getRefs", -"url":137, +"url":138, "doc":"", "func":1 }, { "ref":"tf.convert.tei.TEI", -"url":137, +"url":138, "doc":"Converts TEI to TF. For documentation of the resulting encoding, read the [transcription template](https: github.com/annotation/text-fabric/blob/master/tf/convert/app/transcription.md). Below we describe how to control the conversion machinery. We adopt a fair bit of \"convention over configuration\" here, in order to lessen the burden for the user of specifying so many details. Based on current directory from where the script is called, it defines all the ingredients to carry out a tf.convert.walker conversion of the TEI input. This function is assumed to work in the context of a repository, i.e. a directory on your computer relative to which the input directory exists, and various output directories: tf , app , docs . Your current directory must be at ~/backend/org/repo/relative where ~ is your home directory; backend is an online back-end name, like github , gitlab , git.huc.knaw.nl ; org is an organization, person, or group in the back-end; repo is a repository in the org . relative is a directory path within the repo (0 or more components) This is only about the directory structure on your local computer; it is not required that you have online incarnations of your repository in that back-end. Even your local repository does not have to be a git repository. The only thing that matters is that the full path to your repo can be parsed as a sequence of home/backend/org/repo/relative . Relative to this directory the program expects and creates input / output directories. Input directories tei Location of the TEI-XML sources. If it does not exist, the program aborts with an error. Several levels of subdirectories are assumed: 1. the version of the source (this could be a date string). 1. volumes / collections of documents. The subdirectory __ignore__ is ignored. 1. the TEI documents themselves, conforming to the TEI schema or some customization of it. schema TEI or other XML schemas against which the sources can be validated. They should be XSD or RNG files. ! note \"Multiple XSD files\" When you started with a RNG file and used tf.tools.xmlschema to convert it to XSD, you may have got multiple XSD files. One of them has the same base name as the original RNG file, and you should pass that name. It will import the remaining XSD files, so do not throw them away. We use these files as custom TEI schemas, but to be sure, we still analyse the full TEI schema and use the schemas here as a set of overriding element definitions. Output directories report Directory to write the results of the check task to: an inventory of elements / attributes encountered, and possible validation errors. If the directory does not exist, it will be created. The default value is . (i.e. the current directory in which the script is invoked). tf The directory under which the TF output file (with extension .tf ) are placed. If it does not exist, it will be created. The TF files will be generated in a folder named by a version number, passed as tfVersion . app and docs Location of additional TF app configuration and documentation files. If they do not exist, they will be created with some sensible default settings and generated documentation. These settings can be overridden in the app/config_custom.yaml file. Also a default display.css file and a logo are added. Custom content for these files can be provided in files with _custom appended to their base name. docs Location of additional documentation. This can be generated or hand-written material, or a mixture of the two. Parameters tei: string, optional If empty, use the latest version under the tei directory with sources. Otherwise it should be a valid integer, and it is the index in the sorted list of versions there. 0 or latest : latest version; -1 , -2 , . : previous version, version before previous, .; 1 , 2 , .: first version, second version, everything else that is not a number is an explicit version If the value cannot be parsed as an integer, it is used as the exact version name. tf: string, optional If empty, the TF version used will be the latest one under the tf directory. If the parameter prelim was used in the initialization of the TEI object, only versions ending in pre will be taken into account. If it can be parsed as the integers 1, 2, or 3 it will bump the latest relevant TF version: 0 or latest : overwrite the latest version 1 will bump the major version 2 will bump the intermediate version 3 will bump the minor version everything else is an explicit version Otherwise, the value is taken as the exact version name. verbose: integer, optional -1 Produce no (-1), some (0) or many (1) progress and reporting messages" }, { "ref":"tf.convert.tei.TEI.readSchemas", -"url":137, +"url":138, "doc":"", "func":1 }, { "ref":"tf.convert.tei.TEI.getSwitches", -"url":137, +"url":138, "doc":"", "func":1 }, { "ref":"tf.convert.tei.TEI.getParser", -"url":137, +"url":138, "doc":"Configure the LXML parser. See [parser options](https: lxml.de/parsing.html parser-options). Returns - object A configured LXML parse object.", "func":1 }, { "ref":"tf.convert.tei.TEI.getXML", -"url":137, +"url":138, "doc":"Make an inventory of the TEI source files. Returns - tuple of tuple | string If section model I is in force: The outer tuple has sorted entries corresponding to folders under the TEI input directory. Each such entry consists of the folder name and an inner tuple that contains the file names in that folder, sorted. If section model II is in force: It is the name of the single XML file.", "func":1 }, { "ref":"tf.convert.tei.TEI.checkTask", -"url":137, +"url":138, "doc":"Implementation of the \"check\" task. It validates the TEI, but only if a schema file has been passed explicitly when constructing the TEI() object. Then it makes an inventory of all elements and attributes in the TEI files. If tags are used in multiple namespaces, it will be reported. ! caution \"Conflation of namespaces\" The TEI to TF conversion does construct node types and attributes without taking namespaces into account. However, the parsing process is namespace aware. The inventory lists all elements and attributes, and many attribute values. But is represents any digit with n , and some attributes that contain ids or keywords, are reduced to the value x . This information reduction helps to get a clear overview. It writes reports to the reportPath : errors.txt : validation errors elements.txt : element / attribute inventory.", "func":1 }, { "ref":"tf.convert.tei.TEI.getConverter", -"url":137, +"url":138, "doc":"Initializes a converter. Returns - object The tf.convert.walker.CV converter object, initialized.", "func":1 }, { "ref":"tf.convert.tei.TEI.getDirector", -"url":137, +"url":138, "doc":"Factory for the director function. The tf.convert.walker relies on a corpus dependent director function that walks through the source data and spits out actions that produces the TF dataset. The director function that walks through the TEI input must be conditioned by the properties defined in the TEI schema and the customised schema, if any, that describes the source. Also some special additions need to be programmed, such as an extra section level, word boundaries, etc. We collect all needed data, store it, and define a local director function that has access to this data. Returns - function The local director function that has been constructed.", "func":1 }, { "ref":"tf.convert.tei.TEI.convertTask", -"url":137, +"url":138, "doc":"Implementation of the \"convert\" task. It sets up the tf.convert.walker machinery and runs it. Returns - boolean Whether the conversion was successful.", "func":1 }, { "ref":"tf.convert.tei.TEI.loadTask", -"url":137, +"url":138, "doc":"Implementation of the \"load\" task. It loads the TF data that resides in the directory where the \"convert\" task deliver its results. During loading there are additional checks. If they succeed, we have evidence that we have a valid TF dataset. Also, during the first load intensive pre-computation of TF data takes place, the results of which will be cached in the invisible .tf directory there. That makes the TF data ready to be loaded fast, next time it is needed. Returns - boolean Whether the loading was successful.", "func":1 }, { "ref":"tf.convert.tei.TEI.appTask", -"url":137, +"url":138, "doc":"Implementation of the \"app\" task. It creates / updates a corpus-specific app plus specific documentation files. There should be a valid TF dataset in place, because some settings in the app derive from it. It will also read custom additions that are present in the target app directory. These files are: about_custom.md : A markdown file with specific colophon information about the dataset. In the generated file, this information will be put at the start. transcription_custom.md : A markdown file with specific encoding information about the dataset. In the generated file, this information will be put at the start. config_custom.yaml : A YAML file with configuration data that will be merged into the generated config.yaml. app_custom.py : A python file with named snippets of code to be inserted at corresponding places in the generated app.py display_custom.css : Additional CSS definitions that will be appended to the generated display.css . If the TF app for this resource needs custom code, this is the way to retain that code between automatic generation of files. Returns - boolean Whether the operation was successful.", "func":1 }, { "ref":"tf.convert.tei.TEI.browseTask", -"url":137, +"url":138, "doc":"Implementation of the \"browse\" task. It gives a shell command to start the TF browser on the newly created corpus. There should be a valid TF dataset and app configuration in place Returns - boolean Whether the operation was successful.", "func":1 }, { "ref":"tf.convert.tei.TEI.task", -"url":137, +"url":138, "doc":"Carry out any task, possibly modified by any flag. This is a higher level function that can execute a selection of tasks. The tasks will be executed in a fixed order: check , convert , load , app , apptoken , browse . But you can select which one(s) must be executed. If multiple tasks must be executed and one fails, the subsequent tasks will not be executed. Parameters check: boolean, optional False Whether to carry out the check task. convert: boolean, optional False Whether to carry out the convert task. load: boolean, optional False Whether to carry out the load task. app: boolean, optional False Whether to carry out the app task. apptoken: boolean, optional False Whether to carry out the apptoken task. browse: boolean, optional False Whether to carry out the browse task\" verbose: integer, optional -1 Produce no (-1), some (0) or many (1) progress and reporting messages validate: boolean, optional True Whether to perform XML validation during the check task Returns - boolean Whether all tasks have executed successfully.", "func":1 }, @@ -7240,351 +7293,351 @@ INDEX=[ }, { "ref":"tf.convert.tei.main", -"url":137, +"url":138, "doc":"", "func":1 }, { "ref":"tf.convert.watm", -"url":138, +"url":139, "doc":"Export to Web Annotation Text Model The situation This module can export a TF corpus to WATM (Web Annotation Text Model), which is the input format of the suite of systems developed by Team Text for serving text plus annotations over the web. If we can convert TF corpora to WATM, then we have an avenue to the [KNAW/HuC/DI/Team-Text](https: di.huc.knaw.nl/text-analysis-en.html) web publishing machinery. Given the fact that TF can already convert TEI and PageXML corpora, this completes a pipeline from source to publication. We have done this for the following corpora: [ mondriaan/letters ](https: github.com/annotation/mondriaan) [ translatin/corpus ](https: gitlab.huc.knaw.nl/translatin/corpus) [ suriano/letters ](https: gitlab.huc.knaw.nl/suriano/letters) All these corpora need distinct preprocessing steps before they are \"canalized\" into TF, see the illustration below. ![confluence]( /images/text-confluence.jpg) At the same time, [Maarten van Gompel](https: github.com/proycon) is also making pipelines to the Team-Text publishing street. He uses his [STAM](https: github.com/annotation/stam) software to build a [pipeline](https: github.com/knaw-huc/brieven-van-hooft-pipeline/blob/main/README.md) from a corpus of letters by P.C. Hooft in Folia format to text segments and web annotations. Excursion: STAM ![stam]( /images/stam.png) We now have two sytems, [STAM](https: github.com/annotation/stam) and Text-Fabric that can untangle text and markup. They are implemented very differently, and have a different flavour, but at the same time they share the preference of separating the textual data from all the data around the text. intent STAM : make it easier for tools and infrastructure to handle texts with annotations. TF : support researchers in analysing textual corpora. implementation STAM : Rust + [Python bindings](https: github.com/annotation/stam-python). TF : Pure Python. organization STAM : very neatly in a core with extensions. TF : core data functionality in tf.core modules, search functionality in tf.search modules, lots of other functions are included in the code with varying degrees of integration and orderliness! standards STAM : actively seeks to interoperate with existing standards, but internally it uses its own way of organizing the data. TF : also relies on a few simple conventions w.r.t. data organization and efficient serialization. These conventions are documented. It has several import and export functions, e.g. from TEI, PageXML, MQL, and to MQL, TSV. But it prefers to input and output data in minimalistic streams, without the often redundant strings that are attached to standard formats. model STAM : very generic w.r.t. annotations, annotations can target annotations and /or text segments. TF : [graph model](https: annotation.github.io/text-fabric/tf/about/datamodel.html) where nodes stand for textual positions and subsets of them, nodes and edges can have features, which are the raw material of annotations, but annotations are not a TF concept. query language STAM : [STAMQL](https: github.com/annotation/stam/tree/master/extensions/stam-query), evolving as an SQL-like language, with user-friendly primitives for annotations. TF : [TF-Query](https: annotation.github.io/text-fabric/tf/about/searchusage.html), a noise-free language for graph templates with reasonable performance. display STAM : In development, see stam view in [STAM tools](https: github.com/annotation/stam-tools). TF : Powerful functions to display corpus fragments with highlighting in tf.advanced . The challenge is to build generic display functions that detect the peculiarities of the corpora. API STAM : in Rust and Python. TF : Python. GUI STAM : not yet. TF : locally served web interface for browsing and searching the corpus. Both libraries can be used to manage corpus data in intricate ways for research and publishing purposes. How STAM and Text-Fabric will evolve in the dynamic landscape of corpora, analytical methods and AI, is something we cannot predict. For now, their different flavour and intent will define their appeal to the different categories of users. The general idea The idea of WATM is, like the idea of Text-Fabric, to untangle the text from its markup. Everything outside the text itself is coded in annotations. Annotations look a lot like TF features, but they are a bit more general. Annotations can also annotate annotations, not only pieces of text. We need this extra generality, because unlike TF, WATM does not have a concept of node. The only parallel are the slot nodes of TF, which corresponds to the tokens of the text in WATM. Every node in TF is linked to a set of slot nodes. As such it can be mapped to an annotation to the corresponding tokens. Features of such nodes can be mapped to annotations on annotations. TF also has edges. These can be mapped to WATM annotations whose targets are pairs: one for the thing the edge is from , and one for the thing the edge is to . These things are typical annotations that correspond to TF nodes, since TF edges are links between TF nodes. If the TF dataset itself is the result of converting an XML file (e.g TEI or PageXML), then there is a further correspondence between the XML and the TF: elements translate into nodes; element tags translate into node types; attributes translate into features; values of attributes translate into values of features. In our terminology below we assume that the TF data comes from XML files, but this is not essential. Whenever we talk about elements and tags , you may read nodes and node types if the TF dataset does not have an XML precursor. Likewise, for attributes you may read features . The specifics We generate tokens and annotations out of a TF dataset. Here is what we deliver and in what form. The files are either .tsv or .json , dependent on the configuration setting asTsv in the watm.yaml file in the project. a bunch of files text-0. ext , text-1. ext : containing a list of tokenlike segments; Each file corresponds with a section in the TF dataset; the level of the sections that correspond with these files is given in the watm.yaml config file, under the key textRepoLevel . It can have the values 1 (top level), 2 , and 3 (lower levels). a bunch of files anno-1. ext , anno-2. ext , .: all generated annotations; We pack at most 400,000 annotations in one file, that keeps their size below 50MB, so that they still can live in a git directory without large file support. The numbering in the anno- i . ext files it independent of the numbering in the text- i .json files! a pair of files anno2node.tsv and pos2node.tsv that map annotations resp. text positions to their corresponding TF nodes. Format of the text files A text-i.json is a JSON file with the following structure: { \"_ordered_segments\": [ \"token1 \", \"token2 \", . ] } These tokens may contain newlines and tabs. A text-i.tsv is a TSV file with the following structure: token token1 token2 . The first line is a header line with fixed content: token . Newlines and tabs must be escaped in TSV files. We do that by \\n and \\t . each token1 , token2 , . corresponds to one token; the item contains the text of the token plus the subsequent whitespace, if any; if the corpus is converted from TEI, we skip all material inside the TEI-header. Tokens Tokens correspond to the slot nodes in the TF dataset. Depending on the original format of the corpus we have the following specifics. TEI corpora The base type is t , the atomic token. Atomic tokens are tokens as they come from some NLP processing, except when tokens contain element boundaries. In those cases tokens are split in fragments between the element boundaries. It is guaranteed that a text segment that corresponds to a t does not contain element boundaries. The original, unsplit tokens are also present in the annotations, they have type token . Tokens have the attributes str and after , both may be empty. PageXML corpora The base type is token , it is available without NLP processing. Tokens have the attributes str and after , both may be empty. They may also have the attributes rstr and rafter . str is the logical string value of a token, after is empty or a space: what comes after the token before the next token. rstr is the raw string value of a token, when it deviates from the logical value , otherwise no value. rafter analogously. Example token | 1 | 2 | 3 | 4 | 5 - | - | - | - | - | - rstr | empty | efflagitan | \u00ac | do | empty str | improb\u00e8 | efflagitando | empty | empty | tandem Format of the annotation files The anno-1.json file is a JSON file with the following structure: { \"a000001\": [ \"element\", \"tei\", \"p\", \"0:10-60\" ], \"a000002\": [ \"element\", \"tei\", \"p\", \"0:60-70\" ], . } A anno-i.tsv is a TSV file with the following structure: annoid kind namespace body target a000001 element tei p 0:10-60 a000002 element tei p 0:60-70 . The first line is a header line with fixed content: de field names separeted by tabs. Newlines and tabs must be escaped in TSV files. We do that by \\n and \\t . It only has to be done for the body field. When reading these lines, it is best to collect the information in a dict, keyed by the annoid , whose values are lists of the remaining fields, just as in the JSON. You get a big dictionary, keyed by annotation ids and each value is the data of an annotation, divided in the following fields: kind : the kind of annotation: element : targets the text location where an element occurs, the body is the element name; pi : targets the text location where a processing instruction occurs, the body is the target of the pi ; attribute : targets an annotation (an element or pi ), the body has the shape name = value , the name and value of the attribute in question; edge : targets two node annotations, the body has the shape name or name = value , where name is the name of the edge and value is the label of the edge if the edge has a label; format : targets an individual token, the body is a formatting property for that token, all tokens in note elements get a format annotation with body note ; anno : targets an arbitrary annotation or text range, body has an arbitrary value; can be used for extra annotations, e.g. in the Mondriaan corpus to provide an URL to an artwork derived from an element. namespace : the namespace of the annotation; an indicator where the information comes from. Possible values: pagexml : annotation comes from the PageXML, possibly indirectly, e.g. h , w , x , y tei : annotation comes [literally](https: annotation.github.io/text-fabric/tf/convert/helpers.html tf.convert.helpers.CM_LIT) from the TEI guidelines or the PageXML specification, or is [processed](https: annotation.github.io/text-fabric/tf/convert/helpers.html tf.convert.helpers.CM_LITP) straightforwardly from it; tf : annotation is [composed](https: annotation.github.io/text-fabric/tf/convert/helpers.html tf.convert.helpers.CM_LITC) in a more intricate way from the original source or even [added](https: annotation.github.io/text-fabric/tf/convert/helpers.html tf.convert.helpers.CM_PROV) to it; nlp : annotation is generated as a result of [NLP processing](https: annotation.github.io/text-fabric/tf/convert/helpers.html tf.convert.helpers.CM_NLP); tt : annotation is derived from other material in the source for the benefit of the Team Text infrastructure. Defined in the watm.yaml file next to this program. Currently used for annotations that derive from project specific requirements. body : the body of an annotation (probably the kind and body fields together will make up the body of the resulting web annotation); target : a string specifying the target of the annotation, of the following kinds: single this is a target pointing to a single thing, either: fn:bbb : a single token fn:bbb-eee : a range of text segments in the _ordered_segments in the file text-fn.json ; the token at position eee is not included. It is guaranteed that bbb ttt where fff is a \"from\" target and ttt is a \"to\" target; both targets can vary independently between a range and an annotation id. N.B. It is allowed that fff and ttt target segments in distinct text-i.json files. In this case, it is not implied that the intermediate tokens are part of the target, because this target conveys the information that the body of the annotation is a property of the pair (fff, ttt) . If fff and ttt target segments, than they must both contain a file specifier, even if both target a segment in the same token file. Configuration In the file config.yaml (in the directory where the program runs) certain parameters can be set: textRepoLevel : the TF section level for which individual textRepo json files will be made. Default: 1 : the top level. Other possible values: 2 and 3 (lower levels). Only the special TF section levels can be specified, not arbitrary node types. Because we must guarantee that all tokens in the corpus fall under one of the nodes belonging to this section level. excludeElements : the names of elements for which no annotations will be generated. All node and edge features that target those elements will be filtered, so that there are no annotations that target non-existing annotations. asTsv : the text and anno files are written as tsv instead of json. The text files consist of one token per line. The newline token is written as . The anno files are written as one anno per line. The tab separated fields are anno id , kind , namespace , body , target . Any tab or newline in the body must be written as resp. . The tsv files will have exactly one header line. Caveat The WATM representation of the corpus is a faithful and complete representation of the TF dataset and hence of the TEI/PageXML source from which the TF dataset has been converted. Well, don't take this too literally, probably there are aspects where the different representations differ. I am aware of the following: If the TF has nodes whose slots are not an interval, the WATM will smooth that over: the target of those nodes will be the complete interval from its first slot to its last slot, including the gaps. The program will show warnings when this happens. Cases where this can happen are instances of text-critical elements in the TEI, where variant readings are given. When we construct sentences by means of NLP, we will exclude the non-chosen readings from the sentence, but these occupy slots between the start and the end of the sentence. Other cases occur where tokens, coming from the NLP, have been split because of intervening elements, which may leave an empty token. In such cases, the fragments of the original token are what ends up as tokens in the output, and they have the node type t , and not token . The TEI to TF conversion has lost the exact embedding of elements in the following case: Suppose element A contains the same words as element B. Then the TF data does not know whether A is a child of B or the other way round. This is repairable by adding parenthood edges between nodes when constructing the TF data. We should then also convert these TF edges to WATM annotations, for which we need structured targets: If n is the parent of m , we must make an annotation with body \"parent\" and target [n, m] . Something similar holds for the sibling relationship: if two nodes are adjacent in a TF dataset, we do not know whether they are siblings elements in the original XML. It is also possible to add sibling edges to the TF dataset. See tf.convert.tei under parentEdges and siblingEdges . The TF to WATM conversion forgets the types of feature values: it does not make a distinction between the integer 1 and the string \"1\" . This is repairable by creating annotations with structured bodies like {\"att\": value} instead of strings like att=value as we do now. In practice, the meaning of the features in TF are known, and hence the attributes in the WATM data, so this is not a blocking problem for now. The excludeElements setting will prevent some TF information from reaching the WATM." }, { "ref":"tf.convert.watm.rep", -"url":138, +"url":139, "doc":"Represent a boolean status for a message to the console. Parameters status: boolean Returns - string", "func":1 }, { "ref":"tf.convert.watm.WATM", -"url":138, +"url":139, "doc":"The export machinery is exposed as a class, wrapped around a TF dataset. Wrap the WATM exporter around a TF dataset. Given an already loaded TF dataset, we make an inventory of all data we need to perform an export to WATM. Parameters app: object A loaded TF dataset, as obtained by a call use( .) . See tf.app.use nsOrig: string A namespace corresponding to the format of the original, pre-Text-Fabric representation. For example tei for a TEI corpus, pagexml for a PageXML corpus. The namespace is not related to XML namespaces, it is merely a device to categorize the resulting annotations. skipMeta: boolean, optional False Only relevant for TEI corpora. If True, all material in the TEI Header will not be converted to tokens in the text. More precisely: all TF slots for which the feature is_meta has a true-ish value will be skipped. If there is no feature is_meta in the dataset, the setting of skipMeta will have no effect: nothing will be excluded. extra: dictionary, optional {} The data for extra annotations, which will be generated on the fly under the namespace anno . The keys are the names of features/attributes, the value for each key is a dictionary that maps nodes to values. silent: boolean, optional False Whether to suppress output to the console" }, { "ref":"tf.convert.watm.WATM.makeText", -"url":138, +"url":139, "doc":"Creates the text data. The text is a list of tokens and will be stored in member text in this object. Additionally, the mapping from slot numbers in the TF data to indices in this list is stored in member waFromTF .", "func":1 }, { "ref":"tf.convert.watm.WATM.mkAnno", -"url":138, +"url":139, "doc":"Make a single annotation and return its id. Parameters kind: string The kind of annotation. ns: string The namespace of the annotation. body: string The body of the annotation. target: string or tuple of strings The target of the annotation.", "func":1 }, { "ref":"tf.convert.watm.WATM.makeAnno", -"url":138, +"url":139, "doc":"Make all annotations. The annotations are stored in a big list, in member anno of this object. The mapping from slots to indices in the list of tokens is now extended with the mapping from nodes to corresponding node annotations. So member waFromTF is now a full mapping from all nodes in TF to tokens and/or annotations in WATM.", "func":1 }, { "ref":"tf.convert.watm.WATM.writeAll", -"url":138, +"url":139, "doc":"Write text and annotation data to disk. The data will be written as JSON files, or, is asTsv is in force, as TSV files. When the annotation data grows larger than a certain threshold, it will be divided over several files. The annotations are sorted by annotation id.", "func":1 }, { "ref":"tf.convert.watm.WATM.numEqual", -"url":138, +"url":139, "doc":"Compare two numbers and report the outcome. Used for testing the WATM conversion. Parameters nTF: integer The number as it is counted from the original TF dataset. nWA: integer The number as it is counted from the generated WATM dataset. Returns - boolean Whether the two values are equal.", "func":1 }, { "ref":"tf.convert.watm.WATM.strEqual", -"url":138, +"url":139, "doc":"Compare two strings and report the outcome. Used for testing the WATM conversion. Parameters nTF: string The string as encountered in the original TF dataset. nWA: string The string as encountered in the generated WATM dataset. Returns - boolean Whether the two values are equal.", "func":1 }, { "ref":"tf.convert.watm.WATM.testAll", -"url":138, +"url":139, "doc":"Test all aspects of the WATM conversion. For all kinds of information, such as nodes, edges, features, tokens, annotations, we check whether the parts that should correspond between the TF dataset and the WATM annotations do so indeed. We present some statistics, and highlight the mismatches. Parameters condensed: boolean, optional False If silent has been passed to the object, there is still some output for each corpus, namely whether all tests have passed. If condensed is True, we suppress this output. Returns - boolean Whether all things that must agree do indeed agree.", "func":1 }, { "ref":"tf.convert.watm.WATM.testSetup", -"url":138, +"url":139, "doc":"Prepare the tests. We read the WATM dataset and store the tokens in member testTokens and the annotations in the member testAnnotations , and the node mapping in the member nodeFromAid . We unpack targets if they contain structured information.", "func":1 }, { "ref":"tf.convert.watm.WATM.testText", -"url":138, +"url":139, "doc":"Test the text. We test the number of tokens and the equality of the resulting text: whether the TF and WATM datasets agree on it. Returns - boolean Whether all these tests succeed.", "func":1 }, { "ref":"tf.convert.watm.WATM.testElements", -"url":138, +"url":139, "doc":"Test the elements. We test the annotations representing elements/processing instructions and check whether they correspond 1-1 to the non-slot nodes in the TF dataset. Returns - boolean Whether all these tests succeed.", "func":1 }, { "ref":"tf.convert.watm.WATM.testAttributes", -"url":138, +"url":139, "doc":"Test the attributes. We test whether attributes and features correspond to each other. Some attributes in the original TEI are converted in a special way into TF features: this holds for the rend attribute. Basically, a value rend=\"italic\" is translated into feature is_italic=1 . In turn, these features have been translated into annotations of kind format . We test them separately. Returns - boolean Whether all these tests succeed.", "func":1 }, { "ref":"tf.convert.watm.WATM.testExtra", -"url":138, +"url":139, "doc":"Test the extra data for on-the-fly annotations. Annotations that have been generated out of the data stored in the extra parameter with which the object has been initialized, all got the kind anno . Now we check these annotations against the data that went into it. Returns - boolean Whether all these tests succeed.", "func":1 }, { "ref":"tf.convert.watm.WATM.testEdges", -"url":138, +"url":139, "doc":"Test the edges. Edges in TF are links between nodes, and they translate into annotations of kind edge which target a pair of annotations: the from annotation, and the to annotation. Here we check whether the TF edges are faithfully and completely parallelled by annotations. Returns - boolean Whether all these tests succeed.", "func":1 }, { "ref":"tf.convert.watm.WATMS", -"url":138, +"url":139, "doc":"Export corpora that are divided over multiple TF datasets. We set up and run WATM objects for each TF dataset, and generate results for them separately. We assume that all corpora have been generated by the same method and originate from the same original format. They must reside in the same repository, in adjacent directories under the tf top-level directory of the repo. Collect the parameters for the WATM machinery. We will initialize many WATM objects with mostly the same parameters. These are collected when we initialize this object. Parameters org: string The organization of all TF datasets. repo: string The repo of all TF datasets. backend: string The backend of all TF datasets. nsOrig: string The original namespace of all TF datasets. See tf.convert.watm.WATM . skipMeta: boolean, optional False See tf.convert.watm.WATM . extra: dictionary, optional {} See tf.convert.watm.WATM . silent: boolean, optional False Whether to operate in silence." }, { "ref":"tf.convert.watm.WATMS.produce", -"url":138, +"url":139, "doc":"Convert all relevant TF datasets. Parameters doc: string, optional None Subdirectory where one of the TF datasets resides. If passed, only this dataset will be converted. Otherwise all datasets will be converted.", "func":1 }, { "ref":"tf.convert.mql", -"url":139, +"url":140, "doc":" MQL You can interchange with [MQL data](https: emdros.org). TF can read and write MQL dumps. An MQL dump is a text file, like an SQL dump. It contains the instructions to create and fill a complete database. Correspondence TF and MQL After exporting a TF dataset to MQL, the resulting MQL database has the following properties with respect to the TF dataset it comes from: the TF slots correspond exactly with the MQL monads and have the same numbers; provided the monad numbers in the MQL dump are consecutive. In MQL this is not obligatory. Even if there gaps in the monads sequence, we will fill the holes during conversion, so the slots are tightly consecutive; the TF nodes correspond exactly with the MQL objects and have the same numbers Node features in MQL The values of TF features are of two types, int and str , and they translate to corresponding MQL types integer and string . The actual values do not undergo any transformation. That means that in MQL queries, you use quotes if the feature is a string feature. Only if the feature is a number feature, you may omit the quotes: [word sp='verb'] [verse chapter=1 and verse=1] Enumeration types It is attractive to use enumeration types for the values of a feature, where ever possible, because then you can query those features in MQL with IN and without quotes: [chapter book IN (Genesis, Exodus)] We will generate enumerations for eligible features. Integer values can already be queried like this, even if they are not part of an enumeration. So we restrict ourselves to node features with string values. We put the following extra restrictions: the number of distinct values is less than 1000 all values must be legal C names, in practice: starting with a letter, followed by letters, digits, or _ . The letters can only be plain ASCII letters, uppercase and lowercase. Features that comply with these restrictions will get an enumeration type. Currently, we provide no ways to configure this in more detail. Instead of creating separate enumeration types for individual features, we collect all enumerated values for all those features into one big enumeration type. The reason is that MQL considers equal values in different types as distinct values. If we had separate types, we could never compare values for different features. There is no place for edge values in MQL. There is only one concept of feature in MQL: object features, which are node features. But TF edges without values can be seen as node features: nodes are mapped onto sets of nodes to which the edges go. And that notion is supported by MQL: edge features are translated into MQL features of type LIST OF id_d , i.e. lists of object identifiers. ! caution \"Legal names in MQL\" MQL names for databases, object types and features must be valid C identifiers (yes, the computer language C). The requirements are for names are: start with a letter (ASCII, upper-case or lower-case) follow by any sequence of ASCII upper / lower-case letters or digits or underscores ( _ ) avoid being a reserved word in the C language So, we have to change names coming from TF if they are invalid in MQL. We do that by replacing illegal characters by _ , and, if the result does not start with a letter, we prepend an x . We do not check whether the name is a reserved C word. With these provisos: the given dbName correspond to the MQL database name the TF otypes correspond to the MQL objects the TF features correspond to the MQL features The MQL export is usually quite massive (500MB for the Hebrew Bible). It can be compressed greatly, especially by the program bzip2 . ! caution \"Existing database\" If you try to import an MQL file in Emdros, and there exists already a file or directory with the same name as the MQL database, your import will fail spectacularly. So do not do that. A good way to prevent clashes: export the MQL to outside your ~/text-fabric-data directory, e.g. to ~/Downloads ; before importing the MQL file, delete the previous copy; Delete existing copy: sh cd ~/Downloads rm dataset ; mql -b 3 < dataset.mql " }, { "ref":"tf.convert.mql.exportMQL", -"url":139, +"url":140, "doc":"Exports the complete TF dataset into single MQL database. Parameters app: object A tf.advanced.app.App object, which holds the corpus data that will be exported to MQL. mqlDb: string Name of the MQL database exportDir: string, optional None Directory where the MQL data will be saved. If None is given, it will end up in the same repo as the dataset, in a new top-level subdirectory called mql . The exported data will be written to file exportDir/mqlDb.mql . If exportDir starts with ~ , the ~ will be expanded to your home directory. Likewise, will be expanded to the parent of the current directory, and . to the current directory, both only at the start of exportDir . Returns - None See Also tf.convert.mql", "func":1 }, { "ref":"tf.convert.mql.importMQL", -"url":139, +"url":140, "doc":"Converts an MQL database dump to a TF dataset. Parameters mqlFile: string Path to the file which contains the MQL code. saveDir: string Path to where a new TF app will be created. silent: string How silent the newly created TF object must be. slotType: string You have to tell which object type in the MQL file acts as the slot type, because TF cannot see that on its own. otext: dict You can pass the information about sections and text formats as the parameter otext . This info will end up in the otext.tf feature. Pass it as a dictionary of keys and values, like so: otext = { 'fmt:text-trans-plain': '{glyphs}{trailer}', 'sectionFeatures': 'book,chapter,verse', } meta: dict Likewise, you can add a dictionary keyed by features that will added to the metadata of the corresponding features. You may also add metadata for the empty feature , this will be added to the metadata of all features. Handy to add provenance data there. Example: meta = { : dict( dataset='DLC', datasetName='Digital Language Corpus', author=\"That 's me\", ), \"sp\": dict( description: \"part-of-speech\", ), } ! note \"description\" TF will display all metadata information under the key description in a more prominent place than the other metadata. ! caution \" value type \" Do not pass the value types of the features here. Returns - object A tf.core.fabric.FabricCore object holding the conversion result of the MQL data into TF.", "func":1 }, { "ref":"tf.convert.mql.MQL", -"url":139, +"url":140, "doc":"" }, { "ref":"tf.convert.mql.MQL.write", -"url":139, +"url":140, "doc":"", "func":1 }, { "ref":"tf.convert.mql.makeuni", -"url":139, +"url":140, "doc":"Make proper UNICODE of a text that contains byte escape codes such as backslash xb6 ", "func":1 }, { "ref":"tf.convert.mql.uni", -"url":139, +"url":140, "doc":"", "func":1 }, { "ref":"tf.convert.mql.tfFromMql", -"url":139, +"url":140, "doc":"Generate TF from MQL Parameters tmObj: object A tf.core.timestamp.Timestamp object mqlFile, slotType, otype, meta: mixed See tf.convert.mql.importMQL ", "func":1 }, { "ref":"tf.convert.mql.parseMql", -"url":139, +"url":140, "doc":"", "func":1 }, { "ref":"tf.convert.mql.tfFromData", -"url":139, +"url":140, "doc":"", "func":1 }, { "ref":"tf.convert.helpers", -"url":140, +"url":141, "doc":"" }, { "ref":"tf.convert.helpers.SECTION_MODELS", -"url":140, +"url":141, "doc":"Models for sections. A section is a part of the corpus that is defined by a set of files, or by elements within a single TEI source file. A model" }, { "ref":"tf.convert.helpers.SECTION_MODEL_DEFAULT", -"url":140, +"url":141, "doc":"Default model for sections." }, { "ref":"tf.convert.helpers.CM_LIT", -"url":140, +"url":141, "doc":"The value is taken literally from a TEI attribute. Code tei , since there is a 1-1 correspondence with the TEI source." }, { "ref":"tf.convert.helpers.CM_LITP", -"url":140, +"url":141, "doc":"The value results from straightforward processing of material in the TEI. Code tei , since there is a direct correspondence with the TEI source. Straightforward means: by taking into account the semantics of XML. Examples: Generated white-space based on whether elements are pure or mixed; Edges between parent and child elements, or sibling elements." }, { "ref":"tf.convert.helpers.CM_LITC", -"url":140, +"url":141, "doc":"The value is results from more intricate processing of material in the TEI. More intricate means : we derive data that goes beyond pure XML syntax. Examples: The values of the rend attributes are translated into rend_ value features; Adding features is_meta (being inside the TEI-header) and is_note (being inside a note); The feature that gives the content of a (character) slot; Decomposing strings into words material and after-word material. Code tf , since this is for the benefit of the resulting TF dataset." }, { "ref":"tf.convert.helpers.CM_PROV", -"url":140, +"url":141, "doc":"The value is added by the conversion to TF w.r.t. the material in the TEI. Examples: Slots in empty elements, in order to anchor the element to the text sequence; Section levels, based on the folder and file that the TEI source is in; A section level within the TEI, defined from several elements and the way they are nested; Code tf , since this is for the benefit of the resulting TF dataset." }, { "ref":"tf.convert.helpers.CM_NLP", -"url":140, +"url":141, "doc":"The value is added by an NLP pipeline w.r.t. the material in the TEI. Code nlp , since this comes from third party software. Examples: The feature nsent which gives the sentence number in the corpus. Sentences are not encoded in the TEI, but detected by an NLP program such as Spacy." }, { "ref":"tf.convert.helpers.CONVERSION_METHODS", -"url":140, +"url":141, "doc":"Information about the conversion. When we produce TF features, we specify a bit of information in the feature metadata as how we arrived at the specific value. That information ends up in two keys: conversionMethod : with values any of: CM_LIT CM_LITP CM_LITC CM_PROV CM_NLP conversionCode : the value is derived from conversionMethod by looking it up in this table. These values can be used to qualify the name of the attribute for further processing. For example, if you have a feature n that originates literally from the TEI, you could pass it on as tei:n . But if you have a feature chapter that is provided by the conversion, you could pass it on as tf:chapter . This passing on is a matter of other software, that takes the generated TF as input and processes it further, e.g. as annotations. ! note \"More methods and codes\" The TEI conversion is customizable by providing your own methods to several hooks in the program. These hooks may generate extra features, which you can give metadata in the tei.yaml file next to the tei.py file where you define the custom functions. It is advised to state appropriate values for the conversionMethod and conversionCode fields of these features. Examples: A feature country is derived from specific elements in the TEI Header, and defined for nodes of type letter . This happens in order to support the software of Team Text that shows the text on a webpage. In such a case you could define conversionMethod=\"derived\" conversionCode=\"tt\"" }, { "ref":"tf.convert.helpers.getWhites", -"url":140, +"url":141, "doc":"", "func":1 }, { "ref":"tf.convert.helpers.tokenize", -"url":140, +"url":141, "doc":"", "func":1 }, { "ref":"tf.convert.helpers.repTokens", -"url":140, +"url":141, "doc":"", "func":1 }, { "ref":"tf.convert.helpers.checkModel", -"url":140, +"url":141, "doc":"", "func":1 }, { "ref":"tf.convert.helpers.matchModel", -"url":140, +"url":141, "doc":"", "func":1 }, { "ref":"tf.convert.helpers.setUp", -"url":140, +"url":141, "doc":"", "func":1 }, { "ref":"tf.convert.helpers.tweakTrans", -"url":140, +"url":141, "doc":"", "func":1 }, { "ref":"tf.convert.helpers.lookupSource", -"url":140, +"url":141, "doc":"Looks up information from the current XML stack. The current XML stack contains the ancestry of the current node, including the current node itself. It is a list of components, corresponding to the path from the root node to the current node. Each component is a tuple, consisting of the tag name and the attributes of an XML node. Against this stack a sequence of instructions, given in specs , is executed. These instructions collect information from the stack, under certain conditions, and put that information into a feature, as value for a certain node. Here is an example of a single instruction: Parameters cv: object The converter object, needed to issue actions. cur: dict Various pieces of data collected during walking and relevant for some next steps in the walk. specs: tuple A sequence of instructions what to look for. Each instruction has the following parts: pathSpec nodeType featureName The effect is: The pathSpec is compared to the current XML stack. If it matches the current node, the text content of the current node or one of its attributes will be collected and put in a feature with name featureName , for the current TF node of type nodeType . The pathSpec is a list of components. The first component should match the top of the XML stack, the second component the element that is below the top, etc. Each component is a tuple of a tag name; a dictionary of attribute values; The first component may have a tag name that has @ plus an attribute name appended to it. That means that the information will be extracted from that attribute, not from the content of the element.", "func":1 }, { "ref":"tf.convert.pagexml", -"url":141, +"url":142, "doc":"" }, { "ref":"tf.convert.pagexml.setUp", -"url":141, +"url":142, "doc":"", "func":1 }, { "ref":"tf.convert.pagexml.diverge", -"url":141, +"url":142, "doc":"", "func":1 }, { "ref":"tf.convert.pagexml.tokenLogic", -"url":141, +"url":142, "doc":"", "func":1 }, { "ref":"tf.convert.pagexml.emptySlot", -"url":141, +"url":142, "doc":"", "func":1 }, { "ref":"tf.convert.pagexml.linebreakSlot", -"url":141, +"url":142, "doc":"", "func":1 }, { "ref":"tf.convert.pagexml.walkObject", -"url":141, +"url":142, "doc":"Internal function to deal with a single element. Will be called recursively. Parameters cv: object The converter object, needed to issue actions. cur: dict Various pieces of data collected during walking and relevant for some next steps in the walk. The subdictionary cur[\"node\"] is used to store the currently generated nodes by node type. bj xode: object An PageXML object.", "func":1 }, { "ref":"tf.convert.pagexml.PageXML", -"url":141, +"url":142, "doc":"Converts PageXML to TF. Below we describe how to control the conversion machinery. Based on current directory from where the script is called, it defines all the ingredients to carry out a tf.convert.walker conversion of the PageXML input. This function is assumed to work in the context of a repository, i.e. a directory on your computer relative to which the input directory exists, and various output directories: tf , app , docs . The repoDir must be at ~/backend/org/repo/relative where ~ is your home directory; backend is an online back-end name, like github , gitlab , git.huc.knaw.nl ; org is an organization, person, or group in the back-end; repo is a repository in the org . relative is a directory path within the repo (0 or more components) This is only about the directory structure on your local computer; it is not required that you have online incarnations of your repository in that back-end. Even your local repository does not have to be a git repository. The only thing that matters is that the full path to your repo can be parsed as a sequence of home/backend/org/repo/relative . Relative to this directory the program expects and creates input / output directories. source/version directory The source directory is specified by sourceDir , and within it are version directories. Document directories These are the top-level directories within the version directories. They correspond to individual documents. Documents typically contain a set of pages. Input directories per document image : contain the scan images meta : contain metadata files page : contain the PageXML files The files in image and page have names that consist of a 4-digit number with leading zeros, and any two files with the same name in image and page represent the same document. Output directories tf The directory under which the TF output file (with extension .tf ) are placed. If it does not exist, it will be created. The TF files will be generated in a folder named by a version number, passed as tfVersion . app and docs Location of additional TF app configuration and documentation files. If they do not exist, they will be created with some sensible default settings and generated documentation. These settings can be overridden in the app/config_custom.yaml file. Also a default display.css file and a logo are added. docs Location of additional documentation. This can be generated or hand-written material, or a mixture of the two. Parameters sourceDir: string The location of the source directory repoDir: string The location of the target repo where the TF data is generated. source: string, optional If empty, use the latest version under the source directory with sources. Otherwise it should be a valid integer, and it is the index in the sorted list of versions there. 0 or latest : latest version; -1 , -2 , . : previous version, version before previous, .; 1 , 2 , .: first version, second version, everything else that is not a number is an explicit version If the value cannot be parsed as an integer, it is used as the exact version name. tf: string, optional If empty, the TF version used will be the latest one under the tf directory. If it can be parsed as the integers 1, 2, or 3 it will bump the latest relevant TF version: 0 or latest : overwrite the latest version 1 will bump the major version 2 will bump the intermediate version 3 will bump the minor version everything else is an explicit version Otherwise, the value is taken as the exact version name. verbose: integer, optional -1 Produce no (-1), some (0) or many (1) progress and reporting messages" }, { "ref":"tf.convert.pagexml.PageXML.getDirector", -"url":141, +"url":142, "doc":"Factory for the director function. The tf.convert.walker relies on a corpus dependent director function that walks through the source data and spits out actions that produces the TF dataset. Also some special additions need to be programmed, such as an extra section level, word boundaries, etc. We collect all needed data, store it, and define a local director function that has access to this data. Returns - function The local director function that has been constructed.", "func":1 }, { "ref":"tf.convert.pagexml.PageXML.getConverter", -"url":141, +"url":142, "doc":"Initializes a converter. Returns - object The tf.convert.walker.CV converter object, initialized.", "func":1 }, { "ref":"tf.convert.pagexml.PageXML.convertTask", -"url":141, +"url":142, "doc":"Implementation of the \"convert\" task. It sets up the tf.convert.walker machinery and runs it. Returns - boolean Whether the conversion was successful.", "func":1 }, { "ref":"tf.convert.pagexml.PageXML.loadTask", -"url":141, +"url":142, "doc":"Implementation of the \"load\" task. It loads the TF data that resides in the directory where the \"convert\" task deliver its results. During loading there are additional checks. If they succeed, we have evidence that we have a valid TF dataset. Also, during the first load intensive pre-computation of TF data takes place, the results of which will be cached in the invisible .tf directory there. That makes the TF data ready to be loaded fast, next time it is needed. Returns - boolean Whether the loading was successful.", "func":1 }, { "ref":"tf.convert.pagexml.PageXML.appTask", -"url":141, +"url":142, "doc":"Implementation of the \"app\" task. It creates / updates a corpus-specific app plus specific documentation files. There should be a valid TF dataset in place, because some settings in the app derive from it. It will also read custom additions that are present in the target app directory. These files are: about_custom.md : A markdown file with specific colophon information about the dataset. In the generated file, this information will be put at the start. transcription_custom.md : A markdown file with specific encoding information about the dataset. In the generated file, this information will be put at the start. config_custom.yaml : A YAML file with configuration data that will be merged into the generated config.yaml. app_custom.py : A python file with named snippets of code to be inserted at corresponding places in the generated app.py display_custom.css : Additional CSS definitions that will be appended to the generated display.css . If the TF app for this resource needs custom code, this is the way to retain that code between automatic generation of files. Returns - boolean Whether the operation was successful.", "func":1 }, { "ref":"tf.convert.pagexml.PageXML.browseTask", -"url":141, +"url":142, "doc":"Implementation of the \"browse\" task. It gives a shell command to start the TF browser on the newly created corpus. There should be a valid TF dataset and app configuration in place Returns - boolean Whether the operation was successful.", "func":1 }, { "ref":"tf.convert.pagexml.PageXML.task", -"url":141, +"url":142, "doc":"Carry out any task, possibly modified by any flag. This is a higher level function that can execute a selection of tasks. The tasks will be executed in a fixed order: convert , load , app , browse . But you can select which one(s) must be executed. If multiple tasks must be executed and one fails, the subsequent tasks will not be executed. Parameters convert: boolean, optional False Whether to carry out the convert task. load: boolean, optional False Whether to carry out the load task. app: boolean, optional False Whether to carry out the app task. browse: boolean, optional False Whether to carry out the browse task\" verbose: integer, optional -1 Produce no (-1), some (0) or many (1) progress and reporting messages Returns - boolean Whether all tasks have executed successfully.", "func":1 }, @@ -7602,346 +7655,346 @@ INDEX=[ }, { "ref":"tf.convert.pagexml.main", -"url":141, +"url":142, "doc":"", "func":1 }, { "ref":"tf.writing", -"url":142, +"url":143, "doc":" Writing systems support Transliteration tables for various writing systems. One can pass a language code to TF. When TF displays text (e.g. in tf.advanced.display ) the language code may trigger the writing direction and the choice of font. Here are the ones that have an effect: iso | language - | - akk | akkadian hbo | hebrew syc | syriac uga | ugaritic ara | arabic grc | greek cld | neo aramaic Default: : string " }, { "ref":"tf.writing.transcription", -"url":143, +"url":144, "doc":" Transcription TF has support for several writing systems, by means of transcription tables and fonts that will be invoked when displaying the main text. It also calls functions to use these tables for converting Hebrew and Syriac text material to transliterated representations and back. There is also a phonetic transcription for Hebrew, designed in [phono.ipynb](https: nbviewer.jupyter.org/github/etcbc/phono/blob/master/programs/phono.ipynb) Character tables and fonts hbo Hebrew tf.writing.hebrew : full list of characters covered by the ETCBC and phonetic transcriptions Font Ezra SIL . syc Syriac tf.writing.syriac : full list of characters covered by the ETCBC transcriptions Font Estrangelo Edessa . ara Arabic tf.writing.arabic : full list of characters covered by the transcription used for the Quran Font AmiriQuran . grc Greek Font Gentium . akk Akkadian Font Santakku . uga Ugaritic Font Santakku . cld Neo Aramaic Font CharisSIL-R ." }, { "ref":"tf.writing.transcription.Transcription", -"url":143, +"url":144, "doc":"Conversion between UNICODE and various transcriptions. Usage notes: Invoke the transcription functionality as follows: from tf.writing.transcription import Transcription Some of the attributes and methods below are class attributes, others are instance attributes. A class attribute aaa can be retrieved by saying python Transcription.aaa To retrieve an instance attribute, you need an instance first, like python tr = Transcription() tr.aaa " }, { "ref":"tf.writing.transcription.Transcription.decomp", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.hebrew_mapping", -"url":143, +"url":144, "doc":"Maps all ETCBC transliteration character combinations for Hebrew to UNICODE. Example: sof-pasuq: python Transcription.hebrew_mapping['00'] Output: \u05c3 " }, { "ref":"tf.writing.transcription.Transcription.hebrew_cons", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.trans_final_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.trans_hebrew_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.swap_accent_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.remove_accent_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.remove_point_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.remove_psn_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.remove_psq_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.shin_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.ph_simple_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.noorigspace", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.ugaritic_mappingi", -"url":143, +"url":144, "doc":"Maps Ugaritic unicode characters to their conventional transliteration characters. Unidentified characters: x (damaged ?) / (alternative ?) only twice, in atyp\u02e4tba/r and xxxxl/d\u2026 , (comma) only once in a very long word starting at 551 . km,ad . (brackets marking uncertainty ?) \u2026 (unreadable ?) 00a0 (non-breaking space)" }, { "ref":"tf.writing.transcription.Transcription.ugaritic_mapping", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.syriac_mapping_simple", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.syriac_mapping_pil", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.syriac_mapping", -"url":143, +"url":144, "doc":"Maps all ETCBC transliteration character combinations for Syriac to UNICODE. Example: semkath-final: python Transcription.syriac_mapping['s'] Output: \u0724 " }, { "ref":"tf.writing.transcription.Transcription.trans_syriac_pat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.arabic_mapping", -"url":143, +"url":144, "doc":"Maps an Arabic transliteration character to UNICODE. This is the mapping used in the Quran representation on tanzil.net. Example: beh python Transcription.syriac_mapping['b'] Output: \u0628 Maps an Arabic letter in UNICODE to its transliteration Example: beh transliteration python Transcription.syriac_mapping['\u0628'] Output: b " }, { "ref":"tf.writing.transcription.Transcription.arabic_mappingi", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.arabicTrans", -"url":143, +"url":144, "doc":"More Arabic transcriptions: column 1: custom [Quran-tanzil](http: tanzil.net/ 1:1), slightly extended column 2: ascii resp. latin plus diacritics also known as betacode. We use a list compiled by [Peter Verkinderen](https: pverkind.github.io/betacodeTranscriber/js/betacode.js) column 4: standard (Library of Congress) (to-be filled). We use the [arabic romanization list of 2012](https: www.loc.gov/catdir/cpso/romanization/arabic.pdf) We refrain of from applying rules that cannot be computed without lexical/grammatical/dialectical knowledge of the arabic language." }, { "ref":"tf.writing.transcription.Transcription.arabicTransQuran", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.arabicTransAscii", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.arabicTransLatin", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.arabicTransStandard", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.ara", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.qur", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.asc", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.lat", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.std", -"url":143, +"url":144, "doc":"" }, { "ref":"tf.writing.transcription.Transcription.quranFromArabic", -"url":143, +"url":144, "doc":"", "func":1 }, { "ref":"tf.writing.transcription.Transcription.asciiFromArabic", -"url":143, +"url":144, "doc":"", "func":1 }, { "ref":"tf.writing.transcription.Transcription.latinFromArabic", -"url":143, +"url":144, "doc":"", "func":1 }, { "ref":"tf.writing.transcription.Transcription.standardFromArabic", -"url":143, +"url":144, "doc":"", "func":1 }, { "ref":"tf.writing.transcription.Transcription.sycSplitPunc", -"url":143, +"url":144, "doc":"", "func":1 }, { "ref":"tf.writing.transcription.Transcription.suffix_and_finales", -"url":143, +"url":144, "doc":"Given an ETCBC transliteration, split it into the word material and the interword material that follows it (space, punctuation). Replace the last consonant of the word material by its final form, if applicable. Output a tuple with the modified word material and the interword material. Example: python Transcription.suffix_and_finales('71T_H@>@95REY00') Output: ('71T_H@>@95REy', '00 ') Note that the Y has been replaced by y .", "func":1 }, { "ref":"tf.writing.transcription.Transcription.suppress_space", -"url":143, +"url":144, "doc":"Given an ETCBC transliteration of a word, match the end of the word for punctuation and spacing characters ( sof pasuq , paseq , nun hafukha , setumah , petuhah , space, no-space) Example: python Transcription.suppress_space('B.:&') Transcription.suppress_space('B.@R@74>') Transcription.suppress_space('71T_H@>@95REY00') Output: None ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_etcbc_v", -"url":143, +"url":144, "doc":"Given an ETCBC transliteration of a fully pointed word, strip all the non-vowel pointing (i.e. the accents). Example: python Transcription.to_etcbc_v('HAC.@MA73JIm') Output: HAC.@MAJIm ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_etcbc_c", -"url":143, +"url":144, "doc":"Given an ETCBC transliteration of a fully pointed word, strip everything except the consonants. Punctuation will also be stripped. Example: python Transcription.to_etcbc_c('HAC.@MA73JIm') Output: H MJM Note that the pointed shin ( C ) is replaced by an unpointed one ( ).", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_hebrew", -"url":143, +"url":144, "doc":"Given a transliteration of a fully pointed word, produce the word in UNICODE Hebrew. Care will be taken that vowel pointing will be added to consonants before accent pointing. Example: python Transcription.to_hebrew('HAC.@MA73JIm') Output: \u05d4\u05b7\ufb2a\u05bc\u05b8\u05de\u05b7\u0596\u05d9\u05b4\u05dd ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_hebrew_v", -"url":143, +"url":144, "doc":"Given a transliteration of a fully pointed word, produce the word in UNICODE Hebrew, but without the accents. Example: python Transcription.to_hebrew_v('HAC.@MA73JIm') Output: \u05d4\u05b7\ufb2a\u05bc\u05b8\u05de\u05b7\u05d9\u05b4\u05dd ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_hebrew_c", -"url":143, +"url":144, "doc":"Given a transliteration of a fully pointed word, produce the word in UNICODE Hebrew, but without the pointing. Example: python Transcription.to_hebrew_c('HAC.@MA73JIm') Output: \u05d4\u05e9\u05de\u05d9\u05de Note that final consonant forms are not being used.", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_hebrew_x", -"url":143, +"url":144, "doc":"Given a transliteration of a fully pointed word, produce the word in UNICODE Hebrew, but without the pointing. Vowel pointing and accent pointing will be applied in the order given by the input word. Example: python Transcription.to_hebrew_x('HAC.@MA73JIm') Output: \u05d4\u05b7\ufb2a\u05bc\u05b8\u05de\u05b7\u0596\u05d9\u05b4\u05dd ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.ph_simplify", -"url":143, +"url":144, "doc":"Given a phonological transliteration of a fully pointed word, produce a more coarse phonological transliteration. Example: python Transcription.ph_simplify('\u0294\u1d49l\u014dh\u02c8\u00eem') Transcription.ph_simplify('m\u0101q\u02c8\u00f4m') Transcription.ph_simplify('kol') Output: \u0294l\u014dh\u00eem m\u00e5q\u00f4m k\u00e5l Note that the simplified version transliterates the qamets gadol and qatan to the same character.", "func":1 }, { "ref":"tf.writing.transcription.Transcription.from_hebrew", -"url":143, +"url":144, "doc":"Given a fully pointed word in UNICODE Hebrew, produce the word in ETCBC transliteration. Example: python tr.from_hebrew('\u05d4\u05b8\u05d0\u05b8\u05bd\u05e8\u05b6\u05e5\u05c3') Output: H@>@95REy00 ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_syriac", -"url":143, +"url":144, "doc":"Given a word in ETCBC transliteration, produce the word in UNICODE Syriac. Example: python tr.to_syriac('MKSJN') Output: \u0721\u071f\u0723\u071d\u0722 ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.from_syriac", -"url":143, +"url":144, "doc":"Given a word in UNICODE Syriac, produce the word in ETCBC transliteration. Example: python tr.from_syriac('\u0721\u071f\u0723\u071d\u0722') Output: MKSJN ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.can_to_syriac", -"url":143, +"url":144, "doc":"", "func":1 }, { "ref":"tf.writing.transcription.Transcription.can_from_syriac", -"url":143, +"url":144, "doc":"", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_ugaritic", -"url":143, +"url":144, "doc":"Given a word in transliteration, produce the word in UNICODE Ugaritic. k\u1e6fbx \ud800\udf8b\ud800\udf98\ud800\udf81x Example: python Transcription.to_ugaritic('k\u1e6fbx') Output: \ud800\udf8b\ud800\udf98\ud800\udf81x ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.from_ugaritic", -"url":143, +"url":144, "doc":"Given a word in UNICODE Ugaritic, produce the word in transliteration. Example: python Transcription.from_ugaritic('\ud800\udf8b\ud800\udf98\ud800\udf81x') Output: k\u1e6fbx ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.to_arabic", -"url":143, +"url":144, "doc":"Given a word in transliteration, produce the word in UNICODE Arabic. Example: python Transcription.to_arabic('bisomi') Output: \u0628\u0650\u0633\u0652\u0645\u0650 ", "func":1 }, { "ref":"tf.writing.transcription.Transcription.from_arabic", -"url":143, +"url":144, "doc":"Given a word in UNICODE Arabic, produce the word in transliteration. Example: python Transcription.from_arabic('\u0628\u0650\u0633\u0652\u0645\u0650') Output: bisomi ", "func":1 }, { "ref":"tf.writing.greek", -"url":144, +"url":145, "doc":" Greek characters [Greek script in UNICODE](https: en.wikipedia.org/wiki/Greek_alphabet Greek_in_Unicode)" }, { "ref":"tf.writing.arabic", -"url":145, +"url":146, "doc":" Arabic characters @font-face { font-family: AmiriQuran; src: url('https: github.com/annotation/text-fabric/blob/master/tf/browser/static/fonts/AmiriQuran.woff2') format('woff2'), url('https: github.com/annotation/text-fabric/blob/master/tf/browser/static/fonts/AmiriQuran.woff') format('woff'), url('https: github.com/annotation/text-fabric/blob/master/tf/browser/static/fonts/AmiriQuran.ttf') format('truetype'); } body { font-family: sans-serif; } table.chars { border-collapse: collapse; } table.chars thead tr { color: ffffff; background-color: 444444; } table.chars tbody td { border: 2px solid bbbbbb; padding: 0.1em 0.5em; } h1.chars { margin-top: 1em; } .t { font-family: monospace; font-size: large; color: 0000ff; } .g { font-family: \"AmiriQuran\", sans-serif; font-size: x-large; } .p { font-family: monospace; font-size: large; color: 666600; } .r { font-family: sans-serif; font-size: small; color: 555555; } .n { font-family: sans-serif; color: 990000; font-size: small; } .u { font-family: monospace; color: 990000; } Letters quran / tanzil ASCII latin standard glyph remarks name UNICODE ' ' \u02be ' \u0621 ARABIC LETTER HAMZA 0621 A & x005f;a \u0101 \u0101 \u0627 ARABIC LETTER ALEF 0627 b b b b \u0628 ARABIC LETTER BEH 0628 p =t \u0167 t \u0629 ARABIC LETTER TEH MARBUTA 0629 t t t t \u062a ARABIC LETTER TEH 062a v & x005f;t \u1e6f th \u062b ARABIC LETTER THEH 062b j j \u01e7 j \u062c ARABIC LETTER JEEM 062c H & x002a;h \u1e25 \u1e25 \u062d ARABIC LETTER HAH 062d x & x005f;h \u1e2b kh \u062e ARABIC LETTER KHAH 062e d d d d \u062f ARABIC LETTER DAL 062f & x002a; & x005f;d \u1e0f dh \u0630 ARABIC LETTER THAL 0630 r r r r \u0631 ARABIC LETTER REH 0631 z z z z \u0632 ARABIC LETTER ZAIN 0632 s s s s \u0633 ARABIC LETTER SEEN 0633 $ ^s \u0161 sh \u0634 ARABIC LETTER SHEEN 0634 S & x002a;s \u1e63 \u1e63 \u0635 ARABIC LETTER SAD 0635 D & x002a;d \u1e0d \u1e0d \u0636 ARABIC LETTER DAD 0636 T & x002a;t \u1e6d \u1e6d \u0637 ARABIC LETTER TAH 0637 Z & x002a;z \u1e93 \u1e93 \u0638 ARABIC LETTER ZAH 0638 E \u02bf \u0639 ARABIC LETTER AIN 0639 g & x002a;g \u0121 gh \u063a ARABIC LETTER GHAIN 063a f f f f \u0641 ARABIC LETTER FEH 0641 q & x002a;k \u1e33 q \u0642 ARABIC LETTER QAF 0642 k k k k \u0643 ARABIC LETTER KAF 0643 l l l l \u0644 ARABIC LETTER LAM 0644 m m m m \u0645 ARABIC LETTER MEEM 0645 n n n n \u0646 ARABIC LETTER NOON 0646 h h h h \u0647 ARABIC LETTER HEH 0647 w w w w \u0648 ARABIC LETTER WAW 0648 Y /a \u00e1 \u0101 \u0649 ARABIC LETTER ALEF MAKSURA 0649 y y y y \u064a ARABIC LETTER YEH 064a { a a a \u0671 ARABIC LETTER ALEF WASLA 0671 G g g g \u06af ARABIC LETTER GAF 06af J y Y y \u06af ARABIC LETTER FARSI YEH 06cc Numerals quran / tanzil ASCII latin standard glyph remarks name UNICODE 0 0 0 0 & x0660; ARABIC INDIC DIGIT ZERO 0660 1 1 1 1 & x0661; ARABIC INDIC DIGIT ONE 0661 2 2 2 2 & x0662; ARABIC INDIC DIGIT TWO 0662 3 3 3 3 & x0663; ARABIC INDIC DIGIT THREE 0663 4 4 4 4 & x0664; ARABIC INDIC DIGIT FOUR 0664 5 5 5 5 & x0665; ARABIC INDIC DIGIT FIVE 0665 6 6 6 6 & x0666; ARABIC INDIC DIGIT SIX 0666 7 7 7 7 & x0667; ARABIC INDIC DIGIT SEVEN 0667 8 8 8 8 & x0668; ARABIC INDIC DIGIT EIGHT 0668 9 9 9 9 & x0669; ARABIC INDIC DIGIT NINE 0669 Stops quran / tanzil ASCII latin standard glyph remarks name UNICODE - . . . \u06ea ARABIC EMPTY CENTRE LOW STOP 06ea + . . . \u06eb ARABIC EMPTY CENTRE HIGH STOP 06eb % . . . \u06ec ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE 06ec Letters (modified) quran / tanzil ASCII latin standard glyph remarks name UNICODE & x0060; ~a \u00e3 \u0670 ARABIC LETTER SUPERSCRIPT ALEF 0670 \u00bb & x005f;a \u0101 \u0101 \u0670\u0622 ARABIC LETTER ALEF WITH MADDA ABOVE 0622 : s S s \u06dc ARABIC SMALL HIGH SEEN 06dc [ m M M \u06e2 ARABIC SMALL HIGH MEEM ISOLATED FORM 06e2 ; s S S \u06e3 ARABIC SMALL LOW SEEN 06e3 , w W W \u06e5 ARABIC SMALL WAW 06e5 . y Y Y \u06e6 ARABIC SMALL YEH 06e6 M j J j \u06da ARABIC SMALL HIGH JEEM 06da ! n N N \u06e8 ARABIC SMALL HIGH NOON 06e8 ] m M M \u06ed ARABIC SMALL LOW MEEM 06ed Letters (combined) quran / tanzil ASCII latin standard glyph remarks name UNICODE > & x005f;a \u0101 \u0101 \u0623 ARABIC LETTER ALEF WITH HAMZA ABOVE 0623 & ' \u02be ' \u0624 ARABIC LETTER WAW WITH HAMZA ABOVE 0624 /td> & x005f;a \u0101 \u0101 \u0625 ARABIC LETTER ALEF WITH HAMZA BELOW 0625 } ' \u02be y \u0626 ARABIC LETTER YEH WITH HAMZA ABOVE 0626 SlY & x002a;sl/a \u1e63l\u00e1 \u1e63la \u06d6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA 06d6 Lengthening quran / tanzil ASCII latin standard glyph remarks name UNICODE & x005f; \u0640 ARABIC TATWEEL 0640 Vowel diacritics quran / tanzil ASCII latin standard glyph remarks name UNICODE F a& x002a;n a\u207f an \u064b ARABIC FATHATAN 064b N u& x002a;n u\u207f un \u064c ARABIC DAMMATAN 064c K i& x002a;n i\u207f in \u064d ARABIC KASRATAN 064d a a a a \u064e ARABIC FATHA 064e u u u u \u064f ARABIC DAMMA 064f i i i i \u0650 ARABIC KASRA 0650 Non-vocalic diacritics quran / tanzil ASCII latin standard glyph remarks name UNICODE ~ u u \u016bw \u0651 ARABIC SHADDA 0651 o a a a \u0652 ARABIC SUKUN 0652 ^ & x005f;a \u0101 \u0101 \u0653 ARABIC MADDAH ABOVE 0653 ' \u02be \u0101 \u0654 ARABIC HAMZA ABOVE 0654 = ' \u02be \u0101 \u0655 ARABIC HAMZA BELOW 0655 @ 0 0 0 \u06df ARABIC SMALL HIGH ROUNDED ZERO 06df \" 0 0 0 \u06e0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO 06e0 Separators quran / tanzil ASCII latin standard glyph remarks name UNICODE SPACE 0020 See also [Arabic script in UNICODE](https: en.wikipedia.org/wiki/Arabic_script_in_Unicode) [Arabic diacritics](https: en.wikipedia.org/wiki/Arabic_diacritics harakat) [Beta code](https: pverkind.github.io/betacodeTranscriber/js/betacode.js) [Library of Congress](https: www.loc.gov/catdir/cpso/romanization/arabic.pdf)" }, { "ref":"tf.writing.hebrew", -"url":146, +"url":147, "doc":" Hebrew characters @font-face { font-family: \"Ezra SIL\"; src: url('https: github.com/annotation/text-fabric/blob/master/tf/browser/static/fonts/SILEOT.ttf?raw=true'); src: url('https: github.com/annotation/text-fabric/blob/master/tf/browser/static/fonts/SILEOT.woff?raw=true') format('woff'); } body { font-family: sans-serif; } table.chars { border-collapse: collapse; } table.chars thead tr { color: ffffff; background-color: 444444; } table.chars tbody td { border: 2px solid bbbbbb; padding: 0.1em 0.5em; } h1.chars { margin-top: 1em; } .t { font-family: monospace; font-size: large; color: 0000ff; } .g { font-family: \"Ezra SIL\", sans-serif; font-size: x-large; } .p { font-family: monospace; font-size: large; color: 666600; } .r { font-family: sans-serif; font-size: small; color: 555555; } .n { font-family: sans-serif; color: 990000; font-size: small; } .u { font-family: monospace; color: 990000; } ! note \"Disclaimer\" This just a look-up table, not a full exposition of the organization of the Masoretic system. ! abstract \"Transcriptions\" The ETCBC transcription is used by the ETCBC. It has entries for all accents, but not for text-critical annotations such as uncertainty, and correction. The Abegg transcription is used in the Dead Sea scrolls. It has no entries for accents, but it has a repertoire of text-critical marks. We have back translated the latter to ETCBC -compatible variants and entered them in the ETCBC column, although they are not strictly ETCBC marks. ! abstract \"Phonetics\" The phonetic representation is meant as a tentative 1-1 correspondence with pronunciation, not with the script. See [phono.ipynb](https: nbviewer.jupyter.org/github/ETCBC/phono/blob/master/programs/phono.ipynb), where the phonetic transcription is computed and thoroughly documented. Consonants ! abstract \"Details\" For most consonants: an inner dot is a dagesh forte . For the \u05d1\u05d2\u05d3\u05db\u05e4\u05ea consonants: an inner dot is either a dagesh forte or a dagesh lene . When the \u05d4 contains a dot, it is called a mappiq . transcription ( ETCBC ) transcription (Abegg) glyph phonetic remarks name UNICODE > a \u05d0 \u0294 when not mater lectionis letter alef 05D0 B b \u05d1 bb b v forte lene normal letter bet 05D1 G g \u05d2 gg g \u1e21 forte lene normal letter gimel 05D2 D d \u05d3 dd d \u1e0f forte lene normal letter dalet 05D3 H h \u05d4 h also with mappiq ; when not mater lectionis letter he 05D4 W w \u05d5 ww w \u00fb forte when not part of a long vowel with dagesh as vowel letter vav 05D5 Z z \u05d6 zz z forte normal letter zayin 05D6 X j \u05d7 \u1e25 letter het 05D7 V f \u05d8 \u1e6d letter tet 05D8 J y \u05d9 yy y \u02b8 forte when not part of long vowel in front of final \u05d5 letter yod 05D9 K k \u05db kk k \u1e35 forte lene normal letter kaf 05DB k K \u05da k \u1e35 forte normal letter final kaf 05DA L l \u05dc ll l forte normal letter lamed 05DC M m \u05de mm m forte normal letter mem 05DE m M \u05dd m letter final mem 05DD N n \u05e0 nn n forte normal letter nun 05E0 n N \u05df n letter final nun 05DF S s \u05e1 ss s forte normal letter samekh 05E1 < o \u05e2 \u0295 letter ayin 05E2 P p \u05e4 pp p f forte lene normal letter pe 05E4 p P \u05e3 p f forte normal letter final pe 05E3 Y x \u05e6 \u1e63\u1e63 \u1e63 forte normal letter tsadi 05E6 y X \u05e5 \u1e63 letter final tsadi 05E5 Q q \u05e7 qq q forte normal letter qof 05E7 R r \u05e8 rr r forte normal letter resh 05E8 C \u05e9 \u015d letter shin without dot 05E9 C v \u05e9\u05c1 \u0161\u0161 \u0161 forte normal letter shin with shin dot FB2A F c \u05e9\u05c2 \u015b\u015b \u015b forte normal letter shin with sin dot FB2B T t \u05ea tt t \u1e6f forte lene normal letter tav 05EA Vowels ! caution \"Qere Ketiv\" The phonetics follows the qere , not the ketiv , when they are different. In that case a is added. ! caution \"Tetragrammaton\" The tetragrammaton \u05d9\u05d4\u05d5\u05d4 is (vowel)-pointed in different ways; the phonetics follows the pointing, but the tetragrammaton is put between [ ] . transcription ( ETCBC ) transcription (Abegg) glyph phonetic remarks name UNICODE A A \u00c5 \u05b7 a \u2090 normal furtive point patah 05B7 :A S \u05b2 \u1d43 point hataf patah 05B2 @ D \u2202 \u00ce \u05b8 \u0101 o gadol qatan point qamats 05B8 :@ F \u0192 \u00cf \u05b3 \u1d52 point hataf qamats 05B3 E R \u00ae \u2030 \u05b6 e e\u02b8 normal with following \u05d9 point segol 05B6 :E T \u05b1 \u1d49 \u1d49\u02b8 normal with following \u05d9 point hataf segol 05B1 ; E \u00e9 \u00b4 \u05b5 \u00ea \u0113 with following \u05d9 alone point tsere 05B5 I I \u02c6 \u00ee \u00ca \u05b4 \u00ee i with following \u05d9 alone point hiriq 05B4 O O \u00f8 \u05b9 \u00f4 \u014d with following \u05d5 alone point holam 05B9 U U \u00fc \u00a8 \u05bb u point qubuts 05BB : V \u221a J \u25ca \u05b0 \u1d4a left out if silent point sheva 05B0 Other points and marks transcription ( ETCBC ) transcription (Abegg) glyph phonetic remarks name UNICODE . ; \u2026 \u00da \u00a5 \u03a9 \u05bc point dagesh or mapiq 05BC .c \u05c1 point shin dot 05C1 .f \u05c2 point sin dot 05C2 , \u05bf point rafe 05BF 35 \u05bd \u02c8 point meteg 05BD 45 \u05bd \u02c8 point meteg 05BD 75 \u05bd \u02c8 point meteg 05BD 95 \u05bd \u02c8 point meteg 05BD 52 \u05c4 \u02c8 mark upper dot 05C4 53 \u05c5 \u02c8 mark lower dot 05C5 & 42; \u05af mark masora circle 05AF Punctuation ! abstract \"Details\" Some specialities in the Masoretic system are not reflected in the phonetics: setumah \u05e1 ; petuhah \u05e3 ; nun-hafuka \u0307\u05c6 . transcription ( ETCBC ) transcription (Abegg) glyph phonetic remarks name UNICODE 00 . \u05c3 . punctuation sof pasuq 05C3 n\u0303 \u05c6 punctuation nun hafukha 05C6 & - \u05be - punctuation maqaf 05BE & 95;   (non breaking space)   space 0020 0000 \u00b1 Dead Sea scrolls. We use as Hebrew character a double sof pasuq. paleo-divider 05C3 05C3 ' / \u05f3 Dead Sea scrolls. We use as Hebrew character a geresh. morpheme-break 05F3 Hybrid ! abstract \"Details\" There is a character that is mostly punctuation, but that can also influence the nature of some accents occurring in the word before. Such a character is a hybrid between punctuation and accent. See also the documentation of the BHSA about [cantillation](https: ETCBC.github.io/bhsa/cantillation/). transcription glyph phonetic remarks name UNICODE 05 \u05c0 punctuation paseq 05C0 Accents ! abstract \"Details\" Some accents play a role in deciding whether a schwa is silent or mobile and whether a qamets is gadol or qatan . In the phonetics those accents appear as \u02c8 or \u02cc . Implied accents are also added. transcription glyph phonetic remarks name UNICODE 94 \u05a7 \u02c8 accent darga 05A7 13 \u05ad \u02c8 accent dehi 05AD 92 \u0591 \u02c8 accent etnahta 0591 61 \u059c \u02c8 accent geresh 059C 11 \u059d \u02c8 accent geresh muqdam 059D 62 \u059e \u02c8 accent gershayim 059E 64 \u05ac \u02c8 accent iluy 05AC 70 \u05a4 \u02c8 accent mahapakh 05A4 71 \u05a5 \u02cc accent merkha 05A5 72 \u05a6 \u02c8 accent merkha kefula 05A6 74 \u05a3 \u02c8 accent munah 05A3 60 \u05ab \u02c8 accent ole 05AB 03 \u0599 accent pashta 0599 83 \u05a1 \u02c8 accent pazer 05A1 33 \u05a8 \u02c8 accent qadma 05A8 63 \u05a8 \u02cc accent qadma 05A8 84 \u059f \u02c8 accent qarney para 059F 81 \u0597 \u02c8 accent revia 0597 01 \u0592 accent segol 0592 65 \u0593 \u02c8 accent shalshelet 0593 04 \u05a9 accent telisha qetana 05A9 24 \u05a9 accent telisha qetana 05A9 14 \u05a0 accent telisha gedola 05A0 44 \u05a0 accent telisha gedola 05A0 91 \u059b \u02c8 accent tevir 059B 73 \u0596 \u02cc accent tipeha 0596 93 \u05aa \u02c8 accent yerah ben yomo 05AA 10 \u059a \u02c8 accent yetiv 059A 80 \u0594 \u02c8 accent zaqef qatan 0594 85 \u0595 \u02c8 accent zaqef gadol 0595 82 \u0598 \u02c8 accent zarqa 0598 02 \u05ae \u02c8 accent zinor 05AE Numerals ! abstract \"Details\" These signs occur in the Dead Sea scrolls. We represent them with conventional Hebrew characters for numbers and use the geresh accent or another accent to mark the letter as a numeral. The ETCBC codes are obtained by translating back from the UNICODE. transcription (ETCBC) transcription (Abegg) glyph remarks name >' A \u05d0\u059c number 1 >52 \u00e5 \u05d0\u05c4 alternative for 1, often at the end of a number, we use the upper dot to distinguish it from the other 1 number 1 >53 B \u05d0\u05c5 alternative for 1, often at the end of a number, we use the lower dot to distinguish it from the other 1 number 1 >35 \u222b \u05d0\u05bd alternative for 1, often at the end of a number, we use the meteg to distinguish it from the other 1 number 1 J' C \u05d9\u059c number 10 k' D \u05da\u059c number 20 Q' F \u05e7\u059c number 100 & + \u05be we use the maqaf to represent addition between numbers add Text-critical ! abstract \"Details\" These signs occur in the Dead Sea scrolls. They are used to indicate uncertainty and editing acts by ancient scribes or modern editors. They do not have an associated glyph in UNICODE. The ETCBC does not have codes for them, but we propose an ETCBC-compatible encoding for them. The ETCBC codes are surrounded by space, except for the brackets, where a space at the side of the ( or ) is not necessary. Codes that are marked as flag apply to the preceding character. Codes that are marked as brackets apply to the material within them. transcription (Abegg) transcription ( ETCBC ) remarks name 0 \u03b5 token missing ? ? token uncertain (degree 1) & 92; token uncertain (degree 2) \ufffd ? token uncertain (degree 3) \u00d8 ? flag, applies to preceding character uncertain (degree 1) \u00ab flag, applies to preceding character uncertain (degree 2) \u00bb ? flag, applies to preceding character uncertain (degree 3) & 124; flag, applies to preceding character uncertain (degree 4) \u00ab \u00bb ( ) brackets uncertain (degree 2) \u2264 \u2265 (- -) brackets vacat (empty space) ( ) ( ) brackets alternative [ ] [ ] brackets reconstruction (modern) { } { } brackets removed (modern) {& 123; {& 123; brackets removed (ancient) < > (< >) brackets correction (modern) << >> (<< >>) brackets correction (ancient) ^ ^ (^ ^) brackets correction (supralinear, ancient) " }, { "ref":"tf.writing.syriac", -"url":147, +"url":148, "doc":" Syriac Characters @font-face { font-family: \"Estrangelo Edessa\"; src: url('https: github.com/annotation/text-fabric/blob/master/tf/browser/static/fonts/SyrCOMEdessa.otf?raw=true'); src: url('https: github.com/annotation/text-fabric/blob/master/tf/browser/static/fonts/SyrCOMEdessa.woff?raw=true') format('woff'); } body { font-family: sans-serif; } table.chars { border-collapse: collapse; } table.chars thead tr { color: ffffff; background-color: 444444; } table.chars tbody td { border: 2px solid bbbbbb; padding: 0.1em 0.5em; } h1.chars { margin-top: 1em; } .t { font-family: monospace; font-size: large; color: 0000ff; } .g { font-family: \"Estrangelo Edessa\", sans-serif; font-size: x-large; } .p { font-family: monospace; font-size: large; color: 666600; } .r { font-family: sans-serif; font-size: small; color: 555555; } .n { font-family: sans-serif; color: 990000; font-size: small; } .u { font-family: monospace; color: 990000; } Letters transcription glyph phonetic remarks name UNICODE > \u0710 alaph 0710 B \u0712 beth 0712 G \u0713 gamal 0713 D \u0715 dalat 0715 H \u0717 he 0717 W \u0718 waw 0718 Z \u0719 zain 0719 X \u071a heth 071A V \u071b teth 071B J \u071d yod 071D K \u071f kaf 071F L \u0720 lamad 0720 M \u0721 mim 0721 N \u0722 nun 0722 S \u0723 semkath 0723 < \u0725 e 0725 P \u0726 pe 0726 Y \u0728 tsade 0728 Q \u0729 qof 0729 R \u072a resh 072A C \u072b shin 072B T \u072c taw 072C Word-bound diacritics transcription glyph phonetic remarks name UNICODE \" \u0308 seyame 0308 \u0323 diacritical dot below 0323 ^ \u0307 diacritical dot above 0307 Non-vocalic letter-bound diacritics transcription glyph phonetic remarks name UNICODE ^! \u0743 unclear (syriac two vertical dots above) 0743 vocalic letter-bound diacritics transcription glyph phonetic remarks name UNICODE : shewa A \u0733 qamets 0733 A1 \u0734 zeqapa 0734 A2 \u0735 zeqofo 0735 O \u073f holem, rewaha 073F @ \u0730 patah 0730 @1 \u0731 petaha 0731 @2 \u0732 petoho 0732 E \u0736 segol 0736 E1 \u0737 revasa arrika 0737 E2 \u0738 revoso 0738 I \u073a hireq 073A I1 \u073b hevoso 073B U \u073d qubbuts 073D U1 \u073e esoso 073E Punctuation transcription glyph phonetic remarks name UNICODE & 92; \u0709 tahtaya, metkashpana (WS), meshalyana (WS) 0709 =. . pasuqa 002E = \u0707 elaya 0707 =: : shewaya (WS), zauga (ES) 003A =^ \u0706 unclear (SYRIAC COLON SKEWED LEFT) 0706 =/ \u0707 elaya 0707 =& 92; \u0706 unclear (SYRIAC COLON SKEWED LEFT) 0706 ^: \u0703 taksa (WS), zauga elaya (ES) 0703 ^& 92; \u0708 unclear (SYRIAC SUPRALINEAR COLON SKEWED LEFT) 0708 Pericope markers transcription glyph phonetic remarks name UNICODE & 42; \u0700 rosette 0700 . \u00b7 common dot in caesuras 00B7 & 95; \u2014 dash in caesuras 2014 o \u2022 large dot in caesuras 2022 .md" }, { "ref":"tf.writing.neoaramaic", -"url":148, +"url":149, "doc":" Neo Aramaic transcriptions body { font-family: sans-serif; } pre.chars { border-collapse: collapse; color: 000080; font-family: monospace; font-size: medium; line-height: 1.0; } The following table is provided by the collectors of the [NENA](https: github.com/CambridgeSemiticsLab/nena_corpus) corpus at [Cambridge Semitics Lab](https: github.com/CambridgeSemiticsLab). There is also a [PDF]( /images/neoaramaic.pdf) of the table below. Vowel inventory and conversions Special vowel signs \u250f \u2501\u2533 \u252f \u252f \u252f \u2501\u252f \u2501\u252f \u252f \u2501\u252f \u2501\u252f\u2501\u252f \u252f\u2501\u252f\u2501\u252f \u252f \u252f\u2501\u252f\u2501\u252f \u252f\u2501\u252f \u252f \u252f\u2501\u252f\u2501\u2513\u0010 \u2503 \u2503\u00e1 \u2502\u00e0 \u2502\u0101 \u2502\u0101\u0300 \u2502\u0101\u0301 \u2502\u0103 \u2502\u1eaf \u2502\u1eb1 \u2502e\u2502\u0113 \u2502\u025b\u2502i\u2502\u012b \u2502\u012d \u2502\u0259\u2502o\u2502\u014d \u2502u\u2502\u016b \u2502\u016d \u2502\u0131\u2502\u0251\u2503 \u2520 \u2500\u2542 \u253c \u253c \u253c \u2500\u253c \u2500\u253c \u253c \u2500\u253c \u2500\u253c\u2500\u253c \u253c\u2500\u253c\u2500\u253c \u253c \u253c\u2500\u253c\u2500\u253c \u253c\u2500\u253c \u253c \u253c\u2500\u253c\u2500\u2528 \u2503precise match\u2503a'\u2502a \u2502a-\u2502a- \u2502a-'\u2502a>\u2502a>'\u2502a> \u2502e\u2502e-\u25023\u2502i\u2502i-\u2502i>\u25029\u2502o\u2502o-\u2502u\u2502u-\u2502u Symbol inventory for conversions Special signs alphabetical \u250f \u2501\u2533 \u252f\u2501\u252f\u2501\u252f \u252f \u252f \u2501\u252f \u2501\u252f \u252f\u2501\u252f\u2501\u252f \u252f \u252f\u2501\u252f \u252f \u252f \u252f \u2501\u252f \u252f \u252f \u252f \u252f \u252f\u2501\u252f\u2501\u252f \u252f \u2513\u0010 \u2503 \u2503\u02be \u2502\u02bf\u2502c\u2502c\u032d \u2502\u010d \u2502\u010d\u032d \u2502\u010d\u0323 \u2502\u1e0d \u2502\u00f0\u2502\u00f0\u0323\u2502\u0121 \u2502\u1e25 \u2502\u025f\u2502k\u032d \u2502\u1e37 \u2502\u1e43 \u2502p\u032d,p\u030c\u2502p\u0323 \u2502\u1e5b \u2502\u1e63 \u2502\u0161 \u2502\u1e71 \u2502\u1e6d\u2502\u03b8\u2502\u017e \u2502\u1e93 \u2503 \u2520 \u2500\u2542 \u253c\u2500\u253c\u2500\u253c \u253c \u253c \u2500\u253c \u2500\u253c \u253c\u2500\u253c\u2500\u253c \u253c \u253c\u2500\u253c \u253c \u253c \u253c \u2500\u253c \u253c \u253c \u253c \u253c \u253c\u2500\u253c\u2500\u253c \u253c \u2528 \u2503precise match\u2503) \u2502(\u2502c\u2502c c\u2502>c c.\u2502d.\u25026\u25026\u2502g.\u2502h.\u25024\u2502k s\u2502t z\u2502z.\u2503 \u2503lite \u2503) \u2502(\u2502c\u2502c \u25025 \u2502 \u2502% \u2502D \u25026\u2502^\u2502G \u2502H \u25024\u2502& \u2502L \u2502M \u2502p \u2502P \u2502R \u2502S \u2502$ \u2502+ \u2502T\u25028\u25027 \u2502Z \u2503 \u2503fuzzy_all \u2503ignore\u2502(\u2502 \u2502 \u25025 \u25025 \u25025 \u2502d \u2502d\u2502d\u2502g \u2502h \u2502 \u2502 \u2502l \u2502m \u2502p \u2502p \u2502r \u2502s \u2502s \u2502t \u2502t\u2502 \u2502z \u2502z \u2503 \u2503fuzzy_Urmi \u2503 \u2502 \u2502k\u2502k \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502g\u2502q \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2503 \u2503fuzzy_Barwar \u2503 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502d\u2502 \u2502 \u2502 \u2502 \u2502k \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502t\u2502 \u2502 \u2503 \u2517 \u2501\u253b \u2537\u2501\u2537\u2501\u2537 \u2537 \u2537 \u2501\u2537 \u2501\u2537 \u2537\u2501\u2537\u2501\u2537 \u2537 \u2537\u2501\u2537 \u2537 \u2537 \u2537 \u2501\u2537 \u2537 \u2537 \u2537 \u2537 \u2537\u2501\u2537\u2501\u2537 \u2537 \u251b\u0010 Capitals \u250f \u2501\u2533\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u2513\u0010 \u2503 \u2503\u1e0d\u2502\u0121\u2502\u1e25\u2502\u1e37\u2502\u1e43\u2502p\u0323\u2502\u1e5b\u2502\u1e63\u2502\u1e6d\u2502\u1e93\u2502\u0101\u2502\u0113\u2502\u012b\u2502\u014d\u2502\u016b\u2503 \u2520 \u2500\u2542\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u2528 \u2503lite \u2503D\u2502G\u2502H\u2502L\u2502M\u2502P\u2502R\u2502S\u2502T\u2502Z\u2502A\u2502E\u2502I\u2502O\u2502U\u2503 \u2517 \u2501\u253b\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u251b\u0010 Special symbols \u250f \u2501\u2533\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u2513\u0010 \u2503 \u2503\u010d\u032d\u2502\u010d\u0323\u2502\u00f0\u0323\u2502k\u032d\u2502\u1e71\u2502\u0161\u2502\u0103\u2503 \u2520 \u2500\u2542\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u2528 \u2503lite \u2503 \u2502%\u2502^\u2502&\u2502+\u2502$\u2502@\u2503 \u2517 \u2501\u253b\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u251b\u0010 Numbers \u250f \u2501\u2533\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u252f\u2501\u2513\u0010 \u2503 \u2503\u016d\u2502\u025b\u2502\u025f\u2502\u010d\u2502\u00f0\u2502\u017e\u2502\u03b8\u2502\u0259\u2503 \u2520 \u2500\u2542\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u253c\u2500\u2528 \u2503lite \u25032\u25023\u25024\u25025\u25026\u25027\u25028\u25029\u2503 \u2517 \u2501\u253b\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u2537\u2501\u251b\u0010 Consonant phoneme inventory: Lite and fuzzy conversions Legend lt = lite fz = fuzzy fzUr = fuzzy Urmi \u0454 = empty \u250f \u2533 \u2501\u2533 \u2533 \u2533 \u2501\u2533 \u2501\u2533 \u2533 \u2501\u2533 \u2501\u2513\u0010 \u2503 \u2503labial \u2503dental- \u2503palatal-\u2503palatal\u2503(post-)\u2503uvular\u2503pharyn-\u2503laryn- \u2503 \u2503 \u2503 \u2503alveolar\u2503alveolar\u2503 \u2503velar \u2503 \u2503geal \u2503geal \u2503 \u2523 \u254b \u2501\u252f \u252f \u254b\u2501\u252f \u252f \u2501\u254b\u2501\u252f \u252f \u2501\u254b\u2501\u252f \u252f \u254b\u2501\u252f \u252f \u254b \u252f \u2501\u254b\u2501\u252f \u252f \u254b\u2501\u252f \u252f \u252b \u2503Stops/affricates \u2503 \u2502lt\u2502fz\u2503 \u2502lt\u2502fz \u2503 \u2502lt\u2502fz \u2503 \u2502lt\u2502fz\u2503 \u2502lt\u2502fz\u2503 \u2502 \u2503 \u2502lt\u2502fz\u2503 \u2502lt\u2502fz\u2503 \u2503 \u2503 \u2502 \u2502 \u2503 \u2502 \u2502 \u2503 \u2502 \u2502 \u2503 \u2502 \u2502Ur\u2503 \u2502 \u2502Ur\u2503 \u2502 \u2503 \u2502 \u2502 \u2503 \u2502 \u2502 \u2503 \u2520 \u2542 \u2500\u253c \u253c \u2542\u2500\u253c \u253c \u2500\u2542\u2500\u253c \u253c \u2500\u2542\u2500\u253c \u253c \u2542\u2500\u253c \u253c \u2542 \u253c \u2500\u2542\u2500\u2534 \u2534 \u2542\u2500\u253c \u253c \u2528 \u2503Unvoiced aspirated \u2503p \u2502p \u2502 \u2503t\u2502t \u2502t \u2503\u010d\u25025 \u25025 \u2503c\u2502c \u2502k \u2503k\u2502k \u2502k \u2503 q\u2502q \u2503 \u2503\u02be\u2502) \u2502\u0454 \u2503 \u2503Unvoiced unaspirated\u2503p\u032d,p\u030c\u2502p \u2502p \u2503\u1e71\u2502+ \u2502t \u2503\u010d\u032d\u2502 \u25025 \u2503c\u032d\u2502c \u2502k \u2503k\u032d\u2502& \u2502q \u2503 \u2502 \u2503 \u2503 \u2502 \u2502 \u2503 \u2503Voiced \u2503b \u2502b \u2502 \u2503d\u2502d \u2502d \u2503j\u2502j \u2502j \u2503\u025f\u25024 \u2502g \u2503g\u2502g \u2502g \u2503 \u2502 \u2503 \u2503 \u2502 \u2502 \u2503 \u2503Emphatic \u2503p\u0323 \u2502P \u2502p \u2503\u1e6d\u2502T \u2502t \u2503\u010d\u2502% \u25025 \u2503 \u2502 \u2502 \u2503 \u2502 \u2502 \u2503 \u2502 \u2503 \u2503 \u2502 \u2502 \u2503 \u2503 \u2503 \u2502 \u2502 \u2503\u1e0d\u2502D \u2502d \u2503 \u2502 \u2502 \u2503 \u2502 \u2502 \u2503 \u2502 \u2502 \u2503 \u2502 \u2503 \u2503 \u2502 \u2502 \u2503 \u2523 \u254b \u2501\u2537 \u2537 \u254b\u2501\u2537 \u2537 \u2501\u254b\u2501\u2537 \u2537 \u2501\u253b\u2501\u2537 \u2537 \u254b\u2501\u2537 \u2537 \u254b \u2537 \u2501\u254b \u2501\u254b\u2501\u2537 \u2537 \u252b \u2503Fricatives \u2503 \u2503 \u2503 \u2503 \u2503 \u2503 \u2503 \u2503 \u2520 \u2542 \u2500\u252c \u252c \u2542\u2500\u252c \u252c \u2500\u2528 \u2520\u2500\u252c \u252c \u2528 \u2520\u2500\u252c \u252c \u2542\u2500\u252c \u252c \u2528 \u2503Unvoiced \u2503f \u2502f \u2502f \u2503\u03b8\u25028 \u2502t \u2503 \u2503x\u2502x \u2502x \u2503 \u2503\u1e25\u2502H \u2502h \u2503h\u2502h \u2502h \u2503 \u2503Voiced \u2503v \u2502v \u2502w \u2503\u00f0\u25026 \u2502d \u2503 \u2503\u0121\u2502G \u2502g \u2503 \u2503 \u2502 \u2502 \u2503 \u2502 \u2502 \u2503 \u2503Emphatic \u2503 \u2502 \u2502 \u2503\u00f0\u0323\u2502^ \u2502d \u2503 \u2503 \u2502 \u2502 \u2503 \u2503\u02bf\u2502( \u2502( \u2503 \u2502 \u2502 \u2503 \u2523 \u254b \u2501\u2537 \u2537 \u254b\u2501\u2537 \u2537 \u2501\u254b \u2513 \u2517\u2501\u2537 \u2537 \u251b \u2517\u2501\u2537 \u2537 \u253b\u2501\u2537 \u2537 \u252b \u2503Sibilants \u2503 \u2503 \u2503 \u2503 \u2503 \u2520 \u2528 \u2520\u2500\u252c \u252c \u2500\u2542\u2500\u252c \u252c \u2500\u2528 \u2503 \u2503Unvoiced \u2503 \u2503s\u2502s \u2502s \u2503\u0161\u2502$ \u2502s \u2503 \u2503 \u2503Voiced \u2503 \u2503z\u2502z \u2502z \u2503\u017e\u25027 \u2502z \u2503 \u2503 \u2503Emphatic \u2503 \u2503\u1e63\u2502S \u2502s \u2503 \u2502 \u2502 \u2503 \u2503 \u2503 \u2503 \u2503\u1e93\u2502Z \u2502z \u2503 \u2502 \u2502 \u2503 \u2503 \u2523 \u254b \u2501\u254b\u2501\u2537 \u2537 \u2501\u254b\u2501\u2537 \u2537 \u2501\u251b \u2503 \u2503Nasals \u2503 \u2503 \u2503 \u2503 \u2520 \u2542 \u2500\u252c \u252c \u2542\u2500\u252c \u252c \u2500\u2528 \u2503 \u2503Plain \u2503m \u2502m \u2502m \u2503n\u2502n \u2502n \u2503 \u2503 \u2503Emphatic \u2503\u1e43 \u2502M \u2502m \u2503 \u2502 \u2502 \u2503 \u2503 \u2523 \u254b \u2501\u2537 \u2537 \u254b\u2501\u2537 \u2537 \u2501\u252b \u2503 \u2503Laterals \u2503 \u2503 \u2503 \u2503 \u2520 \u2528 \u2520\u2500\u252c \u252c \u2500\u2528 \u2503 \u2503Plain \u2503 \u2503l\u2502l \u2502l \u2503 \u2503 \u2503Emphatic \u2503 \u2503\u1e37\u2502L \u2502l \u2503 \u2503 \u2523 \u254b \u2501\u254b\u2501\u2537 \u2537 \u2501\u252b \u250f \u2501\u2513 \u2503 \u2503Other approximants \u2503 \u2503 \u2503 \u2503 \u2503 \u2503 \u2520 \u2542 \u2500\u252c \u252c \u2542\u2500\u252c \u252c \u2500\u2528 \u2520\u2500\u252c \u252c \u2528 \u2503 \u2503Plain \u2503w \u2502w \u2502w \u2503r\u2502r \u2502r \u2503 \u2503y\u2502y \u2502y \u2503 \u2503 \u2503Emphatic \u2503 \u2502 \u2502 \u2503\u1e5b\u2502R \u2502r \u2503 \u2503 \u2502 \u2502 \u2503 \u2503 \u2517 \u253b \u2501\u2537 \u2537 \u253b\u2501\u2537 \u2537 \u2501\u253b \u253b\u2501\u2537 \u2537 \u253b \u251b\u0010 " }, { "ref":"tf.writing.ugaritic", -"url":149, +"url":150, "doc":" Ugaritic Characters @font-face { font-family: \"Santakku\"; src: local('Santakku'), url('/browser/static/fonts/Santakku.woff') format('woff'), url('https: github.com/annotation/text-fabric/blob/master/tf/browser/static/fonts/Santakku.woff?raw=true') format('woff'); } body { font-family: sans-serif; } table.chars { border-collapse: collapse; } table.chars thead tr { color: ffffff; background-color: 444444; } table.chars tbody td { border: 2px solid bbbbbb; padding: 0.1em 0.5em; } h1.chars { margin-top: 1em; } .t { font-family: monospace; font-size: large; color: 0000ff; } .g { font-family: \"Santakku\", sans-serif; font-size: x-large; } .p { font-family: monospace; font-size: large; color: 666600; } .r { font-family: sans-serif; font-size: small; color: 555555; } .n { font-family: sans-serif; color: 990000; font-size: small; } .u { font-family: monospace; color: 990000; } Letters and word separator \u0383 \u038c transcription glyph phonetic remarks name UNICODE a \ud800\udf80 \u0294a alpa 10380 b \ud800\udf81 b beta 10381 g \ud800\udf82 g gamla 10382 \u1e2b \ud800\udf83 x kha 10383 d \ud800\udf84 d delta 10384 h \ud800\udf85 h ho 10385 w \ud800\udf86 w wo 10386 z \ud800\udf87 z zeta 10387 \u1e25 \ud800\udf88 \u0127 hota 10388 \u1e6d \ud800\udf89 t\u02e4 tet 10389 y \ud800\udf8a j yod 1038A k \ud800\udf8b k kaf 1038B \u0161 \ud800\udf8c \u0283 shin 1038C l \ud800\udf8d l lamda 1038D m \ud800\udf8e m mem 1038E \u1e0f \ud800\udf8f \u00f0 dhal 1038F n \ud800\udf90 n nun 10390 \u1e93 \ud800\udf91 \u03b8\u02e4 zu 10391 s \ud800\udf92 s samka 10392 \u02e4 \ud800\udf93 \u0295 ain 10393 p \ud800\udf94 p pu 10394 \u1e63 \ud800\udf95 s\u02e4 sade 10395 q \ud800\udf96 q qopa 10396 r \ud800\udf97 r rasha 10397 \u1e6f \ud800\udf98 \u03b8 thanna 10398 \u0121 \ud800\udf99 \u0263 ghain 10399 t \ud800\udf9a t to 1039A i \ud800\udf9b \u0294i i 1039B u \ud800\udf9c \u0294u u 1039C s2 \ud800\udf9d su ssu 1039D . \ud800\udf9f divider 1039F " } ] \ No newline at end of file diff --git a/tf/about/annotate.html b/tf/about/annotate.html index dabaf10be..cb6909c03 100644 --- a/tf/about/annotate.html +++ b/tf/about/annotate.html @@ -298,7 +298,7 @@
Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/annotate.md
diff --git a/tf/about/annotateBrowser.html b/tf/about/annotateBrowser.html
index f3b764e0a..a631fb5cd 100644
--- a/tf/about/annotateBrowser.html
+++ b/tf/about/annotateBrowser.html
@@ -267,7 +267,7 @@ 

Programming

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/annotateBrowser.md
diff --git a/tf/about/apps.html b/tf/about/apps.html
index a7954f0bd..be6ea86da 100644
--- a/tf/about/apps.html
+++ b/tf/about/apps.html
@@ -115,7 +115,7 @@ 

Two contexts

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/apps.md
diff --git a/tf/about/background.html b/tf/about/background.html
index b58408d14..e823387b2 100644
--- a/tf/about/background.html
+++ b/tf/about/background.html
@@ -155,7 +155,7 @@ 

History

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/background.md
diff --git a/tf/about/browser.html b/tf/about/browser.html
index 83dc001b1..4fefa69f6 100644
--- a/tf/about/browser.html
+++ b/tf/about/browser.html
@@ -174,7 +174,7 @@ 

UNICODE in Excel CSVs

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/browser.md
diff --git a/tf/about/clientmanual.html b/tf/about/clientmanual.html
index c1464588e..8534cb313 100644
--- a/tf/about/clientmanual.html
+++ b/tf/about/clientmanual.html
@@ -565,7 +565,7 @@ 

Credits

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/clientmanual.md
diff --git a/tf/about/code.html b/tf/about/code.html
index c85ff5c80..a094df1f9 100644
--- a/tf/about/code.html
+++ b/tf/about/code.html
@@ -98,7 +98,7 @@ 

Writing

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/code.md
diff --git a/tf/about/corpora.html b/tf/about/corpora.html
index 5f09c358f..04a051d1c 100644
--- a/tf/about/corpora.html
+++ b/tf/about/corpora.html
@@ -351,7 +351,7 @@ 

Extra data

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/corpora.md
diff --git a/tf/about/datamodel.html b/tf/about/datamodel.html
index 9187c15cd..11804c8dd 100644
--- a/tf/about/datamodel.html
+++ b/tf/about/datamodel.html
@@ -265,7 +265,7 @@ 

Serializing and pre-computing

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/datamodel.md
diff --git a/tf/about/datasharing.html b/tf/about/datasharing.html
index 03a7a1362..193888099 100644
--- a/tf/about/datasharing.html
+++ b/tf/about/datasharing.html
@@ -362,7 +362,7 @@ 

More modules at the same time

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/datasharing.md
diff --git a/tf/about/displaydesign.html b/tf/about/displaydesign.html
index 657af490a..5872bb433 100644
--- a/tf/about/displaydesign.html
+++ b/tf/about/displaydesign.html
@@ -151,7 +151,7 @@ 

Output

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/displaydesign.md
diff --git a/tf/about/faq.html b/tf/about/faq.html
index 462601d48..4e7dc4f6c 100644
--- a/tf/about/faq.html
+++ b/tf/about/faq.html
@@ -161,7 +161,7 @@ 

GitHub Rate Limit Exceeded!

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/faq.md
diff --git a/tf/about/fileformats.html b/tf/about/fileformats.html
index 8c93d628f..ebe17b2ad 100644
--- a/tf/about/fileformats.html
+++ b/tf/about/fileformats.html
@@ -158,7 +158,7 @@ 

Single values

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/fileformats.md
diff --git a/tf/about/index.html b/tf/about/index.html
index cc57eec1b..d40bfd9b0 100644
--- a/tf/about/index.html
+++ b/tf/about/index.html
@@ -33,7 +33,7 @@ 

Documents

Expand source code -Browse git +Browse git
"""
 # Documents
diff --git a/tf/about/install.html b/tf/about/install.html
index 8d7a47aa3..4d7befe77 100644
--- a/tf/about/install.html
+++ b/tf/about/install.html
@@ -108,7 +108,7 @@ 

Note for Linux users

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/install.md
diff --git a/tf/about/manual.html b/tf/about/manual.html
index 8fe39011f..17845041e 100644
--- a/tf/about/manual.html
+++ b/tf/about/manual.html
@@ -390,7 +390,7 @@ 

Keyboard shortcuts

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/manual.md
diff --git a/tf/about/optimizations.html b/tf/about/optimizations.html
index d60bcc002..51f7778f4 100644
--- a/tf/about/optimizations.html
+++ b/tf/about/optimizations.html
@@ -187,7 +187,7 @@ 

Edge features

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/optimizations.md
diff --git a/tf/about/releases.html b/tf/about/releases.html
index 67b709532..43189c8f0 100644
--- a/tf/about/releases.html
+++ b/tf/about/releases.html
@@ -43,6 +43,17 @@ 

Release notes

12

12.4

+

12.4.3

+

2024-05-08

+

Fix in TF browser, spotted by Jorik Groen. +When exporting query results, the values features used in the query were not written +to the table at all. +The expected behaviour was that features used in the query lead to extra columns +in the exported table. +It has been fixed. The cause was an earlier fix in the display of features in query +results. +This new fix only affects the export function from the browser, not the +advanced.display.export function, which did not have this bug.

12.4.2

2024-04-24

Tiny fixes in the TEI and WATM conversions.

@@ -374,7 +385,7 @@

Older releases

Expand source code -Browse git +Browse git
"""
 .. include:: ../docs/about/releases.md
@@ -448,6 +459,7 @@ 

Index

  • Release notes
    • 12
      • 12.4
          +
        • 12.4.3
        • 12.4.2
        • 12.4.1
        • 12.4.0
        • diff --git a/tf/about/releasesold.html b/tf/about/releasesold.html index c3e1e7813..96881a321 100644 --- a/tf/about/releasesold.html +++ b/tf/about/releasesold.html @@ -3430,7 +3430,7 @@
          Changed
          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/about/releasesold.md
          diff --git a/tf/about/searchdesign.html b/tf/about/searchdesign.html
          index 9a521b97b..9bd9fa7e8 100644
          --- a/tf/about/searchdesign.html
          +++ b/tf/about/searchdesign.html
          @@ -477,7 +477,7 @@ 

          Small-first strategy

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/about/searchdesign.md
          diff --git a/tf/about/searchusage.html b/tf/about/searchusage.html
          index 62c6e82b5..f94275379 100644
          --- a/tf/about/searchusage.html
          +++ b/tf/about/searchusage.html
          @@ -776,7 +776,7 @@ 
          Implementation
          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/about/searchusage.md
          diff --git a/tf/about/tests.html b/tf/about/tests.html
          index 719d02b25..3b394fd70 100644
          --- a/tf/about/tests.html
          +++ b/tf/about/tests.html
          @@ -71,7 +71,7 @@ 

          Relations

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/about/tests.md
          diff --git a/tf/about/use.html b/tf/about/use.html
          index a0e83b1d3..fe1eb1c0a 100644
          --- a/tf/about/use.html
          +++ b/tf/about/use.html
          @@ -90,7 +90,7 @@ 

          TF API

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/about/use.md
          diff --git a/tf/about/usefunc.html b/tf/about/usefunc.html
          index 36478eed5..ca472ff29 100644
          --- a/tf/about/usefunc.html
          +++ b/tf/about/usefunc.html
          @@ -419,7 +419,7 @@ 

          Prevent data loading

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/about/usefunc.md
          diff --git a/tf/about/variants.html b/tf/about/variants.html
          index de587244d..1c8f2e5e5 100644
          --- a/tf/about/variants.html
          +++ b/tf/about/variants.html
          @@ -438,7 +438,7 @@ 

          The stack

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/about/variants.md
          diff --git a/tf/about/volumes.html b/tf/about/volumes.html
          index d97f364cf..e0d4c587b 100644
          --- a/tf/about/volumes.html
          +++ b/tf/about/volumes.html
          @@ -323,7 +323,7 @@ 

          Reflection

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/about/volumes.md
          diff --git a/tf/advanced/annotate.html b/tf/advanced/annotate.html
          index 5bb09526c..6da258030 100644
          --- a/tf/advanced/annotate.html
          +++ b/tf/advanced/annotate.html
          @@ -34,7 +34,7 @@ 

          Module tf.advanced.annotate

          Expand source code -Browse git +Browse git
          """
           Enable manual annotation APIs.
          @@ -84,7 +84,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def annotateApi(app):
               """Produce the interchange functions API.
          @@ -106,7 +106,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeNer(app):
               return NER(app)
          diff --git a/tf/advanced/app.html b/tf/advanced/app.html index 4e8697c68..a93df83cf 100644 --- a/tf/advanced/app.html +++ b/tf/advanced/app.html @@ -31,7 +31,7 @@

          Module tf.advanced.app

          Expand source code -Browse git +Browse git
          import types
           import traceback
          @@ -834,7 +834,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def findApp(
               appName,
          @@ -1129,7 +1129,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def loadApp(silent=DEEP):
               """Loads a given TF app or loads the TF app based on the working directory.
          @@ -1197,7 +1197,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def useApp(appName, backend):
               """Make use of a corpus.
          @@ -1299,7 +1299,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class App:
               def __init__(
          @@ -1665,7 +1665,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def hoist(self, hoist, silent=None):
               """Hoist the API handles of this TF app to the global scope.
          @@ -1733,7 +1733,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def load(self, features, silent=SILENT_D):
               """Loads extra features in addition to the main dataset.
          @@ -1771,7 +1771,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def reinit(self):
               """TF Apps may override this method.
          @@ -1806,7 +1806,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def reuse(self, hoist=False):
               """Re-initialize the app.
          diff --git a/tf/advanced/condense.html b/tf/advanced/condense.html
          index 93c85aca7..c6ec9f2bd 100644
          --- a/tf/advanced/condense.html
          +++ b/tf/advanced/condense.html
          @@ -31,7 +31,7 @@ 

          Module tf.advanced.condense

          Expand source code -Browse git +Browse git
          def condense(api, tuples, condenseType, multiple=False):
               F = api.F
          @@ -135,7 +135,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def condense(api, tuples, condenseType, multiple=False):
               F = api.F
          @@ -192,7 +192,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def condenseSet(api, tup, condenseType):
               F = api.F
          diff --git a/tf/advanced/data.html b/tf/advanced/data.html
          index 64c8dbe8e..88dccad02 100644
          --- a/tf/advanced/data.html
          +++ b/tf/advanced/data.html
          @@ -31,7 +31,7 @@ 

          Module tf.advanced.data

          Expand source code -Browse git +Browse git
          from ..core.helpers import itemize
           from ..core.files import backendRep, expandDir, prefixSlash, normpath
          @@ -496,7 +496,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getModulesData(*args):
               """Retrieve all data for a corpus.
          @@ -556,7 +556,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class AppData:
               def __init__(
          @@ -989,7 +989,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def getExtra(self):
               """Get the extra data specified by the settings of the corpus.
          @@ -1051,7 +1051,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def getMain(self):
               """Get the main data of the corpus.
          @@ -1126,7 +1126,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getModule(
               self,
          @@ -1271,7 +1271,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getModules(self):
               """Get data from additional local directories.
          @@ -1342,7 +1342,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getRefs(self):
               """Get data from additional modules.
          @@ -1397,7 +1397,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def getStandard(self):
               """Get the data of the standard modules specified by the settings of the corpus.
          diff --git a/tf/advanced/display.html b/tf/advanced/display.html
          index 52d06abc5..81013f558 100644
          --- a/tf/advanced/display.html
          +++ b/tf/advanced/display.html
          @@ -69,7 +69,7 @@ 

          See also

          Expand source code -Browse git +Browse git
          """
           # Display
          @@ -1126,7 +1126,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def displayApi(app, silent=SILENT_D):
               """Produce the display API.
          @@ -1193,7 +1193,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def displayReset(app, *options):
               """Restore display parameters to their defaults.
          @@ -1251,7 +1251,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def displaySetup(app, *show, **options):
               """Set up all display parameters.
          @@ -1309,7 +1309,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def displayShow(app, *options):
               """Show display parameters.
          @@ -1444,7 +1444,7 @@ 

          Results

          Expand source code -Browse git +Browse git
          def export(app, tuples, toDir=None, toFile="results.tsv", **options):
               """Exports an iterable of tuples of nodes to an Excel friendly TSV file.
          @@ -1589,7 +1589,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getCss(app):
               """Export the CSS for this app.
          @@ -1639,7 +1639,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getToolCss(app, tool):
               """Export the CSS for a tool of this app.
          @@ -1689,7 +1689,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def loadCss(app):
               """Load the CSS for this app.
          @@ -1768,7 +1768,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def loadToolCss(app, tool, extraCss):
               """Load the Tool CSS for this app.
          @@ -1840,7 +1840,7 @@ 

          Result

          Expand source code -Browse git +Browse git
          def plain(app, n, _inTuple=False, _asString=False, explain=False, **options):
               """Display the plain text of a node.
          @@ -1926,7 +1926,7 @@ 

          Result

          Expand source code -Browse git +Browse git
          def plainTuple(
               app,
          @@ -2169,7 +2169,7 @@ 

          Result

          Expand source code -Browse git +Browse git
          def pretty(app, n, explain=False, _asString=False, **options):
               """Displays the material that corresponds to a node in a graphical way.
          @@ -2248,7 +2248,7 @@ 

          Result

          Expand source code -Browse git +Browse git
          def prettyTuple(app, tup, seq=None, _asString=False, item=RESULT, **options):
               """Displays the material that corresponds to a tuple of nodes in a graphical way.
          @@ -2361,7 +2361,7 @@ 

          Result

          Expand source code -Browse git +Browse git
          def show(app, tuples, _asString=False, **options):
               """Displays an iterable of tuples of nodes.
          @@ -2464,7 +2464,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def table(app, tuples, _asString=False, **options):
               """Plain displays of an iterable of tuples of nodes in a table.
          diff --git a/tf/advanced/find.html b/tf/advanced/find.html
          index 0641225bf..a40e80687 100644
          --- a/tf/advanced/find.html
          +++ b/tf/advanced/find.html
          @@ -31,7 +31,7 @@ 

          Module tf.advanced.find

          Expand source code -Browse git +Browse git
          import sys
           from importlib import util
          @@ -270,7 +270,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def findAppClass(appName, appPath):
               """Find the class definition of an app.
          @@ -325,7 +325,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def findAppConfig(
               appName,
          @@ -474,7 +474,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def loadModule(moduleName, *args):
               """Load a module dynamically, by name.
          diff --git a/tf/advanced/helpers.html b/tf/advanced/helpers.html
          index 3f9e3d3f9..c173bf950 100644
          --- a/tf/advanced/helpers.html
          +++ b/tf/advanced/helpers.html
          @@ -31,7 +31,7 @@ 

          Module tf.advanced.helpers

          Expand source code -Browse git +Browse git
          import collections
           from textwrap import dedent
          @@ -864,7 +864,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def backendRepl(match):
               thisBackend.append(match.group(1))
          @@ -894,7 +894,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dh(html, inNb="ipython", unexpand=False):
               """Display HTML.
          @@ -952,7 +952,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dm(md, inNb="ipython", unexpand=False):
               """Display markdown.
          @@ -995,7 +995,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getHeaderTypes(app, tuples):
               api = app.api
          @@ -1034,7 +1034,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getHeaders(app, tuples):
               headerTypes = getHeaderTypes(app, tuples)
          @@ -1058,7 +1058,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getLocalDir(backend, cfg, local, version):
               provenanceSpec = cfg.get("provenanceSpec", {})
          @@ -1098,7 +1098,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getResultsX(app, results, features, condenseType, fmt=None):
               """Transform a uniform iterable of nodes into a table with extra information.
          @@ -1194,7 +1194,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getRowsX(app, tuples, features, condenseType, fmt=None):
               """Transform an iterable of nodes into a table with extra information.
          @@ -1218,7 +1218,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getText(
               app, isPretty, n, nType, outer, first, last, level, passage, descend, options=None
          @@ -1311,7 +1311,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getTuplesX(app, results, condenseType, fmt=None):
               """Transform a non-uniform iterable of nodes into a table with extra information.
          @@ -1379,7 +1379,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getValue(app, n, nType, feat, suppress, math=False):
               F = app.api.F
          @@ -1408,7 +1408,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def hData(x):
               if not x:
          @@ -1439,7 +1439,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def hDict(x, outer=False):
               elem = f"{'o' if outer else 'u'}l"
          @@ -1469,7 +1469,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def hEmpty(x):
               return (
          @@ -1491,7 +1491,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def hList(x, outer=False):
               elem = f"{'o' if outer else 'u'}l"
          @@ -1519,7 +1519,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def hScalar(x):
               if type(x) is str:
          @@ -1539,7 +1539,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def hScalar0(x):
               tpv = type(x)
          @@ -1584,7 +1584,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def hasData(backend, local, org, repo, version, relative):
               versionRep = f"/{version}" if version else ""
          @@ -1609,7 +1609,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def htmlSafe(text, isHtml, math=False):
               return text.replace("\n", "<br>") if isHtml else htmlEsc(text, math=math)
          @@ -1627,7 +1627,7 @@

          Parameters

          Expand source code -Browse git +Browse git
          def isUniform(app, tuples):
               """Whether the members of tuples are uniform.
          @@ -1669,7 +1669,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def parseFeatures(features):
               if (
          @@ -1698,7 +1698,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def parseFeaturesLogical(feats):
               bare = []
          @@ -1725,7 +1725,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def runsInNotebook():
               """Determines whether the program runs in an interactive shell.
          @@ -1771,7 +1771,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def showDict(title, data, _browse, inNb, *keys):
               """Shows selected keys of a dictionary in a pretty way.
          @@ -1812,7 +1812,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def splitModRef(moduleRef):
               thisBackend.clear()
          @@ -1890,7 +1890,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def transitiveClosure(relation, reflexiveExceptions):
               """Produce the reflexive transitive closure of a relation.
          @@ -1958,7 +1958,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def tupleEnum(tuples, start, end, limit, item, inNb):
               if start is None:
          diff --git a/tf/advanced/highlight.html b/tf/advanced/highlight.html
          index 764c27410..2be51b21a 100644
          --- a/tf/advanced/highlight.html
          +++ b/tf/advanced/highlight.html
          @@ -31,7 +31,7 @@ 

          Module tf.advanced.highlight

          Expand source code -Browse git +Browse git
          from .search import runSearch
           
          @@ -290,7 +290,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getEdgeHlAtt(e, pair, highlights):
               """Get the edge highlight attribute and style for an edge, only for pretty mode.
          @@ -370,7 +370,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getHlAtt(app, n, highlights, isSlot):
               """Get the highlight attribute and style for a node for both pretty and plain modes.
          @@ -457,7 +457,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getPassageHighlights(app, node, query, colorMap, cache):
               """Get the highlights for a whole passage.
          @@ -550,7 +550,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getTupleHighlights(api, tup, highlights, colorMap, condenseType):
               """Get the highlights for a tuple of nodes.
          diff --git a/tf/advanced/index.html b/tf/advanced/index.html
          index 2adf4b87f..ed6eb68e5 100644
          --- a/tf/advanced/index.html
          +++ b/tf/advanced/index.html
          @@ -66,7 +66,7 @@ 

          Advanced API

          Expand source code -Browse git +Browse git
          """
           # Advanced API
          diff --git a/tf/advanced/interchange.html b/tf/advanced/interchange.html
          index 6885e7823..2e17205fc 100644
          --- a/tf/advanced/interchange.html
          +++ b/tf/advanced/interchange.html
          @@ -35,7 +35,7 @@ 

          Module tf.advanced.interchange

          Expand source code -Browse git +Browse git
          """
           Produce exports of the whole dataset in different formats.
          @@ -86,7 +86,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def interchangeApi(app):
               """Produce the interchange functions API.
          diff --git a/tf/advanced/links.html b/tf/advanced/links.html
          index 5145a1177..21c1dde2b 100644
          --- a/tf/advanced/links.html
          +++ b/tf/advanced/links.html
          @@ -32,7 +32,7 @@ 

          Module tf.advanced.links

          Expand source code -Browse git +Browse git
          """
           Produce links to TF data and links from nodes to web resources.
          @@ -1100,7 +1100,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def flexLink(app, kind):
               """Produce documentation links that are heavily dependent on the back-end.
          @@ -1175,7 +1175,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def header(app, allMeta=False):
               """Generate a colophon of the app.
          @@ -1285,7 +1285,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def linksApi(app, silent=SILENT_D):
               """Produce the link API.
          @@ -1468,7 +1468,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def outLink(
               text, href, title=None, passage=None, clsName=None, target="_blank", asHtml=True
          @@ -1540,7 +1540,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def provenanceLink(
               backend, org, repo, version, branch, commit, local, release, relative
          @@ -1627,7 +1627,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def showProvenance(app, jobName="program code", author="program author"):
               """Shows the provenance that is normally displayed during data loading.
          @@ -1710,7 +1710,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def webLink(
               app, n, text=None, clsName=None, urlOnly=False, _asString=False, _noUrl=False
          diff --git a/tf/advanced/options.html b/tf/advanced/options.html
          index 1d43d3897..d01866d16 100644
          --- a/tf/advanced/options.html
          +++ b/tf/advanced/options.html
          @@ -392,7 +392,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          """
           # Display Settings.
          @@ -1144,7 +1144,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Options:
               def __init__(self, app):
          @@ -1327,7 +1327,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def check(self, msg, options):
               app = self.app
          @@ -1389,7 +1389,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def consume(self, options, *remove):
               return {o: options[o] for o in options if o not in remove}
          @@ -1403,7 +1403,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def distill(self, options):
               defaults = self.defaults
          @@ -1428,7 +1428,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def normalize(self, option, value):
               app = self.app
          @@ -1493,7 +1493,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def reset(self, *options):
               app = self.app
          @@ -1521,7 +1521,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def setup(self, *options, **overrides):
               app = self.app
          @@ -1549,7 +1549,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          class OptionsCurrent:
               def __init__(self, options):
          @@ -1574,7 +1574,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def get(self, k, v=None):
               return getattr(self, k, v)
          @@ -1588,7 +1588,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def set(self, k, v):
               self.allKeys.add(k)
          diff --git a/tf/advanced/render.html b/tf/advanced/render.html
          index e943e5a2b..7117dd684 100644
          --- a/tf/advanced/render.html
          +++ b/tf/advanced/render.html
          @@ -45,7 +45,7 @@ 

          Information shielding

          Expand source code -Browse git +Browse git
          """
           # Render
          @@ -798,7 +798,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def render(app, isPretty, n, _inTuple, _asString, explain, **options):
               """Renders a node, in plain or pretty mode.
          diff --git a/tf/advanced/repo.html b/tf/advanced/repo.html
          index 2fcf58eb3..4da0b7b2a 100644
          --- a/tf/advanced/repo.html
          +++ b/tf/advanced/repo.html
          @@ -295,7 +295,7 @@ 

          Updating a corpus that you alre
          Expand source code -Browse git +Browse git
          """
           # Auto downloading from a back-end repository
          @@ -2529,7 +2529,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def GLPERS(backend):
               return f"GL_{SHELL_VAR_RE.sub('_', backend.upper())}_PERS"
          @@ -2543,7 +2543,7 @@

          Functions

          Expand source code -Browse git +Browse git
          def bumpRelease(latestR, increase):
               if latestR:
          @@ -2581,7 +2581,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def catchRemaining(e):
               eType = type(e)
          @@ -2701,7 +2701,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def checkoutRepo(
               backend,
          @@ -2884,7 +2884,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getFinalUrl(url):
               finalUrl = None
          @@ -2941,7 +2941,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def publishRelease(app, increase, message=None, description=None):
               """Publishes a new data release for a TF dataset to GitHub.
          @@ -3120,7 +3120,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def releaseData(
               backend,
          @@ -3187,7 +3187,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Checkout:
               """Auxiliary class for `checkoutRepo`"""
          @@ -4272,7 +4272,7 @@ 

          Static methods

          Expand source code -Browse git +Browse git
          @staticmethod
           def fromString(string):
          @@ -4309,7 +4309,7 @@ 

          Static methods

          Expand source code -Browse git +Browse git
          @staticmethod
           def retrieve(url):
          @@ -4340,7 +4340,7 @@ 

          Static methods

          Expand source code -Browse git +Browse git
          @staticmethod
           def toString(commit, release, local, backend, source=None, dest=None):
          @@ -4383,7 +4383,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def connect(self):
               conn = self.conn
          @@ -4457,7 +4457,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def display(self, msg, msgPlain):
               inNb = self.inNb
          @@ -4477,7 +4477,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def download(self):
               cChk = self.commitChk
          @@ -4502,7 +4502,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def downloadCommit(self, commit, showErrors=True):
               c = self.getCommitObj(commit)
          @@ -4526,7 +4526,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def downloadComplete(self):
               ssl._create_default_https_context = ssl._create_unverified_context
          @@ -4615,7 +4615,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def downloadDir(self, commit, exclude=None, showErrors=False):
               g = self.repoOnline
          @@ -4709,7 +4709,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def downloadRelease(self, release, showErrors=True):
               cChk = self.commitChk
          @@ -4763,7 +4763,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def downloadZip(self, where, shiftUp=False, commit=None, showErrors=True):
               # commit parameter only supported for GitLab
          @@ -4904,7 +4904,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def error(self, msg, newline=True):
               console(msg, error=True, newline=newline)
          @@ -4918,7 +4918,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def fetchInfo(self):
               if self.isOffline():
          @@ -4956,7 +4956,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fixInfo(self):
               sDir = self.dirPathLocal
          @@ -4980,7 +4980,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getCommit(self, commit):
               c = self.getCommitObj(commit)
          @@ -4997,7 +4997,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getCommitFromObj(self, c):
               g = self.repoOnline
          @@ -5017,7 +5017,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getCommitObj(self, commit):
               g = self.repoOnline
          @@ -5070,7 +5070,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getRelease(self, release, showErrors=True):
               r = self.getReleaseObj(release, showErrors=showErrors)
          @@ -5087,7 +5087,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getReleaseFromObj(self, r):
               g = self.repoOnline
          @@ -5114,7 +5114,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getReleaseObj(self, release, showErrors=True):
               g = self.repoOnline
          @@ -5164,7 +5164,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def info(self, msg, newline=True):
               silent = self.silent
          @@ -5180,7 +5180,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def isClone(self):
               return self.local == "clone"
          @@ -5194,7 +5194,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def isExpress(self):
               return (
          @@ -5213,7 +5213,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def isOffline(self):
               return self.local in {"clone", "local"}
          @@ -5227,7 +5227,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def login(self):
               onGithub = self.onGithub
          @@ -5309,7 +5309,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeSureLocal(self, attempt=False):
               _browse = self._browse
          @@ -5517,7 +5517,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def possibleError(self, msg, showErrors, again=False, indent="\t", newline=False):
               if showErrors:
          @@ -5536,7 +5536,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def readInfo(self):
               if fileExists(self.filePathLocal):
          @@ -5558,7 +5558,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def warning(self, msg, newline=True):
               silent = self.silent
          @@ -5574,7 +5574,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def writeInfo(self, release=None, commit=None):
               releaseOff = self.releaseOff if release is None else release
          @@ -5598,7 +5598,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          class Repo:
               """Auxiliary class for `releaseData`"""
          @@ -5885,7 +5885,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def bumpRelease(self):
               increase = self.increase
          @@ -5903,7 +5903,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def connect(self):
               backend = self.backend
          @@ -5970,7 +5970,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def error(self, msg, newline=True):
               console(msg, error=True, newline=newline)
          @@ -5984,7 +5984,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def fetchInfo(self):
               g = self.repoOnline
          @@ -6010,7 +6010,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getCommit(self):
               c = self.getCommitObj()
          @@ -6027,7 +6027,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getCommitObj(self):
               g = self.repoOnline
          @@ -6056,7 +6056,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getRelease(self):
               r = self.getReleaseObj()
          @@ -6073,7 +6073,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getReleaseObj(self):
               g = self.repoOnline
          @@ -6101,7 +6101,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def info(self, msg, newline=True):
               silent = self.silent
          @@ -6117,7 +6117,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeRelease(self):
               g = self.repoOnline
          @@ -6156,7 +6156,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeZip(self):
               source = self.source
          @@ -6193,7 +6193,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def newRelease(self):
               if not self.makeZip():
          @@ -6229,7 +6229,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def uploadZip(self):
               newTag = self.newTag
          @@ -6268,7 +6268,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def warning(self, msg, newline=True):
               silent = self.silent
          diff --git a/tf/advanced/search.html b/tf/advanced/search.html
          index 1d782a944..497406287 100644
          --- a/tf/advanced/search.html
          +++ b/tf/advanced/search.html
          @@ -32,7 +32,7 @@ 

          Module tf.advanced.search

          Expand source code -Browse git +Browse git
          """
           Calls from the advanced API to the Search API.
          @@ -315,7 +315,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getQueryFeatures(exe):
               qnodes = getattr(exe, "qnodes", [])
          @@ -355,7 +355,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def runSearch(app, query, cache):
               """A wrapper around the generic search interface of TF.
          @@ -424,7 +424,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def runSearchCondensed(app, query, cache, condenseType):
               """A wrapper around the generic search interface of TF.
          @@ -544,7 +544,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def search(
               app, query, silent=SILENT_D, sets=None, shallow=False, sort=True, limit=None
          @@ -708,7 +708,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def searchApi(app):
               app.search = types.MethodType(search, app)
          diff --git a/tf/advanced/sections.html b/tf/advanced/sections.html index 8b2d52d2c..625fbb7f2 100644 --- a/tf/advanced/sections.html +++ b/tf/advanced/sections.html @@ -49,7 +49,7 @@

          Structure

          Expand source code -Browse git +Browse git
          """Section
           
          @@ -312,7 +312,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def nodeFromSectionStr(app, sectionStr, lang="en"):
               """Find the node of a section string.
          @@ -430,7 +430,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def sectionStrFromNode(app, n, lang="en", lastSlot=False, fillup=False):
               """The heading of a section to which a node belongs.
          @@ -483,7 +483,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def sectionsApi(app):
               app.nodeFromSectionStr = types.MethodType(nodeFromSectionStr, app)
          @@ -509,7 +509,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def structureStrFromNode(app, n):
               """The heading of a structure to which a node belongs.
          diff --git a/tf/advanced/settings.html b/tf/advanced/settings.html
          index 1feb7f755..427e3ffc1 100644
          --- a/tf/advanced/settings.html
          +++ b/tf/advanced/settings.html
          @@ -844,7 +844,7 @@ 

          writing

          Expand source code -Browse git +Browse git
          """
           # App settings
          @@ -2862,7 +2862,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def DOC_DEFAULTS(backend):
               return (
          @@ -2886,7 +2886,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def compileFormatCls(app, specs, givenStyles):
               api = app.api
          @@ -2930,7 +2930,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getDataDefaults(app, cfg, dKey, withApi):
               checker = Check(app, withApi)
          @@ -2993,7 +2993,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getLevel(defaultLevel, givenInfo, isVerse):
               level = givenInfo.get("level", defaultLevel)
          @@ -3013,7 +3013,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getTypeDefaults(app, cfg, dKey, withApi):
               if not withApi:
          @@ -3336,7 +3336,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def setAppSpecs(app, cfg, reset=False):
               backend = app.backend
          @@ -3440,7 +3440,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def setAppSpecsApi(app, cfg):
               api = app.api
          @@ -3519,7 +3519,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def showContext(app, *keys, withComputed=True, asHtml=False):
               """Shows the *context* of the app `tf.advanced.app.App.context` in a pretty way.
          @@ -3585,7 +3585,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class AppCurrent:
               def __init__(self, specs):
          @@ -3615,7 +3615,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def get(self, k, v):
               return getattr(self, k, v)
          @@ -3629,7 +3629,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def set(self, k, v):
               self.allKeys.add(k)
          @@ -3644,7 +3644,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def update(self, specs):
               allKeys = self.allKeys
          @@ -3664,7 +3664,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          class Check:
               def __init__(self, app, withApi):
          @@ -3867,7 +3867,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def checkGroup(self, cfg, defaults, dKey, postpone=set(), extra=None):
               self.cfg = cfg
          @@ -3895,7 +3895,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def checkItem(self, cfg, dKey):
               self.cfg = cfg
          @@ -3915,7 +3915,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def checkSetting(self, k, v, extra=None):
               app = self.app
          @@ -4074,7 +4074,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def report(self):
               errors = self.errors
          diff --git a/tf/advanced/tables.html b/tf/advanced/tables.html
          index 09d55be9f..e2b67227d 100644
          --- a/tf/advanced/tables.html
          +++ b/tf/advanced/tables.html
          @@ -31,7 +31,7 @@ 

          Module tf.advanced.tables

          Expand source code -Browse git +Browse git
          from ..core.text import DEFAULT_FORMAT
           from .helpers import getHeaders, RESULT
          @@ -416,7 +416,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def compose(
               app,
          @@ -542,7 +542,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def composeP(
               app,
          @@ -651,7 +651,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def composeT(
               app,
          diff --git a/tf/advanced/text.html b/tf/advanced/text.html
          index dd015f3fb..e450ecf94 100644
          --- a/tf/advanced/text.html
          +++ b/tf/advanced/text.html
          @@ -31,7 +31,7 @@ 

          Module tf.advanced.text

          Expand source code -Browse git +Browse git
          import types
           from textwrap import dedent
          @@ -199,7 +199,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def showFormats(app):
               inNb = app.inNb
          @@ -253,7 +253,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def specialCharacters(app, fmt=None, _browse=False):
               """Generate a widget for hard to type characters.
          @@ -349,7 +349,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def textApi(app):
               api = app.api
          diff --git a/tf/advanced/unravel.html b/tf/advanced/unravel.html
          index 46ec21aff..bec97a13e 100644
          --- a/tf/advanced/unravel.html
          +++ b/tf/advanced/unravel.html
          @@ -35,7 +35,7 @@ 

          Unravel

          Expand source code -Browse git +Browse git
          """
           # Unravel
          @@ -746,7 +746,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def unravel(app, n, isPlain=True, _inTuple=False, explain=False, **options):
               """Unravels a node and its graph-neighbourhood into a tree of fragments.
          @@ -801,7 +801,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class NodeProps:
               """Node properties during plain() or pretty().
          @@ -894,7 +894,7 @@ 

          Instance variables

          Expand source code -Browse git +Browse git
          class OuterSettings:
               """Common properties during plain() and pretty().
          @@ -976,7 +976,7 @@ 

          Instance variables

          Expand source code -Browse git +Browse git
          class TreeInfo:
               """Tree properties during plain() or pretty().
          @@ -1004,7 +1004,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def get(self, k, v):
               return getattr(self, k, v)
          @@ -1018,7 +1018,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def update(self, **specs):
               for (k, v) in specs.items():
          diff --git a/tf/advanced/volumes.html b/tf/advanced/volumes.html
          index 7c7b2f304..0a4fadcb3 100644
          --- a/tf/advanced/volumes.html
          +++ b/tf/advanced/volumes.html
          @@ -32,7 +32,7 @@ 

          Module tf.advanced.volumes

          Expand source code -Browse git +Browse git
          """
           Produce links to TF data and links from nodes to web resources.
          @@ -141,7 +141,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def collect(app, *args, **kwargs):
               """Calls `tf.fabric.Fabric.collect` from an app object."""
          @@ -161,7 +161,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def extract(app, *args, **kwargs):
               """Calls `tf.fabric.Fabric.extract` from an app object."""
          @@ -189,7 +189,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getVolumes(app, *args, **kwargs):
               """Calls `tf.fabric.Fabric.getVolumes` from an app object.
          @@ -229,7 +229,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def volumesApi(app):
               """Produce the volume support functions API.
          diff --git a/tf/advanced/zipdata.html b/tf/advanced/zipdata.html
          index 9d70f0418..df81612d2 100644
          --- a/tf/advanced/zipdata.html
          +++ b/tf/advanced/zipdata.html
          @@ -31,7 +31,7 @@ 

          Module tf.advanced.zipdata

          Expand source code -Browse git +Browse git
          import sys
           import types
          @@ -473,7 +473,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def addCheckout(path):
               release = None
          @@ -512,7 +512,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def collectFiles(base, path, results, zipBase=None):
               if zipBase is None:
          @@ -560,7 +560,7 @@ 

          EFFECT

          Expand source code -Browse git +Browse git
          def main(cargs=sys.argv):
               if len(cargs) < 2 or any(
          @@ -640,7 +640,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def zipAll(app):
               """Gathers all data for a TF resource and zips it into one file.
          @@ -781,7 +781,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def zipApi(app):
               """Produce the zip creation API.
          @@ -827,7 +827,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def zipData(
               backend,
          @@ -956,7 +956,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def zipDataPart(source, results):
               if not dirExists(source):
          diff --git a/tf/app.html b/tf/app.html
          index 4efd520bf..87fb14220 100644
          --- a/tf/app.html
          +++ b/tf/app.html
          @@ -39,7 +39,7 @@ 

          Module tf.app

          Expand source code -Browse git +Browse git
          """
           Make use of a corpus.
          @@ -137,7 +137,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def use(appName, *args, backend=None, **kwargs):
               """Make use of a corpus.
          diff --git a/tf/browser/command.html b/tf/browser/command.html
          index e8af68296..d5bd6404a 100644
          --- a/tf/browser/command.html
          +++ b/tf/browser/command.html
          @@ -32,7 +32,7 @@ 

          Module tf.browser.command

          Expand source code -Browse git +Browse git
          """
           Command-line argument processing
          @@ -156,7 +156,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def argApp(cargs, simple):
               (appName, checkoutApp, dataLoc) = argParam(cargs)
          @@ -212,7 +212,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def argNoweb(cargs):
               for arg in cargs:
          @@ -229,7 +229,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def argParam(cargs):
               appName = None
          @@ -269,7 +269,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getPort(slug):
               portOffset = crc32(slug.encode("utf8")) % 10000
          diff --git a/tf/browser/html.html b/tf/browser/html.html
          index 6a1c2d612..3ddabf4e3 100644
          --- a/tf/browser/html.html
          +++ b/tf/browser/html.html
          @@ -34,7 +34,7 @@ 

          Module tf.browser.html

          Expand source code -Browse git +Browse git
          """HTML generation done in the Pythonic way.
           
          @@ -223,7 +223,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dig(*content, sep=""):
               """A method to join nested iterables of strings into a string.
          @@ -274,7 +274,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def elemFunc(close, elem):
               """Generates a function to serialize a specific HTML element.
          @@ -330,7 +330,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def generate(close, tag, *content, **atts):
               """Transform the logical information for an HTML element into an HTML string.
          @@ -384,7 +384,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class H:
               """Provider of HTML serializing functions per element type.
          @@ -413,7 +413,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -427,7 +427,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def result(**atts):
               return generate(close, elem, **atts)
          @@ -441,7 +441,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -455,7 +455,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -469,7 +469,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -483,7 +483,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -497,7 +497,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -511,7 +511,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def result(**atts):
               return generate(close, elem, **atts)
          @@ -537,7 +537,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def dig(*content, sep=""):
               """A method to join nested iterables of strings into a string.
          @@ -575,7 +575,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -589,7 +589,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -603,7 +603,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -617,7 +617,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -631,7 +631,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          @@ -645,7 +645,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def result(*content, **atts):
               return generate(close, elem, *content, **atts)
          diff --git a/tf/browser/index.html b/tf/browser/index.html index 192dd42b2..96d483daa 100644 --- a/tf/browser/index.html +++ b/tf/browser/index.html @@ -32,7 +32,7 @@

          Local TF data and web server

          Expand source code -Browse git +Browse git
          """
           # Local TF data and web server
          diff --git a/tf/browser/kernel.html b/tf/browser/kernel.html
          index 79b332712..4107ce18f 100644
          --- a/tf/browser/kernel.html
          +++ b/tf/browser/kernel.html
          @@ -38,7 +38,7 @@ 

          Kernel API

          Expand source code -Browse git +Browse git
          """
           # TF kernel
          @@ -446,6 +446,7 @@ 

          Kernel API

          condenseType = dContext.condenseType sectionResults = [] + if sections: sectionLines = sections.split("\n") for sectionLine in sectionLines: @@ -453,9 +454,11 @@

          Kernel API

          node = app.nodeFromSectionStr(sectionLine) if type(node) is int: sectionResults.append((node,)) + sectionResults = tuple(sectionResults) tupleResults = () + if tuples: tupleLines = tuples.split("\n") try: @@ -470,6 +473,7 @@

          Kernel API

          queryResults = () queryMessages = ("", "") features = () + if query: ( queryResults, @@ -492,18 +496,19 @@

          Kernel API

          queryStatus = queryStatus[0] and queryStatus[1] queryStatusC = queryStatusC[0] and queryStatusC[1] + if not queryStatus: queryResults = () if not queryStatusC: queryResultsC = () - csvs = ( + csvData = ( ("sections", sectionResults), ("nodes", tupleResults), ("results", queryResults), ) if condensed and condenseType: - csvs += ((f"resultsBy{condenseType}", queryResultsC),) + csvData += ((f"resultsBy{condenseType}", queryResultsC),) tupleResultsX = getRowsX( app, @@ -515,14 +520,14 @@

          Kernel API

          queryResultsX = getRowsX( app, queryResults, - features, + nodeFeatures, condenseType, fmt=fmt, ) return ( queryStatus, " ".join(queryMessages[0]), - csvs, + csvData, tupleResultsX, queryResultsX, ) @@ -545,7 +550,7 @@

          Functions

          Expand source code -Browse git +Browse git
          def makeTfKernel(app, appName):
               if not app.api:
          @@ -927,6 +932,7 @@ 

          Functions

          condenseType = dContext.condenseType sectionResults = [] + if sections: sectionLines = sections.split("\n") for sectionLine in sectionLines: @@ -934,9 +940,11 @@

          Functions

          node = app.nodeFromSectionStr(sectionLine) if type(node) is int: sectionResults.append((node,)) + sectionResults = tuple(sectionResults) tupleResults = () + if tuples: tupleLines = tuples.split("\n") try: @@ -951,6 +959,7 @@

          Functions

          queryResults = () queryMessages = ("", "") features = () + if query: ( queryResults, @@ -973,18 +982,19 @@

          Functions

          queryStatus = queryStatus[0] and queryStatus[1] queryStatusC = queryStatusC[0] and queryStatusC[1] + if not queryStatus: queryResults = () if not queryStatusC: queryResultsC = () - csvs = ( + csvData = ( ("sections", sectionResults), ("nodes", tupleResults), ("results", queryResults), ) if condensed and condenseType: - csvs += ((f"resultsBy{condenseType}", queryResultsC),) + csvData += ((f"resultsBy{condenseType}", queryResultsC),) tupleResultsX = getRowsX( app, @@ -996,14 +1006,14 @@

          Functions

          queryResultsX = getRowsX( app, queryResults, - features, + nodeFeatures, condenseType, fmt=fmt, ) return ( queryStatus, " ".join(queryMessages[0]), - csvs, + csvData, tupleResultsX, queryResultsX, ) diff --git a/tf/browser/ner/annotate.html b/tf/browser/ner/annotate.html index d355f8fc5..3b6f64215 100644 --- a/tf/browser/ner/annotate.html +++ b/tf/browser/ner/annotate.html @@ -100,7 +100,7 @@

          Module tf.browser.ner.annotate

          Expand source code -Browse git +Browse git
          """Central Annotation object.
           
          @@ -555,7 +555,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Annotate(Sets, Show):
               def __init__(self, app, data=None, browse=False):
          @@ -985,7 +985,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def filterContent(
               self,
          @@ -1252,7 +1252,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def findOccs(self, qTokenSet=set()):
               """Finds the occurrences of multiple sequences of tokens.
          diff --git a/tf/browser/ner/corpus.html b/tf/browser/ner/corpus.html
          index d45d1069f..579d677b0 100644
          --- a/tf/browser/ner/corpus.html
          +++ b/tf/browser/ner/corpus.html
          @@ -39,7 +39,7 @@ 

          Module tf.browser.ner.corpus

          Expand source code -Browse git +Browse git
          """Access to the corpus.
           
          @@ -431,7 +431,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Corpus(Settings):
               def __init__(self):
          diff --git a/tf/browser/ner/data.html b/tf/browser/ner/data.html
          index a8daf4a0a..f95af406e 100644
          --- a/tf/browser/ner/data.html
          +++ b/tf/browser/ner/data.html
          @@ -43,7 +43,7 @@ 

          Module tf.browser.ner.data

          Expand source code -Browse git +Browse git
          """Annotation data module.
           
          @@ -1022,7 +1022,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Data(Corpus):
               def __init__(self, data=None):
          @@ -1973,7 +1973,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def addEntities(self, newEntities, silent=True):
               """Add multiple entities efficiently to the current set.
          @@ -2081,7 +2081,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def addEntity(self, vals, allMatches, silent=True):
               """Add entity occurrences to the current set.
          @@ -2198,7 +2198,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def addEntityRich(self, additions, buckets, excludedTokens=set()):
               """Add specified entity occurrences to the current set.
          @@ -2355,7 +2355,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def delEntity(self, vals, allMatches=None, silent=True):
               """Delete entity occurrences from the current set.
          @@ -2474,7 +2474,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def delEntityRich(self, deletions, buckets, excludedTokens=set()):
               """Delete specified entity occurrences from the current set.
          @@ -2625,7 +2625,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def fromSource(self):
               """Loads annotation data from source.
          @@ -2733,7 +2733,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def loadData(self):
               """Loads data of the current annotation set into memory.
          @@ -2779,7 +2779,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def mergeEntities(self, newEntities):
               """Performs additions to the current annotation set.
          @@ -2871,7 +2871,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def process(self, changed):
               """Generated derived data structures out of the source data.
          @@ -3055,7 +3055,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def saveEntitiesAs(self, dataFile):
               """Export the data of an annotation set to a file.
          @@ -3095,7 +3095,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def weedEntities(self, delEntities):
               """Performs deletions to the current annotation set.
          diff --git a/tf/browser/ner/form.html b/tf/browser/ner/form.html
          index e1572eb45..29437a4e4 100644
          --- a/tf/browser/ner/form.html
          +++ b/tf/browser/ner/form.html
          @@ -37,7 +37,7 @@ 

          Module tf.browser.ner.form

          Expand source code -Browse git +Browse git
          """Machinery for request reading.
           
          @@ -228,7 +228,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Form:
               def __init__(
          @@ -383,7 +383,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fget2(self, k):
               """Makes form value under key `k` or its default into an boolean."""
          @@ -399,7 +399,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fget3(self, k):
               """Makes form value under key `k` or its default into a 3-way boolean."""
          @@ -415,7 +415,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fgeti(self, k):
               """Makes form value under key `k` or its default into an integer."""
          @@ -433,7 +433,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fgetj(self, k):
               """Makes form value under key `k` or its default into a data structure.
          @@ -457,7 +457,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fgets(self, k):
               """Makes form value under key `k` or its default into an string."""
          @@ -476,7 +476,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fgetsi(self, k):
               """Makes form value under key `k` or its default into a set.
          @@ -503,7 +503,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fgettu(self, k):
               """Makes form value under key `k` or its default into a tuple.
          @@ -530,7 +530,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def fill(self):
               """Fill a dictionary with interpreted form values.
          diff --git a/tf/browser/ner/fragments.html b/tf/browser/ner/fragments.html
          index a02857ff8..1aa02ddb3 100644
          --- a/tf/browser/ner/fragments.html
          +++ b/tf/browser/ner/fragments.html
          @@ -35,7 +35,7 @@ 

          Module tf.browser.ner.fragments

          Expand source code -Browse git +Browse git
          """Wraps various pieces into HTML.
           
          @@ -947,7 +947,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Fragments:
               def wrapMessages(self):
          @@ -1842,7 +1842,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapActive(self):
               """HTML for the active entity."""
          @@ -1877,7 +1877,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapAnnoSets(self):
               """HTML for the annotation set chooser.
          @@ -1991,7 +1991,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapAppearance(self):
               """HTML for the appearance widget.
          @@ -2064,7 +2064,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapEntity(self):
               """Basic data for the selected entity widget.
          @@ -2132,7 +2132,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapEntityFeats(self):
               """HTML for the entity feature value selection.
          @@ -2233,7 +2233,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapEntityHeaders(self):
               """HTML for the header of the entity table, dependent on the state of sorting."""
          @@ -2280,7 +2280,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapEntityModReport(self):
               """HTML for the combined report of add / del actions."""
          @@ -2305,7 +2305,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapEntityModify(self):
               """HTML for the add / del widget.
          @@ -2563,7 +2563,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapEntityStat(self, val, feat):
               """HTML for statistics of feature values.
          @@ -2596,7 +2596,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapEntityText(self):
               """HTML for the selected entity widget."""
          @@ -2653,7 +2653,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapExceptions(self):
               """HTML for the select / deselect buttons.
          @@ -2709,7 +2709,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapFilter(self):
               """HTML for the filter widget.
          @@ -2796,7 +2796,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapFindStat(self):
               """HTML for statistics.
          @@ -2821,7 +2821,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapMessages(self):
               """HTML for messages."""
          @@ -2839,7 +2839,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapQuery(self):
               """HTML for all control widgets on the page."""
          @@ -2861,7 +2861,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapReport(self, report, kind):
               """HTML for the report of add / del actions."""
          @@ -2896,7 +2896,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def wrapScope(self):
               """HTML for the scope widget.
          diff --git a/tf/browser/ner/helpers.html b/tf/browser/ner/helpers.html
          index a5438cb6d..26b465bd4 100644
          --- a/tf/browser/ner/helpers.html
          +++ b/tf/browser/ner/helpers.html
          @@ -35,7 +35,7 @@ 

          Module tf.browser.ner.helpers

          Expand source code -Browse git +Browse git
          """Auxiliary functions.
           
          @@ -321,7 +321,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def findCompile(bFind, bFindC):
               """Compiles a regular expression out of a search pattern.
          @@ -371,7 +371,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeCss(features, keywordFeatures):
               """Generates CSS for the tool.
          @@ -440,7 +440,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def normalize(text):
               """Normalize white-space in a text."""
          @@ -463,7 +463,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def repIdent(features, vals, active=""):
               """Represents an identifier in HTML.
          @@ -498,7 +498,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def repSummary(keywordFeatures, vals, active=""):
               """Represents an keyword value in HTML.
          @@ -532,7 +532,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def toAscii(text):
               """Transforms a text with diacritical marks into a plain ASCII text.
          @@ -558,7 +558,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def toId(text):
               """Transforms text to an identifier string.
          @@ -581,7 +581,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def toSmallId(text, transform={}):
               """Transforms text to a smaller identifier string.
          @@ -628,7 +628,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def toTokens(text, spaceEscaped=False):
               """Split a text into tokens.
          @@ -654,7 +654,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def valRep(features, fVals):
               """HTML representation of an entity as a sequence of `feat=val` strings."""
          diff --git a/tf/browser/ner/match.html b/tf/browser/ner/match.html
          index e826dbab4..96afef070 100644
          --- a/tf/browser/ner/match.html
          +++ b/tf/browser/ner/match.html
          @@ -34,7 +34,7 @@ 

          Module tf.browser.ner.match

          Expand source code -Browse git +Browse git
          """Match functions.
           
          @@ -331,7 +331,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def entityMatch(
               entityIndex,
          @@ -545,7 +545,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def occMatch(getTokens, b, qTokenSet, results):
               """Finds the occurrences of multiple sequences of tokens in a single bucket.
          diff --git a/tf/browser/ner/ner.html b/tf/browser/ner/ner.html
          index d6f955991..53079316c 100644
          --- a/tf/browser/ner/ner.html
          +++ b/tf/browser/ner/ner.html
          @@ -196,7 +196,7 @@ 

          Inspection

          Expand source code -Browse git +Browse git
          """API for rule-based entity marking.
           
          @@ -749,7 +749,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class NER(Annotate):
               def __init__(self, app):
          @@ -1077,7 +1077,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeInventory(self):
               """Explores the corpus for the surface forms mentioned in the instructions.
          @@ -1118,7 +1118,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def markEntities(self):
               """Marks up the members of the inventory as entities.
          @@ -1195,7 +1195,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def readInstructions(self, sheetName, force=False):
               """Reads an Excel or YAML file with entity recognition instructions.
          @@ -1369,7 +1369,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def showInventory(self):
               """Shows the inventory.
          diff --git a/tf/browser/ner/request.html b/tf/browser/ner/request.html
          index 7b5a86201..d6b709351 100644
          --- a/tf/browser/ner/request.html
          +++ b/tf/browser/ner/request.html
          @@ -34,7 +34,7 @@ 

          Module tf.browser.ner.request

          Expand source code -Browse git +Browse git
          """Auxiliary functions for managing request data.
           
          @@ -375,7 +375,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Request(Form):
               def __init__(self):
          @@ -693,7 +693,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def adaptValSelect(self):
               """Adapts the values contained in `valSelect` after a modification action.
          @@ -754,7 +754,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def findSetup(self):
               """Compiles the filter pattern into a regular expression.
          @@ -803,7 +803,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getFormData(self):
               """Get form data.
          @@ -885,7 +885,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def initVars(self):
               """Initializes the computation of the new page.
          diff --git a/tf/browser/ner/serve.html b/tf/browser/ner/serve.html
          index 31973f27d..316fe66d6 100644
          --- a/tf/browser/ner/serve.html
          +++ b/tf/browser/ner/serve.html
          @@ -36,7 +36,7 @@ 

          Module tf.browser.ner.serve

          Expand source code -Browse git +Browse git
          """Main controller for Flask
           
          @@ -403,7 +403,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def serveNer(web):
               """Main controller to render a full page.
          @@ -435,7 +435,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def serveNerContext(web, node):
               """Controller to render a portion of a page.
          @@ -477,7 +477,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Serve(Request, Fragments):
               def __init__(self, web):
          @@ -796,7 +796,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def actionsFull(self):
               """Carries out requested actions before building the full page.
          @@ -822,7 +822,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def actionsLean(self, node):
               """Carries out requested actions before building a portion of the page.
          @@ -864,7 +864,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getBuckets(self, noFind=False, node=None):
               """Fetch a selection of buckets from the corpus.
          @@ -951,7 +951,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setHandling(self):
               """Carries out the set-related actions before composing the page.
          @@ -1014,7 +1014,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setupFull(self):
               """Prepares to serve a complete page.
          @@ -1043,7 +1043,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setupLean(self):
               """Prepares to update a portion of the page.
          @@ -1068,7 +1068,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def updateHandling(self):
               """Carries out modification actions in the current annotation set.
          @@ -1141,7 +1141,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def wrapFull(self):
               """Builds the full page.
          @@ -1187,7 +1187,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def wrapLean(self):
               """Builds a portion of the page.
          diff --git a/tf/browser/ner/sets.html b/tf/browser/ner/sets.html
          index 412380537..55f76887a 100644
          --- a/tf/browser/ner/sets.html
          +++ b/tf/browser/ner/sets.html
          @@ -36,7 +36,7 @@ 

          Module tf.browser.ner.sets

          Expand source code -Browse git +Browse git
          """Annotation set management.
           
          @@ -372,7 +372,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Sets(Data):
               def __init__(self, data=None):
          @@ -685,7 +685,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getSetData(self):
               """Deliver the data of the current set.
          @@ -706,7 +706,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def resetSet(self):
               """Clear the current annotation set.
          @@ -760,7 +760,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setDel(self, delSet):
               """Remove a named set.
          @@ -823,7 +823,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setDup(self, dupSet):
               """Duplicates the current set to a set with a new name.
          @@ -900,7 +900,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setMove(self, moveSet):
               """Renames a named set.
          @@ -970,7 +970,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setSet(self, newAnnoSet):
               """Switch to a named annotation set.
          diff --git a/tf/browser/ner/settings.html b/tf/browser/ner/settings.html
          index 3d4b62a83..02edef16c 100644
          --- a/tf/browser/ner/settings.html
          +++ b/tf/browser/ner/settings.html
          @@ -34,7 +34,7 @@ 

          Module tf.browser.ner.settings

          Expand source code -Browse git +Browse git
          """Corpus dependent setup of the annotation tool.
           
          @@ -393,7 +393,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Settings:
               def __init__(self):
          @@ -455,7 +455,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def console(self, msg, **kwargs):
               """Print something to the output.
          diff --git a/tf/browser/ner/show.html b/tf/browser/ner/show.html
          index 899c38e49..9a1f9aa8f 100644
          --- a/tf/browser/ner/show.html
          +++ b/tf/browser/ner/show.html
          @@ -34,7 +34,7 @@ 

          Module tf.browser.ner.show

          Expand source code -Browse git +Browse git
          """Rendering of corpus extracts with annotations.
           
          @@ -449,7 +449,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Show:
               def showEntityOverview(self):
          @@ -888,7 +888,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def showContent(
               self,
          @@ -1159,7 +1159,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def showEntities(
               self, activeEntity=None, sortKey=None, sortDir=None, cutOffFreq=None
          @@ -1297,7 +1297,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def showEntityOverview(self):
               """Generates HTML for an overview of the entities.
          diff --git a/tf/browser/ner/web.html b/tf/browser/ner/web.html
          index 2d8f05c3b..71783846e 100644
          --- a/tf/browser/ner/web.html
          +++ b/tf/browser/ner/web.html
          @@ -34,7 +34,7 @@ 

          Module tf.browser.ner.web

          Expand source code -Browse git +Browse git
          """Flask sub web app in the TF browser.
           
          @@ -169,7 +169,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def factory(web):
               """A sub web app, to be inserted into the TF browser web app.
          diff --git a/tf/browser/serve.html b/tf/browser/serve.html
          index a17f44c6a..ac1d1a0eb 100644
          --- a/tf/browser/serve.html
          +++ b/tf/browser/serve.html
          @@ -37,7 +37,7 @@ 

          Dress TF nodes up for serving
          Expand source code -Browse git +Browse git
          """
           # Dress TF nodes up for serving on the web
          @@ -342,6 +342,7 @@ 

          Dress TF nodes up for serving tupleResultsX = None queryResultsX = None messages = "" + if task in wildQueries: messages = ( f"Aborted because query is known to take longer than {TIMEOUT} second" @@ -530,7 +531,7 @@

          Functions

          Expand source code -Browse git +Browse git
          def serveAll(web, anything):
               aContext = web.context
          @@ -661,7 +662,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def serveDownload(web, jobOnly):
               aContext = web.context
          @@ -699,6 +700,7 @@ 

          Functions

          tupleResultsX = None queryResultsX = None messages = "" + if task in wildQueries: messages = ( f"Aborted because query is known to take longer than {TIMEOUT} second" @@ -759,7 +761,7 @@

          Functions

          Expand source code -Browse git +Browse git
          def serveExport(web):
               aContext = web.context
          @@ -833,7 +835,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def servePassage(web, getx=None):
               kernelApi = web.kernelApi
          @@ -883,7 +885,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def serveQuery(web, getx=None, asDict=False):
               kernelApi = web.kernelApi
          @@ -976,7 +978,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def serveTable(web, kind, getx=None, asDict=False):
               kernelApi = web.kernelApi
          diff --git a/tf/browser/servelib.html b/tf/browser/servelib.html
          index 268361ee2..8cd33e425 100644
          --- a/tf/browser/servelib.html
          +++ b/tf/browser/servelib.html
          @@ -39,7 +39,7 @@ 

          About

          Expand source code -Browse git +Browse git
          """
           # Common Server Related Functions
          @@ -320,7 +320,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def batchAround(nResults, position, batch):
               halfBatch = int((batch + 1) / 2)
          @@ -342,7 +342,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getAbout(colophon, header, provenance, form):
               return f"""
          @@ -396,7 +396,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getFormData(interfaceDefaults):
               """Get form data.
          @@ -557,7 +557,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getInt(x, default=1):
               if len(x) > 15:
          @@ -575,7 +575,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def zipTables(csvs, tupleResultsX, queryResultsX, about, form):
               appName = form["appName"]
          diff --git a/tf/browser/start.html b/tf/browser/start.html
          index 4aede099c..1e4c6f970 100644
          --- a/tf/browser/start.html
          +++ b/tf/browser/start.html
          @@ -89,7 +89,7 @@ 

          Implementation notes

          Expand source code -Browse git +Browse git
          """
           # Start the TF browser
          @@ -368,7 +368,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def bMsg(url):
               return f"\n\tOpen a webbrowser and navigate to url {url}\n"
          @@ -382,7 +382,7 @@

          Functions

          Expand source code -Browse git +Browse git
          def main(cargs=sys.argv[1:]):
               console(BANNER)
          @@ -441,7 +441,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def startBrowser(url, forceChrome, debug):
               opened = False
          diff --git a/tf/browser/web.html b/tf/browser/web.html
          index 78e4e5b54..387f907f6 100644
          --- a/tf/browser/web.html
          +++ b/tf/browser/web.html
          @@ -114,7 +114,7 @@ 

          JavaScript

          Expand source code -Browse git +Browse git
          """
           # Web interface
          @@ -407,7 +407,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def factory(web):
               app = Flask(__name__)
          @@ -495,7 +495,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def runWeb(webapp, debug, portWeb):
               run_simple(
          @@ -519,7 +519,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def setup(debug, *args):
               appSpecs = argApp(args, False)
          @@ -595,7 +595,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Web:
               def __init__(self, kernelApi):
          @@ -619,7 +619,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def console(self, msg):
               if self.debug:
          diff --git a/tf/browser/wrap.html b/tf/browser/wrap.html
          index fcb177c54..1f69f4020 100644
          --- a/tf/browser/wrap.html
          +++ b/tf/browser/wrap.html
          @@ -33,7 +33,7 @@ 

          Wrap material into HTML

          Expand source code -Browse git +Browse git
          """
           # Wrap material into HTML
          @@ -592,7 +592,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def pageLinks(nResults, position, spread=10):
               """Provide navigation links for results sets, big or small.
          @@ -675,7 +675,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def passageLinks(passages, sec0Type, sec0, sec1, tillLevel):
               """Provide navigation links for passages,
          @@ -728,7 +728,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def wrapColorMap(form):
               """Wraps the color map for query result highlighting into HTML.
          @@ -813,7 +813,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def wrapEColorMap(form):
               """Wraps the edge color map for edge highlighting into HTML.
          @@ -922,7 +922,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def wrapOptions(context, form):
               """Wraps the boolean options, including the app-specific ones, into HTML."""
          @@ -962,7 +962,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def wrapProvenance(form, provenance, setNames):
               utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
          @@ -1138,7 +1138,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def wrapSelect(option, allowedValues, value, group, item, multiple):
               """Provides a buttoned chooser for the node types.
          diff --git a/tf/capable.html b/tf/capable.html
          index 7ce4fae9f..de0f2e3a6 100644
          --- a/tf/capable.html
          +++ b/tf/capable.html
          @@ -86,7 +86,7 @@ 

          Optional dependencies

          Expand source code -Browse git +Browse git
          """Dependency management.
           
          @@ -493,7 +493,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Capable:
               """Import modules for back-end communication if possible.
          @@ -608,7 +608,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def can(self, extra):
               if extra in {"github", "gitlab"}:
          @@ -639,7 +639,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def load(self, module):
               modules = self.modules
          @@ -664,7 +664,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def loadFrom(self, module, *members):
               loaded = self.load(module)
          @@ -685,7 +685,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def tryImport(self, *extras):
               backendProviders = self.backendProviders
          @@ -761,7 +761,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class CheckImport:
               def __init__(self, *modules):
          @@ -952,7 +952,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def importGet(self):
               """Delivers the imported modules.
          @@ -991,7 +991,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def importOK(self, hint=False):
               """Reports the result of the import attempts.
          diff --git a/tf/cheatsheet.html b/tf/cheatsheet.html
          index 637535d1f..2a964076e 100644
          --- a/tf/cheatsheet.html
          +++ b/tf/cheatsheet.html
          @@ -1661,7 +1661,7 @@ 

          Command-line tools

          Expand source code -Browse git +Browse git
          """
           .. include:: docs/main/cheatsheet.md
          diff --git a/tf/clean.html b/tf/clean.html
          index f7e9dd024..3b3509931 100644
          --- a/tf/clean.html
          +++ b/tf/clean.html
          @@ -40,7 +40,7 @@ 

          Clean

          Expand source code -Browse git +Browse git
          """
           # Clean
          @@ -207,7 +207,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def clean(tfd=True, backend=None, dry=True, specific=None, current=False):
               """Clean up older compressed `.tfx` files.
          @@ -293,7 +293,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def err(msg):
               """Write to standard error output immediately."""
          @@ -309,7 +309,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def out(msg):
               """Write to standard normal output immediately."""
          diff --git a/tf/client/index.html b/tf/client/index.html
          index e381562e6..e12c285e1 100644
          --- a/tf/client/index.html
          +++ b/tf/client/index.html
          @@ -57,7 +57,7 @@ 

          Acknowledgments

          Expand source code -Browse git +Browse git
          """
           # Layered Search
          diff --git a/tf/client/make/build.html b/tf/client/make/build.html
          index 0d6bdd4b8..5be205648 100644
          --- a/tf/client/make/build.html
          +++ b/tf/client/make/build.html
          @@ -81,7 +81,7 @@ 

          Commands

          Expand source code -Browse git +Browse git
          """
           # Usage
          @@ -1497,7 +1497,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def console(*args, error=False):
               device = sys.stderr if error else sys.stdout
          @@ -1513,7 +1513,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def invertMap(legend):
               return (
          @@ -1533,7 +1533,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def main():
               Args = readArgsLegacy()
          @@ -1594,7 +1594,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def makeSearchClients(dataset, folder, appFolder, backend=None, dataDir=None):
               DEBUG_STATE = "off"
          @@ -1640,7 +1640,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def readArgsLegacy():
               class Args:
          @@ -1753,7 +1753,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Make:
               def __init__(
          @@ -2862,7 +2862,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def adjustDebug(self):
               C = self.C
          @@ -2894,7 +2894,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def adjustVersion(self):
               C = self.C
          @@ -2917,7 +2917,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def compress(self, data):
               sets = {}
          @@ -2944,7 +2944,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def config(self):
               C = self.C
          @@ -3220,7 +3220,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def doCommand(self, command):
               if command == "serve":
          @@ -3257,7 +3257,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def dumpConfig(self):
               C = self.C
          @@ -3283,7 +3283,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def dumpCorpus(self):
               C = self.C
          @@ -3412,7 +3412,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getAllClients(self):
               C = self.C
          @@ -3437,7 +3437,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def getDebugs(self):
               C = self.C
          @@ -3470,7 +3470,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def importMake(self, c=None):
               client = self.client
          @@ -3510,7 +3510,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def incVersion(self):
               C = self.C
          @@ -3530,7 +3530,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def loadTf(self):
               C = self.C
          @@ -3552,7 +3552,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def make(self):
               self.makeConfig()
          @@ -3586,7 +3586,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeClient(self):
               """
          @@ -3670,7 +3670,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeClientSettings(self):
               C = self.C
          @@ -3814,7 +3814,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeCombined(self):
               C = self.C
          @@ -3884,7 +3884,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeConfig(self):
               if not getattr(self, "A", None):
          @@ -3902,7 +3902,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeCorpus(self):
               if not getattr(self, "A", None):
          @@ -3929,7 +3929,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeHtml(self):
               C = self.C
          @@ -4010,7 +4010,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeLinks(self):
               C = self.C
          @@ -4041,7 +4041,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def publish(self, allClients=True):
               C = self.C
          @@ -4074,7 +4074,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def replaceDebug(self, mask, value):
               def subVersion(match):
          @@ -4091,7 +4091,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def serve(self):
               dataset = self.dataset
          @@ -4134,7 +4134,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def ship(self, publish=True):
               self.adjustVersion()
          @@ -4155,7 +4155,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def showDebug(self):
               debugInfo = self.getDebugs()
          @@ -4175,7 +4175,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def showVersion(self):
               C = self.C
          @@ -4192,7 +4192,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def zipApp(self):
               C = self.C
          diff --git a/tf/client/make/gh.html b/tf/client/make/gh.html
          index c202d271a..827c773dd 100644
          --- a/tf/client/make/gh.html
          +++ b/tf/client/make/gh.html
          @@ -31,7 +31,7 @@ 

          Module tf.client.make.gh

          Expand source code -Browse git +Browse git
          import sys
           import os
          @@ -210,7 +210,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def console(*args):
               sys.stdout.write(" ".join(args) + "\n")
          @@ -225,7 +225,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def deploy(org, repo):
               (result, error) = _ghp_import()
          diff --git a/tf/client/make/help.html b/tf/client/make/help.html
          index 33ff7848c..83005d106 100644
          --- a/tf/client/make/help.html
          +++ b/tf/client/make/help.html
          @@ -31,7 +31,7 @@ 

          Module tf.client.make.help

          Expand source code -Browse git +Browse git
          HELP = """
           tf-make [--backend={backend} {org}/{repo} serve {folder}
          diff --git a/tf/client/make/index.html b/tf/client/make/index.html
          index de21b39bf..d3cb8c967 100644
          --- a/tf/client/make/index.html
          +++ b/tf/client/make/index.html
          @@ -32,7 +32,7 @@ 

          Module tf.client.make

          Expand source code -Browse git +Browse git
          """
           The search app make program
          diff --git a/tf/convert/addnlp.html b/tf/convert/addnlp.html
          index 4e1096c1d..e25cc4b2f 100644
          --- a/tf/convert/addnlp.html
          +++ b/tf/convert/addnlp.html
          @@ -114,7 +114,7 @@ 

          Examples

          Expand source code -Browse git +Browse git
          """Add data from an NLP pipeline.
           
          @@ -1760,7 +1760,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def main():
               (good, tasks, params, flags) = readArgs("tf-addnlp", HELP, TASKS, PARAMS, FLAGS)
          @@ -1859,7 +1859,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class NLPipeline(CheckImport):
               def __init__(
          @@ -3296,7 +3296,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def generatePlain(self):
               """Generates a plain text out of a data source.
          @@ -3529,7 +3529,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getElementInfo(self, verbose=None):
               """Analyse the schema.
          @@ -3653,7 +3653,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def ingest(
               self,
          @@ -4176,7 +4176,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def ingestNlpOutput(self, positions, tkStream, sentenceStream, entityStream):
               """Ingests NLP output such as tokens in a dataset. Tokens become the new slots.
          @@ -4511,7 +4511,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def lingo(self, *args, **kwargs):
               if not self.importOK():
          @@ -4541,7 +4541,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def loadApp(self, app=None, verbose=None):
               """Loads a given TF app or loads the TF app based on the working directory.
          @@ -4650,7 +4650,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def task(
               self,
          diff --git a/tf/convert/app/app.html b/tf/convert/app/app.html
          index 8555083d6..be2be7469 100644
          --- a/tf/convert/app/app.html
          +++ b/tf/convert/app/app.html
          @@ -31,7 +31,7 @@ 

          Module tf.convert.app.app

          Expand source code -Browse git +Browse git
          import types
           from tf.advanced.app import App
          @@ -91,7 +91,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def fmt_layout(app, n, **kwargs):
               return app._wrapHtml(n)
          @@ -146,7 +146,7 @@

          Parameters

          Expand source code -Browse git +Browse git
          class TfApp(App):
               def __init__(app, *args, **kwargs):
          diff --git a/tf/convert/helpers.html b/tf/convert/helpers.html
          index 73b557ed7..b723ac445 100644
          --- a/tf/convert/helpers.html
          +++ b/tf/convert/helpers.html
          @@ -31,7 +31,7 @@ 

          Module tf.convert.helpers

          Expand source code -Browse git +Browse git
          import re
           from textwrap import dedent
          @@ -835,7 +835,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def checkModel(kind, thisModel, verbose):
               modelDefault = (
          @@ -925,7 +925,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getWhites(text):
               match = W_BEFORE.match(text)
          @@ -997,7 +997,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def lookupSource(cv, cur, tokenAsSlot, specs):
               """Looks up information from the current XML stack.
          @@ -1116,7 +1116,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def matchModel(properties, tag, atts):
               if tag == properties["element"]:
          @@ -1144,7 +1144,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def repTokens(tokens):
               text = []
          @@ -1161,7 +1161,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setUp(kind):
               helpText = f"""
          @@ -1214,7 +1214,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def tokenize(line):
               tokens = []
          @@ -1242,7 +1242,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def tweakTrans(
               template,
          diff --git a/tf/convert/index.html b/tf/convert/index.html
          index 50fac4d88..40fa41870 100644
          --- a/tf/convert/index.html
          +++ b/tf/convert/index.html
          @@ -39,7 +39,7 @@ 

          Various forms of data interchange

          Expand source code -Browse git +Browse git
          """
           # Various forms of data interchange
          @@ -72,6 +72,10 @@ 

          Sub-modules

          +
          tf.convert.makewatm
          +
          +
          +
          tf.convert.mql

          MQL …

          @@ -194,6 +198,7 @@

          Index

        • tf.convert.addnlp
        • tf.convert.app
        • tf.convert.helpers
        • +
        • tf.convert.makewatm
        • tf.convert.mql
        • tf.convert.pagexml
        • tf.convert.pandas
        • diff --git a/tf/convert/makewatm.html b/tf/convert/makewatm.html new file mode 100644 index 000000000..8d27f5c94 --- /dev/null +++ b/tf/convert/makewatm.html @@ -0,0 +1,1388 @@ + + + + + + +tf.convert.makewatm API documentation + + + + + + + + + + + + + +
          +
          +
          +

          Module tf.convert.makewatm

          +
          +
          +
          + +Expand source code +Browse git + +
          import sys
          +from textwrap import dedent
          +
          +from tf.core.helpers import console
          +
          +from tf.app import use
          +from tf.convert.tei import TEI
          +from tf.convert.pagexml import PageXML
          +from tf.convert.watm import WATMS
          +from tf.convert.addnlp import NLPipeline
          +from tf.convert.watm import WATM
          +from tf.core.files import dirNm, getLocation, abspath
          +from tf.core.timestamp import DEEP, TERSE
          +
          +# from tf.advanced.helpers import dm
          +
          +
          +class MakeWATM:
          +    """Base class for running conversions to WATM.
          +
          +    This class has methods to convert corpora from TEI or PageXML to TF and then
          +    to WATM.
          +
          +    But if the corpus needs additional preparation, you can make a sub class
          +    based on this with additional tasks defined an implemented.
          +
          +    Any class M in m.py based on this class can be called from the command line
          +    as follows:
          +
          +        python m.py flags tasks
          +
          +    If you base a superclass on this, you can register the additional tasks as follows:
          +
          +    For each extra task xxx, write an method
          +
          +        doTask_xxx(self)
          +
          +    Then provide for each task a simple doc line and register them all by:
          +
          +        self.setOptions(
          +            taskSpecs=(
          +                (task1, docLine1),
          +                (task2, docLine2),
          +                ...
          +            ),
          +            flagSpecs=(
          +                (flag1, docLine1),
          +                (flag2, docLine2),
          +                ...
          +            ),
          +        )
          +    """
          +
          +    def __init__(self, fileLoc):
          +        """Localize upon creation.
          +
          +        When an object of this class is initialized, we assume that the script
          +        doing it is localized in the `programs` directory in a corpus repo.
          +
          +        Parameters
          +        ----------
          +        fileLoc: string
          +            The full path of the file that creates an instance of this class.
          +        """
          +
          +        self.BASE_HELP = dedent(
          +            """
          +        Convert corpus data to WATM.
          +
          +        USAGE
          +
          +        python make.py tasks
          +
          +        Converts data from TEI files
          +
          +        ARGS
          +
          +        tfversion
          +            Any arg that contains a . is considered to be the tf version number.
          +            If no version is passed, we resort to the hard coded default.
          +
          +        FLAGS
          +
          +        TASKS
          +
          +        all
          +            run all (enabled) tasks
          +
          +        """
          +        )
          +        self.BASE_DOCS = dict(
          +            tei2tf="Produce text-fabric data from TEI",
          +            page2tf="Produce text-fabric data from PageXML",
          +            watm="Produce text/anno repo data for the corpus",
          +            watms="Produce text/anno repo data for a sequence of corpora",
          +        )
          +        self.BASE_FLAGS = dict(
          +            help="Print this help text",
          +            silent="To run a bit more silent",
          +            relaxed="Accept XML validation errors",
          +            useNLP="Will run an NLP pipeline to mark tokens, sentences and entities",
          +        )
          +        self.BASE_TASKS = ("tei2tf", "page2tf", "watm", "watms")
          +        self.TF_VERSION = "0.0.0test"
          +
          +        self.fileLoc = fileLoc
          +
          +        self.good = True
          +        self.silent = False
          +
          +        repoBase = dirNm(dirNm(abspath(fileLoc)))
          +        (self.backend, self.org, self.repo, self.relative) = getLocation(
          +            targetDir=repoBase
          +        )
          +        self.repoBase = repoBase
          +        self.setOptions()
          +
          +    def doTask_tei2tf(self):
          +        good = self.good
          +        silent = self.silent
          +        relaxed = self.relaxed
          +        useNLP = self.useNLP
          +
          +        if not good:
          +            if not silent:
          +                console("Skipping 'produce TF' because of an error condition")
          +            return
          +
          +        tfVersion = self.version
          +        verbose = -1 if silent else 0
          +        loadVerbose = DEEP if silent else TERSE
          +
          +        Tei = TEI(verbose=verbose, tei=0, tf=f"{tfVersion}pre" if useNLP else tfVersion)
          +
          +        console("Checking TEI ...")
          +
          +        if not Tei.task(check=True, verbose=verbose, validate=True):
          +            if relaxed:
          +                Tei.good = True
          +            else:
          +                self.good = False
          +                return
          +
          +        console("Converting TEI to TF ...")
          +
          +        if not Tei.task(convert=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        console("Loading TF ...")
          +
          +        if not Tei.task(load=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if not silent:
          +            console("Set up TF-app ...")
          +
          +        if not Tei.task(app=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if useNLP:
          +            console("Add tokens and sentences ...")
          +
          +            org = self.org
          +            repo = self.repo
          +            backend = self.backend
          +
          +            Apre = use(
          +                f"{org}/{repo}:clone",
          +                backend=backend,
          +                checkout="clone",
          +                silent=loadVerbose,
          +            )
          +            NLP = NLPipeline(
          +                lang="it", ner=True, parser=True, verbose=verbose, write=True
          +            )
          +            NLP.loadApp(Apre)
          +            NLP.task(plaintext=True, lingo=True, ingest=True)
          +
          +            if not NLP.good:
          +                self.good = False
          +                return
          +
          +            if not silent:
          +                console("Set up TF-app ...")
          +
          +            if not Tei.task(apptoken=True, verbose=-1):
          +                self.good = False
          +                return
          +
          +            if not Tei.task(load=True, verbose=-1):
          +                self.good = False
          +                return
          +
          +    def doTask_page2tf(self):
          +        good = self.good
          +        silent = self.silent
          +
          +        if not good:
          +            if not silent:
          +                console("Skipping 'produce TF' because of an error condition")
          +            return
          +
          +        tfVersion = self.version
          +        repoBase = self.repoBase
          +        sourceDir = f"{repoBase}/organized/source"
          +
          +        console("Producing TF")
          +
          +        verbose = -1 if silent else 0
          +
          +        P = PageXML(sourceDir, repoBase, verbose=verbose, source=0, tf=tfVersion)
          +
          +        if not silent:
          +            console("Converting PageXML to TF ...")
          +
          +        if not P.task(convert=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if not silent:
          +            console("Precomputing and loading TF ...")
          +
          +        console("Loading TF")
          +
          +        if not P.task(load=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if not silent:
          +            console("Set up TF-app ...")
          +
          +        if not P.task(app=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if not P.good:
          +            self.good = False
          +            return
          +
          +    def doTask_watm(self):
          +        good = self.good
          +        silent = self.silent
          +
          +        if not good:
          +            if not silent:
          +                console("Skipping 'produce WATM' because of an error condition")
          +            return
          +
          +        console("Producing WATM")
          +
          +        backend = self.backend
          +        org = self.org
          +        repo = self.repo
          +
          +        if not silent:
          +            console("Loading TF ...")
          +
          +        loadVerbose = DEEP if silent else TERSE
          +
          +        A = use(
          +            f"{org}/{repo}:clone", backend=backend, checkout="clone", silent=loadVerbose
          +        )
          +
          +        WA = WATM(A, "tei", skipMeta=False, silent=silent)
          +        WA.makeText()
          +        WA.makeAnno()
          +        WA.writeAll()
          +        WA.testAll()
          +
          +    def doTask_watms(self):
          +        good = self.good
          +        silent = self.silent
          +
          +        if not good:
          +            if not silent:
          +                console("Skipping 'produce WATM' because of an error condition")
          +            return
          +
          +        backend = self.backend
          +        org = self.org
          +        repo = self.repo
          +
          +        console("Producing WATMs")
          +
          +        W = WATMS(org, repo, backend, "pagexml", silent=silent)
          +        W.produce()
          +
          +    def run(self, tasks):
          +        TASKS = self.TASKS
          +
          +        for task in TASKS:
          +            if task not in tasks:
          +                continue
          +
          +            method = getattr(self, f"doTask_{task}")
          +            method()
          +
          +        return 0 if self.good else 1
          +
          +    def setOptions(
          +        self,
          +        taskSpecs=(
          +            ("tei2tf", None),
          +            ("watm", None),
          +        ),
          +        flagSpecs=(
          +            ("help", None),
          +            ("silent", None),
          +            ("relaxed", None),
          +            ("usenlp", None),
          +        ),
          +    ):
          +        self.TASKS = []
          +        self.DOCS = {}
          +        self.FLAGS = {}
          +
          +        good = True
          +
          +        for name, doc in taskSpecs:
          +            if name not in self.BASE_TASKS:
          +                if doc is None:
          +                    console(f"task {name}: no help text given", error=True)
          +                    good = False
          +
          +                method = f"doTask_{name}"
          +
          +                if not hasattr(self, method):
          +                    console(
          +                        f"task {name}: no method {method} defined in subclass",
          +                        error=True,
          +                    )
          +                    good = False
          +
          +            if not good:
          +                continue
          +
          +            self.TASKS.append(name)
          +            self.DOCS[name] = doc
          +
          +        for name, doc in taskSpecs:
          +            if name not in self.BASE_FLAGS:
          +                if doc is None:
          +                    console(f"flag --{name}: no help text given", error=True)
          +                    good = False
          +
          +            if not good:
          +                continue
          +
          +            self.FLAGS[name] = doc
          +
          +        self.good = good
          +
          +        self.HELP = (
          +            self.BASE_HELP
          +            + "\nFLAGS\n\n"
          +            + "".join(f"{name}\n\t{doc}" for (name, doc) in self.FLAGS.items())
          +            + "\nTASKS\n\n"
          +            + "".join(f"{name}\n\t{doc}" for (name, doc) in self.DOCS.items())
          +        )
          +
          +    def main(self, cmdLine=None, cargs=sys.argv[1:]):
          +        TASKS = self.TASKS
          +
          +        if cmdLine is not None:
          +            cargs = cmdLine.split()
          +
          +        if "--help" in cargs:
          +            console(self.HELP)
          +            return 0
          +
          +        unrecognized = set()
          +        tasks = set()
          +        self.silent = False
          +        self.version = None
          +        self.relaxed = False
          +        self.useNLP = False
          +
          +        for carg in cargs:
          +            if carg == "--silent":
          +                self.silent = True
          +            elif carg == "--relaxed":
          +                self.relaxed = True
          +            elif carg == "--usenlp":
          +                self.useNLP = True
          +            elif carg == "all":
          +                for task in TASKS:
          +                    tasks.add(task)
          +            elif carg in TASKS:
          +                tasks.add(carg)
          +            elif "." in carg:
          +                version = carg
          +            else:
          +                unrecognized.add(carg)
          +
          +        if not self.silent:
          +            console(f"Enabled tasks: {' '.join(self.TASKS)}")
          +        if version is None:
          +            console(
          +                f"No version for the TF data given. Using default: {self.TF_VERSION}"
          +            )
          +            version = self.TF_VERSION
          +        else:
          +            console(f"Using TF version: {version}")
          +
          +        self.version = version
          +
          +        if len(unrecognized):
          +            console(self.HELP)
          +            console(f"Unrecognized arguments: {', '.join(sorted(unrecognized))}")
          +            return -1
          +
          +        if len(tasks) == 0:
          +            console("Nothing to do")
          +            return 0
          +
          +        return self.run(tasks)
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +

          Classes

          +
          +
          +class MakeWATM +(fileLoc) +
          +
          +

          Base class for running conversions to WATM.

          +

          This class has methods to convert corpora from TEI or PageXML to TF and then +to WATM.

          +

          But if the corpus needs additional preparation, you can make a sub class +based on this with additional tasks defined an implemented.

          +

          Any class M in m.py based on this class can be called from the command line +as follows:

          +
          python m.py flags tasks
          +
          +

          If you base a superclass on this, you can register the additional tasks as follows:

          +

          For each extra task xxx, write an method

          +
          doTask_xxx(self)
          +
          +

          Then provide for each task a simple doc line and register them all by:

          +
          self.setOptions(
          +    taskSpecs=(
          +        (task1, docLine1),
          +        (task2, docLine2),
          +        ...
          +    ),
          +    flagSpecs=(
          +        (flag1, docLine1),
          +        (flag2, docLine2),
          +        ...
          +    ),
          +)
          +
          +

          Localize upon creation.

          +

          When an object of this class is initialized, we assume that the script +doing it is localized in the programs directory in a corpus repo.

          +

          Parameters

          +
          +
          fileLoc : string
          +
          The full path of the file that creates an instance of this class.
          +
          +
          + +Expand source code +Browse git + +
          class MakeWATM:
          +    """Base class for running conversions to WATM.
          +
          +    This class has methods to convert corpora from TEI or PageXML to TF and then
          +    to WATM.
          +
          +    But if the corpus needs additional preparation, you can make a sub class
          +    based on this with additional tasks defined an implemented.
          +
          +    Any class M in m.py based on this class can be called from the command line
          +    as follows:
          +
          +        python m.py flags tasks
          +
          +    If you base a superclass on this, you can register the additional tasks as follows:
          +
          +    For each extra task xxx, write an method
          +
          +        doTask_xxx(self)
          +
          +    Then provide for each task a simple doc line and register them all by:
          +
          +        self.setOptions(
          +            taskSpecs=(
          +                (task1, docLine1),
          +                (task2, docLine2),
          +                ...
          +            ),
          +            flagSpecs=(
          +                (flag1, docLine1),
          +                (flag2, docLine2),
          +                ...
          +            ),
          +        )
          +    """
          +
          +    def __init__(self, fileLoc):
          +        """Localize upon creation.
          +
          +        When an object of this class is initialized, we assume that the script
          +        doing it is localized in the `programs` directory in a corpus repo.
          +
          +        Parameters
          +        ----------
          +        fileLoc: string
          +            The full path of the file that creates an instance of this class.
          +        """
          +
          +        self.BASE_HELP = dedent(
          +            """
          +        Convert corpus data to WATM.
          +
          +        USAGE
          +
          +        python make.py tasks
          +
          +        Converts data from TEI files
          +
          +        ARGS
          +
          +        tfversion
          +            Any arg that contains a . is considered to be the tf version number.
          +            If no version is passed, we resort to the hard coded default.
          +
          +        FLAGS
          +
          +        TASKS
          +
          +        all
          +            run all (enabled) tasks
          +
          +        """
          +        )
          +        self.BASE_DOCS = dict(
          +            tei2tf="Produce text-fabric data from TEI",
          +            page2tf="Produce text-fabric data from PageXML",
          +            watm="Produce text/anno repo data for the corpus",
          +            watms="Produce text/anno repo data for a sequence of corpora",
          +        )
          +        self.BASE_FLAGS = dict(
          +            help="Print this help text",
          +            silent="To run a bit more silent",
          +            relaxed="Accept XML validation errors",
          +            useNLP="Will run an NLP pipeline to mark tokens, sentences and entities",
          +        )
          +        self.BASE_TASKS = ("tei2tf", "page2tf", "watm", "watms")
          +        self.TF_VERSION = "0.0.0test"
          +
          +        self.fileLoc = fileLoc
          +
          +        self.good = True
          +        self.silent = False
          +
          +        repoBase = dirNm(dirNm(abspath(fileLoc)))
          +        (self.backend, self.org, self.repo, self.relative) = getLocation(
          +            targetDir=repoBase
          +        )
          +        self.repoBase = repoBase
          +        self.setOptions()
          +
          +    def doTask_tei2tf(self):
          +        good = self.good
          +        silent = self.silent
          +        relaxed = self.relaxed
          +        useNLP = self.useNLP
          +
          +        if not good:
          +            if not silent:
          +                console("Skipping 'produce TF' because of an error condition")
          +            return
          +
          +        tfVersion = self.version
          +        verbose = -1 if silent else 0
          +        loadVerbose = DEEP if silent else TERSE
          +
          +        Tei = TEI(verbose=verbose, tei=0, tf=f"{tfVersion}pre" if useNLP else tfVersion)
          +
          +        console("Checking TEI ...")
          +
          +        if not Tei.task(check=True, verbose=verbose, validate=True):
          +            if relaxed:
          +                Tei.good = True
          +            else:
          +                self.good = False
          +                return
          +
          +        console("Converting TEI to TF ...")
          +
          +        if not Tei.task(convert=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        console("Loading TF ...")
          +
          +        if not Tei.task(load=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if not silent:
          +            console("Set up TF-app ...")
          +
          +        if not Tei.task(app=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if useNLP:
          +            console("Add tokens and sentences ...")
          +
          +            org = self.org
          +            repo = self.repo
          +            backend = self.backend
          +
          +            Apre = use(
          +                f"{org}/{repo}:clone",
          +                backend=backend,
          +                checkout="clone",
          +                silent=loadVerbose,
          +            )
          +            NLP = NLPipeline(
          +                lang="it", ner=True, parser=True, verbose=verbose, write=True
          +            )
          +            NLP.loadApp(Apre)
          +            NLP.task(plaintext=True, lingo=True, ingest=True)
          +
          +            if not NLP.good:
          +                self.good = False
          +                return
          +
          +            if not silent:
          +                console("Set up TF-app ...")
          +
          +            if not Tei.task(apptoken=True, verbose=-1):
          +                self.good = False
          +                return
          +
          +            if not Tei.task(load=True, verbose=-1):
          +                self.good = False
          +                return
          +
          +    def doTask_page2tf(self):
          +        good = self.good
          +        silent = self.silent
          +
          +        if not good:
          +            if not silent:
          +                console("Skipping 'produce TF' because of an error condition")
          +            return
          +
          +        tfVersion = self.version
          +        repoBase = self.repoBase
          +        sourceDir = f"{repoBase}/organized/source"
          +
          +        console("Producing TF")
          +
          +        verbose = -1 if silent else 0
          +
          +        P = PageXML(sourceDir, repoBase, verbose=verbose, source=0, tf=tfVersion)
          +
          +        if not silent:
          +            console("Converting PageXML to TF ...")
          +
          +        if not P.task(convert=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if not silent:
          +            console("Precomputing and loading TF ...")
          +
          +        console("Loading TF")
          +
          +        if not P.task(load=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if not silent:
          +            console("Set up TF-app ...")
          +
          +        if not P.task(app=True, verbose=verbose):
          +            self.good = False
          +            return
          +
          +        if not P.good:
          +            self.good = False
          +            return
          +
          +    def doTask_watm(self):
          +        good = self.good
          +        silent = self.silent
          +
          +        if not good:
          +            if not silent:
          +                console("Skipping 'produce WATM' because of an error condition")
          +            return
          +
          +        console("Producing WATM")
          +
          +        backend = self.backend
          +        org = self.org
          +        repo = self.repo
          +
          +        if not silent:
          +            console("Loading TF ...")
          +
          +        loadVerbose = DEEP if silent else TERSE
          +
          +        A = use(
          +            f"{org}/{repo}:clone", backend=backend, checkout="clone", silent=loadVerbose
          +        )
          +
          +        WA = WATM(A, "tei", skipMeta=False, silent=silent)
          +        WA.makeText()
          +        WA.makeAnno()
          +        WA.writeAll()
          +        WA.testAll()
          +
          +    def doTask_watms(self):
          +        good = self.good
          +        silent = self.silent
          +
          +        if not good:
          +            if not silent:
          +                console("Skipping 'produce WATM' because of an error condition")
          +            return
          +
          +        backend = self.backend
          +        org = self.org
          +        repo = self.repo
          +
          +        console("Producing WATMs")
          +
          +        W = WATMS(org, repo, backend, "pagexml", silent=silent)
          +        W.produce()
          +
          +    def run(self, tasks):
          +        TASKS = self.TASKS
          +
          +        for task in TASKS:
          +            if task not in tasks:
          +                continue
          +
          +            method = getattr(self, f"doTask_{task}")
          +            method()
          +
          +        return 0 if self.good else 1
          +
          +    def setOptions(
          +        self,
          +        taskSpecs=(
          +            ("tei2tf", None),
          +            ("watm", None),
          +        ),
          +        flagSpecs=(
          +            ("help", None),
          +            ("silent", None),
          +            ("relaxed", None),
          +            ("usenlp", None),
          +        ),
          +    ):
          +        self.TASKS = []
          +        self.DOCS = {}
          +        self.FLAGS = {}
          +
          +        good = True
          +
          +        for name, doc in taskSpecs:
          +            if name not in self.BASE_TASKS:
          +                if doc is None:
          +                    console(f"task {name}: no help text given", error=True)
          +                    good = False
          +
          +                method = f"doTask_{name}"
          +
          +                if not hasattr(self, method):
          +                    console(
          +                        f"task {name}: no method {method} defined in subclass",
          +                        error=True,
          +                    )
          +                    good = False
          +
          +            if not good:
          +                continue
          +
          +            self.TASKS.append(name)
          +            self.DOCS[name] = doc
          +
          +        for name, doc in taskSpecs:
          +            if name not in self.BASE_FLAGS:
          +                if doc is None:
          +                    console(f"flag --{name}: no help text given", error=True)
          +                    good = False
          +
          +            if not good:
          +                continue
          +
          +            self.FLAGS[name] = doc
          +
          +        self.good = good
          +
          +        self.HELP = (
          +            self.BASE_HELP
          +            + "\nFLAGS\n\n"
          +            + "".join(f"{name}\n\t{doc}" for (name, doc) in self.FLAGS.items())
          +            + "\nTASKS\n\n"
          +            + "".join(f"{name}\n\t{doc}" for (name, doc) in self.DOCS.items())
          +        )
          +
          +    def main(self, cmdLine=None, cargs=sys.argv[1:]):
          +        TASKS = self.TASKS
          +
          +        if cmdLine is not None:
          +            cargs = cmdLine.split()
          +
          +        if "--help" in cargs:
          +            console(self.HELP)
          +            return 0
          +
          +        unrecognized = set()
          +        tasks = set()
          +        self.silent = False
          +        self.version = None
          +        self.relaxed = False
          +        self.useNLP = False
          +
          +        for carg in cargs:
          +            if carg == "--silent":
          +                self.silent = True
          +            elif carg == "--relaxed":
          +                self.relaxed = True
          +            elif carg == "--usenlp":
          +                self.useNLP = True
          +            elif carg == "all":
          +                for task in TASKS:
          +                    tasks.add(task)
          +            elif carg in TASKS:
          +                tasks.add(carg)
          +            elif "." in carg:
          +                version = carg
          +            else:
          +                unrecognized.add(carg)
          +
          +        if not self.silent:
          +            console(f"Enabled tasks: {' '.join(self.TASKS)}")
          +        if version is None:
          +            console(
          +                f"No version for the TF data given. Using default: {self.TF_VERSION}"
          +            )
          +            version = self.TF_VERSION
          +        else:
          +            console(f"Using TF version: {version}")
          +
          +        self.version = version
          +
          +        if len(unrecognized):
          +            console(self.HELP)
          +            console(f"Unrecognized arguments: {', '.join(sorted(unrecognized))}")
          +            return -1
          +
          +        if len(tasks) == 0:
          +            console("Nothing to do")
          +            return 0
          +
          +        return self.run(tasks)
          +
          +

          Methods

          +
          +
          +def doTask_page2tf(self) +
          +
          +
          +
          + +Expand source code +Browse git + +
          def doTask_page2tf(self):
          +    good = self.good
          +    silent = self.silent
          +
          +    if not good:
          +        if not silent:
          +            console("Skipping 'produce TF' because of an error condition")
          +        return
          +
          +    tfVersion = self.version
          +    repoBase = self.repoBase
          +    sourceDir = f"{repoBase}/organized/source"
          +
          +    console("Producing TF")
          +
          +    verbose = -1 if silent else 0
          +
          +    P = PageXML(sourceDir, repoBase, verbose=verbose, source=0, tf=tfVersion)
          +
          +    if not silent:
          +        console("Converting PageXML to TF ...")
          +
          +    if not P.task(convert=True, verbose=verbose):
          +        self.good = False
          +        return
          +
          +    if not silent:
          +        console("Precomputing and loading TF ...")
          +
          +    console("Loading TF")
          +
          +    if not P.task(load=True, verbose=verbose):
          +        self.good = False
          +        return
          +
          +    if not silent:
          +        console("Set up TF-app ...")
          +
          +    if not P.task(app=True, verbose=verbose):
          +        self.good = False
          +        return
          +
          +    if not P.good:
          +        self.good = False
          +        return
          +
          +
          +
          +def doTask_tei2tf(self) +
          +
          +
          +
          + +Expand source code +Browse git + +
          def doTask_tei2tf(self):
          +    good = self.good
          +    silent = self.silent
          +    relaxed = self.relaxed
          +    useNLP = self.useNLP
          +
          +    if not good:
          +        if not silent:
          +            console("Skipping 'produce TF' because of an error condition")
          +        return
          +
          +    tfVersion = self.version
          +    verbose = -1 if silent else 0
          +    loadVerbose = DEEP if silent else TERSE
          +
          +    Tei = TEI(verbose=verbose, tei=0, tf=f"{tfVersion}pre" if useNLP else tfVersion)
          +
          +    console("Checking TEI ...")
          +
          +    if not Tei.task(check=True, verbose=verbose, validate=True):
          +        if relaxed:
          +            Tei.good = True
          +        else:
          +            self.good = False
          +            return
          +
          +    console("Converting TEI to TF ...")
          +
          +    if not Tei.task(convert=True, verbose=verbose):
          +        self.good = False
          +        return
          +
          +    console("Loading TF ...")
          +
          +    if not Tei.task(load=True, verbose=verbose):
          +        self.good = False
          +        return
          +
          +    if not silent:
          +        console("Set up TF-app ...")
          +
          +    if not Tei.task(app=True, verbose=verbose):
          +        self.good = False
          +        return
          +
          +    if useNLP:
          +        console("Add tokens and sentences ...")
          +
          +        org = self.org
          +        repo = self.repo
          +        backend = self.backend
          +
          +        Apre = use(
          +            f"{org}/{repo}:clone",
          +            backend=backend,
          +            checkout="clone",
          +            silent=loadVerbose,
          +        )
          +        NLP = NLPipeline(
          +            lang="it", ner=True, parser=True, verbose=verbose, write=True
          +        )
          +        NLP.loadApp(Apre)
          +        NLP.task(plaintext=True, lingo=True, ingest=True)
          +
          +        if not NLP.good:
          +            self.good = False
          +            return
          +
          +        if not silent:
          +            console("Set up TF-app ...")
          +
          +        if not Tei.task(apptoken=True, verbose=-1):
          +            self.good = False
          +            return
          +
          +        if not Tei.task(load=True, verbose=-1):
          +            self.good = False
          +            return
          +
          +
          +
          +def doTask_watm(self) +
          +
          +
          +
          + +Expand source code +Browse git + +
          def doTask_watm(self):
          +    good = self.good
          +    silent = self.silent
          +
          +    if not good:
          +        if not silent:
          +            console("Skipping 'produce WATM' because of an error condition")
          +        return
          +
          +    console("Producing WATM")
          +
          +    backend = self.backend
          +    org = self.org
          +    repo = self.repo
          +
          +    if not silent:
          +        console("Loading TF ...")
          +
          +    loadVerbose = DEEP if silent else TERSE
          +
          +    A = use(
          +        f"{org}/{repo}:clone", backend=backend, checkout="clone", silent=loadVerbose
          +    )
          +
          +    WA = WATM(A, "tei", skipMeta=False, silent=silent)
          +    WA.makeText()
          +    WA.makeAnno()
          +    WA.writeAll()
          +    WA.testAll()
          +
          +
          +
          +def doTask_watms(self) +
          +
          +
          +
          + +Expand source code +Browse git + +
          def doTask_watms(self):
          +    good = self.good
          +    silent = self.silent
          +
          +    if not good:
          +        if not silent:
          +            console("Skipping 'produce WATM' because of an error condition")
          +        return
          +
          +    backend = self.backend
          +    org = self.org
          +    repo = self.repo
          +
          +    console("Producing WATMs")
          +
          +    W = WATMS(org, repo, backend, "pagexml", silent=silent)
          +    W.produce()
          +
          +
          +
          +def main(self, cmdLine=None, cargs=['--force', '--html', '--output-dir', 'site', '--template-dir', 'tf/docs/templates', 'tf']) +
          +
          +
          +
          + +Expand source code +Browse git + +
          def main(self, cmdLine=None, cargs=sys.argv[1:]):
          +    TASKS = self.TASKS
          +
          +    if cmdLine is not None:
          +        cargs = cmdLine.split()
          +
          +    if "--help" in cargs:
          +        console(self.HELP)
          +        return 0
          +
          +    unrecognized = set()
          +    tasks = set()
          +    self.silent = False
          +    self.version = None
          +    self.relaxed = False
          +    self.useNLP = False
          +
          +    for carg in cargs:
          +        if carg == "--silent":
          +            self.silent = True
          +        elif carg == "--relaxed":
          +            self.relaxed = True
          +        elif carg == "--usenlp":
          +            self.useNLP = True
          +        elif carg == "all":
          +            for task in TASKS:
          +                tasks.add(task)
          +        elif carg in TASKS:
          +            tasks.add(carg)
          +        elif "." in carg:
          +            version = carg
          +        else:
          +            unrecognized.add(carg)
          +
          +    if not self.silent:
          +        console(f"Enabled tasks: {' '.join(self.TASKS)}")
          +    if version is None:
          +        console(
          +            f"No version for the TF data given. Using default: {self.TF_VERSION}"
          +        )
          +        version = self.TF_VERSION
          +    else:
          +        console(f"Using TF version: {version}")
          +
          +    self.version = version
          +
          +    if len(unrecognized):
          +        console(self.HELP)
          +        console(f"Unrecognized arguments: {', '.join(sorted(unrecognized))}")
          +        return -1
          +
          +    if len(tasks) == 0:
          +        console("Nothing to do")
          +        return 0
          +
          +    return self.run(tasks)
          +
          +
          +
          +def run(self, tasks) +
          +
          +
          +
          + +Expand source code +Browse git + +
          def run(self, tasks):
          +    TASKS = self.TASKS
          +
          +    for task in TASKS:
          +        if task not in tasks:
          +            continue
          +
          +        method = getattr(self, f"doTask_{task}")
          +        method()
          +
          +    return 0 if self.good else 1
          +
          +
          +
          +def setOptions(self, taskSpecs=(('tei2tf', None), ('watm', None)), flagSpecs=(('help', None), ('silent', None), ('relaxed', None), ('usenlp', None))) +
          +
          +
          +
          + +Expand source code +Browse git + +
          def setOptions(
          +    self,
          +    taskSpecs=(
          +        ("tei2tf", None),
          +        ("watm", None),
          +    ),
          +    flagSpecs=(
          +        ("help", None),
          +        ("silent", None),
          +        ("relaxed", None),
          +        ("usenlp", None),
          +    ),
          +):
          +    self.TASKS = []
          +    self.DOCS = {}
          +    self.FLAGS = {}
          +
          +    good = True
          +
          +    for name, doc in taskSpecs:
          +        if name not in self.BASE_TASKS:
          +            if doc is None:
          +                console(f"task {name}: no help text given", error=True)
          +                good = False
          +
          +            method = f"doTask_{name}"
          +
          +            if not hasattr(self, method):
          +                console(
          +                    f"task {name}: no method {method} defined in subclass",
          +                    error=True,
          +                )
          +                good = False
          +
          +        if not good:
          +            continue
          +
          +        self.TASKS.append(name)
          +        self.DOCS[name] = doc
          +
          +    for name, doc in taskSpecs:
          +        if name not in self.BASE_FLAGS:
          +            if doc is None:
          +                console(f"flag --{name}: no help text given", error=True)
          +                good = False
          +
          +        if not good:
          +            continue
          +
          +        self.FLAGS[name] = doc
          +
          +    self.good = good
          +
          +    self.HELP = (
          +        self.BASE_HELP
          +        + "\nFLAGS\n\n"
          +        + "".join(f"{name}\n\t{doc}" for (name, doc) in self.FLAGS.items())
          +        + "\nTASKS\n\n"
          +        + "".join(f"{name}\n\t{doc}" for (name, doc) in self.DOCS.items())
          +    )
          +
          +
          +
          +
          +
          +
          +
          + +
          + + + \ No newline at end of file diff --git a/tf/convert/mql.html b/tf/convert/mql.html index 73573a95d..d5453aa74 100644 --- a/tf/convert/mql.html +++ b/tf/convert/mql.html @@ -128,7 +128,7 @@

          Enumeration types

          Expand source code -Browse git +Browse git
          """
           # MQL
          @@ -1190,7 +1190,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def exportMQL(app, mqlDb, exportDir=None):
               """Exports the complete TF dataset into single MQL database.
          @@ -1307,7 +1307,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def importMQL(mqlFile, saveDir, silent=None, slotType=None, otext=None, meta=None):
               """Converts an MQL database dump to a TF dataset.
          @@ -1393,7 +1393,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def makeuni(match):
               """Make proper UNICODE of a text that contains byte escape codes
          @@ -1411,7 +1411,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def parseMql(mqlFile, tmObj):
               info = tmObj.info
          @@ -1625,7 +1625,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def tfFromData(tmObj, objectTypes, tables, nodeF, edgeF, slotType, otext, meta):
               info = tmObj.info
          @@ -1754,7 +1754,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def tfFromMql(mqlFile, tmObj, slotType=None, otext=None, meta=None):
               """Generate TF from MQL
          @@ -1786,7 +1786,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def uni(line):
               return uniscan.sub(makeuni, line)
          @@ -1806,7 +1806,7 @@

          Classes

          Expand source code -Browse git +Browse git
          class MQL:
               def __init__(self, app, mqlDb, exportDir, silent=SILENT_D):
          @@ -2207,7 +2207,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def write(self):
               silent = self.silent
          diff --git a/tf/convert/pagexml.html b/tf/convert/pagexml.html
          index 2409b082e..6310a34af 100644
          --- a/tf/convert/pagexml.html
          +++ b/tf/convert/pagexml.html
          @@ -31,7 +31,7 @@ 

          Module tf.convert.pagexml

          Expand source code -Browse git +Browse git
          import sys
           from subprocess import run
          @@ -1112,7 +1112,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def diverge(cv, s, rtx, rsp, ltx, lsp):
               if ltx != rtx:
          @@ -1129,7 +1129,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def emptySlot(cv):
               s = cv.slot()
          @@ -1144,7 +1144,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def linebreakSlot(cv):
               s = cv.slot()
          @@ -1159,7 +1159,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def main():
               (good, tasks, params, flags) = readArgs(
          @@ -1182,7 +1182,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def setUp():
               helpText = """
          @@ -1233,7 +1233,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def tokenLogic(cv, s, token, hangover, isFirst, isSecondLast, isLast):
               (rtx, rsp) = token
          @@ -1298,7 +1298,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def walkObject(cv, cur, xObj):
               """Internal function to deal with a single element.
          @@ -1487,7 +1487,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class PageXML(CheckImport):
               def __init__(
          @@ -2366,7 +2366,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def appTask(self):
               """Implementation of the "app" task.
          @@ -2550,7 +2550,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def browseTask(self):
               """Implementation of the "browse" task.
          @@ -2614,7 +2614,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def convertTask(self):
               """Implementation of the "convert" task.
          @@ -2697,7 +2697,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getConverter(self, doc):
               """Initializes a converter.
          @@ -2736,7 +2736,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getDirector(self, doc, docMeta, pageSource, pageFiles):
               """Factory for the director function.
          @@ -2822,7 +2822,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def loadTask(self):
               """Implementation of the "load" task.
          @@ -2913,7 +2913,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def task(
               self,
          diff --git a/tf/convert/pandas.html b/tf/convert/pandas.html
          index 7f5ff1452..a44b0a099 100644
          --- a/tf/convert/pandas.html
          +++ b/tf/convert/pandas.html
          @@ -61,7 +61,7 @@ 

          Examples

          Expand source code -Browse git +Browse git
          """
           # Export a TF dataset to a `pandas` data frame.
          @@ -440,7 +440,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def exportPandas(app, inTypes=None, exportDir=None):
               """Export a currently loaded TF dataset to `pandas`.
          diff --git a/tf/convert/recorder.html b/tf/convert/recorder.html
          index 262b0d2c1..5c94dfc6c 100644
          --- a/tf/convert/recorder.html
          +++ b/tf/convert/recorder.html
          @@ -185,7 +185,7 @@ 

          Usage

          Expand source code -Browse git +Browse git
          """
           # Recorder
          @@ -964,7 +964,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Recorder:
               def __init__(self, api=None):
          @@ -1633,7 +1633,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def add(self, string, empty=ZWJ):
               """Add text to the accumulator.
          @@ -1671,7 +1671,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def end(self, n):
               """End a node.
          @@ -1722,7 +1722,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def iPositions(self, byType=False, logical=True, asEntries=False):
               """Get the character positions as mapping from nodes.
          @@ -1830,7 +1830,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeFeatures(self, featurePath, headers=True):
               """Read a tab-separated file of annotation data and convert it to features.
          @@ -1935,7 +1935,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def positions(self, byType=False, simple=False):
               """Get the node positions as mapping from character positions.
          @@ -2098,7 +2098,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def rPositions(self, acceptMaterialOutsideNodes=False):
               """Get the first textual position for each node
          @@ -2267,7 +2267,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def read(self, textPath, posPath=None):
               """Read recorder information from disk.
          @@ -2317,7 +2317,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def start(self, n):
               """Start a node.
          @@ -2345,7 +2345,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def text(self):
               """Get the accumulated text.
          @@ -2404,7 +2404,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def write(
               self, textPath, inverted=False, posPath=None, byType=False, optimize=True
          diff --git a/tf/convert/tei.html b/tf/convert/tei.html
          index 29479857e..dc770bb8a 100644
          --- a/tf/convert/tei.html
          +++ b/tf/convert/tei.html
          @@ -452,7 +452,7 @@ 

          Examples

          Expand source code -Browse git +Browse git
          """
           # TEI import
          @@ -3556,6 +3556,20 @@ 

          Examples

          cv.feature(s, **{f"rend_{r}": 1}) def addTokens(cv, cur, text): + """Adds text as a series of tokens. + + Parameters + ---------- + cv: object + The converter object, needed to issue actions. + cur: dict + Various pieces of data collected during walking + and relevant for some next steps in the walk. + text: string + The text to be added. + + Only meant for the case where slots are tokens. + """ (beforew, material, afterw) = getWhites(text) if beforew: @@ -3648,7 +3662,7 @@

          Examples

          spaceChar: string The character to add (supposed to be either a space or a newline). - Only meant for the case where slots are characters. + Only meant for the case where slots are characters or tokens. Suppressed when not in a lowest-level section. """ @@ -3661,6 +3675,18 @@

          Examples

          addSlotFeatures(cv, cur, s) def makeSpace(cv, cur): + """Adds a space. + + Parameters + ---------- + cv: object + The converter object, needed to issue actions. + cur: dict + Various pieces of data collected during walking + and relevant for some next steps in the walk. + + Only meant for the case where slots are tokens. + """ s = cv.slot() cv.feature(s, str="", after=" ", extraspace=1) addSlotFeatures(cv, cur, s) @@ -5091,7 +5117,7 @@

          Functions

          Expand source code -Browse git +Browse git
          def getRefs(tag, atts, xmlFile):
               refAtt = REFERENCING.get(tag, None)
          @@ -5121,7 +5147,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def main():
               (good, tasks, params, flags) = readArgs(
          @@ -5144,7 +5170,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def makeCssInfo():
               """Make the CSS info for the style sheet."""
          @@ -5292,7 +5318,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class TEI(CheckImport):
               def __init__(
          @@ -7543,6 +7569,20 @@ 

          Parameters

          cv.feature(s, **{f"rend_{r}": 1}) def addTokens(cv, cur, text): + """Adds text as a series of tokens. + + Parameters + ---------- + cv: object + The converter object, needed to issue actions. + cur: dict + Various pieces of data collected during walking + and relevant for some next steps in the walk. + text: string + The text to be added. + + Only meant for the case where slots are tokens. + """ (beforew, material, afterw) = getWhites(text) if beforew: @@ -7635,7 +7675,7 @@

          Parameters

          spaceChar: string The character to add (supposed to be either a space or a newline). - Only meant for the case where slots are characters. + Only meant for the case where slots are characters or tokens. Suppressed when not in a lowest-level section. """ @@ -7648,6 +7688,18 @@

          Parameters

          addSlotFeatures(cv, cur, s) def makeSpace(cv, cur): + """Adds a space. + + Parameters + ---------- + cv: object + The converter object, needed to issue actions. + cur: dict + Various pieces of data collected during walking + and relevant for some next steps in the walk. + + Only meant for the case where slots are tokens. + """ s = cv.slot() cv.feature(s, str="", after=" ", extraspace=1) addSlotFeatures(cv, cur, s) @@ -9088,7 +9140,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def appTask(self, tokenBased=False):
               """Implementation of the "app" task.
          @@ -9477,7 +9529,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def browseTask(self):
               """Implementation of the "browse" task.
          @@ -9545,7 +9597,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def checkTask(self):
               """Implementation of the "check" task.
          @@ -10265,7 +10317,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def convertTask(self):
               """Implementation of the "convert" task.
          @@ -10352,7 +10404,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getConverter(self):
               """Initializes a converter.
          @@ -10393,7 +10445,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getDirector(self):
               """Factory for the director function.
          @@ -11088,6 +11140,20 @@ 

          Returns

          cv.feature(s, **{f"rend_{r}": 1}) def addTokens(cv, cur, text): + """Adds text as a series of tokens. + + Parameters + ---------- + cv: object + The converter object, needed to issue actions. + cur: dict + Various pieces of data collected during walking + and relevant for some next steps in the walk. + text: string + The text to be added. + + Only meant for the case where slots are tokens. + """ (beforew, material, afterw) = getWhites(text) if beforew: @@ -11180,7 +11246,7 @@

          Returns

          spaceChar: string The character to add (supposed to be either a space or a newline). - Only meant for the case where slots are characters. + Only meant for the case where slots are characters or tokens. Suppressed when not in a lowest-level section. """ @@ -11193,6 +11259,18 @@

          Returns

          addSlotFeatures(cv, cur, s) def makeSpace(cv, cur): + """Adds a space. + + Parameters + ---------- + cv: object + The converter object, needed to issue actions. + cur: dict + Various pieces of data collected during walking + and relevant for some next steps in the walk. + + Only meant for the case where slots are tokens. + """ s = cv.slot() cv.feature(s, str="", after=" ", extraspace=1) addSlotFeatures(cv, cur, s) @@ -11999,7 +12077,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def getParser(self):
               """Configure the LXML parser.
          @@ -12034,7 +12112,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getSwitches(self, xmlPath):
               verbose = self.verbose
          @@ -12100,7 +12178,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getXML(self):
               """Make an inventory of the TEI source files.
          @@ -12198,7 +12276,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def loadTask(self):
               """Implementation of the "load" task.
          @@ -12256,7 +12334,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def readSchemas(self):
               schemaDir = self.schemaDir
          @@ -12340,7 +12418,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def task(
               self,
          diff --git a/tf/convert/tf.html b/tf/convert/tf.html
          index 51074dd5c..dba18cc8c 100644
          --- a/tf/convert/tf.html
          +++ b/tf/convert/tf.html
          @@ -32,7 +32,7 @@ 

          Raw, unoptimised data from TF files<
          Expand source code -Browse git +Browse git
          """
           # Raw, unoptimised data from TF files
          @@ -419,7 +419,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def explode(inPath, outPath):
               """Explodes `.tf` files into non-optimised `.tf` files without metadata.
          diff --git a/tf/convert/variants.html b/tf/convert/variants.html
          index aba64b2a0..03078479a 100644
          --- a/tf/convert/variants.html
          +++ b/tf/convert/variants.html
          @@ -38,7 +38,7 @@ 

          Variants

          Expand source code -Browse git +Browse git
          """
           # Variants
          @@ -676,7 +676,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Variants:
               def __init__(self, cv, cur, baseWitness, sentType, checkPunc, addWarning, addError):
          @@ -1215,7 +1215,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def checkSent(self, trans, punc):
               """Checks whether there is a "sentence" boundary at this point.
          @@ -1263,7 +1263,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def collectWitnesses(self, node):
               """Collect all witnesses.
          @@ -1333,7 +1333,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def endApp(self, tag):
               """Actions at the end of `app`- `lem`- and `rdg`-elements.
          @@ -1393,7 +1393,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def endSent(self):
               """Ends a "sentence" if there is a current sentence.
          @@ -1432,7 +1432,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def initApps(self):
               """Initialize app- processing and witness collection.
          @@ -1461,7 +1461,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def resetApps(self):
               """Initialize app- and "sentence" processing.
          @@ -1504,7 +1504,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def startApp(self, tag, atts):
               """Actions at the start of `app`- `lem`- and `rdg`-elements.
          @@ -1585,7 +1585,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def startSent(self):
               """Starts a "sentence" if there is no current sentence.
          diff --git a/tf/convert/walker.html b/tf/convert/walker.html
          index 3bbd1858e..76a38185c 100644
          --- a/tf/convert/walker.html
          +++ b/tf/convert/walker.html
          @@ -157,7 +157,7 @@ 

          Action methods

          Expand source code -Browse git +Browse git
          """
           # Walker
          @@ -1971,7 +1971,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class CV:
               S = "slot"
          @@ -3653,7 +3653,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def active(self, node):
               """Returns whether a node is currently active.
          @@ -3707,7 +3707,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def activeNodes(self, nTypes=None):
               """The currently active nodes, i.e. the embedders.
          @@ -3755,7 +3755,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def activeTypes(self):
               """The node types of the currently active nodes, i.e. the embedders.
          @@ -3799,7 +3799,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def delete(self, node):
               """**deletes** a node.
          @@ -3867,7 +3867,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def edge(self, nodeFrom, nodeTo, **features):
               """Adds **edge features**.
          @@ -3932,7 +3932,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def feature(self, node, **features):
               """Adds **node features**.
          @@ -3982,7 +3982,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def features(self):
               """Gets the list of all features.
          @@ -4030,7 +4030,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def get(self, feature, *args):
               """Retrieves feature values.
          @@ -4102,7 +4102,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def link(self, node, slots):
               """Links the given, existing slots to a node.
          @@ -4166,7 +4166,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def linked(self, node):
               """Returns the slots `ss` to which a node is currently linked.
          @@ -4227,7 +4227,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def meta(self, feat, **metadata):
               """Adds, modifies, deletes metadata fields of features.
          @@ -4330,7 +4330,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def node(self, nType, slots=None):
               """Makes a non-slot node and return the handle to it in `n`.
          @@ -4448,7 +4448,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def occurs(self, feat):
               """Whether the feature `featureName` occurs in the resulting data so far.
          @@ -4512,7 +4512,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def resume(self, node):
               """**resumes** a node.
          @@ -4588,7 +4588,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def slot(self, key=None):
               """Makes a slot node and return the handle to it in `n`.
          @@ -4680,7 +4680,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def stop(self, msg):
               """Stops the director. No further input will be read.
          @@ -4735,7 +4735,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def terminate(self, node):
               """**terminates** a node.
          @@ -4850,7 +4850,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def walk(
               self,
          diff --git a/tf/convert/watm.html b/tf/convert/watm.html
          index fdff9a567..26c304de2 100644
          --- a/tf/convert/watm.html
          +++ b/tf/convert/watm.html
          @@ -490,7 +490,7 @@ 

          Caveat

          Expand source code -Browse git +Browse git
          """Export to Web Annotation Text Model
           
          @@ -2690,7 +2690,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def rep(status):
               """Represent a boolean status for a message to the console.
          @@ -2746,7 +2746,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class WATM:
               """The export machinery is exposed as a class, wrapped around a TF dataset."""
          @@ -4316,7 +4316,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          @staticmethod
           def numEqual(nTF, nWA, silent):
          @@ -4365,7 +4365,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          @staticmethod
           def strEqual(tf, wa, silent):
          @@ -4437,7 +4437,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeAnno(self):
               """Make all annotations.
          @@ -4648,7 +4648,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeText(self):
               """Creates the text data.
          @@ -4738,7 +4738,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def mkAnno(self, kind, ns, body, target):
               """Make a single annotation and return its id.
          @@ -4784,7 +4784,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def testAll(self, condensed=False):
               """Test all aspects of the WATM conversion.
          @@ -4868,7 +4868,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def testAttributes(self):
               """Test the attributes.
          @@ -5097,7 +5097,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def testEdges(self):
               """Test the edges.
          @@ -5295,7 +5295,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def testElements(self):
               """Test the elements.
          @@ -5487,7 +5487,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def testExtra(self):
               """Test the extra data for on-the-fly annotations.
          @@ -5589,7 +5589,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def testSetup(self):
               """Prepare the tests.
          @@ -5762,7 +5762,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def testText(self):
               """Test the text.
          @@ -5817,7 +5817,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def writeAll(self):
               """Write text and annotation data to disk.
          @@ -6021,7 +6021,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class WATMS:
               """Export corpora that are divided over multiple TF datasets.
          @@ -6141,7 +6141,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def produce(self, doc=None):
               """Convert all relevant TF datasets.
          diff --git a/tf/convert/xml.html b/tf/convert/xml.html
          index c1d77e392..27402c99c 100644
          --- a/tf/convert/xml.html
          +++ b/tf/convert/xml.html
          @@ -135,7 +135,7 @@ 

          Examples

          Expand source code -Browse git +Browse git
          """
           # XML import
          @@ -1398,7 +1398,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def main():
               (good, tasks, params, flags) = readArgs(
          @@ -1538,7 +1538,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class XML(CheckImport):
               def __init__(
          @@ -2612,7 +2612,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def appTask(self, tokenBased=False):
               """Implementation of the "app" task.
          @@ -2861,7 +2861,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def browseTask(self):
               """Implementation of the "browse" task.
          @@ -2927,7 +2927,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def checkTask(self):
               """Implementation of the "check" task.
          @@ -3174,7 +3174,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def convertTask(self):
               """Implementation of the "convert" task.
          @@ -3212,7 +3212,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getConverter(self):
               """Initializes a converter.
          @@ -3244,7 +3244,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getParser(self):
               """Configure the LXML parser.
          @@ -3287,7 +3287,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getXML(self):
               """Make an inventory of the XML source files.
          @@ -3347,7 +3347,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def loadTask(self):
               """Implementation of the "load" task.
          @@ -3431,7 +3431,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def task(
               self,
          diff --git a/tf/convert/xmlCustom.html b/tf/convert/xmlCustom.html
          index 192932f0f..2abf418a9 100644
          --- a/tf/convert/xmlCustom.html
          +++ b/tf/convert/xmlCustom.html
          @@ -31,7 +31,7 @@ 

          Module tf.convert.xmlCustom

          Expand source code -Browse git +Browse git
          import re
           from io import BytesIO
          @@ -384,7 +384,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def convertTaskDefault(etree):
               if etree is None:
          @@ -482,7 +482,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getDirector(self, etree):
               """Factory for the director function.
          diff --git a/tf/core/api.html b/tf/core/api.html
          index 08f8b3c1d..c6daf5138 100644
          --- a/tf/core/api.html
          +++ b/tf/core/api.html
          @@ -33,7 +33,7 @@ 

          The core API of TF.

          Expand source code -Browse git +Browse git
          """
           # The core API of TF.
          @@ -639,7 +639,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def addLocality(api):
               api.L = Locality(api)
          @@ -654,7 +654,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def addNodes(api):
               api.N = Nodes(api)
          @@ -669,7 +669,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def addOtype(api):
               setattr(api.F.otype, "all", tuple(o[0] for o in api.C.levels.data))
          @@ -686,7 +686,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def addSearch(api, silent=SILENT_D):
               silent = silentConvert(silent)
          @@ -702,7 +702,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def addText(api):
               api.T = Text(api)
          @@ -723,7 +723,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Api:
               def __init__(self, TF):
          @@ -1250,7 +1250,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def Call(self):
               """Returns a sorted list of all usable, loaded computed data names."""
          @@ -1279,7 +1279,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def Cs(self, fName, warn=True):
               """Get the computed data sub API.
          @@ -1321,7 +1321,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def Eall(self, warp=True):
               """Returns a sorted list of all usable, loaded edge feature names.
          @@ -1356,7 +1356,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def Es(self, fName, warn=True):
               """Get the edge feature sub API.
          @@ -1398,7 +1398,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def Fall(self, warp=True):
               """Returns a sorted list of all usable, loaded node feature names.
          @@ -1433,7 +1433,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def Fs(self, fName, warn=True):
               """Get the node feature sub API.
          @@ -1484,7 +1484,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def ensureLoaded(self, features):
               """Checks if features are loaded and if not loads them.
          @@ -1552,7 +1552,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def footprint(self, recompute=False, bySize=True):
               """Computes the memory footprint in RAM of the loaded TF data.
          @@ -1673,7 +1673,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def isLoaded(
               self, features=None, pretty=True, valueType=True, path=False, meta="description"
          @@ -1951,7 +1951,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def makeAvailableIn(self, scope):
               """Exports members of the API to the global namespace.
          diff --git a/tf/core/command.html b/tf/core/command.html
          index dd5166757..c527b209a 100644
          --- a/tf/core/command.html
          +++ b/tf/core/command.html
          @@ -31,7 +31,7 @@ 

          Module tf.core.command

          Expand source code -Browse git +Browse git
          import sys
           from textwrap import dedent
          @@ -250,7 +250,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def readArgs(
               command, descr, possibleTasks, possibleParams, possibleFlags, notInAll=set()
          diff --git a/tf/core/computed.html b/tf/core/computed.html
          index 24ddb8b13..75f6cc701 100644
          --- a/tf/core/computed.html
          +++ b/tf/core/computed.html
          @@ -52,7 +52,7 @@ 

          Pre-computed data components

          Expand source code -Browse git +Browse git
          """
           # Pre-computed data components
          @@ -117,7 +117,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Computed:
               """Provides access to pre-computed data.
          @@ -138,7 +138,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Computeds:
               pass
          diff --git a/tf/core/data.html b/tf/core/data.html index 27fae46e5..b79b9b454 100644 --- a/tf/core/data.html +++ b/tf/core/data.html @@ -31,7 +31,7 @@

          Module tf.core.data

          Expand source code -Browse git +Browse git
          import array
           import gc
          @@ -775,7 +775,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Data:
               def __init__(
          @@ -1466,7 +1466,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def cleanDataBin(self):
               fileRemove(self.binPath)
          @@ -1483,7 +1483,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def load(self, metaOnly=False, silent=SILENT_D, _withGc=True):
               """Load a feature.
          @@ -1604,7 +1604,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def save(self, overwrite=False, nodeRanges=False, silent=SILENT_D):
               silent = silentConvert(silent)
          @@ -1627,7 +1627,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def unload(self):
               self.data = None
          diff --git a/tf/core/edgefeature.html b/tf/core/edgefeature.html
          index 3d1f537d8..3ec851f6d 100644
          --- a/tf/core/edgefeature.html
          +++ b/tf/core/edgefeature.html
          @@ -46,7 +46,7 @@ 

          Module tf.core.edgefeature

          Expand source code -Browse git +Browse git
          """
           Mappings from edges to values.
          @@ -347,7 +347,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class EdgeFeature:
               """Provides access to (edge) feature data.
          @@ -672,7 +672,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def b(self, n):
               """Query *both* incoming edges to, and outgoing edges from a node.
          @@ -783,7 +783,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def f(self, n):
               """Get outgoing edges *from* a node.
          @@ -848,7 +848,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def freqList(self, nodeTypesFrom=None, nodeTypesTo=None):
               """Frequency list of the values of this feature.
          @@ -925,7 +925,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def items(self):
               """A generator that yields the items of the feature, seen as a mapping.
          @@ -971,7 +971,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def t(self, n):
               """Get incoming edges *to* a node.
          @@ -1018,7 +1018,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          class EdgeFeatures:
               pass
          diff --git a/tf/core/fabric.html b/tf/core/fabric.html index 8eb159007..5fc267ade 100644 --- a/tf/core/fabric.html +++ b/tf/core/fabric.html @@ -41,7 +41,7 @@

          Expand source code -Browse git +Browse git
          """
           # `FabricCore`
          @@ -1205,7 +1205,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          class FabricCore:
               """Initialize the core API for a corpus.
          @@ -2189,7 +2189,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def clearCache(self):
               """Clears the cache of compiled TF data.
          @@ -2254,7 +2254,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def explore(self, silent=SILENT_D, show=True):
               """Makes categorization of all features in the dataset.
          @@ -2363,7 +2363,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def load(self, features, add=False, silent=SILENT_D):
               """Loads features from disk into RAM memory.
          @@ -2541,7 +2541,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def loadAll(self, silent=SILENT_D):
               """Load all loadable features.
          @@ -2642,7 +2642,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def save(
               self,
          diff --git a/tf/core/files.html b/tf/core/files.html
          index 65f536b3c..630b44a76 100644
          --- a/tf/core/files.html
          +++ b/tf/core/files.html
          @@ -31,7 +31,7 @@ 

          Module tf.core.files

          Expand source code -Browse git +Browse git
          import os
           import yaml
          @@ -881,7 +881,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def abspath(path):
               return normpath(os.path.abspath(path))
          @@ -912,7 +912,7 @@

          Returns

          Expand source code -Browse git +Browse git
          def annotateDir(app, tool):
               """Return the input and output directories for a specific annotation tool.
          @@ -994,7 +994,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def backendRep(be, kind, default=None):
               """Various back-end dependent values.
          @@ -1118,7 +1118,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def chDir(directory):
               """Change to other directory.
          @@ -1146,7 +1146,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def clearTree(path):
               """Remove all files from a directory, recursively, but leave subdirectories.
          @@ -1203,7 +1203,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirAllFiles(path, ignore=None):
               """Gets all the files found by `path`.
          @@ -1272,7 +1272,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirContents(path):
               """Gets the contents of a directory.
          @@ -1317,7 +1317,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirCopy(pathSrc, pathDst, noclobber=False):
               """Copies a directory if it exists as directory.
          @@ -1343,7 +1343,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirEmpty(target):
               target = normpath(target)
          @@ -1358,7 +1358,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirExists(path):
               """Whether a path exists as directory on the file system."""
          @@ -1381,7 +1381,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirMake(path):
               """Creates a directory if it does not already exist as directory."""
          @@ -1398,7 +1398,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirMove(pathSrc, pathDst):
               """Moves a directory if it exists as directory.
          @@ -1419,7 +1419,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirNm(path):
               """Get the directory part of a file name."""
          @@ -1434,7 +1434,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def dirRemove(path):
               """Removes a directory if it exists as directory."""
          @@ -1450,7 +1450,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def expandDir(obj, dirName):
               if dirName.startswith("~"):
          @@ -1470,7 +1470,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def expanduser(path):
               nPath = normpath(path)
          @@ -1490,7 +1490,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def extNm(path):
               """Get the extension part of a file name.
          @@ -1511,7 +1511,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def fileCopy(pathSrc, pathDst):
               """Copies a file if it exists as file.
          @@ -1531,7 +1531,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def fileExists(path):
               """Whether a path exists as file on the file system."""
          @@ -1547,7 +1547,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def fileMove(pathSrc, pathDst):
               """Moves a file if it exists as file.
          @@ -1567,7 +1567,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def fileNm(path):
               """Get the file part of a file name."""
          @@ -1585,7 +1585,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def fileOpen(*args, **kwargs):
               """Wrapper around `open()`, making sure `encoding="utf8" is passed.
          @@ -1608,7 +1608,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def fileRemove(path):
               """Removes a file if it exists as file."""
          @@ -1629,7 +1629,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getCwd():
               """Get current directory.
          @@ -1671,7 +1671,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getLocation(targetDir=None):
               """Get back-end, org, repo, relative of directory.
          @@ -1752,7 +1752,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def initTree(path, fresh=False, gentle=False):
               """Make sure a directory exists, optionally clean it.
          @@ -1794,7 +1794,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def isDir(path):
               """Whether path exists and is a directory."""
          @@ -1809,7 +1809,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def isFile(path):
               """Whether path exists and is a file."""
          @@ -1824,7 +1824,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def normpath(path):
               if path is None:
          @@ -1841,7 +1841,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def prefixSlash(path):
               """Prefix a / before a path if it is non-empty and not already starts with it."""
          @@ -1856,7 +1856,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def readYaml(text=None, plain=False, asFile=None, preferTuples=True):
               kwargs = dict(Loader=yaml.FullLoader)
          @@ -1881,7 +1881,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def replaceExt(path, newExt):
               """Replace the extension of a path by another one. Specify it without dot."""
          @@ -1897,7 +1897,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setDir(obj):
               obj.homeDir = expanduser("~")
          @@ -1913,7 +1913,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def splitPath(path):
               """Split a file name in a directory part and a file part."""
          @@ -1929,7 +1929,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def str_presenter(dumper, data):
               """configures yaml for dumping multiline strings
          @@ -1949,7 +1949,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def stripExt(path):
               """Strip the extension of a file name, if there is one."""
          @@ -1966,7 +1966,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def unexpanduser(path):
               nPath = normpath(path)
          @@ -1984,7 +1984,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def writeYaml(data, asFile=None, sorted=False):
               kwargs = dict(allow_unicode=True, sort_keys=sorted)
          diff --git a/tf/core/generic.html b/tf/core/generic.html
          index fd3756bba..5ec075e00 100644
          --- a/tf/core/generic.html
          +++ b/tf/core/generic.html
          @@ -31,7 +31,7 @@ 

          Module tf.core.generic

          Expand source code -Browse git +Browse git
          class AttrDict(dict):
               """Turn a dict into an object with attributes.
          @@ -190,7 +190,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def deepAttrDict(info, preferTuples=False):
               """Turn a `dict` into an `AttrDict`, recursively.
          @@ -254,7 +254,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def deepdict(info):
               """Turns an `AttrDict` into a `dict`, recursively.
          @@ -304,7 +304,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def isIterable(value):
               """Whether a value is a non-string iterable.
          @@ -346,7 +346,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class AttrDict(dict):
               """Turn a dict into an object with attributes.
          @@ -401,7 +401,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def deepdict(self):
               return deepdict(self)
          diff --git a/tf/core/helpers.html b/tf/core/helpers.html index de416f697..799805ab5 100644 --- a/tf/core/helpers.html +++ b/tf/core/helpers.html @@ -31,7 +31,7 @@

          Module tf.core.helpers

          Expand source code -Browse git +Browse git
          import os
           import sys
          @@ -732,7 +732,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def camel(name):
               if not name:
          @@ -749,7 +749,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def check32():
               warn = ""
          @@ -770,7 +770,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def cleanName(name):
               clean = "".join(c if c in VALID else "_" for c in name)
          @@ -787,7 +787,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def collectFormats(config):
               featureSet = set()
          @@ -824,7 +824,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def console(*msg, error=False, newline=True):
               msg = " ".join(m if type(m) is str else repr(m) for m in msg)
          @@ -852,7 +852,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def deepSize(o, handlers={}, verbose=False, seen=None):
               """Returns the approximate memory footprint an object and all of its contents.
          @@ -911,7 +911,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def fitemize(value):
               if not value:
          @@ -931,7 +931,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def flattenToSet(features):
               theseFeatures = set()
          @@ -968,7 +968,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def formatMeta(featureMeta):
               """Reorder meta data.
          @@ -1017,7 +1017,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getAllRealFeatures(api):
               """Get all configuration features and all loaded node and edge features.
          @@ -1062,7 +1062,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def htmlEsc(val, math=False):
               """Escape certain HTML characters by HTML entities.
          @@ -1102,7 +1102,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def isClean(name):
               if name is None or len(name) == 0 or name[0] not in LETTER:
          @@ -1118,7 +1118,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def isInt(val):
               try:
          @@ -1136,7 +1136,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def itemize(string, sep=None):
               if not string:
          @@ -1154,7 +1154,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeExamples(nodeList):
               lN = len(nodeList)
          @@ -1177,7 +1177,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeIndex(data):
               inv = {}
          @@ -1194,7 +1194,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeInverse(data):
               inverse = {}
          @@ -1212,7 +1212,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeInverseVal(data):
               inverse = {}
          @@ -1232,7 +1232,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def mathEsc(val):
               """Escape dollar signs to `<span>$</span>`.
          @@ -1260,7 +1260,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def mdEsc(val, math=False):
               """Escape certain markdown characters.
          @@ -1300,7 +1300,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def mdhtmlEsc(val, math=False):
               """Escape certain Markdown characters by HTML entities or span elements.
          @@ -1354,7 +1354,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def mergeDict(source, overrides):
               """Merge overrides into a source dictionary recursively.
          @@ -1382,7 +1382,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def mergeDictOfSets(d1, d2):
               for n, ms in d2.items():
          @@ -1400,7 +1400,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def nbytes(by):
               units = ["B", "KB", "MB", "GB", "TB"]
          @@ -1421,7 +1421,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def pandasEsc(x):
               """Escapes the character that will be used as the `pandas` quote char.
          @@ -1446,7 +1446,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def project(iterableOfTuples, maxDimension):
               if maxDimension == 1:
          @@ -1462,7 +1462,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def rangesFromList(nodeList):  # the list must be sorted
               curstart = None
          @@ -1489,7 +1489,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def rangesFromSet(nodeSet):
               # ranges = []
          @@ -1531,7 +1531,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def run(cmdline, workDir=None):
               """Runs a shell command and returns all relevant info.
          @@ -1575,7 +1575,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setFromSpec(spec):
               covered = set()
          @@ -1601,7 +1601,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setFromStr(x):
               if x is None:
          @@ -1618,7 +1618,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def setFromValue(x, asInt=False):
               if x is None:
          @@ -1643,7 +1643,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def specFromRanges(ranges):  # ranges must be normalized
               return ",".join(
          @@ -1659,7 +1659,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def specFromRangesLogical(ranges):  # ranges must be normalized
               return [r[0] if r[0] == r[1] else [r[0], r[1]] for r in ranges]
          @@ -1673,7 +1673,7 @@

          Parameters

          Expand source code -Browse git +Browse git
          def tfFromValue(val):
               valTp = type(val)
          @@ -1699,7 +1699,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def tsvEsc(x):
               """Escapes a double quote for strings to be included in TSV data.
          @@ -1719,7 +1719,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def valueFromTf(tf):
               return "\\".join(
          @@ -1745,7 +1745,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def var(envVar):
               """Retrieves the value of an environment variable.
          @@ -1771,7 +1771,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def versionSort(x):
               parts = []
          @@ -1792,7 +1792,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def wrapMessages(messages):
               if type(messages) is str:
          @@ -1827,7 +1827,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def xmlEsc(val):
               """Escape certain HTML characters by XML entities.
          diff --git a/tf/core/index.html b/tf/core/index.html
          index d34bee8b2..9d344e2ec 100644
          --- a/tf/core/index.html
          +++ b/tf/core/index.html
          @@ -44,7 +44,7 @@ 

          Core API of TF

          Expand source code -Browse git +Browse git
          """
           # Core API of TF
          diff --git a/tf/core/locality.html b/tf/core/locality.html
          index 500e30188..05a3ab180 100644
          --- a/tf/core/locality.html
          +++ b/tf/core/locality.html
          @@ -32,7 +32,7 @@ 

          Local navigation between nodes.

          Expand source code -Browse git +Browse git
          """
           # Local navigation between nodes.
          @@ -404,7 +404,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Locality:
               """Methods by which you can navigate from a node to its neighbourhood.
          @@ -742,7 +742,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def d(self, n, otype=None):
               """Produces an ordered tuple of *downward* nodes.
          @@ -836,7 +836,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def i(self, n, otype=None):
               """Produces an ordered tuple of *intersecting* nodes
          @@ -918,7 +918,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def n(self, n, otype=None):
               """Produces an ordered tuple of *next* nodes.
          @@ -994,7 +994,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def p(self, n, otype=None):
               """Produces an ordered tuple of *previous* nodes.
          @@ -1075,7 +1075,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def u(self, n, otype=None):
               """Produces an ordered tuple of *upward* nodes.
          diff --git a/tf/core/nodefeature.html b/tf/core/nodefeature.html
          index f1fb6cf5b..ae212ceb9 100644
          --- a/tf/core/nodefeature.html
          +++ b/tf/core/nodefeature.html
          @@ -41,7 +41,7 @@ 

          Mappings from nodes to values.

          Expand source code -Browse git +Browse git
          """
           # Mappings from nodes to values.
          @@ -197,7 +197,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class NodeFeature:
               """Provides access to (node) feature data.
          @@ -339,7 +339,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def freqList(self, nodeTypes=None):
               """Frequency list of the values of this feature.
          @@ -386,7 +386,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def items(self):
               """A generator that yields the items of the feature, seen as a mapping.
          @@ -427,7 +427,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def s(self, val):
               """Query all nodes having a specified feature value.
          @@ -475,7 +475,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def v(self, n):
               """Get the value of a feature for a node.
          @@ -506,7 +506,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          class NodeFeatures:
               pass
          diff --git a/tf/core/nodes.html b/tf/core/nodes.html index e644b5e80..c45217830 100644 --- a/tf/core/nodes.html +++ b/tf/core/nodes.html @@ -81,7 +81,7 @@

          Canonical Order

          Expand source code -Browse git +Browse git
          """
           # Node organization
          @@ -399,7 +399,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Nodes:
               def __init__(self, api):
          @@ -710,7 +710,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def makeSortKeyChunk(self):
               api = self.api
          @@ -802,7 +802,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def sortNodes(self, nodeSet):
               """Delivers a tuple of nodes sorted by the *canonical ordering*.
          @@ -871,7 +871,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def walk(self, nodes=None, events=False):
               """Generates all nodes in the *canonical order*.
          diff --git a/tf/core/oslotsfeature.html b/tf/core/oslotsfeature.html
          index effddbfc7..01e7c57e6 100644
          --- a/tf/core/oslotsfeature.html
          +++ b/tf/core/oslotsfeature.html
          @@ -35,7 +35,7 @@ 

          Access to oslots feature dat
          Expand source code -Browse git +Browse git
          """
           # Access to `oslots` feature data.
          @@ -120,7 +120,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class OslotsFeature:
               def __init__(self, api, metaData, data):
          @@ -196,7 +196,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def items(self):
               """A generator that yields the non-slot nodes with their slots.
          @@ -235,7 +235,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def s(self, n):
               """Get the slots of a (non-slot) node.
          diff --git a/tf/core/otypefeature.html b/tf/core/otypefeature.html
          index 2cc6f05de..78dcaeb79 100644
          --- a/tf/core/otypefeature.html
          +++ b/tf/core/otypefeature.html
          @@ -35,7 +35,7 @@ 

          Access to otype feature data.
          Expand source code -Browse git +Browse git
          """
           # Access to `otype` feature data.
          @@ -190,7 +190,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class OtypeFeature:
               def __init__(self, api, metaData, data):
          @@ -351,7 +351,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def items(self):
               """As in `tf.core.nodefeature.NodeFeature.items`."""
          @@ -392,7 +392,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def s(self, val):
               """Query all nodes having a specified node type.
          @@ -452,7 +452,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def sInterval(self, val):
               """The interval of nodes having a specified node type.
          @@ -498,7 +498,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def v(self, n):
               """Get the node type of a node.
          diff --git a/tf/core/prepare.html b/tf/core/prepare.html
          index eae3337c7..549e9bb5f 100644
          --- a/tf/core/prepare.html
          +++ b/tf/core/prepare.html
          @@ -39,7 +39,7 @@ 

          Pre-compute data.

          Expand source code -Browse git +Browse git
          """
           # Pre-compute data.
          @@ -872,7 +872,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def boundary(info, error, otype, oslots, rank):
               """Computes boundary data.
          @@ -971,7 +971,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def characters(info, error, otext, tFormats, *tFeats):
               """Computes character data.
          @@ -1071,7 +1071,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def levDown(info, error, otype, levUp, rank):
               """Computes level-down data.
          @@ -1170,7 +1170,7 @@ 

          Warnings

          Expand source code -Browse git +Browse git
          def levUp(info, error, otype, oslots, rank):
               """Computes level-up data.
          @@ -1320,7 +1320,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def levels(info, error, otype, oslots, otext):
               """Computes level data.
          @@ -1472,7 +1472,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def order(info, error, otype, oslots, levels):
               """Computes order data for the canonical ordering.
          @@ -1577,7 +1577,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def rank(info, error, otype, order):
               """Computes rank data.
          @@ -1664,7 +1664,7 @@ 

          Warnings

          Expand source code -Browse git +Browse git
          def sections(info, error, otype, oslots, otext, levUp, levels, *sFeats):
               """Computes section data.
          @@ -1852,7 +1852,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def structure(info, error, otype, oslots, otext, rank, levUp, *sFeats):
               """Computes structure data.
          diff --git a/tf/core/text.html b/tf/core/text.html
          index f9de8c429..224b2f9d2 100644
          --- a/tf/core/text.html
          +++ b/tf/core/text.html
          @@ -374,7 +374,7 @@ 

          The T.text() function

          Expand source code -Browse git +Browse git
          """
           # Text API
          @@ -1683,7 +1683,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Text:
               """Low level text representation, including section headings.
          @@ -2632,7 +2632,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def down(self, n):
               """Gives the children of a structural node.
          @@ -2704,7 +2704,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def headingFromNode(self, n):
               """Gives the full heading of a structural node.
          @@ -2776,7 +2776,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def nodeFromHeading(self, head):
               """Gives the node corresponding to a heading, provided it exists.
          @@ -2841,7 +2841,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def nodeFromSection(self, section, lang="en"):
               """Given a section tuple, return the node of it.
          @@ -2925,7 +2925,7 @@ 

          Warnings

          Expand source code -Browse git +Browse git
          def sectionFromNode(self, n, lastSlot=False, lang="en", fillup=False):
               """Gives the full heading of a section node.
          @@ -3024,7 +3024,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def sectionTuple(self, n, lastSlot=False, fillup=False):
               """Gives a tuple of nodes that correspond to a section.
          @@ -3129,7 +3129,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def splitDefaultFormat(self, tpl):
               api = self.api
          @@ -3152,7 +3152,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def splitFormat(self, tpl):
               api = self.api
          @@ -3186,7 +3186,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def structure(self, node=None):
               """Gives the structure of node and everything below it as a tuple.
          @@ -3239,7 +3239,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
              def structureInfo(self):
                   """Gives a summary of how structure has been configured in the dataset.
          @@ -3334,7 +3334,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def structurePretty(self, node=None, fullHeading=False):
               """Gives the structure of node and everything below it as a string.
          @@ -3435,7 +3435,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
              def text(self, nodes, fmt=None, descend=None, func=None, explain=False, **kwargs):
                   """Gives the text that corresponds to a bunch of nodes.
          @@ -3660,7 +3660,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def top(self):
               """Gives all top-level structural nodes in the dataset.
          @@ -3704,7 +3704,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def up(self, n):
               """Gives the parent of a structural node.
          diff --git a/tf/core/timestamp.html b/tf/core/timestamp.html
          index f5fb2099b..73697edfe 100644
          --- a/tf/core/timestamp.html
          +++ b/tf/core/timestamp.html
          @@ -34,7 +34,7 @@ 

          Timed messages

          Expand source code -Browse git +Browse git
          """
           # Timed messages
          @@ -414,7 +414,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def silentConvert(arg):
               if arg is None:
          @@ -476,7 +476,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Timestamp:
               def __init__(self, silent=SILENT_D, level=None):
          @@ -778,7 +778,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def cache(self, _asString=False):
               if _asString:
          @@ -824,7 +824,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def debug(self, msg, tm=True, nl=True, cache=0, force=False):
               """Sends a debug message to the standard output.
          @@ -879,7 +879,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def error(self, msg, tm=True, nl=True, cache=0, force=True):
               """Sends an warning message to the standard error.
          @@ -928,7 +928,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def indent(self, level=None, reset=False, _verbose=None):
               """Changes the indentation and timing of forthcoming messages.
          @@ -996,7 +996,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def info(self, msg, tm=True, nl=True, cache=0, force=False):
               """Sends an informational message to the standard output.
          @@ -1038,7 +1038,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def isSilent(self):
               """The current verbosity.
          @@ -1059,7 +1059,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def raw_msg(self, msg, tm=True, nl=True, cache=0, error=False):
               # cache is a list: append to cache, do not output anything
          @@ -1096,7 +1096,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def reset(self):
               self.log = []
          @@ -1115,7 +1115,7 @@

          Parameters

          Expand source code -Browse git +Browse git
          def setSilent(self, silent):
               """Set the verbosity.
          @@ -1138,7 +1138,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def silentOff(self):
               """Enable informational messages."""
          @@ -1160,7 +1160,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def silentOn(self, deep=False):
               """Suppress informational messages.
          @@ -1203,7 +1203,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def warning(self, msg, tm=True, nl=True, cache=0, force=False):
               """Sends an warning message to the standard output.
          diff --git a/tf/dataset/index.html b/tf/dataset/index.html
          index 5f72f4a3f..a81146fd9 100644
          --- a/tf/dataset/index.html
          +++ b/tf/dataset/index.html
          @@ -43,7 +43,7 @@ 

          Dataset operations

          Expand source code -Browse git +Browse git
          """
           # Dataset operations
          diff --git a/tf/dataset/modify.html b/tf/dataset/modify.html
          index 30777afd1..ff6b15bd1 100644
          --- a/tf/dataset/modify.html
          +++ b/tf/dataset/modify.html
          @@ -48,7 +48,7 @@ 

          Usage

          Expand source code -Browse git +Browse git
          """
           # Modify
          @@ -1881,7 +1881,7 @@ 

          Example

          Expand source code -Browse git +Browse git
          def modify(
               location,
          diff --git a/tf/dataset/nodemaps.html b/tf/dataset/nodemaps.html
          index ba0520fa1..339eb6047 100644
          --- a/tf/dataset/nodemaps.html
          +++ b/tf/dataset/nodemaps.html
          @@ -138,7 +138,7 @@ 

          Usage

          Expand source code -Browse git +Browse git
          """
           # Node maps
          @@ -893,7 +893,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Versions:
               def __init__(self, api, va, vb, silent=SILENT_D, slotMap=None):
          @@ -1459,7 +1459,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
              def caption(self, level, heading, good=None, newLine=True, continuation=False):
                   silent = self.silent
          @@ -1535,7 +1535,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def exploreNodeMapping(self, nodeType):
               va = self.va
          @@ -1604,7 +1604,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getDiagnosis(self, node=None, label=None):
               """Show the diagnosis of a mapping.
          @@ -1684,7 +1684,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def legend(self):
               """Show the labels and descriptions of the diagnosis classes.
          @@ -1708,7 +1708,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeNodeMapping(self, nodeType):
               edge = self.edge
          @@ -1799,7 +1799,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def makeVersionMapping(self):
               Fa = self.Fa
          @@ -1855,7 +1855,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def migrateFeatures(self, featureNames, silent=None, location=None):
               """Migrate features from one version to another based on a node map.
          @@ -2050,7 +2050,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def omapName(self):
               va = self.va
          @@ -2066,7 +2066,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def writeMap(self):
               TFb = self.TFb
          diff --git a/tf/fabric.html b/tf/fabric.html
          index 6201eaacb..97c99d5ae 100644
          --- a/tf/fabric.html
          +++ b/tf/fabric.html
          @@ -52,7 +52,7 @@ 

          Fabri
          Expand source code -Browse git +Browse git
          """
           # `Fabric`
          @@ -346,7 +346,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Fabric(FabricCore):
               """Initialize the core API for a corpus.
          @@ -572,7 +572,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def collect(
               self,
          @@ -628,7 +628,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def extract(
               self, volumes=True, byTitle=True, silent=SILENT_D, overwrite=None, show=False
          @@ -675,7 +675,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def getVolumes(self):
               """Lists available volumes within the dataset.
          diff --git a/tf/index.html b/tf/index.html
          index 1faf8b065..6b2860135 100644
          --- a/tf/index.html
          +++ b/tf/index.html
          @@ -154,7 +154,7 @@ 

          More resources

          Expand source code -Browse git +Browse git
          """
           .. include:: docs/main/top.md
          diff --git a/tf/lib.html b/tf/lib.html
          index 15d4d0d8a..a721a8174 100644
          --- a/tf/lib.html
          +++ b/tf/lib.html
          @@ -33,7 +33,7 @@ 

          Utility functions

          Expand source code -Browse git +Browse git
          """
           # Utility functions
          @@ -237,7 +237,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def readList(source):
               """Reads list of tuples from a TSV file.
          @@ -300,7 +300,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def readSets(source):
               """Reads a dictionary of named sets from file.
          @@ -370,7 +370,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def writeList(data, dest, intCols=None):
               """Writes a list of tuples sets to a TSV file.
          @@ -457,7 +457,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def writeSets(sets, dest):
               """Writes a dictionary of named sets to file.
          diff --git a/tf/parameters.html b/tf/parameters.html
          index 13cf783c6..dd3afa61d 100644
          --- a/tf/parameters.html
          +++ b/tf/parameters.html
          @@ -33,7 +33,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          """
           # Parameters
          @@ -46,7 +46,7 @@ 

          Parameters

          from zipfile import ZIP_DEFLATED -VERSION = '12.4.2' +VERSION = '12.4.3' """Program version. This value is under control of the update process, as run by diff --git a/tf/search/graph.html b/tf/search/graph.html index 3dbd85c8a..06d92fb61 100644 --- a/tf/search/graph.html +++ b/tf/search/graph.html @@ -32,7 +32,7 @@

          Graph oriented functions nee
          Expand source code -Browse git +Browse git
          """
           # Graph oriented functions needed for search
          @@ -290,7 +290,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def connectedness(searchExe):
               error = searchExe.api.TF.error
          @@ -342,7 +342,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def displayEdge(searchExe, e, dir, nodesSeen):
               info = searchExe.api.TF.info
          @@ -396,7 +396,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def displayNode(searchExe, q, pos2=False):
               info = searchExe.api.TF.info
          @@ -424,7 +424,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def displayPlan(searchExe, details=False):
               if not searchExe.good:
          @@ -497,7 +497,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def multiEdges(searchExe):
               relations = searchExe.relations
          diff --git a/tf/search/index.html b/tf/search/index.html
          index 52c92eaa4..b4362fa2d 100644
          --- a/tf/search/index.html
          +++ b/tf/search/index.html
          @@ -37,7 +37,7 @@ 

          Guidance for searching

          Expand source code -Browse git +Browse git
          """
           # Guidance for searching
          diff --git a/tf/search/relations.html b/tf/search/relations.html
          index 922b8b998..d8cd1a378 100644
          --- a/tf/search/relations.html
          +++ b/tf/search/relations.html
          @@ -32,7 +32,7 @@ 

          Search by relational patter
          Expand source code -Browse git +Browse git
          """
           # Search by relational patterns between nodes
          @@ -1865,7 +1865,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def add_F_Relations(searchExe, varRels):
               relations = searchExe.relations
          @@ -1946,7 +1946,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def add_K_Relations(searchExe, varRels):
               relations = searchExe.relations
          @@ -1999,7 +1999,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def add_V_Relations(searchExe, varRels):
               relations = searchExe.relations
          @@ -2064,7 +2064,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def basicRelations(searchExe, api):
               C = api.C
          diff --git a/tf/search/search.html b/tf/search/search.html
          index a30cb7d2c..47b6c70b6 100644
          --- a/tf/search/search.html
          +++ b/tf/search/search.html
          @@ -32,7 +32,7 @@ 

          Search (top-level)

          Expand source code -Browse git +Browse git
          """
           # Search (top-level)
          @@ -596,7 +596,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Search:
               """ """
          @@ -1176,7 +1176,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def count(self, progress=None, limit=None):
               """Counts the results, with progress messages, optionally up to a limit.
          @@ -1278,7 +1278,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def fetch(self, limit=None, _msgCache=False):
               """Retrieves query results, up to a limit.
          @@ -1390,7 +1390,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def glean(self, tup):
               """Renders a single result into something human readable.
          @@ -1476,7 +1476,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def relationsLegend(self):
               """Dynamic info about the basic relations that can be used in templates.
          @@ -1547,7 +1547,7 @@ 

          Notes

          Expand source code -Browse git +Browse git
          def search(
               self,
          @@ -1657,7 +1657,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def showPlan(self, details=False):
               """Show the result of the latest study of a template.
          @@ -1734,7 +1734,7 @@ 

          See Also

          Expand source code -Browse git +Browse git
          def study(
               self,
          @@ -1917,7 +1917,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def tweakPerformance(self, silent=SILENT_D, **kwargs):
               """Tweak parameters that influence the search process.
          diff --git a/tf/search/searchexe.html b/tf/search/searchexe.html
          index 6423938c8..2d435ada7 100644
          --- a/tf/search/searchexe.html
          +++ b/tf/search/searchexe.html
          @@ -32,7 +32,7 @@ 

          Search execution management

          Expand source code -Browse git +Browse git
          """
           # Search execution management
          @@ -300,7 +300,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class SearchExe:
               perfDefaults = dict(
          @@ -553,7 +553,7 @@ 

          Static methods

          Expand source code -Browse git +Browse git
          @classmethod
           def setPerfParams(cls, params):
          @@ -571,7 +571,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def count(self, progress=None, limit=None):
               TF = self.api.TF
          @@ -637,7 +637,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def fetch(self, limit=None):
               api = self.api
          @@ -683,7 +683,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def search(self, limit=None):
               api = self.api
          @@ -703,7 +703,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def showOuterTemplate(self, _msgCache):
               error = self.api.TF.error
          @@ -724,7 +724,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def showPlan(self, details=False):
               displayPlan(self, details=details)
          @@ -738,7 +738,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def study(self, strategy=None):
               api = self.api
          diff --git a/tf/search/semantics.html b/tf/search/semantics.html
          index fadbef090..92a28df10 100644
          --- a/tf/search/semantics.html
          +++ b/tf/search/semantics.html
          @@ -32,7 +32,7 @@ 

          Semantics of search templates

          Expand source code -Browse git +Browse git
          """
           # Semantics of search templates
          @@ -566,7 +566,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def semantics(searchExe):
               if not searchExe.good:
          diff --git a/tf/search/spin.html b/tf/search/spin.html
          index 2a07db4a4..fbc057eac 100644
          --- a/tf/search/spin.html
          +++ b/tf/search/spin.html
          @@ -32,7 +32,7 @@ 

          Search pre-processing

          Expand source code -Browse git +Browse git
          """
           # Search pre-processing
          @@ -484,7 +484,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def estimateSpreads(searchExe, both=False):
               TRY_LIMIT_F = searchExe.perfParams["tryLimitFrom"]
          @@ -562,7 +562,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def spinAtoms(searchExe):
               qnodes = searchExe.qnodes
          @@ -578,7 +578,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def spinEdges(searchExe):
               qnodes = searchExe.qnodes
          diff --git a/tf/search/stitch.html b/tf/search/stitch.html
          index d9ee2dad4..f90c9ebfd 100644
          --- a/tf/search/stitch.html
          +++ b/tf/search/stitch.html
          @@ -32,7 +32,7 @@ 

          Search result finding

          Expand source code -Browse git +Browse git
          """
           # Search result finding
          @@ -937,7 +937,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def setStrategy(searchExe, strategy, keep=False):
               error = searchExe.api.TF.error
          @@ -971,7 +971,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def stitch(searchExe):
               estimateSpreads(searchExe, both=True)
          diff --git a/tf/search/syntax.html b/tf/search/syntax.html
          index f90f001c5..5fd56afa3 100644
          --- a/tf/search/syntax.html
          +++ b/tf/search/syntax.html
          @@ -32,7 +32,7 @@ 

          Syntax of search templates

          Expand source code -Browse git +Browse git
          """
           # Syntax of search templates
          @@ -730,7 +730,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def cleanParent(atom, parentName):
               (kind, data) = parseLine(atom)
          @@ -748,7 +748,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def deContext(quantifier, parentName):
               (quKind, quTemplates, ln) = quantifier
          @@ -804,7 +804,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def parseFeatureVals(searchExe, featStr, features, i, asEdge=False):
               if asEdge:
          @@ -879,7 +879,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def parseLine(line):
               for x in [True]:
          @@ -936,7 +936,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def syntax(searchExe):
               error = searchExe.api.TF.error
          diff --git a/tf/tools/checkdiffs.html b/tf/tools/checkdiffs.html
          index 82c4f5584..86b4eef30 100644
          --- a/tf/tools/checkdiffs.html
          +++ b/tf/tools/checkdiffs.html
          @@ -31,7 +31,7 @@ 

          Module tf.tools.checkdiffs

          Expand source code -Browse git +Browse git
          import sys
           from itertools import zip_longest
          @@ -130,7 +130,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def checkDiffs(path1, path2):
               """Check differences between runs of TF generations.
          diff --git a/tf/tools/index.html b/tf/tools/index.html
          index 24d54d2bd..b554b325f 100644
          --- a/tf/tools/index.html
          +++ b/tf/tools/index.html
          @@ -32,7 +32,7 @@ 

          Module tf.tools

          Expand source code -Browse git +Browse git
          """Various tools for workflows around TF."""
          diff --git a/tf/tools/myspacy.html b/tf/tools/myspacy.html index d19e2be02..57f9d7deb 100644 --- a/tf/tools/myspacy.html +++ b/tf/tools/myspacy.html @@ -41,7 +41,7 @@

          Module tf.tools.myspacy

          Expand source code -Browse git +Browse git
          """Get words and tokens from a plain text with the help of Spacy.
           
          @@ -484,7 +484,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def nlpOutput(text, lang="en", ner=False, parser=False):
               """Runs the Spacy NLP pipeline and delivers the results.
          @@ -554,7 +554,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Spacy(CheckImport):
               def __init__(self, lang=None, parser=False):
          @@ -885,7 +885,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getEntities(self):
               """Get the resulting named entities.
          @@ -949,7 +949,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getSentences(self):
               """Get the resulting sentences.
          @@ -1032,7 +1032,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getTokens(self):
               """Get the resulting tokens.
          @@ -1099,7 +1099,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def read(self, text):
               """Process a plain text.
          diff --git a/tf/tools/nbconvert.html b/tf/tools/nbconvert.html
          index 03dd01c6e..4fa051335 100644
          --- a/tf/tools/nbconvert.html
          +++ b/tf/tools/nbconvert.html
          @@ -31,7 +31,7 @@ 

          Module tf.tools.nbconvert

          Expand source code -Browse git +Browse git
          import sys
           import re
          @@ -310,7 +310,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def convertDir(inputDir, outputDir):
               inPlace = outputDir == "-"
          @@ -409,7 +409,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def main():
               args = sys.argv[1:]
          @@ -428,7 +428,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def makeIndex(inputDir):
               htmlStart = dedent(
          @@ -536,7 +536,7 @@ 

          Index Mode

          Expand source code -Browse git +Browse git
          def task(*args):
               inputDir = args[0]
          diff --git a/tf/tools/pdocs.html b/tf/tools/pdocs.html
          index 8d01fb787..7af4bcddc 100644
          --- a/tf/tools/pdocs.html
          +++ b/tf/tools/pdocs.html
          @@ -31,7 +31,7 @@ 

          Module tf.tools.pdocs

          Expand source code -Browse git +Browse git
          import sys
           import os
          @@ -277,7 +277,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def console(*args):
               sys.stderr.write(" ".join(args) + "\n")
          @@ -292,7 +292,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def getCommand(pkg, asString=False):
               templateLoc = TEMPLATE_LOC.format(pkg)
          @@ -317,7 +317,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def pdoc3(pkg):
               """Build the docs into site."""
          @@ -346,7 +346,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def pdoc3serve(pkg):
               """Build the docs into site and serve them."""
          @@ -369,7 +369,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def servePdocs(pkg):
               run("python -m http.server 9000", cwd=SITE, shell=True)
          @@ -383,7 +383,7 @@

          Functions

          Expand source code -Browse git +Browse git
          def shipDocs(org, repo, pkg, pdoc=True):
               """Build the docs into site and ship them."""
          diff --git a/tf/tools/release.html b/tf/tools/release.html
          index e71e550da..818852d33 100644
          --- a/tf/tools/release.html
          +++ b/tf/tools/release.html
          @@ -31,7 +31,7 @@ 

          Module tf.tools.release

          Expand source code -Browse git +Browse git
          import sys
           
          @@ -110,7 +110,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def makeRelease(org, repo, tag, name, msg, silent=True):
               ghPerson = var("GHPERS")
          diff --git a/tf/tools/xmlschema.html b/tf/tools/xmlschema.html
          index 60b2a6e2e..bc3acf878 100644
          --- a/tf/tools/xmlschema.html
          +++ b/tf/tools/xmlschema.html
          @@ -107,7 +107,7 @@ 

          As library

          Expand source code -Browse git +Browse git
          """
           ## Meaningful information from XML schemas.
          @@ -1180,7 +1180,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def main():
               A = Analysis()
          @@ -1209,7 +1209,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Analysis(CheckImport):
               @staticmethod
          @@ -1655,7 +1655,7 @@ 

          Static methods

          Expand source code -Browse git +Browse git
          @staticmethod
           def help():
          @@ -1696,7 +1696,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def analyser(self, baseSchema, override):
               """Initializes an analyser for a schema.
          @@ -1755,7 +1755,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def elements(self, baseSchema, override):
               """Makes a list of elements and their properties.
          @@ -1821,7 +1821,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def fromrelax(self, baseSchema, schemaOut):
               """Converts a RelaxNG schema to an XSD schema.
          @@ -1868,7 +1868,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getBaseSchema(self):
               """Get the base schema.
          @@ -1910,7 +1910,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getElementInfo(self, baseSchema, overrides, verbose=None):
               """Analyse the schema and its overrides.
          @@ -1970,7 +1970,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getModel(self, xmlContent):
               modelRe = self.modelRe
          @@ -2007,7 +2007,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def run(self):
               """Run a task specified by arguments on the command-line.
          @@ -2084,7 +2084,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def setModes(self, debug=False, verbose=-1):
               """Sets debug and verbose modes.
          @@ -2117,7 +2117,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def task(self, task, *args, verbose=None):
               """Implements a higher level task.
          @@ -2207,7 +2207,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def validate(self, schema, instances):
               """Validates an instance against a schema.
          @@ -2295,7 +2295,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          class Elements(CheckImport):
               types = set(
          @@ -2832,7 +2832,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          @staticmethod
           def eKey(x):
          @@ -2869,7 +2869,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          @staticmethod
           def repKind(k):
          @@ -2884,7 +2884,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          @staticmethod
           def repMixed(m):
          @@ -2914,7 +2914,7 @@ 

          Parameters

          Expand source code -Browse git +Browse git
          def configure(self, baseSchema, override=None, roots=None):
               """Configure for an XML schema and overrides
          @@ -3059,7 +3059,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getDefs(self, asTsv=False):
               """Delivers the analysis results.
          @@ -3118,7 +3118,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def interpret(self):
               """Reads the XSD and interprets the element definitions.
          @@ -3290,7 +3290,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def resolve(self, definitions):
               """Resolve indirections in the definitions.
          @@ -3359,7 +3359,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def showElems(self):
               """Shows the current state of definitions.
          @@ -3396,7 +3396,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def showOverrides(self):
               """Shows the overriding definitions."""
          @@ -3429,7 +3429,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def writeDefs(self, outputDir):
               """Writes the definitions of the elements to a file.
          diff --git a/tf/volumes/collect.html b/tf/volumes/collect.html
          index 442b1efaa..d3a16a476 100644
          --- a/tf/volumes/collect.html
          +++ b/tf/volumes/collect.html
          @@ -54,7 +54,7 @@ 

          Usage

          Expand source code -Browse git +Browse git
          """
           # Collect
          @@ -1187,7 +1187,7 @@ 

          Example

          Expand source code -Browse git +Browse git
          def collect(
               volumes,
          diff --git a/tf/volumes/extract.html b/tf/volumes/extract.html
          index d5512b0cb..2a70905ac 100644
          --- a/tf/volumes/extract.html
          +++ b/tf/volumes/extract.html
          @@ -40,7 +40,7 @@ 

          Usage

          Expand source code -Browse git +Browse git
          """
           # Extract
          @@ -949,7 +949,7 @@ 

          Example

          Expand source code -Browse git +Browse git
          def extract(
               workLocation,
          @@ -1625,7 +1625,7 @@ 

          Returns

          Expand source code -Browse git +Browse git
          def getVolumes(volumesLocation):
               """Lists volumes of a work that exist in a given directory.
          diff --git a/tf/volumes/index.html b/tf/volumes/index.html
          index e684838eb..527400ca2 100644
          --- a/tf/volumes/index.html
          +++ b/tf/volumes/index.html
          @@ -38,7 +38,7 @@ 

          Volume operations

          Expand source code -Browse git +Browse git
          """
           # Volume operations
          diff --git a/tf/writing/arabic.html b/tf/writing/arabic.html
          index 240915878..c9c62ffb5 100644
          --- a/tf/writing/arabic.html
          +++ b/tf/writing/arabic.html
          @@ -1019,7 +1019,7 @@ 

          See also

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/writing/arabic.md
          diff --git a/tf/writing/greek.html b/tf/writing/greek.html
          index 042cb73bb..0c748c6e6 100644
          --- a/tf/writing/greek.html
          +++ b/tf/writing/greek.html
          @@ -33,7 +33,7 @@ 

          Greek characters

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/writing/greek.md
          diff --git a/tf/writing/hebrew.html b/tf/writing/hebrew.html
          index 02b294a00..cc1e80c1c 100644
          --- a/tf/writing/hebrew.html
          +++ b/tf/writing/hebrew.html
          @@ -1243,7 +1243,7 @@ 

          Text-critical

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/writing/hebrew.md
          diff --git a/tf/writing/index.html b/tf/writing/index.html
          index c45f56321..e8a1d7269 100644
          --- a/tf/writing/index.html
          +++ b/tf/writing/index.html
          @@ -79,7 +79,7 @@ 

          Writing systems support

          Expand source code -Browse git +Browse git
          """
           # Writing systems support
          diff --git a/tf/writing/neoaramaic.html b/tf/writing/neoaramaic.html
          index a3d71e767..059b050c3 100644
          --- a/tf/writing/neoaramaic.html
          +++ b/tf/writing/neoaramaic.html
          @@ -148,7 +148,7 @@ 

          Consonant phonem
          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/writing/neoaramaic.md
          diff --git a/tf/writing/syriac.html b/tf/writing/syriac.html
          index 8afb4bfa3..ea2127052 100644
          --- a/tf/writing/syriac.html
          +++ b/tf/writing/syriac.html
          @@ -609,7 +609,7 @@ 

          Pericope markers

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/writing/syriac.md
          diff --git a/tf/writing/transcription.html b/tf/writing/transcription.html
          index e691ce1f4..d1f7af81a 100644
          --- a/tf/writing/transcription.html
          +++ b/tf/writing/transcription.html
          @@ -56,7 +56,7 @@ 

          cld Neo Aramaic

          Expand source code -Browse git +Browse git
          """
           # Transcription
          @@ -1264,7 +1264,7 @@ 

          Classes

          Expand source code -Browse git +Browse git
          class Transcription:
               """Conversion between UNICODE and various transcriptions.
          @@ -2572,7 +2572,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def asciiFromArabic(word):
               return "".join(Transcription.arabicTransAscii.get(x, x) for x in word)
          @@ -2586,7 +2586,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def can_from_syriac(self, word):
               return all(c in self.syriac_mappingi for c in word if c != " ")
          @@ -2600,7 +2600,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def can_to_syriac(self, word):
               return all(
          @@ -2625,7 +2625,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def from_arabic(word):
               """
          @@ -2663,7 +2663,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def from_hebrew(self, word):
               """
          @@ -2703,7 +2703,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def from_syriac(self, word):
               """
          @@ -2741,7 +2741,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def from_ugaritic(word):
               """
          @@ -2772,7 +2772,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def latinFromArabic(word):
               return "".join(Transcription.arabicTransLatin.get(x, x) for x in word)
          @@ -2799,7 +2799,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def ph_simplify(pword):
               """
          @@ -2837,7 +2837,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def quranFromArabic(word):
               return "".join(Transcription.arabicTransQuran.get(x, x) for x in word)
          @@ -2851,7 +2851,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def standardFromArabic(word):
               return "".join(Transcription.arabicTransStandard.get(x, x) for x in word)
          @@ -2884,7 +2884,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def suffix_and_finales(word):
               """
          @@ -2970,7 +2970,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def suppress_space(word):
               """
          @@ -3006,7 +3006,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def sycSplitPunc(self):
               pass
          @@ -3027,7 +3027,7 @@

          Methods

          Expand source code -Browse git +Browse git
          def to_arabic(word):
               """
          @@ -3067,7 +3067,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def to_etcbc_c(word):
               """
          @@ -3116,7 +3116,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def to_etcbc_v(word):
               """
          @@ -3156,7 +3156,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def to_hebrew(word):
               """
          @@ -3198,7 +3198,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def to_hebrew_c(word):
               """
          @@ -3240,7 +3240,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def to_hebrew_v(word):
               """
          @@ -3282,7 +3282,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def to_hebrew_x(word):
               """
          @@ -3322,7 +3322,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def to_syriac(self, word):
               """
          @@ -3362,7 +3362,7 @@ 

          Methods

          Expand source code -Browse git +Browse git
          def to_ugaritic(word):
               """
          diff --git a/tf/writing/ugaritic.html b/tf/writing/ugaritic.html
          index abf294bf6..da5f177fb 100644
          --- a/tf/writing/ugaritic.html
          +++ b/tf/writing/ugaritic.html
          @@ -352,7 +352,7 @@ 

          Letters and word separator

          Expand source code -Browse git +Browse git
          """
           .. include:: ../docs/writing/ugaritic.md
          diff --git a/tf/zip.html b/tf/zip.html
          index ab14c8410..382d0b7a3 100644
          --- a/tf/zip.html
          +++ b/tf/zip.html
          @@ -31,7 +31,7 @@ 

          Module tf.zip

          Expand source code -Browse git +Browse git
          from .advanced.app import loadApp
           from .core.timestamp import DEEP
          @@ -85,7 +85,7 @@ 

          Functions

          Expand source code -Browse git +Browse git
          def main():
               """Makes a complete zip file.