# Copyright 2010-2015 Lars Wirzenius # # This program 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 3 of the License, or # (at your option) any later version. # # This program 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. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import cliapp import os import shutil import string import time import jtlib class FinishCommand(cliapp.Plugin): def enable(self): self.app.add_subcommand('finish', self.run, arg_synopsis='[DRAFT-ID]') def run(self, args): '''Publish a draft journal entry.''' drafts_dir = jtlib.DraftsDirectory(self.app.drafts_dir()) draft_id, draft_mdwn = self.app.choose_draft(drafts_dir, args) draft_attch = drafts_dir.get_draft_attachments_dirname(draft_id) title = drafts_dir.get_draft_title(draft_id) if not title: raise Exception("%s has no title" % draft_mdwn) pub_attch = self.app.layout.get_filename(title) pub_mdwn = self.app.layout.get_filename(title) + '.mdwn' if os.path.exists(pub_mdwn): raise cliapp.AppException('%s already exists' % pub_mdwn) self._publish_draft(draft_mdwn, draft_attch, pub_mdwn, pub_attch) if self.app.settings['git']: if os.path.exists(pub_attch): self._commit_to_git([pub_mdwn, pub_attch]) else: self._commit_to_git([pub_mdwn]) if self.app.settings['push']: self._push_git() def _published_dir(self): subdirs = { 'ct': '%d' % self.app.now_tuple.tm_year, 'pkb': time.strftime('%Y/%m/%d', self.app.now_tuple), } subdir = subdirs[self.app.settings['layout']] return os.path.join( self.app.settings['source'], self.app.settings['notes-dir'], subdir) def _published_basename(self, title, draft_mdwn): layout = self.app.settings['layout'] basenames = { 'ct': time.strftime('%Y-%m-%d-%H:%M:%S', self.app.now_tuple), 'pkb': self._summarise_title(title), } return basenames[layout] def _summarise_title(self, title): basename = '' acceptable = set(string.ascii_letters + string.digits + '-_') for c in title.lower(): if c in acceptable: basename += c elif not basename.endswith('_'): basename += '_' return basename.rstrip('_') or 'untitled' def _publish_draft(self, draft_mdwn, draft_attch, pub_mdwn, pub_attch): parent_dir = os.path.dirname(pub_mdwn) if not os.path.exists(parent_dir): os.makedirs(parent_dir) os.rename(draft_mdwn, pub_mdwn) if os.path.exists(draft_attch): os.rename(draft_attch, pub_attch) def _commit_to_git(self, pathnames): jtlib.commit_to_git(self.app.settings['source'], pathnames) def _push_git(self): jtlib.pull_rebase_git(self.app.settings['source']) jtlib.push_git(self.app.settings['source'])