all repos — nasg @ e18582840e17598ab739402d4e8bbbc2dd808328

adding opensearch (xml description j2 template, RSS+XML search results PHP)
Peter Molnar hello@petermolnar.eu
Wed, 22 May 2019 10:15:21 +0100
commit

e18582840e17598ab739402d4e8bbbc2dd808328

parent

32bf4994e7c04ce4476453d5ab1f4c58c918efc7

4 files changed, 92 insertions(+), 18 deletions(-)

jump to
M nasg.pynasg.py

@@ -326,6 +326,7 @@ return mtime(self.fpath)

@property def dt(self): + """ this returns a timestamp, not an arrow object """ maybe = self.mtime for key in ['published', 'date']: t = self.meta.get(key, None)

@@ -500,7 +501,6 @@ def updated(self):

maybe = self.dt if len(self.comments): for c in self.comments.values(): - if c.dt > maybe: maybe = c.dt return maybe

@@ -1574,7 +1574,7 @@ ret = int(maybe[0])

return ret def append(self, post): - mtime = int(post.mtime) + mtime = int(post.published.timestamp) check = self.check(post.name) if (check and check < mtime): self.db.execute('''

@@ -1602,24 +1602,22 @@ ))

self.is_changed = True @property - def renderfile(self): - return os.path.join( - settings.paths.get('build'), - 'search.php' - ) - - @property - def templatefile(self): - return 'Search.j2.php' + def templates(self): + return ['Search.j2.php', 'OpenSearch.j2.php', 'OpenSearch.j2.xml'] async def _render(self): - r = J2.get_template(self.templatefile).render({ - 'post': {}, - 'site': settings.site, - 'menu': settings.menu, - 'meta': settings.meta, - }) - writepath(self.renderfile, r) + for template in self.templates: + r = J2.get_template(template).render({ + 'post': {}, + 'site': settings.site, + 'menu': settings.menu, + 'meta': settings.meta, + }) + target = os.path.join( + settings.paths.get('build'), + template.replace('.j2', '').lower() + ) + writepath(target, r) class IndexPHP(PHPFile):
A templates/OpenSearch.j2.php

@@ -0,0 +1,66 @@

+<?php + +$db = new SQLite3('./search.sqlite', SQLITE3_OPEN_READONLY); +$q = str_replace('-', '+', $_GET['q']); +$sql = $db->prepare(" + SELECT + url, category, title, snippet(data, '', '', '[...]', 5, 24), mtime + FROM + data + WHERE + data MATCH :q + ORDER BY + category +"); +$sql->bindValue(':q', $q); +$query = $sql->execute(); +$results = array(); +if($query) { + while ($row = $query->fetchArray(SQLITE3_ASSOC)) { + array_push($results, $row); + } +} + +foreach ($results as $row) { + $item_node = $channel_node->appendChild($xml->createElement("item")); + $title_node = $item_node->appendChild($xml->createElement("title", $row['title'])); + $link_node = $item_node->appendChild($xml->createElement("link", $row['url'])); + $guid_link = $xml->createElement("guid", $row['url']); + $guid_link->setAttribute("isPermaLink","true"); + $guid_node = $item_node->appendChild($guid_link); + $description_node = $item_node->appendChild($xml->createElement("description")); + $description_contents = $xml->createCDATASection(htmlentities($row["snippet(data, '', '', '[...]', 5, 24)"])); + $description_node->appendChild($description_contents); + $date_rfc = gmdate(DATE_RFC2822, $row['mtime']); + $pub_date = $xml->createElement("pubDate", $date_rfc); + $pub_date_node = $item_node->appendChild($pub_date); +} + +header('Content-Type: text/xml; charset=utf-8', true); + +$xml = new DOMDocument("1.0", "UTF-8"); +$xml->preserveWhiteSpace = false; +$xml->formatOutput = true; + +$rss = $xml->createElement("rss"); +$rss_node = $xml->appendChild($rss); +$rss_node->setAttribute("version","2.0"); + + +$rss_node->setAttribute("xmlns:dc","http://a9.com/-/spec/opensearch/1.1/"); + +$channel = $xml->createElement("channel"); +$channel_node = $rss_node->appendChild($channel); + +$channel_node->appendChild($xml->createElement("title", "Search results for: {$_GET['q']}")); +$channel_node->appendChild($xml->createElement("link", "{{ site.url }}")); +$channel_node->appendChild($xml->createElement("description", "Search {{ site.name }} for {$_GET['q']}")); + +$channel_node->appendChild($xml->createElement("openSearch:totalResults", sizeof($results))); +$channel_node->appendChild($xml->createElement("openSearch:startIndex", 1)); +$channel_node->appendChild($xml->createElement("openSearch:itemsPerPage", sizeof($results))); + +$build_date = gmdate(DATE_RFC2822, time()); +$channel_node->appendChild($xml->createElement("lastBuildDate", $build_date)); + +echo $xml->saveXML();
A templates/OpenSearch.j2.xml

@@ -0,0 +1,9 @@

+<?xml version="1.0" encoding="UTF-8" ?> +<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> + <ShortName>{{ site.name }}</ShortName> + <Description>Search {{ site.name }}</Description> + <Url type="application/rss+xml" rel="results" method="get" template="{{ site.url }}/opensearch.php?q={searchTerms}" /> + <Url type="text/html" rel="results" method="get" template="{{ site.url }}/search.php?q={searchTerms}" /> + <Image>{{ site.image }}</Image> + <InputEncoding>UTF-8</InputEncoding> +</OpenSearchDescription>
M templates/base.j2.htmltemplates/base.j2.html

@@ -23,6 +23,7 @@ </style>

<style media="print"> {% include('style-print.css') %} </style> + <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="{{ site.name }}"> </head> <body>