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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+
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 @@
-
-
\ No newline at end of file
+
+