scitex 2.16.1__py3-none-any.whl → 2.16.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.
Files changed (42) hide show
  1. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
  2. scitex/scholar/url_finder/.tmp/open_url/README.md +223 -0
  3. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +694 -0
  4. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +1160 -0
  5. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +344 -0
  6. scitex/scholar/url_finder/.tmp/open_url/__init__.py +24 -0
  7. {scitex-2.16.1.dist-info → scitex-2.16.2.dist-info}/METADATA +1 -1
  8. {scitex-2.16.1.dist-info → scitex-2.16.2.dist-info}/RECORD +11 -36
  9. scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +0 -90
  10. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +0 -1571
  11. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +0 -6262
  12. scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +0 -1274
  13. scitex/dev/plt/data/mpl/dir_ax.txt +0 -459
  14. scitex/scholar/data/.gitkeep +0 -0
  15. scitex/scholar/data/README.md +0 -44
  16. scitex/scholar/data/bib_files/bibliography.bib +0 -1952
  17. scitex/scholar/data/bib_files/neurovista.bib +0 -277
  18. scitex/scholar/data/bib_files/neurovista_enriched.bib +0 -441
  19. scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +0 -441
  20. scitex/scholar/data/bib_files/neurovista_processed.bib +0 -338
  21. scitex/scholar/data/bib_files/openaccess.bib +0 -89
  22. scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +0 -2178
  23. scitex/scholar/data/bib_files/pac.bib +0 -698
  24. scitex/scholar/data/bib_files/pac_enriched.bib +0 -1061
  25. scitex/scholar/data/bib_files/pac_processed.bib +0 -0
  26. scitex/scholar/data/bib_files/pac_titles.txt +0 -75
  27. scitex/scholar/data/bib_files/paywalled.bib +0 -98
  28. scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +0 -58
  29. scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +0 -87
  30. scitex/scholar/data/bib_files/seizure_prediction.bib +0 -694
  31. scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
  32. scitex/scholar/data/bib_files/test_complete_enriched.bib +0 -437
  33. scitex/scholar/data/bib_files/test_final_enriched.bib +0 -437
  34. scitex/scholar/data/bib_files/test_seizure.bib +0 -46
  35. scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
  36. scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
  37. scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
  38. scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
  39. scitex/scholar/data/impact_factor.db +0 -0
  40. {scitex-2.16.1.dist-info → scitex-2.16.2.dist-info}/WHEEL +0 -0
  41. {scitex-2.16.1.dist-info → scitex-2.16.2.dist-info}/entry_points.txt +0 -0
  42. {scitex-2.16.1.dist-info → scitex-2.16.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,344 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-07-29 03:10:08 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/scholar/open_url/_ResolverLinkFinder.py
5
+ # ----------------------------------------
6
+ from __future__ import annotations
7
+
8
+ import os
9
+
10
+ __FILE__ = (
11
+ "./src/scitex/scholar/open_url/_ResolverLinkFinder.py"
12
+ )
13
+ __DIR__ = os.path.dirname(__FILE__)
14
+ # ----------------------------------------
15
+
16
+ """Robust resolver link finder using a prioritized, multi-layered approach.
17
+
18
+ Priority order:
19
+ 1. Link Target (domain matching) - Most reliable
20
+ 2. Page Structure (CSS selectors) - Very reliable
21
+ 3. Text Patterns - Good fallback
22
+ """
23
+
24
+ import re
25
+ from typing import List, Optional
26
+ from urllib.parse import urlparse
27
+
28
+ from playwright.async_api import ElementHandle, Page
29
+
30
+ from scitex import logging
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ class ResolverLinkFinder:
36
+ """Finds full-text links on resolver pages using multiple strategies."""
37
+
38
+ # DOI prefix to publisher domain mapping
39
+ DOI_TO_DOMAIN = {
40
+ "10.1038": [
41
+ "nature.com",
42
+ "springernature.com",
43
+ ], # Nature Publishing Group
44
+ "10.1016": ["sciencedirect.com", "elsevier.com"], # Elsevier
45
+ "10.1002": ["wiley.com", "onlinelibrary.wiley.com"], # Wiley
46
+ "10.1007": ["springer.com", "link.springer.com"], # Springer
47
+ "10.1126": ["science.org", "sciencemag.org"], # Science/AAAS
48
+ "10.1021": ["acs.org", "pubs.acs.org"], # ACS Publications
49
+ "10.1111": [
50
+ "wiley.com",
51
+ "onlinelibrary.wiley.com",
52
+ ], # Wiley (alternative)
53
+ "10.1080": ["tandfonline.com"], # Taylor & Francis
54
+ "10.1177": ["sagepub.com", "journals.sagepub.com"], # SAGE
55
+ "10.1093": ["oup.com", "academic.oup.com"], # Oxford
56
+ "10.1109": ["ieee.org", "ieeexplore.ieee.org"], # IEEE
57
+ "10.1371": ["plos.org", "journals.plos.org"], # PLOS
58
+ "10.1073": ["pnas.org"], # PNAS
59
+ "10.1136": ["bmj.com"], # BMJ
60
+ "10.3389": ["frontiersin.org"], # Frontiers
61
+ "10.3390": ["mdpi.com"], # MDPI
62
+ }
63
+
64
+ # Common resolver page structures
65
+ STRUCTURE_SELECTORS = [
66
+ # SFX (ExLibris) - used by many universities
67
+ "div#fulltext a",
68
+ "div.sfx-fulltext a",
69
+ "div.results-title > a",
70
+ "td.object-cell a",
71
+ ".getFullTxt a",
72
+ 'div[id*="fulltext"] a',
73
+ 'div[class*="fulltext"] a',
74
+ # SFX specific selectors for University of Melbourne
75
+ "a[title*='Wiley Online Library']",
76
+ "a[href*='wiley.com']",
77
+ "a[href*='onlinelibrary.wiley.com']",
78
+ ".sfx-target a",
79
+ ".target a",
80
+ "td a[href*='wiley']",
81
+ # Primo (ExLibris)
82
+ "prm-full-view-service-container a",
83
+ "span.availability-status-available a",
84
+ # Summon (ProQuest)
85
+ ".summon-fulltext-link",
86
+ "a.summon-link",
87
+ # EDS (EBSCO)
88
+ "a.fulltext-link",
89
+ ".ft-link a",
90
+ # Generic patterns
91
+ "a.full-text-link",
92
+ "a.fulltext",
93
+ "a#full-text-link",
94
+ ".access-link a",
95
+ ".available-link a",
96
+ ]
97
+
98
+ # Text patterns in priority order
99
+ TEXT_PATTERNS = [
100
+ # Most specific
101
+ "View full text at",
102
+ "Available from Nature",
103
+ "Available from ScienceDirect",
104
+ "Available from Wiley",
105
+ "Available from Wiley Online Library",
106
+ "Full text available from",
107
+ # Common patterns
108
+ "View full text",
109
+ "Full Text from Publisher",
110
+ "Get full text",
111
+ "Access full text",
112
+ "Go to article",
113
+ "Access article",
114
+ # Generic but reliable
115
+ "Full Text",
116
+ "Full text",
117
+ "Article",
118
+ "View",
119
+ "PDF",
120
+ "Download",
121
+ ]
122
+
123
+ def __init__(self):
124
+ self._doi_pattern = re.compile(r"10\.\d{4,}/[-._;()/:\w]+")
125
+
126
+ def get_expected_domains(self, doi: str) -> List[str]:
127
+ """Get expected publisher domains for a DOI."""
128
+ # Extract DOI prefix
129
+ match = re.match(r"(10\.\d{4,})", doi)
130
+ if not match:
131
+ return []
132
+
133
+ prefix = match.group(1)
134
+ return self.DOI_TO_DOMAIN.get(prefix, [])
135
+
136
+ async def find_link_async(self, page, doi: str) -> dict:
137
+ """Find the best full-text link using prioritized strategies."""
138
+ logger.info(f"Finding resolver link for DOI: {doi}")
139
+
140
+ # Strategy 1: Link Target (Most Reliable)
141
+ link_url = await self._find_by_domain_async(page, doi)
142
+ if link_url:
143
+ logger.info("✓ Found link using domain matching (Strategy 1)")
144
+ return {"success": True, "url": link_url, "method": "domain"}
145
+
146
+ # Strategy 2: Page Structure with scoring
147
+ link_url = await self._find_by_structure_async(page, doi)
148
+ if link_url:
149
+ logger.info("✓ Found link using page structure (Strategy 2)")
150
+ return {"success": True, "url": link_url, "method": "structure"}
151
+
152
+ logger.warning("✗ No suitable links found")
153
+ return {"success": False, "url": None, "method": None}
154
+
155
+ async def _find_by_domain_async(self, page: Page, doi: str) -> Optional[str]:
156
+ """Strategy 1: Find link by expected publisher domain."""
157
+ expected_domains = self.get_expected_domains(doi)
158
+ if not expected_domains:
159
+ logger.debug(f"No known publisher domains for DOI prefix: {doi}")
160
+ return None
161
+
162
+ logger.debug(f"Looking for links to domains: {expected_domains}")
163
+ all_links = await page.query_selector_all("a[href]")
164
+
165
+ for link in all_links:
166
+ href = await link.get_attribute("href")
167
+ if not href:
168
+ continue
169
+
170
+ try:
171
+ parsed = urlparse(href)
172
+ domain = parsed.netloc.lower()
173
+
174
+ for expected in expected_domains:
175
+ if expected in domain:
176
+ text = await link.inner_text() or ""
177
+ logger.info(
178
+ f"Found domain match: {domain} (text: '{text[:50]}')"
179
+ )
180
+
181
+ if not any(
182
+ bad in text.lower()
183
+ for bad in ["abstract", "preview", "summary"]
184
+ ):
185
+ return href
186
+ else:
187
+ logger.debug(
188
+ f"Skipping abstract/preview link: {text}"
189
+ )
190
+ except Exception as e:
191
+ logger.debug(f"Error parsing URL {href}: {e}")
192
+
193
+ return None
194
+
195
+ async def _find_by_structure_async(self, page, doi: str):
196
+ """Find link by page structure with publisher prioritization."""
197
+ potential_links = []
198
+ expected_domains = self.get_expected_domains(doi)
199
+ publisher_keywords = [
200
+ domain.split(".")[0] for domain in expected_domains
201
+ ]
202
+ aggregator_keywords = ["gale", "proquest", "ebsco", "jstor", "onefile"]
203
+
204
+ # Gather all possible links
205
+ for selector in self.STRUCTURE_SELECTORS:
206
+ try:
207
+ elements = await page.query_selector_all(selector)
208
+ logger.debug(
209
+ f"Found {len(elements)} elements with selector: {selector}"
210
+ )
211
+
212
+ for element in elements:
213
+ if await element.is_visible():
214
+ href = await element.get_attribute("href")
215
+ text = (await element.inner_text() or "").lower()
216
+
217
+ if href and href.strip():
218
+ potential_links.append(
219
+ {"href": href, "text": text, "score": 0}
220
+ )
221
+ except Exception as element_error:
222
+ logger.debug(
223
+ f"Error with selector '{selector}': {element_error}"
224
+ )
225
+
226
+ if not potential_links:
227
+ return None
228
+
229
+ # Score the links
230
+ for link in potential_links:
231
+ # Highest score for direct publisher match
232
+ if any(keyword in link["text"] for keyword in publisher_keywords):
233
+ link["score"] = 3
234
+ # High score for generic publisher
235
+ elif "publisher" in link["text"]:
236
+ link["score"] = 2
237
+ # Negative score for aggregators
238
+ elif any(
239
+ keyword in link["text"] for keyword in aggregator_keywords
240
+ ):
241
+ link["score"] = -1
242
+ # Default neutral score
243
+ else:
244
+ link["score"] = 0
245
+
246
+ # Sort by score, highest first
247
+ sorted_links = sorted(
248
+ potential_links, key=lambda x: x["score"], reverse=True
249
+ )
250
+ best_link = sorted_links[0]
251
+
252
+ logger.debug(
253
+ f"Found structural match: '{best_link['text'][:50]}' -> {best_link['href']}"
254
+ )
255
+ return best_link["href"]
256
+
257
+ async def _find_by_text_async(self, page: Page) -> Optional[str]:
258
+ """Strategy 3: Find link by text patterns."""
259
+ for pattern in self.TEXT_PATTERNS:
260
+ try:
261
+ selector = f'a:has-text("{pattern}")'
262
+ link = await page.query_selector(selector)
263
+ if link and await link.is_visible():
264
+ href = await link.get_attribute("href")
265
+ if href and href.strip():
266
+ logger.debug(
267
+ f"Found text match: '{pattern}' -> {href[:100]}"
268
+ )
269
+ return href
270
+ except Exception as e:
271
+ logger.debug(f"Error with text pattern '{pattern}': {e}")
272
+
273
+ return None
274
+
275
+ async def click_and_wait_async(self, page: Page, link: ElementHandle) -> bool:
276
+ """Click link and wait for navigation.
277
+
278
+ Returns True if navigation succeeded.
279
+ """
280
+ initial_url = page.url
281
+
282
+ try:
283
+ # Get link info for logging
284
+ href = await link.get_attribute("href") or ""
285
+ text = await link.inner_text() or ""
286
+ logger.info(f"Clicking link: '{text[:50]}' -> {href[:100]}")
287
+
288
+ # Click and wait for navigation
289
+ await link.click()
290
+
291
+ # Wait for either navigation or network idle
292
+ try:
293
+ await page.wait_for_load_state("networkidle", timeout=30000)
294
+ except:
295
+ # Fallback to domcontentloaded if network doesn't settle
296
+ await page.wait_for_load_state(
297
+ "domcontentloaded", timeout=30000
298
+ )
299
+
300
+ # Additional wait for JavaScript redirects
301
+ await page.wait_for_timeout(3000)
302
+
303
+ # Check if we navigated
304
+ final_url = page.url
305
+ if final_url != initial_url:
306
+ logger.info(
307
+ f"Successfully navigated: {initial_url} -> {final_url}"
308
+ )
309
+ return True
310
+ else:
311
+ logger.warning("No navigation occurred after click")
312
+ return False
313
+
314
+ except Exception as e:
315
+ logger.error(f"Error during click and navigation: {e}")
316
+ return False
317
+
318
+
319
+ # Convenience function for integration
320
+ async def find_and_click_resolver_link_async(page: Page, doi: str) -> Optional[str]:
321
+ """Find and click the best resolver link.
322
+
323
+ Args:
324
+ page: Playwright page object
325
+ doi: Target DOI
326
+
327
+ Returns:
328
+ Final URL after navigation, or None if failed
329
+ """
330
+ finder = ResolverLinkFinder()
331
+
332
+ # Find link
333
+ link = await finder.find_link_async(page, doi)
334
+ if not link:
335
+ return None
336
+
337
+ # Click and navigate
338
+ success = await finder.click_and_wait_async(page, link)
339
+ if success:
340
+ return page.url
341
+ else:
342
+ return None
343
+
344
+ # EOF
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-07-31 00:53:24 (ywatanabe)"
4
+ # File: /home/ywatanabe/proj/scitex_repo/src/scitex/scholar/open_url/__init__.py
5
+ # ----------------------------------------
6
+ from __future__ import annotations
7
+
8
+ import os
9
+
10
+ __FILE__ = (
11
+ "./src/scitex/scholar/open_url/__init__.py"
12
+ )
13
+ __DIR__ = os.path.dirname(__FILE__)
14
+ # ----------------------------------------
15
+
16
+ from ._DOIToURLResolver import DOIToURLResolver
17
+ from ._OpenURLResolver import OpenURLResolver
18
+
19
+ __all__ = [
20
+ "OpenURLResolver",
21
+ "DOIToURLResolver",
22
+ ]
23
+
24
+ # EOF
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scitex
3
- Version: 2.16.1
3
+ Version: 2.16.2
4
4
  Summary: A comprehensive Python library for scientific computing and data analysis
5
5
  Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-python
6
6
  Project-URL: Documentation, https://scitex.readthedocs.io
@@ -577,11 +577,6 @@ scitex/dev/plt/plot_stx_scatter.py,sha256=yJnZE0aL5Z0armnKyxCgdSIfmwSx0MO_BoDbzT
577
577
  scitex/dev/plt/plot_stx_shaded_line.py,sha256=Ss4RD0qxO_uH1h_NL_meSH1-_ZXfOKnV1MAT48tegnI,718
578
578
  scitex/dev/plt/plot_stx_violin.py,sha256=oEAWE4RwG7SQ3JlVuzfSbTFDF02VRb_vE4qBLU3tMu4,680
579
579
  scitex/dev/plt/plot_stx_violinplot.py,sha256=wafuzIKs9WJRfXcH4bxxuigqCh75nxcZDfFq-9P1zxA,687
580
- scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml,sha256=1E1RfxT1QtA3M5hrqn0zynwMrhIEIpaZSAHItRBIHdI,2843
581
- scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml,sha256=ambH7kkBUivqVvo7thcMfs-ZvXAdaXtEEYuPTAvSOls,28660
582
- scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml,sha256=xzytlIhc9V3Aartc-HzzlDVvcOd7QGuzIkIe9X75sdk,181125
583
- scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml,sha256=kvV9iS2L3x3Et7LWK9Dyo_pQBnK2eTu13EXNS619ePM,27684
584
- scitex/dev/plt/data/mpl/dir_ax.txt,sha256=HuMRJLF5pw58SaNrKkX8eeAj19k219bV7EVGzSPOCUU,5686
585
580
  scitex/dev/plt/demo_plotters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
586
581
  scitex/dev/plt/demo_plotters/plot_mpl_axhline.py,sha256=ECGTgIGgpU82llOHVqur0gzSl1NUHjvyaB85cZewKW8,707
587
582
  scitex/dev/plt/demo_plotters/plot_mpl_axhspan.py,sha256=WetEGSzRbppTvn5VprGNglKuzLMoM8tFXg_N0jMFgFM,704
@@ -1404,32 +1399,6 @@ scitex/scholar/core/_mixins/_savers.py,sha256=DonIcpCaobrRTs_LAuwurYEhsUTQE9otzX
1404
1399
  scitex/scholar/core/_mixins/_search.py,sha256=8SyCtYtyyzTtMP85kFPrOZLK8PvL9dCCoOyI95N-SfI,3721
1405
1400
  scitex/scholar/core/_mixins/_services.py,sha256=rnNtDTBES6RwKJzC0Wpi0G9Xiju2pudrdrSfrftB9dM,3228
1406
1401
  scitex/scholar/core/_mixins/_url_finding.py,sha256=PawfItu2ienUW6Hj155fPT2KsKqm_sc7uukEYAXr-Rk,3241
1407
- scitex/scholar/data/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1408
- scitex/scholar/data/README.md,sha256=x38oaKofFr-9MdmYSX6etjt7c_37BtJ1HI2bVvGWxdc,1343
1409
- scitex/scholar/data/impact_factor.db,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1410
- scitex/scholar/data/bib_files/bibliography.bib,sha256=6cBOh0rNI9OpN4kOIOZMpE6jZuoEbfDJkFNgmcMDeVo,265769
1411
- scitex/scholar/data/bib_files/neurovista.bib,sha256=NV7yU5UjkntfEJuLHSGdAzYR1GgddEQpngjQJWd5Pkc,12935
1412
- scitex/scholar/data/bib_files/neurovista_enriched.bib,sha256=Bw7CiHo71OYVPRBO5l8bujzmy5xbExqO8Z7XYihqP98,62246
1413
- scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib,sha256=Bw7CiHo71OYVPRBO5l8bujzmy5xbExqO8Z7XYihqP98,62246
1414
- scitex/scholar/data/bib_files/neurovista_processed.bib,sha256=CNL3LmRpLhp-qahyMEgfKRlQHuGYnDjUjitxVSiU3As,51469
1415
- scitex/scholar/data/bib_files/openaccess.bib,sha256=73BIBSj5m0HbxeE-SrmI5hmDGCSbPhvbQioDXqb54Fc,3524
1416
- scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib,sha256=z5Rx7N_8wjQqYwPjwUbybeAp4fb1XyjbQ3X1LpuaqqU,272200
1417
- scitex/scholar/data/bib_files/pac.bib,sha256=jxxGxT5CruEvKZfMcMQqt-48ZPcKSCuw-L4gJBUkvsc,27557
1418
- scitex/scholar/data/bib_files/pac_enriched.bib,sha256=qYWT4aOp1694eEhdYUZZJ1e9uT5ZqjuSphZrmF1PwhU,142261
1419
- scitex/scholar/data/bib_files/pac_processed.bib,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1420
- scitex/scholar/data/bib_files/pac_titles.txt,sha256=KZI7uRGxSWCWitkI3E7dXxl3H46eeyBMJdJEavGb8Z4,7276
1421
- scitex/scholar/data/bib_files/paywalled.bib,sha256=HeuYd4TxWBNFyn8BboC_SMrUe1PYhtVVZtdHM-A5UPI,3797
1422
- scitex/scholar/data/bib_files/related-papers-by-coauthors.bib,sha256=sSXMtAA3zBYS2wG2yrDJSeF6li37tzO40nEXjZwgyRw,2917
1423
- scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib,sha256=2ueaWK_0vl7seBYll5_t0BP-MjENYHDIedwod7jyZHI,12117
1424
- scitex/scholar/data/bib_files/seizure_prediction.bib,sha256=SUbkEW6j10dRHNqPAtIUIKJUZIMuY6Q7eft-TJ0T0ec,27450
1425
- scitex/scholar/data/bib_files/seizure_prediction_processed.bib,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1426
- scitex/scholar/data/bib_files/test_complete_enriched.bib,sha256=Pmc3B9FkOXaFGdQZn3_G6kHDLGbTh5W-MLj6Rj-ejAo,60424
1427
- scitex/scholar/data/bib_files/test_final_enriched.bib,sha256=Pmc3B9FkOXaFGdQZn3_G6kHDLGbTh5W-MLj6Rj-ejAo,60424
1428
- scitex/scholar/data/bib_files/test_seizure.bib,sha256=vZcnnTVaDCPR1fpEBuYSv2RsrwmIbDx4ogIeObzJdis,1249
1429
- scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx,sha256=NJoAKC7RL3W_oBvv72j9mU5bZydEEAPDO8sza-R6JKE,929300
1430
- scitex/scholar/data/impact_factor/JCR_IF_2024.db,sha256=hnpVDE8EY0OTXWtBy1NYietsglMxDcQTZs-IRsxHCjQ,2957312
1431
- scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx,sha256=2POoCl1Nf7WCG242KUjvU06J43RIoCpT4BEucCxIQBw,1756410
1432
- scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db,sha256=G5YuIOF0PJw0AeCxugL_cQvtFquH-MHoq1rXBrbnmSg,2875392
1433
1402
  scitex/scholar/docs/00_SUMMARY.md,sha256=quFBhRq5WJ06u5Po5oSzR28A-WihrApquXZYeyqwoS8,4011
1434
1403
  scitex/scholar/docs/01_STORAGE_ARCHITECTURE.md,sha256=sKQDAS3ejZVJ8W51GADV_BqfWnj8oI4dOpQ1XCiF4gc,3746
1435
1404
  scitex/scholar/docs/02_PIPELINE_ORGANIZATION.md,sha256=8BS_j6S89TiLqDRiODACZsbEMs6EyOiLDj8CgILz4WU,8288
@@ -1584,6 +1553,12 @@ scitex/scholar/storage/_mixins/_symlink_handlers.py,sha256=m63ATAfDmAUDk4shsVf0a
1584
1553
  scitex/scholar/url_finder/README.md,sha256=CGQpOktqpQF_5z_u-pIKMYBAeQZXT9Eh24XaPtfV6HM,2016
1585
1554
  scitex/scholar/url_finder/ScholarURLFinder.py,sha256=C9lpYefs-9YoGcYYYBDB8GrGQyp27LmLTIv_WelDJgI,11840
1586
1555
  scitex/scholar/url_finder/__init__.py,sha256=FV9ocQPE6520WUVVMV2u7hci_-2ha1KLJHzRUUlWGBw,93
1556
+ scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py,sha256=n37aHjOq6YrtgR0DGN0iznKy8EWCjzgBODVm7pINc-w,12926
1557
+ scitex/scholar/url_finder/.tmp/open_url/README.md,sha256=4CyiK7Zbdd23WjsYUU7J7FLPmhxwxA1PWc7enL9dGug,6836
1558
+ scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py,sha256=C0cURB6BO78udjjsucqwM_rTxDy5XTaqyuxLBCNbyeU,23632
1559
+ scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py,sha256=yigbSuUZ2m6XmDFjhrIdn8Bva5ic7Y-DdwcMCUFlisA,43504
1560
+ scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py,sha256=s-2HZzAwBp7DxFtpqzEivLbvJ20J1pcBHSDXYmjmJ9A,11869
1561
+ scitex/scholar/url_finder/.tmp/open_url/__init__.py,sha256=d1umAnLQNFGYX7oui5Jl8JrjoDpwHkTmHwIiUbPbvBk,571
1587
1562
  scitex/scholar/url_finder/docs/CORE_URL_TYPES.md,sha256=bRd2AfoypJiO4xgJBqpbC0GR6BhO4dEBo8D4fg7oDo0,6651
1588
1563
  scitex/scholar/url_finder/docs/URL_SCHEMA.md,sha256=MDSUpqJzVwll9Mpspp2RhvYIv6bq_VCTktmTxk_DKk4,7696
1589
1564
  scitex/scholar/url_finder/strategies/__init__.py,sha256=UIfUjfZbFhDZzfEHl3uCuIBUgMEdUMYaC9NbMEDG2Hs,1439
@@ -2576,8 +2551,8 @@ scitex/web/_summarize_url.py,sha256=PpWBk727pjC_yivI_RVNU_RMxjV_jrqlMNaD6kXQAPk,
2576
2551
  scitex/web/download_images.py,sha256=g4sxWzg0ip5Wig7ElPo6fDz5DdXKyJnAsBFwIYoQI6g,9473
2577
2552
  scitex/writer/README.md,sha256=RqUMOJD7wUiQjWoiLSf_hl_Y0IAE3_xPxhlp941zYe4,1299
2578
2553
  scitex/writer/__init__.py,sha256=jQqdIyvQhknySoUAMKreBhAa1KwZ0ieW8SYCppBukts,3301
2579
- scitex-2.16.1.dist-info/METADATA,sha256=Kq0j5a18i7V8Xbe6rlRChbMkU_NC_WgnCfzI4hXx-wQ,26534
2580
- scitex-2.16.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
2581
- scitex-2.16.1.dist-info/entry_points.txt,sha256=ZtDrHnPNMnsSmAnQoCHNmk0xKotNyR2X_YFDDteupW8,497
2582
- scitex-2.16.1.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
2583
- scitex-2.16.1.dist-info/RECORD,,
2554
+ scitex-2.16.2.dist-info/METADATA,sha256=a71IS-tqbzmEYZNYLWSqh1kkVSHPrD3pqBz_H9yA6kI,26534
2555
+ scitex-2.16.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
2556
+ scitex-2.16.2.dist-info/entry_points.txt,sha256=ZtDrHnPNMnsSmAnQoCHNmk0xKotNyR2X_YFDDteupW8,497
2557
+ scitex-2.16.2.dist-info/licenses/LICENSE,sha256=TfPDBt3ar0uv_f9cqCDMZ5rIzW3CY8anRRd4PkL6ejs,34522
2558
+ scitex-2.16.2.dist-info/RECORD,,
@@ -1,90 +0,0 @@
1
- # Timestamp: "2025-12-21 12:37:14 (ywatanabe)"
2
- # File: ./src/scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml
3
-
4
- basic:
5
- - plot # Line/marker plots
6
- - scatter # Scatter plots
7
- - bar # Vertical bar charts
8
- - barh # Horizontal bar charts
9
- - stem # Stem plots
10
- - step # Step plots
11
- - fill # Filled polygons
12
- - fill_between # Fill between y-values
13
- - fill_betweenx # Fill between x-values
14
-
15
- statistical:
16
- - hist # Histogram
17
- - hist2d # 2D histogram
18
- - boxplot # Box and whisker plots
19
- - bxp # Box plot from precomputed stats
20
- - violinplot # Violin plots
21
- - violin # Single violin
22
- - errorbar # Error bar plots
23
- - pie # Pie charts
24
- - ecdf # Empirical cumulative distribution
25
-
26
- image:
27
- - imshow # Display image/array
28
- - matshow # Display matrix
29
- - pcolor # Pseudocolor plot
30
- - pcolormesh # Pseudocolor mesh (faster)
31
- - pcolorfast # Pseudocolor (fastest)
32
- - contour # Contour lines
33
- - contourf # Filled contours
34
- - hexbin # Hexagonal binning
35
- - spy # Sparsity pattern
36
-
37
- vector:
38
- - quiver # Arrow/vector field
39
- - streamplot # Streamlines
40
- - barbs # Wind barbs
41
-
42
- spectral:
43
- - specgram # Spectrogram
44
- - psd # Power spectral density
45
- - csd # Cross spectral density
46
- - cohere # Coherence
47
- - acorr # Autocorrelation
48
- - xcorr # Cross-correlation
49
- - angle_spectrum # Phase angle spectrum
50
- - magnitude_spectrum # Magnitude spectrum
51
- - phase_spectrum # Phase spectrum
52
-
53
- triangulation:
54
- - tricontour # Triangular contour lines
55
- - tricontourf # Triangular filled contours
56
- - tripcolor # Triangular pseudocolor
57
- - triplot # Triangular grid lines
58
-
59
- composite:
60
- - stackplot # Stacked area plots
61
- - stairs # Stair/step plots
62
- - eventplot # Event sequence plots
63
- - broken_barh # Broken horizontal bars
64
-
65
- log_scale:
66
- - loglog # Log-log scale plot
67
- - semilogx # Semi-log x scale
68
- - semilogy # Semi-log y scale
69
-
70
- annotation:
71
- - annotate # Text with arrow annotation
72
- - text # Text at position
73
- - arrow # Arrow patch
74
- - axhline # Horizontal line across axes
75
- - axvline # Vertical line across axes
76
- - hlines # Horizontal lines at y positions
77
- - vlines # Vertical lines at x positions
78
- - axhspan # Horizontal span (shaded region)
79
- - axvspan # Vertical span (shaded region)
80
- - axline # Infinite line
81
-
82
- decoration:
83
- - legend # Add legend
84
- - grid # Add grid
85
- - table # Add table
86
- - clabel # Contour labels
87
- - bar_label # Bar chart labels
88
- - quiverkey # Quiver key/legend
89
-
90
- # EOF