summary refs log tree commit diff
diff options
context:
space:
mode:
authorArun Isaac2021-09-23 13:07:00 +0530
committerArun Isaac2021-09-23 14:16:47 +0530
commitef8b00c5e4838116e3d07703fad4f818350045b6 (patch)
treeff2238a30fbb0932981459a050283d644b7e3b3a
parente903921f464ab1929063f776074a06093685a140 (diff)
downloadgn-gemtext-ef8b00c5e4838116e3d07703fad4f818350045b6.tar.gz
gnbug: Extract keywords.
* gnbug: Import (srfi srfi-1).
(<issue>): Add keywords and open fields.
(file-details): Extract keywords from file.
(issues): Initialize keywords and open fields.
-rwxr-xr-xgnbug48
1 files changed, 43 insertions, 5 deletions
diff --git a/gnbug b/gnbug
index caa474a..3e138ba 100755
--- a/gnbug
+++ b/gnbug
@@ -3,6 +3,7 @@
 
 (import (rnrs hashtables)
         (rnrs io ports)
+        (srfi srfi-1)
         (srfi srfi-9)
         (srfi srfi-26)
         (srfi srfi-37)
@@ -48,14 +49,17 @@ even if it exits non-locally. Return the value returned by PROC."
                     directory))
 
 (define-record-type <issue>
-  (issue file title creator created-date created-relative-date assigned)
+  (issue file title creator created-date created-relative-date
+         assigned keywords open)
   issue?
   (file issue-file)
   (title issue-title)
   (creator issue-creator)
   (created-date issue-created-date)
   (created-relative-date issue-created-relative-date)
-  (assigned issue-assigned))
+  (assigned issue-assigned)
+  (keywords issue-keywords)
+  (open issue-open))
 
 (define (issues)
   "Return a list of all issues, sorted newest first."
@@ -63,8 +67,9 @@ even if it exits non-locally. Return the value returned by PROC."
   ;; editors tend to create hidden files while editing, and we want to
   ;; avoid them.
   (sort (map (lambda (file)
-               (let ((file-details (file-details file))
-                     (creation-details (creation-details file)))
+               (let* ((file-details (file-details file))
+                      (creation-details (creation-details file))
+                      (all-keywords (hashtable-ref file-details 'keywords '())))
                  (issue file
                         ;; Fallback to filename if title has no alphabetic
                         ;; characters.
@@ -73,7 +78,11 @@ even if it exits non-locally. Return the value returned by PROC."
                         (assq-ref creation-details 'creator)
                         (assq-ref creation-details 'created-date)
                         (assq-ref creation-details 'created-relative-date)
-                        (hashtable-ref file-details 'assigned '()))))
+                        (hashtable-ref file-details 'assigned '())
+                        ;; "closed" is a special keyword to indicate
+                        ;; the open/closed status of an issue.
+                        (delete "closed" all-keywords)
+                        (not (member "closed" all-keywords)))))
              (find-files "."
                          (lambda (name _)
                            (and (string-suffix? ".gmi" name)
@@ -113,6 +122,35 @@ strings, and return them as a list."
                                   (hashtable-append! result 'assigned
                                                      (comma-split
                                                       (remove-prefix "* assigned:" line))))
+                                 ;; Lists with the keywords: prefix
+                                 ;; specify keywords.
+                                 ((string-prefix? "* keywords:" line)
+                                  (hashtable-append! result 'keywords
+                                                     (comma-split
+                                                      (remove-prefix "* keywords:" line))))
+                                 ;; A more fuzzy heuristic to find keywords
+                                 ((and (string-prefix? "* " line)
+                                       ;; Is every comma-separated
+                                       ;; element two words utmost?
+                                       (every (lambda (element)
+                                                (<= (length
+                                                     (string-split element #\space))
+                                                    2))
+                                              (comma-split (remove-prefix "* " line)))
+                                       ;; Does any comma-separated
+                                       ;; element contain a potential
+                                       ;; keyword?
+                                       (any (lambda (element)
+                                              (any (lambda (keyword)
+                                                     (string-contains element keyword))
+                                                   (list "request" "bug" "critical"
+                                                         "enhancement" "progress"
+                                                         "testing" "later" "documentation"
+                                                         "help" "closed")))
+                                            (comma-split (remove-prefix "* " line))))
+                                  (hashtable-append! result 'keywords
+                                                     (comma-split
+                                                      (remove-prefix "* " line))))
                                  ;; The first level one heading is the
                                  ;; title.
                                  ((string-prefix? "# " line)