From 28551733da8c1978b14c2337fe4d69212245d81d Mon Sep 17 00:00:00 2001
From: Starbeamrainbowlabs <sbrl@starbeamrainbowlabs.com>
Date: Sun, 29 Oct 2017 21:53:45 +0000
Subject: [PATCH] Update tldr

---
 tldr | 180 +++++++++++++++++++++++++++++++----------------------------
 1 file changed, 94 insertions(+), 86 deletions(-)

diff --git a/tldr b/tldr
index 22c82e2..d6d4f56 100755
--- a/tldr
+++ b/tldr
@@ -1,12 +1,13 @@
-#!/bin/bash
+#!/usr/bin/env bash
 set +vx -o pipefail
 [[ $- = *i* ]] && echo "Don't source this script!" && return 1
-version='0.32'
-# tldr-bash-client version 0.32
+version='0.36'
+# tldr-bash-client version 0.36
 # Bash client for tldr: community driven man-by-example
-# - forked from Ray Lee, http://github.com/raylee/tldr
-# - modified and expanded by pepa65: http://github.com/pepa65/tldr-bash-client
-# Requiring: coreutils, less, grep, unzip, curl/wget
+# - forked from Ray Lee, https://github.com/raylee/tldr
+# - modified and expanded by pepa65: https://github.com/pepa65/tldr-bash-client
+# - binary download: http://4e4.win/tldr
+# Requiring: coreutils, grep, unzip, curl/wget, less (optional)
 
 # The 5 elements in TLDR markup that can be styled with these colors and
 # backgrounds (last one specified will be used) and modes (more can apply):
@@ -40,29 +41,34 @@ version='0.32'
 # Alternative location of pages cache
 : "${TLDR_CACHE:= }"
 
+# Usage of 'less' or 'cat' for output (set to '0' for cat)
+: "${TLDR_LESS:= }"
+
+## Function definitions
+
 # $1: [optional] exit code; Uses: version cachedir
 Usage(){
 	Out "$(cat <<-EOF
-		$HHE $version
+		 $HHE$version
 
-		$HDE USAGE: $HHE$(basename "$0")$XHHE [${HOP}option$XHOP] [${HPL}platform$XHPL/]${HCO}command$XHCO
+		 $HDEUSAGE: $HHE$(basename "$0")$XHHE [${HOP}option$XHOP] [${HPL}platform$XHPL/]${HCO}command$XHCO
 
-		$HDE [${HPL}platform$XHPL/]${HCO}command$XHCO:          Show page for$HCO command$XHCO (from$HPL platform$XHPL)
+		 $HDE[${HPL}platform$XHPL/]${HCO}command$XHCO:          Show page for ${HCO}command$XHCO (from ${HPL}platform$XHPL)
 
-		$HPL platform$XHPL is optionally one of:$HPL common$XHPL,$HPL linux$XHPL,$HPL osx$XHPL,$HPL sunos$XHPL
+		 ${HPL}platform$XHPL (optional) one of: ${HPL}common$XHPL, ${HPL}linux$XHPL, ${HPL}osx$XHPL, ${HPL}sunos$XHPL, ${HPL}current$XHPL (includes common)
 
-		$HOP option$XHOP is optionally one of:
-		  $HOP-l$XHOP,$HOP --list$XHOP [${HPL}platform$XHPL]:      Show all available pages (from$HPL platform$XHPL)
-		  $HOP-r$XHOP,$HOP --render$XHOP ${HFI}file$XHFI:          Render a local$HFI file$XHFI as tldr markdown
-		  $HOP-m$XHOP,$HOP --markdown$XHOP ${HCO}command$XHCO:     Show the markdown source for$HCO command$XHCO
-		  $HOP-c$XHOP,$HOP --cache$XHOP:                Cache all pages by downloading archive from repo
-		  $HOP-u$XHOP,$HOP --update$XHOP:               Re-download index file from repo
-		  $HOP-v$XHOP,$HOP --version$XHOP:              Version number and repo location
-		  $HDE[$HOP-h$XHOP,$HOP -?$XHOP,$HOP --help$XHOP]:           This help overview
+		 ${HOP}option$XHOP is optionally one of:
+		  $HOP-l$XHOP, $HOP--list$XHOP [${HPL}platform$XHPL]:      List all pages (from ${HPL}platform$XHPL)
+		  $HOP-a$XHOP, $HOP--list-all$XHOP:             List all pages from current platform + common
+		  $HOP-r$XHOP, $HOP--render$XHOP ${HFI}file$XHFI:          Render a local ${HFI}file$XHFI as tldr markdown
+		  $HOP-m$XHOP, $HOP--markdown$XHOP ${HCO}command$XHCO:     Show the markdown source for ${HCO}command$XHCO
+		  $HOP-u$XHOP, $HOP--update$XHOP:               Update the pages cache by downloading repo archive
+		  $HOP-v$XHOP, $HOP--version$XHOP:              Version number and local repo location
+		  $HDE[$HOP-h$XHOP, $HOP-?$XHOP, $HOP--help$XHOP]:           This help overview
 
-		$HDE Element styling:$XHDE$T Title$XT$D Description$XD$E Example$XD$C Code$XC$V Value$XV
-		$HDE All pages and the index are cached locally under $HUR$cachedir$XHUR.
-		$HDE By default, the cached copies will be freshly downloaded after $HUR${TLDR_EXPIRY// /}$XHUR days.
+		 ${HDE}Element styling:$XHDE ${T}Title$XT ${D}Description$XD ${E}Example$XE ${C}Code$XC ${V}Value$XV
+		 ${HDE}All pages and the index are cached locally under $HUR$cachedir$XHUR.
+		 ${HDE}By default, the cached copies will be freshly downloaded after $HUR${TLDR_EXPIRY// /}$XHUR days.
 		EOF
 	)"
 	exit "${1:-0}"
@@ -173,17 +179,11 @@ Init_term(){
 # $1: page
 Recent(){ find "$1" -mtime -"${TLDR_EXPIRY// /}" >/dev/null 2>&1;}
 
-# Download index.json; Uses: index index_url base_url zip_url dl
-Update_index(){
-	$dl "$index" "$index_url" && Inf "Index file $I$index$XI freshly downloaded" || {
-		Err "Could not download index from $I$index_url$XI with $dl"
-		exit 2
-	}
-}
-
 # Initialize globals, check the environment; Uses: config cachedir version
 # Sets: stdout os version dl
 Config(){
+	type -p less >/dev/null || TLDR_LESS=0
+
 	os=common stdout='' Q='"' N=$'\n'
 	case "$(uname -s)" in
 		Darwin) os='osx' ;;
@@ -191,21 +191,22 @@ Config(){
 		SunOS) os='sunos' ;;
 	esac
 	Init_term
-	trap 'less -~RXQFP"Browse up/down, press Q to exit " <<<"$stdout"' EXIT
+	[[ $TLDR_LESS = 0 ]] && 
+		trap 'cat <<<"$stdout"' EXIT ||
+		trap 'less -~RXQFP"Browse up/down, press Q to exit " <<<"$stdout"' EXIT
 
-	version="tldr-bash-client version $version $XB$URL http://github.com/pepa65/tldr-bash-client$XURL"
+	version="tldr-bash-client version $version$XB ${URL}http://github.com/pepa65/tldr-bash-client$XURL"
 
 	# Select download method
 	dl="$(type -p curl) -sLfo" || {
 		dl="$(type -p wget) --max-redirect=20 -qNO" || {
-			Err "tldr requires$I curl$XI or$I wget $XI installed in your path"
+			Err "tldr requires ${I}curl$XI or ${I}wget$XI installed in your path"
 			exit 3
 		}
 	}
 
-	base_url='https://raw.githubusercontent.com/tldr-pages/tldr/master/pages'
-	zip_url='http://tldr-pages.github.io/assets/tldr.zip'
-	index_url='http://tldr-pages.github.io/assets/index.json'
+	pages_url='https://raw.githubusercontent.com/tldr-pages/tldr/master/pages'
+	zip_url='http://tldr.sh/assets/tldr.zip'
 
 	read cachedir <<<$TLDR_CACHE
 	[[ $cachedir ]] || {
@@ -218,25 +219,25 @@ Config(){
 	}
 	index=$cachedir/index.json
 	# update if the file doesn't exists, or if it's older than $TLDR_EXPIRY
-	[[ -f $index ]] && Recent "$index" || Update_index
+	[[ -f $index ]] && Recent "$index" || Cache_fill 0
 }
 
-# $1: error message; Uses: md line ln
+# $1: error message; Uses: md REPLY ln
 Unlinted(){
-	Err "Page $I$md$XI not properly linted!$N${ERRSP}${ERR}Line $I$ln$XI [$XERR$U$line$XU$ERR]$N$ERRSP$ERR$1"
+	Err "Page $I$md$XI not properly linted!$N${ERRSP}${ERR}Line $I$ln$XI [$XERR$U$REPLY$XU$ERR]$N$ERRSP$ERR$1"
 	exit 5
 }
 
-# $1: page; Uses: index index_url cachedir base_url platform os dl cached md
+# $1: page; Uses: index cachedir pages_url platform os dl cached md
 # Sets: cached md
 Get_tldr(){
 	local desc err notfound
 	# convert the local platform name to tldr's version
 	# extract the platform key from index.json, return preferred subpath to page
-	desc=$(tr '{' '\n' <$index |grep "\"name\":\"$1\"")
+	desc=$(tr '{' '\n' <"$index" |grep "\"name\":\"$1\"")
 	# results in, eg, "name":"netstat","platform":["linux","osx"]},
 
-	[[ $desc ]] || return  # just not found
+	[[ $desc ]] || return  # nothing found
 
 	error=0
 	if [[ $platform ]]
@@ -249,7 +250,7 @@ Get_tldr(){
 		}
 	fi
 	# if no page found yet, try the system platform
-	[[ $md ]] || [[ $platform = "$os" ]] || {
+	[[ $md ]] || [[ $platform = $os ]] || {
 			[[ $desc =~ \"$os\" ]] && md=$os/$1.md
 	} || {
 		notfound+=" or $I$os$XI"
@@ -263,77 +264,84 @@ Get_tldr(){
 	cached=$cachedir/$md
 	Recent "$cached" || {
 		mkdir -p "${cached%/*}"
-		$dl "$cached" "$base_url/$md" || Err "Could not download page $I$cached$XI from index $U$index_url$XU with $dl"
+		$dl "$cached" "$pages_url/$md" || Err "Could not download page $I$cached$XI with $dl"
 	}
 }
 
-# $1: text; Uses: page stdout; Sets: ln line
+# $1: text; Uses: page stdout; Sets: ln REPLY
 Display_tldr(){
 	local newfmt len val
-	ln=0 line=''
+	ln=0 REPLY=''
 	[[ $md ]] || md=$1
 	# Read full lines, and process even when no newline at the end
-	while read -r line || [[ $line ]]
+	while read -r || [[ $REPLY ]]
 	do
 		((++ln))
 		((ln==1)) && {
-			[[ ${line:0:1} = '#' ]] && newfmt=0 || newfmt=1
+			[[ ${REPLY:0:1} = '#' ]] && newfmt=0 || newfmt=1
 			((newfmt)) && {
-				[[ $line ]] || Unlinted "No title"
-				Out "$TNL$TSP$T$line$XT"
-				len=${#line}
-				read -r; ((++ln))
-				[[ $line =~ [^=] ]] && Unlinted "Title underline must be equal signs"
-				((len!=${#line})) && Unlinted "Underline length not equal to title's"
-				read -r; ((++ln))
+				[[ $REPLY ]] || Unlinted "Empty title"
+				Out "$TNL$TSP$T$REPLY$XT"
+				len=${#REPLY}  # title length
+				read -r
+				((++ln))
+				[[ $REPLY =~ [^=] ]] && Unlinted "Title underline must be equal signs"
+				((len!=${#REPLY})) && Unlinted "Underline length not equal to title's"
+				read -r
+				((++ln))
 			}
 		}
-		case "${line:0:1}" in  # first character
+		case "${REPLY:0:1}" in  # first character
 			'#') ((newfmt)) && Unlinted "Bad first character"
-				((${#line} <= 2)) && Unlinted "No title"
-				[[ ! ${line:1:1} = ' ' ]] && Unlinted "2nd character no space"
-				Out "$TNL$TSP$T${line:2}$XT" ;;
-			'>') ((${#line} <= 3)) && Unlinted "No valid desciption"
-				[[ ! ${line:1:1} = ' ' ]] && Unlinted "2nd character no space"
-				[[ ! ${line: -1} = '.' ]] && Unlinted "Description doesn't end in full stop"
-				Out "$DNL$DSP$D${line:2}$XD"
+				((${#REPLY} <= 2)) && Unlinted "No title"
+				[[ ! ${REPLY:1:1} = ' ' ]] && Unlinted "2nd character no space"
+				Out "$TNL$TSP$T${REPLY:2}$XT" ;;
+			'>') ((${#REPLY} <= 3)) && Unlinted "No valid desciption"
+				[[ ! ${REPLY:1:1} = ' ' ]] && Unlinted "2nd character no space"
+				[[ ! ${REPLY: -1} = '.' ]] && Unlinted "Description doesn't end in full stop"
+				Out "$DNL$DSP$D${REPLY:2}$XD"
 				DNL='' ;;
 			'-') ((newfmt)) && Unlinted "Bad first character"
-				((${#line} <= 2)) && Unlinted "No example content"
-				[[ ! ${line:1:1} = ' ' ]] && Unlinted "2nd character no space"
-				Out "$ENL$ESP$E${line:2}$XE" ;;
+				((${#REPLY} <= 2)) && Unlinted "No example content"
+				[[ ! ${REPLY:1:1} = ' ' ]] && Unlinted "2nd character no space"
+				Out "$ENL$ESP$E${REPLY:2}$XE" ;;
 			' ') ((newfmt)) || Unlinted "Bad first character"
-				((${#line} <= 4)) && Unlinted "No valid code content"
-				[[ ${line:0:4} = '    ' ]] || Unlinted "No four spaces before code"
-				val=${line:4}
+				((${#REPLY} <= 4)) && Unlinted "No valid code content"
+				[[ ${REPLY:0:4} = '    ' ]] || Unlinted "No four spaces before code"
+				val=${REPLY:4}
 				# Value: convert {{value}}
 				val=${val//\{\{/$CX$V}
 				val=${val//\}\}/$XV$C}
 				Out "$CNL$CSP$C$val$XC" ;;
 			'`') ((newfmt)) && Unlinted "Bad first character"
-				((${#line} <= 2)) && Unlinted "No valid code content"
-				[[ ! ${line: -1} = '`' ]] && Unlinted "Code doesn't end in backtick"
-				val=${line:1:-1}
+				((${#REPLY} <= 2)) && Unlinted "No valid code content"
+				[[ ! ${REPLY: -1} = '`' ]] && Unlinted "Code doesn't end in backtick"
+				val=${REPLY:1:${#REPLY}-2}
 				# Value: convert {{value}}
 				val=${val//\{\{/$CX$V}
 				val=${val//\}\}/$XV$C}
 				Out "$CNL$CSP$C$val$XC" ;;
 			'') continue ;;
 			*) ((newfmt)) || Unlinted "Bad first character"
-				[[ -z $line ]] && Unlinted "No example content"
-				Out "$ENL$EPS$E$line$XE" ;;
+				[[ -z $REPLY ]] && Unlinted "No example content"
+				Out "$ENL$ESP$E$REPLY$XE" ;;
 		esac
 	done <"$1"
-	trap 'less -Gg -~RXQFP"%pB\% tldr $I$page$XI - browse up/down, press Q to exit" <<<"$stdout"' EXIT
+	[[ $TLDR_LESS = 0 ]] && 
+		trap 'cat <<<"$stdout"' EXIT ||
+		trap 'less -Gg -~RXQFP"%pB\% tldr $I$page$XI - browse up/down, press Q to exit" <<<"$stdout"' EXIT
 }
 
 # $1: exit code; Uses: platform index
 List_pages(){
 	local platformtext c1 c2 c3
-	[[ $platform ]] && platformtext=" from platform $I$platform$XI"
-	Inf "Known tldr pages$platformtext:"
+	[[ $platform ]] && platformtext="platform $I$platform$XI" ||
+		platform=^ platformtext="${I}all$XI platforms"
+	[[ $platform = current ]] && platform="-e $os -e common" &&
+		platformtext="$I$os$XI platform and ${I}common$XI"
+	Inf "Known tldr pages from $platformtext:"
 	Out "$(while read -r c1 c2 c3; do printf "%-19s %-19s %-19s %-19s$N" $c1 $c2 $c3; done \
-			<<<$(tr '{' '\n' <$index |grep "$platform" |cut -d "$Q" -f4))"
+			<<<$(tr '{' '\n' <"$index" |grep $platform |cut -d "$Q" -f4))"
 	exit "$1"
 }
 
@@ -370,28 +378,28 @@ Main(){
 	case "$1" in
 	-l|--list) [[ $2 ]] && {
 			platform=$2
-			[[ ,common,linux,osx,sunos, = *,$platform,* ]] || {
+			[[ ,common,linux,osx,sunos,current, = *,$platform,* ]] || {
 				Err "Unknown platform $I$platform$XI"
 				Usage 9
 			}
 			[[ $3 ]] && Err "$nomore" && err=10
 		}
 		List_pages "$err" ;;
-	-c|--cache) [[ $2 ]] && Err "$nomore" && err=11
+	-a|--list-all) [[ $2 ]] && Err "$nomore" && err=11
+		platform=current
+		List_pages $err ;;
+	-u|--update) [[ $2 ]] && Err "$nomore" && err=12
 		Cache_fill "$err" ;;
-	-v|--version) [[ $2 ]] && Err "$nomore" && err=12
+	-v|--version) [[ $2 ]] && Err "$nomore" && err=13
 		Inf "$version"
 		exit "$err" ;;
-	-u|--update) [[ $2 ]] && Err "$nomore" && err=13
-		Update_index
-		exit "$err" ;;
 	-r|--render) [[ -z $2 ]] && Err "Specify a file to render" && Usage 14
 		[[ $3 ]] && Err "$nomore" && err=15
 		[[ -f "$2" ]] && {
 			Display_tldr "$2" && exit "$err"
 			Err "A file error occured"
 			exit 16
-		} || Err "No file:$I $2$XI" && exit 17 ;;
+		} || Err "No file: ${I}$2$XI" && exit 17 ;;
 	-m|--markdown) shift
 		page=$*
 		[[ -z $page ]] && Err "Specify a page to display" && Usage 18
@@ -404,7 +412,7 @@ Main(){
 	esac
 
 	[[ -z $page ]] && Err "No command specified" && Usage 21
-	[[ $page =~ ' -' || ${page:0:1} = '-' ]] && Err "Only one option allowed" && Usage 22
+	[[ ${page:0:1} = '-' || $page = *' '-* ]] && Err "Only one option allowed" && Usage 22
 	[[ $page = */* ]] && platform=${page%/*} && page=${page##*/}
 	[[ $platform && ,common,linux,osx,sunos, != *,$platform,* ]] && {
 		Err "Unknown platform $I$platform$XI"
@@ -413,7 +421,7 @@ Main(){
 
 	Get_tldr "${page// /-}"
 	[[ ! -s $cached ]] && Err "tldr page for command $I$page$XI not found" \
-			&& Inf "Contribute new pages at:$XB$URL https://github.com/tldr-pages/tldr$XURL" && exit 24
+			&& Inf "Contribute new pages at:$XB ${URL}https://github.com/tldr-pages/tldr$XURL" && exit 24
 	((markdown)) && Out "$(cat "$cached")" || Display_tldr "$cached"
 }
 
