diff --git a/Free Ruler.xcodeproj/project.pbxproj b/Free Ruler.xcodeproj/project.pbxproj index a2b8faa..8debbed 100644 --- a/Free Ruler.xcodeproj/project.pbxproj +++ b/Free Ruler.xcodeproj/project.pbxproj @@ -32,8 +32,8 @@ 50B1D3532D05D00100B1D135 /* RulerCursorController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D3522D05D00100B1D135 /* RulerCursorController.swift */; }; 50B1D3552D05E00000B1D138 /* RulerTickLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D3542D05E00000B1D138 /* RulerTickLayout.swift */; }; 50B1D3592D06000100B1D139 /* AppIconRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D3582D06000100B1D139 /* AppIconRenderer.swift */; }; - 50B1D3602D06000600B1D139 /* AppIconGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D35F2D06000600B1D139 /* AppIconGenerator.swift */; }; 50B1D35D2D06000400B1D139 /* AppIconRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D3582D06000100B1D139 /* AppIconRenderer.swift */; }; + 50B1D3602D06000600B1D139 /* AppIconGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D35F2D06000600B1D139 /* AppIconGenerator.swift */; }; 50B1D3612D06000700B1D139 /* AppIconGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D35F2D06000600B1D139 /* AppIconGenerator.swift */; }; 50B1D3652D06010100B1D139 /* AppStoreScreenshotPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D3642D06010100B1D139 /* AppStoreScreenshotPreview.swift */; }; 50B1D3662D06010200B1D139 /* AppStoreScreenshotPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B1D3642D06010100B1D139 /* AppStoreScreenshotPreview.swift */; }; @@ -142,7 +142,7 @@ 8F629823243003EA004F9099 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MainMenu.strings; sourceTree = ""; }; 8F629825243003F6004F9099 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PreferencesController.xib; sourceTree = ""; }; 8F629828243003FF004F9099 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/PreferencesController.strings; sourceTree = ""; }; - AB053EE93E1DC9AF341A8D4F /* Free Ruler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; name = "Free Ruler.app"; path = "Free Ruler.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + AB053EE93E1DC9AF341A8D4F /* Free Ruler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Free Ruler.app"; sourceTree = BUILT_PRODUCTS_DIR; }; B894A5002BBFE61A005A3B6F /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/MainMenu.strings; sourceTree = ""; }; B894A5012BBFE61A005A3B6F /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/PreferencesController.strings; sourceTree = ""; }; D9DBE8A12C791B1600A42589 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/MainMenu.strings; sourceTree = ""; }; diff --git a/Free Ruler/AppDelegate.swift b/Free Ruler/AppDelegate.swift index 64ceae0..59a8666 100644 --- a/Free Ruler/AppDelegate.swift +++ b/Free Ruler/AppDelegate.swift @@ -145,7 +145,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { #endif showRulers() - } #if DEBUG diff --git a/Free Ruler/FreeRuler.help/Contents/Info.plist b/Free Ruler/FreeRuler.help/Contents/Info.plist index aadccca..168ec52 100644 --- a/Free Ruler/FreeRuler.help/Contents/Info.plist +++ b/Free Ruler/FreeRuler.help/Contents/Info.plist @@ -13,11 +13,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1 + 2.0.17 CFBundleSignature hbwr CFBundleVersion - 1 + 491 HPDBookAccessPath FreeRuler.html HPDBookIconPath @@ -25,7 +25,7 @@ HPDBookIndexPath English.lproj.helpindex HPDBookKBProduct - freeruler1 + freeruler2.0.17 HPDBookTitle Free Ruler Help HPDBookType diff --git a/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj/English.lproj.helpindex b/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj/English.lproj.helpindex index 34a8ac1..69d34f7 100644 Binary files a/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj/English.lproj.helpindex and b/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj/English.lproj.helpindex differ diff --git a/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj/FreeRuler.html b/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj/FreeRuler.html index f3fe3ee..5a88f77 100644 --- a/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj/FreeRuler.html +++ b/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj/FreeRuler.html @@ -1,39 +1,107 @@ + Free Ruler Help - - - - - + + + + + + + - - -

- Free Ruler Help -

- -

- Keyboard Shortcuts -

- - - - - - - - - - - - - -
FFloat/unfloat rulers above other windows
GGroup/ungroup rulers
SShow/hide ruler shadows
OOrient rulers at mouse location
UCycle units: pixels, millimeters, and inches
HFlip the horizontal ruler origin
VFlip the vertical ruler origin
RReset ruler positions to default
,Open Preferences
+ + +

+ Free Ruler Help +

+ +

+ Keyboard Shortcuts +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HHide or show the horizontal ruler
VHide or show the vertical ruler
HFlip the horizontal ruler origin
VFlip the vertical ruler origin
FFloat/unfloat rulers above other windows
GGroup/ungroup rulers
SShow/hide ruler shadows
OOrient rulers at mouse location
UCycle units: pixels, millimeters, and inches
RReset ruler positions to default
,Open Preferences
+ +

+ Features +

+ +
    +
  • Show horizontal and vertical rulers in pixels, millimeters, or inches.
  • +
  • Resize rulers, move them independently, or keep them grouped together.
  • +
  • Customize the ruler color in Preferences.
  • +
  • Float rulers above other windows and show or hide ruler shadows.
  • +
  • Align rulers at the mouse location, reset them to default positions, or flip their origins.
  • +
  • Show, hide, and reopen rulers from the menu or keyboard.
  • +
+ diff --git a/Free Ruler/FreeRuler.help/Contents/Resources/shrd/freeruler-help-icon-20260614005548-cabbb6a756bb.png b/Free Ruler/FreeRuler.help/Contents/Resources/shrd/freeruler-help-icon-20260614005548-cabbb6a756bb.png new file mode 100644 index 0000000..3fa9c08 Binary files /dev/null and b/Free Ruler/FreeRuler.help/Contents/Resources/shrd/freeruler-help-icon-20260614005548-cabbb6a756bb.png differ diff --git a/Free Ruler/FreeRuler.help/Contents/Resources/shrd/freeruler.png b/Free Ruler/FreeRuler.help/Contents/Resources/shrd/freeruler.png deleted file mode 100644 index 00a07ea..0000000 Binary files a/Free Ruler/FreeRuler.help/Contents/Resources/shrd/freeruler.png and /dev/null differ diff --git a/Free Ruler/FreeRuler.help/Contents/Resources/shrd/styles.css b/Free Ruler/FreeRuler.help/Contents/Resources/shrd/styles.css index be13974..7d56f79 100644 --- a/Free Ruler/FreeRuler.help/Contents/Resources/shrd/styles.css +++ b/Free Ruler/FreeRuler.help/Contents/Resources/shrd/styles.css @@ -3,8 +3,12 @@ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif; } +h2 { + margin-top: 40px; +} + .title-page-header { - background-image: url(./freeruler.png); + background-image: var(--free-ruler-help-icon); background-size: 200px 200px; background-repeat: no-repeat; padding-top: 220px; @@ -20,3 +24,12 @@ body { text-align: left; padding-left: 10px; } + +.features { + margin-top: 0; + padding-left: 22px; +} + +.features li { + margin-bottom: 8px; +} diff --git a/package.json b/package.json index fe843f1..070dfa6 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "get:version": "node -p \"require('./package.json').version\"", "get:commits": "git log --pretty=oneline | wc -l", "generate:icons": "scripts/generate-app-icon.sh", + "generate:help": "scripts/generate-help-index.sh", "generate:screenshots": "scripts/generate-app-store-screenshots.sh", "bump:version": "node scripts/release/bump-version.js", "release:version": "node scripts/release/set-version.js", diff --git a/scripts/generate-app-icon.sh b/scripts/generate-app-icon.sh index 03adcca..bf2df00 100755 --- a/scripts/generate-app-icon.sh +++ b/scripts/generate-app-icon.sh @@ -4,6 +4,9 @@ set -euo pipefail cd "$(dirname "$0")/.." output_dir="$PWD/Free Ruler/Images.xcassets/AppIcon.appiconset" +help_resource_dir="$PWD/Free Ruler/FreeRuler.help/Contents/Resources" +help_shared_dir="$help_resource_dir/shrd" +help_html="$help_resource_dir/English.lproj/FreeRuler.html" binary="${TMPDIR:-/tmp}/freeruler-generate-app-icon" module_cache="${TMPDIR:-/tmp}/freeruler-generate-app-icon-module-cache" @@ -16,3 +19,22 @@ xcrun swiftc \ -o "$binary" "$binary" "$output_dir" + +icon_hash="$(shasum -a 256 "$output_dir/icon_512x512.png" | awk '{ print substr($1, 1, 12) }')" +generated_at="$(date -u +%Y%m%d%H%M%S)" +help_cache_token="${generated_at}-${icon_hash}" +help_icon_name="freeruler-help-icon-${help_cache_token}.png" +help_icon="$help_shared_dir/$help_icon_name" + +cp "$output_dir/icon_512x512.png" "$help_icon" + +for stale_icon in "$help_shared_dir"/freeruler-help-icon-*.png; do + if [[ -e "$stale_icon" && "$stale_icon" != "$help_icon" ]]; then + rm "$stale_icon" + fi +done + +HELP_ICON_NAME="$help_icon_name" HELP_CACHE_TOKEN="$help_cache_token" perl -0pi -e \ + 's#href="\.\./shrd/styles\.css(?:\?[^"]*)?"#href="../shrd/styles.css?icon=$ENV{HELP_CACHE_TOKEN}"#; + s#--free-ruler-help-icon: url\("[^"]+"\);#--free-ruler-help-icon: url("../shrd/$ENV{HELP_ICON_NAME}");#' \ + "$help_html" diff --git a/scripts/generate-help-index.sh b/scripts/generate-help-index.sh new file mode 100755 index 0000000..d52c514 --- /dev/null +++ b/scripts/generate-help-index.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")/.." + +help_lproj_dir="$PWD/Free Ruler/FreeRuler.help/Contents/Resources/English.lproj" +help_index="$help_lproj_dir/English.lproj.helpindex" + +hiutil -I lsm -C -ag -s en -f "$help_index" "$help_lproj_dir"