|
| 1 | +#!/usr/bin/env python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | +""" |
| 4 | +Created on 2022/05/19 |
| 5 | +@author: Irony |
| 6 | +@site: https://pyqt.site https://github.com/PyQt5 |
| 7 | +@email: 892768447@qq.com |
| 8 | +@file: generate_data.py |
| 9 | +@description: |
| 10 | +""" |
| 11 | + |
| 12 | +from collections import OrderedDict |
| 13 | +import re |
| 14 | +import json |
| 15 | +import requests |
| 16 | +from pyquery import PyQuery |
| 17 | + |
| 18 | +g_syntax = {} |
| 19 | + |
| 20 | + |
| 21 | +def dealwith_pre(html): |
| 22 | + for code in re.findall(r'(<pre.*?</pre>)', html, re.S): |
| 23 | + html = html.replace( |
| 24 | + code, |
| 25 | + str('```\n{}\n```'.format( |
| 26 | + PyQuery(code).text(squash_space=False).strip()))) |
| 27 | + return html |
| 28 | + |
| 29 | + |
| 30 | +def dealwith_a(html): |
| 31 | + for a in re.findall(r'(<a href="(.*?)">(.*?)</a>)', html, re.S): |
| 32 | + url = a[1].strip() |
| 33 | + html = html.replace( |
| 34 | + a[0], '[{}]({})'.format( |
| 35 | + a[2].strip(), url if url.startswith('http') else |
| 36 | + 'https://doc.qt.io/qt-5/{}'.format(url))) |
| 37 | + return html |
| 38 | + |
| 39 | + |
| 40 | +def generate_desc(html): |
| 41 | + """ |
| 42 | + 生成描述, 支持markdown |
| 43 | +
|
| 44 | + @param html: 原始描述内容 |
| 45 | + @return: 格式化后的描述 |
| 46 | + """ |
| 47 | + html = dealwith_pre(html) |
| 48 | + html = dealwith_a(html) |
| 49 | + return PyQuery(html).text(squash_space=False).strip() |
| 50 | + |
| 51 | + |
| 52 | +def generate_types(doc): |
| 53 | + """ |
| 54 | + 生成属性类型节点 |
| 55 | + """ |
| 56 | + for tr in doc('.table:nth-child(20) tr[class!=qt-style]').items(): |
| 57 | + tds = list(tr('td').items()) |
| 58 | + g_syntax[tds[0].text()] = { |
| 59 | + 'url': |
| 60 | + 'https://doc.qt.io/qt-5/stylesheet-reference.html#{}'.format( |
| 61 | + tds[0].text().lower().replace(' ', '-')), |
| 62 | + 'syntax': |
| 63 | + PyQuery(tds[1].html()).text().strip(), |
| 64 | + 'desc': |
| 65 | + generate_desc(tds[2].html()) |
| 66 | + } |
| 67 | + |
| 68 | + |
| 69 | +def generate_props(doc): |
| 70 | + """ |
| 71 | + 生成属性节点 |
| 72 | + """ |
| 73 | + properties = [] |
| 74 | + for tr in doc('.table:nth-child(10) tr[class!=qt-style]').items(): |
| 75 | + tds = list(tr('td').items()) |
| 76 | + |
| 77 | + prop = OrderedDict() |
| 78 | + |
| 79 | + desc = OrderedDict() |
| 80 | + desc['kind'] = 'markdown' |
| 81 | + desc['value'] = generate_desc(tds[2].html()) |
| 82 | + |
| 83 | + references = [] |
| 84 | + syntax = tds[1].text().strip() |
| 85 | + if syntax in g_syntax: |
| 86 | + d = OrderedDict() |
| 87 | + d['name'] = syntax |
| 88 | + d['url'] = g_syntax[syntax]['url'] |
| 89 | + references.append(d) |
| 90 | + |
| 91 | + desc['value'] = desc['value'] + '\n\n`{}`:\n{}'.format( |
| 92 | + syntax, generate_desc(g_syntax[syntax]['desc'])) |
| 93 | + |
| 94 | + d = OrderedDict() |
| 95 | + d['name'] = 'list-of-properties' |
| 96 | + d['url'] = 'https://doc.qt.io/qt-5/stylesheet-reference.html#list-of-properties' |
| 97 | + references.append(d) |
| 98 | + |
| 99 | + prop['name'] = tds[0].text().replace('*', '').strip() |
| 100 | + prop['description'] = desc |
| 101 | + prop['references'] = references |
| 102 | + if syntax in g_syntax: |
| 103 | + prop['syntax'] = g_syntax[syntax]['syntax'] |
| 104 | + |
| 105 | + properties.append(prop) |
| 106 | + return properties |
| 107 | + |
| 108 | + |
| 109 | +def generate_pseudoClasses(doc): |
| 110 | + pseudoClasses = [] |
| 111 | + for tr in doc('.table:nth-child(24) tr[class!=qt-style]').items(): |
| 112 | + tds = list(tr('td').items()) |
| 113 | + pseudo = OrderedDict() |
| 114 | + pseudo['name'] = tds[0].text() |
| 115 | + pseudo['description'] = generate_desc(tds[1].html()) |
| 116 | + pseudoClasses.append(pseudo) |
| 117 | + return pseudoClasses |
| 118 | + |
| 119 | + |
| 120 | +def generate_pseudoElements(doc): |
| 121 | + pseudoElements = [] |
| 122 | + for tr in doc('.table:nth-child(29) tr[class!=qt-style]').items(): |
| 123 | + tds = list(tr('td').items()) |
| 124 | + pseudo = OrderedDict() |
| 125 | + pseudo['name'] = tds[0].text() |
| 126 | + pseudo['description'] = generate_desc(tds[1].html()) |
| 127 | + pseudoElements.append(pseudo) |
| 128 | + return pseudoElements |
| 129 | + |
| 130 | + |
| 131 | +if __name__ == '__main__': |
| 132 | + print('generate qss.json started') |
| 133 | + doc = PyQuery( |
| 134 | + requests.get( |
| 135 | + 'https://doc.qt.io/qt-5/stylesheet-reference.html').content) |
| 136 | + data = OrderedDict() |
| 137 | + data['version'] = 1.1 |
| 138 | + generate_types(doc) |
| 139 | + data['properties'] = generate_props(doc) |
| 140 | + data['pseudoClasses'] = generate_pseudoClasses(doc) |
| 141 | + data['pseudoElements'] = generate_pseudoElements(doc) |
| 142 | + with open('../data/qss.json', 'wb') as fp: |
| 143 | + fp.write(json.dumps(data, indent=4).encode()) |
| 144 | + print('generate qss.json finished') |
0 commit comments