Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

279 lines
8.6 KiB
JavaScript
Raw Permalink 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.

/*
* (c) Copyright Ascensio System SIA 2010-2024
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
"use strict";
const fontslot_None = 0x00;
const fontslot_ASCII = 0x01;
const fontslot_EastAsia = 0x02;
const fontslot_CS = 0x04;
const fontslot_HAnsi = 0x08;
const fontslot_Unknown = 0x10;
(function(window)
{
const fonthint_Default = 0x00;
const fonthint_CS = 0x01;
const fonthint_EastAsia = 0x02;
const TABLE_CHUNK_LEN = 0x10000;
const TABLE_CHUNKS = 3;
let LOOKUP_TABLE = null;
const HINT_EA_OFFSET = TABLE_CHUNK_LEN;
const HINT_ZH_OFFSET = TABLE_CHUNK_LEN * 2;
(function()
{
LOOKUP_TABLE = AscFonts.allocate(TABLE_CHUNK_LEN * TABLE_CHUNKS);
function FillRange(nStart, nEnd, arrFontSlots)
{
for (let u = nStart; u <= nEnd; ++u)
{
LOOKUP_TABLE[u] = arrFontSlots[0];
LOOKUP_TABLE[u + HINT_EA_OFFSET] = arrFontSlots[1];
LOOKUP_TABLE[u + HINT_ZH_OFFSET] = arrFontSlots[2];
}
}
function AddExceptions(arrExceptions, nOffset, nFontSlot)
{
for (let nIndex = 0, nCount = arrExceptions.length; nIndex < nCount; ++nIndex)
{
LOOKUP_TABLE[arrExceptions[nIndex] + nOffset] = nFontSlot;
}
}
// Basic Latin
FillRange(0x0000, 0x007F, [fontslot_ASCII, fontslot_ASCII, fontslot_ASCII]);
// Latin-1 Supplement
FillRange(0x00A0, 0x00FF, [fontslot_HAnsi, fontslot_HAnsi, fontslot_HAnsi]);
AddExceptions([
0xA1, 0xA4, 0xA7, 0xA8, 0xAA, 0xAD, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4,
0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBC, 0xBD, 0xBE, 0xBF, 0xD7, 0xF7
], HINT_EA_OFFSET, fontslot_EastAsia);
AddExceptions([
0xA1, 0xA4, 0xA7, 0xA8, 0xAA, 0xAD, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4,
0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBC, 0xBD, 0xBE, 0xBF, 0xD7, 0xF7,
0xE0, 0xE1, 0xE8, 0xE9, 0xEA, 0xEC, 0xED, 0xF2, 0xF3, 0xF9, 0xFA, 0xFC
], HINT_ZH_OFFSET, fontslot_EastAsia);
// Latin Extended-A
// Latin Extended-B
// IPA Extensions
FillRange(0x0100, 0x02AF, [fontslot_HAnsi, fontslot_HAnsi, fontslot_EastAsia]);
// Spacing Modifier Letters
// Combining Diacritical Marks
// Greek and Coptic
// Cyrillic
FillRange(0x02B0, 0x04FF, [fontslot_HAnsi, fontslot_EastAsia, fontslot_EastAsia]);
// Hebrew
// Arabic
// Syriac
// Arabic Supplement
// Thaana
FillRange(0x0590, 0x07BF, [fontslot_ASCII, fontslot_ASCII, fontslot_ASCII]);
// Hangul Jamo
FillRange(0x1100, 0x11FF, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// Latin Extended Additional
FillRange(0x1E00, 0x1EFF, [fontslot_HAnsi, fontslot_HAnsi, fontslot_EastAsia]);
// Greek Extended
FillRange(0x1F00, 0x1FFF, [fontslot_ASCII, fontslot_HAnsi, fontslot_HAnsi]);
// General Punctuation
// Superscripts and Subscripts
// Currency Symbols
// Combining Diacritical Marks for Symbols
// Letter-like Symbols
// Number Forms
// Arrows
// Mathematical Operators
// Miscellaneous Technical
// Control Pictures
// Optical Character Recognition
// Enclosed Alphanumerics
// Box Drawing
// Block Elements
// Geometric Shapes
// Miscellaneous Symbols
// Dingbats
FillRange(0x2000, 0x27BF, [fontslot_HAnsi, fontslot_EastAsia, fontslot_EastAsia]);
// CJK Radicals Supplement
// Kangxi Radicals
// Ideographic Description Characters
// CJK Symbols and Punctuation
// Hiragana
// Katakana
// Bopomofo
// Hangul Compatibility Jamo
// Kanbun
FillRange(0x2E80, 0x319F, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// Enclosed CJK Letters and Months
// CJK Compatibility
// CJK Unified Ideographs Extension A
FillRange(0x3200, 0x4DBF, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// CJK Unified Ideographs
FillRange(0x4E00, 0x9FAF, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// Yi Syllables
// Yi Radicals
FillRange(0xA000, 0xA4CF, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// Hangul Syllables
FillRange(0xAC00, 0xD7AF, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// High Surrogates
// High Private Use Surrogates
// Low Surrogates
FillRange(0xD800, 0xDFFF, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// Private Use Area
FillRange(0xE000, 0xF8FF, [fontslot_HAnsi, fontslot_EastAsia, fontslot_EastAsia]);
// CJK Compatibility Ideographs
FillRange(0xF900, 0xFAFF, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// Alphabetic Presentation Forms
FillRange(0xFB00, 0xFB1C, [fontslot_HAnsi, fontslot_EastAsia, fontslot_EastAsia]);
FillRange(0xFB1D, 0xFB4F, [fontslot_ASCII, fontslot_ASCII, fontslot_ASCII]);
// Arabic Presentation Forms-A
FillRange(0xFB50, 0xFDFF, [fontslot_ASCII, fontslot_ASCII, fontslot_ASCII]);
// CJK Compatibility Forms
// Small Form Variants
FillRange(0xFE30, 0xFE6F, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// Arabic Presentation Forms-B
FillRange(0xFE70, 0xFEFE, [fontslot_ASCII, fontslot_ASCII, fontslot_ASCII]);
// Halfwidth and Fullwidth Forms
FillRange(0xFF00, 0xFFEF, [fontslot_EastAsia, fontslot_EastAsia, fontslot_EastAsia]);
// Все, что выше, сделано согласно документу DR 09-0040
// Все, что ниже, получено опытным путем
// Devanagari
// Bengali
// Gurmukhi
// Gujarati
// Oriya
// Tamil
// Telegu
// Kannada
// Malayalam
// Sinhala
// Thai
// Lao
// Tibetan
// Myanmar
// Georgian
FillRange(0x0900, 0x10FF, [fontslot_HAnsi, fontslot_HAnsi, fontslot_HAnsi]);
// Ethiopic
// Cherokee
FillRange(0x1200, 0x13FF, [fontslot_HAnsi, fontslot_HAnsi, fontslot_HAnsi]);
})();
function GetFontSlot(nUnicode, nHint, nLangId, isCS, isRTL)
{
let nSlot;
if (nUnicode > 0xFFFF)
{
if ((nUnicode >= 0x20000 && nUnicode <= 0x2A6DF) ||
(nUnicode >= 0x2F800 && nUnicode <= 0x2FA1F))
{
nSlot = fontslot_EastAsia;
}
else if (nUnicode >= 0x1D400 && nUnicode <= 0x1D7FF)
{
nSlot = fontslot_ASCII;
}
else
{
nSlot = fontslot_HAnsi;
}
}
else if (fonthint_EastAsia !== nHint)
{
nSlot = LOOKUP_TABLE[nUnicode];
}
else
{
if (lcid_zh === nLangId)
nSlot = LOOKUP_TABLE[HINT_ZH_OFFSET + nUnicode];
else
nSlot = LOOKUP_TABLE[HINT_EA_OFFSET + nUnicode];
if (fontslot_EastAsia === nSlot)
return nSlot;
}
if (isCS || isRTL)
return fontslot_CS;
return nSlot ? nSlot : fontslot_ASCII;
}
function GetFontSlotByTextPr(nUnicode, oTextPr)
{
return GetFontSlot(nUnicode, oTextPr.RFonts.Hint, oTextPr.Lang.EastAsia, oTextPr.CS, oTextPr.RTL);
}
//--------------------------------------------------------export----------------------------------------------------
window['AscWord'] = window['AscWord'] || {};
window['AscWord'].GetFontSlot = GetFontSlot;
window['AscWord'].GetFontSlotByTextPr = GetFontSlotByTextPr;
window['AscWord'].fontslot_None = fontslot_None;
window['AscWord'].fontslot_ASCII = fontslot_ASCII;
window['AscWord'].fontslot_EastAsia = fontslot_EastAsia;
window['AscWord'].fontslot_CS = fontslot_CS;
window['AscWord'].fontslot_HAnsi = fontslot_HAnsi;
window['AscWord'].fontslot_Unknown = fontslot_Unknown;
window['AscWord'].fonthint_Default = fonthint_Default;
window['AscWord'].fonthint_CS = fonthint_CS;
window['AscWord'].fonthint_EastAsia = fonthint_EastAsia;
})(window);