ocrd 3.9.1__tar.gz → 3.10.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ocrd-3.9.1/src/ocrd.egg-info → ocrd-3.10.0}/PKG-INFO +7 -4
- ocrd-3.10.0/VERSION +1 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/requirements.txt +4 -2
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/base.py +58 -28
- {ocrd-3.9.1 → ocrd-3.10.0/src/ocrd.egg-info}/PKG-INFO +7 -4
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd.egg-info/requires.txt +4 -2
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/database.py +2 -3
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/page.xsd +69 -44
- ocrd-3.9.1/VERSION +0 -1
- {ocrd-3.9.1 → ocrd-3.10.0}/LICENSE +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/MANIFEST.in +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/README.md +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/README_ocrd.md +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/README_ocrd_modelfactory.md +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/README_ocrd_models.md +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/README_ocrd_network.md +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/README_ocrd_utils.md +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/README_ocrd_validators.md +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/pyproject.toml +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/setup.cfg +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/bashlib.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/network.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/ocrd_tool.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/process.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/resmgr.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/validate.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/workspace.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/cli/zip.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/constants.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/decorators/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/decorators/loglevel_option.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/decorators/mets_find_options.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/decorators/ocrd_cli_options.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/decorators/parameter_option.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/mets_server.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/ocrd-all-tool.json +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/dummy/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/dummy/ocrd-tool.json +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/dummy_processor.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/filter_processor.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/merge_processor.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/param_command_header2unordered.json +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/param_command_heading2unordered.json +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/param_command_lines2orientation.json +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/param_command_page-update-version.json +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/param_command_transkribus-to-prima.json +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/shell_processor.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/helpers.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/ocrd_page_result.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/resolver.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/resource_manager.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/task_sequence.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/workspace.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/workspace_backup.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/workspace_bagger.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd.egg-info/SOURCES.txt +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd.egg-info/dependency_links.txt +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd.egg-info/entry_points.txt +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd.egg-info/top_level.txt +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_modelfactory/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/constants.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/mets-empty.xml +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/ocrd_agent.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/ocrd_exif.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/ocrd_file.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/ocrd_mets.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/ocrd_page.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/ocrd_page_generateds.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/ocrd_xml_base.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/report.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/utils.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_models/xpath_functions.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/cli/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/cli/client.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/cli/processing_server.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/cli/processing_worker.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/cli/resmgr_server.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/client.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/client_utils.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/constants.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/logging_utils.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/models/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/models/job.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/models/messages.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/models/workflow.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/models/workspace.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/param_validators.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/process_helpers.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/processing_server.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/processing_worker.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/rabbitmq_utils/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/rabbitmq_utils/connector.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/rabbitmq_utils/constants.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/rabbitmq_utils/consumer.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/rabbitmq_utils/helpers.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/rabbitmq_utils/ocrd_messages.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/rabbitmq_utils/publisher.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/resource_manager_server.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/runtime_data/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/runtime_data/config_parser.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/runtime_data/connection_clients.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/runtime_data/deployer.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/runtime_data/hosts.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/runtime_data/network_agents.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/runtime_data/network_services.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/server_cache.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/server_utils.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/tcp_to_uds_mets_proxy.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_network/utils.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/config.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/constants.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/deprecate.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/image.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/introspect.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/logging.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/ocrd_logging.conf +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/os.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_utils/str.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/__init__.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/bagit-profile.yml +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/constants.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/json_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/message_processing.schema.yml +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/message_result.schema.yml +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/mets.xsd +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/ocrd_network_message_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/ocrd_tool.schema.yml +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/ocrd_tool_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/ocrd_zip_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/page_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/parameter_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/processing_server_config.schema.yml +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/processing_server_config_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/resource_list_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/workspace_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/xlink.xsd +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/xsd_mets_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/xsd_page_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd_validators/xsd_validator.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_decorators.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_logging.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_logging_conf.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_mets_server.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_model_factory.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_resolver.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_resolver_oai.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_resource_manager.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_task_sequence.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_utils.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_version.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_workspace.py +0 -0
- {ocrd-3.9.1 → ocrd-3.10.0}/tests/test_workspace_remove.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: ocrd
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.10.0
|
|
4
4
|
Summary: OCR-D framework
|
|
5
5
|
Author-email: Konstantin Baierer <unixprog@gmail.com>
|
|
6
6
|
License: Apache License 2.0
|
|
@@ -12,9 +12,10 @@ Requires-Python: >=3.8
|
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: atomicwrites>=1.3.0
|
|
15
|
-
Requires-Dist: beanie
|
|
15
|
+
Requires-Dist: beanie>=2.0.1
|
|
16
16
|
Requires-Dist: click>=7
|
|
17
17
|
Requires-Dist: cryptography<43.0.0
|
|
18
|
+
Requires-Dist: cysignals
|
|
18
19
|
Requires-Dist: Deprecated==1.2.0
|
|
19
20
|
Requires-Dist: docker>=7.1.0
|
|
20
21
|
Requires-Dist: elementpath
|
|
@@ -28,7 +29,7 @@ Requires-Dist: httpx>=0.22.0
|
|
|
28
29
|
Requires-Dist: importlib_metadata; python_version < "3.8"
|
|
29
30
|
Requires-Dist: importlib_resources; python_version < "3.10"
|
|
30
31
|
Requires-Dist: jsonschema>=4
|
|
31
|
-
Requires-Dist:
|
|
32
|
+
Requires-Dist: pebble
|
|
32
33
|
Requires-Dist: lxml
|
|
33
34
|
Requires-Dist: memory-profiler>=0.58.0
|
|
34
35
|
Requires-Dist: numpy
|
|
@@ -39,6 +40,7 @@ Requires-Dist: paramiko
|
|
|
39
40
|
Requires-Dist: pika>=1.2.0
|
|
40
41
|
Requires-Dist: Pillow>=7.2.0
|
|
41
42
|
Requires-Dist: pydantic>=2.0.0
|
|
43
|
+
Requires-Dist: pymongo>=4.15.5
|
|
42
44
|
Requires-Dist: python-magic
|
|
43
45
|
Requires-Dist: python-multipart
|
|
44
46
|
Requires-Dist: pyyaml
|
|
@@ -48,6 +50,7 @@ Requires-Dist: shapely<2.0.2; python_version < "3.9"
|
|
|
48
50
|
Requires-Dist: shapely>=2; python_version >= "3.9"
|
|
49
51
|
Requires-Dist: uvicorn
|
|
50
52
|
Requires-Dist: uvicorn>=0.17.6
|
|
53
|
+
Dynamic: license-file
|
|
51
54
|
|
|
52
55
|
# OCR-D/core
|
|
53
56
|
|
ocrd-3.10.0/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.10.0
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
atomicwrites >= 1.3.0
|
|
2
|
-
beanie
|
|
2
|
+
beanie>=2.0.1
|
|
3
3
|
click >=7
|
|
4
4
|
cryptography < 43.0.0
|
|
5
|
+
cysignals
|
|
5
6
|
Deprecated == 1.2.0
|
|
6
7
|
docker>=7.1.0
|
|
7
8
|
elementpath
|
|
@@ -15,7 +16,7 @@ httpx>=0.22.0
|
|
|
15
16
|
importlib_metadata ; python_version < '3.8'
|
|
16
17
|
importlib_resources ; python_version < '3.10'
|
|
17
18
|
jsonschema>=4
|
|
18
|
-
|
|
19
|
+
pebble
|
|
19
20
|
lxml
|
|
20
21
|
memory-profiler >= 0.58.0
|
|
21
22
|
# XXX explicitly do not restrict the numpy version because different
|
|
@@ -28,6 +29,7 @@ paramiko
|
|
|
28
29
|
pika>=1.2.0
|
|
29
30
|
Pillow >= 7.2.0
|
|
30
31
|
pydantic >= 2.0.0
|
|
32
|
+
pymongo >= 4.15.5
|
|
31
33
|
python-magic
|
|
32
34
|
python-multipart
|
|
33
35
|
pyyaml
|
|
@@ -25,12 +25,13 @@ import tarfile
|
|
|
25
25
|
import io
|
|
26
26
|
from collections import defaultdict
|
|
27
27
|
from frozendict import frozendict
|
|
28
|
-
# concurrent.futures
|
|
29
|
-
|
|
30
|
-
from
|
|
28
|
+
# concurrent.futures cannot timeout-kill workers
|
|
29
|
+
from pebble import ProcessFuture as Future, ProcessPool as ProcessPoolExecutor
|
|
30
|
+
from concurrent.futures import TimeoutError
|
|
31
31
|
import multiprocessing as mp
|
|
32
|
-
|
|
32
|
+
import threading
|
|
33
33
|
|
|
34
|
+
from cysignals import alarm
|
|
34
35
|
from click import wrap_text
|
|
35
36
|
from deprecated import deprecated
|
|
36
37
|
from requests import HTTPError
|
|
@@ -113,6 +114,13 @@ class MissingInputFile(ValueError):
|
|
|
113
114
|
super().__init__(self.message)
|
|
114
115
|
|
|
115
116
|
|
|
117
|
+
class IncompleteProcessorImplementation(NotImplementedError):
|
|
118
|
+
"""
|
|
119
|
+
An exception signifying the Processor subclass is incomplete,
|
|
120
|
+
because either :py:meth:`Processor.process_page_pcgts()` or
|
|
121
|
+
:py:meth:`Processor.process()` was not overridden.
|
|
122
|
+
"""
|
|
123
|
+
|
|
116
124
|
class DummyFuture:
|
|
117
125
|
"""
|
|
118
126
|
Mimics some of `concurrent.futures.Future` but runs immediately.
|
|
@@ -134,12 +142,18 @@ class DummyExecutor:
|
|
|
134
142
|
def __init__(self, initializer=None, initargs=(), **kwargs):
|
|
135
143
|
initializer(*initargs)
|
|
136
144
|
|
|
137
|
-
def
|
|
145
|
+
def stop(self):
|
|
138
146
|
# allow gc to catch processor instance (unless cached)
|
|
139
147
|
_page_worker_set_ctxt(None, None)
|
|
140
148
|
|
|
141
|
-
def
|
|
142
|
-
|
|
149
|
+
def join(self, **kwargs):
|
|
150
|
+
pass
|
|
151
|
+
|
|
152
|
+
def schedule(self, fn, args=None, kwargs=None, timeout=None) -> DummyFuture:
|
|
153
|
+
args = args or []
|
|
154
|
+
kwargs = kwargs or {}
|
|
155
|
+
timeout = timeout or 0
|
|
156
|
+
return DummyFuture(fn, *args, **kwargs, timeout=timeout)
|
|
143
157
|
|
|
144
158
|
|
|
145
159
|
TFuture = Union[DummyFuture, Future]
|
|
@@ -490,7 +504,7 @@ class Processor():
|
|
|
490
504
|
(This contains the main functionality and needs to be
|
|
491
505
|
overridden by subclasses.)
|
|
492
506
|
"""
|
|
493
|
-
raise
|
|
507
|
+
raise IncompleteProcessorImplementation()
|
|
494
508
|
|
|
495
509
|
def process_workspace(self, workspace: Workspace) -> None:
|
|
496
510
|
"""
|
|
@@ -525,7 +539,7 @@ class Processor():
|
|
|
525
539
|
self._base_logger.info("limiting page timeout from %d to %d sec", max_seconds, self.max_page_seconds)
|
|
526
540
|
max_seconds = self.max_page_seconds
|
|
527
541
|
|
|
528
|
-
if
|
|
542
|
+
if isinstance(workspace.mets, ClientSideOcrdMets):
|
|
529
543
|
executor_cls = ProcessPoolExecutor
|
|
530
544
|
log_queue = mp.get_context('fork').Queue()
|
|
531
545
|
else:
|
|
@@ -539,7 +553,8 @@ class Processor():
|
|
|
539
553
|
initializer=_page_worker_set_ctxt,
|
|
540
554
|
initargs=(self, log_queue),
|
|
541
555
|
)
|
|
542
|
-
if
|
|
556
|
+
if isinstance(workspace.mets, ClientSideOcrdMets):
|
|
557
|
+
assert executor.active # ensure pre-forking
|
|
543
558
|
# forward messages from log queue (in subprocesses) to all root handlers
|
|
544
559
|
log_listener = logging.handlers.QueueListener(log_queue, *logging.root.handlers,
|
|
545
560
|
respect_handler_level=True)
|
|
@@ -550,21 +565,22 @@ class Processor():
|
|
|
550
565
|
tasks = self.process_workspace_submit_tasks(executor, max_seconds)
|
|
551
566
|
stats = self.process_workspace_handle_tasks(tasks)
|
|
552
567
|
finally:
|
|
553
|
-
executor.
|
|
568
|
+
executor.stop()
|
|
569
|
+
executor.join(timeout=3.0) # raises TimeoutError
|
|
554
570
|
self._base_logger.debug("stopped executor %s after %d tasks", str(executor), len(tasks) if tasks else -1)
|
|
555
|
-
if
|
|
571
|
+
if isinstance(workspace.mets, ClientSideOcrdMets):
|
|
556
572
|
# can cause deadlock:
|
|
557
573
|
#log_listener.stop()
|
|
558
574
|
# not much better:
|
|
559
575
|
#log_listener.enqueue_sentinel()
|
|
560
576
|
pass
|
|
561
577
|
|
|
562
|
-
except
|
|
578
|
+
except IncompleteProcessorImplementation:
|
|
563
579
|
# fall back to deprecated method
|
|
564
580
|
try:
|
|
565
581
|
self.process()
|
|
566
582
|
except Exception as err:
|
|
567
|
-
# suppress the
|
|
583
|
+
# suppress the IncompleteProcessorImplementation context
|
|
568
584
|
raise err from None
|
|
569
585
|
|
|
570
586
|
def process_workspace_submit_tasks(self, executor: TExecutor, max_seconds: int) -> Dict[
|
|
@@ -640,7 +656,7 @@ class Processor():
|
|
|
640
656
|
self._base_logger.warning(f"failed downloading file {input_file} for page {page_id}")
|
|
641
657
|
# process page
|
|
642
658
|
#executor.submit(self.process_page_file, *input_files)
|
|
643
|
-
return executor.
|
|
659
|
+
return executor.schedule(_page_worker, args=input_files, timeout=max_seconds), page_id, input_files
|
|
644
660
|
|
|
645
661
|
def process_workspace_handle_tasks(self, tasks: Dict[TFuture, Tuple[str, List[Optional[OcrdFileType]]]]) -> Tuple[
|
|
646
662
|
int, int, Dict[str, int], int]:
|
|
@@ -726,11 +742,12 @@ class Processor():
|
|
|
726
742
|
# but does not stop the running process/thread, and executor itself
|
|
727
743
|
# offers nothing to that effect:
|
|
728
744
|
# task.result(timeout=max_seconds or None)
|
|
729
|
-
# so we instead
|
|
745
|
+
# so we instead passed the timeout to the submit (schedule) function
|
|
730
746
|
task.result()
|
|
747
|
+
self._base_logger.debug("page worker completed for page %s", page_id)
|
|
731
748
|
return True
|
|
732
|
-
except
|
|
733
|
-
#
|
|
749
|
+
except IncompleteProcessorImplementation:
|
|
750
|
+
# pass this through, so we can try process() below
|
|
734
751
|
raise
|
|
735
752
|
# handle input failures separately
|
|
736
753
|
except FileExistsError as err:
|
|
@@ -744,7 +761,9 @@ class Processor():
|
|
|
744
761
|
except KeyboardInterrupt:
|
|
745
762
|
raise
|
|
746
763
|
# broad coverage of output failures (including TimeoutError)
|
|
747
|
-
except Exception as err:
|
|
764
|
+
except (Exception, TimeoutError) as err:
|
|
765
|
+
if isinstance(err, TimeoutError):
|
|
766
|
+
self._base_logger.debug("page worker timed out for page %s", page_id)
|
|
748
767
|
# FIXME: add re-usable/actionable logging
|
|
749
768
|
if config.OCRD_MISSING_OUTPUT == 'ABORT':
|
|
750
769
|
self._base_logger.error(f"Failure on page {page_id}: {str(err) or err.__class__.__name__}")
|
|
@@ -896,7 +915,7 @@ class Processor():
|
|
|
896
915
|
(This contains the main functionality and must be overridden by subclasses,
|
|
897
916
|
unless it does not get called by some overriden :py:meth:`.process_page_file`.)
|
|
898
917
|
"""
|
|
899
|
-
raise
|
|
918
|
+
raise IncompleteProcessorImplementation()
|
|
900
919
|
|
|
901
920
|
def add_metadata(self, pcgts: OcrdPage) -> None:
|
|
902
921
|
"""
|
|
@@ -1182,22 +1201,33 @@ def _page_worker_set_ctxt(processor, log_queue):
|
|
|
1182
1201
|
logging.root.handlers = [logging.handlers.QueueHandler(log_queue)]
|
|
1183
1202
|
|
|
1184
1203
|
|
|
1185
|
-
def _page_worker(
|
|
1204
|
+
def _page_worker(*input_files, timeout=0):
|
|
1186
1205
|
"""
|
|
1187
1206
|
Wraps a `Processor.process_page_file` call as payload (call target)
|
|
1188
|
-
of the ProcessPoolExecutor workers
|
|
1207
|
+
of the ProcessPoolExecutor workers.
|
|
1189
1208
|
"""
|
|
1209
|
+
#_page_worker_processor.process_page_file(*input_files)
|
|
1190
1210
|
page_id = next((file.pageId for file in input_files
|
|
1191
1211
|
if hasattr(file, 'pageId')), "")
|
|
1192
|
-
|
|
1212
|
+
if timeout:
|
|
1213
|
+
if threading.current_thread() is not threading.main_thread():
|
|
1214
|
+
# does not work outside of main thread
|
|
1215
|
+
# (because the exception/interrupt goes there):
|
|
1216
|
+
raise ValueError("cannot apply page worker timeout outside main thread")
|
|
1217
|
+
# based on setitimer() / SIGALRM - only available on Unix+Cygwin
|
|
1218
|
+
# (but we need to interrupt even when in syscalls
|
|
1219
|
+
# and cannot rely on Timer threads, because
|
|
1220
|
+
# processor implementations might not work with threads),
|
|
1221
|
+
alarm.alarm(timeout)
|
|
1193
1222
|
try:
|
|
1194
|
-
|
|
1195
|
-
async_result = pool.apply_async(_page_worker_processor.process_page_file, input_files)
|
|
1196
|
-
async_result.get(timeout or None)
|
|
1223
|
+
_page_worker_processor.process_page_file(*input_files)
|
|
1197
1224
|
_page_worker_processor.logger.debug("page worker completed for page %s", page_id)
|
|
1198
|
-
except
|
|
1225
|
+
except alarm.AlarmInterrupt:
|
|
1199
1226
|
_page_worker_processor.logger.debug("page worker timed out for page %s", page_id)
|
|
1200
|
-
raise
|
|
1227
|
+
raise TimeoutError
|
|
1228
|
+
finally:
|
|
1229
|
+
if timeout:
|
|
1230
|
+
alarm.cancel_alarm()
|
|
1201
1231
|
|
|
1202
1232
|
|
|
1203
1233
|
def generate_processor_help(ocrd_tool, processor_instance=None, subcommand=None):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: ocrd
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.10.0
|
|
4
4
|
Summary: OCR-D framework
|
|
5
5
|
Author-email: Konstantin Baierer <unixprog@gmail.com>
|
|
6
6
|
License: Apache License 2.0
|
|
@@ -12,9 +12,10 @@ Requires-Python: >=3.8
|
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: atomicwrites>=1.3.0
|
|
15
|
-
Requires-Dist: beanie
|
|
15
|
+
Requires-Dist: beanie>=2.0.1
|
|
16
16
|
Requires-Dist: click>=7
|
|
17
17
|
Requires-Dist: cryptography<43.0.0
|
|
18
|
+
Requires-Dist: cysignals
|
|
18
19
|
Requires-Dist: Deprecated==1.2.0
|
|
19
20
|
Requires-Dist: docker>=7.1.0
|
|
20
21
|
Requires-Dist: elementpath
|
|
@@ -28,7 +29,7 @@ Requires-Dist: httpx>=0.22.0
|
|
|
28
29
|
Requires-Dist: importlib_metadata; python_version < "3.8"
|
|
29
30
|
Requires-Dist: importlib_resources; python_version < "3.10"
|
|
30
31
|
Requires-Dist: jsonschema>=4
|
|
31
|
-
Requires-Dist:
|
|
32
|
+
Requires-Dist: pebble
|
|
32
33
|
Requires-Dist: lxml
|
|
33
34
|
Requires-Dist: memory-profiler>=0.58.0
|
|
34
35
|
Requires-Dist: numpy
|
|
@@ -39,6 +40,7 @@ Requires-Dist: paramiko
|
|
|
39
40
|
Requires-Dist: pika>=1.2.0
|
|
40
41
|
Requires-Dist: Pillow>=7.2.0
|
|
41
42
|
Requires-Dist: pydantic>=2.0.0
|
|
43
|
+
Requires-Dist: pymongo>=4.15.5
|
|
42
44
|
Requires-Dist: python-magic
|
|
43
45
|
Requires-Dist: python-multipart
|
|
44
46
|
Requires-Dist: pyyaml
|
|
@@ -48,6 +50,7 @@ Requires-Dist: shapely<2.0.2; python_version < "3.9"
|
|
|
48
50
|
Requires-Dist: shapely>=2; python_version >= "3.9"
|
|
49
51
|
Requires-Dist: uvicorn
|
|
50
52
|
Requires-Dist: uvicorn>=0.17.6
|
|
53
|
+
Dynamic: license-file
|
|
51
54
|
|
|
52
55
|
# OCR-D/core
|
|
53
56
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
atomicwrites>=1.3.0
|
|
2
|
-
beanie
|
|
2
|
+
beanie>=2.0.1
|
|
3
3
|
click>=7
|
|
4
4
|
cryptography<43.0.0
|
|
5
|
+
cysignals
|
|
5
6
|
Deprecated==1.2.0
|
|
6
7
|
docker>=7.1.0
|
|
7
8
|
elementpath
|
|
@@ -13,7 +14,7 @@ gitpython
|
|
|
13
14
|
gdown
|
|
14
15
|
httpx>=0.22.0
|
|
15
16
|
jsonschema>=4
|
|
16
|
-
|
|
17
|
+
pebble
|
|
17
18
|
lxml
|
|
18
19
|
memory-profiler>=0.58.0
|
|
19
20
|
numpy
|
|
@@ -24,6 +25,7 @@ paramiko
|
|
|
24
25
|
pika>=1.2.0
|
|
25
26
|
Pillow>=7.2.0
|
|
26
27
|
pydantic>=2.0.0
|
|
28
|
+
pymongo>=4.15.5
|
|
27
29
|
python-magic
|
|
28
30
|
python-multipart
|
|
29
31
|
pyyaml
|
|
@@ -14,9 +14,8 @@ database (runs in docker) currently has no volume set.
|
|
|
14
14
|
"""
|
|
15
15
|
from beanie import init_beanie
|
|
16
16
|
from beanie.operators import In
|
|
17
|
-
from motor.motor_asyncio import AsyncIOMotorClient
|
|
18
17
|
from pathlib import Path
|
|
19
|
-
from pymongo import MongoClient, uri_parser as mongo_uri_parser
|
|
18
|
+
from pymongo import AsyncMongoClient, MongoClient, uri_parser as mongo_uri_parser
|
|
20
19
|
from re import sub as re_sub
|
|
21
20
|
from typing import List
|
|
22
21
|
from uuid import uuid4
|
|
@@ -26,7 +25,7 @@ from .utils import call_sync
|
|
|
26
25
|
|
|
27
26
|
|
|
28
27
|
async def initiate_database(db_url: str, db_name: str = 'ocrd'):
|
|
29
|
-
client =
|
|
28
|
+
client = AsyncMongoClient(db_url)
|
|
30
29
|
await init_beanie(
|
|
31
30
|
database=client.get_default_database(default=db_name),
|
|
32
31
|
document_models=[DBProcessorJob, DBWorkflowJob, DBWorkspace, DBWorkflowScript]
|
|
@@ -1321,9 +1321,16 @@
|
|
|
1321
1321
|
<annotation>
|
|
1322
1322
|
<documentation>
|
|
1323
1323
|
Definition of the reading order within the page.
|
|
1324
|
-
To express a reading order between
|
|
1325
|
-
they have to be
|
|
1326
|
-
|
|
1324
|
+
To express a reading order between regions,
|
|
1325
|
+
they have to be referenced by an OrderedGroup.
|
|
1326
|
+
To express a non-sequential relationship (while still
|
|
1327
|
+
referencing them as part of the overall structural tree),
|
|
1328
|
+
they have to be referenced by an UnorderedGroup.
|
|
1329
|
+
Groups may contain further groups, just as regions may
|
|
1330
|
+
contain further regions.
|
|
1331
|
+
Regions may be referenced only once by any ReadingOrder
|
|
1332
|
+
element. (That is, the @regionRef define an injective
|
|
1333
|
+
mapping from the ReadingOrder tree to the Region tree.)
|
|
1327
1334
|
</documentation>
|
|
1328
1335
|
</annotation>
|
|
1329
1336
|
<choice minOccurs="1" maxOccurs="1">
|
|
@@ -1336,26 +1343,26 @@
|
|
|
1336
1343
|
</annotation>
|
|
1337
1344
|
</attribute>
|
|
1338
1345
|
</complexType>
|
|
1339
|
-
<complexType name="
|
|
1346
|
+
<complexType name="RegionRefType">
|
|
1340
1347
|
<annotation>
|
|
1341
|
-
<documentation>
|
|
1348
|
+
<documentation>Region reference in an UnorderedGroup(Indexed)</documentation>
|
|
1342
1349
|
</annotation>
|
|
1343
|
-
<attribute name="index" type="int" use="required">
|
|
1344
|
-
<annotation>
|
|
1345
|
-
<documentation>Position (order number) of this item within the current hierarchy level.</documentation>
|
|
1346
|
-
</annotation>
|
|
1347
|
-
</attribute>
|
|
1348
1350
|
<attribute name="regionRef" type="IDREF" use="required"/>
|
|
1349
1351
|
</complexType>
|
|
1350
|
-
<complexType name="
|
|
1352
|
+
<complexType name="OrderedGroupType">
|
|
1351
1353
|
<annotation>
|
|
1352
1354
|
<documentation>
|
|
1353
|
-
|
|
1355
|
+
Group containing index-ordered elements within an UnorderedGroup(Indexed)
|
|
1356
|
+
Elements must be sorted ascending strictly monotonically according to their
|
|
1357
|
+
@index, regardless of their type. (That is, the index of each two consecutive
|
|
1358
|
+
OrderedGroupIndexed, UnorderedGroupIndexed or RegionRefIndexed elements
|
|
1359
|
+
must increase by at least one.)
|
|
1354
1360
|
</documentation>
|
|
1355
1361
|
</annotation>
|
|
1356
1362
|
<sequence>
|
|
1357
1363
|
<element name="UserDefined" type="pc:UserDefinedType"
|
|
1358
|
-
minOccurs="0" maxOccurs="1"
|
|
1364
|
+
minOccurs="0" maxOccurs="1">
|
|
1365
|
+
</element>
|
|
1359
1366
|
<element name="Labels" type="pc:LabelsType"
|
|
1360
1367
|
minOccurs="0" maxOccurs="unbounded">
|
|
1361
1368
|
<annotation>
|
|
@@ -1378,23 +1385,15 @@
|
|
|
1378
1385
|
</documentation>
|
|
1379
1386
|
</annotation>
|
|
1380
1387
|
</attribute>
|
|
1381
|
-
<attribute name="index" type="int" use="required">
|
|
1382
|
-
<annotation>
|
|
1383
|
-
<documentation>
|
|
1384
|
-
Position (order number) of this item within the
|
|
1385
|
-
current hierarchy level.
|
|
1386
|
-
</documentation>
|
|
1387
|
-
</annotation>
|
|
1388
|
-
</attribute>
|
|
1389
1388
|
<attribute name="caption" type="string"/>
|
|
1390
1389
|
<attribute name="type" type="pc:GroupTypeSimpleType"/>
|
|
1391
1390
|
<attribute name="continuation" type="boolean">
|
|
1392
1391
|
<annotation>
|
|
1393
1392
|
<documentation>
|
|
1394
|
-
Is this group a continuation of another group
|
|
1395
|
-
previous column or page, for example)?
|
|
1393
|
+
Is this group a continuation of another group
|
|
1394
|
+
(from previous column or page, for example)?
|
|
1396
1395
|
</documentation>
|
|
1397
|
-
|
|
1396
|
+
</annotation>
|
|
1398
1397
|
</attribute>
|
|
1399
1398
|
<attribute name="custom" type="string">
|
|
1400
1399
|
<annotation>
|
|
@@ -1403,10 +1402,13 @@
|
|
|
1403
1402
|
</attribute>
|
|
1404
1403
|
<attribute name="comments" type="string"/>
|
|
1405
1404
|
</complexType>
|
|
1406
|
-
<complexType name="
|
|
1405
|
+
<complexType name="UnorderedGroupType">
|
|
1407
1406
|
<annotation>
|
|
1408
1407
|
<documentation>
|
|
1409
|
-
|
|
1408
|
+
Group containing unordered elements within an UnorderedGroup(Indexed)
|
|
1409
|
+
Elements need not be sorted, and may be mixed by type. (That is,
|
|
1410
|
+
the sequence of OrderedGroup, UnorderedGroup or RegionRef elements
|
|
1411
|
+
may be ordered arbitrarily.)
|
|
1410
1412
|
</documentation>
|
|
1411
1413
|
</annotation>
|
|
1412
1414
|
<sequence>
|
|
@@ -1435,14 +1437,6 @@
|
|
|
1435
1437
|
</documentation>
|
|
1436
1438
|
</annotation>
|
|
1437
1439
|
</attribute>
|
|
1438
|
-
<attribute name="index" type="int" use="required">
|
|
1439
|
-
<annotation>
|
|
1440
|
-
<documentation>
|
|
1441
|
-
Position (order number) of this item within the
|
|
1442
|
-
current hierarchy level.
|
|
1443
|
-
</documentation>
|
|
1444
|
-
</annotation>
|
|
1445
|
-
</attribute>
|
|
1446
1440
|
<attribute name="caption" type="string"/>
|
|
1447
1441
|
<attribute name="type" type="pc:GroupTypeSimpleType"/>
|
|
1448
1442
|
<attribute name="continuation" type="boolean">
|
|
@@ -1460,19 +1454,30 @@
|
|
|
1460
1454
|
</attribute>
|
|
1461
1455
|
<attribute name="comments" type="string"/>
|
|
1462
1456
|
</complexType>
|
|
1463
|
-
<complexType name="
|
|
1457
|
+
<complexType name="RegionRefIndexedType">
|
|
1458
|
+
<annotation>
|
|
1459
|
+
<documentation>Region reference within an OrderedGroup(Indexed)</documentation>
|
|
1460
|
+
</annotation>
|
|
1461
|
+
<attribute name="index" type="int" use="required">
|
|
1462
|
+
<annotation>
|
|
1463
|
+
<documentation>Position (order number) of this item within the current hierarchy level.</documentation>
|
|
1464
|
+
</annotation>
|
|
1465
|
+
</attribute>
|
|
1464
1466
|
<attribute name="regionRef" type="IDREF" use="required"/>
|
|
1465
1467
|
</complexType>
|
|
1466
|
-
<complexType name="
|
|
1468
|
+
<complexType name="OrderedGroupIndexedType">
|
|
1467
1469
|
<annotation>
|
|
1468
1470
|
<documentation>
|
|
1469
|
-
|
|
1471
|
+
Group containing index-ordered elements within an OrderedGroup(Indexed).
|
|
1472
|
+
Elements must be sorted ascending strictly monotonically according to their
|
|
1473
|
+
@index, regardless of their type. (That is, the index of each two consecutive
|
|
1474
|
+
OrderedGroupIndexed, UnorderedGroupIndexed or RegionRefIndexed elements
|
|
1475
|
+
must increase by at least one.)
|
|
1470
1476
|
</documentation>
|
|
1471
1477
|
</annotation>
|
|
1472
1478
|
<sequence>
|
|
1473
1479
|
<element name="UserDefined" type="pc:UserDefinedType"
|
|
1474
|
-
minOccurs="0" maxOccurs="1"
|
|
1475
|
-
</element>
|
|
1480
|
+
minOccurs="0" maxOccurs="1"/>
|
|
1476
1481
|
<element name="Labels" type="pc:LabelsType"
|
|
1477
1482
|
minOccurs="0" maxOccurs="unbounded">
|
|
1478
1483
|
<annotation>
|
|
@@ -1495,15 +1500,23 @@
|
|
|
1495
1500
|
</documentation>
|
|
1496
1501
|
</annotation>
|
|
1497
1502
|
</attribute>
|
|
1503
|
+
<attribute name="index" type="int" use="required">
|
|
1504
|
+
<annotation>
|
|
1505
|
+
<documentation>
|
|
1506
|
+
Position (order number) of this item within the
|
|
1507
|
+
current hierarchy level.
|
|
1508
|
+
</documentation>
|
|
1509
|
+
</annotation>
|
|
1510
|
+
</attribute>
|
|
1498
1511
|
<attribute name="caption" type="string"/>
|
|
1499
1512
|
<attribute name="type" type="pc:GroupTypeSimpleType"/>
|
|
1500
1513
|
<attribute name="continuation" type="boolean">
|
|
1501
1514
|
<annotation>
|
|
1502
1515
|
<documentation>
|
|
1503
|
-
Is this group a continuation of another group
|
|
1504
|
-
|
|
1516
|
+
Is this group a continuation of another group (from
|
|
1517
|
+
previous column or page, for example)?
|
|
1505
1518
|
</documentation>
|
|
1506
|
-
|
|
1519
|
+
</annotation>
|
|
1507
1520
|
</attribute>
|
|
1508
1521
|
<attribute name="custom" type="string">
|
|
1509
1522
|
<annotation>
|
|
@@ -1512,10 +1525,13 @@
|
|
|
1512
1525
|
</attribute>
|
|
1513
1526
|
<attribute name="comments" type="string"/>
|
|
1514
1527
|
</complexType>
|
|
1515
|
-
<complexType name="
|
|
1528
|
+
<complexType name="UnorderedGroupIndexedType">
|
|
1516
1529
|
<annotation>
|
|
1517
1530
|
<documentation>
|
|
1518
|
-
|
|
1531
|
+
Group containing unordered elements within an OrderedGroup(Indexed)
|
|
1532
|
+
Elements need not be sorted, and may be mixed by type. (That is,
|
|
1533
|
+
the sequence of OrderedGroup, UnorderedGroup or RegionRef elements
|
|
1534
|
+
may be ordered arbitrarily.)
|
|
1519
1535
|
</documentation>
|
|
1520
1536
|
</annotation>
|
|
1521
1537
|
<sequence>
|
|
@@ -1544,6 +1560,14 @@
|
|
|
1544
1560
|
</documentation>
|
|
1545
1561
|
</annotation>
|
|
1546
1562
|
</attribute>
|
|
1563
|
+
<attribute name="index" type="int" use="required">
|
|
1564
|
+
<annotation>
|
|
1565
|
+
<documentation>
|
|
1566
|
+
Position (order number) of this item within the
|
|
1567
|
+
current hierarchy level.
|
|
1568
|
+
</documentation>
|
|
1569
|
+
</annotation>
|
|
1570
|
+
</attribute>
|
|
1547
1571
|
<attribute name="caption" type="string"/>
|
|
1548
1572
|
<attribute name="type" type="pc:GroupTypeSimpleType"/>
|
|
1549
1573
|
<attribute name="continuation" type="boolean">
|
|
@@ -2325,6 +2349,7 @@
|
|
|
2325
2349
|
<element name="TableRegion" type="pc:TableRegionType"/>
|
|
2326
2350
|
<element name="ChartRegion" type="pc:ChartRegionType"/>
|
|
2327
2351
|
<element name="SeparatorRegion" type="pc:SeparatorRegionType"/>
|
|
2352
|
+
<element name="MapRegion" type="pc:MapRegionType"/>
|
|
2328
2353
|
<element name="MathsRegion" type="pc:MathsRegionType"/>
|
|
2329
2354
|
<element name="ChemRegion" type="pc:ChemRegionType"/>
|
|
2330
2355
|
<element name="MusicRegion" type="pc:MusicRegionType"/>
|
ocrd-3.9.1/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3.9.1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/param_command_page-update-version.json
RENAMED
|
File without changes
|
{ocrd-3.9.1 → ocrd-3.10.0}/src/ocrd/processor/builtin/param_command_transkribus-to-prima.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|