diff options
Diffstat (limited to 'build.py')
-rwxr-xr-x | build.py | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/build.py b/build.py deleted file mode 100755 index d0f7fba..0000000 --- a/build.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env python3 -import html -import json -import os -import re -import shutil -import tomllib - - -def get_features(dirname): - feature_data = {} - for feature in sorted(os.listdir('caniuse.rs/data/' + dirname)): - with open('caniuse.rs/data/' + dirname + '/' + feature, 'rb') as f: - name = feature.split('.')[0] - feature_data[name] = tomllib.load(f) - - # new dict because we want to deduplicate features - features = {} - - # caniuse.rs sometimes has several .toml files for one feature flag e.g. - # For the const_io feature flag it has 6 .toml files, all with the same - # tracking_issue_id but different titles. - # - # That makes sense for a search-centric application. Not so much for a - # static-site generator since showing the same link 6 times is confusing. - for feat, data in feature_data.items(): - key = data['flag'] if 'flag' in data else feat - - url = None - if 'tracking_issue_id' in data: - url = 'https://github.com/rust-lang/rust/issues/{}'.format( - data['tracking_issue_id'] - ) - elif 'impl_pr_id' in data: - url = 'https://github.com/rust-lang/rust/pull/{}'.format(data['impl_pr_id']) - elif 'stabilization_pr_id' in data: - url = 'https://github.com/rust-lang/rust/pull/{}'.format( - data['stabilization_pr_id'] - ) - data['url'] = url - data['filename'] = feat - - if data['title'].startswith('the '): - data['title'] = data['title'][len('the ') :] - data['title'] = data['title'].replace('implementation', 'impl') - - if key in features: - data['title'] = data['flag'].replace('_', ' ') - - if key in features and features[key]['url'] != url: - print( - 'different urls for feature {}:\n* {}: {}\n* {}: {}'.format( - key, - data['filename'], - data['url'], - features[key]['filename'], - features[key]['url'], - ) - ) - - features[key] = data - - features = dict( - sorted(features.items(), key=lambda t: t[1]['title'].replace('`', '').lower()) - ) - - lib_features = {} - non_lib_features = {} - - for key, data in features.items(): - if ('flag' in data and data['flag'] in library_flags) or 'impl for' in data[ - 'title' - ]: - lib_features[key] = data - else: - non_lib_features[key] = data - - return dict(lib_features=lib_features, non_lib_features=non_lib_features) - - -with open('lib_feats.txt') as f: - library_flags = set([l.strip() for l in f]) - -with open('caniuse.rs/data/versions.toml', 'rb') as f: - versions = tomllib.load(f) - -for version, data in versions.items(): - try: - data['features'] = get_features(version) - except FileNotFoundError: - pass - -versions = dict(reversed(list(versions.items()))) - -unstable_features = get_features('unstable') - - -os.makedirs('target', exist_ok=True) -shutil.copy('style.css', 'target') -shutil.copy('script.js', 'target') - -with open('target/data.json', 'w') as f: - data = dict(unstable=dict(features=unstable_features), **versions) - json.dump(data, f) - - -def write_features(f, id, features): - if features['non_lib_features']: - write_feature_list(f, id + '-non-lib', features['non_lib_features']) - if features['lib_features']: - f.write('<h3 id="{}">library</h3>'.format(id + '-lib')) - write_feature_list(f, id + '-lib', features['lib_features']) - - -def write_feature_list(f, id, features): - f.write('<ul id={}-list'.format(id)) - if len(features) > 5: - f.write(' class=columns') - f.write('>') - for feat, data in features.items(): - f.write('<li><a') - if 'flag' in data: - f.write(' title="{}"'.format(data['flag'])) - url = data['url'] - if url: - f.write(f' href="{url}"') - f.write('>') - title = html.escape(data['title']) - title = re.sub('`(.+?)`', lambda m: '<code>{}</code>'.format(m.group(1)), title) - f.write(title) - f.write('</a></li>') - f.write('</ul>') - - -with open('target/index.html', 'w') as f: - with open('head.html') as h: - f.write(h.read()) - - f.write('<h2 id=unstable>Unstable features</h2>') - write_features(f, 'unstable', unstable_features) - - after_beta = False - - for version, data in versions.items(): - f.write('<div id={0} class=release>'.format(version)) - f.write('<h2>{}'.format(version)) - channel = data.get('channel') - if after_beta: - channel = 'stable' - after_beta = False - if channel: - if channel == 'nightly': - channel = 'stabilized' - elif channel == 'beta': - after_beta = True - f.write(' [{}]'.format(channel)) - f.write('</h2>') - - if 'blog_post_path' in data: - f.write( - '<a class=release-notes href="https://blog.rust-lang.org/{}">{}</a>'.format( - data['blog_post_path'], 'release notes' - ) - ) - f.write('</div>') - - if 'features' in data: - write_features(f, version, data['features']) |