bhasha-quill
Version:
A QuillJs plugin to write in Sanskrit with support for IAST, Devanagari, and more.
111 lines (82 loc) • 3.56 kB
JavaScript
import Quill from "quill";
import Sanscript from "@sanskrit-coders/sanscript";
console.log("Loading", Sanscript.t("bh-as.-a", "iast_ascii", "devanagari"), "...");
var Delta = Quill.import('delta');
class Bhasha {
constructor(quill, options) {
this.quill = quill;
this.options = options;
this.enabled = true;
let from = document.querySelector(this.options.fromDropdown);
if (from) from.addEventListener('change', this.changeScheme.bind(this));
let to = document.querySelector(this.options.toDropdown);
if (to) to.addEventListener('change', this.changeScheme.bind(this));
this.changeScheme(); //read current values
quill.on("text-change", this.transliterate.bind(this));
}
changeScheme(){
let from = document.querySelector(this.options.fromDropdown);
if(from)
this.fromScheme = from.options[from.selectedIndex].value;
else
this.fromScheme = "iast_ascii"
let to = document.querySelector(this.options.toDropdown);
if(to)
this.toScheme = to.options[to.selectedIndex].value;
else
this.toScheme = "devanagari"
console.log("From", this.fromScheme, "To", this.toScheme);
}
transliterate(delta, oldDelta, source){
if(!this.enabled || source != 'user') return;
if(this.fromScheme == this.toScheme) return;
const range = this.quill.getSelection();
if (range == null) return;
const currPos = range.index;
const currWord = this.getCurrentWord(currPos);
if(currWord){
this.processWord(delta, currPos, currWord);
}
}
processWord(delta, currPos, currWord){
var pos = currPos-currWord.length;
var delLength = currWord.length;
var dIdx = 1;
if (delta.ops.length == 2) dIdx = 1; //middle edit
else if (delta.ops.length == 1) dIdx = 0; //new doc
else return;
if(delta.ops[dIdx].delete || delta.ops[dIdx].insert){
//only when something is added or deleted
if (delta.ops[dIdx].insert){
if (!delta.ops[dIdx].insert.trim())
return
const rev_t = Sanscript.t(currWord.substring(0,
currWord.length-delta.ops[dIdx].insert.length),
this.toScheme, this.fromScheme); //get reverse
currWord = rev_t + delta.ops[dIdx].insert;
}
const t = Sanscript.t(currWord, this.fromScheme, this.toScheme);
// console.log(currPos, "currWord", currWord, "->", t, t.length);
var edit = new Delta().retain(pos)
.delete(delLength)
.insert(t, this.quill.getFormat());
// const e_delta =
this.quill.updateContents(edit, 'api');
// console.log(e_delta);
// Move cursor after edit
// TODO: Fix this
window.setTimeout(() => this.quill.setSelection(pos + t.length, 0), 0)
}
}
getCurrentWord(currPos){
const maxLookbehind = 50;
var startPos = currPos - maxLookbehind;
startPos = startPos > 0 ? startPos : 0;
const currText = this.quill.getText(
startPos,
currPos - startPos
)
return currText.split(/(\s+)/).pop();
}
}
export default Bhasha;