mirror of
https://github.com/ryanoasis/nerd-fonts.git
synced 2024-12-07 17:06:25 +02:00
102 lines
3.0 KiB
Python
102 lines
3.0 KiB
Python
from __future__ import print_function
|
|
import os
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import xml.etree.ElementTree as ET
|
|
import yaml
|
|
|
|
XMLNS = {'nuspec': 'http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd'}
|
|
|
|
|
|
def pwd():
|
|
""" Current dir of the script. """
|
|
return os.path.realpath(os.path.dirname(sys.argv[0]))
|
|
|
|
|
|
def kebab_case(inp):
|
|
""" Convert from `CamelCase` to `kebab-case`. """
|
|
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1-\2', inp)
|
|
return re.sub('([a-z0-9])([A-Z])', r'\1-\2', s1).lower()
|
|
|
|
|
|
def generate_nuspec(font, version):
|
|
""" Write the `.nuspec` file. """
|
|
font_id = kebab_case(font) + '-nerd-font'
|
|
# Parse the tree
|
|
tree = ET.parse('base.nuspec')
|
|
root = tree.getroot()
|
|
# id
|
|
id_ = root[0].find('nuspec:id', namespaces=XMLNS)
|
|
id_.text = font_id
|
|
# version
|
|
ver_ = root[0].find('nuspec:version', namespaces=XMLNS)
|
|
ver_.text = version
|
|
# title
|
|
title_ = root[0].find('nuspec:title', namespaces=XMLNS)
|
|
title_.text = font + ' Nerd Font'
|
|
|
|
font_dir = os.path.join(pwd(), font_id)
|
|
if not os.path.exists(font_dir):
|
|
os.mkdir(font_dir)
|
|
|
|
with open(os.path.join(font_dir, font_id + '.nuspec'), 'wb') as f:
|
|
f.write(ET.tostring(root, encoding='utf8'))
|
|
|
|
# Copy tools
|
|
tools_src_dir = os.path.join(pwd(), 'tools')
|
|
tools_dest_dir = os.path.join(font_dir, 'tools')
|
|
if os.path.exists(tools_dest_dir):
|
|
shutil.rmtree(tools_dest_dir)
|
|
shutil.copytree(tools_src_dir, tools_dest_dir)
|
|
|
|
|
|
def generate_choco_scripts(font, version, sha256_hash, installed_fonts):
|
|
""" Generates chocolatey install and uninstall scripts """
|
|
# Install script
|
|
font_id = kebab_case(font)
|
|
tools_dir = os.path.join(pwd(), font_id + '-nerd-font', 'tools')
|
|
with open(os.path.join(tools_dir, 'chocolateyinstall.ps1'), 'r+') as f:
|
|
script = f.read()
|
|
script = script.format(
|
|
font=font,
|
|
version='v%s' % (version),
|
|
hash=sha256_hash)
|
|
f.seek(0)
|
|
f.write(script)
|
|
|
|
with open(os.path.join(tools_dir, 'chocolateybeforemodify.ps1'), 'r+') as f:
|
|
script = f.read()
|
|
script = script.format(fonts=','.join('"%s"' % (x) for x in installed_fonts))
|
|
f.seek(0)
|
|
f.write(script)
|
|
|
|
|
|
def main():
|
|
""" Generate chocolatey `.nuspec` files. """
|
|
|
|
print('Reading config')
|
|
with open('fonts.yml') as f:
|
|
config = yaml.load(f)
|
|
|
|
# generate `.nuspec`
|
|
for font in config['fonts']:
|
|
print('Generating chocolatey package for', font['name'])
|
|
generate_nuspec(font['name'], config['version'])
|
|
generate_choco_scripts(font['name'], config['version'], font['sha256'],
|
|
font['installed_fonts'])
|
|
|
|
# create choco `.nupkg` package
|
|
for dir_ in os.listdir(pwd()):
|
|
if os.path.isdir(dir_) and dir_ != 'tools':
|
|
subprocess.call
|
|
print('Packaging', dir_)
|
|
subprocess.call(['choco', 'pack'], cwd=os.path.join(pwd(), dir_))
|
|
|
|
print('Done')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|