From mboxrd@z Thu Jan 1 00:00:00 1970 From: Brice Waegeneire Subject: [PATCH] Add NO-STATS switch to org-get-heading Date: Fri, 13 Mar 2020 16:11:45 +0100 Message-ID: <20200313151145.29469-1-brice@waegenei.re> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:36968) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jClyg-0001NN-4X for emacs-orgmode@gnu.org; Fri, 13 Mar 2020 11:11:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jClye-00024J-GW for emacs-orgmode@gnu.org; Fri, 13 Mar 2020 11:11:57 -0400 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:56423) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jClye-0001vE-7T for emacs-orgmode@gnu.org; Fri, 13 Mar 2020 11:11:56 -0400 Received: from localhost (luy13-1-78-237-113-178.fbx.proxad.net [78.237.113.178]) (Authenticated sender: brice@waegenei.re) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id C75441C0015 for ; Fri, 13 Mar 2020 15:11:52 +0000 (UTC) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane-mx.org@gnu.org Sender: "Emacs-orgmode" To: emacs-orgmode@gnu.org * lisp/org-element.el (org-element-context): Handle headlines only containing a statistics cookie. * lisp/org.el (test-org/get-heading): Add regex capture group 6 for statistics cookie. (org-get-heading): Add NO-STATS argument, if non-nil, will not return the statistics cookie. * testing/lisp/test-org.el (test-org/get-heading): Add 3 tests using the NO-STATS argument. --- lisp/org-element.el | 4 ++-- lisp/org.el | 13 +++++++++---- testing/lisp/test-org.el | 13 +++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index 798c540e9..c1798e07a 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -5906,9 +5906,9 @@ Providing it allows for quicker computation." (let ((case-fold-search nil)) (goto-char (org-element-property :begin element)) (looking-at org-complex-heading-regexp) - (let ((end (match-end 4))) + (let ((end (or (match-end 6) (match-end 4)))) (if (not end) (throw 'objects-forbidden element) - (goto-char (match-beginning 4)) + (goto-char (or (match-beginning 4) (match-beginning 6))) (when (looking-at org-comment-string) (goto-char (match-end 0))) (if (>= (point) end) (throw 'objects-forbidden element) diff --git a/lisp/org.el b/lisp/org.el index 31133c554..b6fc6ad26 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -4011,6 +4011,7 @@ group 2: The TODO keyword, maybe group 3: Priority cookie group 4: True headline group 5: Tags +group 6: Statistics cookie Since TODO keywords are case-sensitive, `case-fold-search' is expected to be bound to nil when matching against this regexp.") @@ -4328,7 +4329,8 @@ related expressions." "\\(?: +" org-todo-regexp "\\)?" "\\(?: +\\(\\[#.\\]\\)\\)?" "\\(?: +\\(.*?\\)\\)??" - "\\(?:[ \t]+\\(:[[:alnum:]_@#%:]+:\\)\\)?" + "\\(?: +\\(?6:\\[[0-9%%/]+\\]\\)\\)?" + "\\(?:[ \t]+\\(?5::[[:alnum:]_@#%:]+:\\)\\)?" "[ \t]*$") org-complex-heading-regexp-format (concat "^\\(\\*+\\)" @@ -6897,12 +6899,14 @@ So this will delete or add empty lines." (insert (make-string n ?\n)) (move-to-column column))) -(defun org-get-heading (&optional no-tags no-todo no-priority no-comment) +(defun org-get-heading (&optional no-tags no-todo no-priority + no-comment no-stats) "Return the heading of the current entry, without the stars. When NO-TAGS is non-nil, don't include tags. When NO-TODO is non-nil, don't include TODO keywords. When NO-PRIORITY is non-nil, don't include priority cookie. When NO-COMMENT is non-nil, don't include COMMENT string. +When NO-STATS is non-nil, don't include statistics cookie. Return nil before first heading." (unless (org-before-first-heading-p) (save-excursion @@ -6919,9 +6923,10 @@ Return nil before first heading." (format "\\`%s[ \t]+" org-comment-string)) "" h)) (h h))) - (tags (and (not no-tags) (match-string 5)))) + (tags (and (not no-tags) (match-string 5))) + (stats (and (not no-stats) (match-string 6)))) (mapconcat #'identity - (delq nil (list todo priority headline tags)) + (delq nil (list todo priority headline stats tags)) " ")))))) (defun org-heading-components () diff --git a/testing/lisp/test-org.el b/testing/lisp/test-org.el index dc4a6a59f..f98918dae 100644 --- a/testing/lisp/test-org.el +++ b/testing/lisp/test-org.el @@ -1887,6 +1887,19 @@ (equal "TODO [#A] H" (org-test-with-temp-text "* TODO [#A] COMMENT H" (org-get-heading nil nil nil t)))) + ;; With NO-STATS, ignore statistics cookie. + (should + (equal "H" + (org-test-with-temp-text "* H [1/3]" + (org-get-heading nil nil nil nil t)))) + (should + (equal "H" + (org-test-with-temp-text "* H" + (org-get-heading nil nil nil nil t)))) + (should + (equal "TODO [#A] H" + (org-test-with-temp-text "* TODO [#A] H [33%]" + (org-get-heading nil nil nil nil t)))) ;; On an empty headline, return value is consistent. (should (equal "" (org-test-with-temp-text "* " (org-get-heading)))) (should (equal "" (org-test-with-temp-text "* " (org-get-heading t)))) -- 2.25.0