8from datetime
import datetime
9from urllib.parse
import urlencode
15 "website":
"https://openalex.org/",
16 "wikidata_id":
"Q110718454",
17 "official_api_documentation":
"https://docs.openalex.org/how-to-use-the-api/api-overview",
18 "use_official_api":
True,
19 "require_api_key":
False,
25categories = [
"science",
"scientific publications"]
27search_url =
"https://api.openalex.org/works"
34def request(query: str, params: dict[str, t.Any]) ->
None:
38 "page": params[
"pageno"],
42 "sort":
"relevance_score:desc",
46 language = params.get(
"language")
47 filters: list[str] = []
48 if isinstance(language, str)
and language !=
"all":
49 iso2 = language.split(
"-")[0].split(
"_")[0]
51 filters.append(f
"language:{iso2}")
54 args[
"filter"] =
",".join(filters)
57 if isinstance(mailto, str)
and mailto !=
"":
58 args[
"mailto"] = mailto
60 params[
"url"] = f
"{search_url}?{urlencode(args)}"
63def response(resp: SXNG_Response) -> EngineResults:
67 for item
in data.get(
"results", []):
69 title: str = item.get(
"title",
"")
72 journal, publisher, pages, volume, number, published_date =
_extract_biblio(item)
78 res.types.LegacyResult(
79 template=
"paper.html",
90 publishedDate=published_date,
94 type=item.get(
"type"),
103 first_page = biblio.get(
"first_page")
104 last_page = biblio.get(
"last_page")
105 if first_page
and last_page:
106 return f
"{first_page}-{last_page}"
108 return str(first_page)
110 return str(last_page)
118 for fmt
in (
"%Y-%m-%d",
"%Y-%m",
"%Y"):
120 return datetime.strptime(value, fmt)
130 return doi_value.removeprefix(
"https://doi.org/")
134 abstract_inverted_index: dict[str, list[int]] |
None,
138 if not abstract_inverted_index:
140 position_to_token: dict[int, str] = {}
142 for token, positions
in abstract_inverted_index.items():
143 for pos
in positions:
144 position_to_token[pos] = token
145 max_index = max(max_index, pos)
148 ordered_tokens = [position_to_token.get(i,
"")
for i
in range(0, max_index + 1)]
150 text =
" ".join(t
for t
in ordered_tokens
if t !=
"")
151 return text
if text !=
"" else None
155 primary_location = item.get(
"primary_location", {})
156 landing_page_url: str |
None = primary_location.get(
"landing_page_url")
157 work_url: str = item.get(
"id",
"")
158 url: str = landing_page_url
or work_url
159 open_access = item.get(
"open_access", {})
160 pdf_url: str |
None = primary_location.get(
"pdf_url")
or open_access.get(
"oa_url")
161 html_url: str |
None = landing_page_url
162 return url, html_url, pdf_url
166 authors: list[str] = []
167 for auth
in item.get(
"authorships", []):
170 author_obj = auth.get(
"author", {})
171 display_name = author_obj.get(
"display_name")
172 if isinstance(display_name, str)
and display_name !=
"":
173 authors.append(display_name)
179 for c
in item.get(
"concepts", []):
180 name = (c
or {}).get(
"display_name")
181 if isinstance(name, str)
and name !=
"":
187 item: dict[str, t.Any],
188) -> tuple[str |
None, str |
None, str |
None, str |
None, str |
None, datetime |
None]:
189 host_venue = item.get(
"host_venue", {})
190 biblio = item.get(
"biblio", {})
191 journal: str |
None = host_venue.get(
"display_name")
192 publisher: str |
None = host_venue.get(
"publisher")
194 volume = biblio.get(
"volume")
195 number = biblio.get(
"issue")
196 published_date =
_parse_date(item.get(
"publication_date"))
197 return journal, publisher, pages, volume, number, published_date
201 cited_by_count = item.get(
"cited_by_count")
202 if isinstance(cited_by_count, int):
203 return f
"{cited_by_count} citations"
tuple[str|None, str|None, str|None, str|None, str|None, datetime|None] _extract_biblio(dict[str, t.Any] item)
list[str] _extract_authors(dict[str, t.Any] item)
str|None _doi_to_plain(str|None doi_value)
str|None _stringify_pages(dict[str, t.Any] biblio)
EngineResults response(SXNG_Response resp)
list[str] _extract_tags(dict[str, t.Any] item)
datetime|None _parse_date(str|None value)
str|None _reconstruct_abstract(dict[str, list[int]]|None abstract_inverted_index)
str|None _extract_comments(dict[str, t.Any] item)
tuple[str, str|None, str|None] _extract_links(dict[str, t.Any] item)
None request(str query, dict[str, t.Any] params)