Skip to content

Commit b4d27eb

Browse files
authored
Merge pull request #6727 from LMFDB/main
main -> web
2 parents 75d61f0 + e753ec7 commit b4d27eb

File tree

9 files changed

+323
-55
lines changed

9 files changed

+323
-55
lines changed

lmfdb/app.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,6 @@ def statshealth():
410410
else:
411411
abort(503)
412412

413-
414413
@app.route("/info")
415414
def info():
416415
output = ""

lmfdb/knowledge/knowl.py

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
# We need to convert knowl
5454
link_finder_re = re.compile(r"""(KNOWL(_INC)?\(|kid\s*=|knowl\s*=|th_wrap\s*\()\s*['"]([^'"]+)['"]|""")
5555
define_fixer = re.compile(r"""\{\{\s*KNOWL(_INC)?\s*\(\s*['"]([^'"]+)['"]\s*,\s*(title\s*=\s*)?([']([^']+)[']|["]([^"]+)["]\s*)\)\s*\}\}""")
56-
defines_finder_re = re.compile(r"""\*\*([^\*]+)\*\*""")
56+
defines_finder_re = re.compile(r"""\*\*([^\*]+)\*\*|\{\{\s*DEFINES\s*\(\s*['"]([^'"]+)['"]""")
5757
# this one is different from the hashtag regex in main.py,
5858
# because of the match-group ( ... )
5959
hashtag_keywords = re.compile(r'#[a-zA-Z][a-zA-Z0-9-_]{1,}\b')
@@ -131,7 +131,7 @@ def normalize_define(term):
131131

132132

133133
def extract_defines(content):
134-
return sorted({x.strip() for x in defines_finder_re.findall(content)})
134+
return sorted({(x or y).strip() for x,y in defines_finder_re.findall(content)})
135135

136136
# We don't use the PostgresTable from psycodict.database
137137
# since it's aimed at constructing queries for mathematical objects
@@ -790,6 +790,79 @@ def knowl_title(kid):
790790
def knowl_exists(kid):
791791
return knowldb.knowl_exists(kid)
792792

793+
def external_definition_link(site, xid):
794+
if xid.count("@") == 1:
795+
xid, fragment = xid.split("@")
796+
else:
797+
fragment = None
798+
# If you add options here, you also need to update the knowl lmfdb.external_definitions
799+
if site == "arxiv":
800+
# example xid="1809.10195"
801+
return f"https://arxiv.org/abs/{xid}", f"arXiv:{xid}", fragment
802+
if site == "doi":
803+
# example xid="10.2140/obs.2019.2.393"
804+
return f"https://doi.org/{xid}", xid, fragment
805+
if site == "groupprops":
806+
# example xid="Alternating_group"
807+
return f"https://groupprops.subwiki.org/wiki/{xid}", "groupprops:" + xid, fragment
808+
if site == "href":
809+
# href contains both the link and text for displaying
810+
if not xid or xid[0] != "{" or xid[-1] != "}" or xid.count("}{") != 1:
811+
raise ValueError("Improperly formated href")
812+
url, disp = xid[1:-1].split("}{")
813+
return url.strip(), disp, fragment
814+
if site == "mathlib":
815+
# example xid="NumberTheory/ModularForms/Basic.html#UpperHalfPlane.J"
816+
if "#" in xid:
817+
disp = "mathlib:" + xid.split("#")[-1]
818+
else:
819+
disp = "mathlib:" + xid
820+
return f"https://leanprover-community.github.io/mathlib4_docs/Mathlib/{xid}", disp, fragment
821+
if site == "mathworld":
822+
# example xid=HeckeOperator
823+
return f"https://mathworld.wolfram.com/{xid}.html", "mathworld:" + xid, fragment
824+
if site == "mr":
825+
# example xid="0439848"
826+
return f"https://www.ams.org/mathscinet-getitem?mr={xid}", "MR:" + xid, fragment
827+
if site == "nlab":
828+
# example xid="number field"
829+
return f"https://ncatlab.org/nlab/show/{xid}", "nlab:" + xid, fragment
830+
if site == "stacks":
831+
# example xid="020C"
832+
return f"https://stacks.math.columbia.edu/tag/{xid}", "stacks:" + xid, fragment
833+
if site == "wikidata":
834+
# example xid="Q83478"
835+
return f"https://www.wikidata.org/wiki/{xid}", "wikidata:" + xid, fragment
836+
if site == "wikipedia":
837+
# example xid="Group_(mathematics)"
838+
return f"https://en.wikipedia.org/wiki/{xid}", "wiki:" + xid, fragment
839+
if site == "zbl":
840+
# example="0339.14028"
841+
return f"https://zbmath.org/?q={xid}", "zbl:" + xid, fragment
842+
raise ValueError("Unknown external site")
843+
844+
def knowl_definition(title,
845+
clarification_kid=None,
846+
kwargs={}):
847+
from lmfdb.utils.web_display import display_knowl
848+
if clarification_kid is None:
849+
if not kwargs:
850+
return f"<strong>{title}</strong>"
851+
if len(kwargs) == 1:
852+
try:
853+
site, xid = list(kwargs.items())[0]
854+
url, disp, fragment = external_definition_link(site, xid)
855+
link = f'<a href="{url}"><strong>{title}</strong></a>'
856+
if fragment:
857+
link += f" ({fragment})"
858+
return link
859+
except ValueError:
860+
pass
861+
return display_knowl("lmfdb.external_definitions", title, kwargs=kwargs, strong=True)
862+
else:
863+
return display_knowl(clarification_kid, title, strong=True)
864+
865+
793866
@cached_function
794867
def knowl_url_prefix():
795868
"""

lmfdb/knowledge/main.py

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
request, url_for)
2424
from markupsafe import Markup
2525
from flask_login import login_required, current_user
26-
from .knowl import Knowl, knowldb, knowl_title, knowl_exists, knowl_url_prefix, utc_now_naive
26+
from .knowl import Knowl, knowldb, knowl_title, knowl_exists, knowl_url_prefix, knowl_definition, external_definition_link, utc_now_naive
2727
from lmfdb.users import admin_required, knowl_reviewer_required
2828
from lmfdb.users.pwdmanager import userdb
2929
from lmfdb.utils import to_dict, code_snippet_knowl
@@ -170,47 +170,33 @@ def ref_to_link(txt):
170170
thecite = thecite.replace("\\", "") # \href --> href
171171

172172
refs = thecite.split(",")
173-
ans = ""
173+
ans = []
174174

175175
# print "refs",refs
176176

177177
for ref in refs:
178178
ref = ref.strip() # because \cite{A, B, C,D} can have spaces
179-
this_link = ""
180-
if ref.startswith("href"):
181-
the_link = re.sub(r".*{([^}]+)}{.*", r"\1", ref)
182-
click_on = re.sub(r".*}{([^}]+)}\s*", r"\1", ref)
183-
this_link = '{{ LINK_EXT("' + click_on + '","' + the_link + '") | safe}}'
184-
elif ref.startswith("doi"):
185-
ref = ref.replace(":", "") # could be doi:: or doi: or doi
186-
the_doi = ref[3:] # remove the "doi"
187-
this_link = '{{ LINK_EXT("DOI:' + the_doi + '","https://doi.org/' + the_doi + '")| safe }}'
188-
elif ref.lower().startswith("mr"):
189-
ref = ref.replace(":", "")
190-
the_mr = ref[2:] # remove the "MR"
191-
this_link = '{{ LINK_EXT("MR:' + the_mr + '", '
192-
this_link += '"https://mathscinet.ams.org/mathscinet-getitem?mr='
193-
this_link += the_mr + '") | safe}}'
194-
elif ref.lower().startswith("arxiv"):
195-
ref = ref.replace(":", "")
196-
the_arx = ref[5:] # remove the "arXiv"
197-
this_link = '{{ LINK_EXT("arXiv:' + the_arx + '", '
198-
this_link += '"https://arxiv.org/abs/'
199-
this_link += the_arx + '")| safe}}'
200-
elif ref.lower().startswith("zbl"):
201-
ref = ref.replace(":", "")
202-
the_zbl = ref[3:] # remove the "Zbl"
203-
this_link = '{{ LINK_EXT("Zbl:' + the_zbl + '", '
204-
this_link += '"https://zbmath.org/?q=an:'
205-
this_link += the_zbl + '")| safe}}'
206-
207-
if this_link:
208-
if ans:
209-
ans += ", "
210-
ans += this_link
211-
212-
return '[' + ans + ']' + everythingelse
213-
179+
# Special case for href (no colon by design) and for MR (no colon in many existing cases)
180+
for site in ["href", "mr"]:
181+
if ref.lower().startswith(site):
182+
xid = ref[len(site):].lstrip(":")
183+
break
184+
else:
185+
pieces = ref.split(":")
186+
if len(pieces) != 2:
187+
# Improperly formatted ref
188+
continue
189+
site, xid = pieces
190+
site = site.lower()
191+
try:
192+
url, disp, fragment = external_definition_link(site, xid)
193+
except ValueError:
194+
continue
195+
link = f'{{{{ LINK_EXT("{disp}", "{url}") | safe}}}}'
196+
if fragment:
197+
link += f" ({fragment})"
198+
ans.append(link)
199+
return "[" + ", ".join(ans) + "]" + everythingelse
214200

215201
def md_latex_accents(text):
216202
r"""
@@ -249,7 +235,12 @@ def md_preprocess(text):
249235

250236
@app.context_processor
251237
def ctx_knowledge():
252-
return {'Knowl': Knowl, 'knowl_title': knowl_title, 'knowl_url_prefix': knowl_url_prefix, "KNOWL_EXISTS": knowl_exists}
238+
return {'Knowl': Knowl,
239+
'knowl_title': knowl_title,
240+
'knowl_url_prefix': knowl_url_prefix,
241+
"KNOWL_EXISTS": knowl_exists,
242+
"knowl_definition": knowl_definition,
243+
"external_definition_link": external_definition_link}
253244

254245

255246
@app.template_filter("render_knowl")
@@ -263,6 +254,7 @@ def render_knowl_in_template(knowl_content, **kwargs):
263254
{%% from "knowl-defs.html" import KNOWL with context %%}
264255
{%% from "knowl-defs.html" import KNOWL_LINK with context %%}
265256
{%% from "knowl-defs.html" import KNOWL_INC with context %%}
257+
{%% from "knowl-defs.html" import DEFINES with context %%}
266258
{%% from "knowl-defs.html" import TEXT_DATA with context %%}
267259
{%% from "knowl-defs.html" import LINK_EXT with context %%}
268260
@@ -799,6 +791,7 @@ def render_knowl(ID, footer=None, kwargs=None,
799791
{%% from "knowl-defs.html" import KNOWL with context %%}
800792
{%% from "knowl-defs.html" import KNOWL_LINK with context %%}
801793
{%% from "knowl-defs.html" import KNOWL_INC with context %%}
794+
{%% from "knowl-defs.html" import DEFINES with context %%}
802795
{%% from "knowl-defs.html" import TEXT_DATA with context %%}
803796
{%% from "knowl-defs.html" import LINK_EXT with context %%}
804797

0 commit comments

Comments
 (0)