adding opensearch (xml description j2 template, RSS+XML search results PHP)
This commit is contained in:
parent
32bf4994e7
commit
e18582840e
4 changed files with 92 additions and 18 deletions
34
nasg.py
34
nasg.py
|
@ -326,6 +326,7 @@ class MarkdownDoc(object):
|
|||
|
||||
@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 @@ class Singular(MarkdownDoc):
|
|||
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 @@ class Search(PHPFile):
|
|||
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 @@ class Search(PHPFile):
|
|||
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):
|
||||
|
|
66
templates/OpenSearch.j2.php
Normal file
66
templates/OpenSearch.j2.php
Normal file
|
@ -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();
|
9
templates/OpenSearch.j2.xml
Normal file
9
templates/OpenSearch.j2.xml
Normal file
|
@ -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>
|
|
@ -23,6 +23,7 @@
|
|||
<style media="print">
|
||||
{% include('style-print.css') %}
|
||||
</style>
|
||||
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="{{ site.name }}">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
|
Loading…
Reference in a new issue