#! /usr/bin/env python # Copyright 2020 Google LLC. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. ''' get_examples.py: Populate docs/examples/ from the list of named fiddles. ''' import os import re import sys if sys.version_info[0] < 3: from urllib2 import urlopen from HTMLParser import HTMLParser def unescape(v): return HTMLParser().unescape(v) else: from urllib.request import urlopen from html.parser import HTMLParser from html import unescape def cxx_bool(v): return 'true' if v else 'false' assert os.pardir == '..' and '/' in [os.sep, os.altsep] def parse_fiddle_sk(x): class FiddleSk(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.attrs = {} def handle_starttag(self, tag, attrs): if tag == 'fiddle-sk': self.attrs = dict(attrs) fiddle = FiddleSk() fiddle.feed(x) return fiddle.attrs def process_fiddle(name): if name == 'MAD_Magazine_Oct_1985': return filename = 'docs/examples/%s.cpp' % name if os.path.exists(filename): return url = 'https://fiddle.skia.org/c/@' + name content = urlopen(url).read() regex = (r'(]*>)\s*\s*' r'') match = re.search(regex, content.decode('utf-8'), flags=re.S) if not match: sys.stderr.write('error: %s\n' % url) keys = parse_fiddle_sk(match.group(1)) code = unescape(match.group(2)) width = keys.get('width', '256') height = keys.get('height', '256') source_image = keys.get('source', 256) duration = keys.get('duration', '0') textonly = 'textonly' in keys srgb = not textonly and 'srgb' in keys f16 = srgb and 'f16' in keys offscreen = 'offscreen' in keys sys.stdout.write('Writing to: %s\n' % filename) sys.stdout.flush() with open(filename, 'w') as o: o.write('// Copyright 2020 Google LLC.\n' '// Use of this source code is governed by a BSD-style' ' license that can be found in the LICENSE file.\n' '#include "tools/fiddle/examples.h"\n') if offscreen: o.write('REGISTER_FIDDLE(') o.write(', '.join([name, width, height, cxx_bool(textonly), source_image, duration, cxx_bool(srgb), cxx_bool(f16), cxx_bool(offscreen), keys.get('offscreen_width', '64'), keys.get('offscreen_height', '64'), keys.get('offscreen_sample_count', '0'), keys.get('offscreen_texturable', 'false'), keys.get('offscreen_mipmap', 'false')])) elif srgb: o.write('REG_FIDDLE_SRGB(') o.write(', '.join([name, width, height, cxx_bool(textonly), source_image, duration, cxx_bool(f16)])) elif duration: o.write('REG_FIDDLE_ANIMATED(') o.write(', '.join([name, width, height, cxx_bool(textonly), source_image, duration])) else: o.write('REG_FIDDLE(') o.write(', '.join([name, width, height, cxx_bool(textonly), source_image])) o.write(') {\n') o.write(code) o.write('\n} // END FIDDLE\n') def main(): os.chdir(os.path.dirname(__file__) + '/../..') for line in urlopen('https://fiddle.skia.org/named/'): line_match = re.search(r'/c/@([A-Za-z0-9_-]*)', line.decode('utf-8')) if not line_match: continue name = line_match.group(1) process_fiddle(name) if __name__ == '__main__': main()