#!/usr/bin/python from __future__ import print_function from __future__ import unicode_literals # make all literals unicode strings by default (even in Python 2) import os import re import uuid from io import open # needed for support of encoding parameter in Python 2 from helpers import get_inkscape_dist_dir, get_inkscape_locales_and_names # basestring is not available in Python 3 try: basestring except NameError: basestring = (str,bytes) directory_ids = {} file_ids = {} def indent(level): indentstring = '' for i in range(level): indentstring += ' ' return indentstring def valid_id(identifier): return identifier.replace('@','_') def directory(root, breadcrumb, level, exclude=[]): """ list all files and directory recursively create the file_ids dictionary to be used in ComponentGroup references """ global file_ids global directory_ids # first list files within directory files = [ f for f in os.listdir(root) if os.path.isfile(os.path.join(root,f)) and f not in exclude] for file in files: file_key = os.path.join(root, file) file_key = file_key.replace('/', '\\') # for usage from MSYS2 shell _id = '_%06d' % (len(file_ids.keys()) + 1) file_ids[file_key] = 'component' + _id wxs.write(indent(level)+ "\n") if file == 'inkscape.exe': # we reference inkscape.exe in inkscape.wxs _id = '_inkscape_exe' wxs.write(indent(level + 1)+ "\n") wxs.write(indent(level)+ "\n") # then all directories dirs = [ f for f in os.listdir(root) if os.path.isdir(os.path.join(root,f)) ] for dir in dirs: directory_key = breadcrumb + '__' + dir if not directory_key in directory_ids.keys(): directory_ids[directory_key] = 'dir_%06d' % (len(directory_ids.keys()) + 1) wxs.write(indent(level) + "\n") directory(os.path.join(root, dir), directory_key, level + 1) wxs.write(indent(level) + "\n") def test_conditions(value, conditions): """ check if "value" fulfills any of the "conditions", where a condition can be - a string that has to be a substring of "value" - a compiled regex pattern which has to match in "value" """ if not isinstance(conditions, list): conditions = [conditions] for condition in conditions: if isinstance(condition, basestring): if condition in value: return True elif isinstance(condition, type(re.compile(''))): if re.search(condition, value): return True return False def ComponentGroup(name, conditions, level): """ add componentgroup that contain all items from file_ids that match condition remove the matched elements from file_ids """ global file_ids keys = [k for k in file_ids.keys() if test_conditions(k, conditions)] wxs.write(indent(level) + "\n") for component in keys: wxs.write(indent(level + 1) + "\n") wxs.write(indent(level) + "\n") for key in keys: del file_ids[key] # get directory containing the Inkscape distribution files inkscape_dist_dir = get_inkscape_dist_dir() # get locales currently supported by Inkscape (dict of the form {'de': 'German (de)'}) locales = get_inkscape_locales_and_names() with open('files.wxs', 'w', encoding='utf-8') as wxs: wxs.write("\n") wxs.write("\n") wxs.write(indent(1) + "\n") wxs.write(indent(1) + "\n") wxs.write(indent(2) + "\n") wxs.write(indent(2) + "\n") wxs.write(indent(3) + "\n") wxs.write(indent(4) + "\n") print("start parsing files from " + inkscape_dist_dir) directory(inkscape_dist_dir, 'inkscape', 5, ['inkscape.dbg', 'inkview.dbg', 'gdb.exe']) print("found %d files" % len(file_ids.keys())) wxs.write(indent(4) + "\n") wxs.write(indent(3) + "\n") # link to ProgramMenu wxs.write(indent(3) + "\n") wxs.write(indent(4) + "\n") wxs.write(indent(3) + "\n") wxs.write(indent(3) + "\n") wxs.write(indent(2) + "\n") # Python ComponentGroup("Python", ['inkscape\\python\\','inkscape\\lib\\python2.7\\', 'inkscape\\libpython', 'inkscape\\python'], 2) # translations and localized content for lang_code in sorted(locales): ComponentGroup("Translation_" + valid_id(lang_code), ['\\' + lang_code + '\\', re.compile(r'\.' + lang_code + r'\.[a-z]+$')], 2) # other components ComponentGroup("Extensions", 'inkscape\\share\\extensions\\', 2) ComponentGroup("Examples", 'inkscape\\share\\examples\\', 2) ComponentGroup("Tutorials", 'inkscape\\share\\tutorials\\', 2) ComponentGroup("Dictionaries", ['inkscape\\lib\\aspell-0.60\\', 'inkscape\\lib\\enchant\\'], 2) # everything that is left (which should be the Inkscape core unless inkscape_dist_dir contains unnecessary files or we defined our components poorly) ComponentGroup("AllOther", '', 2) # create a FeatureGroup for translations wxs.write(indent(2) + "\n") sorted_locales = sorted( ((v,k) for k,v in locales.items()) ) # sort by language name (instead of language code) for lang_name, lang_code in sorted_locales: wxs.write(indent(3) + "\n") wxs.write(indent(4) + "\n") wxs.write(indent(3) + "\n") wxs.write(indent(2) + "\n") wxs.write(indent(1) + "\n") wxs.write("\n")