diff --git a/.github/workflows/packsvgs.yml b/.github/workflows/packsvgs.yml new file mode 100644 index 000000000..e6e083422 --- /dev/null +++ b/.github/workflows/packsvgs.yml @@ -0,0 +1,83 @@ +name: PackSVGs + +on: + push: + paths: + - 'src/svgs/*' + - 'bin/scripts/generate-original-source.py' + - 'bin/scripts/optimize-original-source.sh' + workflow_dispatch: + +jobs: + create-symbols-font: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - name: Fetch dependencies + run: | + sudo apt update -y -q + # ttfdump comes with texlive-binaries + # We use ttfdump instead of showttf, because the later core dumps at the moment + sudo apt install python3-fontforge inkscape texlive-binaries dc -y -q + + - name: Simplify the SVGs + id: optimize + run: | + cd bin/scripts + ./optimize-original-source.sh doit | tee optlog.txt + changenum=$(tail -n 1 optlog.txt | sed -E 's/[^0-9]*([0-9]+).*/\1/') + echo "Script claims number of changed files: ${changenum}" + echo "::set-output name=num_of_files::${changenum}" + + - name: Commit simplified SVGs back to repo + if: steps.optimize.outputs.num_of_files > 0 + uses: EndBug/add-and-commit@v9 + with: + fetch: false + add: 'src/svgs' + message: "[ci] Simplify original-source source glyphs" + committer_name: GitHub Actions + committer_email: 41898282+github-actions[bot]@users.noreply.github.com + + - name: Dummy create Seti-and-original-symbols font and CHECK FOR CHANGES + id: compare_font + run: | + cd bin/scripts + echo "OLD_FONT_LS=$(ls -l ../../src/glyphs/original-source.otf)" >> $GITHUB_ENV + # First we create a 'test' font with the same timestamp as the old to see if + # there are any differences (apart from the timestamp) + export CURRENT_FONT_DATE=$(ttfdump -t head ../../src/glyphs/original-source.otf | \ + grep -E '[^a-z]created:.*0x' | sed 's/.*x//' | tr 'a-f' 'A-F') + echo "Font creation date (1904): 0x${CURRENT_FONT_DATE}" + # The timestamp in the HEAD table is given in 1904 seconds, we convert that + # to 1970 (unix) seconds. + export SOURCE_DATE_EPOCH=$(dc -e "16i ${CURRENT_FONT_DATE} Ai 86400 24107 * - p") + echo "Font creation date (1970): ${SOURCE_DATE_EPOCH}" + echo "Create font with previous timestamp" + ./generate-original-source.py + # Check if the new font file has changed + CHANGE=$(git diff --quiet ../../src/glyphs/original-source.otf && echo false || echo true) + echo "Change detected: ${CHANGE}" + echo "::set-output name=changed::${CHANGE}" + + - name: Create Seti-and-original-symbols font for real with current timestamp + if: steps.compare_font.outputs.changed == 'true' + run: | + cd bin/scripts + echo "Create font with current timestamp" + # We need to force creation and modification timestamp to be identical + # to make the compare_font step work next time + export SOURCE_DATE_EPOCH=$(date +%s) + ./generate-original-source.py + echo "${OLD_FONT_LS}" + ls -l ../../src/glyphs/original-source.otf + + - name: Commit created font back to repo + if: steps.compare_font.outputs.changed == 'true' + uses: EndBug/add-and-commit@v9 + with: + fetch: false + add: 'src/glyphs/original-source.otf' + message: "[ci] Rebuild original-source font" + committer_name: GitHub Actions + committer_email: 41898282+github-actions[bot]@users.noreply.github.com diff --git a/bin/scripts/README.md b/bin/scripts/README.md new file mode 100644 index 000000000..ef6d2433c --- /dev/null +++ b/bin/scripts/README.md @@ -0,0 +1,36 @@ +### Contents + +Note: Usually you need to call the scripts in this directory while actually being in this directory (i.e. `pwd = .../nerd-fonts/bin/scripts`). + +* `archive-font-patcher.sh`: Archives the font patcher script and subscripts and the required source glyph files [1] +* `archive-fonts.sh`: Creates the release zip file of one or more font(s) from existing `patched-fonts/` content [1] +* `data/`: Contains plain text files used to generate the CSS and cheat sheet files +* `data/sankey/`: Contains instructions on how to create the sankey glyph table manually [3] +* `docker-entrypoint.sh`: This script is packaged into the docker container and is usually used to start patching [2] +* `fpfix.py`: Can be used to set isFixedPitch property in a font [x] +* `generate-casks.sh`: Generates cask files for fonts from data in `patched-fonts/` and `archives/`, unused and not recommended by homebrew-fonts +* `generate-css.sh`: Generates the Nerd Fonts CCS, which can be used to access the glyphs on a web page [1] +* `generate-fontconfig.sh`: Generates font configuration to enable use of unpatched fonts with Symbols Only Nerd Font [1] +* `generate-font-image-previews.sh`: Generates the preview images for `nerdfonts.com` (i.e. gh-pages) [3] +* `generate-glyph-info-from-set.py`: Generate the `i_xxx.sh` file from a glyph source (font) file, if the glyphs are named correctly [4] +* `generate-original-source.py`: Generate `original-source.otf` from single glyph svgs. [5] +* `get-font-names-from-json.sh`: Helper to setup the CI font matrix from `data/fonts.json` [1] +* `gotta-patch-em-all-font-patcher!.sh`: Patch one or more fonts 'complete' with and without `mono` and with and without `windows compat` [1] +* `Hack/`: Special additional post patching script for Hack, invoked via Hack's `config.cfg` (not used when self-patching) +* `lib/`: See its own README +* `name_parser/`: Suite to set up sane Family and SubFamily names, used by `font-patcher` (on demand) +* `optimize-original-source.sh`: Run all icons in `src/svgs` through inkscape to simplify (remove nodes and edges) [5] +* `release.sh`: Rough process how a release is created, not used (see `.github/workflows/release.yml`) +* `standardize-and-complete-readmes.sh` [1] +* `test-fonts.sh`: Print-to-debug all glyphs we patch in [4] +* `test-powerlines.sh`: Print-to-debug powerline examples [4] +* `tests.sh`: Create some font usage gif movie? [x] +* `update-all-contributors-website.py`: Update the contributors page on `nerdfonts.com` (i.e. gh-pages) (Hardcoded paths!) [3] +* `version-bump.sh`: Change version number in all scripts on a new release [1] + +[1] Used by CI (github release workflow) +[2] Used by CI (github docker-release workflow) +[3] To be used manually (sigh) +[4] To be used manually +[5] Used by CI (github packsvgs workflow) +[x] Probably not used by anything diff --git a/bin/scripts/generate-original-source.py b/bin/scripts/generate-original-source.py new file mode 100755 index 000000000..97105d9ac --- /dev/null +++ b/bin/scripts/generate-original-source.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +# Nerd Fonts Version: 2.2.2 +# Script Version: 1.0.0 +# Generates original-source.otf from individual glyphs +# +# Idea & original code taken from +# https://github.com/lukas-w/font-logos/blob/v1.0.1/scripts/generate-font.py + +import os +import re +import fontforge +import psMat + +# Double-quotes required here, for version-bump.sh: +version = "2.2.2" + +start_codepoint = 0xE4FA +codepoint_shift = 0x0100 # shift introduced by font-patcher + +vector_datafile = 'icons.tsv' +vectorsdir = '../../src/svgs' +fontfile = 'original-source.otf' +fontdir = '../../src/glyphs' +glyphsetfile = 'i_seti.sh' +glyphsetsdir = 'lib' + +def hasGaps(data, start_codepoint): + """ Takes a list of integers and checks that it contains no gaps """ + for i in range(min(data) + 1, max(data)): + if not i in data: + print("Gap at offset {}".format(i - start_codepoint)) + return True + return False + +def iconFileLineOk(parts): + """ Check one line for course errors, decide if it shall be skipped """ + if parts[0].startswith('#'): + # Comment lines start with '#' + return False + if len(parts) != 2 and len(parts) != 3: + print('Unexpected data on the line "{}"'.format(line.strip())) + return False + if int(parts[0]) < 0: + print('Offset must be positive on line "{}", ignoring'.format(line.strip())) + return False + return True + +def addLineToData(data, parts, codepoint): + """ Add one line to the data. Return (success, is_alias) """ + ali = False + if codepoint in data: + data[codepoint][0] += [ parts[1] ] + if len(parts) > 2 and data[codepoint][1] != parts[2]: + print('Conflicting filename for {}, ignoring {}'.format(codepoint, parts[2])) + return False, False + ali = True + else: + data[codepoint] = [[parts[1]], parts[2]] + return True, ali + +def readIconFile(filename, start_codepoint): + """ Read the database with codepoints, names and files """ + # First line of the file is the header, it is ignored + # All other lines are one line for one glyph + # Elements in each line are tab separated (any amount consecutive of tabs) + # First element is the offset, 2nd is name, 3rd is filename + # For aliases the 3rd can be ommited on an additional line + data = {} + num = 0 + ali = 0 + with open(filename, 'r') as f: + for line in f.readlines(): + parts = re.split('\t+', line.strip()) + if not iconFileLineOk(parts): + continue + offset = int(parts[0]) + codepoint = start_codepoint + offset + if re.search('[^a-zA-Z0-9_]', parts[1]): + print('Invalid characters in name: "{}" replaced by "_"'.format(parts[1])) + parts[1] = re.sub('[^a-zA-Z0-9_]', '_', parts[1]) + added = addLineToData(data, parts, codepoint) + if not added[0]: + continue + num += 1 + if added[1]: + ali += 1 + print('Read glyph data successfully with {} entries ({} aliases)'.format(num, ali)) + return (data, num, ali) + +def widthFromBB(bb): + """ Calculate glyph width from BoundingBox data """ + return bb[2] - bb[0] + +def heightFromBB(bb): + """ Calculate glyph height from BoundingBox data """ + return bb[3] - bb[1] + +def calcShift(left1, width1, left2, width2): + """ Calculate shift needed to center '2' in '1' """ + return width1 / 2 + left1 - width2 / 2 - left2 + +def addIcon(codepoint, name, filename): + """ Add one outline file and rescale/move """ + dBB = [120, 0, 1000-120, 900] # just some nice sizes + filename = os.path.join(vectorsdir, filename) + glyph = font.createChar(codepoint, name) + glyph.importOutlines(filename) + gBB = glyph.boundingBox() + scale_x = widthFromBB(dBB) / widthFromBB(gBB) + scale_y = heightFromBB(dBB) / heightFromBB(gBB) + scale = scale_y if scale_y < scale_x else scale_x + glyph.transform(psMat.scale(scale, scale)) + gBB = glyph.boundingBox() # re-get after scaling (rounding errors) + glyph.transform(psMat.translate( + calcShift(dBB[0], widthFromBB(dBB), gBB[0], widthFromBB(gBB)), + calcShift(dBB[1], heightFromBB(dBB), gBB[1], heightFromBB(gBB)))) + glyph.width = int(dBB[2] + dBB[0]) + glyph.manualHints = True + +def createGlyphInfo(icon_datasets, filepathname, into): + """ Write the glyphinfo file """ + with open(filepathname, 'w', encoding = 'utf8') as f: + f.write(u'#!/usr/bin/env bash\n') + f.write(intro) + f.write(u'# Script Version: (autogenerated)\n') + f.write(u'test -n "$__i_seti_loaded" && return || __i_seti_loaded=1\n') + for codepoint, data in icon_datasets.items(): + f.write(u"i='{}' {}=$i\n".format(chr(codepoint),data[0][0])) + for alias in data[0][1:]: + f.write(u" {}=${}\n".format(alias, data[0][0])) + f.write(u'unset i\n') + + +### Lets go + +print('\n[Nerd Fonts] Glyph collection font generator {}\n'.format(version)) + +font = fontforge.font() +font.fontname = 'NerdFontFileTypes-Regular' +font.fullname = 'Nerd Font File Types Regular' +font.familyname = 'Nerd Font File Types' +font.em = 1024 +font.encoding = 'UnicodeFull' + +# Add valid space glyph to avoid "unknown character" box on IE11 +glyph = font.createChar(32) +glyph.width = 200 + +font.sfntRevision = None # Auto-set (refreshed) by fontforge +font.version = version +font.copyright = 'Nerd Fonts' +font.appendSFNTName('English (US)', 'Version', version) +font.appendSFNTName('English (US)', 'Vendor URL', 'https://github.com/ryanoasis/nerd-fonts') +font.appendSFNTName('English (US)', 'Copyright', 'Nerd Fonts') + +icon_datasets, _, num_aliases = readIconFile(os.path.join(vectorsdir, vector_datafile), start_codepoint) +gaps = ' (with gaps)' if hasGaps(icon_datasets.keys(), start_codepoint) else '' + +for codepoint, data in icon_datasets.items(): + addIcon(codepoint, data[0][0], data[1]) +num_icons = len(icon_datasets) + +print('Generating {} with {} glyphs'.format(fontfile, num_icons)) +font.generate(os.path.join(fontdir, fontfile), flags=("no-FFTM-table",)) + +# We create the font, but ... patch it in on other codepoints :-} +icon_datasets = { code + codepoint_shift : data for (code, data) in icon_datasets.items() } + +intro = u'# Seti-UI + Custom ({} icons, {} aliases)\n'.format(num_icons, num_aliases) +intro += u'# Codepoints: {:X}-{:X}{}\n'.format(min(icon_datasets.keys()), max(icon_datasets.keys()), gaps) +intro += u'# Nerd Fonts Version: {}\n'.format(version) + +print('Generating GlyphInfo {}'.format(glyphsetfile)) +createGlyphInfo(icon_datasets, os.path.join(glyphsetsdir, glyphsetfile), intro) +print('Finished') diff --git a/bin/scripts/lib/README.md b/bin/scripts/lib/README.md index e113b9422..6e626edd3 100644 --- a/bin/scripts/lib/README.md +++ b/bin/scripts/lib/README.md @@ -28,4 +28,4 @@ Only glyphs listed here could be found with the cheat sheet. * `weather-icons/weathericons-regular-webfont.ttf`: `i_weather.sh` * `font-logos.ttf`: `i_linux.sh` * `octicons.ttf`: `i_oct.sh` - * `codicons/codicon.ttf`: _missing_ + * `codicons/codicon.ttf`: `i_cod.sh` diff --git a/bin/scripts/optimize-original-source.sh b/bin/scripts/optimize-original-source.sh new file mode 100755 index 000000000..2a6ead360 --- /dev/null +++ b/bin/scripts/optimize-original-source.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash +# Nerd Fonts Version: 2.2.2 +# Script Version: 1.0.0 + +set -e + +# Do not optimize files that are smaller than +size_limit=0 + +# Do not optimize files, where the new size is more than X% of current size +size_ratio_max=80 + +function get_size { + du -b "$1" | sed 's/\([0-9]\)[^0-9].*$/\1/' +} + +echo +echo "Checking for SVG simplifications" + +dry=`[ "$1" != "doit" ] && echo "dry" || true` +if [ -n "${dry}" ]; then + echo " This is a dry run: no actual modifications are performed" + echo " Specify 'doit' as parameter to actually optimize the svgs" +else + echo " Files might be MODIFIED by this run ('doit' specified)" +fi + +svg_dir="../../src/svgs" + +symbols=() +while IFS= read -d $'\0' -r file ; do + symbols=("${symbols[@]}" "$file") +done < <(find "${svg_dir}" -name "*.svg" -print0) +echo "Found ${#symbols[@]} svgs in ${svg_dir}" + +count=0 +for s in "${symbols[@]}"; do + inkscape "$s" "--actions=select-all;object-simplify-path;export-filename:temp.svg;export-do;quit-inkscape" 2>/dev/null + old_size=$(get_size "$s") + new_size=$(get_size "temp.svg") + if [ "${old_size}" -lt "${size_limit}" ]; then + continue + fi + ratio=`dc -e "${new_size} 100 * ${old_size} / p"` + if [ "${ratio}" -lt "${size_ratio_max}" ]; then + echo "Simplification for `basename ${s}` (${old_size} -> ${new_size}) ${ratio}%" + count=`dc -e "${count} 1 + p"` + if [ -z "${dry}" ]; then + mv temp.svg "${s}" + fi + fi +done +echo "Found ${count} svgs to simplify" +rm temp.svg diff --git a/src/glyphs/README.md b/src/glyphs/README.md new file mode 100644 index 000000000..34801bae2 --- /dev/null +++ b/src/glyphs/README.md @@ -0,0 +1,8 @@ +### Contents + +This directory contains all the glyphs (glyph sets) that the `font-patcher` puts into the fonts. + +If a icon font here is updated, do not forget to update the database file in `bin/script/libs`. + +The 'Seti and Original' icons (in `original-source.otf`) is automatically generated from the glyphs in `src/svgs`. +Do not edit and commit changes to that font directly. diff --git a/src/glyphs/original-source.otf b/src/glyphs/original-source.otf index ea10f5776..be42b8833 100644 Binary files a/src/glyphs/original-source.otf and b/src/glyphs/original-source.otf differ diff --git a/src/svgs/README.md b/src/svgs/README.md new file mode 100644 index 000000000..6ea6e817b --- /dev/null +++ b/src/svgs/README.md @@ -0,0 +1,11 @@ +### Contents + +These are the source glyphs for the 'Seti and Original' icon set. + +`generate-original-source.py` generates a font file from all these individual glyphs. That font is then used for the actual patching process. + +The codepoints and names of the icons here have to be put into `icons.tsv`. + +If you push a new svg-file here it will be run through Inkscape 'simplify-path'! Keep that in mind. + +The simplification is also automated for every push via `optimize-original-source.sh`. diff --git a/src/svgs/bower.svg b/src/svgs/bower.svg index a1d67f6c8..4138e6d54 100644 --- a/src/svgs/bower.svg +++ b/src/svgs/bower.svg @@ -1,10 +1,40 @@ - - - - bower - Created with Sketch. - - - - - \ No newline at end of file + + + + + bower + Created with Sketch. + + + + + diff --git a/src/svgs/c++.svg b/src/svgs/c++.svg index ca8b70e7b..4280aabef 100644 --- a/src/svgs/c++.svg +++ b/src/svgs/c++.svg @@ -1,10 +1,40 @@ - - - - c++ - Created with Sketch. - - - - - \ No newline at end of file + + + + + c++ + Created with Sketch. + + + + + diff --git a/src/svgs/c.svg b/src/svgs/c.svg index f93220c9b..801b347fd 100644 --- a/src/svgs/c.svg +++ b/src/svgs/c.svg @@ -1,10 +1,40 @@ - - - - c - Created with Sketch. - - - - - \ No newline at end of file + + + + + c + Created with Sketch. + + + + + diff --git a/src/svgs/coffeescript.svg b/src/svgs/coffeescript.svg index e08430964..3488385dc 100644 --- a/src/svgs/coffeescript.svg +++ b/src/svgs/coffeescript.svg @@ -1,10 +1,40 @@ - - - - coffeescript - Created with Sketch. - - - - - \ No newline at end of file + + + + + coffeescript + Created with Sketch. + + + + + diff --git a/src/svgs/config-folder.svg b/src/svgs/config-folder.svg index 3f11b2fa8..c4a99f537 100644 --- a/src/svgs/config-folder.svg +++ b/src/svgs/config-folder.svg @@ -1,10 +1,40 @@ - - - - config-folder - Created with Sketch. - - - - - \ No newline at end of file + + + + + config-folder + Created with Sketch. + + + + + diff --git a/src/svgs/config.svg b/src/svgs/config.svg index e311ed609..ec758534d 100644 --- a/src/svgs/config.svg +++ b/src/svgs/config.svg @@ -1,10 +1,40 @@ - - - - config - Created with Sketch. - - - - - \ No newline at end of file + + + + + config + Created with Sketch. + + + + + diff --git a/src/svgs/electron.svg b/src/svgs/electron.svg index 885870f9a..c2ee5f422 100644 --- a/src/svgs/electron.svg +++ b/src/svgs/electron.svg @@ -1,10 +1,40 @@ - - - - electron - Created with Sketch. - - - - - \ No newline at end of file + + + + + electron + Created with Sketch. + + + + + diff --git a/src/svgs/git-folder.svg b/src/svgs/git-folder.svg index 81d694d08..889f3041b 100644 --- a/src/svgs/git-folder.svg +++ b/src/svgs/git-folder.svg @@ -1,10 +1,40 @@ - - - - git-folder - Created with Sketch. - - - - - \ No newline at end of file + + + + + git-folder + Created with Sketch. + + + + + diff --git a/src/svgs/go.svg b/src/svgs/go.svg index e0525d1e9..99f33c2e7 100644 --- a/src/svgs/go.svg +++ b/src/svgs/go.svg @@ -1,10 +1,40 @@ - - - - go - Created with Sketch. - - - - - \ No newline at end of file + + + + + go + Created with Sketch. + + + + + diff --git a/src/svgs/go2.svg b/src/svgs/go2.svg index 9e5f15cfe..821b05e93 100644 --- a/src/svgs/go2.svg +++ b/src/svgs/go2.svg @@ -1,10 +1,40 @@ - - - - go2 - Created with Sketch. - - - - - \ No newline at end of file + + + + + go2 + Created with Sketch. + + + + + diff --git a/src/svgs/grunt.svg b/src/svgs/grunt.svg index b32b5acca..da8c1ebd3 100644 --- a/src/svgs/grunt.svg +++ b/src/svgs/grunt.svg @@ -1,10 +1,40 @@ - - - - grunt - Created with Sketch. - - - - - \ No newline at end of file + + + + + grunt + Created with Sketch. + + + + + diff --git a/src/svgs/handlebars.svg b/src/svgs/handlebars.svg index 9841dd480..8f8323446 100644 --- a/src/svgs/handlebars.svg +++ b/src/svgs/handlebars.svg @@ -1,10 +1,40 @@ - - - - handlebars - Created with Sketch. - - - - - \ No newline at end of file + + + + + handlebars + Created with Sketch. + + + + + diff --git a/src/svgs/icons.tsv b/src/svgs/icons.tsv new file mode 100644 index 000000000..44d534448 --- /dev/null +++ b/src/svgs/icons.tsv @@ -0,0 +1,77 @@ +# This file defines the codepoints for the individual glyphs in +# original-source.otf and their names in the CSS and on the cheat +# sheet (via i_seti.sh). +# +# If you add a svg to the directory you need to add also a line here. +# Keep the numbers consecutive. +# You can add aliases by adding a new line with the same offset but +# different name; omit the filename on those lines. +# Use generate-original-source.py to regenerate the font used to patch. +# +# offset name (in i_seti.sh) filename (.svg) +# +0 i_custom_folder_npm npm-folder.svg +1 i_custom_folder_git git-folder.svg +1 i_custom_folder_git_branch +2 i_custom_folder_config config-folder.svg +3 i_custom_folder_github octocat-folder.svg +4 i_custom_folder_open open-folder.svg +5 i_custom_folder folder.svg +6 i_seti_stylus stylus.svg +7 i_seti_project project.svg +8 i_seti_play_arrow play-arrow.svg +9 i_seti_sass sass.svg +10 i_seti_rails rails.svg +11 i_seti_ruby ruby.svg +12 i_seti_python python.svg +13 i_seti_heroku heroku.svg +14 i_seti_php php.svg +15 i_seti_markdown markdown.svg +16 i_seti_license license.svg +17 i_seti_json less.svg +17 i_seti_less +18 i_seti_javascript javascript.svg +19 i_seti_image image.svg +20 i_seti_html html.svg +21 i_seti_mustache handlebars.svg +22 i_seti_gulp gulp.svg +23 i_seti_grunt grunt.svg +24 i_seti_default file.svg +24 i_seti_text +25 i_seti_folder seti-folder.svg +26 i_seti_css css.svg +27 i_seti_config config.svg +28 i_seti_npm npm.svg +29 i_seti_home home.svg +30 i_seti_ejs html.svg +31 i_seti_xml rss.svg +32 i_seti_bower bower.svg +33 i_seti_coffee coffeescript.svg +33 i_seti_cjsx +34 i_seti_twig twig.svg +35 i_custom_cpp c++.svg +36 i_custom_c c.svg +37 i_seti_haskell haskell.svg +38 i_seti_lua lua.svg +39 i_indent_line separator.svg +39 i_indentation_line +39 i_indent_dotted_guide +40 i_seti_karma karma.svg +41 i_seti_favicon favourite.svg +42 i_seti_julia julia.svg +43 i_seti_react react.svg +44 i_custom_go go2.svg +45 i_seti_go go.svg +46 i_seti_typescript typescript.svg +47 i_custom_msdos ms-dos.svg +48 i_custom_windows windows.svg +49 i_custom_vim vim.svg +50 i_custom_elm elm.svg +51 i_custom_elixir elixir.svg +52 i_custom_electron electron.svg +53 i_custom_crystal crystal.svg +54 i_custom_purescript purescript.svg +55 i_custom_puppet puppet.svg +56 i_custom_emacs emacs.svg +57 i_custom_orgmode orgmode.svg +58 i_custom_kotlin kotlin.svg diff --git a/src/svgs/javascript.svg b/src/svgs/javascript.svg index 8255f8a9f..376297390 100644 --- a/src/svgs/javascript.svg +++ b/src/svgs/javascript.svg @@ -1,10 +1,40 @@ - - - - javascript - Created with Sketch. - - - - - \ No newline at end of file + + + + + javascript + Created with Sketch. + + + + + diff --git a/src/svgs/less.svg b/src/svgs/less.svg index 2835a4eb9..cfc1712e7 100644 --- a/src/svgs/less.svg +++ b/src/svgs/less.svg @@ -1,10 +1,40 @@ - - - - less - Created with Sketch. - - - - - \ No newline at end of file + + + + + less + Created with Sketch. + + + + + diff --git a/src/svgs/license.svg b/src/svgs/license.svg index fda6a9298..0cc8055c7 100644 --- a/src/svgs/license.svg +++ b/src/svgs/license.svg @@ -1,10 +1,40 @@ - - - - license - Created with Sketch. - - - - - \ No newline at end of file + + + + + license + Created with Sketch. + + + + + diff --git a/src/svgs/ms-dos.svg b/src/svgs/ms-dos.svg index d71d4daba..1c7f5bee8 100644 --- a/src/svgs/ms-dos.svg +++ b/src/svgs/ms-dos.svg @@ -1,10 +1,40 @@ - - - - ms-dos - Created with Sketch. - - - - - \ No newline at end of file + + + + + ms-dos + Created with Sketch. + + + + + diff --git a/src/svgs/npm-folder.svg b/src/svgs/npm-folder.svg index dc70a9f05..7fe169da9 100644 --- a/src/svgs/npm-folder.svg +++ b/src/svgs/npm-folder.svg @@ -1,10 +1,40 @@ - - - - npm-folder - Created with Sketch. - - - - - \ No newline at end of file + + + + + npm-folder + Created with Sketch. + + + + + diff --git a/src/svgs/octocat-folder.svg b/src/svgs/octocat-folder.svg index c26cb8e44..2c034abec 100644 --- a/src/svgs/octocat-folder.svg +++ b/src/svgs/octocat-folder.svg @@ -1,10 +1,40 @@ - - - - octocat-folder - Created with Sketch. - - - - - \ No newline at end of file + + + + + octocat-folder + Created with Sketch. + + + + + diff --git a/src/svgs/php.svg b/src/svgs/php.svg index 5ab56386d..76a77c5e8 100644 --- a/src/svgs/php.svg +++ b/src/svgs/php.svg @@ -1,10 +1,40 @@ - - - - php - Created with Sketch. - - - - - \ No newline at end of file + + + + + php + Created with Sketch. + + + + + diff --git a/src/svgs/react.svg b/src/svgs/react.svg index bc48c53b1..ada7c15d3 100644 --- a/src/svgs/react.svg +++ b/src/svgs/react.svg @@ -1,10 +1,40 @@ - - - - react - Created with Sketch. - - - - - \ No newline at end of file + + + + + react + Created with Sketch. + + + + + diff --git a/src/svgs/rss.svg b/src/svgs/rss.svg index 64c9765be..583811325 100644 --- a/src/svgs/rss.svg +++ b/src/svgs/rss.svg @@ -1,10 +1,40 @@ - - - - rss - Created with Sketch. - - - - - \ No newline at end of file + + + + + rss + Created with Sketch. + + + + + diff --git a/src/svgs/separator.svg b/src/svgs/separator.svg index b1d4efd7a..35b201002 100644 --- a/src/svgs/separator.svg +++ b/src/svgs/separator.svg @@ -1,10 +1,40 @@ - - - - separator - Created with Sketch. - - - - - \ No newline at end of file + + + + + separator + Created with Sketch. + + + + + diff --git a/src/svgs/stylus.svg b/src/svgs/stylus.svg index 178ab16e5..f3a580985 100644 --- a/src/svgs/stylus.svg +++ b/src/svgs/stylus.svg @@ -1,10 +1,40 @@ - - - - stylus - Created with Sketch. - - - - - \ No newline at end of file + + + + + stylus + Created with Sketch. + + + + + diff --git a/src/svgs/twig.svg b/src/svgs/twig.svg index 3cb88f7ff..3eb8b512e 100644 --- a/src/svgs/twig.svg +++ b/src/svgs/twig.svg @@ -1,10 +1,40 @@ - - - - twig - Created with Sketch. - - - - - \ No newline at end of file + + + + + twig + Created with Sketch. + + + + + diff --git a/src/svgs/typescript.svg b/src/svgs/typescript.svg index c01484756..83c0352f6 100644 --- a/src/svgs/typescript.svg +++ b/src/svgs/typescript.svg @@ -1,10 +1,40 @@ - - - - typescript - Created with Sketch. - - - - - \ No newline at end of file + + + + + typescript + Created with Sketch. + + + + +