emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* calfw-org, view single org file; very ugly hack
@ 2014-04-20  1:04 Brady Trainor
  2014-04-20  6:33 ` Bastien
  0 siblings, 1 reply; 3+ messages in thread
From: Brady Trainor @ 2014-04-20  1:04 UTC (permalink / raw)
  To: emacs-orgmode

[-- Attachment #1: Type: text/plain, Size: 6511 bytes --]


I'm basically showing this horrible hack for any that might like how I 
setup a cloud calendar, and as a catalyst for the topic "will calfw for 
org find improvement?".

(Meta: also, a test to see if pics can be included on gmane, the 
graphviz source is at bottom. What's the best way to use graphics in 
discussion? Links?)

---

So I think I'm gravitating to the org-caldav package, with an easy to 
acquire owncloud calendar.

This will allow me to work on my use of orgmode sheltered from outside 
awkward apps in a convenient and effective way. For now I will probably 
just cut and paste between the org files I'm really working in, and the 
org-caldav result pulled in from a cloud calendar.

So I think of the owncloudcalendar.org file as being sandboxed from all 
my org-agenda-files that I'm really working in.

Further, I have a feeling having the calfw calendar framework view would 
be really nice to have as an option. Unfortunately, It doesn't seem to 
interact very natively with Org-modes multitudinous options and filters.

I wanted to be able to include calfw "sources" optionally from agenda 
files versus the owncloudcalendar.org file.

So I searched for what seems to be a linear string of functions between 
`cfw:org-create-source' and `org-agenda-files', and made these horrible 
modifications which do the trick for me.

Was there a better way (outside of joining development of calfw-org)?

my road map:

org-agenda-files (var) -> org-agenda-files (func) -> 
cfw:org-collect-schedules-period -> cfw:org-schedule-period-to-calendar 
-> cfw:org-create-source-> cfw:open-org-calendar

(Word search on sandbox and brady will reveal where I made edits below. 
For example, `cfw:org-collect-schedules-period' |--> 
`cfw:brady-org-collect-schedules-period'.)

  ____________
/

#+BEGIN_SRC emacs-lisp
(setq sandboxed-org-caldav-file '("/e/org/owndrivecalendar.org"))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun sandboxed-org-caldav-file (&optional unrestricted archives)
   "Get the list of agenda files.
Optional UNRESTRICTED means return the full list even if a restriction
is currently in place.
When ARCHIVES is t, include all archive files that are really being
used by the agenda files.  If ARCHIVE is `ifmode', do this only if
`org-agenda-archives-mode' is t."
   (let ((files
	 (cond
	  ((and (not unrestricted) (get 'sandboxed-org-caldav-file 'org-restrict)))
	  ((stringp sandboxed-org-caldav-file) (org-read-agenda-file-list))
	  ((listp sandboxed-org-caldav-file) sandboxed-org-caldav-file)
	  (t (error "Invalid value of `sandboxed-org-caldav-file'")))))
     (setq files (apply 'append
		       (mapcar (lambda (f)
				 (if (file-directory-p f)
				     (directory-files
				      f t org-agenda-file-regexp)
				   (list f)))
			       files)))
     (when org-agenda-skip-unavailable-files
       (setq files (delq nil
			(mapcar (function
				 (lambda (file)
				   (and (file-readable-p file) file)))
				files))))
     (when (or (eq archives t)
	      (and (eq archives 'ifmode) (eq org-agenda-archives-mode t)))
       (setq files (org-add-archive-files files)))
     files))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun cfw:brady-org-collect-schedules-period (begin end)
   "[internal] Return org schedule items between BEGIN and END."
   (let ((org-agenda-prefix-format " ")
         (span 'day))
     (setq org-agenda-buffer
       (when (buffer-live-p org-agenda-buffer)
         org-agenda-buffer))
     (org-compile-prefix-format nil)
     (loop for date in (cfw:enumerate-days begin end) append
           (loop for file in (or cfw:org-icalendars 
(sandboxed-org-caldav-file nil 'ifmode))
                 append
                 (progn
                   (org-check-agenda-file file)
                   (apply 'org-agenda-get-day-entries
                          file date
                          cfw:org-agenda-schedule-args))))))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun cfw:brady-org-schedule-period-to-calendar (begin end)
   "[internal] Return calfw calendar items between BEGIN and END
from the org schedule data."
   (loop
    with cfw:org-todo-keywords-regexp = (regexp-opt 
org-todo-keywords-for-agenda) ; dynamic bind
    with contents = nil with periods = nil
    for i in (cfw:brady-org-collect-schedules-period begin end)
    for date = (cfw:org-tp i 'date)
    for line = (funcall cfw:org-schedule-summary-transformer i)
    for range = (cfw:org-get-timerange line)
    if range do
    (unless (member range periods)
      (push range periods))
    else do
    (setq contents (cfw:contents-add
                    (cfw:org-normalize-date date)
                    line contents))
    finally return (nconc contents (list (cons 'periods periods)))))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun cfw:brady-org-create-source (&optional color)
   "Create org-agenda source."
   (make-cfw:source
    :name "org-agenda"
    :color (or color "Seagreen4")
    :data 'cfw:brady-org-schedule-period-to-calendar))
#+END_SRC
#+BEGIN_SRC emacs-lisp
(defun cfw:brady-open-org-calendar ()
   "Open an org schedule calendar in the new buffer."
   (interactive)
   (let* ((source1 (cfw:brady-org-create-source))
          (cp (cfw:create-calendar-component-buffer
               :view 'month
               :contents-sources (list source1)
               :custom-map cfw:org-schedule-map
               :sorter 'cfw:org-schedule-sorter)))
     (switch-to-buffer (cfw:cp-get-buffer cp))))
#+END_SRC

\____________
/

(defun my-calfw-both ()
   (interactive)
   (cfw:open-calendar-buffer
    :contents-sources
    (list (cfw:brady-org-create-source "Green")
          (cfw:org-create-source "Blue")
          )))

\____________
/

#+BEGIN_SRC dot :file ./gv/caldiagram.png :cache yes :cmdline -Tpng
digraph {
         { rank = same
                 orgmode
                 diary
         }
         gcal -> ics [ dir = "both" label = "GCALDaemon (sync)" ]
         owncloud -> ics2 [ dir = "both" ]
         ics2 -> orgmode [ dir = "both" label = "org-caldav" ]
         ics2 [ label = "ics" ]
         ics -> diary [ dir = "both"
                       // label = "icalendar.el (manual)"
                       ]
         diary -> agendaview
         orgmode -> ics [ constraint = false
                         // label = 
"org-export-icalendar-combine-agenda-files"
                         ]
         orgmode -> agendaview
         diary -> calendar
         diary -> calfw
         ics -> calfw
         orgmode -> calfw
}
#+END_SRC

\____________



Brady


















[-- Attachment #2: caldiagram.png --]
[-- Type: image/png, Size: 43677 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-04-21  7:05 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-04-20  1:04 calfw-org, view single org file; very ugly hack Brady Trainor
2014-04-20  6:33 ` Bastien
2014-04-21  7:04   ` Brady Trainor

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).