base_ui/assets/common/js/funcTahrir.js

664 lines
16 KiB
JavaScript
Raw Permalink Normal View History

2025-02-01 09:34:55 +00:00
var alaem = ' .،؛,:';
var letterYeh = "یي";
var pishVand = ' نمی '
var letterNoChasban = "ءاإأآؤدذرزو";
var pasvands = " ها هایی های هایش هایم هایشان هایتان هایمان ای اید ایم اند ام";
var pairedAlaemEnd = '}>])﴾»\"';
var pairedAlaemBeg = '{<[(﴿«\"';
var sanadVaseth = ' عن عنه ';
var sanadEnd = ' سالت سألت قلت قال یقول قالوا قالا قلنا ';
var wlast = '';
var indexlast = -1;
var onCharacterKeyPress = function isCharacterKeyPress(evt) {
if (typeof evt.which == "undefined") {
// This is IE, which only fires keypress events for printable keys
return true;
} else if (typeof evt.which == "number" && evt.which > 0) {
// In other browsers except old versions of WebKit, evt.which is
// only greater than zero if the keypress is a printable key.
// We need to filter out backspace and ctrl/alt/meta key combinations
return !evt.ctrlKey && !evt.metaKey && !evt.altKey && evt.which != 8;
}
return false;
}
function isErab(c){
return c.match(/[\u064B-\u0652]/g);
}
function removeErab(text){
text = text.replace(/[\u064B-\u0652]/g, '');
return text;
}
function isPairedChar(c){
var index = pairedAlaemBeg.indexOf(c);
if( index === -1 )
return '';
return pairedAlaemEnd[index];
}
function isAlaem(c){
//var c = String.fromCharCode(keyCode);
return alaem.indexOf(c) !== -1;
}
function getNextWord(text, index){
var w = '';
if(index < 0 )
index = 0;
for(var i=index; i < text.length; i++ )
{
var c = text[i];
if(alaem.indexOf(text[i]) !== -1)
return w;
w += text[i];
}
return w;
}
function getLastWord(text, index){
var w = '';
if(index>=text.length )
index = text.length-1;
for(var i=index; i >= 0; i-- )
{
var c = text[i];
if(isAlaem(text[i]))
return w;
w = text[i] + w;
}
return w;
}
function isHalfSpaceNeed(range){
var index = -1;
var w1 = '', w2 = '';
var ret = [index, w1, w2 ];
var text = range.endContainer.data;
var i1 = range.endOffset - ' '.length;
//var i1 = text.length-1 - ' '.length;
var w1 = getLastWord(text, i1);
var w2 = '';
if(w1 != '')
{
wlast = w1;
indexlast = i1 + 1 + ' '.length;
w2 = getLastWord(text, i1-w1.length-1);
}
if(w2 === '')
return ret;
var correcting = false;
var c2Last = w2[w2.length-1];
if(letterYeh.indexOf(c2Last) !== -1){
if( w2.length < 3 || pishVand.indexOf(' ' + w2) !== -1)
correcting = true;
}
if( !correcting && letterNoChasban.indexOf(c2Last) === -1)
{
if(pasvands.indexOf(' ' + w1) !== -1)
{
correcting = true;
}
}
if(correcting){ // می شود ...
ret[0] = range.endOffset-w1.length-1; // space position
ret[1] = w1; // شود
ret[2] = w2; //می
return ret;
}
else
return ret;
}
function isTextElement(range)
{
return range.endContainer != null && range.endContainer.nodeType === 3;
}
function unSelect(editor){
if(!editor.selection.isCollapsed()){
editor.selection.collapse(false);
editor.focus();
}
}
function selectParag(editor){
var range = editor.selection.getRng().cloneRange();
var node = range.endContainer;
while( !isValidLineTag(node) )
{
if( node.parentNode == null )
break;
node = node.parentNode;
}
if(node === null)
return false;
range.selectNodeContents(node);
editor.selection.setRng(range);
editor.focus();
return true;
}
function selectWord(editor){
//var b = tinyMCE.Env.browser.isIE();
if (editor.selection.isCollapsed()) {
if (tinyMCE.Env.browser.isIE()) { // Internet Explorer
var range = editor.selection.getRng().cloneRange();
var text = range.endContainer.data;
if(text.length == 0)
return false;
var i1 = range.endOffset-1;
if( i1<0 ) i1 = 0;
if( i1 >= text.length ) i1 = text.length-1;
var c = text[i1];
var w = '';
while( i1 >= 0 && !isAlaem(text[i1])){
i1--;
}
if (i1 < 0) i1 = 0;
if(isAlaem(text[i1]))
i1++;
w = getNextWord(text, i1);
range.setStart(range.endContainer, i1);
range.setEnd(range.endContainer, i1+w.length);
editor.selection.setRng(range);
editor.focus();
return true;
}
}
return false;
}
function isLetter(keyCode){
if ( (keyCode < 65 ) ||
(keyCode > 90 && keyCode < 97 ) ||
(keyCode > 122 && keyCode < 161 ) ||
(keyCode > 1631 && keyCode < 1646 )
){
return false;
}
return true;
}
function getRange(editor){
var range = editor.selection.getRng().cloneRange();
if(editor.selection.isCollapsed()){
var node = range.endContainer;
while( !isValidLineTag(node) )
{
if( node.parentNode == null )
break;
node = node.parentNode;
}
if(node === null)
return;
range.selectNodeContents(node);
}
editor.selection.setRng(range);
return range;
}
function removeContentErab(editor){
var range = getRange(editor);
var text = editor.selection.getContent();
text = removeErab(text);
editor.undoManager.add();
//editor.undoManager.transact(function () {
editor.selection.setContent(text);
//});
range.collapse(false);
editor.focus();
return true;
}
function parseHadith(editor){
var range = getRange(editor);
var text = editor.selection.getContent();
if(text.indexOf('class="tsanad"') != -1 || text.indexOf('class="thadith"') != -1){
range.collapse(false);
editor.focus();
return false;
}
var text2 = '';
var sanadvalid = false;
var w = '', w2 = '';
for(var i=0; i < text.length; i++ )
{
var c = text[i];
if(isAlaem(c)){
w2 += c;
if(!sanadvalid && w != ''){
if(sanadEnd.indexOf(' ' + w) != -1){
text2 = '<span class=\"tsanad\">' + text2 + w2 + '</span>';
text2 += '<span class=\"thadith\">'
sanadvalid = true;
w2 = '';
w = '';
continue;
}
}
text2 += w2;
w2 = '';
w = '';
}
else {
w2 += c;
if( !isErab(c) )
w += c;
}
}
text2 += w2;
if(sanadvalid)
text2 += '</span>';
editor.undoManager.add();
//editor.undoManager.transact(function () {
editor.selection.setContent(text2 + ' ');
//});
range.collapse(false);
editor.focus();
return true;
}
function checkPairedChar(editor, e){
var range = editor.selection.getRng().cloneRange();
if( isTextElement(range)){
var c = isPairedChar(e.key);
if( c!== '' ){
if(!editor.selection.isCollapsed()){
editor.selection.setContent( e.key + editor.selection.getContent() + c);
editor.focus();
return true;
}
else{
editor.execCommand('mceInsertContent', false, e.key + c);
//editor.selection.setContent( e.key + c);
var range2 = editor.selection.getRng().cloneRange();
if(range2.endContainer.nodeType == 3)
range2.setEnd(range2.endContainer, range2.endOffset-1);
else if(range2.endContainer.nodeType==1 && range2.endContainer.lastChild && range2.endContainer.lastChild.nodeType == 3)
range2.setEnd(range2.endContainer.lastChild, range2.endContainer.lastChild.textContent.length-1);
else
return true;
editor.selection.setRng(range2);
editor.focus();
return true;
}
}
}
return false;
}
function setingTag2(editor, e){
if(e.keyCode === 35 || e.key === '#'){ //'#'
var range = editor.selection.getRng().cloneRange();
var text = range.endContainer.data;
var i1 = range.endOffset;
if(i1< text.length){
var w1 = getNextWord(text,i1)
if(w1.length > 0){
range.setStart(range.endContainer,i1-1);
range.setEnd(range.endContainer, i1+w1.length+1);
editor.selection.setRng(range);
var t = editor.selection.getContent();
if(t[0] === '#')
t = t.substring(1);
editor.selection.setContent('<span class=\"ttag\">'+t+'</span>');
editor.focus();
return true;
}
}
return false;
}
return false;
}
function setingTag(editor, e, range){
if(isLetter(e.keyCode) ){
var text = range.endContainer.data;
var i1 = range.endOffset-1;
if( i1 > 0 ){
if( text[i1-1] === '#' && text[i1-2] === ' ') {
if( !isTagging(range.endContainer.parentNode) ){
range.setStart(range.endContainer,i1-1);
range.setEnd(range.endContainer, i1+1);
editor.selection.setRng(range);
editor.selection.setContent('<span class=\"ttag\">'+editor.selection.getContent()+'</span>');
range.selectNodeContents(range.endContainer.nextSibling);
range.collapse(false);
editor.selection.setRng(range);
editor.focus();
return true;
}
}
}
}
return false;
}
function endigTag(editor, e, range){
if(isTagging(range.endContainer.parentNode)){
var tag = range.endContainer.parentNode;
var t = tag.innerText;
if(t.length < 2)
return false;
if(t[0] === '#')
t = t.substring(1);
range.selectNodeContents(tag);
editor.selection.setRng(range);
editor.selection.setContent(t);
if(e.keyCode == 13)
tinyMCE.execCommand('removeformat');
else if(tag.nextSibling)
{
range.setStart(tag.nextSibling,0);
range.setEnd(tag.nextSibling,0);
editor.selection.setRng(range);
editor.selection.setContent( ' ' + editor.selection.getContent());
}
editor.focus();
return true;
}
return false;
}
function endingMarkDowns(editor, e){
var range = editor.selection.getRng().cloneRange();
if(e.keyCode === 13){
if(endigTag(editor, e, range))
return true;
}
return false;
}
function checkMarkDown(editor, e){
var range = editor.selection.getRng().cloneRange();
if( isTextElement(range)){
if( editor.selection.isCollapsed() ){
if(e.keyCode == 32 || e.keyCode == 160 ){
var text = range.endContainer.data;
var i1 = range.endOffset-1 - ' '.length;
//var i1 = text.length-1 - ' '.length;
var w1 = '';
var numbering = false;
const regex = /\d/g;
if( i1 > 0 ){
if( text[i1] === '.') {
if(regex.exec(text[i1-1]) !== null ){
w1 = text[i1-1] +'.';
numbering = true;
}
}
}
if(w1 === '')
w1 = getLastWord(text,i1);
if(w1 === '')
return false;
var index = i1-w1.length;
if(index < 0)
index = 0;
// if( w1 === 'آیه' || w1 === 'آيه'){
// editor.undoManager.transact(function () {
// tinyMCE.execCommand('mceInsertContent', false, '-');
// });
// //tinyMCE.execCommand('ayahautocomplate', true, 'ناس');
// return true;
// }
if(w1 === '=' || w1 === '==' || w1 === '===' || w1 ==='*' || numbering )
{
if(index != 0)
return false;
var node = range.endContainer;
while( !isValidLineTag(node) )
{
if( node.parentNode == null )
break;
node = node.parentNode;
}
var id = "";
if(node == null)
{
range.setStart(range.endContainer,index);
range.setEnd(range.endContainer, index + w1.length);
}
else
{
range.selectNodeContents(node);
id = node.getAttribute('id');
}
editor.selection.setRng(range);
if(id != null && id != '')
id = ' id="'+id+'"';
else
id = '';
var nodefocus = range.endContainer;
var t = editor.selection.getContent();
if(t.length >= w1.length && t.substring(0,w1.length) === w1)
t = t.substring(w1.length);
if(numbering) {
var m = regex.exec(w1[0]);
editor.selection.setContent('<ol start="'+w1[0]+'"><li'+id+'>'+t+'</li></ol>');
nodefocus = range.endContainer.firstChild.firstChild;
}
else if(w1 === '*') {
editor.selection.setContent('<ul><li'+id+'>'+t+'</li></ul>');
nodefocus = range.endContainer.firstChild.firstChild;
}
else
{
if(w1 === '=')
editor.selection.setContent('<h1'+id+'>'+t+'</h1>');
if(w1 === '==')
editor.selection.setContent('<h2'+id+'>'+t+'</h2>');
if(w1 === '===')
editor.selection.setContent('<h3'+id+'>'+t+'</h3>');
nodefocus = range.endContainer.firstChild;
}
range.selectNodeContents(nodefocus);
range.collapse(false);
editor.selection.setRng(range);
editor.focus();
return true;
}
else if(endigTag( editor, e, range))
return true;
}
else if(setingTag(editor, e, range) )
return true;
}
}
return false;
}
var isTagging = function (elm) {
return elm && elm.nodeName.toLowerCase() === 'span' && elm.className ==='ttag';
};
var isValidLineTag = function (elm) {
if(elm == null)
return false;
var name = elm.nodeName.toLowerCase();
return elm && (name === 'p' || name.indexOf('h')===0 || name === 'li');
};
function checkHalfSpace(editor, e){
var range = editor.selection.getRng().cloneRange();
if( isTextElement(range)){
if( editor.selection.isCollapsed() ){
if (isAlaem(e.key) || e.keyCode == 32 || e.keyCode == 160 ){
var ret = isHalfSpaceNeed(range);
if(ret[0] != -1){
var index = ret[0];
var c = String.fromCharCode(e.keyCode);
editor.undoManager.add();
//var node1 = range.endContainer;
range.setStart(range.endContainer,index+ ret[1].length + 1);
range.setEnd(range.endContainer,index+ ret[1].length + 1);
editor.selection.setRng(range);
var bm = editor.selection.getBookmark(2, true);
editor.selection.setContent(c); // درج فاصله بعد از کلمه برای حالت عادی و ctrl+z
var isTexttype = false;
var n1 = range.endContainer;
while(n1 != null)
{
if(n1.nodeType==3)
{
isTexttype = true;
break;
}
else
n1 = n1.firstChild;
}
if(isTexttype)
{
var len = index+ ret[1].length+2;
if(len <= n1.data.length)
{
range.setStart(n1, len);
range.setEnd(n1, len);
}
else
range.selectNodeContents(n1);
}
else
range.selectNodeContents(range.endContainer);
//range.selectNodeContents(range.endContainer);
//range.collapse(false);
editor.selection.setRng(range);
editor.selection.collapse(false);
editor.focus();
editor.undoManager.add();
var bm2 = editor.selection.getBookmark(2, true);
editor.selection.moveToBookmark(bm);
range = editor.selection.getRng().cloneRange();
var node = range.endContainer;
//if(node.nodeType === 1 && node.lastChild.nodeType === 3)
// node = node.lastChild;
var i2 = index-ret[2].length;
if(i2 >= 0 && i2 < node.data.length ){
range.setStart(node, index-ret[2].length);
range.setEnd(node, index+ ret[1].length+1);
editor.selection.setRng(range);
editor.selection.setContent(ret[2] +'\u200C' + ret[1]);
}
editor.selection.moveToBookmark(bm2);
editor.selection.collapse(false);
editor.focus();
//editor.undoManager.add();
e.preventDefault();
return true;
}
}
else
{
wlast = '';
indexlast = -1;
}
}
}
return false;
}
function checkNemayah(editor, e){
var range = editor.selection.getRng().cloneRange();
if( isTextElement(range)){
if( editor.selection.isCollapsed() ){
if( e.key === ':' ){
var text = range.endContainer.data;
var i1 = range.endOffset-1;
var i2 = range.endOffset-2;
if(i2 < 0)
return false;
var c1 = text.charCodeAt(i1);
var c2 = text[i2];
if( c1 != 32 && c1 != 160 )
return false;
if( alaem.indexOf(c2) !== -1)
return false;
var parent = range.endContainer.parentNode;
if(parent != null && parent.firstChild === range.endContainer )
{
editor.undoManager.add();
range.setStart(range.endContainer,0);
range.setEnd(range.endContainer, range.endOffset-1);
editor.selection.setRng(range);
editor.selection.setContent('<span class=\"tnemayah\">'+ editor.selection.getContent() +'</span>' + ' :');
//range.selectNodeContents(range.endContainer);
range.collapse(false);
//editor.selection.setRng(range);
editor.focus();
e.preventDefault();
return true;
}
}
}
}
return false;
}
function safePaste(content){
content = content.replace(/\<br[^<>]*?\>/g, '\n');
content = content.replace(/\<div[^<>]*?\>/g, '');
content = content.replace(/\<\/div\>/g, '');
content = content.replace(/\<BR[^<>]*?\>/g, '\n');
content = content.replace(/\<DIV[^<>]*?\>/g, '');
content = content.replace(/\<\/DIV\>/g, '');
var pattern1 = /(\<[a-zA-Z0-9]+[^<>]*?)(id="[^<>]*")([^<>]*?\>)/g
content = content.replace(pattern1, '$1$3');
return content;
}