diff --git a/contrib/lisp/ox-taskjuggler.el b/contrib/lisp/ox-taskjuggler.el index 761e180f3..b3a691a41 100644 --- a/contrib/lisp/ox-taskjuggler.el +++ b/contrib/lisp/ox-taskjuggler.el @@ -310,6 +310,19 @@ If one of these appears as a property for a headline, it will be exported with the corresponding task." :group 'org-export-taskjuggler) +(defcustom org-taskjuggler-valid-project-attributes + '(timingresolution timezone alertlevels currency currencyformat + dailyworkinghours extend includejournalentry now numberformat + outputdir scenario shorttimeformat timeformat trackingscenario + weekstartsmonday weekstartssunday workinghours + yearlyworkingdays) + "Valid attributes for Taskjuggler project. +If one of these appears as a property for a headline that is a +project definition, it will be exported with the corresponding +task. Attribute 'timingresolution' should be the first in the +list." + :group 'org-export-taskjuggler) + (defcustom org-taskjuggler-valid-resource-attributes '(limits vacation shift booking efficiency journalentry rate workinghours flags) @@ -483,9 +496,9 @@ Return new string. If S is the empty string, return it." (if (equal "" s) s (replace-regexp-in-string "^ *\\S-" " \\&" s))) (defun org-taskjuggler--build-attributes (item attributes) - "Return attributes string for task, resource or report ITEM. -ITEM is a headline. ATTRIBUTES is a list of symbols -representing valid attributes for ITEM." + "Return attributes string for ITEM. +ITEM is a project, task, resource or report headline. ATTRIBUTES +is a list of symbols representing valid attributes for ITEM." (mapconcat (lambda (attribute) (let ((value (org-element-property @@ -715,18 +728,27 @@ PROJECT is a headline. INFO is a plist used as a communication channel. If no start date is specified, start today. If no end date is specified, end `org-taskjuggler-default-project-duration' days from now." - (format "project %s \"%s\" \"%s\" %s %s {\n}\n" - (org-taskjuggler-get-id project info) - (org-taskjuggler-get-name project) - ;; Version is obtained through :TASKJUGGLER_VERSION: - ;; property or `org-taskjuggler-default-project-version'. - (or (org-element-property :VERSION project) - org-taskjuggler-default-project-version) - (or (org-taskjuggler-get-start project) - (format-time-string "%Y-%m-%d")) - (let ((end (org-taskjuggler-get-end project))) - (or (and end (format "- %s" end)) - (format "+%sd" org-taskjuggler-default-project-duration))))) + (concat + ;; Opening project. + (format "project %s \"%s\" \"%s\" %s %s {\n" + (org-taskjuggler-get-id project info) + (org-taskjuggler-get-name project) + ;; Version is obtained through :TASKJUGGLER_VERSION: + ;; property or `org-taskjuggler-default-project-version'. + (or (org-element-property :VERSION project) + org-taskjuggler-default-project-version) + (or (org-taskjuggler-get-start project) + (format-time-string "%Y-%m-%d")) + (let ((end (org-taskjuggler-get-end project))) + (or (and end (format "- %s" end)) + (format "+%sd" + org-taskjuggler-default-project-duration)))) + ;; Add attributes. + (org-taskjuggler--indent-string + (org-taskjuggler--build-attributes + project org-taskjuggler-valid-project-attributes)) + ;; Closing project. + "}\n")) (defun org-taskjuggler--build-resource (resource info) "Return a resource declaration.