improve the word-wrap
* replace tabs by spaces * meld lines together * remove DOS linebreaks
This commit is contained in:
parent
6cf8b9f2f3
commit
ffc4e0023c
1 changed files with 71 additions and 35 deletions
106
admin/rfc.sh
106
admin/rfc.sh
|
|
@ -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
|
||||||
;;
|
;;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue