From e397123c70d2ad564753f8aad1e1ac82276234f0 Mon Sep 17 00:00:00 2001 From: Louie S Date: Thu, 16 Mar 2023 21:33:47 -0700 Subject: Rewrite in POSIX shell; index entries from the index pages --- Makefile | 6 ++- README | 3 +- src/index.rb | 30 --------------- src/index.sh | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 33 deletions(-) delete mode 100755 src/index.rb create mode 100755 src/index.sh diff --git a/Makefile b/Makefile index 836fe3c..096ceee 100644 --- a/Makefile +++ b/Makefile @@ -47,9 +47,11 @@ $(DOCUMENTS_DIR): $(RESOURCES_DIR) $(MANUAL_FILE) $(INFO_PLIST_FILE): src/Info.plist $(CONTENTS_DIR) cp src/Info.plist $@ -$(INDEX_FILE): src/index.rb $(DOCUMENTS_DIR) +$(INDEX_FILE): src/index.sh $(DOCUMENTS_DIR) rm -f $@ - ruby src/index.rb $(DOCUMENTS_DIR)/*.html | sqlite3 $@ + src/index.sh $@ $(DOCUMENTS_DIR)/*.html + src/index.sh -i $@ $(DOCUMENTS_DIR)/Concept-Index.html + src/index.sh -i -c "Function Variable Directive" $@ $(DOCUMENTS_DIR)/Name-Index.html $(ICON_FILE): src/icon.png $(DOCSET_DIR) cp src/icon.png $@ diff --git a/README b/README index 541e5e4..5ddd230 100644 --- a/README +++ b/README @@ -9,7 +9,8 @@ will be downloaded from www.gnu.org and packaged appropriately. Requirements: +- any POSIX-compliant shell - curl - make -- ruby +- pup - sqlite3 diff --git a/src/index.rb b/src/index.rb deleted file mode 100755 index da58535..0000000 --- a/src/index.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'pathname' - -puts %Q[ - CREATE TABLE searchIndex(id INTEGER PRIMARY KEY, name TEXT, type TEXT, path TEXT); - CREATE UNIQUE INDEX anchor ON searchIndex (name, type, path); -] - -INSERT_SQL = %Q[ - INSERT INTO searchIndex(name, type, path) VALUES ('%s','%s','%s'); -] - -PATTERN = %r[(.+)] - -def quote(s) - s.gsub(/&/, '&').gsub(/'/, "\\'") -end - -ARGV.each do |arg| - Pathname.glob(arg) do |path| - match = path.each_line.lazy.map { |line| PATTERN.match(line) }.find { |m| m } - if match - title = match[1] - title.delete_prefix!('GNU make: ') # older docs - title.delete_suffix!(' (GNU make)') # newer docs - printf INSERT_SQL, quote(title), 'Guide', path.basename - else - $stderr.puts "#{path}: no title found" - end - end -end diff --git a/src/index.sh b/src/index.sh new file mode 100755 index 0000000..3b4cacd --- /dev/null +++ b/src/index.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env sh + +create_table() { + sqlite3 "$DB_PATH" "CREATE TABLE IF NOT EXISTS searchIndex(id INTEGER PRIMARY KEY, name TEXT, type TEXT, path TEXT);" + sqlite3 "$DB_PATH" "CREATE UNIQUE INDEX IF NOT EXISTS anchor ON searchIndex (name, type, path);" +} + +get_title() { + FILE="$1" + + pup -p -f "$FILE" 'title text{}' | \ + tr -d \\n | \ + sed 's/(GNU make)//g' | \ + sed 's/\"/\"\"/g' +} + +get_type() { + LINK="$(echo "$1" | sed 's/#[^#]*$//')" + LINK_TITLE="$(get_title "$2/$LINK")" + + set -- $POSSIBLE_TYPES + + while [ -n "$1" ]; do + if echo "$LINK_TITLE" | grep -iq "$1"; then + echo "$1" + return + fi + shift + done + + echo "Entry" +} + +insert() { + NAME="$1" + TYPE="$2" + PAGE_PATH="$3" + + sqlite3 "$DB_PATH" "INSERT INTO searchIndex(name, type, path) VALUES (\"$NAME\",\"$TYPE\",\"$PAGE_PATH\");" +} + +insert_index_terms() { + # Get each term from an index page and insert + while [ -n "$1" ]; do + grep -Eo ":" "$1" | while read -r line; do + insert_term "$line" "$(dirname "$1")" + done + + shift + done +} + + +insert_pages() { + # Get title and insert into table for each html file + while [ -n "$1" ]; do + unset PAGE_NAME + unset PAGE_TYPE + PAGE_NAME="$(get_title "$1")" + if [ -n "$PAGE_NAME" ]; then + PAGE_TYPE="Guide" + insert "$PAGE_NAME" "$PAGE_TYPE" "$(basename "$1")" + fi + shift + done +} + +insert_term() { + LINK="$1" + PAGE_DIR="$2" + + NAME="$(echo "$LINK" | pup -p 'a text{}' | tr -d \\n | sed 's/"/\"\"/g')" + TYPE="$INDEX_TYPE" + PAGE_PATH="$(echo "$LINK" | pup -p 'a attr{href}')" + if [ -n "$POSSIBLE_TYPES" ]; then + TYPE="$(get_type "$PAGE_PATH" "$PAGE_DIR")" + elif [ -z "$TYPE" ]; then + TYPE="Entry" + fi + + insert "$NAME" "$TYPE" "$PAGE_PATH" +} + +TYPE="PAGES" + +# Check flags +while true; do + case "$1" in + -c|--check) + # List of space-separated possible index entry types (overwrites -t) + shift + POSSIBLE_TYPES="$1" + shift + ;; + -i|--index) + # Set the script to handle index pages + TYPE="INDEX" + shift + ;; + -t|--type) + # Set a type for index entries + shift + INDEX_TYPE="$1" + shift + ;; + *) + break + esac +done + +DB_PATH="$1" +shift + +create_table +case "$TYPE" in + PAGES) + insert_pages "$@" + ;; + INDEX) + insert_index_terms "$@" + ;; +esac -- cgit