improve the word-wrap

* replace tabs by spaces
 * meld lines together
 * remove DOS linebreaks
This commit is contained in:
Christian Thaeter 2010-07-26 02:45:17 +02:00
parent 6cf8b9f2f3
commit ffc4e0023c

View file

@ -77,56 +77,88 @@ function camel_case()
echo "$(tr -c -d "A-Za-z" <<<"$t")" echo "$(tr -c -d "A-Za-z" <<<"$t")"
} }
function untabify()
{
local in="$1"
local tmp
local out
while [[ "$in" ]]; do
tmp="${in%%$'\t'*}"
in="${in:${#tmp}+1}"
out="$out$tmp "
out="${out:0:${#out}/8*8}"
done
out="${out%%*( )}"
echo "$out"
}
function word_wrap() function word_wrap()
{ {
local linelength="${1:-80}" local linelength="${1:-80}"
local indent="" local indent=""
local newline
local tmpline
local wrapped
local text local text
local tab=$'\t' local tab=$'\t'
local rest
local oldindent
local coderx='//|/\*|#'
local meld=yes
while IFS='' read -r line; do while IFS='' read -r line; do
# untabify all, spaces leading tabs are not considered (TODO proper tab handling) line="$(untabify "$line")"
line="${line//$tab/ }" # remove DOS linebreaks
line="${line//$'\r'/}"
if [[ ${#line} -gt $linelength ]]; then text="${line##*([![:alnum:]])}"
oldindent="$indent"
indent="${line:0:${#line}-${#text}}"
if [[ "$text" ]]; then
text="${line##*([![:alnum:]])}" # avoid melding text after // /* and # comments
if [[ "$text" ]]; then if [[ "$indent" =~ $coderx ]]; then
indent="${line:0:${#line}-${#text}}" meld=no
indent="${indent//?/ }"
while [[ "${#line}" -gt "${#indent}" ]]; do
tmpline="${line:0:$linelength}"
if [[ ${#tmpline} -ge $linelength ]]; then
wrapped="${tmpline% *}"
if [[ ${#wrapped} -lt ${#indent} ]]; then
# one long word TODO better keep overlong lines (long urls?)
wrapped="$tmpline"
fi
else
wrapped="$tmpline"
fi
echo "$wrapped"
line="$indent${line:${#wrapped}+1}"
# TODO if indent level doesnt change and indent has only space we can meld lines together
done
else
# a line without any text will not be wrapped
echo "$line"
fi fi
if [[ $meld = yes && ! "${indent// /}" && ${#oldindent} -eq ${#indent} ]]; then
line="${rest:+$rest }$text"
else
if [[ "$rest" ]]; then
echo "$rest"
fi
fi
indent="${indent//?/ }"
while [[ "${#line}" -ge "${linelength}" ]]; do
local wrapped
local tmpline="${line:0:$linelength}"
wrapped="${tmpline% *}"
if [[ "${#wrapped}" -gt "${#indent}" ]]; then
line="${indent}${line:${#wrapped}+1}"
else
wrapped="$line"
line=''
fi
echo "$wrapped"
done
rest="${line}"
else else
# short lines are not wrapped meld=yes
if [[ "$rest" ]]; then
echo "$rest"
rest=""
fi
echo "$line" echo "$line"
fi fi
done done
if [[ "$rest" ]]; then
echo "$rest"
fi
} }
@ -306,6 +338,7 @@ process)
# for all rfc's # for all rfc's
for file in $(find ./doc/devel/rfc* -name '*.txt'); for file in $(find ./doc/devel/rfc* -name '*.txt');
do do
echo "process $file"
process "$file" process "$file"
done done
: :
@ -380,6 +413,9 @@ discard)
git rm "${name}" git rm "${name}"
fi fi
;; ;;
wrap)
word_wrap "$1"
;;
help|*) help|*)
usage usage
;; ;;