def init_admin(): admin.env = Environment(loader=FileSystemLoader('admin/layout/'), trim_blocks=1) admin.env.globals.update( **{ 'config': config, 't_config': t_config, 't_setting': t_setting, 'data': { 'posts': posts, 'pages': pages, 'tags': tags, 'categories': categories, 'index': index, 'tags_index': tags_index, 'categories_index': categories_index } }) admin.env.filters = env.filters admin.env.filters.update( toyaml=dyml, rejectkey=lambda x, *args: dict(i for i in x.items() if i[0] not in args)) admin.tpls = MP(login=admin.env.get_template('login.html'), index=admin.env.get_template('index.html'), editPost=admin.env.get_template('editPost.html'), listPost=admin.env.get_template('listPost.html'))
def apiRmPost(data): data = MP(data) if 'pos' not in data: return {'status': 'failed'} rmPost(posts[data.pos]) mp.pop(posts[data.pos].addr) posts.pop(data.pos) postsUpd() return {'status': 'success'}
def apiEditPost(data): data = MP(data) data.meta = MP(lyml(data.meta)) if not data.meta.date: data.meta.date = datetime.now().replace(microsecond=0) elif isinstance(data.meta.date, str): data.meta.date = str2date(data.meta.date) data.meta.update(title=data.title, top=data.top, tags=data.tags, categories=data.categories) file = Path('source/_posts/%s.md' % data.filename) file.open('w', encoding='utf-8').write('---\n' + dyml(dict(data.meta)) + '\n---\n' + data.content) x = genitem(file, is_post=1) if data.has('pos'): post = posts[data.pos] if post.filename != data.filename: rmPost(post) posts[data.pos] = x else: posts.append(x) postsUpd() mp[x.addr] = x return {'pos': x.pos, 'status': 'success', 'redirect': data.pos != x.pos}
def gen_categories_index(path, cates): if cates.sub: for cate in cates.sub: gen_categories_index(path + cate + '/', cates['sub'][cate]) if cates.nodes: categories_index.extend( gen_index(path, cates['nodes'], { 'layout': 'categories_index', 'sub': cates.sub })) elif cates.sub: categories_index.append( MP(addr=path, link=rt + path, path=path, title=path, sub=cates.sub, layout='categories_index'))
def gen_index(path, a, ext={}): num = config.index.per_page tot = len(a) TOT = math.ceil(tot / num) res = [] for now, i in enumerate(range(0, tot, num), 1): nodes = a[i:i + num] addr = path if now == 1 else path + 'page/%d/' % now res.append( MP(id=now, addr=addr, link=rt + addr, path=path, title=path, nodes=nodes, total=tot, TOTAL=TOT, **ext)) for id, x in enumerate(res): x.pre = res[id - 1] x.nxt = res[(id + 1) % TOT] return res
def generate(): global posts, pages, tags, categories, index, tags_index, categories_index tags, categories = MP(), MP() for x in posts + pages: for tag in x.tags: if tag in tags: tags[tag].append(x) else: tags.update({tag: [x]}) for node in x.categories: now = categories for categorie in node: if not 'sub' in now: now.sub = MP() if not categorie in now.sub: now.sub[categorie] = MP() now = now.sub[categorie] if 'nodes' not in now: now.nodes = [x] else: now.nodes.append(x) index = gen_index('', posts, {'layout': 'index'}) tags_index, categories_index = [], [] for tag in tags: tags_index.extend( gen_index('tags/%s/' % tag, tags[tag], { 'tag': tag, 'layout': 'tags_index' })) gen_categories_index('categories/', categories)
def genitem(file, is_post=0, is_page=0): data = rd(file).split('---\n') meta = MP(lyml(data[1])) if isinstance(meta.date, str): meta.date = str2date(meta.date) content = ''.join(data[2:]) preview = content[0:min(len(content), config.index.preview)] if '<!-- more -->' in content: preview = content.split('<!-- more -->', 1)[0] name = file.stem x = MP(filename=name, assets=file.parent / file.stem, addr=name + '/', link=rt + name + '/', title=name, date=datetime.fromtimestamp(int(os.stat(file).st_mtime)), author=config.author, tags=[], categories=[], top=0, content=content, preview=preview, meta=meta) x.update(t_setting.defaut_front) x.update(meta) if is_post: if config.post_addr == 'pinyin': x.addr = 'posts/%s/' % toPinyin(name) elif config.post_addr == 'origin': x.addr = 'posts/%s/' % name if x.permalink: x.addr = 'posts/%s/' % x.permalink x.link = rt + x.addr if not x.layout: x.layout = 'post' if is_page and not x.layout: x.layout = 'page' return x
chkDependences() from jinja2 import Environment, FileSystemLoader, Template from funcs import lyml, dyml, cp, del_none, str2date, rd, toPinyin, MP from encrypt import encrypt def op(path, data): if DEBUG: print(path) path = Dest / path if not path.suffix == '.html': path = path / 'index.html' path.parent.mkdir(parents=1, exist_ok=1) path.open('w', encoding='utf-8').write(data) config = MP(lyml(rd('config.yml'))) tSrc = Path('theme/%s/' % config.theme) dest = config.dest Dest = Path(dest) DEBUG = config.debug rt = config.site.rt = urlparse(config.site.url).path t_config = MP(lyml(rd(tSrc / 'config.yml'))) t_setting = MP(lyml(rd(tSrc / 'setting.yml'))) posts, pages = [], [] tags, categories = MP(), MP() index, tags_index, categories_index = [], [], [], urls = [] env, tpls = False, MP() last_build_time = datetime.now().replace(microsecond=0)
chkDependences() from jinja2 import Environment, FileSystemLoader, Template from funcs import lyml, dyml, cp, del_none, str2date, rd, toPinyin, MP from encrypt import encrypt def op(path, data): if DEBUG: print(path) path = Dest / path if not path.suffix == '.html': path = path / 'index.html' path.parent.mkdir(parents=1, exist_ok=1) path.open('w', encoding='utf-8').write(data) config = MP(lyml(rd('config.yml'))) dest = config.dest Dest = Path(dest) DEBUG = config.debug rt = config.site.rt = urlparse(config.site.url).path t_config = MP(lyml(rd('theme/%s/config.yml' % config.theme))) t_setting = MP(lyml(rd('theme/%s/setting.yml' % config.theme))) posts, pages = [], [] tags, categories = MP(), MP() index, tags_index, categories_index = [], [], [], urls = [] env, tpls = False, MP() last_build_time = datetime.now().replace(microsecond=0)