ocrd 3.0.0b6__py3-none-any.whl → 3.0.1__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.
@@ -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=U62eih1_O_N0StunVFkEustFs2PlrcMzccraj6_QRk4,21295
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=8BMVKJq8J56hugi8vtGn9Ffuk7oRkbs197aG74aKbCY,16733
8
+ ocrd/resource_manager.py,sha256=kIWDoKxWH4IJE1gcoTcCRQjYjieCqiQclyuyF6Y9b8A,16813
9
9
  ocrd/task_sequence.py,sha256=spiaUQaMM7M8WdBDoQGmLuTPm7tOugYXD6rcJ2UXzxw,6991
10
10
  ocrd/workspace.py,sha256=cedqK7es2i2nwQCiUiVyWk3j4-nH7bsi6TF7v8siTio,65794
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=lNR6wMf7JhQ8Jf33tUkowJr0mB3423OMY0_6dkMRLvU,2672
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,49 +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=NWqZUTSBve6yIBgTN3miGmz4w1IFefLhG92qXx5ADtw,7620
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
26
  ocrd/decorators/ocrd_cli_options.py,sha256=hr2EugwAY_-GJ7F7g77Od9o9eAqhfLBHSpfmCql2OCU,2665
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=n3eJWmh8jFFrwZrjV_pBoL8uV-VgFy9BGOBJtKKEaH8,58432
29
+ ocrd/processor/base.py,sha256=rVTQeUpZR_rBDh44Q7Xtl5TGcEdyBhMTDfpAgx4eLPg,59295
30
30
  ocrd/processor/helpers.py,sha256=8ngrqAJ01BSoSJNsIoK_YfA8QdryM5y0MqaqA9f7ELM,10483
31
31
  ocrd/processor/ocrd_page_result.py,sha256=eDkpyVHcpaBzTHXiGrcNk9PP9Xr-XZru2w_uoX_ZeNA,510
32
32
  ocrd/processor/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- ocrd/processor/builtin/dummy_processor.py,sha256=iWiw_jJXOqwr7-hFjdkmTCCo1xGr6MLGOshx81PTu-8,3548
33
+ ocrd/processor/builtin/dummy_processor.py,sha256=a-4kKJ1JeXQuBIyyN8w2R3s7ov-wAfyEdEz3nxrf0sU,3479
34
+ ocrd/processor/builtin/filter_processor.py,sha256=nDnXjo2tDCjodURb8VlB4VJtRwWGx261jH7AG91edSk,4317
34
35
  ocrd/processor/builtin/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- ocrd/processor/builtin/dummy/ocrd-tool.json,sha256=aTA2FZRsRsrkbTctkazFeRu4xsTF6yCdeY07cMzOyt4,677
36
- ocrd_modelfactory/__init__.py,sha256=0baYSJXrOCTCguHkE6hBeqpGNVUe3aZUocv64A-DMDk,4094
36
+ ocrd/processor/builtin/dummy/ocrd-tool.json,sha256=VoI37paWiUyMkTN5Qqau8R1Clmw24-HcZu4wjy1Br9Y,2311
37
+ ocrd_modelfactory/__init__.py,sha256=NyJT1uSvmeEwibRFOkh0AEoVnYfP0mzxU--pP23B-TQ,4404
37
38
  ocrd_models/__init__.py,sha256=A0aj0mOraNb-xfiUueACdoaqISnp0qH-F49nTJg2vCs,380
38
39
  ocrd_models/constants.py,sha256=fI6Qz4OPOm6UBLQ_P2dlpjcwB0XFJZ7AgxxKqgc75X0,2724
39
40
  ocrd_models/mets-empty.xml,sha256=dFixfbxSXrgjZx9BfdIKWHX-khNmp7dNYaFe2qQSwCY,1203
40
41
  ocrd_models/ocrd_agent.py,sha256=E9OtDhz9UfKb6ou2qvsuCL9NlO1V6zMb0s8nVq8dVos,5609
41
- ocrd_models/ocrd_exif.py,sha256=5BRLjvB6jg36V68i8jvVnT2SSNnpqLbhLsaMuP51Scw,4583
42
+ ocrd_models/ocrd_exif.py,sha256=wRSprHxCy9LCXw41Fi9kp-CbFc5NFX9ZFIFNszB41qk,4585
42
43
  ocrd_models/ocrd_file.py,sha256=7lyHezuNnl2FEYV1lV35-QTCrgYAL-3wO2ulFUNq2Ak,9717
43
44
  ocrd_models/ocrd_mets.py,sha256=cRBEnvRNmRUhcrKouqygTQqYA-XdgyA-FNLwt86V0vg,42878
44
- ocrd_models/ocrd_page.py,sha256=sVIvvMeBT8eZnOfW0DTjQUNyu62-llz0v_Ga5Xo-tUM,5393
45
- ocrd_models/ocrd_page_generateds.py,sha256=wfx3vESMAi08rl6-16zNVJe4E3B6APIvL6RCr1roAzg,774092
45
+ ocrd_models/ocrd_page.py,sha256=TTCnvpKGyZx1dqH8LnDiVVVPjU6emWGVLO_4o9rQHtw,6233
46
+ ocrd_models/ocrd_page_generateds.py,sha256=vjXPob5UMxYxPI6un8SYTL673Nhph0E2WEZexBgbvY4,841794
46
47
  ocrd_models/ocrd_xml_base.py,sha256=OW57mXLlwm1nH8CNefvXmwLRws9KL9zSrb-3vH--mX8,1641
47
48
  ocrd_models/report.py,sha256=luZxvzAAQyGYOlRNSJQUIUIANG81iGmBW5ag-uXxKCA,2026
48
49
  ocrd_models/utils.py,sha256=0_WHf5NEn1WC8MKJc6X_RK8gW-70Z09_mslkKOj7uF8,2369
50
+ ocrd_models/xpath_functions.py,sha256=AwR8tHf56-mmIksnw_GeOQ760sxNHqK92T7z9OfsEEs,1437
49
51
  ocrd_network/__init__.py,sha256=gMejC614J5PPGgXDKBiQS0jt-Jx8qOrLbWH7zt8x8Gs,374
50
- ocrd_network/client.py,sha256=j9PJ9QHI6qJ_qAxVlpTk5mLfq0Xemj_Br-0SX-09U5M,2834
51
- ocrd_network/client_utils.py,sha256=JDBzDOGY2G_bgS8fQ677CMHG9DWSvIuWTlEFzdsXr_Q,4527
52
+ ocrd_network/client.py,sha256=rzqtamZ8krRRy-QTO-AeWH8Lr3HhRiQe2R1-Lovd40g,3020
53
+ ocrd_network/client_utils.py,sha256=VVZMNBgGznh41exZ78S48X3DDwHcWTuOq-LNdxjRvak,5002
52
54
  ocrd_network/constants.py,sha256=IeNtcU6dqonDE3Zw83_61auhS8X2b8wsjAxYg1zvK-M,1902
53
55
  ocrd_network/database.py,sha256=fcft7vdRDoR7vmPL1xNYTIeOg5DwRPcggwYDYxLy5ik,10706
54
56
  ocrd_network/logging_utils.py,sha256=bO9TQqBXw9CIZEKp8tHXbeE2NuJWMiaQDHzS05b4ajo,2153
55
57
  ocrd_network/param_validators.py,sha256=Jl1VwiPPKJ50k-xEHLdvW-1QDOkJHCiMz4k9Ipqm-Uc,1489
56
58
  ocrd_network/process_helpers.py,sha256=KpkInXsa5bgrxvTOouyMJ0NgJhaz0J9Gjs5sZHBcH64,2373
57
- ocrd_network/processing_server.py,sha256=8EFQIcjiQ-AEc4goaggxa-hYWhJW9fMzR768ZIX8vZE,41139
58
- ocrd_network/processing_worker.py,sha256=VV_pC5ljtjPpMY89MElAMZ-YUJdKk7IPugxFfDy8viA,12396
59
- ocrd_network/processor_server.py,sha256=RVX0MSzzayDdqHg7Kga7L4vOsjmQcoRYObh6Naxz-U4,9858
60
- ocrd_network/server_cache.py,sha256=GKX91SkVahgAk0nGWT0S-0qWp7a9ubxncjwwLTKs7JY,12829
61
- ocrd_network/server_utils.py,sha256=NBSZvLD7o43fMtSkqR70ougW-IWCW9J71GHqZIBeD0Q,10982
62
- ocrd_network/tcp_to_uds_mets_proxy.py,sha256=pNEl5jH09M-zuUIx25nog7IZ-fkXabi3724kQ_3iMTs,2894
63
- ocrd_network/utils.py,sha256=Vm8EiBBSKv5fAlkcb6nB8-duFN633ZIRAcPKfk7iyZY,6366
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
64
66
  ocrd_network/cli/__init__.py,sha256=F7YVqxw-9glz6-ghG0Kp5XXeV1-rL1emVSXLCWxdTF0,306
65
- ocrd_network/cli/client.py,sha256=4bpsDRwm3WVFHA6ITM-VKAFx-JQ6ldbBKFVYleWhiW8,7515
67
+ ocrd_network/cli/client.py,sha256=XYWbeSiPK4BQXuyTq_FTOXEKljXVLkukWfx07aKbthY,8424
66
68
  ocrd_network/cli/processing_server.py,sha256=rAci6RsHlZ0c87GuLdfdCQCiGNcDEu4NEEQiwKJqVUo,796
67
69
  ocrd_network/cli/processing_worker.py,sha256=ZuaCkbKV_WKJV7cGOjZ6RLrjjppymnwNCiznFMlclAg,1897
68
70
  ocrd_network/cli/processor_server.py,sha256=Vto7UekFo_g83aHqwDmhge9bhPzk0b7O-L46dSfIpJc,1259
@@ -73,7 +75,7 @@ ocrd_network/models/ocrd_tool.py,sha256=WhxSwDyEXtF03Cu8u2tLZcYM0tCacL4PX1GveAxn
73
75
  ocrd_network/models/workflow.py,sha256=GL8q7RX9fGdXG3iVyJpCeLXbWa-2qI_SIxqhzxs9VK8,189
74
76
  ocrd_network/models/workspace.py,sha256=42G8RoS0wJ902LHyM09NIaqHoRdmP-Oib3d5I07sTBQ,1579
75
77
  ocrd_network/rabbitmq_utils/__init__.py,sha256=8MRawAiSpZ9IQUBcLAS7sYOzNC9sI11eZOLk7k92_ZQ,691
76
- ocrd_network/rabbitmq_utils/connector.py,sha256=tLYayGlGRrqLkQChhL5FyUyF0MQTi4w-nWKxz_IuX-0,11342
78
+ ocrd_network/rabbitmq_utils/connector.py,sha256=N6mzjIf5FkVIno3FI1AksZY4F5jMUAm8baay0nXZx8w,11343
77
79
  ocrd_network/rabbitmq_utils/constants.py,sha256=Zu_dKJASfrgnIvEZZlFX9uDR9y6w7zy0KhW7gP7wHDE,1063
78
80
  ocrd_network/rabbitmq_utils/consumer.py,sha256=3WeryDmo0dSD9U0eLODbDElscvhEYjNeCBIewQHYfws,2488
79
81
  ocrd_network/rabbitmq_utils/helpers.py,sha256=y8FTC1ml_IBNcFo14GgCNtNRxYDotQn7U14HmTkv6h0,4874
@@ -82,18 +84,18 @@ ocrd_network/rabbitmq_utils/publisher.py,sha256=mw4XQQhRE1xUQVgEUseyG845iIgVO-9G
82
84
  ocrd_network/runtime_data/__init__.py,sha256=3jYkmT4mxMUcpbDaSw7Ld0KTedGEx_5vUQPDjwUyJZc,367
83
85
  ocrd_network/runtime_data/config_parser.py,sha256=Vr0FbsqmsoiuhDgZ7KFdeFZj9JvUulcOS2PCRFQQNHY,2364
84
86
  ocrd_network/runtime_data/connection_clients.py,sha256=DZyAvkNyMaIddGJs56s2pMP_fK-XWAtICxk1cjvkWYM,4207
85
- ocrd_network/runtime_data/deployer.py,sha256=W7SHn6XBC5fIaTJIMnHOMxEyp7dVqvHY4_cepaloMhQ,8315
87
+ ocrd_network/runtime_data/deployer.py,sha256=LkDUG0uJf_V4SteiOM3EWwhKtdANCjmAOEAJJDshN30,9111
86
88
  ocrd_network/runtime_data/hosts.py,sha256=ml19ptzH4TFofyJR-Qp_Mn3sZUFbWoNe__rRXZSj_WE,12185
87
89
  ocrd_network/runtime_data/network_agents.py,sha256=5p_zKLqECBIHLw-Ya6eKcKSZcUM4ESiipEIphVxHBEA,5192
88
90
  ocrd_network/runtime_data/network_services.py,sha256=xrPpFUU_Pa-XzGe2FEt5RmO17xqykIUmTr_9g6S7XSs,7892
89
91
  ocrd_utils/__init__.py,sha256=U_zAQJwxg_aJ4CR84CKMNAUP6Cob8Er8Ikj42JmnUKo,5977
90
- ocrd_utils/config.py,sha256=Rkqv5wWEmlDDD0l1IWo9TPgn5ppPnHPRH9FfkMST29E,11117
92
+ ocrd_utils/config.py,sha256=smjUAGK5n0iKZCs4dZAtrZurelcaavlFqhIUJWNMOi0,11796
91
93
  ocrd_utils/constants.py,sha256=ImbG1d8t2MW3uuFi-mN6aY90Zn74liAKZBKlfuKN86w,3278
92
94
  ocrd_utils/deprecate.py,sha256=4i50sZsA3Eevqn5D-SL5yGf9KEZfGCV4A5Anzn1GRMs,1026
93
95
  ocrd_utils/image.py,sha256=zNNX1cnRy6yvrxx8mnYQiqWraAh5-i4a1AOfCCg4SmI,24781
94
96
  ocrd_utils/introspect.py,sha256=gfBlmeEFuRmRUSgdSK0jOxRpYqDRXl2IAE6gv2MZ6as,1977
95
- ocrd_utils/logging.py,sha256=hC5_v0NDOeD_sVSFey8bmJM6bmhxgKgSHPU4EEuWP9Y,8386
96
- ocrd_utils/ocrd_logging.conf,sha256=kl9x9JS1d8h8F0QZabvrjZtW1iApIaChvkImYafKO5g,3623
97
+ ocrd_utils/logging.py,sha256=sHNfih9kBfvKsHdLqMK_ew9Pld1GsRyYlrZHIySujnw,7313
98
+ ocrd_utils/ocrd_logging.conf,sha256=JlWmA_5vg6HnjPGjTC4mA5vFHqmnEinwllSTiOw5CCo,3473
97
99
  ocrd_utils/os.py,sha256=acRRdDBI8L6BK0Mf773yKEzwdpZSFRBJEKB2crL4EjU,9865
98
100
  ocrd_utils/str.py,sha256=cRgqYILDGOAqWr0qrCrV52I3y4wvpwDVtnBGEUjXNS4,10116
99
101
  ocrd_validators/__init__.py,sha256=ZFc-UqRVBk9o1YesZFmr9lOepttNJ_NKx1Zdb7g_YsU,972
@@ -118,9 +120,9 @@ ocrd_validators/xlink.xsd,sha256=8fW7YAMWXN2PbB_MMvj9H5ZeFoEBDzuYBtlGC8_6ijw,318
118
120
  ocrd_validators/xsd_mets_validator.py,sha256=4GWfLyqkmca0x7osDuXuExYuM0HWVrKoqn0S35sFhHU,467
119
121
  ocrd_validators/xsd_page_validator.py,sha256=BNz_9u-Ek4UCeyZu3KxSQoolfW9lvuaSR9nIu1XXxeE,467
120
122
  ocrd_validators/xsd_validator.py,sha256=6HrVAf6SzCvfUIuQdIzz9bOq4V-zhyii9yrUPoK2Uvo,2094
121
- ocrd-3.0.0b6.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
122
- ocrd-3.0.0b6.dist-info/METADATA,sha256=Hvoh6U5USfeXBfTBrUIIoYWEUkj020L6pKRp81HW-lQ,10417
123
- ocrd-3.0.0b6.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
124
- ocrd-3.0.0b6.dist-info/entry_points.txt,sha256=tV_gAdO8cbnOjS0GmKfJKbN60xBAV2DQRX6hEjleSjE,94
125
- ocrd-3.0.0b6.dist-info/top_level.txt,sha256=pUgiN42t4KXC5rvpi6V8atza31XP4SCznXpXlVlvomM,75
126
- ocrd-3.0.0b6.dist-info/RECORD,,
123
+ ocrd-3.0.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
124
+ ocrd-3.0.1.dist-info/METADATA,sha256=y6mdBSjKmkTMSJ7F1LAvjCWeagTBRAeiYaka9_Z2Djc,10442
125
+ ocrd-3.0.1.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
126
+ ocrd-3.0.1.dist-info/entry_points.txt,sha256=4hcJ2LkK_OlIabHnKgFit35Ap7b5Lz1Gb4hzkxV0Kiw,152
127
+ ocrd-3.0.1.dist-info/top_level.txt,sha256=pUgiN42t4KXC5rvpi6V8atza31XP4SCznXpXlVlvomM,75
128
+ ocrd-3.0.1.dist-info/RECORD,,
@@ -1,3 +1,4 @@
1
1
  [console_scripts]
2
2
  ocrd = ocrd.cli:cli
3
3
  ocrd-dummy = ocrd.processor.builtin.dummy_processor:cli
4
+ ocrd-filter = ocrd.processor.builtin.filter_processor:cli
@@ -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
- return OcrdPage(*parseEtree(input_file.local_filename, silence=True))
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, str],
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_='PcGts',
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'],