diff --git a/sxbm b/sxbm index 51d7744..6de095e 100755 --- a/sxbm +++ b/sxbm @@ -70,6 +70,69 @@ bm_add(){ die "Couldn't add link" } +bm_list(){ + local QUERY_TAG + local QUERY_TITLE + local QUERY_STRICT="||" + + while [ -n "$1" ]; do + case "$1" in + "-c"|"--disable-colors") + COL_LINK=""; COL_TITLE=""; COL_LINE_NUM=""; + shift + ;; + "-s"|"--strict") + local QUERY_STRICT="&&" + shift + ;; + *) + break + ;; + esac + done + + # POSIX shell doesn't have arrays. + # Desperate times calls for desperate measures! + while [ -n "$1" ]; do + case "$1" in + +*) + [ -z "$QUERY_TAG" ] && + QUERY_TAG="/[[:space:]]\\$1[[:space:]]/" || + QUERY_TAG="${QUERY_TAG} $QUERY_STRICT /[[:space:]]\\$1[[:space:]]/" + shift + ;; + *) + if [ "$QUERY_STRICT" = "&&" ]; then + [ -z "$QUERY_TITLE" ] && + QUERY_TITLE="grep -i -e \"$1\"" || + QUERY_TITLE="${QUERY_TITLE} | grep -i -e \"$1\"" + else + [ -z "$QUERY_TITLE" ] && + QUERY_TITLE="grep -i -e \"$1\"" || + QUERY_TITLE="${QUERY_TITLE} -e \"$1\"" + fi + shift + ;; + esac + done + + [ -z "$QUERY_TITLE" ] && + awk --posix -v COL_LINE_NUM="$COL_LINE_NUM" \ + -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ + "$QUERY_TAG { LINK=\$1; \$1=\"\"; + gsub(/[[:space:]]\+[^[:space:]]+/,\"\"); + print COL_LINE_NUM NR \") \" COL_LINK LINK \" \" COL_TITLE \$0 }" \ + "$DATA_FILE" + + [ -n "$QUERY_TITLE" ] && + awk --posix -v COL_LINE_NUM="$COL_LINE_NUM" \ + -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ + "$QUERY_TAG { LINK=\$1; \$1=\"\"; + gsub(/[[:space:]]\+[^[:space:]]+/,\"\"); + print COL_LINE_NUM NR \") \" COL_LINK LINK \" \" COL_TITLE \$0 }" \ + "$DATA_FILE" | eval "$QUERY_TITLE" +} + ############ ### main ### ############ @@ -86,6 +149,8 @@ case "$1" in bm_add "$@" ;; "ls"|"list") + shift + bm_list "$@" ;; "open") ;;