24#include <rtl/ustrbuf.hxx>
27#include <unordered_map>
33 const char*
const suffixes[] = {
" baltic",
44 OUString
aName = _aName;
46 bool bFinished =
false;
50 for (
const char* suffix : suffixes)
52 size_t nLen = strlen(suffix);
53 if (
aName.endsWithIgnoreAsciiCaseAsciiL(suffix, nLen))
67 if (c < 'a' || c >
'z')
70 if ( (c >=
'A') && (c <=
'Z') )
75 else if( ((c <
'0') || (c >
'9')) && (c !=
';') && (c !=
'(') && (c !=
')') )
88 OUStringBuffer rName(rInName);
89 bool bNeedTranslation =
false;
90 sal_Int32 nLen = rName.getLength();
94 while (
i && (rName[
i-1 ] < 32) )
99 nLen = rName.getLength();
111 if ( (c >= 0xFF00) && (c <= 0xFF5E) )
121 bNeedTranslation =
true;
129 OUString rNameStr = rName.makeStringAndClear();
131 if( bNeedTranslation )
133 typedef std::unordered_map<OUString, OUString> FontNameDictionary;
134 static FontNameDictionary
const aDictionary = {
135 {
u"\uBC14\uD0D5",
"batang"},
136 {
u"\uBC14\uD0D5\uCCB4",
"batangche"},
137 {
u"\uAD81\uC11C",
"gungshu"},
138 {
u"\uAD81\uC11C\uCCB4",
"gungshuche"},
139 {
u"\uAD74\uB9BC",
"gulim"},
140 {
u"\uAD74\uB9BC\uCCB4",
"gulimche"},
141 {
u"\uB3CB\uC6C0",
"dotum"},
142 {
u"\uB3CB\uC6C0\uCCB4",
"dotumche"},
143 {
u"\u5B8B\u4F53",
"simsun"},
144 {
u"\u65B0\u5B8B\u4F53",
"nsimsun"},
145 {
u"\u9ED1\u4F53",
"simhei"},
146 {
u"\u6977\u4F53",
"simkai"},
147 {
u"\u4E2D\u6613\u5B8B\u4F53",
"zycjksun"},
148 {
u"\u4E2D\u6613\u9ED1\u4F53",
"zycjkhei"},
149 {
u"\u4E2D\u6613\u6977\u4F53",
"zycjkkai"},
150 {
u"\u65B9\u6B63\u9ED1\u4F53",
"fzhei"},
151 {
u"\u65B9\u6B63\u6977\u4F53",
"fzkai"},
152 {
u"\u65B9\u6B63\u5B8B\u4E00",
"fzsong"},
153 {
u"\u65B9\u6B63\u4E66\u5B8B",
"fzshusong"},
154 {
u"\u65B9\u6B63\u4EFF\u5B8B",
"fzfangsong"},
157 {
u"m\u7B80\u9ED1",
"mhei"},
158 {
u"m\u6F60\u7AAA",
"mhei"},
159 {
u"m\u7B80\u6977\u566C",
"mkai"},
160 {
u"m\u6F60\u7FF1\u628E",
"mkai"},
161 {
u"m\u7B80\u5B8B",
"msong"},
162 {
u"m\u6F60\u51BC",
"msong"},
163 {
u"m\u7B80\u592B\u5B8B",
"cfangsong"},
164 {
u"m\u6F60\u6E98\u51BC",
"cfangsong"},
165 {
u"\u7D30\u660E\u9AD4",
"mingliu"},
166 {
u"\u65B0\u7D30\u660E\u9AD4",
"pmingliu"},
169 {
u"\u6D69\u6E67",
"ming"},
170 {
u"ms\u30B4\u30B7\u30C3\u30AF",
"msgothic"},
171 {
u"msp\u30B4\u30B7\u30C3\u30AF",
"mspgothic"},
172 {
u"ms\u660E\u671D",
"msmincho"},
173 {
u"msp\u660E\u671D",
"mspmincho"},
174 {
u"\u5FAE\u8EDF\u6B63\u9ED1\u9AD4",
"microsoftjhenghei"},
175 {
u"\u5FAE\u8F6F\u96C5\u9ED1",
"microsoftyahei"},
176 {
u"\u30e1\u30a4\u30ea\u30aa",
"meiryo"},
177 {
u"hg\u660E\u671Dl",
"hgminchol"},
178 {
u"hg\u30B4\u30B7\u30C3\u30AFb",
"hggothicb"},
179 {
u"hgp\u660E\u671Dl",
"hgpminchol"},
180 {
u"hgp\u30B4\u30B7\u30C3\u30AFb",
"hgpgothicb"},
181 {
u"hg\u660E\u671Dlsun",
"hgmincholsun"},
182 {
u"hg\u30B4\u30B7\u30C3\u30AFbsun",
"hggothicbsun"},
183 {
u"hgp\u660E\u671Dlsun",
"hgpmincholsun"},
184 {
u"hgp\u30B4\u30B7\u30C3\u30AFbsun",
"hgpgothicbsun"},
185 {
u"hg\u5E73\u6210\u660E\u671D\u4F53",
"hgheiseimin"},
186 {
u"hg\u5E73\u6210\u660E\u671D\u4F53w3x12",
"hgheiseimin"},
187 {
u"ipa\u660E\u671D",
"ipamincho"},
188 {
u"ipap\u660E\u671D",
"ipapmincho"},
189 {
u"ipa\u30B4\u30B7\u30C3\u30AF",
"ipagothic"},
190 {
u"ipap\u30B4\u30B7\u30C3\u30AF",
"ipapgothic"},
191 {
u"ipaui\u30B4\u30B7\u30C3\u30AF",
"ipauigothic"},
192 {
u"takao\u660E\u671D",
"takaomincho"},
193 {
u"takaop\u660E\u671D",
"takaopmincho"},
194 {
u"takao\u30B4\u30B7\u30C3\u30AF",
"takaogothic"},
195 {
u"takaop\u30B4\u30B7\u30C3\u30AF",
"takaopgothic"},
196 {
u"\u3055\u3056\u306A\u307F\u660E\u671D",
"sazanamimincho"},
197 {
u"\u3055\u3056\u306A\u307F\u30B4\u30B7\u30C3\u30AF",
"sazanamigothic"},
198 {
u"\u6771\u98A8\u660E\u671D",
"kochimincho"},
199 {
u"\u6771\u98A8\u30B4\u30B7\u30C3\u30AF",
"kochigothic"},
200 {
u"\uC36C\uB3CB\uC6C0",
"sundotum"},
201 {
u"\uC36C\uAD74\uB9BC",
"sungulim"},
202 {
u"\uC36C\uBC14\uD0D5",
"sunbatang"},
203 {
u"\uBC31\uBB35\uB3CB\uC6C0",
"baekmukdotum"},
204 {
u"\uBC31\uBB35\uAD74\uB9BC",
"baekmukgulim"},
205 {
u"\uBC31\uBB35\uBC14\uD0D5",
"baekmukbatang"},
206 {
u"\u65B9\u6B63\u9ED1\u4F53",
"fzheiti"},
207 {
u"\u65B9\u6B63\u9ED1\u9AD4",
"fzheiti"},
208 {
u"\u65B9\u6B63\u6977\u4F53",
"fzkaiti"},
209 {
u"\u65B9\u6B63\u6977\u9AD4",
"fzkaitib"},
210 {
u"\u65B9\u6B63\u660E\u9AD4",
"fzmingtib"},
211 {
u"\u65B9\u6B63\u5B8B\u4F53",
"fzsongti"},
212 {
u"hy\uACAC\uBA85\uC870",
"hymyeongjoextra"},
213 {
u"hy\uC2E0\uBA85\uC870",
"hysinmyeongjomedium"},
214 {
u"hy\uC911\uACE0\uB515",
"hygothicmedium"},
215 {
u"hy\uADF8\uB798\uD53Dm",
"hygraphicmedium"},
216 {
u"hy\uADF8\uB798\uD53D",
"hygraphic"},
217 {
u"\uC0C8\uAD74\uB9BC",
"newgulim"},
218 {
u"\uC36C\uAD81\uC11C",
"sungungseo"},
219 {
u"hy\uAD81\uC11Cb",
"hygungsobold"},
220 {
u"hy\uAD81\uC11C",
"hygungso"},
221 {
u"\uC36C\uD5E4\uB4DC\uB77C\uC778",
"sunheadline"},
222 {
u"hy\uD5E4\uB4DC\uB77C\uC778m",
"hyheadlinemedium"},
223 {
u"hy\uD5E4\uB4DC\uB77C\uC778",
"hyheadline"},
224 {
u"\uD734\uBA3C\uC61B\uCCB4",
"yetr"},
225 {
u"hy\uACAC\uACE0\uB515",
"hygothicextra"},
226 {
u"\uC36C\uBAA9\uD310",
"sunmokpan"},
227 {
u"\uC36C\uC5FD\uC11C",
"sunyeopseo"},
228 {
u"\uC36C\uBC31\uC1A1",
"sunbaeksong"},
229 {
u"hy\uC5FD\uC11Cl",
"hypostlight"},
230 {
u"hy\uC5FD\uC11C",
"hypost"},
231 {
u"\uD734\uBA3C\uB9E4\uC9C1\uCCB4",
"magicr"},
232 {
u"\uC36C\uD06C\uB9AC\uC2A4\uD0C8",
"suncrystal"},
233 {
u"\uC36C\uC0D8\uBB3C",
"sunsaemmul"},
234 {
u"hy\uC595\uC740\uC0D8\uBB3Cm",
"hyshortsamulmedium"},
235 {
u"hy\uC595\uC740\uC0D8\uBB3C",
"hyshortsamul"},
236 {
u"\uD55C\uCEF4\uBC14\uD0D5",
"haansoftbatang"},
237 {
u"\uD55C\uCEF4\uB3CB\uC6C0",
"haansoftdotum"},
238 {
u"\uD55C\uC591\uD574\uC11C",
"hyhaeseo"},
239 {
u"md\uC194\uCCB4",
"mdsol"},
240 {
u"md\uAC1C\uC131\uCCB4",
"mdgaesung"},
241 {
u"md\uC544\uD2B8\uCCB4",
"mdart"},
242 {
u"md\uC544\uB871\uCCB4",
"mdalong"},
243 {
u"md\uC774\uC19D\uCCB4",
"mdeasop"},
244 {
u"hg\uFF7A\uFF9E\uFF7C\uFF6F\uFF78e",
"hggothice"},
245 {
u"hgp\uFF7A\uFF9E\uFF7C\uFF6F\uFF78e",
"hgpgothice"},
246 {
u"hgs\uFF7A\uFF9E\uFF7C\uFF6F\uFF78e",
"hgsgothice"},
247 {
u"hg\uFF7A\uFF9E\uFF7C\uFF6F\uFF78m",
"hggothicm"},
248 {
u"hgp\uFF7A\uFF9E\uFF7C\uFF6F\uFF78m",
"hgpgothicm"},
249 {
u"hgs\uFF7A\uFF9E\uFF7C\uFF6F\uFF78m",
"hgsgothicm"},
250 {
u"hg\u884C\u66F8\u4F53",
"hggyoshotai"},
251 {
u"hgp\u884C\u66F8\u4F53",
"hgpgyoshotai"},
252 {
u"hgs\u884C\u66F8\u4F53",
"hgsgyoshotai"},
253 {
u"hg\u6559\u79D1\u66F8\u4F53",
"hgkyokashotai"},
254 {
u"hgp\u6559\u79D1\u66F8\u4F53",
"hgpkyokashotai"},
255 {
u"hgs\u6559\u79D1\u66F8\u4F53",
"hgskyokashotai"},
256 {
u"hg\u660E\u671Db",
"hgminchob"},
257 {
u"hgp\u660E\u671Db",
"hgpminchob"},
258 {
u"hgs\u660E\u671Db",
"hgsminchob"},
259 {
u"hg\u660E\u671De",
"hgminchoe"},
260 {
u"hgp\u660E\u671De",
"hgpminchoe"},
261 {
u"hgs\u660E\u671De",
"hgsminchoe"},
262 {
u"hg\u5275\u82F1\u89D2\uFF8E\uFF9F\uFF6F\uFF8C\uFF9F\u4F53",
"hgsoeikakupoptai"},
263 {
u"hgp\u5275\u82F1\u89D2\uFF8E\uFF9F\uFF6F\uFF8C\uFF9F\u4F53",
"hgpsoeikakupopta"},
264 {
u"hgs\u5275\u82F1\u89D2\uFF8E\uFF9F\uFF6F\uFF8C\uFF9F\u4F53",
"hgssoeikakupopta"},
265 {
u"hg\u5275\u82F1\uFF8C\uFF9F\uFF9A\uFF7E\uFF9E\uFF9D\uFF7Deb",
"hgsoeipresenceeb"},
266 {
u"hgp\u5275\u82F1\uFF8C\uFF9F\uFF9A\uFF7E\uFF9E\uFF9D\uFF7Deb",
"hgpsoeipresenceeb"},
267 {
u"hgs\u5275\u82F1\uFF8C\uFF9F\uFF9A\uFF7E\uFF9E\uFF9D\uFF7Deb",
"hgssoeipresenceeb"},
268 {
u"hg\u5275\u82F1\u89D2\uFF7A\uFF9E\uFF7C\uFF6F\uFF78ub",
"hgsoeikakugothicub"},
269 {
u"hgp\u5275\u82F1\u89D2\uFF7A\uFF9E\uFF7C\uFF6F\uFF78ub",
"hgpsoeikakugothicub"},
270 {
u"hgs\u5275\u82F1\u89D2\uFF7A\uFF9E\uFF7C\uFF6F\uFF78ub",
"hgssoeikakugothicub"},
271 {
u"hg\u6B63\u6977\u66F8\u4F53-pro",
"hgseikaishotaipro"},
272 {
u"hg\u4E38\uFF7A\uFF9E\uFF7C\uFF6F\uFF78-pro",
"hgmarugothicmpro"},
273 {
u"\u30D2\u30E9\u30AE\u30CE\u660E\u671Dpro",
"hiraginominchopro"},
274 {
u"\u30D2\u30E9\u30AE\u30CE\u660E\u671Dpron",
"hiraginominchopron"},
275 {
u"\u30D2\u30E9\u30AE\u30CE\u89D2\u30B4\u30B7\u30C3\u30AF",
"hiraginosans"},
276 {
u"\u30D2\u30E9\u30AE\u30CE\u89D2\u30B4pro",
"hiraginokakugothicpro"},
277 {
u"\u30D2\u30E9\u30AE\u30CE\u89D2\u30B4pron",
"hiraginokakugothicpron"},
278 {
u"\u30D2\u30E9\u30AE\u30CE\u4E38\u30B4pro",
"hiraginomarugothicpro"},
279 {
u"\u30D2\u30E9\u30AE\u30CE\u4E38\u30B4pron",
"hiraginomarugothicpron"},
280 {
u"\u6E38\u30B4\u30B7\u30C3\u30AF",
"yugothic"},
281 {
u"\u6E38\u30B4\u30B7\u30C3\u30AF\u4F53",
"yugothictai"},
282 {
u"\u6E38\u660E\u671D",
"yumincho"},
283 {
u"\u6E38\u660E\u671D\u4F53",
"yuminchotai"},
284 {
u"\u6E90\u30CE\u89D2\u30B4\u30B7\u30C3\u30AF",
"sourcehansans"},
285 {
u"\u6E90\u30CE\u89D2\u30B4\u30B7\u30C3\u30AFjp",
"sourcehansansjp"},
286 {
u"\u6E90\u30CE\u89D2\u30B4\u30B7\u30C3\u30AFhw",
"sourcehansanshw"},
287 {
u"\u6E90\u30CE\u660E\u671D",
"sourcehanserif"},
288 {
u"\u6E90\u30CE\u660E\u671Djp",
"sourcehanserifjp"},
289 {
u"ipamj\u660E\u671D",
"ipamjmincho"},
290 {
u"ipaex\u30B4\u30B7\u30C3\u30AF",
"ipaexgothic"},
291 {
u"ipaex\u660E\u671D",
"ipaexmimcho"}};
293 FontNameDictionary::const_iterator it = aDictionary.find( rNameStr );
294 if( it != aDictionary.end() )
295 rNameStr = it->second;
304 size_t nStringLen = rTokenStr.size();
312 const sal_Unicode* pStr = rTokenStr.data() + rIndex;
313 const sal_Unicode* pEnd = rTokenStr.data() + nStringLen;
314 for(; pStr < pEnd; ++pStr )
315 if( (*pStr ==
';') || (*pStr ==
',') )
318 sal_Int32 nTokenStart = rIndex;
322 rIndex = sal::static_int_cast<sal_Int32>(pStr - rTokenStr.data());
323 nTokenLen = rIndex - nTokenStart;
338 nTokenLen = nStringLen - nTokenStart;
342 return rTokenStr.substr( nTokenStart, nTokenLen );
351 if ( rToken == aTempName )
361 if ( !rName.isEmpty() )
384 && ( aOrgName ==
"starsymbol"
385 || aOrgName ==
"opensymbol" ) )
std::u16string_view GetNextFontToken(std::u16string_view rTokenStr, sal_Int32 &rIndex)
static bool ImplIsFontToken(std::u16string_view rName, std::u16string_view rToken)
void AddTokenFontName(OUString &rName, std::u16string_view rNewToken)
static bool toOnlyLowerAsciiOrStrip(sal_Unicode c, OUStringBuffer &rName, sal_Int32 nIndex, sal_Int32 &rLen)
OUString GetEnglishSearchFontName(std::u16string_view rInName)
bool IsOpenSymbol(std::u16string_view rFontName)
Determine if the font is the special Open|Star Symbol font.
OUString StripScriptFromName(const OUString &_aName)
Strip any "script font suffix" from the font name.
static void ImplAppendFontToken(OUString &rName, std::u16string_view rNewToken)
OUString GetSubsFontName(std::u16string_view rName, SubsFontFlags nFlags)
std::u16string_view rNewToken
OUString get(TranslateId sContextAndId, const std::locale &loc)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
bool equalsIgnoreAsciiCase(std::u16string_view s1, std::u16string_view s2)
::std::vector< OUString > MSSubstitutions