From b0a4ceddcd7e3b56d8982eb9afd0995fafab8470 Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 13 Apr 2021 00:15:53 +0600 Subject: [PATCH 01/11] parse -c and -s for list command --- sxbm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/sxbm b/sxbm index d1fe8f7..438056d 100755 --- a/sxbm +++ b/sxbm @@ -51,6 +51,23 @@ COMMANDS: -v|--version print the version and exit\n\n" } +bm_list(){ + while [ -n "$1" ]; do + case "$1" in + "-c"|"--disable-colors") + COL_LINK=""; COL_TITLE=""; COL_LINE_NUM="" + shift + ;; + "-s"|"--strict") + local TAG_STRICT="1" + shift + ;; + *) + break + ;; + esac + done +} ############ ### main ### @@ -66,6 +83,8 @@ case "$1" in "add") ;; "ls"|"list") + shift + bm_list "$@" ;; "open") ;; From f083645b3c4b0950f2c7eeb57d0bfdd6d1be7cdf Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 13 Apr 2021 00:19:42 +0600 Subject: [PATCH 02/11] initial list implementation this is very broken. need to implement proper query parsing. sniff out line num if exists, sniff out tags and then title. need to implement strict tag search as well. --- sxbm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sxbm b/sxbm index 438056d..d56fb9c 100755 --- a/sxbm +++ b/sxbm @@ -67,6 +67,13 @@ bm_list(){ ;; esac done + + awk -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ + -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY="$QUERY_TITLE" \ + ' $0 ~ QUERY { LINK=$1; $1=""; + gsub(/+\w+/,""); + print COL_LINE_NUM NR ") " COL_LINK LINK " " COL_TITLE $0 ; }' \ + "/artix/home/nrk/documents/source/sxbm/bookmarks" } ############ From e0022ab7abba8acf12998c69693ce23db4babfd4 Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 13 Apr 2021 10:31:47 +0600 Subject: [PATCH 03/11] parse the list arguments --- sxbm | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/sxbm b/sxbm index d56fb9c..9da0875 100755 --- a/sxbm +++ b/sxbm @@ -68,12 +68,28 @@ bm_list(){ esac done + expr "$1" : '[0-9]' > /dev/null && + local QUERY_LINE="$1" || + while [ -n "$1" ]; do + case "$1" in + +*) + local QUERY_TAG="${QUERY_TAG}$1 " + shift + ;; + *) + local QUERY_TITLE="${QUERY_TITLE}$1 " + shift + ;; + esac + done + awk -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ - -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY="$QUERY_TITLE" \ - ' $0 ~ QUERY { LINK=$1; $1=""; + -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY_TITLE="$QUERY_TITLE" \ + ' BEGIN{IGNORECASE=1} + $0 ~ QUERY_TITLE { LINK=$1; $1=""; gsub(/+\w+/,""); print COL_LINE_NUM NR ") " COL_LINK LINK " " COL_TITLE $0 ; }' \ - "/artix/home/nrk/documents/source/sxbm/bookmarks" + "$DATA_FILE" } ############ From 6eb126bd7c74aeb95f8b56d1123d064c07e74367 Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 13 Apr 2021 10:32:24 +0600 Subject: [PATCH 04/11] ocd --- sxbm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sxbm b/sxbm index 9da0875..f916a48 100755 --- a/sxbm +++ b/sxbm @@ -55,7 +55,7 @@ bm_list(){ while [ -n "$1" ]; do case "$1" in "-c"|"--disable-colors") - COL_LINK=""; COL_TITLE=""; COL_LINE_NUM="" + COL_LINK=""; COL_TITLE=""; COL_LINE_NUM=""; shift ;; "-s"|"--strict") From 21b4f11ddd9dd509dedc6c507896a4204a3eade7 Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 13 Apr 2021 10:32:48 +0600 Subject: [PATCH 05/11] implement list by specific line number --- sxbm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sxbm b/sxbm index f916a48..71d2db7 100755 --- a/sxbm +++ b/sxbm @@ -83,6 +83,16 @@ bm_list(){ esac done + [ -n "$QUERY_LINE" ] && + [ $QUERY_LINE -gt $(wc -l < "$DATA_FILE") ] && + die "$QUERY_LINE doesn't exist. Use 'sxbm ls' to list all bookmark" || + awk -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ + -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY_LINE="$QUERY_LINE" \ + ' NR == QUERY_LINE { LINK=$1; $1=""; + gsub(/+\w+/,""); + print COL_LINE_NUM NR ") " COL_LINK LINK " " COL_TITLE $0 ; }' \ + "$DATA_FILE" + awk -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY_TITLE="$QUERY_TITLE" \ ' BEGIN{IGNORECASE=1} From 958f54b755c78322cc700f7810bd2b5666f4a38b Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 13 Apr 2021 22:56:33 +0600 Subject: [PATCH 06/11] mutate $QUERY_TAG and TITLE into grepable format --- sxbm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sxbm b/sxbm index 71d2db7..81dce84 100755 --- a/sxbm +++ b/sxbm @@ -93,6 +93,14 @@ bm_list(){ print COL_LINE_NUM NR ") " COL_LINK LINK " " COL_TITLE $0 ; }' \ "$DATA_FILE" + # POSIX shell doesn't have arrays. + # Desperate times calls for desperate measures! + [ -n "$QUERY_TAG" ] && + QUERY_TAG=$(echo "$QUERY_TAG" | sed 's/ *$//;s/ /" -e "/g;s/^/-e "/;s/$/"/') + + [ -n "$QUERY_TITLE" ] && + QUERY_TITLE=$(echo "$QUERY_TITLE" | sed 's/ *$//;s/ /" -e "/g;s/^/-e "/;s/$/"/') + awk -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY_TITLE="$QUERY_TITLE" \ ' BEGIN{IGNORECASE=1} From 767bd41fb558384af07015f650e24a48dde46af7 Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 13 Apr 2021 22:58:11 +0600 Subject: [PATCH 07/11] implement searching with TAG and TITLE --- sxbm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/sxbm b/sxbm index 81dce84..6cbfd23 100755 --- a/sxbm +++ b/sxbm @@ -101,6 +101,17 @@ bm_list(){ [ -n "$QUERY_TITLE" ] && QUERY_TITLE=$(echo "$QUERY_TITLE" | sed 's/ *$//;s/ /" -e "/g;s/^/-e "/;s/$/"/') + [ -n "$QUERY_TAG" ] && [ -n "$QUERY_TITLE" ] && + eval grep -w -n "$QUERY_TAG" "$DATA_FILE" | + eval grep -i "$QUERY_TITLE" + + [ -n "$QUERY_TAG" ] && [ -z "$QUERY_TITLE" ] && + eval grep -w -n "$QUERY_TAG" "$DATA_FILE" + + [ -z "$QUERY_TAG" ] && [ -n "$QUERY_TITLE" ] && + eval grep -i -n "$QUERY_TITLE" "$DATA_FILE" + + [ -z "$QUERY_TAG" ] && [ -z "$QUERY_TITLE" ] && awk -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY_TITLE="$QUERY_TITLE" \ ' BEGIN{IGNORECASE=1} From 0271b270ee2b33b346d05613d1c06ad1fb2eee00 Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 13 Apr 2021 23:02:55 +0600 Subject: [PATCH 08/11] remove list by line num why the fuck would anyone want to list a specific line. makes no sense. search via title/tag like a normal human bean! --- sxbm | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/sxbm b/sxbm index 6cbfd23..2f314d8 100755 --- a/sxbm +++ b/sxbm @@ -68,30 +68,18 @@ bm_list(){ esac done - expr "$1" : '[0-9]' > /dev/null && - local QUERY_LINE="$1" || - while [ -n "$1" ]; do - case "$1" in - +*) - local QUERY_TAG="${QUERY_TAG}$1 " - shift - ;; - *) - local QUERY_TITLE="${QUERY_TITLE}$1 " - shift - ;; - esac - done - - [ -n "$QUERY_LINE" ] && - [ $QUERY_LINE -gt $(wc -l < "$DATA_FILE") ] && - die "$QUERY_LINE doesn't exist. Use 'sxbm ls' to list all bookmark" || - awk -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ - -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY_LINE="$QUERY_LINE" \ - ' NR == QUERY_LINE { LINK=$1; $1=""; - gsub(/+\w+/,""); - print COL_LINE_NUM NR ") " COL_LINK LINK " " COL_TITLE $0 ; }' \ - "$DATA_FILE" + while [ -n "$1" ]; do + case "$1" in + +*) + local QUERY_TAG="${QUERY_TAG}$1 " + shift + ;; + *) + local QUERY_TITLE="${QUERY_TITLE}$1 " + shift + ;; + esac + done # POSIX shell doesn't have arrays. # Desperate times calls for desperate measures! From 01141b711939b12463921f15918c24559fa1c6ce Mon Sep 17 00:00:00 2001 From: NRK Date: Wed, 14 Apr 2021 08:49:43 +0600 Subject: [PATCH 09/11] cleanups grep -w isnt posix compliant the awk command to list all bookmarks isnt either need to rewrite the entire thing to be posix compliant also need to figure out a sane and posix compliant way to colorize the output --- sxbm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/sxbm b/sxbm index 2f314d8..4670b8a 100755 --- a/sxbm +++ b/sxbm @@ -91,19 +91,21 @@ bm_list(){ [ -n "$QUERY_TAG" ] && [ -n "$QUERY_TITLE" ] && eval grep -w -n "$QUERY_TAG" "$DATA_FILE" | - eval grep -i "$QUERY_TITLE" + eval grep -i "$QUERY_TITLE" | + sed 's/:/) /;s/+.*//g;s/ *$//' [ -n "$QUERY_TAG" ] && [ -z "$QUERY_TITLE" ] && - eval grep -w -n "$QUERY_TAG" "$DATA_FILE" + eval grep -w -n "$QUERY_TAG" "$DATA_FILE" | + sed 's/:/) /;s/+.*//g;s/ *$//' [ -z "$QUERY_TAG" ] && [ -n "$QUERY_TITLE" ] && - eval grep -i -n "$QUERY_TITLE" "$DATA_FILE" + eval grep -i -n "$QUERY_TITLE" "$DATA_FILE" | + sed 's/:/) /;s/+.*//g;s/ *$//' [ -z "$QUERY_TAG" ] && [ -z "$QUERY_TITLE" ] && - awk -v COL_LINK="$COL_LINK" -v COL_TITLE="$COL_TITLE" \ - -v COL_LINE_NUM=$COL_LINE_NUM -v QUERY_TITLE="$QUERY_TITLE" \ - ' BEGIN{IGNORECASE=1} - $0 ~ QUERY_TITLE { LINK=$1; $1=""; + awk -v COL_LINE_NUM=$COL_LINE_NUM \ + -v COL_TITLE="$COL_TITLE" -v COL_LINK="$COL_LINK" \ + ' { LINK=$1; $1=""; gsub(/+\w+/,""); print COL_LINE_NUM NR ") " COL_LINK LINK " " COL_TITLE $0 ; }' \ "$DATA_FILE" From 7b70d3aad8075b271b3d19bd2635399fac297ea2 Mon Sep 17 00:00:00 2001 From: NRK Date: Thu, 15 Apr 2021 15:35:42 +0600 Subject: [PATCH 10/11] reimplementaion of list, posix compliant still not happy with the implementaion. theres a bunch of bugs too (see TODO) my decision to make the script fully posix compliant is biting me back in the ass. --- sxbm | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/sxbm b/sxbm index 4670b8a..09be8e2 100755 --- a/sxbm +++ b/sxbm @@ -52,6 +52,9 @@ COMMANDS: } bm_list(){ + local QUERY_TAG="-n " + local QUERY_TITLE="-n " + while [ -n "$1" ]; do case "$1" in "-c"|"--disable-colors") @@ -59,7 +62,8 @@ bm_list(){ shift ;; "-s"|"--strict") - local TAG_STRICT="1" + QUERY_TAG="" + QUERY_TITLE="" shift ;; *) @@ -68,47 +72,44 @@ bm_list(){ esac done + # POSIX shell doesn't have arrays. + # Desperate times calls for desperate measures! while [ -n "$1" ]; do case "$1" in +*) - local QUERY_TAG="${QUERY_TAG}$1 " + [ "${QUERY_TAG#-n}" != "$QUERY_TAG" ] && + QUERY_TAG="${QUERY_TAG}-e '/[[:space:]]$1[[:space:]]/p' " || + QUERY_TAG="${QUERY_TAG}-e '/[[:space:]]$1[[:space:]]/!d' " shift ;; *) - local QUERY_TITLE="${QUERY_TITLE}$1 " + [ "${QUERY_TITLE#-n}" != "$QUERY_TITLE" ] && + QUERY_TITLE="${QUERY_TITLE}-e '/$1/p' " || + QUERY_TITLE="${QUERY_TITLE}-e '/$1/!d' " shift ;; esac done - # POSIX shell doesn't have arrays. - # Desperate times calls for desperate measures! - [ -n "$QUERY_TAG" ] && - QUERY_TAG=$(echo "$QUERY_TAG" | sed 's/ *$//;s/ /" -e "/g;s/^/-e "/;s/$/"/') + # TODO print the line number + # TODO fix double print if --strict not used + # '/[[:space:]]+apps[[:space:]]\|[[:space:]]+lmao[[:space:]]/p' + # TODO title search needs to exclude +tags + # 's/[[:space:]]+[^[:space:]]\{1,\}//g' this kills the tags + # TODO title search needs to be case insensitive - [ -n "$QUERY_TITLE" ] && - QUERY_TITLE=$(echo "$QUERY_TITLE" | sed 's/ *$//;s/ /" -e "/g;s/^/-e "/;s/$/"/') + [ "${#QUERY_TAG}" -le 3 ] && [ "${#QUERY_TITLE}" -le 3 ] && + sed "" "$DATA_FILE" - [ -n "$QUERY_TAG" ] && [ -n "$QUERY_TITLE" ] && - eval grep -w -n "$QUERY_TAG" "$DATA_FILE" | - eval grep -i "$QUERY_TITLE" | - sed 's/:/) /;s/+.*//g;s/ *$//' + [ "${#QUERY_TAG}" -le 3 ] && [ "${#QUERY_TITLE}" -gt 3 ] && + eval sed "$QUERY_TITLE" "$DATA_FILE" - [ -n "$QUERY_TAG" ] && [ -z "$QUERY_TITLE" ] && - eval grep -w -n "$QUERY_TAG" "$DATA_FILE" | - sed 's/:/) /;s/+.*//g;s/ *$//' + [ "${#QUERY_TAG}" -gt 3 ] && [ "${#QUERY_TITLE}" -le 3 ] && + eval sed "$QUERY_TAG" "$DATA_FILE" - [ -z "$QUERY_TAG" ] && [ -n "$QUERY_TITLE" ] && - eval grep -i -n "$QUERY_TITLE" "$DATA_FILE" | - sed 's/:/) /;s/+.*//g;s/ *$//' - - [ -z "$QUERY_TAG" ] && [ -z "$QUERY_TITLE" ] && - awk -v COL_LINE_NUM=$COL_LINE_NUM \ - -v COL_TITLE="$COL_TITLE" -v COL_LINK="$COL_LINK" \ - ' { LINK=$1; $1=""; - gsub(/+\w+/,""); - print COL_LINE_NUM NR ") " COL_LINK LINK " " COL_TITLE $0 ; }' \ - "$DATA_FILE" + [ "${#QUERY_TAG}" -gt 3 ] && [ "${#QUERY_TITLE}" -gt 3 ] && + eval sed "$QUERY_TAG" "$DATA_FILE" | + eval sed "$QUERY_TITLE" } ############ From 55c013326debad6123a61abf2139e4671169a579 Mon Sep 17 00:00:00 2001 From: NRK Date: Tue, 20 Apr 2021 11:55:02 +0600 Subject: [PATCH 11/11] another list rewrite, using awk and grep --- sxbm | 58 ++++++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/sxbm b/sxbm index 09be8e2..568b322 100755 --- a/sxbm +++ b/sxbm @@ -52,8 +52,9 @@ COMMANDS: } bm_list(){ - local QUERY_TAG="-n " - local QUERY_TITLE="-n " + local QUERY_TAG + local QUERY_TITLE + local QUERY_STRICT="||" while [ -n "$1" ]; do case "$1" in @@ -62,8 +63,7 @@ bm_list(){ shift ;; "-s"|"--strict") - QUERY_TAG="" - QUERY_TITLE="" + local QUERY_STRICT="&&" shift ;; *) @@ -77,39 +77,41 @@ bm_list(){ while [ -n "$1" ]; do case "$1" in +*) - [ "${QUERY_TAG#-n}" != "$QUERY_TAG" ] && - QUERY_TAG="${QUERY_TAG}-e '/[[:space:]]$1[[:space:]]/p' " || - QUERY_TAG="${QUERY_TAG}-e '/[[:space:]]$1[[:space:]]/!d' " + [ -z "$QUERY_TAG" ] && + QUERY_TAG="/[[:space:]]\\$1[[:space:]]/" || + QUERY_TAG="${QUERY_TAG} $QUERY_STRICT /[[:space:]]\\$1[[:space:]]/" shift ;; *) - [ "${QUERY_TITLE#-n}" != "$QUERY_TITLE" ] && - QUERY_TITLE="${QUERY_TITLE}-e '/$1/p' " || - QUERY_TITLE="${QUERY_TITLE}-e '/$1/!d' " + 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 - # TODO print the line number - # TODO fix double print if --strict not used - # '/[[:space:]]+apps[[:space:]]\|[[:space:]]+lmao[[:space:]]/p' - # TODO title search needs to exclude +tags - # 's/[[:space:]]+[^[:space:]]\{1,\}//g' this kills the tags - # TODO title search needs to be case insensitive + [ -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" - [ "${#QUERY_TAG}" -le 3 ] && [ "${#QUERY_TITLE}" -le 3 ] && - sed "" "$DATA_FILE" - - [ "${#QUERY_TAG}" -le 3 ] && [ "${#QUERY_TITLE}" -gt 3 ] && - eval sed "$QUERY_TITLE" "$DATA_FILE" - - [ "${#QUERY_TAG}" -gt 3 ] && [ "${#QUERY_TITLE}" -le 3 ] && - eval sed "$QUERY_TAG" "$DATA_FILE" - - [ "${#QUERY_TAG}" -gt 3 ] && [ "${#QUERY_TITLE}" -gt 3 ] && - eval sed "$QUERY_TAG" "$DATA_FILE" | - eval sed "$QUERY_TITLE" + [ -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" } ############