# HG changeset patch # User Ludovic Chabant # Date 1490887283 25200 # Node ID bbe048e682ec90fa2260aeebdd9d7ce7a6a164b5 # Parent bf65fba2854c833fa21e0f9d59303b48b4f5ab44 core: Be nice and handle case-sensitivity when linking to pages. Now making a wiki link to an existing page without using the correct casing will still work. diff -r bf65fba2854c -r bbe048e682ec wikked/db/base.py --- a/wikked/db/base.py Tue Mar 28 21:25:00 2017 -0700 +++ b/wikked/db/base.py Thu Mar 30 08:21:23 2017 -0700 @@ -78,10 +78,15 @@ """ Invalidates resolved information for pages in the wiki. """ pass - def pageExists(self, url=None, path=None): + def pageExists(self, url): """ Returns whether a given page exists. """ raise NotImplementedError() + def validateUrl(self, url): + """ Returns the proper URL, given a URL with potentially different + casing, or `None` if that URL doesn't exist. """ + raise NotImplementedError() + def getLinksTo(self, url): """ Gets the list of links to a given page. """ raise NotImplementedError() diff -r bf65fba2854c -r bbe048e682ec wikked/db/sql.py --- a/wikked/db/sql.py Tue Mar 28 21:25:00 2017 -0700 +++ b/wikked/db/sql.py Thu Mar 30 08:21:23 2017 -0700 @@ -18,7 +18,7 @@ from sqlalchemy.orm.session import Session from wikked.db.base import Database, PageListNotFound, NoWantedPages from wikked.page import Page, PageData, FileSystemPage, WantedPage -from wikked.utils import split_page_url +from wikked.utils import split_page_url, lower_url logger = logging.getLogger(__name__) @@ -36,6 +36,7 @@ # this length (but it's good because it makes those 2 columns short enough # to be indexable by SQL). url = Column(String(260), unique=True) + url_ci = Column(String(260), unique=True) path = Column(String(260), unique=True) endpoint = Column(String(64)) title = Column(UnicodeText) @@ -240,7 +241,7 @@ class SQLDatabase(Database): """ A database cache based on SQL. """ - schema_version = 9 + schema_version = 10 def __init__(self, config): Database.__init__(self) @@ -520,11 +521,21 @@ logger.debug("Uncaching: %s" % ', '.join(uncached_urls)) self.session.commit() - def pageExists(self, url=None, path=None): - q = self.session.query(SQLPage.id, SQLPage.url).filter_by(url=url) + def pageExists(self, url): + l = lower_url(url) + q = self.session.query(SQLPage.id, SQLPage.url_ci).filter_by(url_ci=l) res = self.session.query(q.exists()) return res.scalar() + def validateUrl(self, url): + l = lower_url(url) + try: + q = self.session.query(SQLPage.id, SQLPage.url, SQLPage.url_ci).\ + filter_by(url_ci=l).one() + return q.url + except NoResultFound: + return None + def getLinksTo(self, url): q = self.session.query(SQLReadyLink).\ filter(SQLReadyLink.target_url == url).\ @@ -598,6 +609,7 @@ po = SQLPage() po.cache_time = datetime.datetime.now() po.url = page.url + po.url_ci = lower_url(page.url) po.endpoint, _ = split_page_url(page.url) po.path = page.path po.title = page.title diff -r bf65fba2854c -r bbe048e682ec wikked/resolver.py --- a/wikked/resolver.py Tue Mar 28 21:25:00 2017 -0700 +++ b/wikked/resolver.py Thu Mar 30 08:21:23 2017 -0700 @@ -213,13 +213,18 @@ raw_url = m.group('url') is_edit = bool(m.group('isedit')) url = self.ctx.getAbsoluteUrl(raw_url) + validated_url = self.wiki.db.validateUrl(url) + if validated_url: + url = validated_url self.output.out_links.append(url) action = 'edit' if is_edit else 'read' quoted_url = urllib.parse.quote(url.encode('utf-8')) - if self.wiki.pageExists(url): + + if validated_url: actual_url = '/%s/%s' % (action, quoted_url.lstrip('/')) return ('