generate.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. from subprocess import call
  2. import os
  3. import json
  4. BUILDER_PATH = os.path.dirname(os.path.abspath(__file__))
  5. ROOT_PATH = os.path.join(BUILDER_PATH, '..')
  6. FONTS_FOLDER_PATH = os.path.join(ROOT_PATH, 'fonts')
  7. CSS_FOLDER_PATH = os.path.join(ROOT_PATH, 'css')
  8. SCSS_FOLDER_PATH = os.path.join(ROOT_PATH, 'scss')
  9. LESS_FOLDER_PATH = os.path.join(ROOT_PATH, 'less')
  10. def main():
  11. generate_font_files()
  12. data = get_build_data()
  13. rename_svg_glyph_names(data)
  14. generate_scss(data)
  15. generate_less(data)
  16. generate_cheatsheet(data)
  17. generate_component_json(data)
  18. generate_composer_json(data)
  19. generate_bower_json(data)
  20. def generate_font_files():
  21. print "Generate Fonts"
  22. cmd = "fontforge -script %s/scripts/generate_font.py" % (BUILDER_PATH)
  23. call(cmd, shell=True)
  24. def rename_svg_glyph_names(data):
  25. # hacky and slow (but safe) way to rename glyph-name attributes
  26. svg_path = os.path.join(FONTS_FOLDER_PATH, 'ionicons.svg')
  27. svg_file = open(svg_path, 'r+')
  28. svg_text = svg_file.read()
  29. svg_file.seek(0)
  30. for ionicon in data['icons']:
  31. # uniF2CA
  32. org_name = 'uni%s' % (ionicon['code'].replace('0x', '').upper())
  33. ion_name = 'ion-%s' % (ionicon['name'])
  34. svg_text = svg_text.replace(org_name, ion_name)
  35. svg_file.write(svg_text)
  36. svg_file.close()
  37. def generate_less(data):
  38. print "Generate LESS"
  39. font_name = data['name']
  40. font_version = data['version']
  41. css_prefix = data['prefix']
  42. variables_file_path = os.path.join(LESS_FOLDER_PATH, '_ionicons-variables.less')
  43. icons_file_path = os.path.join(LESS_FOLDER_PATH, '_ionicons-icons.less')
  44. d = []
  45. d.append('/*!');
  46. d.append('Ionicons, v%s' % (font_version) );
  47. d.append('Created by Ben Sperry for the Ionic Framework, http://ionicons.com/');
  48. d.append('https://twitter.com/benjsperry https://twitter.com/ionicframework');
  49. d.append('MIT License: https://github.com/driftyco/ionicons');
  50. d.append('*/');
  51. d.append('// Ionicons Variables')
  52. d.append('// --------------------------\n')
  53. d.append('@ionicons-font-path: "../fonts";')
  54. d.append('@ionicons-font-family: "%s";' % (font_name) )
  55. d.append('@ionicons-version: "%s";' % (font_version) )
  56. d.append('@ionicons-prefix: %s;' % (css_prefix) )
  57. d.append('')
  58. for ionicon in data['icons']:
  59. chr_code = ionicon['code'].replace('0x', '\\')
  60. d.append('@ionicon-var-%s: "%s";' % (ionicon['name'], chr_code) )
  61. f = open(variables_file_path, 'w')
  62. f.write( '\n'.join(d) )
  63. f.close()
  64. d = []
  65. d.append('// Ionicons Icons')
  66. d.append('// --------------------------\n')
  67. group = [ '.%s' % (data['name'].lower()) ]
  68. for ionicon in data['icons']:
  69. group.append('.@{ionicons-prefix}%s:before' % (ionicon['name']) )
  70. d.append( ',\n'.join(group) )
  71. d.append('{')
  72. d.append(' &:extend(.ion);')
  73. d.append('}')
  74. for ionicon in data['icons']:
  75. chr_code = ionicon['code'].replace('0x', '\\')
  76. d.append('.@{ionicons-prefix}%s:before { content: @ionicon-var-%s; }' % (ionicon['name'], ionicon['name']) )
  77. f = open(icons_file_path, 'w')
  78. f.write( '\n'.join(d) )
  79. f.close()
  80. def generate_scss(data):
  81. print "Generate SCSS"
  82. font_name = data['name']
  83. font_version = data['version']
  84. css_prefix = data['prefix']
  85. variables_file_path = os.path.join(SCSS_FOLDER_PATH, '_ionicons-variables.scss')
  86. icons_file_path = os.path.join(SCSS_FOLDER_PATH, '_ionicons-icons.scss')
  87. d = []
  88. d.append('// Ionicons Variables')
  89. d.append('// --------------------------\n')
  90. d.append('$ionicons-font-path: "../fonts" !default;')
  91. d.append('$ionicons-font-family: "%s" !default;' % (font_name) )
  92. d.append('$ionicons-version: "%s" !default;' % (font_version) )
  93. d.append('$ionicons-prefix: %s !default;' % (css_prefix) )
  94. d.append('')
  95. for ionicon in data['icons']:
  96. chr_code = ionicon['code'].replace('0x', '\\')
  97. d.append('$ionicon-var-%s: "%s";' % (ionicon['name'], chr_code) )
  98. f = open(variables_file_path, 'w')
  99. f.write( '\n'.join(d) )
  100. f.close()
  101. d = []
  102. d.append('// Ionicons Icons')
  103. d.append('// --------------------------\n')
  104. group = [ '.%s' % (data['name'].lower()) ]
  105. for ionicon in data['icons']:
  106. group.append('.#{$ionicons-prefix}%s:before' % (ionicon['name']) )
  107. d.append( ',\n'.join(group) )
  108. d.append('{')
  109. d.append(' @extend .ion;')
  110. d.append('}')
  111. for ionicon in data['icons']:
  112. chr_code = ionicon['code'].replace('0x', '\\')
  113. d.append('.#{$ionicons-prefix}%s:before { content: $ionicon-var-%s; }' % (ionicon['name'], ionicon['name']) )
  114. f = open(icons_file_path, 'w')
  115. f.write( '\n'.join(d) )
  116. f.close()
  117. generate_css_from_scss(data)
  118. def generate_css_from_scss(data):
  119. print "Generate CSS From SCSS"
  120. scss_file_path = os.path.join(SCSS_FOLDER_PATH, 'ionicons.scss')
  121. css_file_path = os.path.join(CSS_FOLDER_PATH, 'ionicons.css')
  122. css_min_file_path = os.path.join(CSS_FOLDER_PATH, 'ionicons.min.css')
  123. cmd = "sass %s %s --style compact" % (scss_file_path, css_file_path)
  124. call(cmd, shell=True)
  125. print "Generate Minified CSS From SCSS"
  126. cmd = "sass %s %s --style compressed" % (scss_file_path, css_min_file_path)
  127. call(cmd, shell=True)
  128. def generate_cheatsheet(data):
  129. print "Generate Cheatsheet"
  130. cheatsheet_file_path = os.path.join(ROOT_PATH, 'cheatsheet.html')
  131. template_path = os.path.join(BUILDER_PATH, 'cheatsheet', 'template.html')
  132. icon_row_path = os.path.join(BUILDER_PATH, 'cheatsheet', 'icon-row.html')
  133. f = open(template_path, 'r')
  134. template_html = f.read()
  135. f.close()
  136. f = open(icon_row_path, 'r')
  137. icon_row_template = f.read()
  138. f.close()
  139. content = []
  140. for ionicon in data['icons']:
  141. css_code = ionicon['code'].replace('0x', '\\')
  142. escaped_html_code = ionicon['code'].replace('0x', '&#x') + ';'
  143. html_code = ionicon['code'].replace('0x', '&#x') + ';'
  144. item_row = icon_row_template
  145. item_row = item_row.replace('{{name}}', ionicon['name'])
  146. item_row = item_row.replace('{{prefix}}', data['prefix'])
  147. item_row = item_row.replace('{{css_code}}', css_code)
  148. item_row = item_row.replace('{{escaped_html_code}}', escaped_html_code)
  149. item_row = item_row.replace('{{html_code}}', html_code)
  150. content.append(item_row)
  151. template_html = template_html.replace("{{font_name}}", data["name"])
  152. template_html = template_html.replace("{{font_version}}", data["version"])
  153. template_html = template_html.replace("{{icon_count}}", str(len(data["icons"])) )
  154. template_html = template_html.replace("{{content}}", '\n'.join(content) )
  155. f = open(cheatsheet_file_path, 'w')
  156. f.write(template_html)
  157. f.close()
  158. def generate_component_json(data):
  159. print "Generate component.json"
  160. d = {
  161. "name": data['name'],
  162. "repo": "driftyco/ionicons",
  163. "description": "The premium icon font for Ionic Framework.",
  164. "version": data['version'],
  165. "keywords": [],
  166. "dependencies": {},
  167. "development": {},
  168. "license": "MIT",
  169. "styles": [
  170. "css/%s.css" % (data['name'].lower())
  171. ],
  172. "fonts": [
  173. "fonts/%s.eot" % (data['name'].lower()),
  174. "fonts/%s.svg" % (data['name'].lower()),
  175. "fonts/%s.ttf" % (data['name'].lower()),
  176. "fonts/%s.woff" % (data['name'].lower())
  177. ]
  178. }
  179. txt = json.dumps(d, indent=4, separators=(',', ': '))
  180. component_file_path = os.path.join(ROOT_PATH, 'component.json')
  181. f = open(component_file_path, 'w')
  182. f.write(txt)
  183. f.close()
  184. def generate_composer_json(data):
  185. print "Generate composer.json"
  186. d = {
  187. "name": "driftyco/ionicons",
  188. "description": "The premium icon font for Ionic Framework.",
  189. "keywords": [ "fonts", "icon font", "icons", "ionic", "web font"],
  190. "homepage": "http://ionicons.com/",
  191. "authors": [
  192. {
  193. "name": "Ben Sperry",
  194. "email": "ben@drifty.com",
  195. "role": "Designer",
  196. "homepage": "https://twitter.com/benjsperry"
  197. },
  198. {
  199. "name": "Adam Bradley",
  200. "email": "adam@drifty.com",
  201. "role": "Developer",
  202. "homepage": "https://twitter.com/adamdbradley"
  203. },
  204. {
  205. "name": "Max Lynch",
  206. "email": "max@drifty.com",
  207. "role": "Developer",
  208. "homepage": "https://twitter.com/maxlynch"
  209. }
  210. ],
  211. "extra": {},
  212. "license": [ "MIT" ]
  213. }
  214. txt = json.dumps(d, indent=4, separators=(',', ': '))
  215. composer_file_path = os.path.join(ROOT_PATH, 'composer.json')
  216. f = open(composer_file_path, 'w')
  217. f.write(txt)
  218. f.close()
  219. def generate_bower_json(data):
  220. print "Generate bower.json"
  221. d = {
  222. "name": data['name'],
  223. "version": data['version'],
  224. "homepage": "https://github.com/driftyco/ionicons",
  225. "authors": [
  226. "Ben Sperry <ben@drifty.com>",
  227. "Adam Bradley <adam@drifty.com>",
  228. "Max Lynch <max@drifty.com>"
  229. ],
  230. "description": "Ionicons - free and beautiful icons from the creators of Ionic Framework",
  231. "main": [
  232. "css/%s.css" % (data['name'].lower()),
  233. "fonts/*"
  234. ],
  235. "keywords": [ "fonts", "icon font", "icons", "ionic", "web font"],
  236. "license": "MIT",
  237. "ignore": [
  238. "**/.*",
  239. "builder",
  240. "node_modules",
  241. "bower_components",
  242. "test",
  243. "tests"
  244. ]
  245. }
  246. txt = json.dumps(d, indent=4, separators=(',', ': '))
  247. bower_file_path = os.path.join(ROOT_PATH, 'bower.json')
  248. f = open(bower_file_path, 'w')
  249. f.write(txt)
  250. f.close()
  251. def get_build_data():
  252. build_data_path = os.path.join(BUILDER_PATH, 'build_data.json')
  253. f = open(build_data_path, 'r')
  254. data = json.loads(f.read())
  255. f.close()
  256. return data
  257. if __name__ == "__main__":
  258. main()