Exemplo n.º 1
0
def create_app(instance_path=None):
    app = Flask(__name__, instance_path=instance_path)

    if not os.path.exists(app.instance_path):
        os.makedirs(app.instance_path)

    app.config.from_pyfile('../config.py')

    from app import main, user, note, config
    app.register_blueprint(main.bp)
    app.register_blueprint(user.bp)
    app.register_blueprint(note.bp)
    app.register_blueprint(config.bp)

    db.init_app(app)
    with app.app_context():
        db.create_all()
        from app.config.model import Config
        from app.user.model import User
        Config.update_config()
        User.update_user()

    # FIXME: 설정에서 가져오도록
    theme = 'yaong'
    app.static_folder = '../themes/{}/static'.format(theme)
    app.template_folder = '../themes/{}/templates'.format(theme)

    return app
Exemplo n.º 2
0
 def handle_config_events(self):
     buffer = self.config_handler.buffer
     if not buffer:
         return
     from main import app
     from app.config.model import Config
     with app.app_context():
         Config.update_config()
     self.config_handler.clear_buffer()
Exemplo n.º 3
0
def get_feed_from_notes(notes):
    sitemap = ''
    rss2 = ''
    atom = ''

    name = User.get_user_info('name')
    email = User.get_user_info('email')
    root_url = Config.get('url')
    timezone = Config.get('timezone')
    # TODO: note_url_prefix 설정 적용
    note_url_prefix = 'note'

    for i, note in enumerate(notes):
        path = quote(note.path)
        item_url = f'{root_url}/{note_url_prefix}/{path}'

        # sitemap
        updated_iso = format_datetime(note.updated,
                                      style='iso-8601',
                                      timezone=timezone)
        sitemap += f'    <url>\n'
        sitemap += f'        <loc>{item_url}</loc>\n'
        sitemap += f'        <lastmod>{updated_iso}</lastmod>\n'
        sitemap += f'    </url>\n'

        if i > 10:
            continue

        # rss
        updated_rfc = format_datetime(note.updated,
                                      style='rfc-822',
                                      timezone=timezone)
        rss2 += f'        <item>\n'
        rss2 += f'            <title>{note.title}</title>\n'
        rss2 += f'            <author>{email} ({name})</author>\n'
        rss2 += f'            <pubDate>{updated_rfc}</pubDate>\n'
        rss2 += f'            <link>{item_url}</link>\n'
        rss2 += f'            <guid isPermaLink="false">{item_url}</guid>\n'
        rss2 += f'            <description>{note.summary}</description>\n'
        rss2 += f'        </item>\n'

        # atom
        published_iso = format_datetime(note.created,
                                        style='iso-8601',
                                        timezone=timezone)
        atom += f'    <entry>\n'
        atom += f'        <title>{note.title}</title>\n'
        atom += f'        <id>{item_url}</id>\n'
        atom += f'        <link rel="alternate" href="{item_url}" />\n'
        atom += f'        <published>{published_iso}</published>\n'
        atom += f'        <updated>{updated_iso}</updated>\n'
        atom += f'        <summary>{note.summary}</summary>\n'
        atom += f'    </entry>\n'

    return sitemap, rss2, atom
Exemplo n.º 4
0
def md_extensions():
    extensions = []
    # https://python-markdown.github.io/extensions/
    extensions.append('markdown.extensions.meta')
    extensions.append('markdown.extensions.fenced_code')
    extensions.append('markdown.extensions.codehilite')
    extensions.append('markdown.extensions.tables')
    extensions.append('markdown.extensions.admonition')
    extensions.append('markdown.extensions.nl2br')
    extensions.append('markdown.extensions.footnotes')
    extensions.append('markdown.extensions.md_in_html')

    # FIXME: 수정해야함
    base_url = 'note'
    extensions.append(
        WikiLinkExtensionCustom(base_url='/{}/'.format(base_url)))

    toc_marker = Config.get('md_toc_marker')
    extensions.append(
        TocExtension(marker=toc_marker, permalink=True, slugify=_slugify))

    extensions.append(AutolinkExtensionCustom())
    extensions.append(LinkInlineExtension())

    return extensions
Exemplo n.º 5
0
def get_aes_key():
    # FIXME: 설정에서 가져오도록
    key = Config.get('aes_key')
    if len(key) > AES_KEY_LENGTH:
        key = key[:AES_KEY_LENGTH]
    if len(key) < AES_KEY_LENGTH:
        key += (AES_KEY_LENGTH - len(key)) * PADDING
    return key.encode()
Exemplo n.º 6
0
def get_base_meta():
    note_config = Config.get()
    meta = dict()
    meta['note_title'] = note_config.get('note_title', '')
    meta['note_subtitle'] = note_config.get('note_subtitle', '')
    meta['note_description'] = note_config.get('note_description', '')
    meta['user_name'] = User.get_user_info('name')
    meta['year'] = datetime.now().year
    meta['ga_tracking_id'] = note_config.get('ga_tracking_id')
    meta['logged_in'] = User.is_logged_in()
    return meta
Exemplo n.º 7
0
def get_posted_page(page=1):
    base_query = Note.query.filter_by(permission=Permission.PUBLIC, posted=1).\
        order_by(Note.pinned.desc(), Note.updated.desc())
    page = base_query.paginate(page, Config.get('post_per_page'), False)

    next_url = None
    prev_url = None
    if page.next_num:
        next_url = url_for('main.view_posts', page=page.next_num)
    if page.prev_num:
        prev_url = url_for('main.view_posts', page=page.prev_num)

    posts = get_post_info_from_notes(page.items)
    return posts, next_url, prev_url
Exemplo n.º 8
0
def get_tag_page(tag, page=1):
    permission = get_permission()
    base_query = Note.query.join(Tag, Note.id == Tag.note_id)\
        .filter(Tag.tag == tag, Note.permission >= permission)\
        .order_by(Note.updated.desc())
    page = base_query.paginate(page, Config.get('post_per_page'), False)

    next_url = None
    prev_url = None
    if page.next_num:
        next_url = url_for('main.view_tag_posts', tag=tag, page=page.next_num)
    if page.prev_num:
        prev_url = url_for('main.view_tag_posts', tag=tag, page=page.prev_num)

    posts = get_post_info_from_notes(page.items)
    return posts, next_url, prev_url
Exemplo n.º 9
0
def update_sitemap(sitemap_items):
    root_url = Config.get('url')
    sitemap = ''
    sitemap += XML_Declaration
    sitemap += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n'
    base_locs = [
        f'{root_url}/',
        f'{root_url}/note',
        f'{root_url}/tags',
    ]
    for loc in base_locs:
        sitemap += f'    <url>\n        <loc>{loc}</loc>\n    </url>\n'
    sitemap += sitemap_items
    sitemap += '</urlset>'

    path = os.path.join(current_app.instance_path, 'sitemap.xml')
    with open(path, 'w', encoding='utf-8') as f:
        f.write(sitemap)
Exemplo n.º 10
0
def update_feed():
    """
    https://validator.w3.org/feed/docs/rss2.html
    https://validator.w3.org/feed/docs/atom.html

    Returns:
    """

    notes = Note.query.filter_by(permission=Permission.PUBLIC, posted=1)\
        .order_by(Note.updated.desc()).all()
    sitemap_items, rss_items, atom_items = get_feed_from_notes(notes)

    now = datetime.now()
    timezone = Config.get('timezone')
    build_date_iso = format_datetime(now, style='iso-8601', timezone=timezone)
    build_date_rfc = format_datetime(now, style='rfc-822', timezone=timezone)

    update_sitemap(sitemap_items)
    update_rss(rss_items, build_date_rfc)
    update_atom(atom_items, build_date_iso)
Exemplo n.º 11
0
def update_rss(rss_items, build_date):
    config = Config.get()

    rss2 = ''
    rss2 += XML_Declaration
    rss2 += f'<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">\n'
    rss2 += f'    <channel>\n'
    rss2 += f'        <title>{config["note_title"]}</title>\n'
    rss2 += f'        <link>{config["url"]}</link>\n'
    rss2 += f'        <atom:link href="{config["url"]}/rss" rel="self" type="application/rss+xml" />\n'
    rss2 += f'        <description>{config["note_description"]}</description>\n'
    rss2 += f'        <docs>{config["url"]}/rss</docs>\n'
    rss2 += f'        <generator>ipari-note</generator>\n'
    rss2 += f'        <lastBuildDate>{build_date}</lastBuildDate>\n'
    rss2 += rss_items
    rss2 += f'    </channel>\n'
    rss2 += f'</rss>'

    path = os.path.join(current_app.instance_path, 'rss.xml')
    with open(path, 'w', encoding='utf-8') as f:
        f.write(rss2)
Exemplo n.º 12
0
def update_atom(atom_items, build_date):
    config = Config.get()
    user = User.get_user_info()

    atom = ''
    atom += XML_Declaration
    atom += f'<feed xmlns="http://www.w3.org/2005/Atom">\n'
    atom += f'    <title>{config["note_title"]}</title>\n'
    atom += f'    <subtitle>{config["note_subtitle"]}</subtitle>\n'
    atom += f'    <author>\n'
    atom += f'        <name>{user["name"]}</name>\n'
    atom += f'        <email>{user["email"]}</email>\n'
    atom += f'    </author>\n'
    atom += f'    <updated>{build_date}</updated>\n'
    atom += f'    <id>{config["url"]}/</id>\n'
    atom += f'    <link rel="alternate" href="{config["url"]}" />\n'
    atom += f'    <link rel="self" href="{config["url"]}/atom" />\n'
    atom += f'    <generator>ipari-note</generator>'
    atom += atom_items
    atom += f'</feed>'

    path = os.path.join(current_app.instance_path, 'atom.xml')
    with open(path, 'w', encoding='utf-8') as f:
        f.write(atom)