#!/usr/bin/python
#
+# Generate an HTML page with the result of one or more notmuch
+# searches, (with links to gmane views of each email if available).
+#
# Copyright (c) 2011-2012 David Bremner <david@tethera.net>
#
# dependencies
_ENCODING = 'UTF-8'
_PAGES = {}
+DEFAULT_CONFIG='''
+{{
+ "meta": {{
+ "title": "Page title",
+ "blurb": "Page description"
+ }},
+
+ "views": [
+ {{
+ "title": "View title",
+ "comment": "View description",
+ "query": [ "{query}" ]
+ }}
+ ]
+}}'''
+
if not hasattr(collections, 'OrderedDict'): # Python 2.6 or earlier
class _OrderedDict (dict):
collections.OrderedDict = _OrderedDict
-def read_config(path=None, encoding=None):
+def read_config(path, encoding=None):
"Read config from json file"
if not encoding:
encoding = _ENCODING
- if path:
- fp = open(path)
- else:
- nmbhome = os.getenv('NMBGIT', os.path.expanduser('~/.nmbug'))
-
- # read only the first line from the pipe
- sha1_bytes = subprocess.Popen(
- ['git', '--git-dir', nmbhome, 'show-ref', '-s', 'config'],
- stdout=subprocess.PIPE).stdout.readline()
- sha1 = sha1_bytes.decode(encoding).rstrip()
-
- fp_byte_stream = subprocess.Popen(
- ['git', '--git-dir', nmbhome, 'cat-file', 'blob',
- sha1+':status-config.json'],
- stdout=subprocess.PIPE).stdout
- fp = codecs.getreader(encoding=encoding)(stream=fp_byte_stream)
-
+ fp = open(path)
return json.load(fp)
stream.write(view['comment'])
stream.write('\n')
for line in [
- 'The view is generated from the following query:',
+ '<p>This view is generated from the following query:',
'</p>',
'<p>',
' <code>',
- view['query-string'],
+ 'notmuch search ' + view['query-string'],
' </code>',
'</p>',
]:
parser = argparse.ArgumentParser()
parser.add_argument('--text', help='output plain text format',
action='store_true')
-parser.add_argument('--config', help='load config from given file',
- metavar='PATH')
+group = parser.add_mutually_exclusive_group()
+group.add_argument('--config', help='path to configuration file',
+ metavar='PATH')
+group.add_argument('--query', help='path to configuration file',
+ metavar='PATH')
parser.add_argument('--list-views', help='list views',
action='store_true')
-parser.add_argument('--get-query', help='get query for view',
- metavar='VIEW')
args = parser.parse_args()
-config = read_config(path=args.config)
+if (args.config):
+ config = read_config(path=args.config)
+elif (args.query):
+ config = json.loads(DEFAULT_CONFIG.format(query=args.query))
+else:
+ print ('''To use notmuch-to-html, you need to provide a notmuch query. Try:
+
+ notmuch-to-html --query=tag:inbox
+
+Or 'notmuch-to-html --help' for additional options.''')
+ exit (0)
_PAGES['text'] = Page()
_PAGES['html'] = HtmlPage(
</head>
<body>
<h2>{title}</h2>
-<p>
-Generated: {date}<br />
{blurb}
</p>
<h3>Views</h3>
-'''.format(date=datetime.datetime.utcnow().date(),
- title=config['meta']['title'],
+'''.format(title=config['meta']['title'],
blurb=config['meta']['blurb'],
encoding=_ENCODING,
inter_message_padding='0.25em',
border_radius='0.5em'),
- footer='</body>\n</html>\n',
+ footer='<hr><p>Generated: {date}</body>\n</html>\n'.format(date=datetime.datetime.utcnow().date())
)
if args.list_views:
for view in config['views']:
print(view['title'])
sys.exit(0)
-elif args.get_query != None:
- for view in config['views']:
- if args.get_query == view['title']:
- print(' and '.join(view['query']))
- sys.exit(0)
else:
# only import notmuch if needed
import notmuch
db = notmuch.Database(mode=notmuch.Database.MODE.READ_ONLY)
page.write(database=db, views=config['views'])
+
+if (args.query):
+ print ('''To customize the output use 'notmuch-to-html --config=CONFIG_FILE' after
+placing the following content into CONFIG_FILE:
+
+''', file=sys.stderr)
+ print (json.dumps(config, indent=4, separators=(',',':')), file=sys.stderr)