main.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import argparse
  4. import xml.etree.ElementTree
  5. import time
  6. import datetime
  7. import dateutil
  8. import dateutil.parser
  9. import jinja2
  10. from bs4 import BeautifulSoup
  11. from logzero import logger
  12. def clean_title(title):
  13. return (
  14. title.replace("'", "")
  15. .replace('"', "")
  16. .replace("?", "")
  17. .replace("’", "")
  18. .replace("/", "")
  19. .replace(",", "")
  20. .replace(".", "")
  21. .replace(" ", "_")
  22. )
  23. def clean_content(content):
  24. soup = BeautifulSoup(content, features="html.parser")
  25. return soup.get_text().replace("\n", "\n\n")
  26. def created_format(tm):
  27. utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
  28. utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
  29. return (
  30. tm.replace(microsecond=0)
  31. .replace(tzinfo=datetime.timezone(offset=utc_offset))
  32. .isoformat()
  33. )
  34. def main():
  35. parser = argparse.ArgumentParser()
  36. parser.add_argument("enex_file", help="path to enex file")
  37. parser.add_argument("-z", "--zim", help="path to Zim Notebook")
  38. args = parser.parse_args()
  39. logger.info("Importing %s into %s", args.enex_file, args.zim)
  40. notes = []
  41. enex = xml.etree.ElementTree.parse(args.enex_file).getroot()
  42. for note in enex.findall("note"):
  43. title = note.find("title").text
  44. content = note.find("content").text
  45. created = dateutil.parser.parse(note.find("created").text)
  46. tags = []
  47. for tag in note.findall("tag"):
  48. tags.append(tag.text)
  49. logger.info("Found %s (%s)", title, created)
  50. notes.append((title, created, tags, content))
  51. if not notes:
  52. logger.info("Nothing found, bye")
  53. return
  54. logger.info("Loading jinja2...")
  55. jinja2_env = jinja2.Environment(
  56. loader=jinja2.FileSystemLoader(
  57. os.path.join(os.path.dirname(__file__), "templates")
  58. )
  59. )
  60. zim_template = jinja2_env.get_template("zim.template")
  61. if not os.path.exists("%s.txt" % args.zim):
  62. logger.info("Creating root note %s.txt", args.zim)
  63. root_note = zim_template.render(
  64. title=os.path.basename(args.zim),
  65. created=created_format(datetime.datetime.now()),
  66. content="Imported from Evernote.",
  67. )
  68. with open("%s.txt" % args.zim, "w") as note_file:
  69. note_file.write(root_note)
  70. if not os.path.isdir(args.zim):
  71. logger.info("Creating root directory %s", args.zim)
  72. os.makedirs(args.zim)
  73. for title, created, tags, content in notes:
  74. logger.info("Creating %s...", title)
  75. zim_note = zim_template.render(
  76. title=title,
  77. created=created_format(created),
  78. content=clean_content(content),
  79. tags=", ".join(tags),
  80. )
  81. with open("%s/%s.txt" % (args.zim, clean_title(title)), "w") as note_file:
  82. note_file.write(zim_note)