blog 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #!/usr/bin/env python
  2. # Make archive posts easier
  3. import argparse
  4. import os
  5. import re
  6. from datetime import datetime
  7. BASE_PATH = os.path.join(
  8. os.environ['HOME'], '.dotfiles', 'src', 'blog')
  9. CONTENT = '''[[!if test="enabled(calendar)" then="""
  10. To see posts by date, check out the [[archives]]
  11. """]]
  12. [[!inline pages="page({page_spec}) and !*Discussion"
  13. archive=yes limit=10 quick=yes trail=no]]
  14. '''
  15. FRONTMATTER = '''[[!meta date="{date}"]]
  16. [[!meta author="Tyler Cipriani"]]
  17. [[!meta copyright="""
  18. Copyright © {year} Tyler Cipriani
  19. """]]
  20. [[!meta title="{title}"]]
  21. [[!tag computing]]
  22. '''
  23. def make_path(args):
  24. year, month, day = args['year'], args['month'], args['day']
  25. times = {
  26. 'year': {
  27. 'dir': os.path.join(BASE_PATH, 'blog', year),
  28. 'pagespec': './{}/*/*/*',
  29. },
  30. 'month': {
  31. 'dir': os.path.join(BASE_PATH, 'blog', year, month),
  32. 'pagespec': './{}/*/*',
  33. },
  34. 'day': {
  35. 'dir': os.path.join(BASE_PATH, 'blog', year, month, day),
  36. 'pagespec': './{}/*',
  37. },
  38. }
  39. for pagetime in times.keys():
  40. data = times[pagetime]
  41. if not os.path.exists(data['dir']):
  42. os.makedirs(data['dir'])
  43. datadir = os.path.dirname(data['dir'])
  44. database = os.path.basename(data['dir'])
  45. datapage = os.path.join(datadir, '{}.mdwn'.format(database))
  46. if os.path.exists(datapage):
  47. continue
  48. with open(datapage, 'w') as f:
  49. f.write(CONTENT.format(
  50. page_spec=data['pagespec'].format(args[pagetime])))
  51. def make_safe_title(title):
  52. dashed_title = '-'.join([re.sub(r'[^-\w]', '-', x.lower()) for x in title])
  53. return '{}.mdwn'.format(dashed_title)
  54. def make_post_path(year, month, day, title, is_brewing=False):
  55. safe_title = make_safe_title(title)
  56. if is_brewing:
  57. post_path = os.path.join(BASE_PATH, 'brewing')
  58. else:
  59. post_path = os.path.join(BASE_PATH, 'blog', year, month, day)
  60. post_path = os.path.join(post_path, safe_title)
  61. if os.path.exists(post_path):
  62. raise Exception('Post path exists: %s', post_path)
  63. return post_path
  64. def make_post(args):
  65. year, month, day, post_date = (
  66. args['year'], args['month'], args['day'], args['datetime']
  67. )
  68. title = ' '.join(args['title'])
  69. post_path = make_post_path(
  70. year, month, day, args['title'], args['brewing'])
  71. with open(post_path, 'w') as f:
  72. f.write(FRONTMATTER.format(year=year, date=post_date, title=title))
  73. print post_path
  74. def parse_args():
  75. ap = argparse.ArgumentParser()
  76. ap.add_argument('-y', '--year', help='year of post')
  77. ap.add_argument('-m', '--month', help='2 digit month')
  78. ap.add_argument('-d', '--day', help='2 digit day')
  79. ap.add_argument('--brewing', action='store_true', help='Is a brewing blog')
  80. ap.add_argument('title', nargs='*', help='Post title')
  81. args = vars(ap.parse_args())
  82. now = datetime.utcnow()
  83. if not (args.get('year') and args.get('month') and args.get('day')):
  84. args['datetime'] = datetime.isoformat(now)
  85. if not args.get('year'):
  86. args['year'] = now.strftime('%Y')
  87. if not args.get('month'):
  88. args['month'] = now.strftime('%m')
  89. if not args.get('day'):
  90. args['day'] = now.strftime('%d')
  91. if not args.get('datetime'):
  92. args['datetime'] = datetime.isoformat(
  93. datetime(
  94. int(args['year']),
  95. int(args['month']),
  96. int(args['day'])
  97. )
  98. )
  99. return args
  100. def main():
  101. args = parse_args()
  102. if not args['brewing']:
  103. make_path(args)
  104. make_post(args)
  105. if __name__ == '__main__':
  106. main()