Anas Altair
Committed by David PHAM-VAN

fix mixing Arabic with English.

Signed-off-by: Anas Altair <anastr244@gmail.com>
1 # Changelog 1 # Changelog
2 2
  3 +## 1.10.2
  4 +
  5 +- Fix mixing Arabic with English [Anas Altair]
  6 +- Support Dagger alif in Arabic [Anas Altair]
3 7
4 ## 1.10.1 8 ## 1.10.1
5 9
@@ -25,8 +25,6 @@ class PdfArabic { @@ -25,8 +25,6 @@ class PdfArabic {
25 /// Arabic shape substitutions: char code => (isolated, final, initial, medial). 25 /// Arabic shape substitutions: char code => (isolated, final, initial, medial).
26 /// Arabic Substition A 26 /// Arabic Substition A
27 static const Map<int, dynamic> _arabicSubstitionA = <int, dynamic>{ 27 static const Map<int, dynamic> _arabicSubstitionA = <int, dynamic>{
28 -// 0x0652: <int>[0xFE7E, 0xFE7F],  
29 -  
30 0x0621: <int>[0xFE80], // ARABIC LETTER HAMZA 28 0x0621: <int>[0xFE80], // ARABIC LETTER HAMZA
31 0x0622: <int>[0xFE81, 0xFE82], // ARABIC LETTER ALEF WITH MADDA ABOVE 29 0x0622: <int>[0xFE81, 0xFE82], // ARABIC LETTER ALEF WITH MADDA ABOVE
32 0x0623: <int>[0xFE83, 0xFE84], // ARABIC LETTER ALEF WITH HAMZA ABOVE 30 0x0623: <int>[0xFE83, 0xFE84], // ARABIC LETTER ALEF WITH HAMZA ABOVE
@@ -128,6 +126,7 @@ class PdfArabic { @@ -128,6 +126,7 @@ class PdfArabic {
128 0x064E: 0xFC60, // Shadda + Fatha 126 0x064E: 0xFC60, // Shadda + Fatha
129 0x064F: 0xFC61, // Shadda + Damma 127 0x064F: 0xFC61, // Shadda + Damma
130 0x0650: 0xFC62, // Shadda + Kasra 128 0x0650: 0xFC62, // Shadda + Kasra
  129 + 0x0670: 0xFC63, // Shadda + Dagger alif
131 }, 130 },
132 }; 131 };
133 132
@@ -160,20 +159,23 @@ class PdfArabic { @@ -160,20 +159,23 @@ class PdfArabic {
160 static const List<int> _alfletter = <int>[1570, 1571, 1573, 1575]; 159 static const List<int> _alfletter = <int>[1570, 1571, 1573, 1575];
161 160
162 static const Map<int, int> _arabicDiacritics = <int, int>{ 161 static const Map<int, int> _arabicDiacritics = <int, int>{
163 - 1611: 1611, // Fathatan  
164 - 1612: 1612, // Dammatan  
165 - 1613: 1613, // Kasratan  
166 - 1614: 1614, // Fatha  
167 - 1615: 1615, // Damma  
168 - 1616: 1616, // Kasra  
169 - 1617: 1617,  
170 - 1618: 1618,  
171 -  
172 - 64606: 64606, // Shadda + Dammatan  
173 - 64607: 64607, // Shadda + Kasratan  
174 - 64608: 64608, // Shadda + Fatha  
175 - 64609: 64609, // Shadda + Damma  
176 - 64610: 64610, // Shadda + Kasra 162 + 0x064B: 0x064B, // Fathatan
  163 + 0x064C: 0x064C, // Dammatan
  164 + 0x064D: 0x064D, // Kasratan
  165 + 0x064E: 0x064E, // Fatha
  166 + 0x064F: 0x064F, // Damma
  167 + 0x0650: 0x0650, // Kasra
  168 + 0x0651: 0x0651, // Shadda
  169 + 0x0652: 0x0652, // Sukun
  170 +
  171 + 0x0670: 0x0670, // Dagger alif
  172 +
  173 + 0xFC5E: 0xFC5E, // Shadda + Dammatan
  174 + 0xFC5F: 0xFC5F, // Shadda + Kasratan
  175 + 0xFC60: 0xFC60, // Shadda + Fatha
  176 + 0xFC61: 0xFC61, // Shadda + Damma
  177 + 0xFC62: 0xFC62, // Shadda + Kasra
  178 + 0xFC63: 0xFC63, // Shadda + Dagger alif
177 // 1548: 1548, 179 // 1548: 1548,
178 }; 180 };
179 181
@@ -324,10 +326,12 @@ class PdfArabic { @@ -324,10 +326,12 @@ class PdfArabic {
324 static Iterable<String> _parse(String text) sync* { 326 static Iterable<String> _parse(String text) sync* {
325 final List<String> words = text.split(' '); 327 final List<String> words = text.split(' ');
326 328
  329 + final List<List<int>> notArabicWords = <List<int>>[];
  330 +
327 bool first = true; 331 bool first = true;
328 for (String word in words) { 332 for (String word in words) {
329 final List<int> newWord = <int>[]; 333 final List<int> newWord = <int>[];
330 - bool isArabic = false; 334 + bool isNewWordArabic = false;
331 335
332 int prevLetter = 0; 336 int prevLetter = 0;
333 337
@@ -348,31 +352,48 @@ class PdfArabic { @@ -348,31 +352,48 @@ class PdfArabic {
348 ); 352 );
349 353
350 if (_isArabicLetter(currentLetter)) { 354 if (_isArabicLetter(currentLetter)) {
351 - isArabic = true; 355 + isNewWordArabic = true;
352 356
353 final int position = 357 final int position =
354 _getCorrectForm(currentLetter, prevLetter, nextLetter); 358 _getCorrectForm(currentLetter, prevLetter, nextLetter);
  359 + prevLetter = currentLetter;
355 if (position != -1) { 360 if (position != -1) {
356 newWord.insert(0, _arabicSubstitionA[currentLetter][position]); 361 newWord.insert(0, _arabicSubstitionA[currentLetter][position]);
357 } else { 362 } else {
358 newWord.add(currentLetter); 363 newWord.add(currentLetter);
359 } 364 }
360 } else { 365 } else {
361 - if (isArabic && currentLetter > 32) { 366 + prevLetter = 0;
  367 + if (isNewWordArabic && currentLetter > 32) {
362 newWord.insert(0, currentLetter); 368 newWord.insert(0, currentLetter);
363 } else { 369 } else {
364 newWord.add(currentLetter); 370 newWord.add(currentLetter);
365 } 371 }
366 } 372 }
367 - prevLetter = currentLetter;  
368 } 373 }
369 374
370 - if (!first) { 375 + if (!first && isNewWordArabic) {
371 yield ' '; 376 yield ' ';
372 } 377 }
373 first = false; 378 first = false;
374 379
375 - yield String.fromCharCodes(_resolveLigatures(newWord)); 380 + if (isNewWordArabic) {
  381 + isNewWordArabic = false;
  382 + for (List<int> notArabicNewWord in notArabicWords) {
  383 + yield '${String.fromCharCodes(notArabicNewWord)} ';
  384 + }
  385 + notArabicWords.clear();
  386 + yield String.fromCharCodes(_resolveLigatures(newWord));
  387 + } else {
  388 + notArabicWords.insert(0, newWord);
  389 + }
  390 + }
  391 + // if notArabicWords.length != 0, that means all sentence doesn't contain Arabic.
  392 + for (int i = 0; i < notArabicWords.length; i++) {
  393 + yield String.fromCharCodes(notArabicWords[i]);
  394 + if (i != notArabicWords.length - 1) {
  395 + yield ' ';
  396 + }
376 } 397 }
377 } 398 }
378 399
@@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl @@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl
4 homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf 4 homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf
5 repository: https://github.com/DavBfr/dart_pdf 5 repository: https://github.com/DavBfr/dart_pdf
6 issue_tracker: https://github.com/DavBfr/dart_pdf/issues 6 issue_tracker: https://github.com/DavBfr/dart_pdf/issues
7 -version: 1.10.1 7 +version: 1.10.2
8 8
9 environment: 9 environment:
10 sdk: ">=2.3.0 <3.0.0" 10 sdk: ">=2.3.0 <3.0.0"