Dynastie/dynastie/generators/search.py

76 lines
2.5 KiB
Python
Executable File

# -*- coding: utf-8 -*-
"""
Copyright 2012-2014 Grégory Soutadé
This file is part of Dynastie.
Dynastie is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Dynastie is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
"""
import os
from xml.dom.minidom import parse, parseString
from dynastie.generators.generator import DynastieGenerator, StrictUTF8Writer
from dynastie.generators.index import Index
from django.db import models
class Search(Index):
def createNoResultFound(self, posts, dom, root, node):
posts_elem = self.createElement(dom, 'posts', '<b>No result found</b>')
root.replaceChild(posts_elem, node)
return posts_elem
def generate(self, blog, src, output, post_list):
from dynastie.models import Post, Blog
self.blog = blog
if not os.path.exists(src + '/_search.html'):
self.addError('No _search.html found, exiting')
return self.report
try:
dom = parse(src + '/_search.html')
except xml.dom.DOMException as e:
self.addError('Error parsing _search.html : ' + e)
return self.report
post_nodes = dom.getElementsByTagNameNS(self.URI, "posts")
if post_nodes:
if post_nodes[0].hasAttribute("limit"):
self.posts_per_page = int(post_nodes[0].getAttribute("limit"))
else:
self.posts_per_page = 25
else:
self.addError('No tag dyn:posts found')
if len(post_list) == 0:
self.hooks['posts'] = self.createNoResultFound
posts = []
for post_id in post_list:
try:
post = Post.objects.get(pk=post_id)
except:
continue
if post:
posts.append(post)
nodes = dom.getElementsByTagName("*")
nodes[0] = self.parse(src, self.hooks, posts, dom, nodes[0])
writer = StrictUTF8Writer()
nodes[0].writexml(writer)
return writer.getvalue().decode('utf-8')