diff options
| author | 2013-02-13 18:35:39 -0300 | |
|---|---|---|
| committer | 2013-02-13 18:35:39 -0300 | |
| commit | a40930043121a4b60de8526d58417761a54ab718 (patch) | |
| tree | 383c5cf8e320761ee942619282fe51be625179a7 /nikola/post.py | |
| parent | 9c5708cc92af894e414bc76ee35ec2230de5d288 (diff) | |
Imported Upstream version 5.2upstream/5.2
Diffstat (limited to 'nikola/post.py')
| -rw-r--r-- | nikola/post.py | 55 |
1 files changed, 36 insertions, 19 deletions
diff --git a/nikola/post.py b/nikola/post.py index d5b98f6..809e5b7 100644 --- a/nikola/post.py +++ b/nikola/post.py @@ -9,11 +9,11 @@ # distribute, sublicense, and/or sell copies of the # Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: -# +# # The above copyright notice and this permission notice # shall be included in all copies or substantial portions of # the Software. -# +# # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR @@ -23,6 +23,8 @@ # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +from __future__ import unicode_literals, print_function + import codecs import os @@ -38,16 +40,15 @@ class Post(object): """Represents a blog post or web page.""" def __init__(self, source_path, cache_folder, destination, use_in_feeds, - translations, default_lang, blog_url, messages): + translations, default_lang, blog_url, messages, template_name, + file_metadata_regexp=None): """Initialize post. The base path is the .txt post file. From it we calculate the meta file, as well as any translations available, and the .html fragment file path. - - `compile_html` is a function that knows how to compile this Post to - html. """ + self.translated_to = set([default_lang]) self.prev_post = None self.next_post = None self.blog_url = blog_url @@ -61,21 +62,23 @@ class Post(object): self.translations = translations self.default_lang = default_lang self.messages = messages + self.template_name = template_name if os.path.isfile(self.metadata_path): with codecs.open(self.metadata_path, "r", "utf8") as meta_file: meta_data = meta_file.readlines() while len(meta_data) < 6: meta_data.append("") (default_title, default_pagename, self.date, self.tags, - self.link, default_description) = \ - [x.strip() for x in meta_data][:6] + self.link, default_description) = [x.strip() for x in + meta_data][:6] else: (default_title, default_pagename, self.date, self.tags, - self.link, default_description) = \ - utils.get_meta(self.source_path) + self.link, default_description) = utils.get_meta( + self.source_path, file_metadata_regexp) if not default_title or not default_pagename or not self.date: - raise OSError("You must set a title and slug and date!") + raise OSError("You must set a title and slug and date! [%s]" % + source_path) self.date = utils.to_datetime(self.date) self.tags = [x.strip() for x in self.tags.split(',')] @@ -99,12 +102,14 @@ class Post(object): else: metadata_path = self.metadata_path + "." + lang source_path = self.source_path + "." + lang + if os.path.isfile(source_path): + self.translated_to.add(lang) try: if os.path.isfile(metadata_path): with codecs.open( metadata_path, "r", "utf8") as meta_file: meta_data = [x.strip() for x in - meta_file.readlines()] + meta_file.readlines()] while len(meta_data) < 6: meta_data.append("") self.titles[lang] = meta_data[0] or default_title @@ -114,7 +119,7 @@ class Post(object): default_description else: ttitle, ppagename, tmp1, tmp2, tmp3, ddescription = \ - utils.get_meta(source_path) + utils.get_meta(source_path, file_metadata_regexp) self.titles[lang] = ttitle or default_title self.pagenames[lang] = ppagename or default_pagename self.descriptions[lang] = ddescription or\ @@ -146,17 +151,28 @@ class Post(object): if os.path.isfile(self.metadata_path): deps.append(self.metadata_path) if lang != self.default_lang: - lang_deps = list(filter(os.path.exists, [x + "." + lang for x in deps])) + lang_deps = list(filter(os.path.exists, [x + "." + lang for x in + deps])) deps += lang_deps return deps - def text(self, lang, teaser_only=False): - """Read the post file for that language and return its contents""" + def is_translation_available(self, lang): + """Return true if the translation actually exists.""" + return lang in self.translated_to + + def _translated_file_path(self, lang): + """Return path to the translation's file, or to the original.""" file_name = self.base_path if lang != self.default_lang: file_name_lang = file_name + ".%s" % lang if os.path.exists(file_name_lang): file_name = file_name_lang + return file_name + + def text(self, lang, teaser_only=False): + """Read the post file for that language and return its contents""" + file_name = self._translated_file_path(lang) + with codecs.open(file_name, "r", "utf8") as post_file: data = post_file.read() @@ -167,20 +183,21 @@ class Post(object): teaser = [] flag = False for elem in e: - elem_string = lxml.html.tostring(elem) + elem_string = lxml.html.tostring(elem).decode('utf8') if '<!-- TEASER_END -->' in elem_string.upper(): flag = True break teaser.append(elem_string) if flag: teaser.append('<p><a href="%s">%s...</a></p>' % - (self.permalink(lang), self.messages[lang]["Read more"])) + (self.permalink(lang), + self.messages[lang]["Read more"])) data = ''.join(teaser) return data def destination_path(self, lang, extension='.html'): path = os.path.join(self.translations[lang], - self.folder, self.pagenames[lang] + extension) + self.folder, self.pagenames[lang] + extension) return path def permalink(self, lang=None, absolute=False, extension='.html'): |
