Ctrl K
ComunidadGuías…

yaml_2_js.py

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#! /usr/bin/env python
#coding=utf8

'''
Convert data.yaml to data.js
'''

import json
import re
from html import escape

import yaml
from markdown import markdown

from atomic_io import atomic_write_text

fields = [
    'stars',
    'stars_dif',
    'name',
    'source',
    'open_issues',
    'demo',
    'js_kB',
    'css_kB',
    'language',
    'db',
    'markdown_support',
    'social_network_login',
    'anonymous_comments',
    'edit',
    'vote',
    'moderation',
    'nested_comments',
    'mail_notification',
    'antispam',
    'bad_words_list',
    'use_cookies',
    'avatar',
    'provided_hosting',
    'collapse_comments',
    'sort',
    'docker',
    'paging',
    'rate_limit',
    'hide_long_threads',
    'import_from_wordpress',
    'import_from_disqus',
    'english_documentation',
    'dependency',
    'webmention',
    'display_images',
    'license',
    'rss',
    'static',
    'created',
   #'updated', # What's this date?
    'last_committed',
   #'unmaintained', #or Maintaned?
    'description',
]

fields_dic={
    'stars':                 'Stars',
    'stars_dif':             'Stars in last month',
    'name':                  'Name',
    'source':                'Source code',
    'demo':                  'Demo & examples',
    'js_kB':                 'js, kB',
    'css_kB':                'css, kB',
    'language':              'Language',
    'db':                    'Database',
    'mail_notification':     'Mail notification',
    'edit':                  'User can edit',
    'vote':                  'User can vote',
    'antispam':              'Antispam',
    'bad_words_list':        'Bad words list',
    'use_cookies':           'Uses cookies',
    'avatar':                'Avatar',
    'markdown_support':      'Markdown support',
    'moderation':            'Moderation',
    'dependency':            'Dependencies',
    'webmention':            'Supports Webmention',
    'nested_comments':       'Nested comments',
    'provided_hosting':      'Can host for you',
    'collapse_comments':     'Collapse comments',
    'sort':                  'Configurable order',
    'rate_limit':            'Comment rate limit',
    'docker':                'Docker container',
    'paging':                'Paging',
    'hide_long_threads':     'Hide long threads',
    'anonymous_comments':    'Anonymous comments',
    'social_network_login':  'Social network login',
    'import_from_wordpress': 'Import from wordpress',
    'import_from_disqus':    'Import from disqus',
    'english_documentation': 'English documentation',
    'rss':                   'RSS',
    'display_images':        'Display images',
    'static':                'Static',
    'description':           'Description',
    'updated':               'Updated (y‑m‑d)',
    'last_committed':        'Updated (y‑m‑d)',
    'created':               'Created (y‑m‑d)',
    'license':               'License',
    'open_issues':           'Open issues + PR',
    'unmaintained':          'Unmaintained',
}

def source_urlify(x):
    values = x if isinstance(x, list) else [x]
    links = []
    for index, value in enumerate(values):
        value = str(value)
        safe_value = escape(value, quote=True)
        if 'github.com' in value:
            links.append('<a href="{}">github</a>'.format(safe_value))
        elif 'gitlab.com' in value:
            links.append('<a href="{}">gitlab</a>'.format(safe_value))
        elif re.match(r'^https?://', value):
            label = '[{}]'.format(index + 1) if isinstance(x, list) else 'link'
            links.append('<a href="{}">{}</a>'.format(safe_value, label))
        else:
            links.append(markdown_inline(value))
    return ', '.join(links)


def markdown_inline(value):
    rendered = markdown(str(value))
    rendered = re.sub(r'^<p>', '', rendered)
    rendered = re.sub(r'</p>\s*$', '', rendered)
    return rendered

def provider_title(provider):
    labels = {
        'github': 'GitHub',
        'gitlab': 'GitLab',
    }
    providers = [labels.get(part, part) for part in str(provider).split(',') if part]
    if len(providers) == 1:
        return providers[0]
    if providers:
        return 'other repositories'
    return 'other repository'

def stars_urlify(item):
    stars = item.get('stars', '?')
    extra = item.get('stars_extra')
    warning = item.get('update_warning')
    titles = []
    if extra not in (None, '', 0, '0'):
        titles.append(
            '+{} stars on {}'.format(
                extra,
                provider_title(item.get('stars_extra_provider')),
            )
        )
    if warning:
        warning_date = item.get('update_warning_at', 'unknown date')
        titles.append('Update warning on {}: {}'.format(warning_date, warning))

    if not titles:
        return urlify(stars)

    return '<span class="stars-with-extra" title="{}">{}<span class="stars-extra"></span></span>'.format(
        escape(' | '.join(titles), quote=True),
        escape(str(stars)),
    )


def urlify(x):
    values = x if isinstance(x, list) else [x]
    rendered = []
    for index, value in enumerate(values):
        value = str(value)
        if re.match(r'^https?://', value):
            label = '[{}]'.format(index + 1) if isinstance(x, list) else 'demo'
            rendered.append(
                '<a href="{}">{}</a>'.format(escape(value, quote=True), label)
            )
        else:
            rendered.append(markdown_inline(value))
    return ', '.join(rendered)


def generate_data_js(data):
    if not isinstance(data, dict):
        raise RuntimeError('data.yaml root must be a mapping')

    rows = []
    for name, item in data.items():
        if not isinstance(item, dict):
            raise RuntimeError('data.yaml entry {!r} must be a mapping'.format(name))
        row = []
        for field in fields:
            if field == 'stars':
                row.append(stars_urlify(item))
            elif field == 'source':
                row.append(source_urlify(item[field]) if field in item else '?')
            elif field in item:
                row.append(urlify(item[field]))
            else:
                row.append('?')
        rows.append(row)

    output = ['var osc_data = [']
    output.extend(
        '{}{}'.format(
            json.dumps(row, ensure_ascii=False),
            ',' if index < len(rows) - 1 else '',
        )
        for index, row in enumerate(rows)
    )
    output.append('];')
    output.append('var cols = {};'.format(
        json.dumps(
            [{'title': fields_dic[field]} for field in fields],
            ensure_ascii=False,
        )
    ))
    output.append('var col_keys = {};'.format(json.dumps(fields, ensure_ascii=False)))
    return '\n'.join(output) + '\n'


def main():
    with open('data.yaml', 'r', encoding='utf-8') as source:
        data = yaml.load(source, Loader=yaml.SafeLoader)
    atomic_write_text('data.js', generate_data_js(data))
    print('data.js has been updated')
    return 0


if __name__ == '__main__':
    raise SystemExit(main())