Edit file File name : yelp-check Content :#!/bin/sh # -*- indent-tabs-mode: nil -*- # # yelp-check # Copyright (C) 2011-2015 Shaun McCance <shaunm@gnome.org> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. xsl_mal_link='/usr/share/yelp-xsl/xslt/mallard/common/mal-link.xsl' xsl_mal_license='/usr/share/yelp-tools/xslt/mal-license.xsl' xsl_mal_status='/usr/share/yelp-tools/xslt/mal-status.xsl' xsl_mal_rng='/usr/share/yelp-tools/xslt/mal-rng.xsl' xsl_comments='/usr/share/yelp-tools/xslt/comments.xsl' xsl_media='/usr/share/yelp-tools/xslt/media.xsl' yelp_check_retval="0" urlencode () { # We usually don't want to urlencode slashes, because we're # usually converting file paths to URIs. But we do want to # urlencode slases for names of RNG files in validate_page. if [ "x$2" = "x/" ]; then urlencode_slash='' else urlencode_slash='\/' fi echo "$1" | LC_ALL=C awk ' BEGIN { for (i = 1; i <= 255; i++) chars[sprintf("%c", i)] = i; } { ret = ""; for (i = 1; i <= length($0); i++) { c = substr($0, i, 1); if (c ~ /['$urlencode_slash'a-zA-Z0-9._-]/) ret = ret c; else ret = ret sprintf("%%%X%X", int(chars[c] / 16), chars[c] % 16); } print ret; }' } urldecode () { echo "$1" | LC_ALL=C awk ' BEGIN { for(i = 0; i < 10; i++) hex[i] = i; hex["A"] = hex["a"] = 10; hex["B"] = hex["b"] = 11; hex["C"] = hex["c"] = 12; hex["D"] = hex["d"] = 13; hex["E"] = hex["e"] = 14; hex["F"] = hex["f"] = 15; } { ret = ""; for (i = 1; i <= length($0); i++) { c = substr($0, i, 1); if (c == "+") { ret = ret " "; } else if (c == "%") { c = sprintf("%c", hex[substr($0, i + 1, 1)] * 16 + hex[substr($0, i + 2, 1)]); ret = ret c; i += 2; } else { ret = ret c; } } print ret; }' } docbook_version=' <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:db="http://docbook.org/ns/docbook" version="1.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:choose> <xsl:when test="/db:*/@version"> <xsl:value-of select="/db:*/@version"/> </xsl:when> <xsl:when test="/db:*"> <xsl:text>5.0</xsl:text> </xsl:when> <xsl:otherwise> <xsl:text>4</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> ' mallard_style=' <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mal="http://projectmallard.org/1.0/" version="1.0"> <xsl:output method="text"/> <xsl:template match="/mal:page"><xsl:value-of select="@style"/></xsl:template> </xsl:stylesheet>' yelp_usage() { ( echo "Usage: yelp-check <COMMAND> [OPTIONS] [FILES]" echo "" echo "Commands:" echo " comments Print the editorial comments in a document" echo " hrefs Find broken external links in a document" echo " ids Find Mallard page IDs that do not match file names" echo " license Report the license of Mallard pages" echo " links Find broken xref or linkend links in a document" echo " media Find broken references to media files" echo " orphans Find orphaned pages in a Mallard document" echo " status Report the status of Mallard pages" echo " style Report the style attribute of Mallard pages" echo " validate Validate files against a DTD or RNG" ) 1>&2 } yelp_usage_hrefs () { ( echo "Usage: yelp-check hrefs <FILES>" echo "" echo " Find broken href links in FILES in a Mallard document, or" echo " broken ulink or XLink links in FILES in a DocBook document." echo "" echo "Options:" echo " -s Treat pages as belonging to a Mallard site" ) 1>&2 } yelp_usage_ids () { ( echo "Usage: yelp-check ids <FILES>" echo "" echo " Find pages in a Mallard document whose page ID does not match" echo " the base file name of the page file." echo "" echo "Options:" echo " -s Treat pages as belonging to a Mallard site" ) 1>&2 } yelp_usage_links () { ( echo "Usage: yelp-check links <FILES>" echo "" echo " Find broken xref links in FILES in a Mallard document," echo " or broken linkend links in FILES in a DocBook document." echo "" echo "Options:" echo " -c CACHE Use the existing Mallard cache CACHE" echo " -s Treat pages as belonging to a Mallard site" echo " -i Ignore xrefs where href is present" ) 1>&2 } yelp_usage_media () { ( echo "Usage: yelp-check media <FILES>" echo "" echo " Find broken references to media files. In Mallard, this" echo " checks media and thumb elements. In DocBook, this checks" echo " audiodata, imagedata, and videodata elements." echo "" echo "Options:" echo " -s Treat pages as belonging to a Mallard site" ) 1>&2 } yelp_usage_orphans () { ( echo "Usage: yelp-check orphans <FILES>" echo "" echo " Locate orphaned pages among FILES in a Mallard document." echo " Orphaned pages are any pages that cannot be reached by" echo " topic links alone from the index page." echo "" echo "Options:" echo " -c CACHE Use the existing Mallard cache CACHE" echo " -s Treat pages as belonging to a Mallard site" ) 1>&2 } yelp_usage_comments () { ( echo "Usage: yelp-check comments <FILES>" echo "" echo " Print the editorial comments in the files FILES, using the" echo " comment element in Mallard and the remark element in DocBook." echo "" echo "Options:" echo " -s Treat pages as belonging to a Mallard site" ) 1>&2 } yelp_usage_license () { ( echo "Usage: yelp-check license <FILES>" echo "" echo " Report the license of the Mallard page files FILES. Each" echo " matching page is reporting along with its license, reported" echo " based on the href attribute of the license element. Common" echo " licenses use a shortened identifier. Pages with multiple" echo " licenses have the identifiers separated by spaces. Pages" echo " with no license element report 'none'. Licenses with no" echo " href attribute are reported as 'unknown'." echo "" echo "Options:" echo " -s Treat pages as belonging to a Mallard site" echo " --only LICENSES Only show pages whose license is in LICENSES" echo " --except LICENSES Exclude pages whose license is in LICENSES" echo " --totals Show total counts for each license" echo "LICENSES may be a comma- and/or space-separated list." ) 1>&2 } yelp_usage_style () { ( echo "Usage: yelp-check style <FILES>" echo "" echo " Report the page style attribute of the Mallard page files" echo " FILES. Each matching page is reporting along with its status." echo "" echo "Options:" echo " -s Treat pages as belonging to a Mallard site" echo " --only STYLES Only show pages whose style is in STATUSES" echo " --except STYLES Exclude pages whose style is in STATUSES" echo " --totals Show total counts for each style" echo "STYLES may be comma- and/or space-separated lists." ) 1>&2 } yelp_usage_status () { ( echo "Usage: yelp-check status <FILES>" echo "" echo " Report the status of the Mallard page files FILES. Each" echo " matching page is reporting along with its status." echo "" echo "Options:" echo " -s Treat pages as belonging to a Mallard site" echo " --version VER Select revisions with the version attribute VER" echo " --docversion VER Select revisions with the docversion attribute VER" echo " --pkgversion VER Select revisions with the pkgversion attribute VER" echo " --older DATE Only show pages older than DATE" echo " --newer DATE Only show pages newer than DATE" echo " --only STATUSES Only show pages whose status is in STATUSES" echo " --except STATUSES Exclude pages whose status is in STATUSES" echo " --totals Show total counts for each status" echo "VER and STATUSES may be comma- and/or space-separated lists." ) 1>&2 } yelp_usage_validate () { ( echo "Usage: yelp-check validate <FILES>" echo "" echo " Validate FILES against the appropriate DTD or RNG." echo " For Mallard pages, perform automatic RNG merging" echo " based on the version attribute." echo "" echo "Options:" echo " -s Treat pages as belonging to a Mallard site" echo " --strict Disallow unknown namespaces" echo " --allow NS Explicitly allow namespace NS in strict mode" echo " --jing Use jing instead of xmllint for RNG validation" ) 1>&2 } if [ $# = 0 ]; then yelp_usage exit 1 fi yelp_check_iter_site () { for dir in "$1"/*; do if [ -d "$dir" ]; then if [ "$(basename "$dir")" != "__pintail__" ]; then yelp_check_iter_site "$dir" fi fi done for page in "$1"/*.page; do if [ -e "$page" ]; then $check_page "$page" || yelp_check_retval="$?" fi done } yelp_check_iter_args () { for arg in "$@"; do ext=$(echo "$arg" | sed -e 's/.*\.//') if [ -d "$arg" ]; then if [ "x$check_site" = "x1" ]; then yelp_check_iter_site "$arg" else for page in "${arg%%/}"/*.page; do if [ -e "$page" ]; then $check_page "$page" fi done fi elif [ "x$ext" = "xpage" ] || [ "x$ext" = "xstub" ] || [ "x$ext" = "xcache" ]; then $check_page "$arg" || yelp_check_retval="$?" elif [ "x$check_db" != "x" ] && ([ "x$ext" = "xdocbook" ] || [ "x$ext" = "xxml" ]); then $check_db "$arg" || yelp_check_retval="$?" else echo "Unrecognized page $arg" 1>&2 exit 1 fi done return $yelp_check_retval } yelp_hrefs_page () { base=$(dirname "$1") if [ "x$check_site" = "x1" ]; then sdir=$(cd "$(dirname "$1")" && pwd) sdir=${sdir##${check_site_root}}/ fi ( echo '<xsl:stylesheet' echo ' xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' echo ' xmlns:mal="http://projectmallard.org/1.0/"' echo ' xmlns:db="http://docbook.org/ns/docbook"' echo ' xmlns:xlink="www.w3.org/1999/xlink"' echo ' version="1.0">' echo '<xsl:output method="text"/>' echo '<xsl:template match="/mal:page">' echo ' <xsl:for-each select="//*[@href]">' echo ' <xsl:if test="not(starts-with(@href, '\''mailto:'\''))">' echo ' <xsl:value-of select="/mal:page/@id"/>' echo ' <xsl:text> </xsl:text>' echo ' <xsl:value-of select="@href"/>' echo ' <xsl:text>
</xsl:text>' echo ' </xsl:if>' echo ' </xsl:for-each>' echo '</xsl:template>' echo '<xsl:template match="/*[namespace-uri(.) = '\'\''] | /db:*">' echo ' <xsl:for-each select="//ulink/@url | //*/xlink:href">' echo ' <xsl:if test="not(starts-with(string(.), '\''mailto:'\''))">' echo ' <xsl:value-of select="(ancestor-or-self::*/@id | ancestor-or-self::*/@xml:id)[last()]"/>' echo ' <xsl:text> </xsl:text>' echo ' <xsl:value-of select="string(.)"/>' echo ' <xsl:text>
</xsl:text>' echo ' </xsl:if>' echo ' </xsl:for-each>' echo '</xsl:template>' echo '</xsl:stylesheet>' ) | xsltproc --xinclude - "$1" | sort | uniq | \ while read -r id url; do colon=$(echo "$url" | cut -d: -f1) if [ "x$colon" = "x$url" ]; then test -f "$base/""$(urldecode "$url")" || echo "$sdir$id: $url" else status=$(while read -r trystatus tryurl; do if [ "x$tryurl" = "x$url" ]; then echo "$trystatus"; break; fi done < "$check_href_cache") if [ "x$status" = "x1" ]; then true elif [ "x$status" = "x0" ]; then echo "$sdir$id: $url" else ( (curl -s -I -L "$url" | \ grep '^HTTP/' | tail -n 1 | head -n 1 | \ grep -q 'HTTP/.\.. 200 .*') \ && (echo "1 $url" >> "$check_href_cache")) \ || (echo "0 $url" >> "$check_href_cache"; echo "$sdir$id: $url") fi fi done } yelp_hrefs () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_hrefs exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_hrefs exit 1 fi check_out_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) check_href_cache=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) echo > "$check_href_cache" check_db=yelp_hrefs_page check_page=yelp_hrefs_page yelp_check_iter_args "$@" > "$check_out_file" yelp_check_retval=$(wc -l < "$check_out_file") if test "x$yelp_check_retval" != "x0"; then yelp_check_retval=1 fi cat "$check_out_file" rm "$check_out_file" rm "$check_href_cache" exit $yelp_check_retval } yelp_ids_page () { pageid=$( ( echo '<xsl:stylesheet' echo ' xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' echo ' xmlns:mal="http://projectmallard.org/1.0/"' echo ' version="1.0">' echo '<xsl:output method="text"/>' echo '<xsl:template match="/mal:page">' echo '<xsl:value-of select="@id"/>' echo '</xsl:template>' echo '</xsl:stylesheet>' ) | xsltproc --xinclude - "$1") dname=$(dirname "$1") bname=$(basename "$1") if [ "x$pageid.page" != "x$bname" ]; then if [ "x$check_site" = "x1" ]; then sdir=$(cd "$(dirname "$1")" && pwd) sdir=${sdir##${check_site_root}}/ echo "$sdir$(basename "$1"): $pageid" elif [ "x$dname" = 'x.' ]; then echo "$bname: $pageid" else echo "$1: $pageid" fi yelp_check_retval=1 fi } yelp_ids () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_ids exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_ids exit 1 fi check_db= check_page=yelp_ids_page yelp_check_iter_args "$@" exit $yelp_check_retval } yelp_links_db () { ( echo '<xsl:stylesheet' echo ' xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' echo ' xmlns:db="http://docbook.org/ns/docbook"' echo ' xmlns:exsl="http://exslt.org/common"' echo ' extension-element-prefixes="exsl"' echo ' version="1.0">' echo '<xsl:output method="text"/>' echo '<xsl:key name="idkey" match="*[@id or @xml:id]" use="@id | @xml:id"/>' echo '<xsl:template match="/">' echo ' <xsl:for-each select="//*[@linkend]">' echo ' <xsl:if test="not(key('"'idkey'"', @linkend))">' echo ' <xsl:value-of select="(ancestor-or-self::*/@id | ancestor-or-self::*/@xml:id)[last()]"/>' echo ' <xsl:text>: </xsl:text>' echo ' <xsl:value-of select="@linkend"/>' echo ' <xsl:text>
</xsl:text>' echo ' </xsl:if>' echo ' </xsl:for-each>' echo '</xsl:template>' echo '</xsl:stylesheet>' ) | xsltproc --xinclude - "$1" } yelp_links_page () { if [ "x$check_site" = "x1" ]; then sdir=$(cd "$(dirname "$1")" && pwd) sdir=${sdir##${check_site_root}}/ fi ( echo '<xsl:stylesheet' echo ' xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' echo ' xmlns:mal="http://projectmallard.org/1.0/"' echo ' xmlns:site="http://projectmallard.org/site/1.0/"' echo ' xmlns:exsl="http://exslt.org/common"' echo ' extension-element-prefixes="exsl"' echo ' version="1.0">' xsl='file://'$(urlencode "$xsl_mal_link") echo '<xsl:import href="'"$xsl"'"/>' check_cache_url='file://'$(urlencode "$check_cache_file") echo '<xsl:param name="mal.cache.file" select="'"'$check_cache_url'"'"/>' echo '<xsl:variable name="site.dir" select="'"'$sdir'"'"/>' echo '<xsl:output method="text"/>' echo '<xsl:key name="__site.cache.key" match="mal:page | mal:section"' echo ' use="concat(ancestor-or-self::mal:page/@site:dir, @id)"/>' echo '<xsl:template match="/mal:page">' echo ' <xsl:variable name="page" select="@id"/>' if [ "x$check_links_ignore" = "x1" ]; then echo ' <xsl:for-each select="//*[@xref][not(@href)]">' else echo ' <xsl:for-each select="//*[@xref]">' fi echo ' <xsl:variable name="xref" select="@xref"/>' echo ' <xsl:variable name="linkid">' echo ' <xsl:call-template name="mal.link.xref.linkid"/>' echo ' </xsl:variable>' echo ' <xsl:for-each select="$mal.cache">' echo ' <xsl:if test="count(key('"'mal.cache.key'"', $linkid) | ' echo ' key('"'__site.cache.key'"', $linkid)) = 0">' echo ' <xsl:value-of select="$site.dir"/>' echo ' <xsl:value-of select="$page"/>' echo ' <xsl:text>: </xsl:text>' echo ' <xsl:value-of select="$xref"/>' echo ' <xsl:text>
</xsl:text>' echo ' </xsl:if>' echo ' </xsl:for-each>' echo ' </xsl:for-each>' echo '</xsl:template>' echo '</xsl:stylesheet>' ) | xsltproc --xinclude - "$1" } yelp_links () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_links exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-c") shift check_cache_file="$1" shift ;; "-s") check_site="1" check_site_root=$(pwd) shift ;; "-i") shift check_links_ignore="1" ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_links exit 1 fi if [ "x$check_cache_file" != "x" ]; then check_cache_dir=$(dirname "$check_cache_file") check_cache_dir=$(cd "$check_cache_dir" && pwd) check_cache_file="$check_cache_dir/"$(basename "$check_cache_file") elif [ -d "$1" ]; then check_cache_file=1 else case "$1" in *.page | *.stub | *.cache) check_cache_file=1 ;; *) return ;; esac fi if [ "x$check_cache_file" = "x1" ]; then check_cache_file_is_tmp="yes" check_cache_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) if [ "x$check_site" = "x1" ]; then yelp-build cache -s -o "$check_cache_file" "$@" else yelp-build cache -o "$check_cache_file" "$@" fi fi check_out_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) check_db=yelp_links_db check_page=yelp_links_page yelp_check_iter_args "$@" > "$check_out_file" yelp_check_retval=$(wc -l < "$check_out_file") if test "x$yelp_check_retval" != "x0"; then yelp_check_retval=1 fi cat "$check_out_file" rm "$check_out_file" if [ "x$check_cache_file_is_tmp" = "xyes" ]; then rm "$check_cache_file" fi exit $yelp_check_retval } yelp_media_page () { ext=$(echo "$1" | sed -e 's/.*\.//') bname=$(basename "$1" ".$ext") dname=$(dirname "$1") if [ "x$dname" = "x." ]; then dname="" else dname="$dname"/ fi; if [ "x$check_site" = "x1" ]; then sdir=$(cd "$dname" && pwd) sdir=${sdir##${check_site_root}}/ else sdir="$dname" fi xsltproc "$xsl_media" "$1" | \ sort | uniq | \ while read -r line; do src=$(urldecode "$line") if [ ! -f "$dname$src" ]; then echo "$sdir$bname: $line" fi done } yelp_media () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_media exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_media exit 1 fi check_out_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) check_db=yelp_media_page check_page=yelp_media_page yelp_check_iter_args "$@" > "$check_out_file" yelp_check_retval=$(wc -l < "$check_out_file") if test "x$yelp_check_retval" != "x0"; then yelp_check_retval=1 fi cat "$check_out_file" rm "$check_out_file" exit $yelp_check_retval } yelp_orphans_page () { if [ "x$check_site" = "x1" ]; then sdir=$(cd "$(dirname "$1")" && pwd) sdir=${sdir##${check_site_root}}/ fi ( echo '<xsl:stylesheet' echo ' xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' echo ' xmlns:mal="http://projectmallard.org/1.0/"' echo ' xmlns:exsl="http://exslt.org/common"' echo ' extension-element-prefixes="exsl"' echo ' version="1.0">' xsl='file://'$(urlencode "$xsl_mal_link") echo '<xsl:import href="'"$xsl"'"/>' check_cache_url='file://'$(urlencode "$check_cache_file") echo '<xsl:param name="mal.cache.file" select="'"'$check_cache_url'"'"/>' echo '<xsl:variable name="site.dir" select="'"'$sdir'"'"/>' echo '<xsl:output method="text"/>' echo '<xsl:template match="/mal:page">' echo ' <xsl:variable name="trails">' echo ' <xsl:call-template name="mal.link.linktrails"/>' echo ' </xsl:variable>' echo ' <xsl:if test="@id != '"'index'"' and count(exsl:node-set($trails)/*) = 0">' echo ' <xsl:value-of select="$site.dir"/>' echo ' <xsl:value-of select="@id"/>' echo ' <xsl:text>
</xsl:text>' echo ' </xsl:if>' echo '</xsl:template>' echo '</xsl:stylesheet>' ) | xsltproc --xinclude - "$1" } yelp_orphans () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_orphans exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; "-c") shift check_cache_file="$1" shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_orphans exit 1 fi if [ "x$check_cache_file" != "x" ]; then check_cache_dir=$(dirname "$check_cache_file") check_cache_dir=$(cd "$check_cache_dir" && pwd) check_cache_file="$check_cache_dir/"$(basename "$check_cache_file") elif [ -d "$1" ]; then check_cache_file=1 else case "$1" in *.page | *.stub | *.cache) check_cache_file=1 ;; *) return ;; esac fi if [ "x$check_cache_file" = "x1" ]; then check_cache_file_is_tmp="yes" check_cache_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) if [ "x$check_site" = "x1" ]; then yelp-build cache -s -o "$check_cache_file" "$@" else yelp-build cache -o "$check_cache_file" "$@" fi fi check_out_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) check_db= check_page=yelp_orphans_page yelp_check_iter_args "$@" > "$check_out_file" yelp_check_retval=$(wc -l < "$check_out_file") if test "x$yelp_check_retval" != "x0"; then yelp_check_retval=1 fi cat "$check_out_file" rm "$check_out_file" if [ "x$check_cache_file_is_tmp" = "xyes" ]; then rm "$check_cache_file" fi exit $yelp_check_retval } yelp_comments_page () { ext=$(echo "$1" | sed -e 's/.*\.//') bname=$(basename "$1" ".$ext") if [ "x$check_site" = "x1" ]; then sdir=$(cd "$(dirname "$1")" && pwd) sdir=${sdir##${check_site_root}}/ fi xsltproc --stringparam basename "$bname" \ --stringparam site.dir "$sdir" \ "$xsl_comments" "$1" } yelp_comments () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_comments exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_comments exit 1 fi check_db=yelp_comments_page check_page=yelp_comments_page yelp_check_iter_args "$@" exit $yelp_check_retval } yelp_license_page () { if [ "x$check_site" = "x1" ]; then sdir=$(cd "$(dirname "$1")" && pwd) sdir=${sdir##${check_site_root}}/ fi xsltproc --xinclude \ --stringparam only "$check_only" \ --stringparam except "$check_except" \ --stringparam totals "$check_totals" \ --stringparam site.dir "$sdir" \ "$xsl_mal_license" "$1" } yelp_license () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_license exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; "--only") shift check_only="$1" shift ;; "--except") shift check_except="$1" shift ;; "--totals") check_totals="1" shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_license exit 1 fi check_db= check_page=yelp_license_page if [ "x$check_totals" = "x1" ]; then yelp_check_iter_args "$@" | \ sort | uniq -c | sed -e 's/^ *//' | awk '{print $2 ": " $1}' else yelp_check_iter_args "$@" | sort fi } yelp_style_page () { ext=$(echo "$1" | sed -e 's/.*\.//') bname=$(basename "$1" ".$ext") if [ "x$check_site" = "x1" ]; then sdir=$(cd "$(dirname "$1")" && pwd) sdir=${sdir##${check_site_root}}/ fi style=$(echo "$mallard_style" | xsltproc - "$1") output=1 if [ "x$check_only_defined" = "x1" ]; then output=0 if [ "x$check_only" = "x" ]; then # We treat an empty --only '' as requesting pages with no style if [ "x$style" = "x" ]; then output=1; fi else for pstyle in $style; do for sstyle in $(echo "$check_only" | sed -e 's/,/ /g'); do if [ "$pstyle" = "$sstyle" ]; then output=1 break fi done if [ "x$output" = "x1" ]; then break; fi done fi fi if [ "x$check_except_defined" = "x1" ]; then if [ "x$check_except" = "x" ]; then # We treat an empty --except '' as excluding pages with no style if [ "x$style" = "x" ]; then output=0; fi else for pstyle in $style; do for sstyle in $(echo "$check_except" | sed -e 's/,/ /g'); do if [ "$pstyle" = "$sstyle" ]; then output=0 break fi done #if [ "x$output" = "x0" ]; then break; fi done fi fi if [ "x$output" = "x1" ]; then echo "$sdir$bname: $style" fi } yelp_style () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_style exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; "--only") shift check_only_defined=1 check_only="$1" shift ;; "--except") shift check_except_defined=1 check_except="$1" shift ;; "--totals") check_totals="1" shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_style exit 1 fi check_db= check_page=yelp_style_page if [ "x$check_totals" = "x1" ]; then yelp_check_iter_args "$@" | \ while read -r line; do styles=$(echo "$line" | sed -e 's/^[^:]*://') if [ "x$styles" = "x" ]; then echo "" else for style in $styles; do echo "$style" done fi done | \ sort | uniq -c | sed -e 's/^ *//' | awk '{print $2 ": " $1}' else yelp_check_iter_args "$@" | sort fi } yelp_status () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_status exit 1 fi while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; "--version") shift check_version="$1" shift ;; "--docversion") shift check_docversion="$1" shift ;; "--pkgversion") shift check_pkgversion="$1" shift ;; "--older") shift check_older="$1" shift ;; "--newer") shift check_newer="$1" shift ;; "--only") shift check_only="$1" shift ;; "--except") shift check_except="$1" shift ;; "--totals") check_totals="1" shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_status exit 1 fi check_cache_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) if [ "x$check_site" = "x1" ]; then yelp-build cache -s -o "$check_cache_file" "$@" else yelp-build cache -o "$check_cache_file" "$@" fi xsltproc \ --stringparam version "$check_version" \ --stringparam docversion "$check_docversion" \ --stringparam pkgversion "$check_pkgversion" \ --stringparam newer "$check_newer" \ --stringparam older "$check_older" \ --stringparam only "$check_only" \ --stringparam except "$check_except" \ --stringparam totals "$check_totals" \ "$xsl_mal_status" "$check_cache_file" rm "$check_cache_file" return 0 } yelp_validate_db () { version=$(echo "$docbook_version" | xsltproc - "$1") major=$(echo "$version" | cut -c1) if [ "x$major" = "x5" ]; then check_out_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) rng_uri="http://docbook.org/xml/$version/rng/docbook.rng" if [ "x$check_jing" = "x1" ]; then jing -i "$rng_uri" "$1" > "$check_out_file" 2>&1 else xmllint --noout --xinclude --noent --relaxng "$rng_uri" "$1" > "$check_out_file" 2>&1 fi yelp_check_retval="$?" grep -v 'validates$' "$check_out_file" rm "$check_out_file" elif xmllint --nocdata "$1" | grep -q '<!DOCTYPE'; then xmllint --noout --xinclude --noent --postvalid "$1" || yelp_check_retval="$?" else dtd_uri='http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd' xmllint --noout --xinclude --noent --dtdvalid "$dtd_uri" "$1" || yelp_check_retval="$?" fi } yelp_validate_page () { # Using temp files because pipes create subshells, making it really # hard to return the right exit status in a portable way. if [ "x$check_rng_dir" = "x" ]; then check_rng_dir=$(mktemp -d "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) fi check_out_file=$(mktemp "${TMPDIR:-/tmp}"/yelp-XXXXXXXX) check_rng_file=$( ( echo '<xsl:stylesheet' echo ' xmlns:cache="http://projectmallard.org/cache/1.0/"' echo ' xmlns:xsl="http://www.w3.org/1999/XSL/Transform"' echo ' version="1.0">' echo '<xsl:output method="text"/>' echo '<xsl:template match="/*">' echo '<xsl:choose>' echo '<xsl:when test="string(@version) != '"''"'">' echo '<xsl:value-of select="@version"/>' echo '</xsl:when>' echo '<xsl:when test="/cache:cache">' echo '<xsl:text>cache/1.0 1.0</xsl:text>' echo '</xsl:when>' echo '<xsl:otherwise>' echo '<xsl:text>1.0</xsl:text>' echo '</xsl:otherwise>' echo '</xsl:choose>' echo '</xsl:template>' echo '</xsl:stylesheet>' ) | xsltproc - "$1") check_rng_file=$(urlencode "$check_rng_file" /).rng if [ ! -f "$check_rng_dir/$check_rng_file" ]; then # If we've already made an RNG file for this version string, don't # do it again. We've urlencoded the file name + slashes, because # version strings often contain slashes. But xsltproc treats the # -o option as a URL and urldecodes, so doubly urlencode, because # we want the urlencoded string to be the on-disk name. xsltproc -o "$check_rng_dir/""$(urlencode "$check_rng_file")" \ --param rng.strict "$check_strict" \ --stringparam rng.strict.allow "$check_strict_allow" \ "$xsl_mal_rng" "$1" fi if [ "x$check_jing" = "x1" ]; then jing -i "$check_rng_dir/$check_rng_file" "$1" > "$check_out_file" 2>&1 else xmllint --noout --xinclude --noent --relaxng "$check_rng_dir/$check_rng_file" "$1" > "$check_out_file" 2>&1 fi ret="$?" grep -v 'validates$' "$check_out_file" rm "$check_out_file" return $ret; } yelp_validate () { if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_validate exit 1 fi check_strict="false()" check_strict_allow="" while [ "$#" != "0" ]; do case "$1" in "-s") check_site="1" check_site_root=$(pwd) shift ;; "--strict") check_strict="true()" shift ;; "--allow") shift check_strict_allow="$check_strict_allow $1" shift ;; "--jing") check_jing="1" shift ;; *) break ;; esac done if [ "$#" = "0" ] || [ "x$1" = "x--help" ] || [ "x$1" = "x-h" ]; then yelp_usage_validate exit 1 fi check_db=yelp_validate_db check_page=yelp_validate_page yelp_check_iter_args "$@" if [ "x$check_rng_dir" != "x" ]; then rm "$check_rng_dir"/*.rng rmdir "$check_rng_dir" fi exit $yelp_check_retval } cmd="$1" shift case "x$cmd" in "xcomments") yelp_comments "$@" ;; "xhrefs") yelp_hrefs "$@" ;; "xids") yelp_ids "$@" ;; "xlinks") yelp_links "$@" ;; "xorphans") yelp_orphans "$@" ;; "xlicense") yelp_license "$@" ;; "xmedia") yelp_media "$@" ;; "xstatus") yelp_status "$@" ;; "xstyle") yelp_style "$@" ;; "xvalidate") yelp_validate "$@" ;; *) yelp_usage ;; esac Save