base_ui/assets/common/js/funcTahrir.js
2025-02-01 13:04:55 +03:30

664 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}