Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for footnotes #48

Merged
merged 22 commits into from
Aug 11, 2022
Merged
Changes from 1 commit
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
c7f9a9c
Add plugin for supporting footnotes
bimbashrestha Aug 10, 2022
3e38994
Use n2y.plugins.footnotes as key instead of footntoes
bimbashrestha Aug 10, 2022
c32fe32
Raise UseNextClass when not footnote in paragraph
bimbashrestha Aug 10, 2022
6ecf742
Raise UseNextClass when not footnote in richtext
bimbashrestha Aug 10, 2022
dd14a26
Pre-fetch page blocks to ensure constructor called before to_pandoc
bimbashrestha Aug 10, 2022
b24863b
Add warning when footnote id is overloaded
bimbashrestha Aug 10, 2022
55b9eca
Add warning when footnote is missing
bimbashrestha Aug 10, 2022
4887705
Merge branch 'main' into footnotes-no-second-pass
bimbashrestha Aug 11, 2022
49c5482
Add block reference to plugin
bimbashrestha Aug 11, 2022
920a55d
Add plugin_data dict to Page class
bimbashrestha Aug 11, 2022
67d9bdf
Use page plugin_data instead of client plugin_data
bimbashrestha Aug 11, 2022
5ddecab
Revert pre-fetching of blocks inside pages
bimbashrestha Aug 11, 2022
55fac4c
Always return None because UseNextClass handles non-footnotes
bimbashrestha Aug 11, 2022
009b8b5
Clarify footnote stripping logic
bimbashrestha Aug 11, 2022
dc74d6b
Add warning for empty footnote
bimbashrestha Aug 11, 2022
1b4cf99
Prserve prefix and suffix of footnote containing token
bimbashrestha Aug 11, 2022
1b63360
Add footnotes test to end-to-end tests
bimbashrestha Aug 11, 2022
502574e
Add notion url to warning for missing footnote
bimbashrestha Aug 11, 2022
38b7832
Add notion url to warning for empty footnote
bimbashrestha Aug 11, 2022
c67e610
Warning re-word
bimbashrestha Aug 11, 2022
77430ee
Add documentation about n2y.plugins.footnotes
bimbashrestha Aug 11, 2022
5a804ec
Fix _footnote_empty() and rename
bimbashrestha Aug 11, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions n2y/plugins/footnotes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import re

from pandoc.types import Note, Str, Para

from n2y.rich_text import TextRichText
from n2y.blocks import ParagraphBlock


class ParagraphWithFootnoteBlock(ParagraphBlock):
def __init__(self, client, notion_data, page, get_children=True):
super().__init__(client, notion_data, page, get_children)
self._attach_footnote_data_if_exists()
bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved

def to_pandoc(self):
bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved
return None if self._is_footnote() else super().to_pandoc()

def _attach_footnote_data_if_exists(self):
if self._is_footnote():
if "footnotes" not in self.client.plugin_data:
self.client.plugin_data["footnotes"] = {}
bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved
self.client.plugin_data["footnotes"][self._footnote()] = self._footnote_ast()
bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved

def _is_footnote(self):
return self._footnote() is not None

def _footnote(self):
first_str = self.rich_text.to_plain_text().split(" ")[0]
footnotes = re.findall(r"\[(\d+)\]:", first_str)
if len(footnotes) != 1:
return None
return footnotes[0]

def _footnote_ast(self):
ast = super().to_pandoc()
return Para(ast[0][2:]) if not isinstance(ast, list) else [Para(ast[0][0][2:])] + ast[1:]
bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved


class TextRichTextWithFootnoteRef(TextRichText):
def to_pandoc(self):
bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved
pandoc_ast = []
for token in super().to_pandoc():
if not isinstance(token, Str):
pandoc_ast.append(token)
continue
refs = re.findall(r"\[\^(\d+)\]", token[0])
if len(refs) != 1:
pandoc_ast.append(token)
continue
block = self.client.plugin_data["footnotes"][refs[0]]
bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved
bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved
footnote = Note(block) if isinstance(block, list) else Note([block])
pandoc_ast.append(footnote)
return pandoc_ast

bimbashrestha marked this conversation as resolved.
Show resolved Hide resolved

notion_classes = {
"blocks": {"paragraph": ParagraphWithFootnoteBlock},
"rich_texts": {"text": TextRichTextWithFootnoteRef},
}