You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

220 lines
8.6 KiB

#!/bin/sh
#
# This file runs the highlighter on a specified file
# i.e. parses the file with the highlighter. Outputs
# running time (stderr) and resulting region_highlight
# (file parse.out, or $2 if given).
#
# Can be also run in line-wise mode on own input (-o
# option in $1), no region_highlight file then.
#
[[ -z "$ZSH_VERSION" ]] && exec /usr/bin/env /usr/local/bin/zsh-5.5.1 -f -c "source \"$0\" \"$1\" \"$2\" \"$3\""
ZERO="${(%):-%N}"
if [[ -e "${ZERO}/../fast-highlight" ]]; then
source "${ZERO}/../fast-highlight"
source "${ZERO}/../fast-string-highlight"
fpath+=( "${ZERO}/.." )
elif [[ -e "../fast-highlight" ]]; then
source "../fast-highlight"
source "../fast-string-highlight"
fpath+=( "$PWD/.." )
elif [[ -e "${ZERO}/fast-highlight" ]]; then
source "${ZERO}/fast-highlight"
source "${ZERO}/fast-string-highlight"
fpath+=( "${ZERO}" )
elif [[ -e "./fast-highlight" ]]; then
source "./fast-highlight"
source "./fast-string-highlight"
fpath+=( "./" )
else
print -u2 "Could not find fast-highlight, aborting"
exit 1
fi
zmodload zsh/zprof
autoload is-at-least chroma/-git.ch
setopt interactive_comments extendedglob
# Own input?
if [[ "$1" = "-o" || "$1" = "-oo" || "$1" = "-ooo" || "$1" = "-git" || "$1" = "-hue" || "$1" = "-hol" ]]; then
typeset -a input
input=()
if [[ "$1" = "-o" ]]; then
input+=( "./parse.zsh ../fast-highlight parse2.out" )
input+=( "rm -f parse*.out" )
input+=( "./mh-parse.zsh ../fast-highlight > out" )
input+=( "if [[ -o multibyte ]]; then echo multibyte is set; fi" )
input+=( "[[ \"a\" = *[[:alpha:]_-][[:alpha:]]# ]] && echo yes" )
input+=( 'git tag -a v0.98 -m "Syntax highlighting of the history entries"' )
input+=( 'func() { echo "a" >! phist2.db; echo "b" >>! phist2.db; fc -Rap "phist2.db"; list=( ${history[@]} ); echo "${history[1]}"; }' )
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; }
elif [[ "$1" = "-oo" ]]; then
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
input+=( 'typeset -a list\n() {\necho "a" >! phist2.db\necho "b" >>! phist2.db\nfc -Rap "phist2.db"\nlist=( ${history[@]} )\necho "${history[2]}"\necho "${history[1]}"\necho "${#history}";\ninteger size="${#history}"\nsize+=1\necho "$size" / "${history[$size]}"\nlist=( "${history[$size]}" ${history[@]} )\n}' )
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "${(F)input}"; return 0; }
elif [[ "$1" = "-ooo" ]]; then
local in='
# This is an example code that is diverse and allows to test a theme
text="An example quite long string $with variable in it"
local param1="text $variable" param2='"'"'other $variable'"'"'
math=$(( 10 + HISTSIZ + HISTSIZE + $SAVEHIST )) size=$(( 0 ))
for (( ii = 1; ii <= size; ++ ii )); do
if [[ "${cmds[ii]} string" = "| string" ]]
then
sidx=${buffer[(in:ii:)\$\(?#[^\\\\]\)]} # find opening $(
(( sidx <= len )) && {
eidx=${buffer[(b:sidx:ii)[^\\\\]\)]} # find closing )
}
fi
done'
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
input+=( "$in" )
input+=( "$in" )
elif [[ "$1" = "-git" ]]; then
local in="git lp
git push origin master
git commit
git add safari.ini zdharma.ini
git st .
git diff --cached
git commit --allow-empty
git checkout themes/zdharma.ini
git commit --amend
git commit -m \"Example commit message\"
git tag -a 'v1.18' -m 'Here-string is highlighted, descriptor-variables passed to exec are correctly highlighted'
git tag -l -n9
git checkout cb66b11
"
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
input+=( "$in" )
input+=( "$in" )
elif [[ "$1" = "-hue" ]]; then
local in="var=\$other; local var=\$other
() { eval \"\$var\"; }
case \$other in
\$var)
( echo OK; )
;;
esac
sudo -i -s ls -1 /var/log
() { ( eval \"command ls -1\" ); } argument"
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
input+=( "$in" "$in" )
elif [[ "$1" = "-hol" ]]; then
local in="var=\$( other )
local var2=\$(( other + 1 ))
() { eval \"\$var\"; }
sudo -i -s ls -1 >/tmp/ls-log.txt /var/log
IFS=\$'\\n' print -rl -- \$(command ls -1 | tee -a /tmp/ls-1.txt)
var3=\$(( HISTSIZE + 10 + \$var ))
local var4=\$( other command )
touch \$(( HISTSIZE + \$SAVEHIST + 10 ))
case \$other in
\$var)
( echo OK; )
;;
\$var3)
( if { true } { noglob echo yes } )
esac
( builtin cd /var/log; ls -1; noglob cd \"/var/log\" 'log' )
noglob cat <<<\"\$PATH\" | tr : \"\\n\"
if [[ \"\$var\" -gt 10 ]]; then
(( var = HISTSIZE + \$SAVEHIST ))
fi
/var/log
sidx=\${buffer[(in:ii:)\\\$\\(?#[^\\\\\\\\]\\)]} # find opening cmd-subst
{
exec {MYFD}<&0 {MYFD2}>&1
( read <&\$MYFD line; echo \$line >&\$MYFD2 && { builtin print \${match[1]}Written. } )
} always {
(( MYFD > 0 )) && { print -rl -- -myfd:\$MYFD >&\$MYFD2 && print \"Sent.\" '(to filedescriptor)'; }
}
command sleep \"\$(( \$a + b + \${cde} + \${(s::)fgh[ijk]} + \\\$l + \\m + \\\" ))\"
for (( i = 0; i <= 2; ++ i )) { print \$i; }
"
(( ${+ZSH_EXECUTION_STRING} == 0 )) && { print -zr "$in"; return 0; }
input+=( "$in" )
fi
typeset -a long_input
integer i
for (( i=1; i<= 50; i ++ )); do
long_input+=( "${input[@]}" )
done
typeset -F SECONDS
SECONDS=0
local right_brace_is_recognised_everywhere
integer path_dirs_was_set multi_func_def ointeractive_comments
-fast-highlight-fill-option-variables
local BUFFER
for BUFFER in "${long_input[@]}"; do
reply=( )
() {
-fast-highlight-init
-fast-highlight-process "" "$BUFFER" "0"
-fast-highlight-string-process "" "$BUFFER"
}
done
print "Running time: $SECONDS"
zprof | head
# File input?
elif [[ -r "$1" ]]; then
# Load from given file
local BUFFER="$(<$1)"
typeset -F SECONDS
SECONDS=0
reply=( )
-fast-highlight-init
local right_brace_is_recognised_everywhere
integer path_dirs_was_set multi_func_def ointeractive_comments
-fast-highlight-fill-option-variables
() {
-fast-highlight-process "" "$BUFFER" "0"
-fast-highlight-string-process "" "$BUFFER"
}
print "Running time: $SECONDS"
zprof | head
# This output can be diffed to detect changes in operation
if [[ -z "$2" ]]; then
print -rl -- "${reply[@]}" >! out.parse
else
print -rl -- "${reply[@]}" >! "$2"
fi
else
if [[ -z "$1" ]]; then
print -u2 "Usage: ./parse.zsh {to-parse file} [region_highlight output file]"
exit 2
else
print -u2 "Unreadable to-parse file \`$1', aborting"
exit 3
fi
fi
exit 0
# vim:ft=zsh