pyeasyphd 0.4.42__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.
Files changed (53) hide show
  1. pyeasyphd/.python-version +1 -0
  2. pyeasyphd/Main.sublime-menu +43 -0
  3. pyeasyphd/__init__.py +5 -0
  4. pyeasyphd/data/templates/csl/apa-no-ampersand.csl +2183 -0
  5. pyeasyphd/data/templates/csl/apa.csl +2133 -0
  6. pyeasyphd/data/templates/csl/ieee.csl +512 -0
  7. pyeasyphd/data/templates/tex/Article.tex +38 -0
  8. pyeasyphd/data/templates/tex/Article_Header.tex +29 -0
  9. pyeasyphd/data/templates/tex/Article_Tail.tex +3 -0
  10. pyeasyphd/data/templates/tex/Beamer_Header.tex +79 -0
  11. pyeasyphd/data/templates/tex/Beamer_Tail.tex +14 -0
  12. pyeasyphd/data/templates/tex/Style.tex +240 -0
  13. pyeasyphd/data/templates/tex/TEVC_Header.tex +52 -0
  14. pyeasyphd/data/templates/tex/TEVC_Tail.tex +4 -0
  15. pyeasyphd/data/templates/tex/eisvogel.tex +1064 -0
  16. pyeasyphd/data/templates/tex/math.tex +201 -0
  17. pyeasyphd/data/templates/tex/math_commands.tex +677 -0
  18. pyeasyphd/data/templates/tex/nextaimathmacros.sty +681 -0
  19. pyeasyphd/main/__init__.py +6 -0
  20. pyeasyphd/main/basic_input.py +101 -0
  21. pyeasyphd/main/pandoc_md_to.py +380 -0
  22. pyeasyphd/main/python_run_md.py +320 -0
  23. pyeasyphd/main/python_run_tex.py +200 -0
  24. pyeasyphd/pyeasyphd.py +86 -0
  25. pyeasyphd/pyeasyphd.sublime-settings +100 -0
  26. pyeasyphd/pyeasyphd.sublime-syntax +5 -0
  27. pyeasyphd/scripts/__init__.py +34 -0
  28. pyeasyphd/scripts/_base.py +65 -0
  29. pyeasyphd/scripts/run_article_md.py +101 -0
  30. pyeasyphd/scripts/run_article_tex.py +94 -0
  31. pyeasyphd/scripts/run_beamer_tex.py +84 -0
  32. pyeasyphd/scripts/run_compare.py +71 -0
  33. pyeasyphd/scripts/run_format.py +62 -0
  34. pyeasyphd/scripts/run_generate.py +211 -0
  35. pyeasyphd/scripts/run_replace.py +34 -0
  36. pyeasyphd/scripts/run_search.py +251 -0
  37. pyeasyphd/tools/__init__.py +12 -0
  38. pyeasyphd/tools/generate/generate_from_bibs.py +181 -0
  39. pyeasyphd/tools/generate/generate_html.py +166 -0
  40. pyeasyphd/tools/generate/generate_library.py +203 -0
  41. pyeasyphd/tools/generate/generate_links.py +400 -0
  42. pyeasyphd/tools/py_run_bib_md_tex.py +398 -0
  43. pyeasyphd/tools/search/data.py +282 -0
  44. pyeasyphd/tools/search/search_base.py +146 -0
  45. pyeasyphd/tools/search/search_core.py +400 -0
  46. pyeasyphd/tools/search/search_keywords.py +229 -0
  47. pyeasyphd/tools/search/search_writers.py +350 -0
  48. pyeasyphd/tools/search/utils.py +190 -0
  49. pyeasyphd/utils/utils.py +99 -0
  50. pyeasyphd-0.4.42.dist-info/METADATA +33 -0
  51. pyeasyphd-0.4.42.dist-info/RECORD +53 -0
  52. pyeasyphd-0.4.42.dist-info/WHEEL +4 -0
  53. pyeasyphd-0.4.42.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,190 @@
1
+ import os
2
+ import re
3
+
4
+ from pyadvtools import IterateSortDict, is_list_contain_list_contain_str, is_list_contain_str, write_list
5
+
6
+
7
+ def switch_keywords_list(xx: list[str] | list[list[str]]) -> tuple[list[list[str]], str]:
8
+ """Switch keyword list format and generate combined keywords string.
9
+
10
+ Args:
11
+ xx (list[str] | list[list[str]]): Input keyword list or nested keyword list.
12
+ Examples: ["evolutionary", "algorithm"] or [["evolution"], ["evolutionary"]]
13
+
14
+ Returns:
15
+ tuple[list[list[str]], str]: Tuple containing:
16
+ - List of keyword lists with regex word boundaries
17
+ - Combined keywords string for file naming
18
+ """
19
+ yyy: list[list[str]] = [[]]
20
+
21
+ if is_list_contain_str(xx):
22
+ yyy = [[rf"\b{x}\b" for x in xx]]
23
+ elif is_list_contain_list_contain_str(xx):
24
+ if len(xx) == 1:
25
+ yyy = [[rf"\b{x}\b" for x in xx[0]]]
26
+ elif len(xx) == 2:
27
+ yyy = [[rf"\b{x}\b" for x in xx[0]], [rf"\b{x}\b" for x in xx[1]]]
28
+ else:
29
+ print(f"Not standard keywords: {xx}")
30
+ return yyy, ""
31
+ else:
32
+ return yyy, ""
33
+
34
+ combine_keywords = "_and_".join(yyy[0])
35
+ if len(yyy) == 2:
36
+ combine_keywords += "_without_{}".format("_and_".join(yyy[1]))
37
+
38
+ # ['evol(?:ution|utionary) strateg(?:y|ies)', 'population(?:| |-)based', 'network(?:|s)']
39
+ # '\bevol(?:ution|utionary) strateg(?:y|ies)\b_and_\bpopulation(?:| |-)based\b_and_\bnetwork(?:|s)\b'
40
+ combine_keywords = combine_keywords.replace(r"\b", "")
41
+ # 'evol(?:ution|utionary) strateg(?:y|ies)_and_population(?:| |-)based_and_network(?:|s)'
42
+ combine_keywords = re.sub(r"\(\?:[\w\s\-|]*\) ", "0 ", combine_keywords)
43
+ # 'evol0 strateg(?:y|ies)_and_population(?:| |-)based_and_network(?:|s)'
44
+ combine_keywords = re.sub(r"\(\?:[\w\s\-|]*\)$", "1", combine_keywords)
45
+ # 'evol0 strateg(?:y|ies)_and_population(?:| |-)based_and_network1'
46
+ combine_keywords = re.sub(r"\(\?:[\w\s\-|]*\)_", "2_", combine_keywords)
47
+ # 'evol0 strateg2_and_population(?:| |-)based_and_network1'
48
+ combine_keywords = re.sub(r"\(\?:[\w\s\-|]*\)", "3", combine_keywords)
49
+ # 'evol0 strateg2_and_population3based_and_network1'
50
+ combine_keywords = combine_keywords.replace("/", "4")
51
+ combine_keywords = combine_keywords.replace(" ", "5")
52
+ # 'evol05strateg2_and_population3based_and_network1'
53
+ return yyy, combine_keywords
54
+
55
+
56
+ def combine_keywords_for_title(combine_keywords: str) -> str:
57
+ """Convert combined keywords string to human-readable title format.
58
+
59
+ Args:
60
+ combine_keywords (str): Combined keywords string with special characters.
61
+
62
+ Returns:
63
+ str: Human-readable title format with proper spacing and punctuation.
64
+ """
65
+ combine_keywords = combine_keywords.replace("_without_", " without ")
66
+ combine_keywords = combine_keywords.replace("_and_", "; ")
67
+ combine_keywords = combine_keywords.replace("0", "")
68
+ combine_keywords = combine_keywords.replace("1", "")
69
+ combine_keywords = combine_keywords.replace("2", "")
70
+ combine_keywords = combine_keywords.replace("3", "-")
71
+ combine_keywords = combine_keywords.replace("4", "/") #
72
+ combine_keywords = combine_keywords.replace("5", " ")
73
+ return combine_keywords
74
+
75
+
76
+ def combine_keywords_for_file_name(combine_keywords: str) -> str:
77
+ """Convert combined keywords string to valid file name format.
78
+
79
+ Args:
80
+ combine_keywords (str): Combined keywords string.
81
+
82
+ Returns:
83
+ str: File name safe string with underscores and hyphens.
84
+ """
85
+ combine_keywords = combine_keywords_for_title(combine_keywords)
86
+ combine_keywords = combine_keywords.replace("/", "-")
87
+ combine_keywords = combine_keywords.replace("; ", "_and_")
88
+ combine_keywords = combine_keywords.replace(" ", "_")
89
+ return combine_keywords
90
+
91
+
92
+ def switch_keywords_type(keywords_type: str) -> str:
93
+ """Normalize keywords type string for consistent formatting.
94
+
95
+ Args:
96
+ keywords_type (str): Keywords type string to normalize.
97
+
98
+ Returns:
99
+ str: Normalized keywords type with consistent separators.
100
+ """
101
+ keywords_type = keywords_type.replace("/", "-")
102
+ keywords_type = keywords_type.replace(" ", "_")
103
+ keywords_type = re.sub(r"-+", "-", keywords_type)
104
+ keywords_type = re.sub(r"_+", "_", keywords_type)
105
+ return keywords_type.strip()
106
+
107
+
108
+ def keywords_type_for_title(keywords_type: str) -> str:
109
+ """Convert keywords type string to title format.
110
+
111
+ Args:
112
+ keywords_type (str): Keywords type string with underscores.
113
+
114
+ Returns:
115
+ str: Title format with spaces instead of underscores.
116
+ """
117
+ keywords_type = keywords_type.replace("_", " ")
118
+ return keywords_type.strip()
119
+
120
+
121
+ def extract_information(old_dict: dict[str, dict[str, dict[str, dict[str, dict[str, int]]]]], path_output: str) -> None:
122
+ """Extract and organize search information into markdown tables.
123
+
124
+ Args:
125
+ old_dict (dict[str, dict[str, dict[str, dict[str, dict[str, int]]]]]): Nested dictionary containing search results.
126
+ path_output (str): Output directory path for generated markdown files.
127
+ """
128
+ new_dict: dict[str, dict[str, dict[str, dict[str, dict[str, int]]]]] = {}
129
+
130
+ for abbr in old_dict:
131
+ for entry_type in old_dict[abbr]:
132
+ for keyword_type in old_dict[abbr][entry_type]:
133
+ for keyword in old_dict[abbr][entry_type][keyword_type]:
134
+ for field in old_dict[abbr][entry_type][keyword_type][keyword]:
135
+ no = old_dict[abbr][entry_type][keyword_type][keyword][field]
136
+ (
137
+ new_dict.setdefault(entry_type, {})
138
+ .setdefault(field, {})
139
+ .setdefault(keyword_type, {})
140
+ .setdefault(keyword, {})
141
+ .update({abbr: no})
142
+ )
143
+
144
+ new_dict = IterateSortDict(False).dict_update(new_dict)
145
+
146
+ for entry_type in new_dict:
147
+ for field in new_dict[entry_type]:
148
+ data_list = []
149
+ for keyword_type in new_dict[entry_type][field]:
150
+ for keyword in new_dict[entry_type][field][keyword_type]:
151
+ abbr_list = sorted(new_dict[entry_type][field][keyword_type][keyword].keys())
152
+ num_list = [new_dict[entry_type][field][keyword_type][keyword][abbr] for abbr in abbr_list]
153
+
154
+ a = f"|Keywords Types|Keywords|{'|'.join(list(abbr_list))}|\n"
155
+ if a not in data_list:
156
+ data_list.append(a)
157
+
158
+ b = f"|-|-|{'|'.join(['-' for _ in abbr_list])}|\n"
159
+ if b not in data_list:
160
+ data_list.append(b)
161
+
162
+ keyword = combine_keywords_for_file_name(keyword)
163
+ data_list.append(f"|{keyword_type}|{keyword}|{'|'.join([str(n) for n in num_list])}|\n")
164
+
165
+ write_list(data_list, f"{field}-keywords_count.md", "w", os.path.join(path_output, entry_type), False)
166
+
167
+
168
+ temp_html_style = """ <style>
169
+ html {font-size: 19px;}
170
+ body {margin: 0 auto; max-width: 22em;}
171
+ table {
172
+ border-collapse: collapse;
173
+ border: 2px solid rgb(200,200,200);
174
+ letter-spacing: 1px;
175
+ font-size: 0.8rem;
176
+ }
177
+ td, th {
178
+ border: 1px solid rgb(190,190,190);
179
+ padding: 10px 20px;
180
+ }
181
+ td {text-align: center;}
182
+ caption {padding: 12px;}
183
+ </style>
184
+ </head>
185
+ <body>
186
+ """
187
+
188
+
189
+ if __name__ == "__main__":
190
+ pass
@@ -0,0 +1,99 @@
1
+ import datetime
2
+ import os
3
+ import re
4
+
5
+ from pyadvtools import combine_content_in_list, read_list, write_list
6
+
7
+ html_head = """<!DOCTYPE html>
8
+ <html>
9
+ <head>
10
+ <meta charset="utf-8">
11
+ <title>{}</title>
12
+ """
13
+
14
+ html_style = """ <style>
15
+ html {font-size: 22px;}
16
+ body {margin: 0 auto; max-width: 76em;}
17
+ #copyID {font-size: 18px;}
18
+ </style>
19
+ <script>
20
+ function copy(element) {
21
+ if (element.type == "button"){
22
+ element.type="text";
23
+ }
24
+ element.style.color="black";
25
+ element.style.backgroundColor="#C7EDCC";
26
+ element.select();
27
+ element.setSelectionRange(0, 99999);
28
+ navigator.clipboard.writeText(element.value);
29
+ window.getSelection().removeAllRanges();
30
+ element.type="button";
31
+ }
32
+ </script>
33
+ </head>
34
+ <body>
35
+ """
36
+
37
+ html_tail = """
38
+ </body>
39
+ </html>
40
+ """
41
+
42
+ textarea_header = '<textarea id="copyID" onclick="copy(this)" rows="16" cols="145">\n'
43
+ textarea_tail = "\n</textarea>"
44
+
45
+
46
+ def operate_on_generate_html(html_name: str) -> None:
47
+ """Operate on generated HTML file to add styling and functionality.
48
+
49
+ Args:
50
+ html_name (str): Name of the HTML file to process.
51
+ """
52
+ if not (data_list := read_list(html_name, "r", None)):
53
+ return None
54
+
55
+ head_list = [html_head.format(os.path.basename(html_name).split(".")[0].strip()), html_style, "\n"]
56
+ tail_list = [html_tail]
57
+
58
+ content = "".join(data_list)
59
+ content = content.replace("<pre><code>", textarea_header).replace("</code></pre>", textarea_tail)
60
+ for i in re.findall(r"<li>(.*?)<details>", content, re.DOTALL):
61
+ content = content.replace(rf"<li>{i}<details>", f"<li><details>\n<summary>\n{i.strip()}\n</summary>")
62
+ data_list = combine_content_in_list([head_list, [content], tail_list])
63
+ write_list(data_list, html_name, "w", None, False)
64
+ return None
65
+
66
+
67
+ def is_last_week_of_month():
68
+ """Check if today's date falls in the last week of the current month.
69
+
70
+ Returns:
71
+ bool: True if today is in the last week of the month, False otherwise.
72
+ """
73
+ # Get today's date
74
+ today = datetime.date.today()
75
+
76
+ # Calculate the last day of the current month
77
+ # First, find the first day of next month
78
+ if today.month == 12:
79
+ next_month = datetime.date(today.year + 1, 1, 1)
80
+ else:
81
+ next_month = datetime.date(today.year, today.month + 1, 1)
82
+
83
+ # Subtract one day to get the last day of the current month
84
+ last_day_of_month = next_month - datetime.timedelta(days=1)
85
+
86
+ # Calculate the week number of today and the last day of the month
87
+ # Using isocalendar() which returns (year, week number, weekday)
88
+ today_week = today.isocalendar()[1]
89
+ last_day_week = last_day_of_month.isocalendar()[1]
90
+
91
+ # For December, the week number might roll over to next year
92
+ # If so, we need to adjust the comparison
93
+ if today.month == 12 and today_week < last_day_week:
94
+ # This handles the case where the last week of December is actually
95
+ # the first week of the next year in the ISO calendar
96
+ return True
97
+
98
+ # Check if we're in the same week as the last day of the month
99
+ return today_week == last_day_week
@@ -0,0 +1,33 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyeasyphd
3
+ Version: 0.4.42
4
+ Summary: pyeasyphd
5
+ Project-URL: Homepage, https://github.com/Easy-PhD/pyeasyphd
6
+ Project-URL: Repository, https://github.com/Easy-PhD/pyeasyphd
7
+ Project-URL: Documentation, https://Easy-PhD.github.io/pyeasyphd
8
+ Project-URL: Source, https://github.com/Easy-PhD/pyeasyphd
9
+ Project-URL: Issues, https://github.com/Easy-PhD/pyeasyphd/issues
10
+ Project-URL: Changelog, https://github.com/Easy-PhD/pyeasyphd/releases
11
+ Author-email: NextAI <nextartifintell@gmail.com>
12
+ Maintainer-email: NextAI <nextartifintell@gmail.com>
13
+ License-Expression: GPL-3.0-or-later
14
+ License-File: LICENSE
15
+ Keywords: BibTex,Python
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Requires-Python: >=3.12
24
+ Requires-Dist: pybibtexer>=0.3.36
25
+ Description-Content-Type: text/markdown
26
+
27
+ # pyeasyphd
28
+
29
+ ![Visitors](https://visitor-badge.laobi.icu/badge?page_id=Easy-PhD.pyeasyphd)
30
+ [![License](https://img.shields.io/badge/license-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html)
31
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pyeasyphd)
32
+ [![PyPI](https://img.shields.io/pypi/v/pyeasyphd)](https://pypi.org/project/pyeasyphd/)
33
+ [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)
@@ -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/pyeasyphd.py,sha256=jIpt0JzF_iE8hVnujla3LfI3SeyqGgHNiGI6S_cb8Iw,3470
5
+ pyeasyphd/pyeasyphd.sublime-settings,sha256=bfi8eWzCWW3hdrqpCCC8aimprMlJE9u38VAe1lEeJtA,3283
6
+ pyeasyphd/pyeasyphd.sublime-syntax,sha256=pXylbA-tye-K5dCTjEJLFVRqtY1T7AgWZ4laxo-dnaE,73
7
+ pyeasyphd/data/templates/csl/apa-no-ampersand.csl,sha256=ndFDG38PUNyGYpvfGqx_KzoSIs0DXA4w0GHG3MgFV7E,86859
8
+ pyeasyphd/data/templates/csl/apa.csl,sha256=S5OAu8zlZqzubySyR5c2FYDEzkTyuC9aRaJJlsygM8M,84591
9
+ pyeasyphd/data/templates/csl/ieee.csl,sha256=SzU0l89ymSCtmpugSoz2S6uM3_GHvibFZwZewn7WVEA,17413
10
+ pyeasyphd/data/templates/tex/Article.tex,sha256=M-vMXiHc2ncOTahtuY40s3flr2Ojo_-C8DDvLExMKbA,1264
11
+ pyeasyphd/data/templates/tex/Article_Header.tex,sha256=41Wv1BcQMmvh5peKTPh3uK_tm7mOSBnrFqkO0JzlXKU,949
12
+ pyeasyphd/data/templates/tex/Article_Tail.tex,sha256=1m7z4T6h8B8ylw3_4Q8_EOgzhyRRVSHgHrGZ6b5ut4k,35
13
+ pyeasyphd/data/templates/tex/Beamer_Header.tex,sha256=AWzgGmosZBX-YRynsbCChu6iF97FKDp3iU1OvBWeoC4,3692
14
+ pyeasyphd/data/templates/tex/Beamer_Tail.tex,sha256=88F75V0B8mP9naOEzM1S8PuEtYPdpZJAwxFQVVPP5K0,211
15
+ pyeasyphd/data/templates/tex/Style.tex,sha256=CK_Uxf3MEKRhxWC0OnipkHrgQIO_I5CHPBQ_T5wXvog,9726
16
+ pyeasyphd/data/templates/tex/TEVC_Header.tex,sha256=WPFIJLQNRsEcr5jxSw8rpc2gXJrMLie273yfwgEXAOU,1579
17
+ pyeasyphd/data/templates/tex/TEVC_Tail.tex,sha256=FBoefRJsnJrH1-eRZfF68qu_lHjwYZhj-iFWBWfV4tw,86
18
+ pyeasyphd/data/templates/tex/eisvogel.tex,sha256=9bDMPfUFjaHQZPCnYLwjsw5DfBtD04uzwfxvQa9nWuE,30748
19
+ pyeasyphd/data/templates/tex/math.tex,sha256=y_8AJzjmCCX6xmZQ_yCcABqMLqufOeh54pafTvNyUIM,11030
20
+ pyeasyphd/data/templates/tex/math_commands.tex,sha256=6ZQOletBnFRA6q6fU8TDVN4c9hDEdbmZuKnJgkgzq48,41513
21
+ pyeasyphd/data/templates/tex/nextaimathmacros.sty,sha256=iF0jyABkoPUY_XA-lPkvZSlblFuWLX9ie82gRqY0Fks,41644
22
+ pyeasyphd/main/__init__.py,sha256=Pv-7359vftMgw3Wi_GuDy99K0TcY6hVwLkFFip774x8,224
23
+ pyeasyphd/main/basic_input.py,sha256=N-33KUs8GQM517Qq6Ey-CAMwgTv9k1IP69BN3rpJnKA,4478
24
+ pyeasyphd/main/pandoc_md_to.py,sha256=W_TFDj2_wieVAXa5xZRO4Of7wlI6yknW14bRLCZ21GA,17138
25
+ pyeasyphd/main/python_run_md.py,sha256=TmvoNoughRbEOY-NnEsaMBSjv13N_AlzrgTDqHiH9GY,14346
26
+ pyeasyphd/main/python_run_tex.py,sha256=2wTCumPrdzfCGA63f6ljlEs4P8WerpQwEZQ0SBQFKSc,8795
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=SHTMhd7_JBTWlZ8azfLV17eXx94j1zRWUAo53pDV014,4403
30
+ pyeasyphd/scripts/run_article_tex.py,sha256=iNSMcPwFj_fgS_itmfSqICom4BVHu6SKmn2eNtiG0Xc,3699
31
+ pyeasyphd/scripts/run_beamer_tex.py,sha256=Rej505gwGB9vPO4h7cPl88p0htZVF9QIG9PDcnnkzhs,3460
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/py_run_bib_md_tex.py,sha256=ZqIzvw8AXDtv35BaVD4ySkXh1MLdKKXfNKN9ghQDWbk,17484
39
+ pyeasyphd/tools/generate/generate_from_bibs.py,sha256=AwY9gDcxOzPkPd0PzVVSv05rVuVDJdfXx13bdaP4R8E,7645
40
+ pyeasyphd/tools/generate/generate_html.py,sha256=DP4Ti6xC0FJnKR6TpUpMysrRa0e7-jEdszHamN5JDMU,5393
41
+ pyeasyphd/tools/generate/generate_library.py,sha256=ENOgnpwZdHpzA9XBUziHYWiYYHsmvgUQ1Xk_CTOIKQU,7824
42
+ pyeasyphd/tools/generate/generate_links.py,sha256=w7-RklfC0QU_-0-_RBHayR6WyhPu-9BQlvdhFjfIq68,16042
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=orO85DiRoBV1BJS0OVE9JnC5pt-kuh8u05n8hWESGKI,10827
47
+ pyeasyphd/tools/search/search_writers.py,sha256=LfI_oxpuX8C5uZP9uosGJ4utO11UJQG230x1YwUJWPU,15665
48
+ pyeasyphd/tools/search/utils.py,sha256=SKQcUBkOqMkJpgmdfnHmPCBZbwvRFF_2QPP0cAlSRFk,7487
49
+ pyeasyphd/utils/utils.py,sha256=8NfdQC0V3UGYeSweb7gjimQkQqM5dWeuUHOiRjVXaxk,3123
50
+ pyeasyphd-0.4.42.dist-info/METADATA,sha256=vKtuBfF0jYMvaW-s62HMrwEmVn-fVR6RPUnlcgzxBLs,1600
51
+ pyeasyphd-0.4.42.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
52
+ pyeasyphd-0.4.42.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
53
+ pyeasyphd-0.4.42.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any