+-
+
Many symbols that look similar to letters of the English alphabet (such as
+small caps) can be produced by doubling the capital letter:
+ GG -> ɢ ?? -> ʔ NN -> ɴ BB -> ʙ RR -> ʀ XX -> χ
+ LL -> ʟ II -> ɪ YY -> ʏ UU -> ʊ EE -> ɛ OO -> ɞ
+ AA -> ɑ '' -> ˈ ,, -> ˌ :: -> ː
+
+
+-
+
The slash is used to "reflect," "rotate," or otherwise flip around a given
+symbol:
+ ʀ/ -> ʁ ʔ/ -> ʕ ?/ -> ʕ r/ -> ɹ y/ -> ʎ m/ -> ɯ
+ o/ -> ø e/ -> ə ɛ/ -> ɜ c/ -> ɔ a/ -> ɐ ɑ/ -> ɒ
+ w/ -> ʍ h/ -> ɥ k/ -> ʞ !/ -> ¡ v/ -> ʌ
+
+Also note that for any digraph, if either of the two characters that
+compose it are not "standard" letters you can find on your keyboard, the
+digraph can be done in reverse order—so since ʀ/ produces ʁ, you can press
+/ again to go back to ʀ in case of accidental flippage (it's also weirdly
+amusing to press RR///////).
+This sometimes makes it easier to enter certain pairs; you may prefer to
+use AA
for ɑ
and AA/
for ɒ
instead of the
+visual o|
and |o
.
+
+-
+
Digraphs have also been designed for when a symbol looks like two overlayed
+characters, or two characters next to each other. This includes "hooked"
+letters (such as ŋ), produced with the original letter and a comma, and
+"stroked" letters (such as ɟ), produced with the original letter and a dash:
+ m, -> ɱ n, -> ŋ ŋ, -> ɲ v, -> ⱱ c, -> ç j, -> ʝ
+ x, -> ɣ ɣ, -> χ h, -> ɦ w, -> ɰ
+
+ j- -> ɟ h- -> ħ l- -> ɬ i- -> ɨ u- -> ʉ e- -> ɘ
+ o- -> ɵ ʕ- -> ʢ ?- -> ʡ ʔ- -> ʡ
+
+ LZ -> ɮ OX -> ɤ XO -> ɤ OE -> œ EB -> ɞ AE -> æ
+ CE -> ɶ RL -> ɺ LR -> ɺ ɾl -> ɺ lɾ -> ɺ
+
+ w| -> ɰ o/ -> ø ɜ( -> ɞ /\ -> ʌ o| -> ɑ a| -> ɑ
+ |o -> ɒ |a -> ɒ
+
+ o. -> ʘ |= -> ǂ || -> ‖ /^ -> ↗ /> -> ↗ \v -> ↘
+ \> -> ↘
+
+
+-
+
Others are based on pronunciation:
+ PH -> ɸ BH -> β TH -> θ DH -> ð SH -> ʃ ZH -> ʒ
+ SJ -> ɕ ZJ -> ʑ ʃx -> ɧ xʃ -> ɧ
+
+It may be worth noting at this point that digraphs of two lowercase letters
+were intentionally avoided to prevent interference with regular typing. If
+you need to type a sequence without it turning into a digraph (maybe you
+want to type an actual ʃx
), place a backslash between the two characters
+(so, type ʃ\x
).
+In fact, [backslash][anything] is treated as a digraph that simply resolves
+to the second character.
+
+-
+
A few digraphs are based on shape:
+ rO -> ɾ r0 -> ɾ vO -> ʋ v0 -> ʋ
+
+Another related point: digraphs that contain a lowercase letter can also be
+typed with that letter as uppercase. So, if RO
is easier to type than
+rO
, that works as well.
+
+-
+
Retroflex and nonpulmonic symbols have their own categories:
+ retroflex: ) looks like the shape of the tongue
+ t) -> ʈ d) -> ɖ n) -> ɳ r) -> ɽ ɾ) -> ɽ s) -> ʂ
+ z) -> ʐ ɹ) -> ɻ l) -> ɭ ɗ) -> ᶑ
+
+ clicks: clicking noise reminiscent of a *
+ o* -> ʘ |* -> ǀ !* -> ǃ =* -> ǁ
+
+ implosives and ejective marker: direction of airflow
+ b( -> ɓ d( -> ɗ j( -> ʄ ɟ( -> ʄ g( -> ɠ ɢ( -> ʛ
+ ɖ( -> ᶑ ') -> ʼ
+
+
+-
+
Superscripts and diacritics that go above the letter use ^
, diacritics that
+go below use _
, and miscellaneous "moved" symbols
+use <
or >
:
+ ^h -> ʰ ^n -> ⁿ ^m -> ᵐ ^ŋ -> ᵑ ^l -> ˡ ^w -> ʷ
+ ^j -> ʲ ^ɥ -> ᶣ ^ʋ -> ᶹ ^ɣ -> ˠ ^ʕ -> ˤ
+
+ _| -> ◌̩ ^| -> ◌̍ _o -> ◌̥ ^o -> ◌̊ _v -> ◌̬ ^v -> ◌̌
+
+ _^ -> ◌̯ _: -> ◌̤ _~ -> ◌̰ _[ -> ◌̪ _] -> ◌̺ _{ -> ◌̼
+ _+ -> ◌̟ __ -> ◌̠ _) -> ◌̹ _( -> ◌̜ _# -> ◌̻ [] -> ◌̻
+
+ ^> -> ◌̚ ^: -> ◌̈ ^x -> ◌̽ ^~ -> ◌̃
+
+ -' -> ˔ _˔ -> ◌̝ -, -> ˕ _˕ -> ◌̞ <| -> ⊣ _⊣ -> ◌̘
+ >| -> ⊢ _⊢ -> ◌̙
+
+ ~~ -> ◌̴ >r -> ˞
+
+Note that all of these sequences can be flipped in order—that is, ^h
+produces the same thing as h^
. This allows usage such as |<_
to produce
+⊣_
which becomes ◌̘.
+
+-
+
Tonal countours use numbers plus |
:
+ 5| -> ˥ 4| -> ˦ 3| -> ˧ 2| -> ˨ 1| -> ˩
+ +| -> ꜛ -| -> ꜜ
+
+
+-
+
Finally, some digraphs simply have unique mnemonics:
+ ː- -> ˑ "chop off" the bottom triangle
+ (( -> ◌͡◌ two parens for a tie that connects 2 chars
+ )) -> ◌͜◌
+ ◌͜◌) -> ‿ one more paren to make it a little bit longer
+
+
+
\ No newline at end of file
diff --git a/src/js/StackOverflow/inputCursorManagement.js b/src/js/StackOverflow/inputCursorManagement.js
new file mode 100644
index 0000000..90f69f7
--- /dev/null
+++ b/src/js/StackOverflow/inputCursorManagement.js
@@ -0,0 +1,80 @@
+export function insertAtCursor(myField, myValue) {
+ // http://stackoverflow.com/questions/11076975/insert-text-into-textarea-at-cursor-position-javascript
+ // IE support
+ if (document.selection) {
+ myField.focus();
+ sel = document.selection.createRange();
+ sel.text = myValue;
+ }
+ // MOZILLA and others
+ else if (myField.selectionStart || myField.selectionStart == '0') {
+ const selection = getInputSelection(myField);
+ myField.value = myField.value.substring(0, selection.start)
+ + myValue
+ + myField.value.substring(selection.end, myField.value.length);
+ myField.selectionStart = selection.start + myValue.length;
+ myField.selectionEnd = selection.start + myValue.length;
+ } else {
+ myField.value += myValue;
+ }
+ setSelectionRange(myField, myField.selectionEnd, myField.selectionEnd);
+}
+
+export function getInputSelection(el) {
+ // Retrieved from http://stackoverflow.com/a/4207763
+ var start = 0, end = 0, normalizedValue, range,
+ textInputRange, len, endRange;
+ el.focus();
+ if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
+ start = el.selectionStart;
+ end = el.selectionEnd;
+ } else {
+ range = document.selection.createRange();
+
+ if (range && range.parentElement() == el) {
+ len = el.value.length;
+ normalizedValue = el.value.replace(/\r\n/g, "\n");
+
+ // Create a working TextRange that lives only in the input
+ textInputRange = el.createTextRange();
+ textInputRange.moveToBookmark(range.getBookmark());
+
+ // Check if the start and end of the selection are at the very end
+ // of the input, since moveStart/moveEnd doesn't return what we want
+ // in those cases
+ endRange = el.createTextRange();
+ endRange.collapse(false);
+
+ if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
+ start = end = len;
+ } else {
+ start = -textInputRange.moveStart("character", -len);
+ start += normalizedValue.slice(0, start).split("\n").length - 1;
+
+ if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
+ end = len;
+ } else {
+ end = -textInputRange.moveEnd("character", -len);
+ end += normalizedValue.slice(0, end).split("\n").length - 1;
+ }
+ }
+ }
+ }
+
+ return { start, end };
+}
+
+export function setSelectionRange(input, selectionStart, selectionEnd) {
+ // Retrieved from http://stackoverflow.com/a/17858641/3508346
+ if (input.setSelectionRange) {
+ input.focus();
+ input.setSelectionRange(selectionStart, selectionEnd);
+ }
+ else if (input.createTextRange) {
+ var range = input.createTextRange();
+ range.collapse(true);
+ range.moveEnd('character', selectionEnd);
+ range.moveStart('character', selectionStart);
+ range.select();
+ }
+}
diff --git a/src/js/render.js b/src/js/render.js
index 331d8d2..6e099d1 100644
--- a/src/js/render.js
+++ b/src/js/render.js
@@ -3,7 +3,16 @@ import { removeTags, slugify } from '../helpers';
import { getWordsStats, wordExists } from './utilities';
import { getMatchingSearchWords, highlightSearchTerm, getSearchFilters, getSearchTerm } from './search';
import { showSection } from './displayToggles';
-import { setupSearchFilters, setupWordOptionButtons, setupPagination, setupWordOptionSelections, setupWordEditFormButtons, setupMaximizeModal, setupInfoModal } from './setupListeners';
+import {
+ setupSearchFilters,
+ setupWordOptionButtons,
+ setupPagination,
+ setupWordOptionSelections,
+ setupWordEditFormButtons,
+ setupMaximizeModal,
+ setupInfoModal,
+ setupIPATable
+} from './setupListeners';
import { getPaginationData } from './pagination';
import { getOpenEditForms } from './wordManagement';
@@ -225,8 +234,9 @@ export function renderEditForm(wordId = false) {