emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Updated agenda printer script
@ 2007-06-03 20:44 Jason F. McBrayer
  2007-06-04  7:01 ` Carsten Dominik
  0 siblings, 1 reply; 5+ messages in thread
From: Jason F. McBrayer @ 2007-06-03 20:44 UTC (permalink / raw)
  To: emacs-orgmode

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

And, as promised, here's the updated version of the agenda printer
script.  This version has only bugfixes and compatibility fixes.
There are some more fundamental changes (listed in the TODOs in the
source comments) that need to be made, but I'm waiting on a round tuit
for them.  I hope people find this useful, and that it is more usable
for them than the previous version.

Changes:
  1. Uses os.popen3 rather than the subprocess module; as a result, it
     should work with python versions earlier than 2.4.
  2. Better quoting for characters in headlines that could cause
     problems in the LaTeX output.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Agenda printer script --]
[-- Type: text/x-python, Size: 5127 bytes --]

#!/usr/bin/python
#
# pyagenda -- export an org agenda to PDF
#
# (c) 2007, Jason F. McBrayer
# Version: 1.1
# This file is a stand-alone program.
#
# Legalese:
# pyagenda is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# pyagenda is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# Documentation:
# pyagenda is a short python program for taking a formatted agenda
# from org-mode (via org-batch-agenda-csv) and producing a PDF-format
# planner page that can be inserted in a planner binder.  Run
# 'pyagenda --help' for usage.
#
# Currently, this is only a crude 'worksforme' implementation, with
# many things being hardcoded.  It produces an output file named
# cmdkey.pdf where 'cmdkey' is the key given to
# org-agenda-custom-commands. Not all arbitrary searches will work.
# Be aware that it may overwrite cmdkey.tex, cmdkey.log, cmdkey.aux,
# etc.  The output size is hardcoded to 5.5x8.0in, which is suitable
# for a Circa or Rollabind junior sized planner.  The output is not
# suitable for daily/weekly agenda views, and does not present all the
# information it could.  If you want to change any of the output, edit
# the TEX_* constants.
#
# TODO:
#   1. Use safer tmpfile handling.
#   2. Nicer command-line handling.
#   3. Prettier output, including use of more of the information
#      passed by org-batch-agenda-csv.
#

import csv
import sys
import os
#from subprocess import Popen, PIPE, call
from os import popen3
import re

EMACS = 'emacs'
INIT_FILE = "~/.emacs.d/init.el" # Most people should use "~/.emacs" instead
AGENDA_COMMAND = '(org-batch-agenda-csv "%s")'
REMOVE_INTERMEDIATES = True  # Remove generated latex & tex's log/aux files.

TEX_HEADER = """
\\documentclass[twoside, american]{article}
\\usepackage[T1]{fontenc}
\\usepackage[latin1]{inputenc}
\\usepackage{pslatex}
\\usepackage{geometry}
\\geometry{verbose,paperwidth=5.5in,paperheight=8in,tmargin=0.25in,bmargin=0.25in,lmargin=0.5in,rmargin=0.25in}
\\pagestyle{empty}
\\setlength{\\parskip}{\\medskipamount}
\\setlength{\\parindent}{0pt}
\\usepackage{calc}

\\makeatletter

\\newcommand{\\myline}[1]{
  {#1 \\hrule width \\columnwidth }
}

\\usepackage{babel}
\\makeatother
\\begin{document}

\\part*{\\textsf{Actions}\\hfill{}%%
\\framebox{\\begin{minipage}[t][1em][t]{0.25\\paperwidth}%%
\\textsf{%s} \\hfill{}%%
\\end{minipage}}%%
\\protect \\\\
}

\\myline{\\normalsize}


"""
TEX_FOOTER = """
\\end{document}
"""
TEX_ITEM = """
%%
\\framebox{\\begin{minipage}[c][0.5em][c]{0.5em}%%
\\hfill{}%%
\\end{minipage}}%%
%%
\\begin{minipage}[c][1em]{1em}%%
\\hfill{}%%
\\end{minipage}%%
\\textsf{%s}\\\\
\\myline{\\normalsize}
"""

class AgendaItem(object):
    def __init__(self, data=None):
        if data:
            self.category = data[0]
            self.headline = data[1]
            self.type = data[2]
            self.todo = data[3]
            self.tags = data[4].split(':')
            self.date = data[5]
            self.time = data[6]
            self.extra = data[7]
            self.prio = data[8]
            self.fullprio = data[9]

def get_agenda_items(cmdkey):
    #output = Popen([EMACS, "-batch", "-l", INIT_FILE,
    #                "-eval", AGENDA_COMMAND % cmdkey ],
    #               stdout=PIPE, stderr=PIPE)
    _, output, _ = popen3("'%s' -batch -l '%s' -eval '%s'" %
                          (EMACS, INIT_FILE, AGENDA_COMMAND % cmdkey))
    reader = csv.reader(output)
    items = []
    for row in reader:
        items.append(AgendaItem(row))
    return items

def usage():
    print "Usage: pyagenda 'cmd-key' [label]"
    print "  cmd-key is an org agenda custom command key, or an "
    print "   org-agenda tags/todo match string."
    print "  label (optional) is a context label to be printed "
    print "   at the top of your agenda page."

def main():
    try:
        search = sys.argv[1]
    except IndexError:
        usage()
        sys.exit(1)
    if search == "--help" or search == "-h":
        usage()
        sys.exit(0)
    try:
        label = sys.argv[2]
    except IndexError:
        label = ""
    texfile = file(search + ".tex", 'w')
    texfile.write(TEX_HEADER % label + "\n")
    for item in get_agenda_items(search):
        #texfile.write(TEX_ITEM %
        #              item.headline.replace('&', r'\&') + "\n" )
        texfile.write(TEX_ITEM %
                      re.sub(r'([&_#])', r'\\\1', item.headline))
    texfile.write(TEX_FOOTER)
    texfile.close()
    #call(['pdflatex', texfile.name], stdout=PIPE, stderr=PIPE)
    _, output, _ = popen3("pdflatex '%s'" % texfile.name)
    output.read() # pdflatex needs this in order to complete.
    if REMOVE_INTERMEDIATES:
        os.unlink(texfile.name)
        os.unlink(search + ".aux")
        os.unlink(search + ".log")


if __name__ == '__main__':
    main()

[-- Attachment #3: Type: text/plain, Size: 316 bytes --]



-- 
+-----------------------------------------------------------+
| Jason F. McBrayer                    jmcbray@carcosa.net  |
| If someone conquers a thousand times a thousand others in |
| battle, and someone else conquers himself, the latter one |
| is the greatest of all conquerors.  --- The Dhammapada    |

[-- Attachment #4: Type: text/plain, Size: 149 bytes --]

_______________________________________________
Emacs-orgmode mailing list
Emacs-orgmode@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-orgmode

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

* Re: Updated agenda printer script
  2007-06-03 20:44 Updated agenda printer script Jason F. McBrayer
@ 2007-06-04  7:01 ` Carsten Dominik
  2007-06-04 13:10   ` Jason F. McBrayer
  0 siblings, 1 reply; 5+ messages in thread
From: Carsten Dominik @ 2007-06-04  7:01 UTC (permalink / raw)
  To: Jason F. McBrayer; +Cc: emacs-orgmode

This looks great.

Are you planning to put this up on a website so that I can link
to your site?  Or is it time to start that "contrib" directory
in the org-mode distribution...  ?

- Carsten

On Jun 3, 2007, at 22:44, Jason F. McBrayer wrote:

> And, as promised, here's the updated version of the agenda printer
> script.  This version has only bugfixes and compatibility fixes.
> There are some more fundamental changes (listed in the TODOs in the
> source comments) that need to be made, but I'm waiting on a round tuit
> for them.  I hope people find this useful, and that it is more usable
> for them than the previous version.
>
> Changes:
>   1. Uses os.popen3 rather than the subprocess module; as a result, it
>      should work with python versions earlier than 2.4.
>   2. Better quoting for characters in headlines that could cause
>      problems in the LaTeX output.
>
> <pyagenda>
>
> -- 
> +-----------------------------------------------------------+
> | Jason F. McBrayer                    jmcbray@carcosa.net  |
> | If someone conquers a thousand times a thousand others in |
> | battle, and someone else conquers himself, the latter one |
> | is the greatest of all conquerors.  --- The Dhammapada    |
> _______________________________________________
> Emacs-orgmode mailing list
> Emacs-orgmode@gnu.org
> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>

--
Carsten Dominik
Sterrenkundig Instituut "Anton Pannekoek"
Universiteit van Amsterdam
Kruislaan 403
NL-1098SJ Amsterdam
phone: +31 20 525 7477

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

* Re: Updated agenda printer script
  2007-06-04  7:01 ` Carsten Dominik
@ 2007-06-04 13:10   ` Jason F. McBrayer
  2007-06-04 13:14     ` Leo
  0 siblings, 1 reply; 5+ messages in thread
From: Jason F. McBrayer @ 2007-06-04 13:10 UTC (permalink / raw)
  To: Carsten Dominik; +Cc: emacs-orgmode

Carsten Dominik <dominik@science.uva.nl> writes:

> This looks great.

Thanks!

> Are you planning to put this up on a website so that I can link
> to your site?  Or is it time to start that "contrib" directory
> in the org-mode distribution...  ?

I am going to put it up on my website; I just wanted a little feedback
from people before doing so.  I got some good bug reports for the
first version, which I've fixed, so I guess it's ready to get posted.
I'll post the address once it's there.

-- 
+-----------------------------------------------------------+
| Jason F. McBrayer                    jmcbray@carcosa.net  |
| If someone conquers a thousand times a thousand others in |
| battle, and someone else conquers himself, the latter one |
| is the greatest of all conquerors.  --- The Dhammapada    |

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

* Re: Updated agenda printer script
  2007-06-04 13:10   ` Jason F. McBrayer
@ 2007-06-04 13:14     ` Leo
  2007-06-04 14:09       ` Jason F. McBrayer
  0 siblings, 1 reply; 5+ messages in thread
From: Leo @ 2007-06-04 13:14 UTC (permalink / raw)
  To: emacs-orgmode

----- Jason F. McBrayer (2007-06-04) wrote:-----

>> Are you planning to put this up on a website so that I can link to
>> your site?  Or is it time to start that "contrib" directory in the
>> org-mode distribution...  ?
>
> I am going to put it up on my website; I just wanted a little feedback
> from people before doing so.  I got some good bug reports for the
> first version, which I've fixed, so I guess it's ready to get posted.
> I'll post the address once it's there.

Can that python script be converted to elisp?

-- 
Leo <sdl.web AT gmail.com>                         (GPG Key: 9283AA3F)

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

* Re: Re: Updated agenda printer script
  2007-06-04 13:14     ` Leo
@ 2007-06-04 14:09       ` Jason F. McBrayer
  0 siblings, 0 replies; 5+ messages in thread
From: Jason F. McBrayer @ 2007-06-04 14:09 UTC (permalink / raw)
  To: Leo; +Cc: emacs-orgmode

Leo <sdl.web@gmail.com> writes:

> Can that python script be converted to elisp?

It would be pretty simple to write something similar in elisp -- all
the script does is parse the output of org-batch-agenda-csv and
interpolate selected bits of it into a LaTeX skeleton.  Of course, if
you were doing this in elisp, you wouldn't want to go all the way to
CSV and back; you'd want to basically copy most of
org-batch-agenda-csv to your function and make it write the LaTeX
output instead of the csv.  I guess I could do this once I got a round
tuit, but as I'm more comfortable in python than lisp, I'm not
strongly motivated to do it...

-- 
+-----------------------------------------------------------+
| Jason F. McBrayer                    jmcbray@carcosa.net  |
| If someone conquers a thousand times a thousand others in |
| battle, and someone else conquers himself, the latter one |
| is the greatest of all conquerors.  --- The Dhammapada    |

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

end of thread, other threads:[~2007-06-04 14:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-06-03 20:44 Updated agenda printer script Jason F. McBrayer
2007-06-04  7:01 ` Carsten Dominik
2007-06-04 13:10   ` Jason F. McBrayer
2007-06-04 13:14     ` Leo
2007-06-04 14:09       ` Jason F. McBrayer

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).