rxiv-maker 1.17.0__py3-none-any.whl → 1.18.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.
@@ -0,0 +1,185 @@
1
+ r"""Label extraction utilities for manuscript processing.
2
+
3
+ This module provides centralized label extraction for figures, tables, equations,
4
+ and supplementary elements. Used by both DOCX export and LaTeX processing to
5
+ create consistent numbering across formats.
6
+
7
+ Examples:
8
+ >>> extractor = LabelExtractor()
9
+ >>> content = "![Figure](img.png)\\n{#fig:results}"
10
+ >>> fig_map = extractor.extract_figure_labels(content)
11
+ >>> fig_map
12
+ {'results': 1}
13
+ r
14
+ """
15
+
16
+ import re
17
+ from typing import Dict, Tuple
18
+
19
+
20
+ class LabelExtractor:
21
+ r"""Extract and map reference labels from markdown content."""
22
+
23
+ @staticmethod
24
+ def extract_figure_labels(content: str) -> Dict[str, int]:
25
+ r"""Extract main figure labels and create number mapping.
26
+
27
+ Finds patterns like: ![...](...)\\n{#fig:label}
28
+
29
+ Args:
30
+ content: Markdown content to scan
31
+
32
+ Returns:
33
+ Dict mapping label names to sequential numbers
34
+
35
+ Examples:
36
+ >>> extractor = LabelExtractor()
37
+ >>> content = "![](a.png)\\n{#fig:first}\\n\\n![](b.png)\\n{#fig:second}"
38
+ >>> extractor.extract_figure_labels(content)
39
+ {'first': 1, 'second': 2}
40
+ r
41
+ """
42
+ # Pattern: Image markdown followed by {#fig:label}
43
+ # Allow hyphens and underscores in label names
44
+ labels = re.findall(r"!\[[^\]]*\]\([^)]+\)\s*\n\s*\{#fig:([\w-]+)", content)
45
+ return {label: i + 1 for i, label in enumerate(labels)}
46
+
47
+ @staticmethod
48
+ def extract_supplementary_figure_labels(content: str) -> Dict[str, int]:
49
+ r"""Extract supplementary figure labels and create number mapping.
50
+
51
+ Finds patterns like: ![...](...)\\n{#sfig:label}
52
+
53
+ Args:
54
+ content: Markdown content to scan
55
+
56
+ Returns:
57
+ Dict mapping label names to sequential numbers
58
+
59
+ Examples:
60
+ >>> extractor = LabelExtractor()
61
+ >>> content = "![](s1.png)\\n{#sfig:methods}\\n\\n![](s2.png)\\n{#sfig:data}"
62
+ >>> extractor.extract_supplementary_figure_labels(content)
63
+ {'methods': 1, 'data': 2}
64
+ r
65
+ """
66
+ # Pattern: Image markdown followed by {#sfig:label}
67
+ labels = re.findall(r"!\[[^\]]*\]\([^)]+\)\s*\n\s*\{#sfig:([\w-]+)", content)
68
+ return {label: i + 1 for i, label in enumerate(labels)}
69
+
70
+ @staticmethod
71
+ def extract_supplementary_table_labels(content: str) -> Dict[str, int]:
72
+ r"""Extract supplementary table labels and create number mapping.
73
+
74
+ Finds both markdown format {#stable:label} and LaTeX format \\label{stable:label}.
75
+ Prefers LaTeX labels if both are present (matches PDF behavior).
76
+
77
+ Args:
78
+ content: Markdown/LaTeX content to scan
79
+
80
+ Returns:
81
+ Dict mapping label names to sequential numbers
82
+
83
+ Examples:
84
+ >>> extractor = LabelExtractor()
85
+ >>> content = "{#stable:params}\\n\\n{#stable:results}"
86
+ >>> extractor.extract_supplementary_table_labels(content)
87
+ {'params': 1, 'results': 2}
88
+ r
89
+ """
90
+ # Extract both markdown and LaTeX formats
91
+ markdown_labels = re.findall(r"\{#stable:([\w-]+)\}", content)
92
+ latex_labels = re.findall(r"\\label\{stable:([\w-]+)\}", content)
93
+
94
+ # Prefer LaTeX labels (matches PDF behavior), fall back to markdown
95
+ table_labels = latex_labels if latex_labels else markdown_labels
96
+
97
+ # Remove duplicates while preserving order
98
+ seen = set()
99
+ unique_labels = [label for label in table_labels if not (label in seen or seen.add(label))]
100
+
101
+ return {label: i + 1 for i, label in enumerate(unique_labels)}
102
+
103
+ @staticmethod
104
+ def extract_supplementary_note_labels(content: str) -> Dict[str, int]:
105
+ r"""Extract supplementary note labels and create number mapping.
106
+
107
+ Finds patterns like: {#snote:label}
108
+
109
+ Args:
110
+ content: Markdown content to scan
111
+
112
+ Returns:
113
+ Dict mapping label names to sequential numbers
114
+
115
+ Examples:
116
+ >>> extractor = LabelExtractor()
117
+ >>> content = "{#snote:methods}\\n\\n{#snote:analysis}"
118
+ >>> extractor.extract_supplementary_note_labels(content)
119
+ {'methods': 1, 'analysis': 2}
120
+ r
121
+ """
122
+ labels = re.findall(r"\{#snote:([\w-]+)\}", content)
123
+ return {label: i + 1 for i, label in enumerate(labels)}
124
+
125
+ @staticmethod
126
+ def extract_equation_labels(content: str) -> Dict[str, int]:
127
+ r"""Extract equation labels and create number mapping.
128
+
129
+ Finds patterns like: {#eq:label}
130
+
131
+ Args:
132
+ content: Markdown content to scan
133
+
134
+ Returns:
135
+ Dict mapping label names to sequential numbers
136
+
137
+ Examples:
138
+ >>> extractor = LabelExtractor()
139
+ >>> content = "{#eq:energy}\\n\\n{#eq:momentum}"
140
+ >>> extractor.extract_equation_labels(content)
141
+ {'energy': 1, 'momentum': 2}
142
+ r
143
+ """
144
+ labels = re.findall(r"\{#eq:([\w-]+)\}", content)
145
+ return {label: i + 1 for i, label in enumerate(labels)}
146
+
147
+ @staticmethod
148
+ def extract_all_labels(
149
+ main_content: str, si_content: str = ""
150
+ ) -> Tuple[Dict[str, int], Dict[str, int], Dict[str, int], Dict[str, int], Dict[str, int]]:
151
+ r"""Extract all label types from content.
152
+
153
+ Convenience method to extract all label types at once. Supplementary
154
+ elements are extracted from SI content if provided, otherwise from main content.
155
+
156
+ Args:
157
+ main_content: Main manuscript content
158
+ si_content: Supplementary information content (optional)
159
+
160
+ Returns:
161
+ Tuple of (figure_map, sfig_map, stable_map, snote_map, eq_map)
162
+
163
+ Examples:
164
+ >>> extractor = LabelExtractor()
165
+ >>> main = "![](fig.png)\\n{#fig:main}\\n{#eq:formula}"
166
+ >>> si = "![](sfig.png)\\n{#sfig:extra}"
167
+ >>> fig, sfig, stable, snote, eq = extractor.extract_all_labels(main, si)
168
+ >>> (fig, sfig, eq)
169
+ ({'main': 1}, {'extra': 1}, {'formula': 1})
170
+ r
171
+ """
172
+ extractor = LabelExtractor()
173
+
174
+ # Main figures and equations from main content
175
+ figure_map = extractor.extract_figure_labels(main_content)
176
+ equation_map = extractor.extract_equation_labels(main_content)
177
+
178
+ # Supplementary elements from SI content if provided, else main content
179
+ content_for_si = si_content if si_content else main_content
180
+
181
+ sfig_map = extractor.extract_supplementary_figure_labels(content_for_si)
182
+ stable_map = extractor.extract_supplementary_table_labels(content_for_si)
183
+ snote_map = extractor.extract_supplementary_note_labels(content_for_si)
184
+
185
+ return figure_map, sfig_map, stable_map, snote_map, equation_map
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rxiv-maker
3
- Version: 1.17.0
3
+ Version: 1.18.1
4
4
  Summary: Write scientific preprints in Markdown. Generate publication-ready PDFs efficiently.
5
5
  Project-URL: Homepage, https://github.com/HenriquesLab/rxiv-maker
6
6
  Project-URL: Documentation, https://github.com/HenriquesLab/rxiv-maker#readme
@@ -1,5 +1,5 @@
1
1
  rxiv_maker/__init__.py,sha256=p04JYC5ZhP6dLXkoWVlKNyiRvsDE1a4C88f9q4xO3tA,3268
2
- rxiv_maker/__version__.py,sha256=CL-1qxl1mf_Ojo5dLOqLI4QYLwKI2d3FN3EQOeV8qSk,51
2
+ rxiv_maker/__version__.py,sha256=tA_6cw-lsQhGEoyqC2fCF8har4ZiuDZgXQZ_VsshRFM,51
3
3
  rxiv_maker/rxiv_maker_cli.py,sha256=9Lu_mhFPXwx5jzAR6StCNxwCm_fkmP5qiOYdNuh_AwI,120
4
4
  rxiv_maker/validate.py,sha256=AIzgP59KbCQJqC9WIGfUdVv0xI6ud9g1fFznQkaGz5Q,9373
5
5
  rxiv_maker/cli/__init__.py,sha256=Jw0DTFUSofN-02xpVrt1UUzRcgH5NNd-GPNidhmNwpU,77
@@ -39,7 +39,7 @@ rxiv_maker/cli/framework/config_commands.py,sha256=a1uOQkCCw3d4qlro3OwHIorcoNg03
39
39
  rxiv_maker/cli/framework/content_commands.py,sha256=RilxKeG2c1m2fu0CtWAvP3cGh11DGx9P-nh2kIewAg4,22596
40
40
  rxiv_maker/cli/framework/decorators.py,sha256=fh085e3k1CaLSMoZevt8hvgnEuejrf-mcNS-dwXoY_A,10365
41
41
  rxiv_maker/cli/framework/utility_commands.py,sha256=drIAc1TAYpne76gj7SZeZhPozVAY5uL9GFPVT_Ez0-E,26437
42
- rxiv_maker/cli/framework/workflow_commands.py,sha256=KWPQY0dPRFcS5gG88xrqs90Wbu1-QDxjSyKfFBRI-Uc,32560
42
+ rxiv_maker/cli/framework/workflow_commands.py,sha256=Csls8VGmNCWPjpY9PMfdIAdzDhD_ZmSfRkhdcUihzpk,32699
43
43
  rxiv_maker/config/defaults.py,sha256=vHyLGVxe5-z9TLxu5f6NhquPvqQkER_KZv_j1I4_dHQ,3055
44
44
  rxiv_maker/config/validator.py,sha256=9XDPfo_YgasGt6NLkl6HIhaGh1fr6XsFNiXU2DSsivw,38299
45
45
  rxiv_maker/converters/__init__.py,sha256=d7WGsRwWqRQWO117IkKDP0Ap0ERiK0N2-dXHInye3_A,685
@@ -104,10 +104,10 @@ rxiv_maker/engines/operations/track_changes.py,sha256=jJZ-XnTFx8TMvcnX8_9D7ydc0G
104
104
  rxiv_maker/engines/operations/validate.py,sha256=OVmtRVtG-r1hoA8IqYaNC-ijN1a5ixM3X5Z8Gda-O2M,17142
105
105
  rxiv_maker/engines/operations/validate_pdf.py,sha256=qyrtL752Uap3i6ntQheY570soVjFZRJe8ANrw5AvHFs,5899
106
106
  rxiv_maker/exporters/__init__.py,sha256=NcTD1SDb8tTgsHhCS1A7TVEZncyWbDRTa6sJIdLqcsE,350
107
- rxiv_maker/exporters/docx_citation_mapper.py,sha256=3Cx3YctMawZFp3eQheKwL-maKwpRZp0Tnmh4nfTcCvw,8035
108
- rxiv_maker/exporters/docx_content_processor.py,sha256=2UKV3w4tIuqms8CwFUalDaetrOrIHDHMT7tQj8NGfCw,28573
109
- rxiv_maker/exporters/docx_exporter.py,sha256=rXaP8fr974TLcCgpsii2lEBCPXcuNTAtNYsaKa2M8T4,22315
110
- rxiv_maker/exporters/docx_writer.py,sha256=F5qbDUclGdK4PIktogZyUofnAFYsUMGrrHwTtqrVp2A,51733
107
+ rxiv_maker/exporters/docx_citation_mapper.py,sha256=oSy1LglLvxlmhO18bzl3EInA2PleE8nXqEgQIIRVzwE,5170
108
+ rxiv_maker/exporters/docx_content_processor.py,sha256=FoOaF9BoEpZEF3HG3pzFZFgYbYKwbgRNwkOyURZ8XtI,27895
109
+ rxiv_maker/exporters/docx_exporter.py,sha256=7HYgQSGE_7xl3PTMSPKXIW6yHg-b3MU9ASXG-rKVSXo,21456
110
+ rxiv_maker/exporters/docx_writer.py,sha256=JvNVprMqdvvDGf65ESsEqf7-A33G1D9Kd0Zi2Q4gmbw,57145
111
111
  rxiv_maker/install/__init__.py,sha256=kAB6P-12IKg_K1MQ-uzeC5IR11O2cNxj0t_2JMhooZs,590
112
112
  rxiv_maker/install/dependency_handlers/__init__.py,sha256=NN9dP1usXpYgLpSw0uEnJ6ugX2zefihVjdyDdm1k-cE,231
113
113
  rxiv_maker/install/dependency_handlers/latex.py,sha256=xopSJxYkg3D63rH7RoVLN-Ykl87AZqhlUrrG3m6LoWo,3304
@@ -127,7 +127,7 @@ rxiv_maker/manuscript_utils/figure_utils.py,sha256=FsNtMiA1IOHeA6gQsENmAWLZSAvPp
127
127
  rxiv_maker/processors/__init__.py,sha256=8UmaeFkbPfcwAL5MnhN2DcOA2k8iuJu0B5dDA6_pmnA,720
128
128
  rxiv_maker/processors/author_processor.py,sha256=jC4qZ9M_GADelkp1v8pk46ESUf4DNraXLfMYGhn_7ZM,10016
129
129
  rxiv_maker/processors/markdown_preprocessor.py,sha256=Ez_2lhSFEdJY0CS2SKJJESRfnmSdMq4s0jP2nlFSKN8,11228
130
- rxiv_maker/processors/template_processor.py,sha256=mX8L19Evo9c8DvcdvSdtFHGaGGrQseVsF1CKfj_WYow,30024
130
+ rxiv_maker/processors/template_processor.py,sha256=V47kh5zyiZDPNXBfNkQeyU5r-3MBHM3UMWAjcfgs11s,30316
131
131
  rxiv_maker/processors/yaml_processor.py,sha256=SSXHpwY1Cw81IDN4x40UFtosz-T9l29oh-CZpusmlYo,11499
132
132
  rxiv_maker/scripts/__init__.py,sha256=nKsDmj6UAc90uC6sKd-V6O80OMYjAl4Uha9zF_6ayX0,154
133
133
  rxiv_maker/scripts/custom_doc_generator.py,sha256=pMkdTI8a4qG8Z3gFUJtPwRuu2i0ioW3pKfs22es0KCk,6311
@@ -141,17 +141,21 @@ rxiv_maker/services/publication_service.py,sha256=0p8yQ1jrY3RHwCkzTEl_sAbWYTafRk
141
141
  rxiv_maker/services/validation_service.py,sha256=eWg14NqJu6LzyJBgeXkTaVZAlX4wYFX8ZEvSR5hMx7U,14619
142
142
  rxiv_maker/templates/__init__.py,sha256=UTet1pYPkPdgvrLw-wwaY-PAgdjGJasAi_hdyIh0J8s,562
143
143
  rxiv_maker/templates/manager.py,sha256=HlI7Qb52866Okf4k1aRh0fUy9heOSNGjMQJtrCdL3Xk,6131
144
- rxiv_maker/templates/registry.py,sha256=XHO3sQBRulsTsYUmP9R3K6RxnYMAehqrY-MoPgGaexE,16206
144
+ rxiv_maker/templates/registry.py,sha256=GikYKBBUSzzT0yeI8W8EZYVo40B9wtseNVGTLsAJGKY,18800
145
145
  rxiv_maker/tex/python_execution_section.tex,sha256=pHz6NGfZN4ViBo6rInUO5FAuk81sV_Ppqszrvl00w_4,2218
146
146
  rxiv_maker/utils/__init__.py,sha256=4ya5VR8jqRqUChlnUeMeeetOuWV-gIvjPwcE1u_1OnI,1540
147
+ rxiv_maker/utils/accent_character_map.py,sha256=L8BDiUH3IPCZ_pQzfsnlY0KkJpbyNpf3nQy4DBUdczE,3484
148
+ rxiv_maker/utils/author_affiliation_processor.py,sha256=UdUsMvRMXtjfJ8g2u6fge1MlgZPciWVu_zPnoSjhNDk,5604
147
149
  rxiv_maker/utils/author_name_formatter.py,sha256=UjvarbyQm89EUIYqckygx3g37o-EcNyvipBtY8GJDxs,10222
148
150
  rxiv_maker/utils/bibliography_checksum.py,sha256=Jh4VILSpGQ5KJ9UBCUb7oFy6lZ9_ncXD87vEXxw5jbY,10270
149
151
  rxiv_maker/utils/bibliography_parser.py,sha256=WZIQoEpVwdbLmbkw9FdkVgoLE5GX7itqnzPnEEb_fFU,6846
150
152
  rxiv_maker/utils/bst_generator.py,sha256=m69JWMIvf9eRiHcaWB-8D3DQCDO8flVIYbOBMuzV-F0,6097
151
153
  rxiv_maker/utils/changelog_parser.py,sha256=WCDp9Iy6H6_3nC6FB7RLt6i00zuCyvU17sCU4e3pqCY,11954
154
+ rxiv_maker/utils/citation_range_formatter.py,sha256=1Zb_csGOEWR8YIHWPqLSCzNEs0ogw49Q86BAm9KglrI,3619
152
155
  rxiv_maker/utils/citation_utils.py,sha256=spIgVxPAN6jPvoG-eOE00rVX_buUGKnUjP1Fhz31sl4,5134
156
+ rxiv_maker/utils/comment_filter.py,sha256=LcT5EgdvOwP82Gn-zt0Z3iU8_6XL9Cpt87eBOlMHl7o,1522
153
157
  rxiv_maker/utils/dependency_checker.py,sha256=EdyIvk-W_bhC1DJCpFw5ePhjEU74C9j7RYMm06unBMA,14366
154
- rxiv_maker/utils/docx_helpers.py,sha256=K-p3pSohytkM9WDHLqNv0dLaFl8IAgmQuePaj5-mCSQ,15622
158
+ rxiv_maker/utils/docx_helpers.py,sha256=xE1PnXjoUaX33GlbW4w7yQq_563MvFkhXBbvrmch-40,12708
155
159
  rxiv_maker/utils/doi_resolver.py,sha256=8_oy5cTtklm1GCKXpn509yqYsu4P5gYbMjtfQ8dRgFA,10253
156
160
  rxiv_maker/utils/email_encoder.py,sha256=QMD5JbGNu68gD8SBdGHfNY8uCgbMzEcmzE1TCYDMgWY,5139
157
161
  rxiv_maker/utils/figure_checksum.py,sha256=PWgh2QAErNnnQCV-t-COACQXKICUaggAAIxhgHLCGNM,10748
@@ -159,6 +163,7 @@ rxiv_maker/utils/file_helpers.py,sha256=qy3CqX6PkfiFSR2XKwASfx038VOnfnnVQL1wGPy2
159
163
  rxiv_maker/utils/github.py,sha256=jFzwdI6OPG7Q5w5iOPWUC-OqFqE65UscaGZLs6npGGw,15341
160
164
  rxiv_maker/utils/homebrew_checker.py,sha256=tyqnYMxxyONN-1krEJk8sYGOv-FhJZGgkvBny7xSZvI,3978
161
165
  rxiv_maker/utils/install_detector.py,sha256=4Ir_ZAM-wrarxBkup7WuUYcT48t0P2c9IeTDWkp_q4w,3869
166
+ rxiv_maker/utils/label_extractor.py,sha256=xQpWieDvBdQNpJBHVXpP-wA083LH68NAF4k1MVDm5T4,6816
162
167
  rxiv_maker/utils/operation_ids.py,sha256=dH9m7OGRrk2EG5abnJFF_1KPQ80lLZLcZD_KYaT9GwI,6083
163
168
  rxiv_maker/utils/pdf_splitter.py,sha256=aDyMMg7bxQOWpZIvjLX9SR8BsIibL0ngSlrrryXEy5I,3601
164
169
  rxiv_maker/utils/pdf_utils.py,sha256=MwT5RSnQ3OJHuFDQ_OP6BOcB-h6HfF618t6-j5icnyk,4253
@@ -186,11 +191,11 @@ rxiv_maker/validators/syntax_validator.py,sha256=hHpKVKky3UiA1ZylA6jJVP3DN47LgaS
186
191
  rxiv_maker/validators/doi/__init__.py,sha256=NqATXseuS0zVNns56RvFe8TdqgvueY0Rbw2Pjozlajc,494
187
192
  rxiv_maker/validators/doi/api_clients.py,sha256=tqdYUq8LFgRIO0tWfcenwmy2uO-IB1-GMvBfF3lP7-0,21763
188
193
  rxiv_maker/validators/doi/metadata_comparator.py,sha256=euqHhKP5sHQAdZbdoAahUn6YqJqOfXIOobNgAqFHlN8,11533
189
- rxiv_maker/tex/template.tex,sha256=zrJ3aFfu8j9zkg1l375eE9w-j42P3rz16wMD3dSgi1I,1354
194
+ rxiv_maker/tex/template.tex,sha256=_tPtxrurn3sKTt9Kfa44lPdPyT44vHbDUOGqldU9r2s,1378
190
195
  rxiv_maker/tex/style/rxiv_maker_style.bst,sha256=jbVqrJgAm6F88cow5vtZuPBwwmlcYykclTm8RvZIo6Y,24281
191
196
  rxiv_maker/tex/style/rxiv_maker_style.cls,sha256=6VDmZE0uvYWog6rcYi2K_NIM9-Pgjx9AFdRg_sTheK0,24374
192
- rxiv_maker-1.17.0.dist-info/METADATA,sha256=upIZmfFi1yORvvyAGORhfuG-2CiTqBOoHNnV4gg9OZo,18222
193
- rxiv_maker-1.17.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
194
- rxiv_maker-1.17.0.dist-info/entry_points.txt,sha256=ghCN0hI9A1GlG7QY5F6E-xYPflA8CyS4B6bTQ1YLop0,97
195
- rxiv_maker-1.17.0.dist-info/licenses/LICENSE,sha256=GSZFoPIhWDNJEtSHTQ5dnELN38zFwRiQO2antBezGQk,1093
196
- rxiv_maker-1.17.0.dist-info/RECORD,,
197
+ rxiv_maker-1.18.1.dist-info/METADATA,sha256=tPF_g3YUTC7xDc73LIT__1Y8E3vGxY7m5gqssm-P7j0,18222
198
+ rxiv_maker-1.18.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
199
+ rxiv_maker-1.18.1.dist-info/entry_points.txt,sha256=ghCN0hI9A1GlG7QY5F6E-xYPflA8CyS4B6bTQ1YLop0,97
200
+ rxiv_maker-1.18.1.dist-info/licenses/LICENSE,sha256=GSZFoPIhWDNJEtSHTQ5dnELN38zFwRiQO2antBezGQk,1093
201
+ rxiv_maker-1.18.1.dist-info/RECORD,,