forked from danieldiast/anki_addons
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Symbols.py
142 lines (120 loc) · 5.03 KB
/
Symbols.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
from anki.hooks import wrap
from aqt.editor import Editor, EditorWebView
from aqt.qt import *
from aqt.utils import shortcut, showInfo, showWarning, getBase, getFile, \
openHelp, tooltip, downArrow
from BeautifulSoup import BeautifulSoup
# This is the favourites list - Add desired symbols' decimal values here
faves = [8592, 8593, 8594, 8595]
def onAddAnkiSymbol(self, entity_number):
my_entity = "&#" + str(entity_number) + ";"
#self.note.fields[self.currentField] += unicode(BeautifulSoup(my_entity))
text = self.web.page().mainFrame().evaluateJavaScript("""
function retTxt(){return currentField.innerText};
retTxt();
""")
pos = len(text.replace("\n", "").split("|-|Symbol|-|")[0])
pos += 1
self.web.eval("""
currentField.innerHTML = currentField.innerHTML.replace("|-|Symbol|-|", '"""+my_entity+"""')
saveField("key");
""")
self.loadNote()
self.web.setFocus()
self.web.eval("focusField(%d);" % self.currentField)
self.web.page().mainFrame().evaluateJavaScript(js_move_cursor % pos)
def onAddAnkiSymbol_factory(self, entity_number):
return lambda s=self: onAddAnkiSymbol(self, entity_number)
def onAnkiSymbols(self):
self.web.page().mainFrame().evaluateJavaScript("""
// use placeholder to mark current cursor position
document.execCommand("insertText", false, "|-|Symbol|-|");
""")
# self.web.eval("focusField(%d);" % self.currentField)
# Creating menus
main = QMenu(self.mw)
favourites = QMenu("Favourites", self.mw)
greek = QMenu("Greek letters", self.mw)
arrows = QMenu("Arrows", self.mw)
# Adding submenus to main menu
main.addMenu(favourites)
main.addMenu(greek)
main.addMenu(arrows)
# Adding symbols to sub menus
# Greek Letters 913 - 974
for greek_letter in range(913, 975):
a = greek.addAction(unichr(greek_letter))
a.connect(a, SIGNAL("triggered()"), onAddAnkiSymbol_factory(self, greek_letter))
# Arrows 8592 - 8703
for arrow in range(8592, 8704):
a = arrows.addAction(unichr(arrow))
#a.setShortcut(QKeySequence("Ctrl+A"))
a.connect(a, SIGNAL("triggered()"), onAddAnkiSymbol_factory(self, arrow))
# Add favourites to menu
for f in faves:
a = favourites.addAction(unichr(f))
a.connect(a, SIGNAL("triggered()"), onAddAnkiSymbol_factory(self, f))
main.exec_(QCursor.pos())
def mySetupButtons(self):
but = self._addButton("symbolButton", lambda s=self: onAnkiSymbols(self),
text=unichr(945) + unichr(946) + unichr(947) + downArrow(), size=False)
but.setShortcut(QKeySequence("Ctrl+S"))
Editor.setupButtons = wrap(Editor.setupButtons, mySetupButtons)
js_move_cursor = """
function findHiddenCharacters(node, beforeCaretIndex) {
var hiddenCharacters = 0
var lastCharWasWhiteSpace=true
for(var n=0; n-hiddenCharacters<beforeCaretIndex &&n<node.length; n++) {
if([' ','\\n','\\t','\\r'].indexOf(node.textContent[n]) !== -1) {
if(lastCharWasWhiteSpace)
hiddenCharacters++
else
lastCharWasWhiteSpace = true
} else {
lastCharWasWhiteSpace = false
}
}
return hiddenCharacters
}
var setSelectionByCharacterOffsets = null;
if (window.getSelection && document.createRange) {
setSelectionByCharacterOffsets = function(containerEl, position) {
var charIndex = 0, range = document.createRange();
range.setStart(containerEl, 0);
range.collapse(true);
var nodeStack = [containerEl], node, foundStart = false, stop = false;
while (!stop && (node = nodeStack.pop())) {
if (node.nodeType == 3) {
var hiddenCharacters = findHiddenCharacters(node, node.length)
var nextCharIndex = charIndex + node.length - hiddenCharacters;
if (position >= charIndex && position <= nextCharIndex) {
var nodeIndex = position - charIndex
var hiddenCharactersBeforeStart = findHiddenCharacters(node, nodeIndex)
range.setStart(node, nodeIndex + hiddenCharactersBeforeStart );
range.setEnd(node, nodeIndex + hiddenCharactersBeforeStart);
stop = true;
}
charIndex = nextCharIndex;
} else {
var i = node.childNodes.length;
while (i--) {
nodeStack.push(node.childNodes[i]);
}
}
}
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
} else if (document.selection) {
setSelectionByCharacterOffsets = function(containerEl, start, end) {
var textRange = document.body.createTextRange();
textRange.moveToElementText(containerEl);
textRange.collapse(true);
textRange.moveEnd("character", end);
textRange.moveStart("character", start);
textRange.select();
};
}
setSelectionByCharacterOffsets(currentField, %s)
"""