示例#1
0
def real_generate(filepath):
    try:
        info("Parsing '%s'..." % filepath)
        return pagegen.generate(filepath, not update_all)
    except Exception as e:
        error("Failed to generate %s." % filepath)
        error("%s" % str(e))
        debug("Python traceback:\n" + "".join(traceback.format_tb(e.__traceback__)))
示例#2
0
def add_module(module,init=True):
    if modules.get(module):
        raise ModuleAlreadyLoaded, "%s has already been loaded."%module
    try:
        modules[module] = __import__(module,globals(),locals(),[],-1)
    except ImportError, e:
        logging.error("Error loading %s: %s" % (module, traceback.format_exc()))
        return
示例#3
0
def real_generate(filepath):
    try:
        info("Parsing '%s'..." % filepath)
        return pagegen.generate(filepath, not update_all)
    except Exception as e:
        error("Failed to generate %s." % filepath)
        error("%s" % str(e))
        debug("Python traceback:\n" +
              "".join(traceback.format_tb(e.__traceback__)))
示例#4
0
 def run(self):
     try:
         for module in hooks[self.hook].keys():
             try:
                 hooks[self.hook][module](*self.args, **self.kwds)
             except Exception, message:
                logging.error("Error calling hook %s on %s: %s" % (self.hook, module, traceback.format_exc()))
     except RuntimeError, message:
         logging.warn("Aborted hook %s due to looping failure: %s" % (self.hook, message))
示例#5
0
def process_document(filepath, source, do_modtime_check=True):
    # 解析 Markdown 文本
    parser = markdown.Markdown(extensions=MARKDOWN_EXTENSIONS,
                               extension_configs=MARKDOWN_CONFIG)
    content, temp = preproc.process(source)
    if temp:
        warn("This is a temporary post. Skipped.")
        return True
    content = parser.convert(content.replace(chr(8203),
                                             ""))  # Remove non-width spaces

    # 准备 meta 数据
    try:
        meta = parser.Meta
        if len(meta) == 0:
            raise AttributeError
    except AttributeError:
        warn("No metadata. Skipped.")
        return True
    mdinfo = {}
    for key, val in METAINFO_DEFAULTS.items():
        if val is None and key not in meta:
            error("Missing metainfo '%s'. Stopped." % key)
            return False
        if key not in meta:
            mdinfo[key] = val
        elif type(val) == bool:
            mdinfo[key] = meta[key][0] in ["true", "True", True]
        elif type(val) == list:
            mdinfo[key] = meta[key]
        else:
            mdinfo[key] = meta[key][0]
        # if key in meta:
        #     debug(f'{key}: [{repr(type(meta[key]))}]{repr(meta[key])} → [{repr(type(mdinfo[key]))}]{repr(mdinfo[key])}')
        # else:
        #     debug(f'{key}: [{repr(type(val))}]{repr(val)} → [{repr(type(mdinfo[key]))}]{repr(mdinfo[key])}')

    # 准备页面模板参数
    toc, content = cut_toc(content)
    title = mdinfo["title"]
    create_time = generate_time(*mdinfo["create"].split("."))
    modified_time = generate_time(*mdinfo["modified"].split("."))
    if do_modtime_check and modified_time != generate_date(
            datetime.datetime.now()):
        warn("Modified time is not updated to today. (%s)" % filepath)
    tags = TagGroup()
    for x in mdinfo["tags"]:
        tags.append(x)
    folder = os.path.abspath(
        os.path.join(os.path.dirname(filepath), mdinfo["location"]))
    new_file = os.path.join(
        folder,
        os.path.splitext(os.path.basename(filepath))[0] + ".html")
    navigater.handle("myself", new_file)
    navigater.handle("md_url", filepath)
    navigater.home_folder = os.path.abspath(".")
    index_title = escape_string(title)
    index_text = escape_string(bs4.BeautifulSoup(content, "html5lib").text)
    index_url = navigater.get_path("myself")
    filename = os.path.basename(filepath)
    words = len(index_text)
    pagetitle = mdinfo["title"].strip().replace("\"", " ")
    pagekey = hashlib.md5(pagetitle.encode("utf8")).hexdigest()
    pageurl = SITE_DOMAIN + os.path.relpath(
        os.path.abspath(filepath), start=os.path.abspath("."))[:-3] + ".html"

    # 写入文件
    template_file = os.path.join(TEMPLATES_FOLDER,
                                 "%s.html" % mdinfo["template"])
    with open(template_file) as reader:
        template = reader.read()
    os.makedirs(folder, exist_ok=True)
    with open(new_file, "w") as writer:
        html_dom = template.format(
            title=title,
            create=create_time,
            modified=modified_time,
            stat=STAT_TEMPLATE.format(word=words,
                                      time=convert_time(words //
                                                        WORDS_PER_MINUTE)),
            tags=str(tags),
            toc=toc,
            content=content,
            page_key=pagekey,
            page_title=pagetitle,
            page_url=pageurl,
            mdname=filename,
            github_location=os.path.join(GITHUB_LOCATION,
                                         navigater.get_path("md_url")))
        if html_minify:
            writer.write(html_minify(html_dom))
        else:
            writer.write(html_dom)

    # 返回索引信息
    if mdinfo["index"]:
        return (index_title, index_url, index_text, mdinfo)
    return index_title
示例#6
0
def process_document(filepath, source, do_modtime_check=True):
    # 解析 Markdown 文本
    parser = markdown.Markdown(
        extensions=MARKDOWN_EXTENSIONS,
        extension_configs=MARKDOWN_CONFIG
    )
    content, temp = preproc.process(source)
    if temp:
        warn("This is a temporary post. Skipped.")
        return True
    content = parser.convert(content.replace(chr(8203), ""))  # Remove non-width spaces

    # 准备 meta 数据
    try:
        meta = parser.Meta
        if len(meta) == 0:
            raise AttributeError
    except AttributeError:
        warn("No metadata. Skipped.")
        return True
    mdinfo = {}
    for key, val in METAINFO_DEFAULTS.items():
        if val is None and key not in meta:
            error("Missing metainfo '%s'. Stopped." % key)
            return False
        if key not in meta:
            mdinfo[key] = val
        elif type(val) == bool:
            mdinfo[key] = True if meta[key] == "true" else False
        elif type(val) == list:
            mdinfo[key] = meta[key]
        else:
            mdinfo[key] = meta[key][0]

    # 准备页面模板参数
    toc, content = cut_toc(content)
    title = mdinfo["title"]
    create_time = generate_time(*mdinfo["create"].split("."))
    modified_time = generate_time(*mdinfo["modified"].split("."))
    if do_modtime_check and modified_time != generate_date(datetime.datetime.now()):
        warn("Modified time is not updated to today. (%s)" % filepath)
    tags = TagGroup()
    for x in mdinfo["tags"]:
        tags.append(x)
    folder = os.path.abspath(os.path.join(os.path.dirname(filepath), mdinfo["location"]))
    new_file = os.path.join(folder, os.path.splitext(os.path.basename(filepath))[0] + ".html")
    navigater.handle("myself", new_file)
    navigater.home_folder = os.path.abspath(".")
    index_title = escape_string(title)
    index_text = escape_string(bs4.BeautifulSoup(content, BEAUTIFUL_SOUP_PARSER).text)
    index_url = navigater.get_path("myself")
    filename = os.path.basename(filepath)
    words = len(index_text)
    pagetitle = mdinfo["title"].strip().replace("\"", " ")
    pagekey = hashlib.md5(pagetitle.encode("utf8")).hexdigest()
    pageurl = SITE_DOMAIN + os.path.relpath(
        os.path.abspath(filepath), start=os.path.abspath("."))[:-3] + ".html"

    # 写入文件
    template_file = os.path.join(TEMPLATES_FOLDER, "%s.html" % mdinfo["template"])
    with open(template_file) as reader:
        template = reader.read()
    os.makedirs(folder, exist_ok=True)
    with open(new_file, "w") as writer:
        html_dom = template.format(
            title=title,
            create=create_time,
            modified=modified_time,
            stat=STAT_TEMPLATE.format(
                word=words, time=convert_time(words // WORDS_PER_MINUTE)),
            tags=str(tags),
            toc=toc,
            content=content,
            page_key=pagekey,
            page_title=pagetitle,
            page_url=pageurl,
            mdname=filename,
            github_location=os.path.join(GITHUB_LOCATION, os.path.dirname(index_url), filename)
        )
        if html_minify:
            writer.write(html_minify(html_dom))
        else:
            writer.write(html_dom)

    # 返回索引信息
    if mdinfo["index"]:
        return (index_title, index_url, index_text, mdinfo)
    return index_title
示例#7
0
        except RuntimeError, message:
            logging.warn("Aborted hook %s due to looping failure: %s" % (self.hook, message))


class ModuleAlreadyLoaded(Exception): pass

def add_module(module,init=True):
    if modules.get(module):
        raise ModuleAlreadyLoaded, "%s has already been loaded."%module
    try:
        modules[module] = __import__(module,globals(),locals(),[],-1)
    except ImportError, e:
        logging.error("Error loading %s: %s" % (module, traceback.format_exc()))
        return
    except Exception, e:
        logging.error("Error loading %s: %s" % (module, traceback.format_exc()))
        return
    modules[module].add_hook = add_hook
    modules[module].remove_hook = remove_hook

    if init:
        try:
            init_module = getattr(modules[module], 'init')
        except AttributeError:
            init_module = None

    if init_module:
        try:
            init_module()
        except Exception, message:
            logging.error("Error loading %s: %s" % (module, traceback.format_exc()))