def generate_feed(): print "Generate feed" fn = os.path.join(consts.OUTDIR, 'feed.xml') fp = open(fn, 'w') ie = entry.empty_entry() ie['title'] = 'Feed' ie['blurb'] = 'Feed for %s'%consts.TITLE fp.write(template.run_template_loop('feed.xml', ie, entry.get_entries(), consts.NUM_INDEX_ENTRIES)) fp.close()
def generate_archive(): print "Generate archive" fn = os.path.join(consts.OUTDIR, 'archive.html') fp = open(fn, 'w') ie = entry.empty_entry() ie['title'] = consts.ARCHIVE_TITLE ie['blurb'] = '' fp.write(template.run_template_entry('htmlHead.html', ie)) fp.write(template.run_template_loop('archive.html', ie, entry.get_entries())) fp.write(template.run_template_entry('htmlFoot.html', ie)) fp.close()
def pinboard(auth_token): """Export saved entries into Pinboard""" existing_links = requests.get('https://api.pinboard.in/v1/posts/all', params={ 'auth_token': auth_token, 'format': 'json', }).json() existing_links = set(link['href'] for link in existing_links) entries = get_entries() unsynced_entries = [e for e in entries if urlify(e) not in existing_links] print(f"{len(unsynced_entries)} entries to sync...") def show_item(entry): if entry == None: return "" return (entry.title or urlify(entry))[:50] with click.progressbar(unsynced_entries, item_show_func=show_item, label='Exporting to Pinboard...') as bar: for entry in bar: url = urlify(entry) title = entry.title or url time.sleep(3) res = requests.get('https://api.pinboard.in/v1/posts/add', params={ 'auth_token': auth_token, 'url': url, 'description': title, 'extended': entry.summary, 'toread': 'no' if entry.read else 'yes', 'replace': 'no', 'dt': entry.time_added.isoformat(), 'tags': [slugify(tag) for tag in entry.tags], 'format': 'json', }) result_code = res.json()['result_code'] if result_code != 'done' and result_code != 'item already exists': click.echo( f"Failed to add {title} with result code '{result_code}'.", err=True)
def generate_tags(): print "Generate tags" for tag,eids in gTags.iteritems(): srcentries = entry.get_entries() entries = {} for eid in eids: entries[eid] = srcentries[eid] fn = os.path.join(consts.OUTDIR, 'tag', tag + '.html') fp = open(fn, 'w') ie = entry.empty_entry() ie['title'] = 'Posts tagged "%s"'%tag ie['blurb'] = 'Posts tagged "%s"'%tag fp.write(template.run_template_entry('htmlHead.html', ie)) fp.write(template.run_template_loop('tag.html', ie, entries)) fp.write(template.run_template_entry('htmlFoot.html', ie)) fp.close()
def generate_archive_entry(): aeid = consts.ARCHIVEID print "Generate archive as entry %d"%aeid oute = entry.empty_entry() oute['id'] = aeid oute['title'] = consts.ARCHIVE_TITLE oute['slug'] = 'archive' oute['date'] = s2d('2013-09-25 12:00:00') oute['blurb'] = 'A list of all %s posts.'%consts.TITLE oute['url'] = '' + oute['slug'] + '.html' oute['body'] = '<ul class="archive">\n' entries = entry.get_entries() for k in entry.sorted_entry_keys(entries): oute['body'] += '<li><a href="%s">%s</a></li>\n'%(entries[k]['title']) oute['body'] += '</ul>\n' entries[oute['id']] = oute
def clean_output(): todel = [] for fn in glob.glob(os.path.join(consts.OUTDIR, '*.html')): fslug = re.sub('\.html.*$', '', re.sub('^.*\/', '', fn)) if fslug == 'archive' or fslug == 'index': continue hit = False for id,e in entry.get_entries().iteritems(): if fslug == e['slug']: hit = True break if not hit: todel.append(fn) for fn in todel: print 'Deleting stray file %s'%fn os.remove(fn)
def generate_entries(): out = 0 for id,e in entry.get_entries().iteritems(): fn = os.path.join(consts.OUTDIR, e['slug'] + '.html') doit=True if os.path.exists(fn): ts = os.path.getmtime(fn) if ts > e['editTimestamp']: doit=False if doit or consts.FORCE: print "Generate entry %s"%id fp = open(fn, 'w') fp.write(template.run_template_entry('htmlHead.html', e)) s = template.run_template_entry('entry.html', e) fp.write(s.encode('ascii', 'xmlcharrefreplace')) fp.write(template.run_template_entry('htmlFoot.html', e)) fp.close() out += 1 return out
def generate_index(): print "Generate index" entries = entry.get_entries() fn = os.path.join(consts.OUTDIR, 'index.html') fp = open(fn, 'w') ie = entry.empty_entry() ie['title'] = consts.INDEX_TITLE ie['blurb'] = consts.BLURB fp.write(template.run_template_entry('htmlHead.html', ie)) fp.write(template.run_template_loop('index.html', ie, entries, consts.NUM_INDEX_ENTRIES)) fp.write(template.run_template_entry('htmlFoot.html', ie)) fp.close() # write a faked entry back to the input dir(!) fn = os.path.join(consts.INDIR, '%d.md'%consts.ARCHIVEID) fp = open(fn, 'w') fp.write(entry.ENTRY_HEADER%(ie['title'], 'index', d2s_dt(consts.NOW), ie['blurb'], ie['tags'])) ekeys = entry.sorted_entry_keys(entries) for k in ekeys[:consts.NUM_INDEX_ENTRIES]: e = entries[k] url = '%s/%s.html'%(consts.BASEURL, e['slug']) fp.write('<a href="%s">%s</a>\n\n'%(url, e['title'])) fp.close()