예제 #1
0
    def fill_site(self):
        import datetime
        from nikola.utils import current_time
        self.init_command.copy_sample_site(self.target_dir)
        self.init_command.create_configuration(self.target_dir)

        # Change COMMENT_SYSTEM_ID to not wait for 5 seconds
        with io.open(os.path.join(self.target_dir, 'conf.py'),
                     "a+",
                     encoding="utf8") as outf:
            outf.write('\nCOMMENT_SYSTEM_ID = "nikolatest"\n')

        with io.open(os.path.join(self.target_dir, 'posts', 'empty1.txt'),
                     "w+",
                     encoding="utf8") as outf:
            outf.write(".. title: foo\n"
                       ".. slug: foo\n"
                       ".. date: %s\n" %
                       (current_time() +
                        datetime.timedelta(-1)).strftime('%Y-%m-%d %H:%M:%S'))

        with io.open(os.path.join(self.target_dir, 'posts', 'empty2.txt'),
                     "w+",
                     encoding="utf8") as outf:
            outf.write(".. title: bar\n"
                       ".. slug: bar\n"
                       ".. date: %s\n" %
                       (current_time() +
                        datetime.timedelta(1)).strftime('%Y-%m-%d %H:%M:%S'))
예제 #2
0
def build(target_dir):
    """Build the site."""
    init_command = nikola.plugins.command.init.CommandInit()
    init_command.create_empty_site(target_dir)
    init_command.create_configuration(target_dir)

    # Change COMMENT_SYSTEM_ID to not wait for 5 seconds
    append_config(target_dir, '\nCOMMENT_SYSTEM_ID = "nikolatest"\n')

    def format_datetime(datetime):
        return datetime.strftime("%Y-%m-%d %H:%M:%S")

    past_datetime = format_datetime(current_time() + timedelta(days=-1))
    with io.open(os.path.join(target_dir, "posts", "empty1.txt"),
                 "w+",
                 encoding="utf8") as past_post:
        past_post.write("""\
.. title: foo
.. slug: foo
.. date: %s
""" % past_datetime)

    future_datetime = format_datetime(current_time() + timedelta(days=1))
    with io.open(os.path.join(target_dir, "posts", "empty2.txt"),
                 "w+",
                 encoding="utf8") as future_post:
        future_post.write("""\
.. title: bar
.. slug: bar
.. date: %s
""" % future_datetime)

    with cd(target_dir):
        __main__.main(["build"])
예제 #3
0
    def fill_site(self):
        import datetime
        from nikola.utils import current_time
        self.init_command.copy_sample_site(self.target_dir)
        self.init_command.create_configuration(self.target_dir)

        # Change COMMENT_SYSTEM_ID to not wait for 5 seconds
        with io.open(os.path.join(self.target_dir, 'conf.py'), "a+", encoding="utf8") as outf:
            outf.write('\nCOMMENT_SYSTEM_ID = "nikolatest"\n')

        with io.open(os.path.join(self.target_dir, 'posts', 'empty1.txt'), "w+", encoding="utf8") as outf:
            outf.write(".. title: foo\n" ".. slug: foo\n" ".. date: %s\n" % (
                current_time() + datetime.timedelta(-1)).strftime('%Y-%m-%d %H:%M:%S'))

        with io.open(os.path.join(self.target_dir, 'posts', 'empty2.txt'), "w+", encoding="utf8") as outf:
            outf.write(".. title: bar\n" ".. slug: bar\n" ".. date: %s\n" % (
                current_time() + datetime.timedelta(1)).strftime('%Y-%m-%d %H:%M:%S'))
예제 #4
0
    def fill_site(self):
        import datetime
        from nikola.utils import current_time
        self.init_command.copy_sample_site(self.target_dir)
        self.init_command.create_configuration(self.target_dir)
        with codecs.open(os.path.join(self.target_dir, 'posts', 'empty1.txt'), "wb+", "utf8") as outf:
            outf.write(
                ".. title: foo\n"
                ".. slug: foo\n"
                ".. date: %s\n" % (current_time() + datetime.timedelta(-1)).strftime('%Y/%m/%d %T')
            )

        with codecs.open(os.path.join(self.target_dir, 'posts', 'empty2.txt'), "wb+", "utf8") as outf:
            outf.write(
                ".. title: bar\n"
                ".. slug: bar\n"
                ".. date: %s\n" % (current_time() + datetime.timedelta(1)).strftime('%Y/%m/%d %T')
            )
예제 #5
0
    def fill_site(self):
        import datetime
        from nikola.utils import current_time
        self.init_command.copy_sample_site(self.target_dir)
        self.init_command.create_configuration(self.target_dir)
        with codecs.open(os.path.join(self.target_dir, 'posts', 'empty1.txt'),
                         "wb+", "utf8") as outf:
            outf.write(".. title: foo\n"
                       ".. slug: foo\n"
                       ".. date: %s\n" %
                       (current_time() +
                        datetime.timedelta(-1)).strftime('%Y/%m/%d %T'))

        with codecs.open(os.path.join(self.target_dir, 'posts', 'empty2.txt'),
                         "wb+", "utf8") as outf:
            outf.write(".. title: bar\n"
                       ".. slug: bar\n"
                       ".. date: %s\n" %
                       (current_time() +
                        datetime.timedelta(1)).strftime('%Y/%m/%d %T'))
예제 #6
0
    def fill_site(self):
        import datetime
        from nikola.utils import current_time

        self.init_command.copy_sample_site(self.target_dir)
        self.init_command.create_configuration(self.target_dir)

        # Change COMMENT_SYSTEM_ID to not wait for 5 seconds
        with codecs.open(os.path.join(self.target_dir, "conf.py"), "ab+", "utf8") as outf:
            outf.write('\nCOMMENT_SYSTEM_ID = "nikolatest"\n')

        with codecs.open(os.path.join(self.target_dir, "posts", "empty1.txt"), "wb+", "utf8") as outf:
            outf.write(
                ".. title: foo\n"
                ".. slug: foo\n"
                ".. date: %s\n" % (current_time() + datetime.timedelta(-1)).strftime("%Y/%m/%d %T")
            )

        with codecs.open(os.path.join(self.target_dir, "posts", "empty2.txt"), "wb+", "utf8") as outf:
            outf.write(
                ".. title: bar\n"
                ".. slug: bar\n"
                ".. date: %s\n" % (current_time() + datetime.timedelta(1)).strftime("%Y/%m/%d %T")
            )
예제 #7
0
    def handler(self, start=None, stop=None, reverse=False, tags=None, require_all_tags=False, categories=None,
                sections=None, slugs=None, post_type='post', type=False,
                lang=None, template='post_list_directive.tmpl', sort=None,
                id=None, data=None, state=None, site=None, date=None, filename=None, post=None):
        """Generate HTML for post-list."""
        if lang is None:
            lang = utils.LocaleBorg().current_lang
        if site.invariant:  # for testing purposes
            post_list_id = id or 'post_list_' + 'fixedvaluethatisnotauuid'
        else:
            post_list_id = id or 'post_list_' + uuid.uuid4().hex

        # Get post from filename if available
        if filename:
            self_post = site.post_per_input_file.get(filename)
        else:
            self_post = None

        if self_post:
            self_post.register_depfile("####MAGIC####TIMELINE", lang=lang)

        # If we get strings for start/stop, make them integers
        if start is not None:
            start = int(start)
        if stop is not None:
            stop = int(stop)

        # Parse tags/categories/sections/slugs (input is strings)
        categories = [c.strip().lower() for c in categories.split(',')] if categories else []
        sections = [s.strip().lower() for s in sections.split(',')] if sections else []
        slugs = [s.strip() for s in slugs.split(',')] if slugs else []

        filtered_timeline = []
        posts = []
        step = None if reverse is False else -1

        if type is not False:
            post_type = type

        if post_type == 'page' or post_type == 'pages':
            timeline = [p for p in site.timeline if not p.use_in_feeds]
        elif post_type == 'all':
            timeline = [p for p in site.timeline]
        else:  # post
            timeline = [p for p in site.timeline if p.use_in_feeds]

        # self_post should be removed from timeline because this is redundant
        timeline = [p for p in timeline if p.source_path != filename]

        if categories:
            timeline = [p for p in timeline if p.meta('category', lang=lang).lower() in categories]

        if sections:
            timeline = [p for p in timeline if p.section_name(lang).lower() in sections]

        if tags:
            tags = {t.strip().lower() for t in tags.split(',')}
            if require_all_tags:
                compare = set.issubset
            else:
                compare = operator.and_
            for post in timeline:
                post_tags = {t.lower() for t in post.tags}
                if compare(tags, post_tags):
                    filtered_timeline.append(post)
        else:
            filtered_timeline = timeline

        if sort:
            filtered_timeline = natsort.natsorted(filtered_timeline, key=lambda post: post.meta[lang][sort], alg=natsort.ns.F | natsort.ns.IC)

        if date:
            _now = utils.current_time()
            filtered_timeline = [p for p in filtered_timeline if date_in_range(utils.html_unescape(date), p.date, now=_now)]

        for post in filtered_timeline[start:stop:step]:
            if slugs:
                cont = True
                for slug in slugs:
                    if slug == post.meta('slug'):
                        cont = False

                if cont:
                    continue

            bp = post.translated_base_path(lang)
            if os.path.exists(bp) and state:
                state.document.settings.record_dependencies.add(bp)
            elif os.path.exists(bp) and self_post:
                self_post.register_depfile(bp, lang=lang)

            posts += [post]

        if not posts:
            return '', []

        template_deps = site.template_system.template_deps(template)
        if state:
            # Register template as a dependency (Issue #2391)
            for d in template_deps:
                state.document.settings.record_dependencies.add(d)
        elif self_post:
            for d in template_deps:
                self_post.register_depfile(d, lang=lang)

        template_data = {
            'lang': lang,
            'posts': posts,
            # Need to provide str, not TranslatableSetting (Issue #2104)
            'date_format': site.GLOBAL_CONTEXT.get('date_format')[lang],
            'post_list_id': post_list_id,
            'messages': site.MESSAGES,
            '_link': site.link,
        }
        output = site.template_system.render_template(
            template, None, template_data)
        return output, template_deps
예제 #8
0
def _do_post_list(start=None, stop=None, reverse=False, tags=None, require_all_tags=False, categories=None,
                  sections=None, slugs=None, post_type='post', type=False,
                  lang=None, template='post_list_directive.tmpl', sort=None,
                  id=None, data=None, state=None, site=None, date=None, filename=None, post=None):
    if lang is None:
        lang = utils.LocaleBorg().current_lang
    if site.invariant:  # for testing purposes
        post_list_id = id or 'post_list_' + 'fixedvaluethatisnotauuid'
    else:
        post_list_id = id or 'post_list_' + uuid.uuid4().hex

    # Get post from filename if available
    if filename:
        self_post = site.post_per_input_file.get(filename)
    else:
        self_post = None

    if self_post:
        self_post.register_depfile("####MAGIC####TIMELINE", lang=lang)

    # If we get strings for start/stop, make them integers
    if start is not None:
        start = int(start)
    if stop is not None:
        stop = int(stop)

    # Parse tags/categories/sections/slugs (input is strings)
    categories = [c.strip().lower() for c in categories.split(',')] if categories else []
    sections = [s.strip().lower() for s in sections.split(',')] if sections else []
    slugs = [s.strip() for s in slugs.split(',')] if slugs else []

    filtered_timeline = []
    posts = []
    step = -1 if reverse is None else None

    if type is not False:
        post_type = type

    if post_type == 'page' or post_type == 'pages':
        timeline = [p for p in site.timeline if not p.use_in_feeds]
    elif post_type == 'all':
        timeline = [p for p in site.timeline]
    else:  # post
        timeline = [p for p in site.timeline if p.use_in_feeds]

    # self_post should be removed from timeline because this is redundant
    timeline = [p for p in timeline if p.source_path != filename]

    if categories:
        timeline = [p for p in timeline if p.meta('category', lang=lang).lower() in categories]

    if sections:
        timeline = [p for p in timeline if p.section_name(lang).lower() in sections]

    if tags:
        tags = {t.strip().lower() for t in tags.split(',')}
        if require_all_tags:
            compare = set.issubset
        else:
            compare = operator.and_
        for post in timeline:
            post_tags = {t.lower() for t in post.tags}
            if compare(tags, post_tags):
                filtered_timeline.append(post)
    else:
        filtered_timeline = timeline

    if sort:
        filtered_timeline = natsort.natsorted(filtered_timeline, key=lambda post: post.meta[lang][sort], alg=natsort.ns.F | natsort.ns.IC)

    if date:
        _now = utils.current_time()
        filtered_timeline = [p for p in filtered_timeline if date_in_range(utils.html_unescape(date), p.date, now=_now)]

    for post in filtered_timeline[start:stop:step]:
        if slugs:
            cont = True
            for slug in slugs:
                if slug == post.meta('slug'):
                    cont = False

            if cont:
                continue

        bp = post.translated_base_path(lang)
        if os.path.exists(bp) and state:
            state.document.settings.record_dependencies.add(bp)
        elif os.path.exists(bp) and self_post:
            self_post.register_depfile(bp, lang=lang)

        posts += [post]

    if not posts:
        return '', []

    template_deps = site.template_system.template_deps(template)
    if state:
        # Register template as a dependency (Issue #2391)
        for d in template_deps:
            state.document.settings.record_dependencies.add(d)
    elif self_post:
        for d in template_deps:
            self_post.register_depfile(d, lang=lang)

    template_data = {
        'lang': lang,
        'posts': posts,
        # Need to provide str, not TranslatableSetting (Issue #2104)
        'date_format': site.GLOBAL_CONTEXT.get('date_format')[lang],
        'post_list_id': post_list_id,
        'messages': site.MESSAGES,
        '_link': site.link,
    }
    output = site.template_system.render_template(
        template, None, template_data)
    return output, template_deps