Przeglądaj źródła

org-element: Internally store headline/inlinetask's tags as a list of strings

* contrib/lisp/org-element.el (org-element-headline-parser,
  org-element-headline-interpreter, org-element-inlinetask-parser,
  org-element-inlinetask-interpreter): Store headline/inlinetask's
  tags as a list of strings.
* contrib/lisp/org-export.el (org-export--selected-trees,
  org-export--skip-p): Use new tag representation.
* contrib/lisp/org-e-ascii.el (org-e-ascii--build-title,
  org-e-ascii-format-inlinetask-function, org-e-ascii-inlinetask): Use
  new tag representation.
* contrib/lisp/org-e-html.el (org-e-html-format-headline-function,
  org-e-html-format-inlinetask-function, org-e-html--tags): Use new
  tag representation.
* contrib/lisp/org-e-latex.el (org-e-latex-format-headline-function,
  org-e-latex-format-inlinetask-function, org-e-latex-headline,
  org-e-latex-inlinetask): Use new tag representation.
* contrib/lisp/org-e-odt.el (org-e-odt-format-org-tags): Use new tag
  representation.
* testing/lisp/test-org-element.el: Update test.
Nicolas Goaziou 13 lat temu
rodzic
commit
32a5920e69

+ 24 - 14
contrib/lisp/org-e-ascii.el

@@ -368,7 +368,7 @@ The function must accept six parameters:
   TODO-TYPE the todo type, a symbol among `todo', `done' and nil.
   TODO-TYPE the todo type, a symbol among `todo', `done' and nil.
   PRIORITY  the inlinetask priority, as a string
   PRIORITY  the inlinetask priority, as a string
   NAME      the inlinetask name, as a string.
   NAME      the inlinetask name, as a string.
-  TAGS      the inlinetask tags, as a string.
+  TAGS      the inlinetask tags, as a list of strings.
   CONTENTS  the contents of the inlinetask, as a string.
   CONTENTS  the contents of the inlinetask, as a string.
 
 
 The function should return either the string to be exported or
 The function should return either the string to be exported or
@@ -580,7 +580,7 @@ title."
 	       ;; All tests passed: build numbering string.
 	       ;; All tests passed: build numbering string.
 	       (concat
 	       (concat
 		(mapconcat
 		(mapconcat
-		 #'number-to-string
+		 'number-to-string
 		 (org-export-get-headline-number element info) ".")
 		 (org-export-get-headline-number element info) ".")
 		" ")))
 		" ")))
 	 (text (org-export-data (org-element-property :title element) info))
 	 (text (org-export-data (org-element-property :title element) info))
@@ -590,7 +590,10 @@ title."
 		 (and todo (concat (org-export-data todo info) " ")))))
 		 (and todo (concat (org-export-data todo info) " ")))))
 	 (tags (and (not notags)
 	 (tags (and (not notags)
 		    (plist-get info :with-tags)
 		    (plist-get info :with-tags)
-		    (org-element-property :tags element)))
+		    (let ((tag-list (org-element-property :tags element)))
+		      (and tag-list
+			   (format ":%s:"
+				   (mapconcat 'identity tag-list ":"))))))
 	 (priority
 	 (priority
 	  (and (plist-get info :with-priority)
 	  (and (plist-get info :with-priority)
 	       (concat (org-element-property :priority element) " ")))
 	       (concat (org-element-property :priority element) " ")))
@@ -1220,21 +1223,28 @@ contextual information."
   "Transcode an INLINETASK element from Org to ASCII.
   "Transcode an INLINETASK element from Org to ASCII.
 CONTENTS holds the contents of the block.  INFO is a plist
 CONTENTS holds the contents of the block.  INFO is a plist
 holding contextual information."
 holding contextual information."
-  (let ((width (org-e-ascii--current-text-width inlinetask info))
-	(title (org-export-data (org-element-property :title inlinetask) info))
-	(todo (and (plist-get info :with-todo-keywords)
-		   (let ((todo (org-element-property :todo-keyword inlinetask)))
-		     (and todo (org-export-data todo info)))))
-	(todo-type (org-element-property :todo-type inlinetask))
-	(tags (and (plist-get info :with-tags)
-		   (org-element-property :tags inlinetask)))
-	(priority (and (plist-get info :with-priority)
-		       (org-element-property :priority inlinetask))))
+  (let ((width (org-e-ascii--current-text-width inlinetask info)))
     ;; If `org-e-ascii-format-inlinetask-function' is provided, call it
     ;; If `org-e-ascii-format-inlinetask-function' is provided, call it
     ;; with appropriate arguments.
     ;; with appropriate arguments.
     (if (functionp org-e-ascii-format-inlinetask-function)
     (if (functionp org-e-ascii-format-inlinetask-function)
 	(funcall org-e-ascii-format-inlinetask-function
 	(funcall org-e-ascii-format-inlinetask-function
-		 todo todo-type priority title tags contents width)
+		 ;; todo.
+		 (and (plist-get info :with-todo-keywords)
+		      (let ((todo (org-element-property
+				   :todo-keyword inlinetask)))
+			(and todo (org-export-data todo info))))
+		 ;; todo-type
+		 (org-element-property :todo-type inlinetask)
+		 ;; priority
+		 (and (plist-get info :with-priority)
+		      (org-element-property :priority inlinetask))
+		 ;; title
+		 (org-export-data (org-element-property :title inlinetask) info)
+		 ;; tags
+		 (and (plist-get info :with-tags)
+		      (org-element-property :tags inlinetask))
+		 ;; contents and width
+		 contents width)
       ;; Otherwise, use a default template.
       ;; Otherwise, use a default template.
       (let* ((utf8p (eq (plist-get info :ascii-charset) 'utf-8)))
       (let* ((utf8p (eq (plist-get info :ascii-charset) 'utf-8)))
 	(org-e-ascii--indent-string
 	(org-e-ascii--indent-string

+ 17 - 17
contrib/lisp/org-e-html.el

@@ -840,25 +840,25 @@ When nil, the links still point to the plain `.org' file."
   "Function to format headline text.
   "Function to format headline text.
 
 
 This function will be called with 5 arguments:
 This function will be called with 5 arguments:
-TODO      the todo keyword \(string or nil\).
-TODO-TYPE the type of todo \(symbol: `todo', `done', nil\)
-PRIORITY  the priority of the headline \(integer or nil\)
-TEXT      the main headline text \(string\).
-TAGS      the tags string, separated with colons \(string or nil\).
+TODO      the todo keyword (string or nil).
+TODO-TYPE the type of todo (symbol: `todo', `done', nil)
+PRIORITY  the priority of the headline (integer or nil)
+TEXT      the main headline text (string).
+TAGS      the tags (string or nil).
 
 
 The function result will be used in the section format string.
 The function result will be used in the section format string.
 
 
 As an example, one could set the variable to the following, in
 As an example, one could set the variable to the following, in
 order to reproduce the default set-up:
 order to reproduce the default set-up:
 
 
-\(defun org-e-html-format-headline \(todo todo-type priority text tags\)
+\(defun org-e-html-format-headline \(todo todo-type priority text tags)
   \"Default format function for an headline.\"
   \"Default format function for an headline.\"
   \(concat \(when todo
   \(concat \(when todo
-            \(format \"\\\\textbf{\\\\textsc{\\\\textsf{%s}}} \" todo\)\)
+            \(format \"\\\\textbf{\\\\textsc{\\\\textsf{%s}}} \" todo))
 	  \(when priority
 	  \(when priority
-            \(format \"\\\\framebox{\\\\#%c} \" priority\)\)
+            \(format \"\\\\framebox{\\\\#%c} \" priority))
 	  text
 	  text
-	  \(when tags \(format \"\\\\hfill{}\\\\textsc{%s}\" tags\)\)\)\)"
+	  \(when tags (format \"\\\\hfill{}\\\\textsc{%s}\" tags))))"
   :group 'org-export-e-html
   :group 'org-export-e-html
   :type 'function)
   :type 'function)
 
 
@@ -972,7 +972,7 @@ The function must accept six parameters:
   TODO-TYPE the todo type, a symbol among `todo', `done' and nil.
   TODO-TYPE the todo type, a symbol among `todo', `done' and nil.
   PRIORITY  the inlinetask priority, as a string
   PRIORITY  the inlinetask priority, as a string
   NAME      the inlinetask name, as a string.
   NAME      the inlinetask name, as a string.
-  TAGS      the inlinetask tags, as a string.
+  TAGS      the inlinetask tags, as a list of strings.
   CONTENTS  the contents of the inlinetask, as a string.
   CONTENTS  the contents of the inlinetask, as a string.
 
 
 The function should return the string to be exported.
 The function should return the string to be exported.
@@ -985,19 +985,19 @@ in order to mimic default behaviour:
   \(let \(\(full-title
   \(let \(\(full-title
 	 \(concat
 	 \(concat
 	  \(when todo
 	  \(when todo
-            \(format \"\\\\textbf{\\\\textsf{\\\\textsc{%s}}} \" todo\)\)
-	  \(when priority \(format \"\\\\framebox{\\\\#%c} \" priority\)\)
+            \(format \"\\\\textbf{\\\\textsf{\\\\textsc{%s}}} \" todo))
+	  \(when priority (format \"\\\\framebox{\\\\#%c} \" priority))
 	  title
 	  title
-	  \(when tags \(format \"\\\\hfill{}\\\\textsc{%s}\" tags\)\)\)\)\)
-    \(format \(concat \"\\\\begin{center}\\n\"
+	  \(when tags (format \"\\\\hfill{}\\\\textsc{%s}\" tags)))))
+    \(format (concat \"\\\\begin{center}\\n\"
 		    \"\\\\fbox{\\n\"
 		    \"\\\\fbox{\\n\"
 		    \"\\\\begin{minipage}[c]{.6\\\\textwidth}\\n\"
 		    \"\\\\begin{minipage}[c]{.6\\\\textwidth}\\n\"
 		    \"%s\\n\\n\"
 		    \"%s\\n\\n\"
 		    \"\\\\rule[.8em]{\\\\textwidth}{2pt}\\n\\n\"
 		    \"\\\\rule[.8em]{\\\\textwidth}{2pt}\\n\\n\"
 		    \"%s\"
 		    \"%s\"
 		    \"\\\\end{minipage}}\"
 		    \"\\\\end{minipage}}\"
-		    \"\\\\end{center}\"\)
-	    full-title contents\)\)"
+		    \"\\\\end{center}\")
+	    full-title contents))"
   :group 'org-export-e-html
   :group 'org-export-e-html
   :type 'function)
   :type 'function)
 
 
@@ -1715,7 +1715,7 @@ original parsed data.  INFO is a plist holding export options."
 		       (concat org-e-html-tag-class-prefix
 		       (concat org-e-html-tag-class-prefix
 			       (org-e-html-fix-class-name tag))
 			       (org-e-html-fix-class-name tag))
 		       tag))
 		       tag))
-	     (org-split-string tags ":") " "))))
+	     tags " "))))
 
 
 ;;;; Headline
 ;;;; Headline
 
 

+ 27 - 20
contrib/lisp/org-e-latex.el

@@ -266,25 +266,27 @@ argument."
   "Function to format headline text.
   "Function to format headline text.
 
 
 This function will be called with 5 arguments:
 This function will be called with 5 arguments:
-TODO      the todo keyword \(string or nil\).
-TODO-TYPE the type of todo \(symbol: `todo', `done', nil\)
-PRIORITY  the priority of the headline \(integer or nil\)
-TEXT      the main headline text \(string\).
-TAGS      the tags string, separated with colons \(string or nil\).
+TODO      the todo keyword (string or nil).
+TODO-TYPE the type of todo (symbol: `todo', `done', nil)
+PRIORITY  the priority of the headline (integer or nil)
+TEXT      the main headline text (string).
+TAGS      the tags as a list of strings (list of strings or nil).
 
 
 The function result will be used in the section format string.
 The function result will be used in the section format string.
 
 
 As an example, one could set the variable to the following, in
 As an example, one could set the variable to the following, in
 order to reproduce the default set-up:
 order to reproduce the default set-up:
 
 
-\(defun org-e-latex-format-headline \(todo todo-type priority text tags\)
+\(defun org-e-latex-format-headline (todo todo-type priority text tags)
   \"Default format function for an headline.\"
   \"Default format function for an headline.\"
-  \(concat \(when todo
-            \(format \"\\\\textbf{\\\\textsc{\\\\textsf{%s}}} \" todo\)\)
+  \(concat (when todo
+            \(format \"\\\\textbf{\\\\textsc{\\\\textsf{%s}}} \" todo))
 	  \(when priority
 	  \(when priority
-            \(format \"\\\\framebox{\\\\#%c} \" priority\)\)
+            \(format \"\\\\framebox{\\\\#%c} \" priority))
 	  text
 	  text
-	  \(when tags \(format \"\\\\hfill{}\\\\textsc{%s}\" tags\)\)\)\)"
+	  \(when tags
+            \(format \"\\\\hfill{}\\\\textsc{%s}\"
+              \(mapconcat 'identity tags \":\"))))"
   :group 'org-export-e-latex
   :group 'org-export-e-latex
   :type 'function)
   :type 'function)
 
 
@@ -447,7 +449,7 @@ The function must accept six parameters:
   TODO-TYPE the todo type, a symbol among `todo', `done' and nil.
   TODO-TYPE the todo type, a symbol among `todo', `done' and nil.
   PRIORITY  the inlinetask priority, as a string
   PRIORITY  the inlinetask priority, as a string
   NAME      the inlinetask name, as a string.
   NAME      the inlinetask name, as a string.
-  TAGS      the inlinetask tags, as a string.
+  TAGS      the inlinetask tags, as a list of strings.
   CONTENTS  the contents of the inlinetask, as a string.
   CONTENTS  the contents of the inlinetask, as a string.
 
 
 The function should return the string to be exported.
 The function should return the string to be exported.
@@ -457,22 +459,24 @@ in order to mimic default behaviour:
 
 
 \(defun org-e-latex-format-inlinetask \(todo type priority name tags contents\)
 \(defun org-e-latex-format-inlinetask \(todo type priority name tags contents\)
 \"Format an inline task element for LaTeX export.\"
 \"Format an inline task element for LaTeX export.\"
-  \(let \(\(full-title
+  \(let ((full-title
 	 \(concat
 	 \(concat
 	  \(when todo
 	  \(when todo
-            \(format \"\\\\textbf{\\\\textsf{\\\\textsc{%s}}} \" todo\)\)
-	  \(when priority \(format \"\\\\framebox{\\\\#%c} \" priority\)\)
+            \(format \"\\\\textbf{\\\\textsf{\\\\textsc{%s}}} \" todo))
+	  \(when priority (format \"\\\\framebox{\\\\#%c} \" priority))
 	  title
 	  title
-	  \(when tags \(format \"\\\\hfill{}\\\\textsc{%s}\" tags\)\)\)\)\)
-    \(format \(concat \"\\\\begin{center}\\n\"
+	  \(when tags
+            \(format \"\\\\hfill{}\\\\textsc{:%s:}\"
+                    \(mapconcat 'identity tags \":\")))))
+    \(format (concat \"\\\\begin{center}\\n\"
 		    \"\\\\fbox{\\n\"
 		    \"\\\\fbox{\\n\"
 		    \"\\\\begin{minipage}[c]{.6\\\\textwidth}\\n\"
 		    \"\\\\begin{minipage}[c]{.6\\\\textwidth}\\n\"
 		    \"%s\\n\\n\"
 		    \"%s\\n\\n\"
 		    \"\\\\rule[.8em]{\\\\textwidth}{2pt}\\n\\n\"
 		    \"\\\\rule[.8em]{\\\\textwidth}{2pt}\\n\\n\"
 		    \"%s\"
 		    \"%s\"
 		    \"\\\\end{minipage}}\"
 		    \"\\\\end{minipage}}\"
-		    \"\\\\end{center}\"\)
-	    full-title contents\)\)"
+		    \"\\\\end{center}\")
+	    full-title contents))"
   :group 'org-export-e-latex
   :group 'org-export-e-latex
   :type 'function)
   :type 'function)
 
 
@@ -1194,7 +1198,9 @@ holding contextual information."
 			 (format "\\textbf{\\textsf{\\textsc{%s}}} " todo))
 			 (format "\\textbf{\\textsf{\\textsc{%s}}} " todo))
 		       (when priority (format "\\framebox{\\#%c} " priority))
 		       (when priority (format "\\framebox{\\#%c} " priority))
 		       text
 		       text
-		       (when tags (format "\\hfill{}\\textsc{%s}" tags)))))
+		       (when tags
+			 (format "\\hfill{}\\textsc{:%s:}"
+				 (mapconcat 'identity tags ":"))))))
 	 ;; Associate some \label to the headline for internal links.
 	 ;; Associate some \label to the headline for internal links.
 	 (headline-label
 	 (headline-label
 	  (format "\\label{sec-%s}\n"
 	  (format "\\label{sec-%s}\n"
@@ -1313,7 +1319,8 @@ holding contextual information."
 	       (when todo (format "\\textbf{\\textsf{\\textsc{%s}}} " todo))
 	       (when todo (format "\\textbf{\\textsf{\\textsc{%s}}} " todo))
 	       (when priority (format "\\framebox{\\#%c} " priority))
 	       (when priority (format "\\framebox{\\#%c} " priority))
 	       title
 	       title
-	       (when tags (format "\\hfill{}\\textsc{%s}" tags)))))
+	       (when tags (format "\\hfill{}\\textsc{:%s:}"
+				  (mapconcat 'identity tags ":"))))))
 	 (format (concat "\\begin{center}\n"
 	 (format (concat "\\begin{center}\n"
 			 "\\fbox{\n"
 			 "\\fbox{\n"
 			 "\\begin{minipage}[c]{.6\\textwidth}\n"
 			 "\\begin{minipage}[c]{.6\\textwidth}\n"

+ 1 - 1
contrib/lisp/org-e-odt.el

@@ -2690,7 +2690,7 @@ Replaces invalid characters with \"_\"."
 	(org-e-odt-format-fontify
 	(org-e-odt-format-fontify
 	 x (concat "" ;; org-e-odt-tag-class-prefix
 	 x (concat "" ;; org-e-odt-tag-class-prefix
 		   (org-e-odt-fix-class-name x))))
 		   (org-e-odt-fix-class-name x))))
-      (org-split-string tags ":")
+      tags
       (org-e-odt-format-spaces 1)) "tag")))
       (org-e-odt-format-spaces 1)) "tag")))
 
 
 (defun org-e-odt-format-section-number (&optional snumber level)
 (defun org-e-odt-format-section-number (&optional snumber level)

+ 18 - 21
contrib/lisp/org-element.el

@@ -344,7 +344,8 @@ Assume point is at beginning of the headline."
 	   (todo (nth 2 components))
 	   (todo (nth 2 components))
 	   (todo-type
 	   (todo-type
 	    (and todo (if (member todo org-done-keywords) 'done 'todo)))
 	    (and todo (if (member todo org-done-keywords) 'done 'todo)))
-	   (tags (nth 5 components))
+	   (tags (let ((raw-tags (nth 5 components)))
+		   (and raw-tags (org-split-string raw-tags ":"))))
 	   (raw-value (nth 4 components))
 	   (raw-value (nth 4 components))
 	   (quotedp
 	   (quotedp
 	    (let ((case-fold-search nil))
 	    (let ((case-fold-search nil))
@@ -352,10 +353,7 @@ Assume point is at beginning of the headline."
 	   (commentedp
 	   (commentedp
 	    (let ((case-fold-search nil))
 	    (let ((case-fold-search nil))
 	      (string-match (format "^%s +" org-comment-string) raw-value)))
 	      (string-match (format "^%s +" org-comment-string) raw-value)))
-	   (archivedp
-	    (and tags
-		 (let ((case-fold-search nil))
-		   (string-match (format ":%s:" org-archive-tag) tags))))
+	   (archivedp (member org-archive-tag tags))
 	   (footnote-section-p (and org-footnote-section
 	   (footnote-section-p (and org-footnote-section
 				    (string= org-footnote-section raw-value)))
 				    (string= org-footnote-section raw-value)))
 	   (standard-props (let (plist)
 	   (standard-props (let (plist)
@@ -394,12 +392,7 @@ Assume point is at beginning of the headline."
 	       ""
 	       ""
 	       raw-value)))
 	       raw-value)))
       ;; Clean TAGS from archive tag, if any.
       ;; Clean TAGS from archive tag, if any.
-      (when archivedp
-	(setq tags
-	      (and (not (string= tags (format ":%s:" org-archive-tag)))
-		   (replace-regexp-in-string
-		    (concat org-archive-tag ":") "" tags)))
-	(when (string= tags ":") (setq tags nil)))
+      (when archivedp (setq tags (delete org-archive-tag tags)))
       ;; Then get TITLE.
       ;; Then get TITLE.
       (setq title
       (setq title
 	    (if raw-secondary-p raw-value
 	    (if raw-secondary-p raw-value
@@ -436,14 +429,14 @@ CONTENTS is the contents of the element."
   (let* ((level (org-element-property :level headline))
   (let* ((level (org-element-property :level headline))
 	 (todo (org-element-property :todo-keyword headline))
 	 (todo (org-element-property :todo-keyword headline))
 	 (priority (org-element-property :priority headline))
 	 (priority (org-element-property :priority headline))
-	 (title (org-element-interpret-data (org-element-property :title headline)))
-	 (tags (let ((tag-string (org-element-property :tags headline))
-		     (archivedp (org-element-property :archivedp headline)))
-		 (cond
-		  ((and (not tag-string) archivedp)
-		   (format ":%s:" org-archive-tag))
-		  (archivedp (concat ":" org-archive-tag tag-string))
-		  (t tag-string))))
+	 (title (org-element-interpret-data
+		 (org-element-property :title headline)))
+	 (tags (let ((tag-list (if (org-element-property :archivedp headline)
+				   (cons org-archive-tag
+					 (org-element-property :tags headline))
+				 (org-element-property :tags headline))))
+		 (and tag-list
+		      (format ":%s:" (mapconcat 'identity tag-list ":")))))
 	 (commentedp (org-element-property :commentedp headline))
 	 (commentedp (org-element-property :commentedp headline))
 	 (quotedp (org-element-property :quotedp headline))
 	 (quotedp (org-element-property :quotedp headline))
 	 (pre-blank (or (org-element-property :pre-blank headline) 0))
 	 (pre-blank (or (org-element-property :pre-blank headline) 0))
@@ -504,6 +497,8 @@ Assume point is at beginning of the inline task."
 	   (todo (nth 2 components))
 	   (todo (nth 2 components))
 	   (todo-type (and todo
 	   (todo-type (and todo
 			   (if (member todo org-done-keywords) 'done 'todo)))
 			   (if (member todo org-done-keywords) 'done 'todo)))
+	   (tags (let ((raw-tags (nth 5 components)))
+		   (and raw-tags (org-split-string raw-tags ":"))))
 	   (title (if raw-secondary-p (nth 4 components)
 	   (title (if raw-secondary-p (nth 4 components)
 		    (org-element-parse-secondary-string
 		    (org-element-parse-secondary-string
 		     (nth 4 components)
 		     (nth 4 components)
@@ -544,7 +539,7 @@ Assume point is at beginning of the inline task."
 		:contents-end ,contents-end
 		:contents-end ,contents-end
 		:level ,(nth 1 components)
 		:level ,(nth 1 components)
 		:priority ,(nth 3 components)
 		:priority ,(nth 3 components)
-		:tags ,(nth 5 components)
+		:tags ,tags
 		:todo-keyword ,todo
 		:todo-keyword ,todo
 		:todo-type ,todo-type
 		:todo-type ,todo-type
 		:scheduled ,scheduled
 		:scheduled ,scheduled
@@ -563,7 +558,9 @@ CONTENTS is the contents of inlinetask."
 	 (priority (org-element-property :priority inlinetask))
 	 (priority (org-element-property :priority inlinetask))
 	 (title (org-element-interpret-data
 	 (title (org-element-interpret-data
 		 (org-element-property :title inlinetask)))
 		 (org-element-property :title inlinetask)))
-	 (tags (org-element-property :tags inlinetask))
+	 (tags (let ((tag-list (org-element-property :tags inlinetask)))
+		 (and tag-list
+		      (format ":%s:" (mapconcat 'identity tag-list ":")))))
 	 (task (concat (make-string level ?*)
 	 (task (concat (make-string level ?*)
 		       (and todo (concat " " todo))
 		       (and todo (concat " " todo))
 		       (and priority
 		       (and priority

+ 4 - 7
contrib/lisp/org-export.el

@@ -1450,10 +1450,8 @@ INFO is a plist holding export options."
 	       (funcall walk-data (org-element-contents data) genealogy))
 	       (funcall walk-data (org-element-contents data) genealogy))
 	      (headline
 	      (headline
 	       (let ((tags (org-element-property :tags headline)))
 	       (let ((tags (org-element-property :tags headline)))
-		 (if (and tags
-			  (loop for tag in (plist-get info :select-tags)
-				thereis (string-match
-					 (format ":%s:" tag) tags)))
+		 (if (loop for tag in (plist-get info :select-tags)
+			   thereis (member tag tags))
 		     ;; When a select tag is found, mark as acceptable
 		     ;; When a select tag is found, mark as acceptable
 		     ;; full genealogy and every headline within the
 		     ;; full genealogy and every headline within the
 		     ;; tree.
 		     ;; tree.
@@ -1477,12 +1475,11 @@ non-nil, is a list of tags marking a subtree as exportable."
 	   (todo (org-element-property :todo-keyword blob))
 	   (todo (org-element-property :todo-keyword blob))
 	   (todo-type (org-element-property :todo-type blob))
 	   (todo-type (org-element-property :todo-type blob))
 	   (archived (plist-get options :with-archived-trees))
 	   (archived (plist-get options :with-archived-trees))
-	   (tag-list (let ((tags (org-element-property :tags blob)))
-		       (and tags (org-split-string tags ":")))))
+	   (tags (org-element-property :tags blob)))
        (or
        (or
 	;; Ignore subtrees with an exclude tag.
 	;; Ignore subtrees with an exclude tag.
 	(loop for k in (plist-get options :exclude-tags)
 	(loop for k in (plist-get options :exclude-tags)
-	      thereis (member k tag-list))
+	      thereis (member k tags))
 	;; Ignore subtrees without a select tag, when such tag is
 	;; Ignore subtrees without a select tag, when such tag is
 	;; found in the buffer.
 	;; found in the buffer.
 	(member blob select-tags)
 	(member blob select-tags)

+ 1 - 1
testing/lisp/test-org-element.el

@@ -275,7 +275,7 @@ Return interpreted string."
       (let ((headline (org-element-at-point)))
       (let ((headline (org-element-at-point)))
 	(should (org-element-property :archivedp headline))
 	(should (org-element-property :archivedp headline))
 	;; Test tag removal.
 	;; Test tag removal.
-	(should (equal (org-element-property :tags headline) ":test:"))))))
+	(should (equal (org-element-property :tags headline) '("test")))))))
 
 
 
 
 ;;;; Verse blocks
 ;;;; Verse blocks