Functions/Install-Font.ps1

# Copyright (c) 2018, the WebKit for Windows project authors. Please see the
# AUTHORS file for details. All rights reserved. Use of this source code is
# governed by a BSD-style license that can be found in the LICENSE file.

<#
  .Synopsis
  Downloads an installs a font.
 
  .Parameter Url
  The URL to download from.
#>

function Install-Font {
  Param(
    [Parameter(Mandatory)]
    [string] $url
  )

  $filename = [System.IO.Path]::GetFilename($url);
  $fontPath = Join-Path ([System.IO.Path]::GetTempPath()) $filename;

  Write-Host ('Downloading {0} font from {1} ..' -f $name, $url);
  Invoke-WebFileRequest -Url $url -DestinationPath $fontPath;
  Write-Host ('Downloaded {0} bytes' -f (Get-Item $fontPath).length);

  # Retrieve the font's name
  if (-not ('System.Drawing.Text.PrivateFontCollection' -as [Type])) {
    Add-Type -AssemblyName System.Drawing;
  }

  $fontCollection = New-Object System.Drawing.Text.PrivateFontCollection;
  $fontCollection.AddFontFile($fontPath);
  $fontName = $fontCollection.Families.Name;

  Write-Host ('Installing font {0} from {1}' -f $fontName, $filename);

  # Move the file to the correct location
  $shell = New-Object -COMObject Shell.Application;
  $fonts = $shell.Namespace(0x14);
  $installationPath = $fonts.Self.Path;

  Write-Host ('Installing at {0}' -f $installationPath);

  $fonts.CopyHere($fontPath);

  # Font suffixes when creating the registry key
  $fontSuffix = @{
    '.fon' = ''
    '.fnt' = ''
    '.ttf' = ' (TrueType)'
    '.ttc' = ' (TrueType)'
    '.otf' = ' (OpenType)'
  }

  # Add the font to the registry
  $registryPath = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts';
  $registryKey = ('{0}{1}' -f $fontName, $fontSuffix[[System.IO.Path]::GetExtension($filename)]);
  $registryTest = Get-ItemProperty -Path $registryPath -Name $registryKey -ErrorAction SilentlyContinue;

  if (-not ($registryTest)) {
    Write-Host ('Writing {0} : {1} at ${2}' -f $registryKey, $filename, $registryPath);
    New-ItemProperty -Path $registryPath -Name $registryKey -PropertyType String -Value $filename | Out-Null;
  } else {
    Write-Host 'Font already present in registry';
    Write-Host ('Value {0} : {1} at ${2}' -f $registryKey, $registryTest.$registryKey, $registryPath);
  }

  # Verify that the font is present
  Get-Font $name;

  # Cleanup the temp directory
  Remove-TempFiles;
}