pyeasyphd 0.4.12__py3-none-any.whl → 0.4.13__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.
Potentially problematic release.
This version of pyeasyphd might be problematic. Click here for more details.
- pyeasyphd/main/basic_input.py +17 -17
- pyeasyphd/main/pandoc_md_to.py +30 -31
- pyeasyphd/main/python_run_md.py +30 -31
- pyeasyphd/main/python_run_tex.py +17 -17
- pyeasyphd/pyeasyphd.py +1 -1
- pyeasyphd/scripts/_base.py +15 -17
- pyeasyphd/scripts/run_article_md.py +12 -11
- pyeasyphd/scripts/run_article_tex.py +12 -12
- pyeasyphd/scripts/run_beamer_tex.py +12 -12
- pyeasyphd/scripts/run_compare.py +2 -4
- pyeasyphd/scripts/run_format.py +2 -4
- pyeasyphd/scripts/run_replace.py +3 -6
- pyeasyphd/scripts/run_search.py +10 -16
- pyeasyphd/tools/generate/generate_from_bibs.py +23 -17
- pyeasyphd/tools/generate/generate_html.py +20 -16
- pyeasyphd/tools/generate/generate_library.py +27 -24
- pyeasyphd/tools/generate/generate_links.py +30 -31
- pyeasyphd/tools/py_run_bib_md_tex.py +38 -31
- pyeasyphd/tools/search/data.py +3 -3
- pyeasyphd/tools/search/search_base.py +12 -13
- pyeasyphd/tools/search/search_core.py +32 -29
- pyeasyphd/tools/search/search_keywords.py +6 -6
- pyeasyphd/tools/search/search_writers.py +29 -30
- pyeasyphd/tools/search/utils.py +9 -10
- pyeasyphd/utils/utils.py +1 -2
- {pyeasyphd-0.4.12.dist-info → pyeasyphd-0.4.13.dist-info}/METADATA +1 -1
- pyeasyphd-0.4.13.dist-info/RECORD +53 -0
- pyeasyphd-0.4.12.dist-info/RECORD +0 -53
- {pyeasyphd-0.4.12.dist-info → pyeasyphd-0.4.13.dist-info}/WHEEL +0 -0
- {pyeasyphd-0.4.12.dist-info → pyeasyphd-0.4.13.dist-info}/licenses/LICENSE +0 -0
|
@@ -2,7 +2,7 @@ import copy
|
|
|
2
2
|
import os
|
|
3
3
|
import re
|
|
4
4
|
import shutil
|
|
5
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
from pyadvtools import (
|
|
8
8
|
IterateCombineExtendDict,
|
|
@@ -39,8 +39,8 @@ class SearchResultsCore(BasicInput):
|
|
|
39
39
|
path_separate (str): Path to separate directory.
|
|
40
40
|
j_conf_abbr (str): Abbreviation of journal or conference.
|
|
41
41
|
is_standard_bib_file_name (bool): Whether the bib file name follows standard format.
|
|
42
|
-
keywords_type_list (
|
|
43
|
-
keywords_dict (dict):
|
|
42
|
+
keywords_type_list (list[str]): list of keyword types to search.
|
|
43
|
+
keywords_dict (dict): dictionary of keywords for searching.
|
|
44
44
|
delete_redundant_files (bool): Whether to delete redundant files after processing.
|
|
45
45
|
generate_basic_md (bool): Whether to generate basic markdown files.
|
|
46
46
|
generate_beauty_md (bool): Whether to generate beautiful markdown files.
|
|
@@ -52,7 +52,7 @@ class SearchResultsCore(BasicInput):
|
|
|
52
52
|
"""
|
|
53
53
|
|
|
54
54
|
def __init__(
|
|
55
|
-
self, path_storage: str, path_output: str, path_separate: str, j_conf_abbr: str, options:
|
|
55
|
+
self, path_storage: str, path_output: str, path_separate: str, j_conf_abbr: str, options: dict[str, Any]
|
|
56
56
|
) -> None:
|
|
57
57
|
"""Initialize SearchResultsCore with paths and configuration.
|
|
58
58
|
|
|
@@ -61,7 +61,7 @@ class SearchResultsCore(BasicInput):
|
|
|
61
61
|
path_output (str): Path to output directory for generated files.
|
|
62
62
|
path_separate (str): Path to separate directory for individual results.
|
|
63
63
|
j_conf_abbr (str): Abbreviation of journal or conference.
|
|
64
|
-
options (
|
|
64
|
+
options (dict[str, Any]): Configuration options.
|
|
65
65
|
"""
|
|
66
66
|
super().__init__(options)
|
|
67
67
|
self.path_storage: str = standard_path(path_storage)
|
|
@@ -106,36 +106,41 @@ class SearchResultsCore(BasicInput):
|
|
|
106
106
|
# for bib
|
|
107
107
|
self._python_bib = PythonRunBib(options)
|
|
108
108
|
|
|
109
|
-
def optimize(self, search_year_list:
|
|
109
|
+
def optimize(self, search_year_list: list[str] = []) -> dict[str, dict[str, dict[str, dict[str, int]]]]:
|
|
110
110
|
"""Optimize search results for given years.
|
|
111
111
|
|
|
112
112
|
Args:
|
|
113
|
-
search_year_list (
|
|
113
|
+
search_year_list (list[str], optional): list of years to search. Defaults to [].
|
|
114
114
|
|
|
115
115
|
Returns:
|
|
116
|
-
|
|
116
|
+
dict[str, dict[str, dict[str, dict[str, int]]]]: Nested dictionary containing search results.
|
|
117
117
|
"""
|
|
118
|
-
search_year_list = list(
|
|
118
|
+
search_year_list = list({str(i) for i in search_year_list})
|
|
119
119
|
|
|
120
120
|
data_list = self._obtain_full_files_data(self.path_storage, "bib", search_year_list)
|
|
121
121
|
|
|
122
122
|
entry_type_keyword_type_keyword_field_number_dict = self.optimize_core(data_list, search_year_list)
|
|
123
123
|
return entry_type_keyword_type_keyword_field_number_dict
|
|
124
124
|
|
|
125
|
-
def _obtain_full_files_data(
|
|
125
|
+
def _obtain_full_files_data(
|
|
126
|
+
self, path_storage: str, extension: str, search_year_list: list[str] | None = None
|
|
127
|
+
) -> list[str]:
|
|
126
128
|
"""Obtain data from all files with specified extension in storage path.
|
|
127
129
|
|
|
128
130
|
Args:
|
|
129
131
|
path_storage (str): Path to storage directory.
|
|
130
132
|
extension (str): File extension to search for.
|
|
131
|
-
search_year_list (
|
|
133
|
+
search_year_list (list[str], optional): list of years to filter by. Defaults to [].
|
|
132
134
|
|
|
133
135
|
Returns:
|
|
134
|
-
|
|
136
|
+
list[str]: Combined content from all matching files.
|
|
135
137
|
"""
|
|
138
|
+
if search_year_list is None:
|
|
139
|
+
search_year_list = []
|
|
140
|
+
|
|
136
141
|
regex = None
|
|
137
142
|
if self.is_standard_bib_file_name and search_year_list:
|
|
138
|
-
regex = re.compile(f
|
|
143
|
+
regex = re.compile(f"({'|'.join(search_year_list)})")
|
|
139
144
|
|
|
140
145
|
file_list = []
|
|
141
146
|
for root, _, files in os.walk(path_storage, topdown=True):
|
|
@@ -148,24 +153,23 @@ class SearchResultsCore(BasicInput):
|
|
|
148
153
|
|
|
149
154
|
return combine_content_in_list([read_list(f, "r") for f in sort_int_str(file_list)], None)
|
|
150
155
|
|
|
151
|
-
def optimize_core(self, data_list:
|
|
156
|
+
def optimize_core(self, data_list: list[str], search_year_list) -> dict[str, dict[str, dict[str, dict[str, int]]]]:
|
|
152
157
|
"""Core optimization logic for processing bibliography data.
|
|
153
158
|
|
|
154
159
|
Args:
|
|
155
|
-
data_list (
|
|
156
|
-
search_year_list:
|
|
160
|
+
data_list (list[str]): list of bibliography data strings.
|
|
161
|
+
search_year_list: list of years to search.
|
|
157
162
|
|
|
158
163
|
Returns:
|
|
159
|
-
|
|
164
|
+
dict[str, dict[str, dict[str, dict[str, int]]]]: Nested dictionary containing search results.
|
|
160
165
|
"""
|
|
161
166
|
print("\n" + "*" * 9 + f" Search in {self.j_conf_abbr} " + "*" * 9)
|
|
162
167
|
|
|
163
168
|
entry_type_year_volume_number_month_entry_dict = self._python_bib.parse_to_nested_entries_dict(data_list)
|
|
164
169
|
|
|
165
170
|
# generate standard bib and output
|
|
166
|
-
entry_type_keyword_type_keyword_field_number_dict:
|
|
171
|
+
entry_type_keyword_type_keyword_field_number_dict: dict[str, dict[str, dict[str, dict[str, int]]]] = {}
|
|
167
172
|
for entry_type in entry_type_year_volume_number_month_entry_dict:
|
|
168
|
-
|
|
169
173
|
# obtain search years
|
|
170
174
|
year_list = list(entry_type_year_volume_number_month_entry_dict[entry_type].keys())
|
|
171
175
|
if search_year_list:
|
|
@@ -222,7 +226,7 @@ class SearchResultsCore(BasicInput):
|
|
|
222
226
|
p_combine (str): Path to combine directory.
|
|
223
227
|
|
|
224
228
|
Returns:
|
|
225
|
-
dict:
|
|
229
|
+
dict: dictionary containing keyword field numbers.
|
|
226
230
|
"""
|
|
227
231
|
no_search_library = library
|
|
228
232
|
|
|
@@ -251,7 +255,7 @@ class SearchResultsCore(BasicInput):
|
|
|
251
255
|
p_combine (str): Path to combine directory.
|
|
252
256
|
|
|
253
257
|
Returns:
|
|
254
|
-
dict:
|
|
258
|
+
dict: dictionary containing keyword field numbers.
|
|
255
259
|
"""
|
|
256
260
|
no_search_library = library
|
|
257
261
|
|
|
@@ -262,18 +266,18 @@ class SearchResultsCore(BasicInput):
|
|
|
262
266
|
|
|
263
267
|
def core_optimize(
|
|
264
268
|
self,
|
|
265
|
-
search_field_list:
|
|
269
|
+
search_field_list: list[str],
|
|
266
270
|
keywords_type,
|
|
267
271
|
library: Library,
|
|
268
272
|
output_prefix: str,
|
|
269
273
|
p_origin: str,
|
|
270
274
|
p_separate: str,
|
|
271
275
|
p_combine: str,
|
|
272
|
-
) ->
|
|
276
|
+
) -> tuple[dict[str, dict[str, int]], Library]:
|
|
273
277
|
"""Core optimization method for processing search results.
|
|
274
278
|
|
|
275
279
|
Args:
|
|
276
|
-
search_field_list (
|
|
280
|
+
search_field_list (list[str]): list of fields to search.
|
|
277
281
|
keywords_type: Type of keywords to search.
|
|
278
282
|
library (Library): Bibliography library to search.
|
|
279
283
|
output_prefix (str): Prefix for output files.
|
|
@@ -282,15 +286,14 @@ class SearchResultsCore(BasicInput):
|
|
|
282
286
|
p_combine (str): Path to combine directory.
|
|
283
287
|
|
|
284
288
|
Returns:
|
|
285
|
-
|
|
289
|
+
tuple[dict[str, dict[str, int]], Library]: Tuple containing keyword field numbers and remaining library.
|
|
286
290
|
"""
|
|
287
|
-
error_pandoc_md_md:
|
|
288
|
-
save_field_data_dict:
|
|
289
|
-
keyword_field_number_dict:
|
|
291
|
+
error_pandoc_md_md: list[str] = []
|
|
292
|
+
save_field_data_dict: dict[str, list[list[str]]] = {}
|
|
293
|
+
keyword_field_number_dict: dict[str, dict[str, int]] = {}
|
|
290
294
|
|
|
291
295
|
no_search_library = library
|
|
292
296
|
for keywords_list in self.keywords_dict[keywords_type]:
|
|
293
|
-
|
|
294
297
|
print(f"{output_prefix}-{keywords_type}-search-{keywords_list}")
|
|
295
298
|
keywords_list_list, combine_keyword = switch_keywords_list(keywords_list)
|
|
296
299
|
|
|
@@ -2,7 +2,7 @@ import copy
|
|
|
2
2
|
import os
|
|
3
3
|
import re
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Any
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
from pyadvtools import generate_nested_dict, read_list, standard_path, write_list
|
|
8
8
|
from pybibtexer.tools.experiments_base import generate_standard_publisher_abbr_options_dict
|
|
@@ -14,7 +14,7 @@ from .search_core import SearchResultsCore
|
|
|
14
14
|
from .utils import extract_information, temp_html_style
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class Searchkeywords
|
|
17
|
+
class Searchkeywords:
|
|
18
18
|
"""Search keywords in bibliography data.
|
|
19
19
|
|
|
20
20
|
Args:
|
|
@@ -26,16 +26,16 @@ class Searchkeywords(object):
|
|
|
26
26
|
path_storage (str): Path to storage directory.
|
|
27
27
|
path_output (str): Path to output directory.
|
|
28
28
|
options (dict): Configuration options.
|
|
29
|
-
search_year_list (
|
|
29
|
+
search_year_list (list[str]): list of years to search. Defaults to [].
|
|
30
30
|
"""
|
|
31
31
|
|
|
32
|
-
def __init__(self, path_storage: str, path_output: str, options:
|
|
32
|
+
def __init__(self, path_storage: str, path_output: str, options: dict[str, Any]) -> None:
|
|
33
33
|
"""Initialize Searchkeywords with storage and output paths.
|
|
34
34
|
|
|
35
35
|
Args:
|
|
36
36
|
path_storage (str): Path to storage directory.
|
|
37
37
|
path_output (str): Path to output directory.
|
|
38
|
-
options (
|
|
38
|
+
options (dict[str, Any]): Configuration options.
|
|
39
39
|
"""
|
|
40
40
|
self.path_storage = standard_path(path_storage)
|
|
41
41
|
self.path_output = standard_path(path_output)
|
|
@@ -97,7 +97,7 @@ class Searchkeywords(object):
|
|
|
97
97
|
|
|
98
98
|
def _extract_files(
|
|
99
99
|
self, publisher_abbr_dict: dict, ext: str = "html"
|
|
100
|
-
) ->
|
|
100
|
+
) -> dict[str, dict[str, dict[str, dict[str, list[str]]]]]:
|
|
101
101
|
data_dict = {}
|
|
102
102
|
for publisher in publisher_abbr_dict:
|
|
103
103
|
for abbr in publisher_abbr_dict[publisher]:
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import os
|
|
3
|
-
from typing import Dict, List, Tuple
|
|
4
3
|
|
|
5
4
|
from pyadvtools import combine_content_in_list, read_list, write_list
|
|
6
5
|
from pybibtexer.bib.bibtexparser import Library
|
|
@@ -42,7 +41,7 @@ class WriteInitialResult(BasicInput):
|
|
|
42
41
|
library_for_abbr: Library,
|
|
43
42
|
library_for_zotero: Library,
|
|
44
43
|
library_for_save: Library,
|
|
45
|
-
) ->
|
|
44
|
+
) -> tuple[list[list[str]], list[str]]:
|
|
46
45
|
"""Main method to write initial results.
|
|
47
46
|
|
|
48
47
|
Args:
|
|
@@ -56,7 +55,7 @@ class WriteInitialResult(BasicInput):
|
|
|
56
55
|
library_for_save (Library): Save bibliography library.
|
|
57
56
|
|
|
58
57
|
Returns:
|
|
59
|
-
|
|
58
|
+
tuple[list[list[str]], list[str]]: Tuple containing data and error messages.
|
|
60
59
|
"""
|
|
61
60
|
error_pandoc_md_md = []
|
|
62
61
|
|
|
@@ -93,9 +92,9 @@ class WriteInitialResult(BasicInput):
|
|
|
93
92
|
|
|
94
93
|
# mian part
|
|
95
94
|
# generate some md output data
|
|
96
|
-
data_basic_md:
|
|
97
|
-
data_beauty_md:
|
|
98
|
-
data_complex_md:
|
|
95
|
+
data_basic_md: list[str] = []
|
|
96
|
+
data_beauty_md: list[str] = []
|
|
97
|
+
data_complex_md: list[str] = []
|
|
99
98
|
if data_list_pandoc_md:
|
|
100
99
|
data_basic_md, data_beauty_md, data_complex_md = self.generate_basic_beauty_complex_md(
|
|
101
100
|
header, cite_keys, data_list_pandoc_md, library_for_zotero
|
|
@@ -105,28 +104,28 @@ class WriteInitialResult(BasicInput):
|
|
|
105
104
|
|
|
106
105
|
# write basic beauty complex md files
|
|
107
106
|
basic_beauty_complex = ["-basic", "-beauty", "-complex"]
|
|
108
|
-
for d, name in zip([data_basic_md, data_beauty_md, data_complex_md], basic_beauty_complex):
|
|
109
|
-
write_list(d, "{}{}.md"
|
|
107
|
+
for d, name in zip([data_basic_md, data_beauty_md, data_complex_md], basic_beauty_complex, strict=True):
|
|
108
|
+
write_list(d, f"{file_prefix}{name}.md", "w", path_write)
|
|
110
109
|
|
|
111
110
|
# save all (tex, md, bib) files
|
|
112
|
-
x = [f"{i}.{j}" for i, j in zip(mid_list, post_list)]
|
|
111
|
+
x = [f"{i}.{j}" for i, j in zip(mid_list, post_list, strict=True)]
|
|
113
112
|
x.extend([f"{i}.md" for i in basic_beauty_complex])
|
|
114
113
|
data_temp = [[os.path.join(path_write, file_prefix + i)] for i in x]
|
|
115
114
|
return data_temp, error_pandoc_md_md
|
|
116
115
|
|
|
117
116
|
def generate_basic_beauty_complex_md(
|
|
118
|
-
self, header: str, cite_key_list:
|
|
119
|
-
) ->
|
|
117
|
+
self, header: str, cite_key_list: list[str], data_list_pandoc_md: list[str], library_for_zotero: Library
|
|
118
|
+
) -> tuple[list[str], list[str], list[str]]:
|
|
120
119
|
"""Generate basic, beauty, and complex markdown content.
|
|
121
120
|
|
|
122
121
|
Args:
|
|
123
122
|
header (str): Header string for the content.
|
|
124
|
-
cite_key_list (
|
|
125
|
-
data_list_pandoc_md (
|
|
123
|
+
cite_key_list (list[str]): list of citation keys.
|
|
124
|
+
data_list_pandoc_md (list[str]): list of pandoc markdown data.
|
|
126
125
|
library_for_zotero (Library): Zotero bibliography library.
|
|
127
126
|
|
|
128
127
|
Returns:
|
|
129
|
-
|
|
128
|
+
tuple[list[str], list[str], list[str]]: Tuple containing basic, beauty, and complex markdown content.
|
|
130
129
|
"""
|
|
131
130
|
data_basic_md, data_beauty_md, data_complex_md = [], [], []
|
|
132
131
|
|
|
@@ -152,14 +151,14 @@ class WriteInitialResult(BasicInput):
|
|
|
152
151
|
return data_basic_md, data_beauty_md, data_complex_md
|
|
153
152
|
|
|
154
153
|
@staticmethod
|
|
155
|
-
def _convert_to_special_list(data_list:
|
|
154
|
+
def _convert_to_special_list(data_list: list[str]) -> list[str]:
|
|
156
155
|
"""Convert data list to special formatted list.
|
|
157
156
|
|
|
158
157
|
Args:
|
|
159
|
-
data_list (
|
|
158
|
+
data_list (list[str]): list of data strings.
|
|
160
159
|
|
|
161
160
|
Returns:
|
|
162
|
-
|
|
161
|
+
list[str]: Formatted list with proper indentation.
|
|
163
162
|
"""
|
|
164
163
|
if len(data_list) > 0:
|
|
165
164
|
data_list[0] = "- " + data_list[0]
|
|
@@ -169,18 +168,18 @@ class WriteInitialResult(BasicInput):
|
|
|
169
168
|
return data_list
|
|
170
169
|
|
|
171
170
|
def generate_content_tex_md(
|
|
172
|
-
self, cite_key_list:
|
|
173
|
-
) ->
|
|
171
|
+
self, cite_key_list: list[str], output_prefix: str, field: str, combine_keywords: str
|
|
172
|
+
) -> tuple[list[str], list[str], str]:
|
|
174
173
|
"""Generate LaTeX and markdown content.
|
|
175
174
|
|
|
176
175
|
Args:
|
|
177
|
-
cite_key_list (
|
|
176
|
+
cite_key_list (list[str]): list of citation keys.
|
|
178
177
|
output_prefix (str): Prefix for output files.
|
|
179
178
|
field (str): Field being searched.
|
|
180
179
|
combine_keywords (str): Combined keywords string.
|
|
181
180
|
|
|
182
181
|
Returns:
|
|
183
|
-
|
|
182
|
+
tuple[list[str], list[str], str]: Tuple containing LaTeX content, markdown content, and header.
|
|
184
183
|
"""
|
|
185
184
|
c_k_f_t = combine_keywords_for_title(combine_keywords)
|
|
186
185
|
|
|
@@ -198,7 +197,7 @@ class WriteInitialResult(BasicInput):
|
|
|
198
197
|
return data_list_tex, data_list_md, md_header
|
|
199
198
|
|
|
200
199
|
|
|
201
|
-
class WriteSeparateResult
|
|
200
|
+
class WriteSeparateResult:
|
|
202
201
|
"""Write separate result for different keyword types."""
|
|
203
202
|
|
|
204
203
|
def __init__(self) -> None:
|
|
@@ -207,12 +206,12 @@ class WriteSeparateResult(object):
|
|
|
207
206
|
self._level_title_tex = "section"
|
|
208
207
|
|
|
209
208
|
def main(
|
|
210
|
-
self, data_temp:
|
|
209
|
+
self, data_temp: list[list[str]], field: str, keywords_type: str, combine_keywords: str, path_separate: str
|
|
211
210
|
) -> None:
|
|
212
211
|
"""Main method to write separate results.
|
|
213
212
|
|
|
214
213
|
Args:
|
|
215
|
-
data_temp (
|
|
214
|
+
data_temp (list[list[str]]): list of data lists for different file types.
|
|
216
215
|
field (str): Field being processed.
|
|
217
216
|
keywords_type (str): Type of keywords.
|
|
218
217
|
combine_keywords (str): Combined keywords string.
|
|
@@ -243,7 +242,7 @@ class WriteSeparateResult(object):
|
|
|
243
242
|
return None
|
|
244
243
|
|
|
245
244
|
|
|
246
|
-
class WriteAbbrCombinedResults
|
|
245
|
+
class WriteAbbrCombinedResults:
|
|
247
246
|
"""Write combined results for abbreviations (such as `TEVC`, `PNAS`).
|
|
248
247
|
|
|
249
248
|
Args:
|
|
@@ -277,18 +276,18 @@ class WriteAbbrCombinedResults(object):
|
|
|
277
276
|
self._pandoc_md_to = PandocMdTo(options)
|
|
278
277
|
|
|
279
278
|
def main(
|
|
280
|
-
self, search_field_list, keywords_type: str, field_data_dict:
|
|
281
|
-
) ->
|
|
279
|
+
self, search_field_list, keywords_type: str, field_data_dict: dict[str, list[list[str]]], path_combine: str
|
|
280
|
+
) -> tuple[list[str], list[str]]:
|
|
282
281
|
"""Main method to write combined results for abbreviations.
|
|
283
282
|
|
|
284
283
|
Args:
|
|
285
|
-
search_field_list:
|
|
284
|
+
search_field_list: list of search fields.
|
|
286
285
|
keywords_type (str): Type of keywords.
|
|
287
|
-
field_data_dict (
|
|
286
|
+
field_data_dict (dict[str, list[list[str]]]): dictionary containing field data.
|
|
288
287
|
path_combine (str): Path to combine directory.
|
|
289
288
|
|
|
290
289
|
Returns:
|
|
291
|
-
|
|
290
|
+
tuple[list[str], list[str]]: Tuple containing error messages for PDF and HTML conversion.
|
|
292
291
|
"""
|
|
293
292
|
path_subsection = os.path.join(path_combine, "tex-subsection")
|
|
294
293
|
path_md = os.path.join(path_combine, "md")
|
pyeasyphd/tools/search/utils.py
CHANGED
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import re
|
|
3
|
-
from typing import Dict, List, Tuple, Union
|
|
4
3
|
|
|
5
4
|
from pyadvtools import IterateSortDict, is_list_contain_list_contain_str, is_list_contain_str, write_list
|
|
6
5
|
|
|
7
6
|
|
|
8
|
-
def switch_keywords_list(xx:
|
|
7
|
+
def switch_keywords_list(xx: list[str] | list[list[str]]) -> tuple[list[list[str]], str]:
|
|
9
8
|
"""Switch keyword list format and generate combined keywords string.
|
|
10
9
|
|
|
11
10
|
Args:
|
|
12
|
-
xx (
|
|
11
|
+
xx (list[str] | list[list[str]]): Input keyword list or nested keyword list.
|
|
13
12
|
Examples: ["evolutionary", "algorithm"] or [["evolution"], ["evolutionary"]]
|
|
14
13
|
|
|
15
14
|
Returns:
|
|
16
|
-
|
|
15
|
+
tuple[list[list[str]], str]: Tuple containing:
|
|
17
16
|
- List of keyword lists with regex word boundaries
|
|
18
17
|
- Combined keywords string for file naming
|
|
19
18
|
"""
|
|
20
|
-
yyy:
|
|
19
|
+
yyy: list[list[str]] = [[]]
|
|
21
20
|
|
|
22
21
|
if is_list_contain_str(xx):
|
|
23
22
|
yyy = [[rf"\b{x}\b" for x in xx]]
|
|
@@ -119,14 +118,14 @@ def keywords_type_for_title(keywords_type: str) -> str:
|
|
|
119
118
|
return keywords_type.strip()
|
|
120
119
|
|
|
121
120
|
|
|
122
|
-
def extract_information(old_dict:
|
|
121
|
+
def extract_information(old_dict: dict[str, dict[str, dict[str, dict[str, dict[str, int]]]]], path_output: str) -> None:
|
|
123
122
|
"""Extract and organize search information into markdown tables.
|
|
124
123
|
|
|
125
124
|
Args:
|
|
126
|
-
old_dict (
|
|
125
|
+
old_dict (dict[str, dict[str, dict[str, dict[str, dict[str, int]]]]]): Nested dictionary containing search results.
|
|
127
126
|
path_output (str): Output directory path for generated markdown files.
|
|
128
127
|
"""
|
|
129
|
-
new_dict:
|
|
128
|
+
new_dict: dict[str, dict[str, dict[str, dict[str, dict[str, int]]]]] = {}
|
|
130
129
|
|
|
131
130
|
for abbr in old_dict:
|
|
132
131
|
for entry_type in old_dict[abbr]:
|
|
@@ -149,10 +148,10 @@ def extract_information(old_dict: Dict[str, Dict[str, Dict[str, Dict[str, Dict[s
|
|
|
149
148
|
data_list = []
|
|
150
149
|
for keyword_type in new_dict[entry_type][field]:
|
|
151
150
|
for keyword in new_dict[entry_type][field][keyword_type]:
|
|
152
|
-
abbr_list = sorted(
|
|
151
|
+
abbr_list = sorted(new_dict[entry_type][field][keyword_type][keyword].keys())
|
|
153
152
|
num_list = [new_dict[entry_type][field][keyword_type][keyword][abbr] for abbr in abbr_list]
|
|
154
153
|
|
|
155
|
-
a = f'|Keywords Types|Keywords|{"|".join(
|
|
154
|
+
a = f'|Keywords Types|Keywords|{"|".join(list(abbr_list))}|\n'
|
|
156
155
|
if a not in data_list:
|
|
157
156
|
data_list.append(a)
|
|
158
157
|
|
pyeasyphd/utils/utils.py
CHANGED
|
@@ -65,8 +65,7 @@ def operate_on_generate_html(html_name: str) -> None:
|
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
def is_last_week_of_month():
|
|
68
|
-
"""
|
|
69
|
-
Check if today's date falls in the last week of the current month.
|
|
68
|
+
"""Check if today's date falls in the last week of the current month.
|
|
70
69
|
|
|
71
70
|
Returns:
|
|
72
71
|
bool: True if today is in the last week of the month, False otherwise.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
pyeasyphd/.python-version,sha256=Auc1s9_hwygz61ULf_j_oX9fK8P6HnuuYaj1o4g845g,5
|
|
2
|
+
pyeasyphd/Main.sublime-menu,sha256=TTGNg9MzL5_uz4SXvs2pTdQQNxk9dSJmbUkPjujfQls,1554
|
|
3
|
+
pyeasyphd/__init__.py,sha256=tEypJy-Kmj6Oxpjh767NjkH5Ct0JF1Nhiw3D6-7I4E8,260
|
|
4
|
+
pyeasyphd/data/templates/csl/apa-no-ampersand.csl,sha256=ndFDG38PUNyGYpvfGqx_KzoSIs0DXA4w0GHG3MgFV7E,86859
|
|
5
|
+
pyeasyphd/data/templates/csl/apa.csl,sha256=S5OAu8zlZqzubySyR5c2FYDEzkTyuC9aRaJJlsygM8M,84591
|
|
6
|
+
pyeasyphd/data/templates/csl/ieee.csl,sha256=SzU0l89ymSCtmpugSoz2S6uM3_GHvibFZwZewn7WVEA,17413
|
|
7
|
+
pyeasyphd/data/templates/tex/Article.tex,sha256=M-vMXiHc2ncOTahtuY40s3flr2Ojo_-C8DDvLExMKbA,1264
|
|
8
|
+
pyeasyphd/data/templates/tex/Article_Header.tex,sha256=41Wv1BcQMmvh5peKTPh3uK_tm7mOSBnrFqkO0JzlXKU,949
|
|
9
|
+
pyeasyphd/data/templates/tex/Article_Tail.tex,sha256=1m7z4T6h8B8ylw3_4Q8_EOgzhyRRVSHgHrGZ6b5ut4k,35
|
|
10
|
+
pyeasyphd/data/templates/tex/Beamer_Header.tex,sha256=AWzgGmosZBX-YRynsbCChu6iF97FKDp3iU1OvBWeoC4,3692
|
|
11
|
+
pyeasyphd/data/templates/tex/Beamer_Tail.tex,sha256=88F75V0B8mP9naOEzM1S8PuEtYPdpZJAwxFQVVPP5K0,211
|
|
12
|
+
pyeasyphd/data/templates/tex/Style.tex,sha256=CK_Uxf3MEKRhxWC0OnipkHrgQIO_I5CHPBQ_T5wXvog,9726
|
|
13
|
+
pyeasyphd/data/templates/tex/TEVC_Header.tex,sha256=WPFIJLQNRsEcr5jxSw8rpc2gXJrMLie273yfwgEXAOU,1579
|
|
14
|
+
pyeasyphd/data/templates/tex/TEVC_Tail.tex,sha256=FBoefRJsnJrH1-eRZfF68qu_lHjwYZhj-iFWBWfV4tw,86
|
|
15
|
+
pyeasyphd/data/templates/tex/eisvogel.tex,sha256=9bDMPfUFjaHQZPCnYLwjsw5DfBtD04uzwfxvQa9nWuE,30748
|
|
16
|
+
pyeasyphd/data/templates/tex/math.tex,sha256=y_8AJzjmCCX6xmZQ_yCcABqMLqufOeh54pafTvNyUIM,11030
|
|
17
|
+
pyeasyphd/data/templates/tex/math_commands.tex,sha256=6ZQOletBnFRA6q6fU8TDVN4c9hDEdbmZuKnJgkgzq48,41513
|
|
18
|
+
pyeasyphd/data/templates/tex/nextaimathmacros.sty,sha256=iF0jyABkoPUY_XA-lPkvZSlblFuWLX9ie82gRqY0Fks,41644
|
|
19
|
+
pyeasyphd/main/__init__.py,sha256=Pv-7359vftMgw3Wi_GuDy99K0TcY6hVwLkFFip774x8,224
|
|
20
|
+
pyeasyphd/main/basic_input.py,sha256=N-33KUs8GQM517Qq6Ey-CAMwgTv9k1IP69BN3rpJnKA,4478
|
|
21
|
+
pyeasyphd/main/pandoc_md_to.py,sha256=W_TFDj2_wieVAXa5xZRO4Of7wlI6yknW14bRLCZ21GA,17138
|
|
22
|
+
pyeasyphd/main/python_run_md.py,sha256=ICKlUZHelV2WUOq7T_Accoe7hWdFSaHtahmo3ixBGe8,14346
|
|
23
|
+
pyeasyphd/main/python_run_tex.py,sha256=etmqfswrCF3J4r-GfEKgf6gf4L-u3SwoRzZZ0RMT8RE,7587
|
|
24
|
+
pyeasyphd/pyeasyphd.py,sha256=jIpt0JzF_iE8hVnujla3LfI3SeyqGgHNiGI6S_cb8Iw,3470
|
|
25
|
+
pyeasyphd/pyeasyphd.sublime-settings,sha256=kJLaSZQ5kGL5eg-LYeDsT6S-ecEGl3FvEAp2HVmhfdA,3216
|
|
26
|
+
pyeasyphd/pyeasyphd.sublime-syntax,sha256=pXylbA-tye-K5dCTjEJLFVRqtY1T7AgWZ4laxo-dnaE,73
|
|
27
|
+
pyeasyphd/scripts/__init__.py,sha256=QDmJugM90NFSzb69A6PSuCf76pHIcptRIaKNtSwXb-s,1235
|
|
28
|
+
pyeasyphd/scripts/_base.py,sha256=WdmIrJFwWw1yK6pg1sg1W74d3LwskdKUTD9ekEGBfyU,2315
|
|
29
|
+
pyeasyphd/scripts/run_article_md.py,sha256=jL7m3TfceVRL1QFs356WZOcxlOBdYEZr5W01c0Q2Y0w,4288
|
|
30
|
+
pyeasyphd/scripts/run_article_tex.py,sha256=uE84oQAGmmMXTJAD6yAlr6_5dhiiKlhDKv_ljZYsVY8,3696
|
|
31
|
+
pyeasyphd/scripts/run_beamer_tex.py,sha256=jw5EwpzazDMW9t9nN5Za0L0KQFv1ZL0VLGFjqAAqu0I,3233
|
|
32
|
+
pyeasyphd/scripts/run_compare.py,sha256=wop1uRmPqOXnMtRtMuTdy8dHhtZ0wpzthOcURw4URe8,3196
|
|
33
|
+
pyeasyphd/scripts/run_format.py,sha256=FjJS0-Ax3kEb-SLui-wUBjxI4G9cQzOJbxLNiYEqNQc,2936
|
|
34
|
+
pyeasyphd/scripts/run_generate.py,sha256=i8J3X3zn2QMuKUshu3FGpaq4kPw_P7TVXU46Wy_mZ8s,8549
|
|
35
|
+
pyeasyphd/scripts/run_replace.py,sha256=nvNnnxoutaWU3n-bdXlLx-VUZL3AH1yRnpfxTks1wbE,1314
|
|
36
|
+
pyeasyphd/scripts/run_search.py,sha256=P0TvcJuaVKbyPmAahk_SngxHKlndtTAHoX8hCMRC3m8,10510
|
|
37
|
+
pyeasyphd/tools/__init__.py,sha256=u1MZu_JjVac3HhEmcSTwroS83UVu0W5Vspy3Wu_-GH8,496
|
|
38
|
+
pyeasyphd/tools/generate/generate_from_bibs.py,sha256=AwY9gDcxOzPkPd0PzVVSv05rVuVDJdfXx13bdaP4R8E,7645
|
|
39
|
+
pyeasyphd/tools/generate/generate_html.py,sha256=DP4Ti6xC0FJnKR6TpUpMysrRa0e7-jEdszHamN5JDMU,5393
|
|
40
|
+
pyeasyphd/tools/generate/generate_library.py,sha256=u6s7VgcEo-qlDWHHRYIJ8EuoUIqulva76JV2SinTMtc,7825
|
|
41
|
+
pyeasyphd/tools/generate/generate_links.py,sha256=8xswaKtBsTHVNrj55lK7hLVupe9cV4cQ_3wlPajJTlE,16015
|
|
42
|
+
pyeasyphd/tools/py_run_bib_md_tex.py,sha256=sPoMN1jljq2mp6BkZlocwkUd8n2xJmPtvzcTCHfeIW0,17400
|
|
43
|
+
pyeasyphd/tools/search/data.py,sha256=iL7mZO49SRMHUkPtrK_3xzhFJAbHURIpXr0nGF76DH0,10300
|
|
44
|
+
pyeasyphd/tools/search/search_base.py,sha256=wwqtKN5gkvypO1ZQFVtRlZDy1aqtYuMaXgpbeKBAbf4,5909
|
|
45
|
+
pyeasyphd/tools/search/search_core.py,sha256=cR-2ix68PA2DstxpSEjFzb-KLivYo3pYVpnxldsezfo,17421
|
|
46
|
+
pyeasyphd/tools/search/search_keywords.py,sha256=pPEYhLaaQCYcyGlf8ULA_VNWBA_-WtfRy1WR4Q0y3mQ,10828
|
|
47
|
+
pyeasyphd/tools/search/search_writers.py,sha256=LfI_oxpuX8C5uZP9uosGJ4utO11UJQG230x1YwUJWPU,15665
|
|
48
|
+
pyeasyphd/tools/search/utils.py,sha256=hpYHXTm4XAL2f7e0BSuYDyvA86sVkELetvmPzllapF0,7487
|
|
49
|
+
pyeasyphd/utils/utils.py,sha256=8NfdQC0V3UGYeSweb7gjimQkQqM5dWeuUHOiRjVXaxk,3123
|
|
50
|
+
pyeasyphd-0.4.13.dist-info/METADATA,sha256=O479Ls68lCMuDQJNKovKQ1M--UEoU1F3R71Y2oKIKt0,1468
|
|
51
|
+
pyeasyphd-0.4.13.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
52
|
+
pyeasyphd-0.4.13.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
53
|
+
pyeasyphd-0.4.13.dist-info/RECORD,,
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
pyeasyphd/.python-version,sha256=Auc1s9_hwygz61ULf_j_oX9fK8P6HnuuYaj1o4g845g,5
|
|
2
|
-
pyeasyphd/Main.sublime-menu,sha256=TTGNg9MzL5_uz4SXvs2pTdQQNxk9dSJmbUkPjujfQls,1554
|
|
3
|
-
pyeasyphd/__init__.py,sha256=tEypJy-Kmj6Oxpjh767NjkH5Ct0JF1Nhiw3D6-7I4E8,260
|
|
4
|
-
pyeasyphd/data/templates/csl/apa-no-ampersand.csl,sha256=ndFDG38PUNyGYpvfGqx_KzoSIs0DXA4w0GHG3MgFV7E,86859
|
|
5
|
-
pyeasyphd/data/templates/csl/apa.csl,sha256=S5OAu8zlZqzubySyR5c2FYDEzkTyuC9aRaJJlsygM8M,84591
|
|
6
|
-
pyeasyphd/data/templates/csl/ieee.csl,sha256=SzU0l89ymSCtmpugSoz2S6uM3_GHvibFZwZewn7WVEA,17413
|
|
7
|
-
pyeasyphd/data/templates/tex/Article.tex,sha256=M-vMXiHc2ncOTahtuY40s3flr2Ojo_-C8DDvLExMKbA,1264
|
|
8
|
-
pyeasyphd/data/templates/tex/Article_Header.tex,sha256=41Wv1BcQMmvh5peKTPh3uK_tm7mOSBnrFqkO0JzlXKU,949
|
|
9
|
-
pyeasyphd/data/templates/tex/Article_Tail.tex,sha256=1m7z4T6h8B8ylw3_4Q8_EOgzhyRRVSHgHrGZ6b5ut4k,35
|
|
10
|
-
pyeasyphd/data/templates/tex/Beamer_Header.tex,sha256=AWzgGmosZBX-YRynsbCChu6iF97FKDp3iU1OvBWeoC4,3692
|
|
11
|
-
pyeasyphd/data/templates/tex/Beamer_Tail.tex,sha256=88F75V0B8mP9naOEzM1S8PuEtYPdpZJAwxFQVVPP5K0,211
|
|
12
|
-
pyeasyphd/data/templates/tex/Style.tex,sha256=CK_Uxf3MEKRhxWC0OnipkHrgQIO_I5CHPBQ_T5wXvog,9726
|
|
13
|
-
pyeasyphd/data/templates/tex/TEVC_Header.tex,sha256=WPFIJLQNRsEcr5jxSw8rpc2gXJrMLie273yfwgEXAOU,1579
|
|
14
|
-
pyeasyphd/data/templates/tex/TEVC_Tail.tex,sha256=FBoefRJsnJrH1-eRZfF68qu_lHjwYZhj-iFWBWfV4tw,86
|
|
15
|
-
pyeasyphd/data/templates/tex/eisvogel.tex,sha256=9bDMPfUFjaHQZPCnYLwjsw5DfBtD04uzwfxvQa9nWuE,30748
|
|
16
|
-
pyeasyphd/data/templates/tex/math.tex,sha256=y_8AJzjmCCX6xmZQ_yCcABqMLqufOeh54pafTvNyUIM,11030
|
|
17
|
-
pyeasyphd/data/templates/tex/math_commands.tex,sha256=6ZQOletBnFRA6q6fU8TDVN4c9hDEdbmZuKnJgkgzq48,41513
|
|
18
|
-
pyeasyphd/data/templates/tex/nextaimathmacros.sty,sha256=iF0jyABkoPUY_XA-lPkvZSlblFuWLX9ie82gRqY0Fks,41644
|
|
19
|
-
pyeasyphd/main/__init__.py,sha256=Pv-7359vftMgw3Wi_GuDy99K0TcY6hVwLkFFip774x8,224
|
|
20
|
-
pyeasyphd/main/basic_input.py,sha256=roZSTc8hUavItv0jQsjkmRRf8FHR6FStMrvZcjaSLbk,4484
|
|
21
|
-
pyeasyphd/main/pandoc_md_to.py,sha256=RnrHFEp7gnBw7zoMTY8ffaYSDEV75Lstr6OBQwsCmJQ,17208
|
|
22
|
-
pyeasyphd/main/python_run_md.py,sha256=3I6kc3920tRaTvLmNd3TIfIrfO8U_j9RYPO9YlnY8hs,14398
|
|
23
|
-
pyeasyphd/main/python_run_tex.py,sha256=9Syu8qRjPXN3gEabfRUWxwTFBm_izIcB4yFhsz3QNs0,7672
|
|
24
|
-
pyeasyphd/pyeasyphd.py,sha256=OAwbwq2rSXLSk2AoTAF8hmlOMRSRfvDn1Uqk-zkuqH8,3470
|
|
25
|
-
pyeasyphd/pyeasyphd.sublime-settings,sha256=kJLaSZQ5kGL5eg-LYeDsT6S-ecEGl3FvEAp2HVmhfdA,3216
|
|
26
|
-
pyeasyphd/pyeasyphd.sublime-syntax,sha256=pXylbA-tye-K5dCTjEJLFVRqtY1T7AgWZ4laxo-dnaE,73
|
|
27
|
-
pyeasyphd/scripts/__init__.py,sha256=QDmJugM90NFSzb69A6PSuCf76pHIcptRIaKNtSwXb-s,1235
|
|
28
|
-
pyeasyphd/scripts/_base.py,sha256=Vm-CehgDng38jACb9KBzKkbyJuc_e5UjG06nIMi_l0o,2337
|
|
29
|
-
pyeasyphd/scripts/run_article_md.py,sha256=qZuF4Vq_xzP0z-Cjs6OYnNVg3_rZTaM132WheXzxQtk,4336
|
|
30
|
-
pyeasyphd/scripts/run_article_tex.py,sha256=vD9Wa8-XyxHZ48rtllcMCzmkQ0j-p8NpgCkMCZv6RWs,3820
|
|
31
|
-
pyeasyphd/scripts/run_beamer_tex.py,sha256=YId0mofXbJJwsqawzG0_g-umd0Ik_N6JERxmndNnAoA,3357
|
|
32
|
-
pyeasyphd/scripts/run_compare.py,sha256=-VLS0ms049Kd8zbiIdjTpLmkDZuoSZBwG5OfR6PPyno,3206
|
|
33
|
-
pyeasyphd/scripts/run_format.py,sha256=V5RUwa6eZx5kzV6dtE35jM_9S-RckhDTR7xCL-_GpXM,2946
|
|
34
|
-
pyeasyphd/scripts/run_generate.py,sha256=i8J3X3zn2QMuKUshu3FGpaq4kPw_P7TVXU46Wy_mZ8s,8549
|
|
35
|
-
pyeasyphd/scripts/run_replace.py,sha256=0D5cIsWf8cSysBRc5Nhv95WyHTuGW32W1LgrojkVYmI,1351
|
|
36
|
-
pyeasyphd/scripts/run_search.py,sha256=HQWaKYMgmWhTsgrJIQxWv4ceu5UyEy8gekWDJV_GdHA,10565
|
|
37
|
-
pyeasyphd/tools/__init__.py,sha256=u1MZu_JjVac3HhEmcSTwroS83UVu0W5Vspy3Wu_-GH8,496
|
|
38
|
-
pyeasyphd/tools/generate/generate_from_bibs.py,sha256=oQlNqYUAhOT1Bnpqeh_Y2yE2knIurpYRMfz4MnxTSZs,7602
|
|
39
|
-
pyeasyphd/tools/generate/generate_html.py,sha256=Z-fBRtqFXUBJvZjMbTbyH9k22wJ2V4cxFZx1kauZx34,5361
|
|
40
|
-
pyeasyphd/tools/generate/generate_library.py,sha256=AihCJVFMRJExlpWDQVqvBczOwmbmXqGzGU4cL-5s0F4,7930
|
|
41
|
-
pyeasyphd/tools/generate/generate_links.py,sha256=_fz6IaW52c5tGPHf2JT9DSJXziCIdM3XhuKuZUPKHgg,15891
|
|
42
|
-
pyeasyphd/tools/py_run_bib_md_tex.py,sha256=zEWy7yglVU9hscrHnWmkPy2qvDOjU3KS97VK645W_Yw,17358
|
|
43
|
-
pyeasyphd/tools/search/data.py,sha256=ykFEd8Tc04dupiG9Y8viOcEe5g56LCaMH-0KwbV4vt4,10306
|
|
44
|
-
pyeasyphd/tools/search/search_base.py,sha256=JR80m72UBJu__CWV1KP7ixPhK1uDyApPhDaExrlzfKM,5950
|
|
45
|
-
pyeasyphd/tools/search/search_core.py,sha256=Ks_dK69dRfOelaoK_B3fLvmLA9qONgZNb9OxI5HG_V0,17352
|
|
46
|
-
pyeasyphd/tools/search/search_keywords.py,sha256=tUEKsCqiaUHEyRa23wzDLri3puAWrNKhnpZKaeYgdeY,10848
|
|
47
|
-
pyeasyphd/tools/search/search_writers.py,sha256=Dz6D8m17R7x8NT7_PCjwmzlq29AfUz-N6sjyCguDTo4,15702
|
|
48
|
-
pyeasyphd/tools/search/utils.py,sha256=bo7xtIZu31dQvjol1lwyWq1t6ldbw28oondwK8VbAqk,7562
|
|
49
|
-
pyeasyphd/utils/utils.py,sha256=kWxzzgNwz77K9Q7j-RKTaoPpxqiVLVtaBMMhLuEenwE,3128
|
|
50
|
-
pyeasyphd-0.4.12.dist-info/METADATA,sha256=pST5TyiDaFL4HZ5g0SWy-jcPYB1MvHLNUn2hQVyaXLw,1468
|
|
51
|
-
pyeasyphd-0.4.12.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
52
|
-
pyeasyphd-0.4.12.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
53
|
-
pyeasyphd-0.4.12.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|