diff --git a/chocolatey/Pipfile b/chocolatey/Pipfile new file mode 100644 index 000000000..75b997253 --- /dev/null +++ b/chocolatey/Pipfile @@ -0,0 +1,12 @@ +[[source]] +url = "https://pypi.python.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +pyyaml = "*" + +[dev-packages] + +[requires] +python_version = "3.6" diff --git a/chocolatey/Pipfile.lock b/chocolatey/Pipfile.lock new file mode 100644 index 000000000..9f89f3a24 --- /dev/null +++ b/chocolatey/Pipfile.lock @@ -0,0 +1,41 @@ +{ + "_meta": { + "hash": { + "sha256": "95508a89f4c6aa1090777242e6a45312cc48d3a587f1abb43929eed9b4f17ca2" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.python.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "pyyaml": { + "hashes": [ + "sha256:0c507b7f74b3d2dd4d1322ec8a94794927305ab4cebbe89cc47fe5e81541e6e8", + "sha256:16b20e970597e051997d90dc2cddc713a2876c47e3d92d59ee198700c5427736", + "sha256:3262c96a1ca437e7e4763e2843746588a965426550f3797a79fca9c6199c431f", + "sha256:326420cbb492172dec84b0f65c80942de6cedb5233c413dd824483989c000608", + "sha256:4474f8ea030b5127225b8894d626bb66c01cda098d47a2b0d3429b6700af9fd8", + "sha256:592766c6303207a20efc445587778322d7f73b161bd994f227adaa341ba212ab", + "sha256:5ac82e411044fb129bae5cfbeb3ba626acb2af31a8d17d175004b70862a741a7", + "sha256:5f84523c076ad14ff5e6c037fe1c89a7f73a3e04cf0377cb4d017014976433f3", + "sha256:827dc04b8fa7d07c44de11fabbc888e627fa8293b695e0f99cb544fdfa1bf0d1", + "sha256:b4c423ab23291d3945ac61346feeb9a0dc4184999ede5e7c43e1ffb975130ae6", + "sha256:bc6bced57f826ca7cb5125a10b23fd0f2fff3b7c4701d64c439a300ce665fff8", + "sha256:c01b880ec30b5a6e6aa67b09a2fe3fb30473008c85cd6a67359a1b15ed6d83a4", + "sha256:ca233c64c6e40eaa6c66ef97058cdc80e8d0157a443655baa1b2966e812807ca", + "sha256:e863072cdf4c72eebf179342c94e6989c67185842d9997960b3e69290b2fa269" + ], + "index": "pypi", + "version": "==3.12" + } + }, + "develop": {} +} diff --git a/chocolatey/README.md b/chocolatey/README.md new file mode 100644 index 000000000..71bc70a5a --- /dev/null +++ b/chocolatey/README.md @@ -0,0 +1,28 @@ +# Chocolatey packages for nerd-fonts + +Script to generate chocolatey packages for nerd-fonts. + +## Requirements + +- [pipenv](https://github.com/pypa/pipenv/) +- [PyYAML](https://pyyaml.org/) +- [chocolatey](https://chocolatey.org/) + +## Setup + +- Run `pipenv install` to setup the virtual environment. +- Ensure that `choco` binary is in the `PATH`. + +## Usage + +Run the `generate_packages.py` which reads `fonts.yml` file and generates the chocolatey packages. + +### fonts.yml + +The `YAML` file describes the fonts to be packaged. + +- `version`: The version of nerd-fonts to be downloaded. +- `fonts.name`: The name of the nerd-font as per the `github release assets`. +- `fonts.sha256`: The `SHA256` hash of the zip file. +- `fonts.installed_fonts`: The list of fonts in the zip file. + diff --git a/chocolatey/base.nuspec b/chocolatey/base.nuspec new file mode 100644 index 000000000..a989ba9f2 --- /dev/null +++ b/chocolatey/base.nuspec @@ -0,0 +1,84 @@ + + + + + + https://github.com/ryanoasis/nerd-fonts + + ryanoasis + + + + + + Ryan L McIntyre + + https://nerdfonts.com/ + https://imgur.com/pEDFEje + + + https://raw.githubusercontent.com/ryanoasis/nerd-fonts/master/LICENSE + true + https://github.com/ryanoasis/nerd-fonts + https://github.com/ryanoasis/nerd-fonts/wiki + + https://github.com/ryanoasis/nerd-fonts/issues + hasklig hasklug nerd-fonts fonts ligatures coding-fonts + + Iconic font aggregator, collection, and patcher. 40+ patched fonts, over 3,600 + glyph/icons, includes popular collections such as Font Awesome & fonts such as Hack. + + + Nerd Fonts takes popular programming fonts and adds a bunch of Glyphs. + There is also a font patcher available if your desired font isn't already patched. + For more high level information see the wiki. + + +# New Features + - Added new fonts: + - Noto (all variations) (#213) + - Overpass Mono (fixes #177) + - BigBlue Terminal (fixes #170) + - Dyslexic (fixes #217) + - Iosevka Term variant (no ligatures) (fixes #198) + - FiraCode TTF variant (fixes #244) + - SourceCodePro italics variant (fixes #236) + - Added new glyph sets: + - Material Design Icons + - Weather + - Added new glyphs to core: + - Elm (fixes #172) + - Elixir (fixes #228) + - Electron (fixes #237) + - Added new translations: + - Added Traditional Chinese of readme (partially fixes #118) (PR #222) (@MindyTai) + - Added French readme (partially fixes #118) (PR #251) (@pgrimaud) + - Added ability to remove ligatures via the `--removeligatures` option in font-patcher + - Added `--configfile` option to font-patcher + +# Updates / Improvements + - Updated Hack font to latest version (v3.003) (fixes #216) (with help from @chrissimpkins) + - Updated Iosevka to the latest version (v1.14.0) (fixes #229) + - Updated Fantasque Sans Mono to the latest version (v1.7.2) (fixes #240) + - Updated MPlus version from 1.018 to 1.063 + - Updated documentation for urxvt wcwidth implementations (fixes #155) + - Updated logos and Sankey diagram + +# Breaking Updates / Improvements / Changes + - Updated Font Logos (formerly Font Linux) to latest version (fixes #157) + +# Fixes + - Fixed incorrect exitcode returned from installer (fixes #218) (PR #230 @Phuurl) + - Fixed 3270 font not being valid/installable on Windows (fixes #12, #196) + - Fixed weather variables script typo (PR #242 @snown) + - Fixed Monospaced fonts having ligatures by default (fixed Meslo Mono having ligatures) + (fixes #186) + - Fixed Hasklig ExtraLight & Light variants (fixes #231) + + + + + + + + diff --git a/chocolatey/fonts.yml b/chocolatey/fonts.yml new file mode 100644 index 000000000..788c38667 --- /dev/null +++ b/chocolatey/fonts.yml @@ -0,0 +1,111 @@ +version: 2.0.0 +fonts: + - name: FiraCode + sha256: 09894D24BF3D61493DBA052187A9200497135A4B885CB837BCB637AD2E62070F + installed_fonts: + - Fura Code Bold Nerd Font Complete Mono Windows Compatible.otf + - Fura Code Bold Nerd Font Complete Mono Windows Compatible.ttf + - Fura Code Bold Nerd Font Complete Mono.otf + - Fura Code Bold Nerd Font Complete Mono.ttf + - Fura Code Bold Nerd Font Complete Windows Compatible.otf + - Fura Code Bold Nerd Font Complete Windows Compatible.ttf + - Fura Code Bold Nerd Font Complete.otf + - Fura Code Bold Nerd Font Complete.ttf + - Fura Code Light Nerd Font Complete Mono Windows Compatible.otf + - Fura Code Light Nerd Font Complete Mono Windows Compatible.ttf + - Fura Code Light Nerd Font Complete Mono.otf + - Fura Code Light Nerd Font Complete Mono.ttf + - Fura Code Light Nerd Font Complete Windows Compatible.otf + - Fura Code Light Nerd Font Complete Windows Compatible.ttf + - Fura Code Light Nerd Font Complete.otf + - Fura Code Light Nerd Font Complete.ttf + - Fura Code Medium Nerd Font Complete Mono Windows Compatible.otf + - Fura Code Medium Nerd Font Complete Mono Windows Compatible.ttf + - Fura Code Medium Nerd Font Complete Mono.otf + - Fura Code Medium Nerd Font Complete Mono.ttf + - Fura Code Medium Nerd Font Complete Windows Compatible.otf + - Fura Code Medium Nerd Font Complete Windows Compatible.ttf + - Fura Code Medium Nerd Font Complete.otf + - Fura Code Medium Nerd Font Complete.ttf + - Fura Code Regular Nerd Font Complete Mono Windows Compatible.otf + - Fura Code Regular Nerd Font Complete Mono Windows Compatible.ttf + - Fura Code Regular Nerd Font Complete Mono.otf + - Fura Code Regular Nerd Font Complete Mono.ttf + - Fura Code Regular Nerd Font Complete Windows Compatible.otf + - Fura Code Regular Nerd Font Complete Windows Compatible.ttf + - Fura Code Regular Nerd Font Complete.otf + - Fura Code Regular Nerd Font Complete.ttf + - Fura Code Retina Nerd Font Complete Mono Windows Compatible.otf + - Fura Code Retina Nerd Font Complete Mono Windows Compatible.ttf + - Fura Code Retina Nerd Font Complete Mono.otf + - Fura Code Retina Nerd Font Complete Mono.ttf + - Fura Code Retina Nerd Font Complete Windows Compatible.otf + - Fura Code Retina Nerd Font Complete Windows Compatible.ttf + - Fura Code Retina Nerd Font Complete.otf + - Fura Code Retina Nerd Font Complete.ttf + - name: Hasklig + sha256: 1FD1D88F2EC48424654888E4C7AFAD7A423E4229F40B09BE323DBF4A04600DBD + installed_fonts: + - Hasklug Black Italic Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Black Italic Nerd Font Complete Mono.otf + - Hasklug Black Italic Nerd Font Complete Windows Compatible.otf + - Hasklug Black Italic Nerd Font Complete.otf + - Hasklug Black Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Black Nerd Font Complete Mono.otf + - Hasklug Black Nerd Font Complete Windows Compatible.otf + - Hasklug Black Nerd Font Complete.otf + - Hasklug Bold Italic Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Bold Italic Nerd Font Complete Mono.otf + - Hasklug Bold Italic Nerd Font Complete Windows Compatible.otf + - Hasklug Bold Italic Nerd Font Complete.otf + - Hasklug Bold Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Bold Nerd Font Complete Mono.otf + - Hasklug Bold Nerd Font Complete Windows Compatible.otf + - Hasklug Bold Nerd Font Complete.otf + - Hasklug ExtraLight Italic Nerd Font Complete Mono Windows Compatible.otf + - Hasklug ExtraLight Italic Nerd Font Complete Mono.otf + - Hasklug ExtraLight Italic Nerd Font Complete Windows Compatible.otf + - Hasklug ExtraLight Italic Nerd Font Complete.otf + - Hasklug ExtraLight Nerd Font Complete Mono Windows Compatible.otf + - Hasklug ExtraLight Nerd Font Complete Mono.otf + - Hasklug ExtraLight Nerd Font Complete Windows Compatible.otf + - Hasklug ExtraLight Nerd Font Complete.otf + - Hasklug Italic Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Italic Nerd Font Complete Mono.otf + - Hasklug Italic Nerd Font Complete Windows Compatible.otf + - Hasklug Italic Nerd Font Complete.otf + - Hasklug Light Italic Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Light Italic Nerd Font Complete Mono.otf + - Hasklug Light Italic Nerd Font Complete Windows Compatible.otf + - Hasklug Light Italic Nerd Font Complete.otf + - Hasklug Light Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Light Nerd Font Complete Mono.otf + - Hasklug Light Nerd Font Complete Windows Compatible.otf + - Hasklug Light Nerd Font Complete.otf + - Hasklug Medium Italic Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Medium Italic Nerd Font Complete Mono.otf + - Hasklug Medium Italic Nerd Font Complete Windows Compatible.otf + - Hasklug Medium Italic Nerd Font Complete.otf + - Hasklug Medium Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Medium Nerd Font Complete Mono.otf + - Hasklug Medium Nerd Font Complete Windows Compatible.otf + - Hasklug Medium Nerd Font Complete.otf + - Hasklug Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Nerd Font Complete Mono.otf + - Hasklug Nerd Font Complete Windows Compatible.otf + - Hasklug Nerd Font Complete.otf + - Hasklug Semibold Italic Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Semibold Italic Nerd Font Complete Mono.otf + - Hasklug Semibold Italic Nerd Font Complete Windows Compatible.otf + - Hasklug Semibold Italic Nerd Font Complete.otf + - Hasklug Semibold Nerd Font Complete Mono Windows Compatible.otf + - Hasklug Semibold Nerd Font Complete Mono.otf + - Hasklug Semibold Nerd Font Complete Windows Compatible.otf + - Hasklug Semibold Nerd Font Complete.otf + - name: Inconsolata + sha256: 7EF196CE9FA7B4BC3F9E0290A0DE0FBEFEE123A705BA84A1993D6336A92A5164 + installed_fonts: + - Inconsolata Nerd Font Complete Mono Windows Compatible.otf + - Inconsolata Nerd Font Complete Mono.otf + - Inconsolata Nerd Font Complete Windows Compatible.otf + - Inconsolata Nerd Font Complete.otf diff --git a/chocolatey/generate_packages.py b/chocolatey/generate_packages.py new file mode 100644 index 000000000..d4f5cb896 --- /dev/null +++ b/chocolatey/generate_packages.py @@ -0,0 +1,101 @@ +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() diff --git a/chocolatey/tools/Add-Font.ps1 b/chocolatey/tools/Add-Font.ps1 new file mode 100644 index 000000000..3006730f2 --- /dev/null +++ b/chocolatey/tools/Add-Font.ps1 @@ -0,0 +1,614 @@ +######################################################################################### +# MICROSOFT LEGAL STATEMENT FOR SAMPLE SCRIPTS/CODE +######################################################################################### +# This Sample Code is provided for the purpose of illustration only and is not +# intended to be used in a production environment. +# +# THIS SAMPLE CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY +# OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +# +# We grant You a nonexclusive, royalty-free right to use and modify the Sample Code +# and to reproduce and distribute the object code form of the Sample Code, provided +# that You agree: +# (i) to not use Our name, logo, or trademarks to market Your software product +# in which the Sample Code is embedded; +# (ii) to include a valid copyright notice on Your software product in which +# the Sample Code is embedded; and +# (iii) to indemnify, hold harmless, and defend Us and Our suppliers from and +# against any claims or lawsuits, including attorneys’ fees, that arise +# or result from the use or distribution of the Sample Code. +######################################################################################### + +#****************************************************************************** +# File: Add-Font.ps1 +# Date: 08/28/2013 +# Version: 1.0.1 +# +# Purpose: PowerShell script to install Windows fonts. +# +# Usage: Add-Font -help | -path "" +# +# Copyright (C) 2010 Microsoft Corporation +# +# +# Revisions: +# ---------- +# 1.0.0 09/22/2010 Created script. +# 1.0.1 08/28/2013 Fixed help text. Added quotes around paths in messages. +# +#****************************************************************************** + +#requires -Version 2.0 + +#******************************************************************* +# Declare Parameters +#******************************************************************* +param( + [string] $path = "", + [switch] $help = $false +) + + +#******************************************************************* +# Declare Global Variables and Constants +#******************************************************************* + +# Define constants +set-variable CSIDL_FONTS 0x14 -option constant + +# Create hashtable containing valid font file extensions and text to append to Registry entry name. +$hashFontFileTypes = @{} +$hashFontFileTypes.Add(".fon", "") +$hashFontFileTypes.Add(".fnt", "") +$hashFontFileTypes.Add(".ttf", " (TrueType)") +$hashFontFileTypes.Add(".ttc", " (TrueType)") +$hashFontFileTypes.Add(".otf", " (OpenType)") +# Type 1 fonts require handling multiple resource files. +# Not supported in this script +#$hashFontFileTypes.Add(".mmm", "") +#$hashFontFileTypes.Add(".pbf", "") +#$hashFontFileTypes.Add(".pfm", "") + +# Initialize variables +$invocation = (Get-Variable MyInvocation -Scope 0).Value +$scriptPath = Split-Path $Invocation.MyCommand.Path +$fontRegistryPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" + + +#******************************************************************* +# Load C# code +#******************************************************************* +$fontCSharpCode = @' +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Runtime.InteropServices; + +namespace FontResource +{ + public class AddRemoveFonts + { + private static IntPtr HWND_BROADCAST = new IntPtr(0xffff); + private static IntPtr HWND_TOP = new IntPtr(0); + private static IntPtr HWND_BOTTOM = new IntPtr(1); + private static IntPtr HWND_TOPMOST = new IntPtr(-1); + private static IntPtr HWND_NOTOPMOST = new IntPtr(-2); + private static IntPtr HWND_MESSAGE = new IntPtr(-3); + + [DllImport("gdi32.dll")] + static extern int AddFontResource(string lpFilename); + + [DllImport("gdi32.dll")] + static extern int RemoveFontResource(string lpFileName); + + [DllImport("user32.dll",CharSet=CharSet.Auto)] + private static extern int SendMessage(IntPtr hWnd, WM wMsg, IntPtr wParam, IntPtr lParam); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("user32.dll", SetLastError = true)] + private static extern bool PostMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam); + + public static int AddFont(string fontFilePath) { + FileInfo fontFile = new FileInfo(fontFilePath); + if (!fontFile.Exists) + { + return 0; + } + try + { + int retVal = AddFontResource(fontFilePath); + + //This version of SendMessage is a blocking call until all windows respond. + //long result = SendMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + //Alternatively PostMessage instead of SendMessage to prevent application hang + bool posted = PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + return retVal; + } + catch + { + return 0; + } + } + + public static int RemoveFont(string fontFileName) { + //FileInfo fontFile = new FileInfo(fontFileName); + //if (!fontFile.Exists) + //{ + // return false; + //} + try + { + int retVal = RemoveFontResource(fontFileName); + + //This version of SendMessage is a blocking call until all windows respond. + //long result = SendMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + //Alternatively PostMessage instead of SendMessage to prevent application hang + bool posted = PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + return retVal; + } + catch + { + return 0; + } + } + + public enum WM : uint + { + NULL = 0x0000, + CREATE = 0x0001, + DESTROY = 0x0002, + MOVE = 0x0003, + SIZE = 0x0005, + ACTIVATE = 0x0006, + SETFOCUS = 0x0007, + KILLFOCUS = 0x0008, + ENABLE = 0x000A, + SETREDRAW = 0x000B, + SETTEXT = 0x000C, + GETTEXT = 0x000D, + GETTEXTLENGTH = 0x000E, + PAINT = 0x000F, + CLOSE = 0x0010, + QUERYENDSESSION = 0x0011, + QUERYOPEN = 0x0013, + ENDSESSION = 0x0016, + QUIT = 0x0012, + ERASEBKGND = 0x0014, + SYSCOLORCHANGE = 0x0015, + SHOWWINDOW = 0x0018, + WININICHANGE = 0x001A, + SETTINGCHANGE = WM.WININICHANGE, + DEVMODECHANGE = 0x001B, + ACTIVATEAPP = 0x001C, + FONTCHANGE = 0x001D, + TIMECHANGE = 0x001E, + CANCELMODE = 0x001F, + SETCURSOR = 0x0020, + MOUSEACTIVATE = 0x0021, + CHILDACTIVATE = 0x0022, + QUEUESYNC = 0x0023, + GETMINMAXINFO = 0x0024, + PAINTICON = 0x0026, + ICONERASEBKGND = 0x0027, + NEXTDLGCTL = 0x0028, + SPOOLERSTATUS = 0x002A, + DRAWITEM = 0x002B, + MEASUREITEM = 0x002C, + DELETEITEM = 0x002D, + VKEYTOITEM = 0x002E, + CHARTOITEM = 0x002F, + SETFONT = 0x0030, + GETFONT = 0x0031, + SETHOTKEY = 0x0032, + GETHOTKEY = 0x0033, + QUERYDRAGICON = 0x0037, + COMPAREITEM = 0x0039, + GETOBJECT = 0x003D, + COMPACTING = 0x0041, + COMMNOTIFY = 0x0044, + WINDOWPOSCHANGING = 0x0046, + WINDOWPOSCHANGED = 0x0047, + POWER = 0x0048, + COPYDATA = 0x004A, + CANCELJOURNAL = 0x004B, + NOTIFY = 0x004E, + INPUTLANGCHANGEREQUEST = 0x0050, + INPUTLANGCHANGE = 0x0051, + TCARD = 0x0052, + HELP = 0x0053, + USERCHANGED = 0x0054, + NOTIFYFORMAT = 0x0055, + CONTEXTMENU = 0x007B, + STYLECHANGING = 0x007C, + STYLECHANGED = 0x007D, + DISPLAYCHANGE = 0x007E, + GETICON = 0x007F, + SETICON = 0x0080, + NCCREATE = 0x0081, + NCDESTROY = 0x0082, + NCCALCSIZE = 0x0083, + NCHITTEST = 0x0084, + NCPAINT = 0x0085, + NCACTIVATE = 0x0086, + GETDLGCODE = 0x0087, + SYNCPAINT = 0x0088, + NCMOUSEMOVE = 0x00A0, + NCLBUTTONDOWN = 0x00A1, + NCLBUTTONUP = 0x00A2, + NCLBUTTONDBLCLK = 0x00A3, + NCRBUTTONDOWN = 0x00A4, + NCRBUTTONUP = 0x00A5, + NCRBUTTONDBLCLK = 0x00A6, + NCMBUTTONDOWN = 0x00A7, + NCMBUTTONUP = 0x00A8, + NCMBUTTONDBLCLK = 0x00A9, + NCXBUTTONDOWN = 0x00AB, + NCXBUTTONUP = 0x00AC, + NCXBUTTONDBLCLK = 0x00AD, + INPUT_DEVICE_CHANGE = 0x00FE, + INPUT = 0x00FF, + KEYFIRST = 0x0100, + KEYDOWN = 0x0100, + KEYUP = 0x0101, + CHAR = 0x0102, + DEADCHAR = 0x0103, + SYSKEYDOWN = 0x0104, + SYSKEYUP = 0x0105, + SYSCHAR = 0x0106, + SYSDEADCHAR = 0x0107, + UNICHAR = 0x0109, + KEYLAST = 0x0109, + IME_STARTCOMPOSITION = 0x010D, + IME_ENDCOMPOSITION = 0x010E, + IME_COMPOSITION = 0x010F, + IME_KEYLAST = 0x010F, + INITDIALOG = 0x0110, + COMMAND = 0x0111, + SYSCOMMAND = 0x0112, + TIMER = 0x0113, + HSCROLL = 0x0114, + VSCROLL = 0x0115, + INITMENU = 0x0116, + INITMENUPOPUP = 0x0117, + MENUSELECT = 0x011F, + MENUCHAR = 0x0120, + ENTERIDLE = 0x0121, + MENURBUTTONUP = 0x0122, + MENUDRAG = 0x0123, + MENUGETOBJECT = 0x0124, + UNINITMENUPOPUP = 0x0125, + MENUCOMMAND = 0x0126, + CHANGEUISTATE = 0x0127, + UPDATEUISTATE = 0x0128, + QUERYUISTATE = 0x0129, + CTLCOLORMSGBOX = 0x0132, + CTLCOLOREDIT = 0x0133, + CTLCOLORLISTBOX = 0x0134, + CTLCOLORBTN = 0x0135, + CTLCOLORDLG = 0x0136, + CTLCOLORSCROLLBAR = 0x0137, + CTLCOLORSTATIC = 0x0138, + MOUSEFIRST = 0x0200, + MOUSEMOVE = 0x0200, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + LBUTTONDBLCLK = 0x0203, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + RBUTTONDBLCLK = 0x0206, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MBUTTONDBLCLK = 0x0209, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, + XBUTTONDBLCLK = 0x020D, + MOUSEHWHEEL = 0x020E, + MOUSELAST = 0x020E, + PARENTNOTIFY = 0x0210, + ENTERMENULOOP = 0x0211, + EXITMENULOOP = 0x0212, + NEXTMENU = 0x0213, + SIZING = 0x0214, + CAPTURECHANGED = 0x0215, + MOVING = 0x0216, + POWERBROADCAST = 0x0218, + DEVICECHANGE = 0x0219, + MDICREATE = 0x0220, + MDIDESTROY = 0x0221, + MDIACTIVATE = 0x0222, + MDIRESTORE = 0x0223, + MDINEXT = 0x0224, + MDIMAXIMIZE = 0x0225, + MDITILE = 0x0226, + MDICASCADE = 0x0227, + MDIICONARRANGE = 0x0228, + MDIGETACTIVE = 0x0229, + MDISETMENU = 0x0230, + ENTERSIZEMOVE = 0x0231, + EXITSIZEMOVE = 0x0232, + DROPFILES = 0x0233, + MDIREFRESHMENU = 0x0234, + IME_SETCONTEXT = 0x0281, + IME_NOTIFY = 0x0282, + IME_CONTROL = 0x0283, + IME_COMPOSITIONFULL = 0x0284, + IME_SELECT = 0x0285, + IME_CHAR = 0x0286, + IME_REQUEST = 0x0288, + IME_KEYDOWN = 0x0290, + IME_KEYUP = 0x0291, + MOUSEHOVER = 0x02A1, + MOUSELEAVE = 0x02A3, + NCMOUSEHOVER = 0x02A0, + NCMOUSELEAVE = 0x02A2, + WTSSESSION_CHANGE = 0x02B1, + TABLET_FIRST = 0x02c0, + TABLET_LAST = 0x02df, + CUT = 0x0300, + COPY = 0x0301, + PASTE = 0x0302, + CLEAR = 0x0303, + UNDO = 0x0304, + RENDERFORMAT = 0x0305, + RENDERALLFORMATS = 0x0306, + DESTROYCLIPBOARD = 0x0307, + DRAWCLIPBOARD = 0x0308, + PAINTCLIPBOARD = 0x0309, + VSCROLLCLIPBOARD = 0x030A, + SIZECLIPBOARD = 0x030B, + ASKCBFORMATNAME = 0x030C, + CHANGECBCHAIN = 0x030D, + HSCROLLCLIPBOARD = 0x030E, + QUERYNEWPALETTE = 0x030F, + PALETTEISCHANGING = 0x0310, + PALETTECHANGED = 0x0311, + HOTKEY = 0x0312, + PRINT = 0x0317, + PRINTCLIENT = 0x0318, + APPCOMMAND = 0x0319, + THEMECHANGED = 0x031A, + CLIPBOARDUPDATE = 0x031D, + DWMCOMPOSITIONCHANGED = 0x031E, + DWMNCRENDERINGCHANGED = 0x031F, + DWMCOLORIZATIONCOLORCHANGED = 0x0320, + DWMWINDOWMAXIMIZEDCHANGE = 0x0321, + GETTITLEBARINFOEX = 0x033F, + HANDHELDFIRST = 0x0358, + HANDHELDLAST = 0x035F, + AFXFIRST = 0x0360, + AFXLAST = 0x037F, + PENWINFIRST = 0x0380, + PENWINLAST = 0x038F, + APP = 0x8000, + USER = 0x0400, + CPL_LAUNCH = USER+0x1000, + CPL_LAUNCHED = USER+0x1001, + SYSTIMER = 0x118 + } + + } +} +'@ +Add-Type $fontCSharpCode + + +#******************************************************************* +# Declare Functions +#******************************************************************* + +#******************************************************************* +# Function Get-SpecialFolder() +# +# Purpose: Convert a CSIDL string to a folder parh string +# +# Input: $id CSIDL folder identifier string +# +# Returns: Folder path +# +#******************************************************************* +function Get-SpecialFolder($id) +{ + $shell = New-Object –COM "Shell.Application" + $folder = $shell.NameSpace($id) + $specialFolder = $folder.Self.Path + $specialFolder +} + + +#******************************************************************* +# Function Add-SingleFont() +# +# Purpose: Install a font file +# +# Input: $file Font file path +# +# Returns: 0 - success, 1 - failure +# +#******************************************************************* +function Add-SingleFont($filePath) +{ + try + { + [string]$filePath = (resolve-path $filePath).path + [string]$fileDir = split-path $filePath + [string]$fileName = split-path $filePath -leaf + [string]$fileExt = (Get-Item $filePath).extension + [string]$fileBaseName = $fileName -replace($fileExt ,"") + + $shell = new-object -com shell.application + $myFolder = $shell.Namespace($fileDir) + $fileobj = $myFolder.Items().Item($fileName) + $fontName = $myFolder.GetDetailsOf($fileobj,21) + + if ($fontName -eq "") { $fontName = $fileBaseName } + + copy-item $filePath -destination $fontsFolderPath + + $fontFinalPath = Join-Path $fontsFolderPath $fileName + $retVal = [FontResource.AddRemoveFonts]::AddFont($fontFinalPath) + + if ($retVal -eq 0) { + Write-Host "Font `'$($filePath)`'`' installation failed" + Write-Host "" + 1 + } + else + { + Write-Host "Font `'$($filePath)`' installed successfully" + Write-Host "" + Set-ItemProperty -path "$($fontRegistryPath)" -name "$($fontName)$($hashFontFileTypes.item($fileExt))" -value "$($fileName)" -type STRING + 0 + } + "" + } + catch + { + Write-Host "An error occured installing `'$($filePath)`'" + Write-Host "" + Write-Host "$($error[0].ToString())" + Write-Host "" + $error.clear() + 1 + } +} + + +#******************************************************************* +# Function Show-Usage() +# +# Purpose: Shows the correct usage to the user. +# +# Input: None +# +# Output: Help messages are displayed on screen. +# +#******************************************************************* +function Show-Usage() +{ +$usage = @' +Add-Font.ps1 +This script is used to install Windows fonts. + +Usage: +Add-Font.ps1 -help | -path "" + +Parameters: + + -help + Displays usage information. + + -path + May be either the path to a font file to install or the path to a folder + containing font files to install. Valid file types are .fon, .fnt, + .ttf,.ttc, .otf, .mmm, .pbf, and .pfm + +Examples: + Add-Font.ps1 + Add-Font.ps1 -path "C:\Custom Fonts\MyFont.ttf" + Add-Font.ps1 -path "C:\Custom Fonts" +'@ + +$usage +} + + +#******************************************************************* +# Function Process-Arguments() +# +# Purpose: To validate parameters and their values +# +# Input: All parameters +# +# Output: Exit script if parameters are invalid +# +#******************************************************************* +function Process-Arguments() +{ + ## Write-host 'Processing Arguments' + + if ($unnamedArgs.Length -gt 0) + { + write-host "The following arguments are not defined:" + $unnamedArgs + } + + if ($help -eq $true) + { + Show-Usage + break + } + + if ((Test-Path $path -PathType Leaf) -eq $true) + { + If ($hashFontFileTypes.ContainsKey((Get-Item $path).Extension)) + { + $retVal = Add-SingleFont $path + if ($retVal -ne 0) + { + exit 1 + } + else + { + exit 0 + } + } + else + { + "`'$($path)`' not a valid font file type" + "" + exit 1 + } + } + elseif ((Test-Path $path -PathType Container) -eq $true) + { + $bErrorOccured = $false + foreach($file in (Get-Childitem $path)) + { + + if ($hashFontFileTypes.ContainsKey($file.Extension)) + { + $retVal = Add-SingleFont (Join-Path $path $file.Name) + if ($retVal -ne 0) + { + $bErrorOccured = $true + } + } + else + { + "`'$(Join-Path $path $file.Name)`' not a valid font file type" + "" + } + } + + If ($bErrorOccured -eq $true) + { + exit 1 + } + else + { + exit 0 + } + } + else + { + "`'$($path)`' not found" + "" + exit 1 + } +} + + +#******************************************************************* +# Main Script +#******************************************************************* + +$fontsFolderPath = Get-SpecialFolder($CSIDL_FONTS) +Process-Arguments + diff --git a/chocolatey/tools/Remove-Font.ps1 b/chocolatey/tools/Remove-Font.ps1 new file mode 100644 index 000000000..a4382cbfe --- /dev/null +++ b/chocolatey/tools/Remove-Font.ps1 @@ -0,0 +1,618 @@ +######################################################################################### +# MICROSOFT LEGAL STATEMENT FOR SAMPLE SCRIPTS/CODE +######################################################################################### +# This Sample Code is provided for the purpose of illustration only and is not +# intended to be used in a production environment. +# +# THIS SAMPLE CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY +# OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +# +# We grant You a nonexclusive, royalty-free right to use and modify the Sample Code +# and to reproduce and distribute the object code form of the Sample Code, provided +# that You agree: +# (i) to not use Our name, logo, or trademarks to market Your software product +# in which the Sample Code is embedded; +# (ii) to include a valid copyright notice on Your software product in which +# the Sample Code is embedded; and +# (iii) to indemnify, hold harmless, and defend Us and Our suppliers from and +# against any claims or lawsuits, including attorneys’ fees, that arise +# or result from the use or distribution of the Sample Code. +######################################################################################### + +#****************************************************************************** +# File: Remove-Font.ps1 +# Date: 08/28/2013 +# Version: 1.0.1 +# +# Purpose: PowerShell script to uninstall a Windows font. +# +# Usage: Remove-Font -help | -path "" +# +# Copyright (C) 2010 Microsoft Corporation +# +# +# Revisions: +# ---------- +# 1.0.0 09/22/2010 Created script. +# 1.0.1 08/28/2013 Now checking if $error[0] is not null before trying to +# echo that value in Remove-SingleFont so as not to +# generate an error when none occurred. +# +#****************************************************************************** + +#requires -Version 2.0 + +#******************************************************************* +# Declare Parameters +#******************************************************************* +param( + [string] $file = "", + [switch] $help = $false +) + + +#******************************************************************* +# Declare Global Variables and Constants +#******************************************************************* + +# Define constants +set-variable CSIDL_FONTS 0x14 -option constant + +# Create hashtable containing valid font file extensions and text to append to Registry entry name. +$hashFontFileTypes = @{} +$hashFontFileTypes.Add(".fon", "") +$hashFontFileTypes.Add(".fnt", "") +$hashFontFileTypes.Add(".ttf", " (TrueType)") +$hashFontFileTypes.Add(".ttc", " (TrueType)") +$hashFontFileTypes.Add(".otf", " (OpenType)") +# Type 1 fonts require handling multiple resource files. +# Not supported in this script +#$hashFontFileTypes.Add(".mmm", "") +#$hashFontFileTypes.Add(".pbf", "") +#$hashFontFileTypes.Add(".pfm", "") + +# Initialize variables +$invocation = (Get-Variable MyInvocation -Scope 0).Value +$scriptPath = Split-Path $Invocation.MyCommand.Path +$fontRegistryPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" + + +#******************************************************************* +# Load C# code +#******************************************************************* +$fontCSharpCode = @' +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Runtime.InteropServices; + +namespace FontResource +{ + public class AddRemoveFonts + { + private static IntPtr HWND_BROADCAST = new IntPtr(0xffff); + private static IntPtr HWND_TOP = new IntPtr(0); + private static IntPtr HWND_BOTTOM = new IntPtr(1); + private static IntPtr HWND_TOPMOST = new IntPtr(-1); + private static IntPtr HWND_NOTOPMOST = new IntPtr(-2); + private static IntPtr HWND_MESSAGE = new IntPtr(-3); + + [DllImport("gdi32.dll")] + static extern int AddFontResource(string lpFilename); + + [DllImport("gdi32.dll")] + static extern int RemoveFontResource(string lpFileName); + + [DllImport("user32.dll",CharSet=CharSet.Auto)] + private static extern int SendMessage(IntPtr hWnd, WM wMsg, IntPtr wParam, IntPtr lParam); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("user32.dll", SetLastError = true)] + private static extern bool PostMessage(IntPtr hWnd, WM Msg, IntPtr wParam, IntPtr lParam); + + public static int AddFont(string fontFilePath) { + FileInfo fontFile = new FileInfo(fontFilePath); + if (!fontFile.Exists) + { + return 0; + } + try + { + int retVal = AddFontResource(fontFilePath); + + //This version of SendMessage is a blocking call until all windows respond. + //long result = SendMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + //Alternatively PostMessage instead of SendMessage to prevent application hang + bool posted = PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + return retVal; + } + catch + { + return 0; + } + } + + public static int RemoveFont(string fontFileName) { + //FileInfo fontFile = new FileInfo(fontFileName); + //if (!fontFile.Exists) + //{ + // return false; + //} + try + { + int retVal = RemoveFontResource(fontFileName); + + //This version of SendMessage is a blocking call until all windows respond. + //long result = SendMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + //Alternatively PostMessage instead of SendMessage to prevent application hang + bool posted = PostMessage(HWND_BROADCAST, WM.FONTCHANGE, IntPtr.Zero, IntPtr.Zero); + + return retVal; + } + catch + { + return 0; + } + } + + public enum WM : uint + { + NULL = 0x0000, + CREATE = 0x0001, + DESTROY = 0x0002, + MOVE = 0x0003, + SIZE = 0x0005, + ACTIVATE = 0x0006, + SETFOCUS = 0x0007, + KILLFOCUS = 0x0008, + ENABLE = 0x000A, + SETREDRAW = 0x000B, + SETTEXT = 0x000C, + GETTEXT = 0x000D, + GETTEXTLENGTH = 0x000E, + PAINT = 0x000F, + CLOSE = 0x0010, + QUERYENDSESSION = 0x0011, + QUERYOPEN = 0x0013, + ENDSESSION = 0x0016, + QUIT = 0x0012, + ERASEBKGND = 0x0014, + SYSCOLORCHANGE = 0x0015, + SHOWWINDOW = 0x0018, + WININICHANGE = 0x001A, + SETTINGCHANGE = WM.WININICHANGE, + DEVMODECHANGE = 0x001B, + ACTIVATEAPP = 0x001C, + FONTCHANGE = 0x001D, + TIMECHANGE = 0x001E, + CANCELMODE = 0x001F, + SETCURSOR = 0x0020, + MOUSEACTIVATE = 0x0021, + CHILDACTIVATE = 0x0022, + QUEUESYNC = 0x0023, + GETMINMAXINFO = 0x0024, + PAINTICON = 0x0026, + ICONERASEBKGND = 0x0027, + NEXTDLGCTL = 0x0028, + SPOOLERSTATUS = 0x002A, + DRAWITEM = 0x002B, + MEASUREITEM = 0x002C, + DELETEITEM = 0x002D, + VKEYTOITEM = 0x002E, + CHARTOITEM = 0x002F, + SETFONT = 0x0030, + GETFONT = 0x0031, + SETHOTKEY = 0x0032, + GETHOTKEY = 0x0033, + QUERYDRAGICON = 0x0037, + COMPAREITEM = 0x0039, + GETOBJECT = 0x003D, + COMPACTING = 0x0041, + COMMNOTIFY = 0x0044, + WINDOWPOSCHANGING = 0x0046, + WINDOWPOSCHANGED = 0x0047, + POWER = 0x0048, + COPYDATA = 0x004A, + CANCELJOURNAL = 0x004B, + NOTIFY = 0x004E, + INPUTLANGCHANGEREQUEST = 0x0050, + INPUTLANGCHANGE = 0x0051, + TCARD = 0x0052, + HELP = 0x0053, + USERCHANGED = 0x0054, + NOTIFYFORMAT = 0x0055, + CONTEXTMENU = 0x007B, + STYLECHANGING = 0x007C, + STYLECHANGED = 0x007D, + DISPLAYCHANGE = 0x007E, + GETICON = 0x007F, + SETICON = 0x0080, + NCCREATE = 0x0081, + NCDESTROY = 0x0082, + NCCALCSIZE = 0x0083, + NCHITTEST = 0x0084, + NCPAINT = 0x0085, + NCACTIVATE = 0x0086, + GETDLGCODE = 0x0087, + SYNCPAINT = 0x0088, + NCMOUSEMOVE = 0x00A0, + NCLBUTTONDOWN = 0x00A1, + NCLBUTTONUP = 0x00A2, + NCLBUTTONDBLCLK = 0x00A3, + NCRBUTTONDOWN = 0x00A4, + NCRBUTTONUP = 0x00A5, + NCRBUTTONDBLCLK = 0x00A6, + NCMBUTTONDOWN = 0x00A7, + NCMBUTTONUP = 0x00A8, + NCMBUTTONDBLCLK = 0x00A9, + NCXBUTTONDOWN = 0x00AB, + NCXBUTTONUP = 0x00AC, + NCXBUTTONDBLCLK = 0x00AD, + INPUT_DEVICE_CHANGE = 0x00FE, + INPUT = 0x00FF, + KEYFIRST = 0x0100, + KEYDOWN = 0x0100, + KEYUP = 0x0101, + CHAR = 0x0102, + DEADCHAR = 0x0103, + SYSKEYDOWN = 0x0104, + SYSKEYUP = 0x0105, + SYSCHAR = 0x0106, + SYSDEADCHAR = 0x0107, + UNICHAR = 0x0109, + KEYLAST = 0x0109, + IME_STARTCOMPOSITION = 0x010D, + IME_ENDCOMPOSITION = 0x010E, + IME_COMPOSITION = 0x010F, + IME_KEYLAST = 0x010F, + INITDIALOG = 0x0110, + COMMAND = 0x0111, + SYSCOMMAND = 0x0112, + TIMER = 0x0113, + HSCROLL = 0x0114, + VSCROLL = 0x0115, + INITMENU = 0x0116, + INITMENUPOPUP = 0x0117, + MENUSELECT = 0x011F, + MENUCHAR = 0x0120, + ENTERIDLE = 0x0121, + MENURBUTTONUP = 0x0122, + MENUDRAG = 0x0123, + MENUGETOBJECT = 0x0124, + UNINITMENUPOPUP = 0x0125, + MENUCOMMAND = 0x0126, + CHANGEUISTATE = 0x0127, + UPDATEUISTATE = 0x0128, + QUERYUISTATE = 0x0129, + CTLCOLORMSGBOX = 0x0132, + CTLCOLOREDIT = 0x0133, + CTLCOLORLISTBOX = 0x0134, + CTLCOLORBTN = 0x0135, + CTLCOLORDLG = 0x0136, + CTLCOLORSCROLLBAR = 0x0137, + CTLCOLORSTATIC = 0x0138, + MOUSEFIRST = 0x0200, + MOUSEMOVE = 0x0200, + LBUTTONDOWN = 0x0201, + LBUTTONUP = 0x0202, + LBUTTONDBLCLK = 0x0203, + RBUTTONDOWN = 0x0204, + RBUTTONUP = 0x0205, + RBUTTONDBLCLK = 0x0206, + MBUTTONDOWN = 0x0207, + MBUTTONUP = 0x0208, + MBUTTONDBLCLK = 0x0209, + MOUSEWHEEL = 0x020A, + XBUTTONDOWN = 0x020B, + XBUTTONUP = 0x020C, + XBUTTONDBLCLK = 0x020D, + MOUSEHWHEEL = 0x020E, + MOUSELAST = 0x020E, + PARENTNOTIFY = 0x0210, + ENTERMENULOOP = 0x0211, + EXITMENULOOP = 0x0212, + NEXTMENU = 0x0213, + SIZING = 0x0214, + CAPTURECHANGED = 0x0215, + MOVING = 0x0216, + POWERBROADCAST = 0x0218, + DEVICECHANGE = 0x0219, + MDICREATE = 0x0220, + MDIDESTROY = 0x0221, + MDIACTIVATE = 0x0222, + MDIRESTORE = 0x0223, + MDINEXT = 0x0224, + MDIMAXIMIZE = 0x0225, + MDITILE = 0x0226, + MDICASCADE = 0x0227, + MDIICONARRANGE = 0x0228, + MDIGETACTIVE = 0x0229, + MDISETMENU = 0x0230, + ENTERSIZEMOVE = 0x0231, + EXITSIZEMOVE = 0x0232, + DROPFILES = 0x0233, + MDIREFRESHMENU = 0x0234, + IME_SETCONTEXT = 0x0281, + IME_NOTIFY = 0x0282, + IME_CONTROL = 0x0283, + IME_COMPOSITIONFULL = 0x0284, + IME_SELECT = 0x0285, + IME_CHAR = 0x0286, + IME_REQUEST = 0x0288, + IME_KEYDOWN = 0x0290, + IME_KEYUP = 0x0291, + MOUSEHOVER = 0x02A1, + MOUSELEAVE = 0x02A3, + NCMOUSEHOVER = 0x02A0, + NCMOUSELEAVE = 0x02A2, + WTSSESSION_CHANGE = 0x02B1, + TABLET_FIRST = 0x02c0, + TABLET_LAST = 0x02df, + CUT = 0x0300, + COPY = 0x0301, + PASTE = 0x0302, + CLEAR = 0x0303, + UNDO = 0x0304, + RENDERFORMAT = 0x0305, + RENDERALLFORMATS = 0x0306, + DESTROYCLIPBOARD = 0x0307, + DRAWCLIPBOARD = 0x0308, + PAINTCLIPBOARD = 0x0309, + VSCROLLCLIPBOARD = 0x030A, + SIZECLIPBOARD = 0x030B, + ASKCBFORMATNAME = 0x030C, + CHANGECBCHAIN = 0x030D, + HSCROLLCLIPBOARD = 0x030E, + QUERYNEWPALETTE = 0x030F, + PALETTEISCHANGING = 0x0310, + PALETTECHANGED = 0x0311, + HOTKEY = 0x0312, + PRINT = 0x0317, + PRINTCLIENT = 0x0318, + APPCOMMAND = 0x0319, + THEMECHANGED = 0x031A, + CLIPBOARDUPDATE = 0x031D, + DWMCOMPOSITIONCHANGED = 0x031E, + DWMNCRENDERINGCHANGED = 0x031F, + DWMCOLORIZATIONCOLORCHANGED = 0x0320, + DWMWINDOWMAXIMIZEDCHANGE = 0x0321, + GETTITLEBARINFOEX = 0x033F, + HANDHELDFIRST = 0x0358, + HANDHELDLAST = 0x035F, + AFXFIRST = 0x0360, + AFXLAST = 0x037F, + PENWINFIRST = 0x0380, + PENWINLAST = 0x038F, + APP = 0x8000, + USER = 0x0400, + CPL_LAUNCH = USER+0x1000, + CPL_LAUNCHED = USER+0x1001, + SYSTIMER = 0x118 + } + + } +} +'@ +Add-Type $fontCSharpCode + + +#******************************************************************* +# Declare Functions +#******************************************************************* + +#******************************************************************* +# Function Get-SpecialFolder() +# +# Purpose: Convert a CSIDL string to a folder parh string +# +# Input: $id CSIDL folder identifier string +# +# Returns: Folder path +# +#******************************************************************* +function Get-SpecialFolder($id) +{ + $shell = New-Object –COM "Shell.Application" + $folder = $shell.NameSpace($id) + $specialFolder = $folder.Self.Path + $specialFolder +} + + +#******************************************************************* +# Function Get-RegistryStringNameFromValue() +# +# Purpose: Return the Registry value name +# +# Input: $keyPath Regsitry key drive path +# $valueData Regsitry value sting data +# +# Returns: Registry string value name +# +#******************************************************************* +function Get-RegistryStringNameFromValue([string] $keyPath, [string] $valueData) +{ + $pattern = [Regex]::Escape($valueData) + + foreach($property in (Get-ItemProperty $keyPath).PsObject.Properties) + { + ## Skip the property if it was one PowerShell added + if(($property.Name -eq "PSPath") -or + ($property.Name -eq "PSChildName")) + { + continue + } + ## Search the text of the property + $propertyText = "$($property.Value)" + if($propertyText -match $pattern) + { + "$($property.Name)" + } + } +} + + +#******************************************************************* +# Function Remove-SingleFont() +# +# Purpose: Uninstall a font file +# +# Input: $file Font file name +# +# Returns: 0 - success, 1 - failure +# +#******************************************************************* +function Remove-SingleFont($file) +{ + try + { + $fontFinalPath = Join-Path $fontsFolderPath $file + $retVal = [FontResource.AddRemoveFonts]::RemoveFont($fontFinalPath) + if ($retVal -eq 0) { + Write-Host "Font `'$($file)`' removal failed" + Write-Host "" + 1 + } + else + { + $fontRegistryvaluename = (Get-RegistryStringNameFromValue $fontRegistryPath $file) + Write-Host "Font: $($fontRegistryvaluename)" + if ($fontRegistryvaluename -ne "") + { + Remove-ItemProperty -path $fontRegistryPath -name $fontRegistryvaluename + } + Remove-Item $fontFinalPath + if ($error[0] -ne $null) + { + Write-Host "An error occured removing $`'$($file)`'" + Write-Host "" + Write-Host "$($error[0].ToString())" + $error.clear() + } + else + { + Write-Host "Font `'$($file)`' removed successfully" + Write-Host "" + } + 0 + } + "" + } + catch + { + Write-Host "An error occured removing `'$($file)`'" + Write-Host "" + Write-Host "$($error[0].ToString())" + Write-Host "" + $error.clear() + 1 + } +} + + +#******************************************************************* +# Function Show-Usage() +# +# Purpose: Shows the correct usage to the user. +# +# Input: None +# +# Output: Help messages are displayed on screen. +# +#******************************************************************* +function Show-Usage() +{ +$usage = @' +Remove-Font.ps1 +This script is used to uninstall a Windows font. + +Usage: +Remove-Font.ps1 -help | -path "" + +Parameters: + + -help + Displays usage information. + + -file + Font file name. Files located in \Windows\Fonts. Valid file + types are .fon, .fnt, .ttf,.ttc, .otf, .mmm, .pbf, and .pfm + +Examples: + Remove-Font.ps1 + Remove-Font.ps1 -file "MyFont.ttf" +'@ + +$usage +} + + +#******************************************************************* +# Function Process-Arguments() +# +# Purpose: To validate parameters and their values +# +# Input: All parameters +# +# Output: Exit script if parameters are invalid +# +#******************************************************************* +function Process-Arguments() +{ + ## Write-host 'Processing Arguments' + + if ($unnamedArgs.Length -gt 0) + { + write-host "The following arguments are not defined:" + $unnamedArgs + } + + if ($help -eq $true) + { + Show-Usage + break + } + + $fontFilePath = Join-Path $fontsFolderPath $file + if ((Test-Path $fontFilePath -PathType Leaf) -eq $true) + { + If ($hashFontFileTypes.ContainsKey((Get-Item $fontFilePath).Extension)) + { + $retVal = Remove-SingleFont $file + if ($retVal -ne 0) + { + exit 1 + } + else + { + exit 0 + } + } + else + { + "`'$($fontFilePath)`' not a valid font file type" + "" + exit 1 + } + } + else + { + "`'$($fontFilePath)`' not found" + "" + exit 1 + } +} + + +#******************************************************************* +# Main Script +#******************************************************************* + +$fontsFolderPath = Get-SpecialFolder($CSIDL_FONTS) +Process-Arguments + diff --git a/chocolatey/tools/chocolateybeforemodify.ps1 b/chocolatey/tools/chocolateybeforemodify.ps1 new file mode 100644 index 000000000..4e637fcf7 --- /dev/null +++ b/chocolatey/tools/chocolateybeforemodify.ps1 @@ -0,0 +1,11 @@ +# Removing fonts +function Get-CurrentDirectory +{{ + $thisName = $MyInvocation.MyCommand.Name + [IO.Path]::GetDirectoryName((Get-Content function:$thisName).File) +}} + +$RemoveFont = Join-Path (Get-CurrentDirectory) "Remove-Font.ps1" +foreach ($font in ({fonts})) {{ + & "$RemoveFont" "$font" +}} diff --git a/chocolatey/tools/chocolateyinstall.ps1 b/chocolatey/tools/chocolateyinstall.ps1 new file mode 100644 index 000000000..2071d8a64 --- /dev/null +++ b/chocolatey/tools/chocolateyinstall.ps1 @@ -0,0 +1,19 @@ +$tools = Split-Path $MyInvocation.MyCommand.Definition +$package = Join-Path (Split-Path $tools) "fonts" + +function Get-CurrentDirectory +{{ + $thisName = $MyInvocation.MyCommand.Name + [IO.Path]::GetDirectoryName((Get-Content function:$thisName).File) +}} + +Install-ChocolateyZipPackage ` + -PackageName "$env:ChocolateyPackageName" ` + -Url 'https://github.com/ryanoasis/nerd-fonts/releases/download/{version}/{font}.zip' ` + -Checksum '{hash}' ` + -ChecksumType 'SHA256' ` + -UnzipLocation $package + +$AddFont = Join-Path (Get-CurrentDirectory) 'Add-Font.ps1' +& $AddFont -Path "$package" +Remove-Item -Recurse -Force $package