branch: externals/hyperbole
commit d3a70b9dfe10ca6fd75cf015b2e405233bed2167
Author: Bob Weiner <r...@gnu.org>
Commit: Bob Weiner <r...@gnu.org>

    hyrolo.py - For Org files, include '#+PROPERTY:' lines in file hdr
---
 ChangeLog |  3 +++
 hyrolo.py | 35 ++++++++++++++++++++++++++++-------
 2 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 28bbb04a05..d4e9989bae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2024-04-16  Bob Weiner  <r...@gnu.org>
 
+* hyrolo.py: For Org files, create hyrolo match file header from all
+    initial buffer-level '#+PROPERTY:' lines.
+
 * hib-social.el (github-reference): Allow for a - character following
     commit, issue or pull keywords; already supported / and = characters.
                 (gitlab-reference): Allow for a - character following
diff --git a/hyrolo.py b/hyrolo.py
index 661c8df594..09c80fc8b2 100644
--- a/hyrolo.py
+++ b/hyrolo.py
@@ -8,7 +8,7 @@
 # Author:       Bob Weiner
 #
 # Orig-Date:     1-Apr-24 at 01:45:27
-# Last-Mod:     15-Apr-24 at 00:04:58 by Bob Weiner
+# Last-Mod:     16-Apr-24 at 23:12:28 by Bob Weiner
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
 #
@@ -36,11 +36,11 @@ import re
 
 # String to match at bol for file header start and end
 file_header_delimiter = '==='
-# Header to insert before a file's first entry match when file has no header.
-# Used with one argument, the file name.
+# Header to insert before a file's first entry match when file has no header
+# Used with one argument, the file name
 file_header_format = \
     
"===============================================================================\n"
 \
-    "@loc> \"%s\"\n" \
+    "%s" \
     
"===============================================================================\n"
 
 # The ANSI escape sequence for the red color
@@ -55,6 +55,7 @@ def find_matching_entries(match_string, file_paths):
 
     # Remove any null items from file_paths and expand them
     file_paths = [os.path.abspath(os.path.expanduser(os.path.expandvars(p))) 
for p in file_paths if p]
+    org_buffer_property_regex ='#\\+[^: \t\n]+:'
 
     for file_path in file_paths:
         # Initialize variables
@@ -62,18 +63,27 @@ def find_matching_entries(match_string, file_paths):
         file_header_buffer = ''
         inside_entry = False
         inside_file_header = False
+        inside_org_file_header = False
         first_line = True
         first_entry = True
         headline_match = False
+        org_file = False
 
         # Open the file
         with open(file_path, 'r') as file:
+            org_file = file_path.endswith('.org')
             for line in file:
                 if first_line:
                     first_line = False
                     if line.startswith(file_header_delimiter):
                         inside_file_header = True
                         file_header_buffer += line
+                        org_file = False  # Prevent double file header wrapping
+                        continue
+                    elif org_file and line.startswith('#'):
+                        inside_org_file_header = True
+                        if re.match(org_buffer_property_regex, line):
+                            file_header_buffer += line
                         continue
 
                 if inside_file_header:
@@ -81,20 +91,31 @@ def find_matching_entries(match_string, file_paths):
                     if line.startswith(file_header_delimiter):
                         inside_file_header = False
                     continue
+                elif inside_org_file_header:
+                    if re.match(org_buffer_property_regex, line):
+                        file_header_buffer += line
+                    elif line.startswith('#'):
+                        pass
+                    else:
+                        inside_org_file_header = False
+                    continue
 
                 headline_match = re.match(r'[\*\#]+[ \t]', line, re.IGNORECASE)
-                # If inside a entry and the line starts with an asterisk, check
+                # If inside an entry and the line starts with an asterisk, 
check
                 # if the buffer contains the match string. 
                 if inside_entry and headline_match:
                     if re.search(quoted_match_string, buffer, re.IGNORECASE):
                         if first_entry:
                             first_entry = False
                             if file_header_buffer:
-                                print(file_header_buffer, end='')
+                                if org_file:
+                                    print(file_header_format % 
file_header_buffer, end='')
+                                else:
+                                    print(file_header_buffer, end='')
                                 file_header_buffer = ''
                                 print("@loc> \"%s\"\n" % file_path)
                             else:
-                                print(file_header_format % file_path)
+                                print(file_header_format % "@loc> \"" + 
file_path + "\"\n")
 
                         highlight_matches(match_string, buffer)
 

Reply via email to