ocrd 3.0.0b7__py3-none-any.whl → 3.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ocrd/cli/__init__.py +3 -1
- ocrd/decorators/__init__.py +3 -2
- ocrd/decorators/ocrd_cli_options.py +5 -5
- ocrd/mets_server.py +62 -42
- ocrd/processor/base.py +8 -7
- ocrd/processor/builtin/dummy/ocrd-tool.json +20 -0
- ocrd/processor/builtin/dummy_processor.py +0 -3
- ocrd/processor/builtin/filter_processor.py +108 -0
- ocrd/resource_manager.py +4 -0
- ocrd/workspace.py +0 -2
- {ocrd-3.0.0b7.dist-info → ocrd-3.0.2.dist-info}/METADATA +7 -6
- {ocrd-3.0.0b7.dist-info → ocrd-3.0.2.dist-info}/RECORD +34 -33
- {ocrd-3.0.0b7.dist-info → ocrd-3.0.2.dist-info}/WHEEL +1 -1
- {ocrd-3.0.0b7.dist-info → ocrd-3.0.2.dist-info}/entry_points.txt +1 -0
- ocrd_modelfactory/__init__.py +7 -1
- ocrd_models/ocrd_exif.py +2 -2
- ocrd_models/ocrd_page.py +22 -3
- ocrd_models/ocrd_page_generateds.py +2813 -1438
- ocrd_models/xpath_functions.py +51 -0
- ocrd_network/cli/client.py +28 -9
- ocrd_network/client.py +9 -6
- ocrd_network/client_utils.py +25 -14
- ocrd_network/processing_server.py +27 -15
- ocrd_network/processing_worker.py +7 -4
- ocrd_network/processor_server.py +2 -1
- ocrd_network/rabbitmq_utils/connector.py +2 -2
- ocrd_network/runtime_data/deployer.py +28 -18
- ocrd_network/server_cache.py +26 -23
- ocrd_network/server_utils.py +40 -4
- ocrd_network/tcp_to_uds_mets_proxy.py +8 -5
- ocrd_network/utils.py +19 -15
- ocrd_utils/config.py +39 -17
- ocrd/processor/concurrent.py +0 -909
- {ocrd-3.0.0b7.dist-info → ocrd-3.0.2.dist-info}/LICENSE +0 -0
- {ocrd-3.0.0b7.dist-info → ocrd-3.0.2.dist-info}/top_level.txt +0 -0
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
ocrd/__init__.py,sha256=ZswMVmlqFhAEIzMR3my6IKPq9XLH21aDPC_m_8Jh4dA,1076
|
|
2
2
|
ocrd/constants.py,sha256=6dn3mG54WqHsKInmLZp4kJjNqqPtBoFoSuLUuRbOps0,740
|
|
3
3
|
ocrd/lib.bash,sha256=le6XqAOEacdjP3JNSlPkxwRH1y0oVjNQM2tX5d6QFO4,10901
|
|
4
|
-
ocrd/mets_server.py,sha256=
|
|
4
|
+
ocrd/mets_server.py,sha256=wiOvSSYZMicjQC958dD2i7uHMwfZCaDZQd7E5l50ayU,22436
|
|
5
5
|
ocrd/ocrd-all-tool.json,sha256=9bX2VYnUwhTAzAvKaoT77BFzbgBGgyIt7qBqARpwWNc,586
|
|
6
6
|
ocrd/resolver.py,sha256=Ba9ALQbTXz6_mla4VqN9tAfHoj6aKuNJAU4tIDnjcHE,14952
|
|
7
7
|
ocrd/resource_list.yml,sha256=82-PiqkZnka1kTj3MQqNn4wXWKHHtoFchsQuetWuqFs,2633
|
|
8
|
-
ocrd/resource_manager.py,sha256=
|
|
8
|
+
ocrd/resource_manager.py,sha256=kIWDoKxWH4IJE1gcoTcCRQjYjieCqiQclyuyF6Y9b8A,16813
|
|
9
9
|
ocrd/task_sequence.py,sha256=spiaUQaMM7M8WdBDoQGmLuTPm7tOugYXD6rcJ2UXzxw,6991
|
|
10
|
-
ocrd/workspace.py,sha256
|
|
10
|
+
ocrd/workspace.py,sha256=-j3X83K0f4vtd5jwfu6_R53RJ2R8gt1HYpyrv8YP2bg,65661
|
|
11
11
|
ocrd/workspace_backup.py,sha256=iab_JjZ_mMP-G8NIUk4PZmfpNlQuGRoqc3NbTSSew1w,3621
|
|
12
12
|
ocrd/workspace_bagger.py,sha256=yU8H3xR5WmQKvgQewac71ie-DUWcfLnMS01D55zsEHQ,11971
|
|
13
|
-
ocrd/cli/__init__.py,sha256
|
|
13
|
+
ocrd/cli/__init__.py,sha256=-BiwIakeCkWx0Jd2yX9_ahfdV4VKz_5yqGEJ_2zKakQ,2734
|
|
14
14
|
ocrd/cli/bashlib.py,sha256=ypFBM3-IULz_IEBx0Y04eGt9VbQWwEWm4ujm9g_hPWY,6009
|
|
15
15
|
ocrd/cli/log.py,sha256=6_FrVmTKIIVNUaNLkuOJx8pvPhensHMuayJ0PA7T-XA,1562
|
|
16
16
|
ocrd/cli/network.py,sha256=oWBHFEURxfUdb_t-F4svP_ri7o5mqBoNQnLZLbsZLTA,602
|
|
@@ -20,50 +20,51 @@ ocrd/cli/resmgr.py,sha256=bTE-MpF7RRCHhgAbknqZUFHgHScIK6FR3S4h4DEAets,10080
|
|
|
20
20
|
ocrd/cli/validate.py,sha256=nvageDaHCETcE71X5lu7i_4JKpgo9MrvJKinVPLYUTI,5727
|
|
21
21
|
ocrd/cli/workspace.py,sha256=KTbSzIUrba5WoYETvM9ElRZVsDUHCGVvjoFgBGZS2nU,40468
|
|
22
22
|
ocrd/cli/zip.py,sha256=MMJLw3OXWiJVfVtrdJcBkbB8vA1IzSautluazZRuCQ0,5910
|
|
23
|
-
ocrd/decorators/__init__.py,sha256=
|
|
23
|
+
ocrd/decorators/__init__.py,sha256=PyXX7vxdWkRHixas9dWUtyO3YLczcly8ZEpfZDSMVp8,7639
|
|
24
24
|
ocrd/decorators/loglevel_option.py,sha256=tgipROEu3t4hkwWvFssd80k2SbTBwBIC4WNE6Gc-XAg,798
|
|
25
25
|
ocrd/decorators/mets_find_options.py,sha256=d4oATKMP6bFQHNqOK6nLqgUiWF2FYdkPvzkTVRMYpKo,635
|
|
26
|
-
ocrd/decorators/ocrd_cli_options.py,sha256=
|
|
26
|
+
ocrd/decorators/ocrd_cli_options.py,sha256=lIvtE8re1VmpHm45u71ltE0QJS8nyd28HhLC7zGSvlo,2691
|
|
27
27
|
ocrd/decorators/parameter_option.py,sha256=n8hYw7XVTd3i3tvpK8F1Jx_CqRp6EGF9qJVH95yj92Q,1076
|
|
28
28
|
ocrd/processor/__init__.py,sha256=39ymNwYRdc-b_OJzzKmWCvo2ga3KdsGSYDHE1Hzkn_w,274
|
|
29
|
-
ocrd/processor/base.py,sha256=
|
|
30
|
-
ocrd/processor/concurrent.py,sha256=IMMBFGDGqfpgm7Rp6J_dnXVckyBKntwARwcKDnxadHQ,38217
|
|
29
|
+
ocrd/processor/base.py,sha256=L396ON0p77D8r34CESJ2SIYspTZ6mYFqaBq6DYg6ywM,59315
|
|
31
30
|
ocrd/processor/helpers.py,sha256=8ngrqAJ01BSoSJNsIoK_YfA8QdryM5y0MqaqA9f7ELM,10483
|
|
32
31
|
ocrd/processor/ocrd_page_result.py,sha256=eDkpyVHcpaBzTHXiGrcNk9PP9Xr-XZru2w_uoX_ZeNA,510
|
|
33
32
|
ocrd/processor/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
-
ocrd/processor/builtin/dummy_processor.py,sha256=
|
|
33
|
+
ocrd/processor/builtin/dummy_processor.py,sha256=a-4kKJ1JeXQuBIyyN8w2R3s7ov-wAfyEdEz3nxrf0sU,3479
|
|
34
|
+
ocrd/processor/builtin/filter_processor.py,sha256=nDnXjo2tDCjodURb8VlB4VJtRwWGx261jH7AG91edSk,4317
|
|
35
35
|
ocrd/processor/builtin/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
|
-
ocrd/processor/builtin/dummy/ocrd-tool.json,sha256=
|
|
37
|
-
ocrd_modelfactory/__init__.py,sha256=
|
|
36
|
+
ocrd/processor/builtin/dummy/ocrd-tool.json,sha256=VoI37paWiUyMkTN5Qqau8R1Clmw24-HcZu4wjy1Br9Y,2311
|
|
37
|
+
ocrd_modelfactory/__init__.py,sha256=NyJT1uSvmeEwibRFOkh0AEoVnYfP0mzxU--pP23B-TQ,4404
|
|
38
38
|
ocrd_models/__init__.py,sha256=A0aj0mOraNb-xfiUueACdoaqISnp0qH-F49nTJg2vCs,380
|
|
39
39
|
ocrd_models/constants.py,sha256=fI6Qz4OPOm6UBLQ_P2dlpjcwB0XFJZ7AgxxKqgc75X0,2724
|
|
40
40
|
ocrd_models/mets-empty.xml,sha256=dFixfbxSXrgjZx9BfdIKWHX-khNmp7dNYaFe2qQSwCY,1203
|
|
41
41
|
ocrd_models/ocrd_agent.py,sha256=E9OtDhz9UfKb6ou2qvsuCL9NlO1V6zMb0s8nVq8dVos,5609
|
|
42
|
-
ocrd_models/ocrd_exif.py,sha256=
|
|
42
|
+
ocrd_models/ocrd_exif.py,sha256=wRSprHxCy9LCXw41Fi9kp-CbFc5NFX9ZFIFNszB41qk,4585
|
|
43
43
|
ocrd_models/ocrd_file.py,sha256=7lyHezuNnl2FEYV1lV35-QTCrgYAL-3wO2ulFUNq2Ak,9717
|
|
44
44
|
ocrd_models/ocrd_mets.py,sha256=cRBEnvRNmRUhcrKouqygTQqYA-XdgyA-FNLwt86V0vg,42878
|
|
45
|
-
ocrd_models/ocrd_page.py,sha256=
|
|
46
|
-
ocrd_models/ocrd_page_generateds.py,sha256=
|
|
45
|
+
ocrd_models/ocrd_page.py,sha256=TTCnvpKGyZx1dqH8LnDiVVVPjU6emWGVLO_4o9rQHtw,6233
|
|
46
|
+
ocrd_models/ocrd_page_generateds.py,sha256=vjXPob5UMxYxPI6un8SYTL673Nhph0E2WEZexBgbvY4,841794
|
|
47
47
|
ocrd_models/ocrd_xml_base.py,sha256=OW57mXLlwm1nH8CNefvXmwLRws9KL9zSrb-3vH--mX8,1641
|
|
48
48
|
ocrd_models/report.py,sha256=luZxvzAAQyGYOlRNSJQUIUIANG81iGmBW5ag-uXxKCA,2026
|
|
49
49
|
ocrd_models/utils.py,sha256=0_WHf5NEn1WC8MKJc6X_RK8gW-70Z09_mslkKOj7uF8,2369
|
|
50
|
+
ocrd_models/xpath_functions.py,sha256=AwR8tHf56-mmIksnw_GeOQ760sxNHqK92T7z9OfsEEs,1437
|
|
50
51
|
ocrd_network/__init__.py,sha256=gMejC614J5PPGgXDKBiQS0jt-Jx8qOrLbWH7zt8x8Gs,374
|
|
51
|
-
ocrd_network/client.py,sha256=
|
|
52
|
-
ocrd_network/client_utils.py,sha256=
|
|
52
|
+
ocrd_network/client.py,sha256=rzqtamZ8krRRy-QTO-AeWH8Lr3HhRiQe2R1-Lovd40g,3020
|
|
53
|
+
ocrd_network/client_utils.py,sha256=VVZMNBgGznh41exZ78S48X3DDwHcWTuOq-LNdxjRvak,5002
|
|
53
54
|
ocrd_network/constants.py,sha256=IeNtcU6dqonDE3Zw83_61auhS8X2b8wsjAxYg1zvK-M,1902
|
|
54
55
|
ocrd_network/database.py,sha256=fcft7vdRDoR7vmPL1xNYTIeOg5DwRPcggwYDYxLy5ik,10706
|
|
55
56
|
ocrd_network/logging_utils.py,sha256=bO9TQqBXw9CIZEKp8tHXbeE2NuJWMiaQDHzS05b4ajo,2153
|
|
56
57
|
ocrd_network/param_validators.py,sha256=Jl1VwiPPKJ50k-xEHLdvW-1QDOkJHCiMz4k9Ipqm-Uc,1489
|
|
57
58
|
ocrd_network/process_helpers.py,sha256=KpkInXsa5bgrxvTOouyMJ0NgJhaz0J9Gjs5sZHBcH64,2373
|
|
58
|
-
ocrd_network/processing_server.py,sha256=
|
|
59
|
-
ocrd_network/processing_worker.py,sha256=
|
|
60
|
-
ocrd_network/processor_server.py,sha256=
|
|
61
|
-
ocrd_network/server_cache.py,sha256=
|
|
62
|
-
ocrd_network/server_utils.py,sha256=
|
|
63
|
-
ocrd_network/tcp_to_uds_mets_proxy.py,sha256=
|
|
64
|
-
ocrd_network/utils.py,sha256=
|
|
59
|
+
ocrd_network/processing_server.py,sha256=qBiYk4wgTLqhHvbmDWu_F626BfSfyvkoCD-i0ZwsBSE,42109
|
|
60
|
+
ocrd_network/processing_worker.py,sha256=fhIvmDQAYOkHYtUs5IB8Jk2lOKUTIBk3DskAsFloijA,12591
|
|
61
|
+
ocrd_network/processor_server.py,sha256=2CD9TlinXk6x1jFjP5VWOXgJe8lAQdxc9zjZuVy3EOw,9931
|
|
62
|
+
ocrd_network/server_cache.py,sha256=LpvJ-_Lbaeo4M3t8rZDdm9DAErZr8lDlma6pYc0m7aQ,13149
|
|
63
|
+
ocrd_network/server_utils.py,sha256=Uge5F2VagPAEpcyU_Qf8AiecObIGXE0ilD8DaK7bTdE,12222
|
|
64
|
+
ocrd_network/tcp_to_uds_mets_proxy.py,sha256=yRW-O6ihd31gf7xqQBIBb_ZQQgqisMyOdRI216ehq_A,3160
|
|
65
|
+
ocrd_network/utils.py,sha256=XzPXeSPCVjWLQM540PCpxfJ5hqjJ85_OQBjnf9HlDtE,6759
|
|
65
66
|
ocrd_network/cli/__init__.py,sha256=F7YVqxw-9glz6-ghG0Kp5XXeV1-rL1emVSXLCWxdTF0,306
|
|
66
|
-
ocrd_network/cli/client.py,sha256=
|
|
67
|
+
ocrd_network/cli/client.py,sha256=gFEXjz-d074CpvimqaM4kJRbJVNYRAOK-jsUl2EAUVs,8424
|
|
67
68
|
ocrd_network/cli/processing_server.py,sha256=rAci6RsHlZ0c87GuLdfdCQCiGNcDEu4NEEQiwKJqVUo,796
|
|
68
69
|
ocrd_network/cli/processing_worker.py,sha256=ZuaCkbKV_WKJV7cGOjZ6RLrjjppymnwNCiznFMlclAg,1897
|
|
69
70
|
ocrd_network/cli/processor_server.py,sha256=Vto7UekFo_g83aHqwDmhge9bhPzk0b7O-L46dSfIpJc,1259
|
|
@@ -74,7 +75,7 @@ ocrd_network/models/ocrd_tool.py,sha256=WhxSwDyEXtF03Cu8u2tLZcYM0tCacL4PX1GveAxn
|
|
|
74
75
|
ocrd_network/models/workflow.py,sha256=GL8q7RX9fGdXG3iVyJpCeLXbWa-2qI_SIxqhzxs9VK8,189
|
|
75
76
|
ocrd_network/models/workspace.py,sha256=42G8RoS0wJ902LHyM09NIaqHoRdmP-Oib3d5I07sTBQ,1579
|
|
76
77
|
ocrd_network/rabbitmq_utils/__init__.py,sha256=8MRawAiSpZ9IQUBcLAS7sYOzNC9sI11eZOLk7k92_ZQ,691
|
|
77
|
-
ocrd_network/rabbitmq_utils/connector.py,sha256=
|
|
78
|
+
ocrd_network/rabbitmq_utils/connector.py,sha256=N6mzjIf5FkVIno3FI1AksZY4F5jMUAm8baay0nXZx8w,11343
|
|
78
79
|
ocrd_network/rabbitmq_utils/constants.py,sha256=Zu_dKJASfrgnIvEZZlFX9uDR9y6w7zy0KhW7gP7wHDE,1063
|
|
79
80
|
ocrd_network/rabbitmq_utils/consumer.py,sha256=3WeryDmo0dSD9U0eLODbDElscvhEYjNeCBIewQHYfws,2488
|
|
80
81
|
ocrd_network/rabbitmq_utils/helpers.py,sha256=y8FTC1ml_IBNcFo14GgCNtNRxYDotQn7U14HmTkv6h0,4874
|
|
@@ -83,12 +84,12 @@ ocrd_network/rabbitmq_utils/publisher.py,sha256=mw4XQQhRE1xUQVgEUseyG845iIgVO-9G
|
|
|
83
84
|
ocrd_network/runtime_data/__init__.py,sha256=3jYkmT4mxMUcpbDaSw7Ld0KTedGEx_5vUQPDjwUyJZc,367
|
|
84
85
|
ocrd_network/runtime_data/config_parser.py,sha256=Vr0FbsqmsoiuhDgZ7KFdeFZj9JvUulcOS2PCRFQQNHY,2364
|
|
85
86
|
ocrd_network/runtime_data/connection_clients.py,sha256=DZyAvkNyMaIddGJs56s2pMP_fK-XWAtICxk1cjvkWYM,4207
|
|
86
|
-
ocrd_network/runtime_data/deployer.py,sha256=
|
|
87
|
+
ocrd_network/runtime_data/deployer.py,sha256=LkDUG0uJf_V4SteiOM3EWwhKtdANCjmAOEAJJDshN30,9111
|
|
87
88
|
ocrd_network/runtime_data/hosts.py,sha256=ml19ptzH4TFofyJR-Qp_Mn3sZUFbWoNe__rRXZSj_WE,12185
|
|
88
89
|
ocrd_network/runtime_data/network_agents.py,sha256=5p_zKLqECBIHLw-Ya6eKcKSZcUM4ESiipEIphVxHBEA,5192
|
|
89
90
|
ocrd_network/runtime_data/network_services.py,sha256=xrPpFUU_Pa-XzGe2FEt5RmO17xqykIUmTr_9g6S7XSs,7892
|
|
90
91
|
ocrd_utils/__init__.py,sha256=U_zAQJwxg_aJ4CR84CKMNAUP6Cob8Er8Ikj42JmnUKo,5977
|
|
91
|
-
ocrd_utils/config.py,sha256=
|
|
92
|
+
ocrd_utils/config.py,sha256=1_8j4kpKK5gxhFKObbBEzmq4JazTtKEkGe14Ch_tpw0,11796
|
|
92
93
|
ocrd_utils/constants.py,sha256=ImbG1d8t2MW3uuFi-mN6aY90Zn74liAKZBKlfuKN86w,3278
|
|
93
94
|
ocrd_utils/deprecate.py,sha256=4i50sZsA3Eevqn5D-SL5yGf9KEZfGCV4A5Anzn1GRMs,1026
|
|
94
95
|
ocrd_utils/image.py,sha256=zNNX1cnRy6yvrxx8mnYQiqWraAh5-i4a1AOfCCg4SmI,24781
|
|
@@ -119,9 +120,9 @@ ocrd_validators/xlink.xsd,sha256=8fW7YAMWXN2PbB_MMvj9H5ZeFoEBDzuYBtlGC8_6ijw,318
|
|
|
119
120
|
ocrd_validators/xsd_mets_validator.py,sha256=4GWfLyqkmca0x7osDuXuExYuM0HWVrKoqn0S35sFhHU,467
|
|
120
121
|
ocrd_validators/xsd_page_validator.py,sha256=BNz_9u-Ek4UCeyZu3KxSQoolfW9lvuaSR9nIu1XXxeE,467
|
|
121
122
|
ocrd_validators/xsd_validator.py,sha256=6HrVAf6SzCvfUIuQdIzz9bOq4V-zhyii9yrUPoK2Uvo,2094
|
|
122
|
-
ocrd-3.0.
|
|
123
|
-
ocrd-3.0.
|
|
124
|
-
ocrd-3.0.
|
|
125
|
-
ocrd-3.0.
|
|
126
|
-
ocrd-3.0.
|
|
127
|
-
ocrd-3.0.
|
|
123
|
+
ocrd-3.0.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
124
|
+
ocrd-3.0.2.dist-info/METADATA,sha256=e6sO3z4kPE8qe8Ne-aPLX5Tl03M_NcrORBnlAQodLDE,10442
|
|
125
|
+
ocrd-3.0.2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
126
|
+
ocrd-3.0.2.dist-info/entry_points.txt,sha256=4hcJ2LkK_OlIabHnKgFit35Ap7b5Lz1Gb4hzkxV0Kiw,152
|
|
127
|
+
ocrd-3.0.2.dist-info/top_level.txt,sha256=pUgiN42t4KXC5rvpi6V8atza31XP4SCznXpXlVlvomM,75
|
|
128
|
+
ocrd-3.0.2.dist-info/RECORD,,
|
ocrd_modelfactory/__init__.py
CHANGED
|
@@ -101,5 +101,11 @@ def page_from_file(input_file, **kwargs) -> OcrdPage:
|
|
|
101
101
|
if input_file.mimetype.startswith('image'):
|
|
102
102
|
return page_from_image(input_file)
|
|
103
103
|
if input_file.mimetype == MIMETYPE_PAGE:
|
|
104
|
-
|
|
104
|
+
revmap = {}
|
|
105
|
+
# the old/default gds.reverse_node_mapping is useless
|
|
106
|
+
# since 2.39.4, we can actually get the exact reverse mapping for perfect round-trip
|
|
107
|
+
# but awkwardly, we have to pass the dict in for that
|
|
108
|
+
page = OcrdPage(*parseEtree(input_file.local_filename, reverse_mapping=revmap, silence=True))
|
|
109
|
+
page.revmap = revmap
|
|
110
|
+
return page
|
|
105
111
|
raise ValueError("Unsupported mimetype '%s'" % input_file.mimetype)
|
ocrd_models/ocrd_exif.py
CHANGED
|
@@ -49,11 +49,11 @@ class OcrdExif():
|
|
|
49
49
|
for prop in ['compression', 'photometric_interpretation']:
|
|
50
50
|
setattr(self, prop, img.info[prop] if prop in img.info else None)
|
|
51
51
|
if img.filename:
|
|
52
|
-
ret = run(['identify', '-format', r'%[resolution.x] %[resolution.y] %U', img.filename], check=False, stderr=PIPE, stdout=PIPE)
|
|
52
|
+
ret = run(['identify', '-format', r'%[resolution.x] %[resolution.y] %U ', img.filename], check=False, stderr=PIPE, stdout=PIPE)
|
|
53
53
|
else:
|
|
54
54
|
with BytesIO() as bio:
|
|
55
55
|
img.save(bio, format=img.format)
|
|
56
|
-
ret = run(['identify', '-format', r'%[resolution.x] %[resolution.y] %U', '/dev/stdin'], check=False, stderr=PIPE, stdout=PIPE, input=bio.getvalue())
|
|
56
|
+
ret = run(['identify', '-format', r'%[resolution.x] %[resolution.y] %U ', '/dev/stdin'], check=False, stderr=PIPE, stdout=PIPE, input=bio.getvalue())
|
|
57
57
|
if ret.returncode:
|
|
58
58
|
stderr = ret.stderr.decode('utf-8')
|
|
59
59
|
if 'no decode delegate for this image format' in stderr:
|
ocrd_models/ocrd_page.py
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
API to PAGE-XML, generated with generateDS from XML schema.
|
|
3
3
|
"""
|
|
4
4
|
from io import StringIO
|
|
5
|
-
from typing import Dict, Union
|
|
5
|
+
from typing import Dict, Union, Any
|
|
6
6
|
from lxml import etree as ET
|
|
7
|
+
from elementpath import XPath2Parser, XPathContext
|
|
7
8
|
|
|
8
9
|
__all__ = [
|
|
9
10
|
'parse',
|
|
@@ -132,6 +133,7 @@ from .ocrd_page_generateds import (
|
|
|
132
133
|
)
|
|
133
134
|
|
|
134
135
|
from .constants import NAMESPACES
|
|
136
|
+
from .xpath_functions import pc_functions
|
|
135
137
|
|
|
136
138
|
# add docstrings
|
|
137
139
|
parse.__doc__ = (
|
|
@@ -189,12 +191,25 @@ class OcrdPage():
|
|
|
189
191
|
pcgts : PcGtsType,
|
|
190
192
|
etree : ET._Element,
|
|
191
193
|
mapping : Dict[str, ET._Element],
|
|
192
|
-
revmap : Dict[ET._Element,
|
|
194
|
+
revmap : Dict[ET._Element, Any],
|
|
193
195
|
):
|
|
194
196
|
self._pcgts = pcgts
|
|
195
197
|
self.etree = etree
|
|
196
198
|
self.mapping = mapping
|
|
197
199
|
self.revmap = revmap
|
|
200
|
+
self.xpath_parser = XPath2Parser(namespaces={
|
|
201
|
+
'page': NAMESPACES['page'],
|
|
202
|
+
'pc': NAMESPACES['page']})
|
|
203
|
+
for func in pc_functions:
|
|
204
|
+
name = func.__name__.replace('_', '-')
|
|
205
|
+
if name.startswith('pc-'):
|
|
206
|
+
name = name[3:]
|
|
207
|
+
elif name.startswith('pc'):
|
|
208
|
+
name = name[2:]
|
|
209
|
+
# register
|
|
210
|
+
self.xpath_parser.external_function(func, name=name, prefix='pc')
|
|
211
|
+
self.xpath_context = XPathContext(self.etree)
|
|
212
|
+
self.xpath = lambda expression: self.xpath_parser.parse(expression).get_results(self.xpath_context)
|
|
198
213
|
|
|
199
214
|
def __getattr__(self, name):
|
|
200
215
|
return getattr(self._pcgts, name)
|
|
@@ -208,11 +223,15 @@ def to_xml(el, skip_declaration=False) -> str:
|
|
|
208
223
|
# XXX remove potential empty ReadingOrder
|
|
209
224
|
if hasattr(el, 'prune_ReadingOrder'):
|
|
210
225
|
el.prune_ReadingOrder()
|
|
226
|
+
if hasattr(el, 'original_tagname_'):
|
|
227
|
+
name = el.original_tagname_ or 'PcGts'
|
|
228
|
+
else:
|
|
229
|
+
name = 'PcGts'
|
|
211
230
|
sio = StringIO()
|
|
212
231
|
el.export(
|
|
213
232
|
outfile=sio,
|
|
214
233
|
level=0,
|
|
215
|
-
name_=
|
|
234
|
+
name_=name,
|
|
216
235
|
namespaceprefix_='pc:',
|
|
217
236
|
namespacedef_='xmlns:pc="%s" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="%s %s/pagecontent.xsd"' % (
|
|
218
237
|
NAMESPACES['page'],
|