summaryrefslogtreecommitdiffstats
path: root/nikola/post.py
diff options
context:
space:
mode:
Diffstat (limited to 'nikola/post.py')
-rw-r--r--nikola/post.py55
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'):