main.py 2.7 KB

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