مدیاویکی:Gadget-Extra-Editbuttons-persiantools.js: تفاوت میان نسخه‌ها

بدون خلاصۀ ویرایش
بدون خلاصۀ ویرایش
بدون خلاصۀ ویرایش
 
(۱۱ نسخهٔ میانی ویرایش شده توسط ۲ کاربر نشان داده نشد)
خط ۳۹: خط ۳۹:
.replace(/([\w])[\u200B-\u200D\uFEFF]/g, '$1')
.replace(/([\w])[\u200B-\u200D\uFEFF]/g, '$1')
// Clean ZWNJs before and after Persian characters
// Clean ZWNJs before and after Persian characters
.replace(new RegExp('\[\\u200b\-\\u200d\\uFEFF\]([' + vowels + arabicIndicDigits + persianDigits + hamza+'])','g'), '$1')
.replace(new RegExp('\[\\u200b\-\\u200d\\uFEFF\]([' + vowels + arabicIndicDigits + persianDigits + hamza + '])','g'), '$1')
.replace(new RegExp('(['+arabicIndicDigits+'])\[\\u200b\-\\u200d\\uFEFF\]','g'), '$1')
.replace(new RegExp('(['+arabicIndicDigits+'])\[\\u200b\-\\u200d\\uFEFF\]','g'), '$1')
// Clean ZWNJs after and before punctuation
// Clean ZWNJs after and before punctuation
.replace(/[\u200B\u200C\uFEFF]([ء\n\s\[\]\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])/g, '$1')
.replace(/[\u200B\u200C\uFEFF]([ء\n\s\[\]\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])/g, '$1')
.replace(/([\n\s\[\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])[\u200B-\u200D\uFEFF]/g, '$1')
.replace(/([\n\s\[\.،«»\:\(\)\؛\؟\?\;\$\!\@\-\=\+\\\|])[\u200B-\u200D\uFEFF]/g, '$1')
// Clean ZWNJs before brakets which have sapce after\before them
// Clean ZWNJs before brackets which have space after/before them
.replace(/[\u200B-\u200D\uFEFF](\]\][\s\n])/g, '$1')
.replace(/[\u200B-\u200D\uFEFF](\]\][\s\n])/g, '$1')
.replace(/([\n\s]\[\[)[\u200B-\u200D\uFEFF]/g, '$1');
.replace(/([\n\s]\[\[)[\u200B-\u200D\uFEFF]/g, '$1');
خط ۱۵۲: خط ۱۵۲:
// جایگزینی ۀ غیراستاندار+حرف بعدی بدون فاصله به ه+همزه+فاصله
// جایگزینی ۀ غیراستاندار+حرف بعدی بدون فاصله به ه+همزه+فاصله
.replace(/[ۂۀ](?![\s\n])/g, 'هٔ ')
.replace(/[ۂۀ](?![\s\n])/g, 'هٔ ')
// Replace ه followed by ARABIC LETTER HIGH HAMZA with the correct one, ARABIC HAMZA ABOVE
.replace(/هٴ([\s\n])/g, 'هٔ$1')
// Replace ه followed by (space|ZWNJ|lrm) follow by ی with هٔ
// Replace ه followed by (space|ZWNJ|lrm) follow by ی with هٔ
.replace(/ه[\u200c\u200e\s]+ی([\s\n])/g, 'هٔ$1')
.replace(/ه[\u200c\u200e\s]+ی([\s\n])/g, 'هٔ$1')
خط ۱۷۲: خط ۱۷۴:
//.replace(/وء/g, 'ؤ')//bug on  سوء
//.replace(/وء/g, 'ؤ')//bug on  سوء
.replace(/سؤ ?استفاده/g, 'سوءاستفاده')//bug on سوءاستفاده و سوء
.replace(/سؤ ?استفاده/g, 'سوءاستفاده')//bug on سوءاستفاده و سوء
.replace(/ و یا /g, ' یا ')// replace «و یا» with «یا»
.replace(/ و یا /g, ' یا ');// replace «و یا» with «یا»
//افزودن همزه
//افزودن همزه
//.replace(/درباره (ام|ات|اش|مان|تان|شان|ای)(\s|$)/g, 'درباره‌$1$2')//i برای جلوگیری از باگ احتمالی برای افزودن همزه به درباره
//.replace(/درباره (ام|ات|اش|مان|تان|شان|ای)(\s|$)/g, 'درباره‌$1$2')//i برای جلوگیری از باگ احتمالی برای افزودن همزه به درباره
خط ۱۸۲: خط ۱۸۴:
* Replaces Persian characters with Arabic's ones so an Arabic sorter can sort Persian lines
* Replaces Persian characters with Arabic's ones so an Arabic sorter can sort Persian lines
*/
*/
function dePersian(text) {
function prepareForArabicSort(text) {
return text
return text
.replace(/ی/g, 'ي')
.replace(/ی/g, 'ي')
خط ۱۸۹: خط ۱۹۱:
.replace(/ژ/g, 'زی')
.replace(/ژ/g, 'زی')
.replace(/چ/g, 'جی')
.replace(/چ/g, 'جی')
.replace(/پ/g, 'بی');
.replace(/پ/g, 'بی')
.replace(/و/g, 'نی')
// 1728 === '۰'.charCodeAt(0) - '0'.charCodeAt(0)
.replace(/([۰-۹])/g, function (x) { return String.fromCharCode(x.charCodeAt(0) - 1728) });
}
}


function persianSortText(text) {
function persianSort(array) {
return text.split('\n').sort(function (x, y) {
return array.sort(function (x, y) {
var keyX = dePersian(x),
var keyX = prepareForArabicSort(x),
keyY = dePersian(y);
keyY = prepareForArabicSort(y);
if (keyX < keyY) {
return keyX < keyY ? -1 : keyX > keyY ? 1 : 0;
return -1;
});
}
if (keyX > keyY) {
return 1;
}
return 0;
}).join('\n');
}
}


خط ۳۱۶: خط ۳۱۵:
'$1$2\u200c$3$4$5'
'$1$2\u200c$3$4$5'
)
)
// ماضی نقلی (است حذف شد)
// ماضی نقلی
.replace(
.replace(
new RegExp('(^|[^' + persianCharacters + '])(ن|)' + persianPastVerbs +
new RegExp('(^|[^' + persianCharacters + '])(ن|)' + persianPastVerbs +
خط ۳۷۰: خط ۳۶۹:
.replace(/ویکیپدیا/g, 'ویکی‌پدیا')
.replace(/ویکیپدیا/g, 'ویکی‌پدیا')
.replace(new RegExp('می\u200cگوی($|[^' + persianCharacters + '\u200c])', 'g'), 'میگوی$1') // for میگوی دریایی
.replace(new RegExp('می\u200cگوی($|[^' + persianCharacters + '\u200c])', 'g'), 'میگوی$1') // for میگوی دریایی
.replace(new RegExp('می\u200cدوی($|[^' + persianCharacters + '\u200c])', 'g'), 'میدوی$1')// for [[میدوی (ابهام‌زدایی)]]
.replace(new RegExp('می\u200cدوی($|[^' + persianCharacters + '\u200c])', 'g'), 'میدوی$1');// for [[میدوی (ابهام‌زدایی)]]
//ویکی پاسخ
.replace(/به[[/g, 'به [[')
.replace(/ (ع)/g, '(ع)')
.replace(/ (ص)/g, '(ص)')
.replace(/ (س)/g, '(س)')
.replace(/ (عج)/g, '(عج)')
;
}
}


خط ۳۹۷: خط ۳۸۹:
.replace(/(. ) +(?=[^= ])/g, '$1')
.replace(/(. ) +(?=[^= ])/g, '$1')
//فاصله بعد از سجاوندی به جز ! به دلیل (<!-- و !! در بالای جدول‌ها)
//فاصله بعد از سجاوندی به جز ! به دلیل (<!-- و !! در بالای جدول‌ها)
.replace(/([،\.\؛\؟»])([^\s\.\(\)«»\"\[\]<>\d\w\{\}\|۰۱۲۳۴۵۶۷۸۹\'])/g, '$1 $2')
.replace(/([،\.\؛\؟»])([^\\.\(\)«»\"\[\]<>\d\w\{\}\|۰۱۲۳۴۵۶۷۸۹\'])/g, '$1 $2')
// افزودن فاصله به بعد از سجاوندی
// افزودن فاصله به بعد از سجاوندی
.replace(new RegExp('([' + persianCharacters + ']+|\\]|\\)|»)([؟،؛\\!\\.])([' + persianCharacters +persianDigits + ']+|\\[|\\(|«)', 'g'), '$1$2 $3')
.replace(new RegExp('([' + persianCharacters + ']+|\\]|\\)|»)([؟،؛\\!\\.])([' + persianCharacters +persianDigits + ']+|\\[|\\(|«)', 'g'), '$1$2 $3')
// حذف فاصله بعد از گیومه، پرانتز، براکت باز
// حذف فاصله بعد از گیومه، پرانتز، براکت باز
.replace(/([\(«\[]) /g, '$1')
.replace(/([\(«\[]) /g, '$1')
// حذف فاصله قبل از گیومه، پرانتز، براکت بسته
// حذف فاصله قبل از گیومه، پرانتز
.replace(/ ([\)»\]])/g, '$1')
.replace(/ ([\)»])/g, '$1')
//.replace(/ (\])/g, '$1') // فاصله پیش از پراکت را حذف نکن زیرا در ویکی کاربرد مهمی دارد
// افزودن فاصله قبل از گیومه باز
// افزودن فاصله قبل از گیومه باز
.replace(/([^ \(\[\|\r\n>'])(«)/g, '$1 $2')
.replace(/([^ \(\[\|\r\n>'])(«)/g, '$1 $2')
خط ۴۳۷: خط ۴۳۰:
.replace(new RegExp('([' + persianCharacters + '])(\\s|)[\\.،؛](\\s|)(\\))', 'g'), '$1$2$3$4')
.replace(new RegExp('([' + persianCharacters + '])(\\s|)[\\.،؛](\\s|)(\\))', 'g'), '$1$2$3$4')
// در صورت وابستگی معنی جملات بهتر است نقطه‌ویرگول فارسی قرار گیرد
// در صورت وابستگی معنی جملات بهتر است نقطه‌ویرگول فارسی قرار گیرد
.replace(new RegExp('([' + persianCharacters + '])(\\s|)(\\.)(\\s|)(ولی|که\\s|و\\s|بنابراین|لذا)', 'g'), '$1؛ $5')
.replace(new RegExp('([' + persianCharacters + '])(\\s|)(\\.)(\\s|)(مثلاً|فرضاً|زیرا|یعنی|بنابراین|لذا)', 'g'), '$1؛ $5')
/// Question & exclamation mark
/// Question & exclamation mark
// علامت تعجب تکراری به دلیل وجود !! در عنوان جدول‌های مدیاویکی نباید اصلاح شود.
// علامت تعجب تکراری به دلیل وجود !! در عنوان جدول‌های مدیاویکی نباید اصلاح شود.
خط ۴۵۲: خط ۴۴۵:
.replace(/(\(|)ه‍\. (ق|خ|ش)([\n\/ ]|\))/g, 'ه‍.$2$3')//iاصلاح تاریخ هجری
.replace(/(\(|)ه‍\. (ق|خ|ش)([\n\/ ]|\))/g, 'ه‍.$2$3')//iاصلاح تاریخ هجری
// حذف فاصلهٔ میان دو عبارت مختصر که دارای نقطهٔ اختصار باشند
// حذف فاصلهٔ میان دو عبارت مختصر که دارای نقطهٔ اختصار باشند
.replace(new RegExp('(\^|\\||\\(|«|\\}|"|\\s|\\*|\\#)(([' + persianCharacters + ']\{1,2\})\\. \?)\{2,6\}', 'g'), function (m) { return m.replace(/\. (.)/g, '.$1'); });
.replace(new RegExp('(\^|\\||\\(|«|\\}|"|\\s|\\*|\\#)(([' + persianCharacters + ']\{1,2\})\\. \?)\{2,6\}', 'g'), function (m) { return m.replace(/\. (.)/g, '.$1'); })
//ویکی پاسخ
.replace(/به\[\[/g, 'به [[')
.replace(/ \(ع\)/g, '(ع)')
.replace(/ \(ص\)/g, '(ص)')
.replace(/ \(س\)/g, '(س)')
.replace(/ \(عج\)/g, '(عج)');
}
}
return {
return {
خط ۴۵۸: خط ۴۵۷:
applyZwnj: applyZwnj,
applyZwnj: applyZwnj,
normalizeZwnj: normalizeZwnj,
normalizeZwnj: normalizeZwnj,
persianSortText: persianSortText,
persianSort: persianSort,
punctuation: punctuation,
punctuation: punctuation,
toPersianDigits: toPersianDigits,
toPersianDigits: toPersianDigits,