GenerateIconFontCppHeaders.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. # Convert Font Awesome, Fork Awesome, Google Material Design, Material Design Icons, Kenney Game and Ionicons
  2. # icon font parameters to C89, C++11 and C# compatible formats.
  3. #
  4. #------------------------------------------------------------------------------
  5. # 1 - Source material
  6. #
  7. # 1.1 - Font Awesome
  8. # 1.1.1 - version 4
  9. # https://raw.githubusercontent.com/FortAwesome/Font-Awesome/fa-4/src/icons.yml
  10. # https://github.com/FortAwesome/Font-Awesome/blob/fa-4/fonts/fontawesome-webfont.ttf
  11. # 1.1.2 - version 5
  12. # https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/advanced-options/metadata/icons.yml
  13. # https://github.com/FortAwesome/Font-Awesome/blob/master/web-fonts-with-css/webfonts/fa-brands-400.ttf
  14. # https://github.com/FortAwesome/Font-Awesome/blob/master/web-fonts-with-css/webfonts/fa-regular-400.ttf
  15. # https://github.com/FortAwesome/Font-Awesome/blob/master/web-fonts-with-css/webfonts/fa-solid-900.ttf
  16. # 1.2 - Fork Awesome
  17. # https://raw.githubusercontent.com/ForkAwesome/Fork-Awesome/master/src/icons/icons.yml
  18. # https://github.com/ForkAwesome/Fork-Awesome/blob/master/fonts/forkawesome-webfont.ttf
  19. # 1.3 - Google Material Design
  20. # https://raw.githubusercontent.com/google/material-design-icons/master/iconfont/codepoints
  21. # https://github.com/google/material-design-icons/blob/master/iconfont/MaterialIcons-Regular.ttf
  22. # 1.4 - Material Design Icons
  23. # https://raw.githubusercontent.com/Templarian/MaterialDesign-Webfont/master/css/materialdesignicons.css
  24. # https://github.com/Templarian/MaterialDesign-Webfont/blob/master/fonts/materialdesignicons-webfont.ttf
  25. # 1.5 - Kenney Game icons
  26. # https://raw.githubusercontent.com/nicodinh/kenney-icon-font/master/css/kenney-icons.css
  27. # https://github.com/nicodinh/kenney-icon-font/blob/master/fonts/kenney-icon-font.ttf
  28. # 1.6 - Ionicons
  29. # https://raw.githubusercontent.com/ionic-team/ionicons/master/src/docs/archived/v2/css/ionicons.css
  30. # https://github.com/ionic-team/ionicons/blob/master/src/docs/archived/v2/fonts/ionicons.ttf
  31. #
  32. #------------------------------------------------------------------------------
  33. # 2 - Data sample
  34. #
  35. # Font Awesome example:
  36. # - input: music:
  37. # changes:
  38. # - '1'
  39. # - 5.0.0
  40. # label: Music
  41. # search:
  42. # terms:
  43. # - note
  44. # - sound
  45. # styles:
  46. # - solid
  47. # unicode: f001
  48. # - output C++11: #define ICON_FA_MUSIC u8"\uf001"
  49. # - output C89: #define ICON_FA_MUSIC "\xEF\x80\x81"
  50. # - output C#: public const string Music = "\uf001";
  51. #
  52. # All fonts have computed min and max unicode fonts ICON_MIN and ICON_MAX
  53. # - output C89, C++11: #define ICON_MIN_FA 0xf000
  54. # #define ICON_MAX_FA 0xf2e0
  55. # - output C#: public const int IconMin = 0xf000;
  56. # public const int IconMax = 0xf2e0;
  57. #
  58. #------------------------------------------------------------------------------
  59. # 3 - Script dependencies
  60. #
  61. # 3.1 - Fonts source material online
  62. # 3.2 - Python 2.7 - https://www.python.org/download/releases/2.7/
  63. # 3.3 - Requests - http://docs.python-requests.org/
  64. # 3.4 - PyYAML - http://pyyaml.org/
  65. #
  66. #------------------------------------------------------------------------------
  67. # 4 - References
  68. #
  69. # GitHub repository: https://github.com/juliettef/IconFontCppHeaders/
  70. #
  71. #------------------------------------------------------------------------------
  72. import requests
  73. import yaml
  74. # Fonts
  75. class Font:
  76. font_name = '[ ERROR - missing font name ]'
  77. font_abbr = '[ ERROR - missing font abbreviation ]'
  78. font_url_data = '[ ERROR - missing font data url ]'
  79. font_url_ttf = '[ ERROR - missing ttf file url ]'
  80. font_file_name_ttf = '[ ERROR - missing ttf file name ]'
  81. @classmethod
  82. def get_icons( cls, input ):
  83. # intermediate representation of the fonts data, identify the min and max
  84. print( '[ ERROR - missing implementation of class method get_icons for {!s} ]'.format( cls.font_name ))
  85. icons_data = {}
  86. icons_data.update({ 'font_min' : '[ ERROR - missing font min ]',
  87. 'font_max' : '[ ERROR - missing font max ]',
  88. 'icons' : '[ ERROR - missing list of pairs [ font icon name, code ]]' })
  89. return icons_data
  90. @classmethod
  91. def download( cls ):
  92. input_raw = ''
  93. response = requests.get( cls.font_url_data, timeout = 2 )
  94. if response.status_code == 200:
  95. input_raw = response.content
  96. print( 'Downloaded - ' + cls.font_name )
  97. else:
  98. raise Exception( 'Download failed - ' + cls.font_name )
  99. return input_raw
  100. @classmethod
  101. def get_intermediate_representation( cls ):
  102. font_ir = {}
  103. input_raw = cls.download()
  104. if input_raw:
  105. icons_data = cls.get_icons( input_raw )
  106. font_ir.update( icons_data )
  107. font_ir.update({ 'font_url_ttf' : cls.font_url_ttf,
  108. 'font_url_data' : cls.font_url_data,
  109. 'font_file_name_ttf' : cls.font_file_name_ttf,
  110. 'font_name' : cls.font_name,
  111. 'font_abbr' : cls.font_abbr })
  112. print( 'Generated intermediate data - ' + cls.font_name )
  113. return font_ir
  114. class FontFA4( Font ): # legacy Font Awesome version 4
  115. font_name = 'Font Awesome 4'
  116. font_abbr = 'FA'
  117. font_url_data = 'https://raw.githubusercontent.com/FortAwesome/Font-Awesome/fa-4/src/icons.yml'
  118. font_url_ttf = 'https://github.com/FortAwesome/Font-Awesome/blob/fa-4/fonts/fontawesome-webfont.ttf'
  119. font_file_name_ttf = [[ font_abbr, font_url_ttf[ font_url_ttf.rfind('/')+1: ]]]
  120. @classmethod
  121. def get_icons( self, input ):
  122. icons_data = { }
  123. data = yaml.safe_load(input)
  124. font_min = 'ffff'
  125. font_max = '0'
  126. icons = []
  127. for item in data[ 'icons' ]:
  128. if item[ 'unicode' ] < font_min:
  129. font_min = item[ 'unicode' ]
  130. if item[ 'unicode' ] >= font_max:
  131. font_max = item[ 'unicode' ]
  132. icons.append([ item[ 'id' ], item[ 'unicode' ]])
  133. icons_data.update({ 'font_min' : font_min,
  134. 'font_max' : font_max,
  135. 'icons' : icons })
  136. return icons_data
  137. class FontFK( FontFA4 ): # Fork Awesome, based on Font Awesome 4
  138. font_name = 'Fork Awesome'
  139. font_abbr = 'FK'
  140. font_url_data = 'https://raw.githubusercontent.com/ForkAwesome/Fork-Awesome/master/src/icons/icons.yml'
  141. font_url_ttf = 'https://github.com/ForkAwesome/Fork-Awesome/blob/master/fonts/forkawesome-webfont.ttf'
  142. class FontFA5( Font ): # Font Awesome version 5. Solid and Regular styles (Regular is a subset of Solid).
  143. font_name = 'Font Awesome 5'
  144. font_abbr = 'FA'
  145. font_url_data = 'https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/advanced-options/metadata/icons.yml'
  146. font_url_ttf = 'https://github.com/FortAwesome/Font-Awesome/blob/master/web-fonts-with-css/webfonts/fa-solid-900.ttf, ' +\
  147. 'https://github.com/FortAwesome/Font-Awesome/blob/master/web-fonts-with-css/webfonts/fa-regular-400.ttf, '
  148. font_file_name_ttf = [[ 'FAS', 'fa-solid-900.ttf' ], [ 'FAR', 'fa-regular-400.ttf' ]]
  149. font_fa_style = [ 'solid', 'regular' ]
  150. @classmethod
  151. def get_icons( self, input ):
  152. icons_data = { }
  153. data = yaml.safe_load(input)
  154. if data:
  155. font_min = 'ffff'
  156. font_max = '0'
  157. icons = []
  158. for key in data:
  159. item = data[ key ]
  160. for style in item[ 'styles' ]:
  161. if style in self.font_fa_style:
  162. if [ key, item[ 'unicode' ]] not in icons:
  163. if item[ 'unicode' ] < font_min:
  164. font_min = item[ 'unicode' ]
  165. if item[ 'unicode' ] >= font_max:
  166. font_max = item[ 'unicode' ]
  167. icons.append([ key, item[ 'unicode' ] ])
  168. icons_data.update({ 'font_min':font_min, 'font_max':font_max, 'icons':icons })
  169. return icons_data
  170. class FontFA5Brands( FontFA5 ): # Font Awesome version 5, Brand styles.
  171. font_name = 'Font Awesome 5 Brands'
  172. font_abbr = 'FAB'
  173. font_url_ttf = 'https://github.com/FortAwesome/Font-Awesome/blob/master/web-fonts-with-css/webfonts/fa-brands-400.ttf'
  174. font_file_name_ttf = [[ font_abbr, font_url_ttf[ font_url_ttf.rfind('/') + 1: ]]]
  175. font_fa_style = [ 'brands' ]
  176. @classmethod
  177. def get_icons( self, input ):
  178. icons_data = { }
  179. data = yaml.safe_load(input)
  180. if data:
  181. font_min = 'ffff'
  182. font_max = '0'
  183. icons = [ ]
  184. for key in data:
  185. item = data[ key ]
  186. for style in item[ 'styles' ]:
  187. if style in self.font_fa_style:
  188. if item[ 'unicode' ] < font_min:
  189. font_min = item[ 'unicode' ]
  190. if item[ 'unicode' ] >= font_max:
  191. font_max = item[ 'unicode' ]
  192. icons.append([ key, item[ 'unicode' ]])
  193. icons_data.update({ 'font_min':font_min, 'font_max':font_max, 'icons':icons })
  194. return icons_data
  195. class FontMD( Font ): # Material Design
  196. font_name = 'Material Design'
  197. font_abbr = 'MD'
  198. font_url_data = 'https://raw.githubusercontent.com/google/material-design-icons/master/iconfont/codepoints'
  199. font_url_ttf = 'https://github.com/google/material-design-icons/blob/master/iconfont/MaterialIcons-Regular.ttf'
  200. font_file_name_ttf = [[ font_abbr, font_url_ttf[ font_url_ttf.rfind('/')+1: ]]]
  201. @classmethod
  202. def get_icons( self, input ):
  203. icons_data = {}
  204. lines = str.split( input, '\n' )
  205. if lines:
  206. font_min = 'ffff'
  207. font_max = '0'
  208. icons = []
  209. for line in lines :
  210. words = str.split(line)
  211. if words and len( words ) >= 2:
  212. if words[ 1 ] < font_min:
  213. font_min = words[ 1 ]
  214. if words[ 1 ] >= font_max:
  215. font_max = words[ 1 ]
  216. icons.append( words )
  217. icons_data.update({ 'font_min' : font_min,
  218. 'font_max' : font_max,
  219. 'icons' : icons })
  220. return icons_data
  221. class FontMDI( Font ): # Material Design Icons
  222. font_name = 'Material Design Icons'
  223. font_abbr = 'MDI'
  224. font_url_data = 'https://raw.githubusercontent.com/Templarian/MaterialDesign-Webfont/master/css/materialdesignicons.css'
  225. font_url_ttf = 'https://github.com/Templarian/MaterialDesign-Webfont/blob/master/fonts/materialdesignicons-webfont.ttf'
  226. font_file_name_ttf = [[ font_abbr, font_url_ttf[ font_url_ttf.rfind('/')+1: ]]]
  227. @classmethod
  228. def get_icons( self, input ):
  229. icons_data = {}
  230. input_trimmed = input[ input.find( '-moz-osx-font-smoothing: grayscale;\n}\n\n' ) + len( '-moz-osx-font-smoothing: grayscale;\n}\n\n' ) : input.find( '.mdi-18px.mdi-set,' )]
  231. lines = str.split( input_trimmed, '}\n\n' )
  232. if lines:
  233. font_min = 'ffff'
  234. font_max = '0'
  235. icons = []
  236. for line in lines :
  237. if '.mdi-' in line:
  238. words = str.split(line)
  239. if words and '.mdi-' in words[ 0 ]:
  240. font_id = words[ 0 ].partition( '.mdi-' )[2].partition( ':before' )[0]
  241. font_code = words[ 3 ].partition( '"\\' )[2].partition( '";' )[0]
  242. if font_code < font_min:
  243. font_min = font_code
  244. if font_code >= font_max:
  245. font_max = font_code
  246. icons.append([ font_id, font_code ])
  247. icons_data.update({ 'font_min' : font_min,
  248. 'font_max' : font_max,
  249. 'icons' : icons })
  250. return icons_data
  251. class FontKI( Font ): # Kenney Game icons
  252. font_name = 'Kenney'
  253. font_abbr = 'KI'
  254. font_url_data = 'https://raw.githubusercontent.com/nicodinh/kenney-icon-font/master/css/kenney-icons.css'
  255. font_url_ttf = 'https://github.com/nicodinh/kenney-icon-font/blob/master/fonts/kenney-icon-font.ttf'
  256. font_file_name_ttf = [[ font_abbr, font_url_ttf[ font_url_ttf.rfind('/')+1: ]]]
  257. @classmethod
  258. def get_icons( self, input ):
  259. icons_data = {}
  260. lines = str.split( input, '\n' )
  261. if lines:
  262. font_min = 'ffff'
  263. font_max = '0'
  264. icons = []
  265. for line in lines :
  266. if '.ki-' in line:
  267. words = str.split(line)
  268. if words and '.ki-' in words[ 0 ]:
  269. font_id = words[ 0 ].partition( '.ki-' )[2].partition( ':before' )[0]
  270. font_code = words[ 2 ].partition( '"\\' )[2].partition( '";' )[0]
  271. if font_code < font_min:
  272. font_min = font_code
  273. if font_code >= font_max:
  274. font_max = font_code
  275. icons.append([ font_id, font_code ])
  276. icons_data.update({ 'font_min' : font_min,
  277. 'font_max' : font_max,
  278. 'icons' : icons })
  279. return icons_data
  280. class FontII( Font ): # Ionicons
  281. font_name = 'Ionicons'
  282. font_abbr = 'II'
  283. font_url_data = 'https://raw.githubusercontent.com/ionic-team/ionicons/master/src/docs/archived/v2/css/ionicons.css'
  284. font_url_ttf = 'https://github.com/ionic-team/ionicons/blob/master/src/docs/archived/v2/fonts/ionicons.ttf'
  285. font_file_name_ttf = [[ font_abbr, font_url_ttf[ font_url_ttf.rfind('/') + 1: ]]]
  286. @classmethod
  287. def get_icons( self, input ):
  288. icons_data = {}
  289. lines = str.split( input, '\n' )
  290. if lines:
  291. font_min = 'ffff'
  292. font_max = '0'
  293. icons = []
  294. for line in lines :
  295. if ( '.ion-' and 'content:' ) in line:
  296. words = str.split(line)
  297. if words and '.ion-' in words[ 0 ]:
  298. font_id = words[ 0 ].partition( '.ion-' )[2].partition( ':before' )[0]
  299. font_code = words[ 3 ].partition( '"\\' )[2].partition( '";' )[0]
  300. if font_code < font_min:
  301. font_min = font_code
  302. if font_code >= font_max:
  303. font_max = font_code
  304. icons.append([ font_id, font_code ])
  305. icons_data.update({ 'font_min' : font_min,
  306. 'font_max' : font_max,
  307. 'icons' : icons })
  308. return icons_data
  309. # Languages
  310. class Language:
  311. language_name = '[ ERROR - missing language name ]'
  312. file_name = '[ ERROR - missing file name ]'
  313. intermediate = {}
  314. def __init__( self, intermediate ):
  315. self.intermediate = intermediate
  316. @classmethod
  317. def prelude( cls ):
  318. print('[ ERROR - missing implementation of class method prelude for {!s} ]'.format( cls.language_name ))
  319. result = '[ ERROR - missing prelude ]'
  320. return result
  321. @classmethod
  322. def lines_minmax( cls ):
  323. print('[ ERROR - missing implementation of class method lines_minmax for {!s} ]'.format( cls.language_name ))
  324. result = '[ ERROR - missing min and max ]'
  325. return result
  326. @classmethod
  327. def line_icon( cls, icon ):
  328. print('[ ERROR - missing implementation of class method line_icon for {!s} ]'.format( cls.language_name ))
  329. result = '[ ERROR - missing icon line ]'
  330. return result
  331. @classmethod
  332. def epilogue( cls ):
  333. return ''
  334. @classmethod
  335. def convert( cls ):
  336. result = cls.prelude() + cls.lines_minmax()
  337. for icon in cls.intermediate.get( 'icons' ):
  338. line_icon = cls.line_icon( icon )
  339. result += line_icon
  340. result += cls.epilogue()
  341. print ( 'Converted - {!s} for {!s}' ).format( cls.intermediate.get( 'font_name' ), cls.language_name )
  342. return result
  343. @classmethod
  344. def save_to_file( cls ):
  345. filename = cls.file_name.format( name = str.lower(cls.intermediate.get( 'font_name' )).replace( ' ', '_' ))
  346. converted = cls.convert()
  347. with open( filename, 'w' ) as f:
  348. f.write( converted )
  349. print( 'Saved - {!s}' ).format( filename )
  350. class LanguageC89( Language ):
  351. language_name = 'C89'
  352. file_name = 'icons_{name}.h'
  353. @classmethod
  354. def prelude( cls ):
  355. tmpl_prelude = '// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py for language {lang}\n' + \
  356. '// from {url_data}\n' + \
  357. '// for use with {url_ttf}\n' + \
  358. '#pragma once\n\n'
  359. result = tmpl_prelude.format(lang = cls.language_name,
  360. url_data = cls.intermediate.get( 'font_url_data' ),
  361. url_ttf = cls.intermediate.get( 'font_url_ttf' ))
  362. tmpl_prelude_define_file_name = '#define FONT_ICON_FILE_NAME_{font_abbr} "{file_name_ttf}"\n'
  363. file_names_ttf = cls.intermediate.get( 'font_file_name_ttf' )
  364. for file_name_ttf in file_names_ttf:
  365. result += tmpl_prelude_define_file_name.format( font_abbr = file_name_ttf[ 0 ], file_name_ttf = file_name_ttf[ 1 ])
  366. return result + '\n'
  367. @classmethod
  368. def lines_minmax( cls ):
  369. tmpl_line_minmax = '#define ICON_{minmax}_{abbr} 0x{val}\n'
  370. result = tmpl_line_minmax.format(minmax = 'MIN',
  371. abbr = cls.intermediate.get( 'font_abbr' ),
  372. val = cls.intermediate.get( 'font_min' )) + \
  373. tmpl_line_minmax.format(minmax = 'MAX',
  374. abbr = cls.intermediate.get( 'font_abbr' ),
  375. val = cls.intermediate.get( 'font_max' ))
  376. return result
  377. @classmethod
  378. def line_icon( cls, icon ):
  379. tmpl_line_icon = '#define ICON_{abbr}_{icon} "{code}"\n'
  380. icon_name = str.upper( icon[ 0 ]).replace( '-', '_' )
  381. code_base = ''.join([ '{0:x}'.format( ord( x )) for x in unichr( int( icon[ 1 ], 16 )).encode( 'utf-8' )]).upper()
  382. icon_code = '\\x' + code_base[ :2 ] + '\\x' + code_base[ 2:4 ] + '\\x' + code_base[ 4: ]
  383. result = tmpl_line_icon.format( abbr = cls.intermediate.get( 'font_abbr' ),
  384. icon = icon_name,
  385. code = icon_code )
  386. return result
  387. class LanguageCpp11( LanguageC89 ):
  388. language_name = 'C++11'
  389. file_name = 'Icons{name}.h'
  390. @classmethod
  391. def line_icon( cls, icon ):
  392. tmpl_line_icon = '#define ICON_{abbr}_{icon} u8"\u{code}"\n'
  393. icon_name = str.upper( icon[ 0 ]).replace( '-', '_' )
  394. icon_code = icon[ 1 ]
  395. result = tmpl_line_icon.format( abbr = cls.intermediate.get( 'font_abbr' ),
  396. icon = icon_name,
  397. code = icon_code)
  398. return result
  399. class LanguageCSharp( Language ):
  400. language_name = "C#"
  401. file_name = 'Icons{name}.cs'
  402. @classmethod
  403. def prelude( cls ):
  404. tmpl_prelude = '// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py for language {lang}\n' + \
  405. '// from {url_data}\n' + \
  406. '// for use with {url_ttf}\n' + \
  407. 'namespace IconFonts\n' + \
  408. '{{\n' + \
  409. ' public class {font_name}\n' + \
  410. ' {{\n'
  411. result = tmpl_prelude.format(lang = cls.language_name,
  412. url_data = cls.intermediate.get( 'font_url_data' ),
  413. url_ttf = cls.intermediate.get( 'font_url_ttf' ),
  414. font_name = cls.intermediate.get( 'font_name' ).replace( ' ', '' )
  415. )
  416. tmpl_prelude_define_file_name = ' public const string FontIconFileName = "{file_name_ttf}";\n'
  417. file_names_ttf = cls.intermediate.get( 'font_file_name_ttf' )
  418. for file_name_ttf in file_names_ttf:
  419. result += tmpl_prelude_define_file_name.format( file_name_ttf = file_name_ttf[ 1 ])
  420. return result + '\n'
  421. @classmethod
  422. def epilogue( cls ):
  423. return ' }\n' + \
  424. '}\n'
  425. @classmethod
  426. def lines_minmax( cls ):
  427. tmpl_line_minmax = ' public const int Icon{minmax} = 0x{val};\n'
  428. result = tmpl_line_minmax.format(minmax = 'Min',
  429. val = cls.intermediate.get( 'font_min' )) + \
  430. tmpl_line_minmax.format(minmax = 'Max',
  431. val = cls.intermediate.get( 'font_max' ))
  432. return result
  433. @classmethod
  434. def line_icon( cls, icon ):
  435. tmpl_line_icon = ' public const string {icon} = "\u{code}";\n'
  436. icon_name = cls.to_camelcase(icon[ 0 ])
  437. icon_code = icon[ 1 ]
  438. if icon_name[ 0 ].isdigit():
  439. # Variable may not start with a digit
  440. icon_name = 'The' + icon_name
  441. if icon_name == cls.intermediate.get( 'font_name' ).replace( ' ', '' ):
  442. # Member may not have same name as enclosing class
  443. icon_name += 'Icon'
  444. result = tmpl_line_icon.format( icon = icon_name,
  445. code = icon_code)
  446. return result
  447. @classmethod
  448. def to_camelcase( cls, text ):
  449. parts = text.split( '-' )
  450. for i in range( len( parts ) ):
  451. p = parts[i]
  452. parts[ i ] = p[ 0 ].upper() + p[ 1: ].lower()
  453. return ''.join( parts )
  454. # Main
  455. fonts = [ FontFA4, FontFA5, FontFA5Brands, FontFK, FontMD, FontMDI, FontKI, FontII ]
  456. languages = [ LanguageC89 ]
  457. intermediates = []
  458. for font in fonts:
  459. try:
  460. font_intermediate = font.get_intermediate_representation()
  461. intermediates.append( font_intermediate )
  462. except Exception as e:
  463. print( '[ ERROR: {!s} ]'.format( e ))
  464. for interm in intermediates:
  465. Language.intermediate = interm
  466. for lang in languages:
  467. lang.save_to_file()