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__)))
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
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))
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
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
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()))