opensearch merge with search, because it makes more sense
Peter Molnar hello@petermolnar.eu
Wed, 22 May 2019 13:17:22 +0100
4 files changed,
102 insertions(+),
86 deletions(-)
D
templates/OpenSearch.j2.php
@@ -1,66 +0,0 @@
-<?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();
M
templates/Search.j2.php
→
templates/Search.j2.php
@@ -1,8 +1,7 @@
-{% extends "base.j2.html" %} -{% block lang %}{% endblock %} -{% block title %}Search results for: <?php echo($_GET['q']); ?>{% endblock %} -{% block content %} <?php + +const baseurl = '{{ site.url }}'; + function relurl($from, $to) { $from = explode('/', $from); $to = explode('/', $to);@@ -24,34 +23,114 @@ $i++;
} return substr($relpath, 0, -1); } -?> -<?php const baseurl = '{{ site.url }}'; ?> -<main> - <header> - <h1>Search results for: <?php echo($_GET['q']); ?></h1> - </header> -<?php + +if(isset($_GET['q'])) { + $q = $_GET['q']; +} +elseif(isset($_GET['search'])) { + $q = $_GET['search']; +} +else { + $q = ''; +} + $db = new SQLite3('./search.sqlite', SQLITE3_OPEN_READONLY); -$q = str_replace('-', '+', $_GET['q']); +$q = str_replace('-', '+', $q); $sql = $db->prepare(" SELECT - url, category, title, snippet(data, '', '', '[...]', 5, 24) + url, category, title, snippet(data, '', '', '[...]', 5, 24), mtime FROM data WHERE data MATCH :q ORDER BY - category + category, mtime "); $sql->bindValue(':q', $q); -$results = $sql->execute(); +$query = $sql->execute(); +$results = array(); +if($query) { + while ($row = $query->fetchArray(SQLITE3_ASSOC)) { + $item = array( + "id" => $row['url'], + "title" => $row['title'], + "url" => $row['url'], + "description" => $row["snippet(data, '', '', '[...]', 5, 24)"], + "pubDate" => gmdate(DATE_RFC2822, $row['mtime']), + ); + array_push($results, $item); + } +} + +if (isset($_GET['xml'])) { + 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))); -printf("<dl>"); -while ($row = $results->fetchArray(SQLITE3_ASSOC)) { - printf('<dt><a href="%s">%s</a></dt><dd>%s</dd>', relurl(baseurl, $row['url']), $row['title'], $row["snippet(data, '', '', '[...]', 5, 24)"]); + $build_date = gmdate(DATE_RFC2822, time()); + $channel_node->appendChild($xml->createElement("lastBuildDate", $build_date)); + 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","false"); + $guid_node = $item_node->appendChild($guid_link); + $description_node = $item_node->appendChild($xml->createElement("description")); + $description_contents = $xml->createCDATASection(htmlentities($row["description"])); + $description_node->appendChild($description_contents); + $pub_date = $xml->createElement("pubDate", $row['pubDate']); + $pub_date_node = $item_node->appendChild($pub_date); + } + + echo $xml->saveXML(); + exit(0); } -printf("</dl>"); + +if (isset($_GET['json'])) { + // WordPress JSON + header('Content-Type: application/json; charset=utf-8', true); + echo(json_encode($results)); + exit(0); +} + +?> + +{% extends "base.j2.html" %} +{% block lang %}{% endblock %} +{% block title %}Search results for: <?php echo($_GET['q']); ?>{% endblock %} +{% block content %} + +<main> + <header> + <h1>Search results for: <?php echo($_GET['q']); ?></h1> + </header> + <dl> +<?php + foreach($results as $row) { + printf('<dt><a href="%s">%s</a></dt><dd>%s</dd>', relurl(baseurl, $row['url']), $row['title'], $row["description"]); + } ?> + </dl> </main> {% endblock %}
M
templates/base.j2.html
→
templates/base.j2.html
@@ -20,6 +20,9 @@ </style>
<style id="css_alt" media="speech"> {% include('style-alt.css') %} </style> + <style id="css_surprise" media="speech"> + {% include('style-konami.css') %} + </style> <style media="print"> {% include('style-print.css') %} </style>