aboutsummaryrefslogtreecommitdiffstats
path: root/nikola/plugins/task_render_posts.py
diff options
context:
space:
mode:
authorLibravatarAgustin Henze <tin@sluc.org.ar>2013-05-30 17:41:32 -0300
committerLibravatarAgustin Henze <tin@sluc.org.ar>2013-05-30 17:41:32 -0300
commit47320d60c110fe6058937f996da750caf669d7ed (patch)
tree73288c7b833daa42ac200025ed41c940cc8a76f9 /nikola/plugins/task_render_posts.py
parent432fee57865e02af455e877a9597ef730397146c (diff)
parentf794eee787e9cde54e6b8f53e45d69c9ddc9936a (diff)
Merge tag 'upstream/5.4.4'
Upstream version 5.4.4
Diffstat (limited to 'nikola/plugins/task_render_posts.py')
-rw-r--r--nikola/plugins/task_render_posts.py84
1 files changed, 74 insertions, 10 deletions
diff --git a/nikola/plugins/task_render_posts.py b/nikola/plugins/task_render_posts.py
index a4d5578..4be68bf 100644
--- a/nikola/plugins/task_render_posts.py
+++ b/nikola/plugins/task_render_posts.py
@@ -23,10 +23,20 @@
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from copy import copy
-import os
+import codecs
+import string
from nikola.plugin_categories import Task
-from nikola import utils
+from nikola import utils, rc4
+
+
+def wrap_encrypt(path, password):
+ """Wrap a post with encryption."""
+ with codecs.open(path, 'rb+', 'utf8') as inf:
+ data = inf.read() + "<!--tail-->"
+ data = CRYPT.substitute(data=rc4.rc4(password, data))
+ with codecs.open(path, 'wb+', 'utf8') as outf:
+ outf.write(data)
class RenderPosts(Task):
@@ -41,25 +51,26 @@ class RenderPosts(Task):
"translations": self.site.config["TRANSLATIONS"],
"timeline": self.site.timeline,
"default_lang": self.site.config["DEFAULT_LANG"],
+ "hide_untranslated_posts": self.site.config['HIDE_UNTRANSLATED_POSTS'],
}
flag = False
for lang in kw["translations"]:
- # TODO: timeline is global, get rid of it
deps_dict = copy(kw)
deps_dict.pop('timeline')
for post in kw['timeline']:
source = post.source_path
dest = post.base_path
- if lang != kw["default_lang"]:
- dest += '.' + lang
- source_lang = source + '.' + lang
- if os.path.exists(source_lang):
- source = source_lang
+ if not post.is_translation_available(lang) and kw["hide_untranslated_posts"]:
+ continue
+ else:
+ source = post.translated_source_path(lang)
+ if lang != post.default_lang:
+ dest = dest + '.' + lang
flag = True
- yield {
+ task = {
'basename': self.name,
- 'name': dest.encode('utf-8'),
+ 'name': dest,
'file_dep': post.fragment_deps(lang),
'targets': [dest],
'actions': [(self.site.get_compiler(post.source_path),
@@ -67,6 +78,9 @@ class RenderPosts(Task):
'clean': True,
'uptodate': [utils.config_changed(deps_dict)],
}
+ if post.meta('password'):
+ task['actions'].append((wrap_encrypt, (dest, post.meta('password'))))
+ yield task
if flag is False: # Return a dummy task
yield {
'basename': self.name,
@@ -74,3 +88,53 @@ class RenderPosts(Task):
'uptodate': [True],
'actions': [],
}
+
+
+CRYPT = string.Template("""\
+<script>
+function rc4(key, str) {
+ var s = [], j = 0, x, res = '';
+ for (var i = 0; i < 256; i++) {
+ s[i] = i;
+ }
+ for (i = 0; i < 256; i++) {
+ j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;
+ x = s[i];
+ s[i] = s[j];
+ s[j] = x;
+ }
+ i = 0;
+ j = 0;
+ for (var y = 0; y < str.length; y++) {
+ i = (i + 1) % 256;
+ j = (j + s[i]) % 256;
+ x = s[i];
+ s[i] = s[j];
+ s[j] = x;
+ res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);
+ }
+ return res;
+}
+function decrypt() {
+ key = $$("#key").val();
+ crypt_div = $$("#encr")
+ crypted = crypt_div.html();
+ decrypted = rc4(key, window.atob(crypted));
+ if (decrypted.substr(decrypted.length - 11) == "<!--tail-->"){
+ crypt_div.html(decrypted);
+ $$("#pwform").hide();
+ crypt_div.show();
+ } else { alert("Wrong password"); };
+}
+</script>
+
+<div id="encr" style="display: none;">${data}</div>
+<div id="pwform">
+<form onsubmit="javascript:decrypt(); return false;" class="form-inline">
+<fieldset>
+<legend>This post is password-protected.</legend>
+<input type="password" id="key" placeholder="Type password here">
+<button type="submit" class="btn">Show Content</button>
+</fieldset>
+</form>
+</div>""")