You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							170 lines
						
					
					
						
							4.6 KiB
						
					
					
				
			
		
		
	
	
							170 lines
						
					
					
						
							4.6 KiB
						
					
					
				// This script was ported from https://github.com/git-touch/file-icon/blob/master/tool/gulpfile.esm.js and improved in many ways | 
						|
 | 
						|
import 'dart:io'; | 
						|
 | 
						|
import 'package:path/path.dart' as p; | 
						|
 | 
						|
final setiUIPath = p.join( | 
						|
  '..', | 
						|
  '..', | 
						|
  'external', | 
						|
  'seti-ui', | 
						|
); | 
						|
 | 
						|
void main() { | 
						|
  copyFont(); | 
						|
  generateData(); | 
						|
} | 
						|
 | 
						|
void copyFont() { | 
						|
  final fontsDir = Directory('fonts'); | 
						|
  if (!fontsDir.existsSync()) { | 
						|
    fontsDir.createSync(); | 
						|
  } | 
						|
  File( | 
						|
    p.join( | 
						|
      setiUIPath, | 
						|
      'styles', | 
						|
      '_fonts', | 
						|
      'seti', | 
						|
      'seti.ttf', | 
						|
    ), | 
						|
  ).copySync(p.join('fonts', 'seti.ttf')); | 
						|
} | 
						|
 | 
						|
void generateData() { | 
						|
  final mappingLess = File( | 
						|
    p.join( | 
						|
      setiUIPath, | 
						|
      'styles', | 
						|
      'components', | 
						|
      'icons', | 
						|
      'mapping.less', | 
						|
    ), | 
						|
  ).readAsStringSync(); | 
						|
  final setiLess = File( | 
						|
    p.join( | 
						|
      setiUIPath, | 
						|
      'styles', | 
						|
      '_fonts', | 
						|
      'seti.less', | 
						|
    ), | 
						|
  ).readAsStringSync(); | 
						|
  final uiVariablesLess = File( | 
						|
    p.join( | 
						|
      setiUIPath, | 
						|
      'styles', | 
						|
      'ui-variables.less', | 
						|
    ), | 
						|
  ).readAsStringSync(); | 
						|
 | 
						|
  final colors = <String, String>{'@seti-primary': '_blue'}; | 
						|
  final iconSet = <String, List<String>>{}; | 
						|
  final codePoints = <String, String>{}; | 
						|
 | 
						|
  // https://github.com/microsoft/vscode/blob/554182620f43390075d8c7e7fa36634288ef4e2d/extensions/theme-seti/build/update-icon-theme.js#L345 | 
						|
  for (final match | 
						|
      in RegExp('\\.icon-(?:set|partial)\\([\'"]([\\w-.+]+)[\'"],\\s*[\'"]([\\w-]+)[\'"],\\s*(@[\\w-]+)\\)') | 
						|
          .allMatches(mappingLess)) { | 
						|
    final pattern = match.group(1)!.toLowerCase(); | 
						|
    final type = match.group(2)!; | 
						|
    final colorName = match.group(3)!; | 
						|
 | 
						|
    if (colorName != '@seti-primary') { | 
						|
      colors[colorName] = ''; | 
						|
    } | 
						|
 | 
						|
    if (iconSet[pattern] == null) { | 
						|
      iconSet[pattern] = [type, colorName]; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  for (final match in RegExp("^\t@([a-zA-Z0-9-_]+): '\\\\([A-Z0-9]+)';\$", multiLine: true).allMatches(setiLess)) { | 
						|
    codePoints[match.group(1)!] = '0x${match.group(2)!}'; | 
						|
  } | 
						|
 | 
						|
  for (final match | 
						|
      in RegExp('^(${colors.keys.join('|')}): #([a-f0-9]+);\$', multiLine: true).allMatches(uiVariablesLess)) { | 
						|
    final colorName = match.group(1)!; | 
						|
    final hexCode = match.group(2)!; | 
						|
    assert(hexCode.length == 6, 'CSS hex color needs to be six characters long'); | 
						|
    colors[colorName] = '0xff$hexCode'; | 
						|
  } | 
						|
 | 
						|
  final code = <String>[ | 
						|
    '// THIS CODE IS GENERATED - DO NOT EDIT MANUALLY', | 
						|
    '', | 
						|
    "import 'package:file_icons/src/meta.dart';", | 
						|
    "import 'package:flutter/widgets.dart';", | 
						|
    '', | 
						|
    '// Code points', | 
						|
    // This filters unused codepoints. | 
						|
    for (final type in codePoints.keys | 
						|
        .where((final type) => iconSet.keys.map((final pattern) => iconSet[pattern]![0] == type).contains(true))) ...[ | 
						|
      'const ${_toVariableName(type)} = ${codePoints[type]};', | 
						|
    ], | 
						|
    '', | 
						|
    '// Colors', | 
						|
    for (final colorName in colors.keys) ...[ | 
						|
      'const ${_toVariableName(colorName)} = ${colors[colorName]};', | 
						|
    ], | 
						|
    '', | 
						|
    "const _fontFamily = 'Seti';", | 
						|
    "const _fontPackage = 'file_icons';", | 
						|
    '', | 
						|
    '/// Mapping between file extensions and [IconData] and color', | 
						|
    'const iconSetMap = {', | 
						|
    // This filters icons where the code points are missing. That indicates the fonts in seti-ui are not up-to-date. | 
						|
    // Run `gulp icons` in the seti-ui repository and everything should be there. | 
						|
    // Please submit the changes upstream if you can. | 
						|
    for (final pattern in iconSet.keys.where((final pattern) => codePoints.keys.contains(iconSet[pattern]![0]))) ...[ | 
						|
      "  '$pattern': SetiMeta(", | 
						|
      '    IconData(', | 
						|
      '      ${_toVariableName(iconSet[pattern]![0])},', | 
						|
      '      fontFamily: _fontFamily,', | 
						|
      '      fontPackage: _fontPackage,', | 
						|
      '    ),', | 
						|
      '    ${_toVariableName(iconSet[pattern]![1])},', | 
						|
      '  ),', | 
						|
    ], | 
						|
    '};', | 
						|
    '', | 
						|
  ]; | 
						|
 | 
						|
  final missingCodePoints = iconSet.keys.where((final pattern) => !codePoints.keys.contains(iconSet[pattern]![0])); | 
						|
  if (missingCodePoints.isNotEmpty) { | 
						|
    print( | 
						|
      'WARNING: Missing code points for ${missingCodePoints.map((final pattern) => iconSet[pattern]![0]).toSet().join(', ')}', | 
						|
    ); | 
						|
  } | 
						|
 | 
						|
  File( | 
						|
    p.join( | 
						|
      'lib', | 
						|
      'src', | 
						|
      'data.dart', | 
						|
    ), | 
						|
  ).writeAsStringSync(code.join('\n')); | 
						|
} | 
						|
 | 
						|
String _toVariableName(final String key) { | 
						|
  final result = StringBuffer('_'); | 
						|
 | 
						|
  final parts = key.split(''); | 
						|
  for (var i = 0; i < parts.length; i++) { | 
						|
    var char = parts[i]; | 
						|
    final prevChar = i > 0 ? parts[i - 1] : null; | 
						|
    if (char == '@' || char == '-' || char == '_') { | 
						|
      continue; | 
						|
    } | 
						|
    if (prevChar == '-' || prevChar == '_') { | 
						|
      char = char.toUpperCase(); | 
						|
    } | 
						|
    if (i == 0) { | 
						|
      char = char.toLowerCase(); | 
						|
    } | 
						|
    result.write(char); | 
						|
  } | 
						|
 | 
						|
  return result.toString(); | 
						|
}
 | 
						|
 |