# -*- 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 . """ 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', 'No result found') 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')