WooCommerce PDF Invoices & Packing Slips - Version 2.10.5

Version Description

  • Security: Apply escaping to translated strings
Download this release

Release Info

Developer pomegranate
Plugin Icon 128x128 WooCommerce PDF Invoices & Packing Slips
Version 2.10.5
Comparing to
See all releases

Code changes from version 2.10.4 to 2.10.5

Files changed (45) hide show
  1. assets/css/setup-wizard.css +21 -20
  2. assets/css/setup-wizard.min.css +1 -1
  3. assets/js/media-upload.js +1 -1
  4. assets/js/media-upload.min.js +1 -1
  5. composer.lock +305 -305
  6. includes/class-wcpdf-admin.php +79 -52
  7. includes/class-wcpdf-frontend.php +52 -29
  8. includes/class-wcpdf-main.php +30 -30
  9. includes/class-wcpdf-settings-callbacks.php +103 -99
  10. includes/class-wcpdf-settings-debug.php +34 -34
  11. includes/class-wcpdf-settings-documents.php +19 -43
  12. includes/class-wcpdf-settings-general.php +8 -8
  13. includes/class-wcpdf-settings.php +20 -20
  14. includes/class-wcpdf-setup-wizard.php +25 -28
  15. includes/documents/abstract-wcpdf-order-document.php +6 -5
  16. includes/views/attachment-settings-hint.php +6 -7
  17. includes/views/dompdf-status.php +24 -24
  18. includes/views/setup-wizard/attach-to.php +18 -14
  19. includes/views/setup-wizard/display-options.php +12 -12
  20. includes/views/setup-wizard/good-to-go.php +4 -4
  21. includes/views/setup-wizard/logo.php +11 -14
  22. includes/views/setup-wizard/paper-format.php +7 -6
  23. includes/views/setup-wizard/shop-name.php +8 -5
  24. includes/views/setup-wizard/show-action-buttons.php +4 -4
  25. includes/views/wcpdf-extensions.php +54 -53
  26. includes/views/wcpdf-settings-page.php +15 -6
  27. includes/wcpdf-functions.php +6 -6
  28. readme.txt +4 -1
  29. vendor/composer/ClassLoader.php +479 -479
  30. vendor/composer/InstalledVersions.php +328 -328
  31. vendor/composer/autoload_files.php +10 -10
  32. vendor/composer/autoload_psr4.php +13 -13
  33. vendor/composer/autoload_real.php +75 -75
  34. vendor/composer/autoload_static.php +78 -78
  35. vendor/composer/installed.json +307 -307
  36. vendor/composer/installed.php +69 -69
  37. vendor/symfony/polyfill-mbstring/LICENSE +19 -19
  38. vendor/symfony/polyfill-mbstring/Mbstring.php +846 -846
  39. vendor/symfony/polyfill-mbstring/README.md +13 -13
  40. vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +1397 -1397
  41. vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +5 -5
  42. vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +1414 -1414
  43. vendor/symfony/polyfill-mbstring/bootstrap.php +147 -147
  44. vendor/symfony/polyfill-mbstring/composer.json +38 -38
  45. woocommerce-pdf-invoices-packingslips.php +6 -6
assets/css/setup-wizard.css CHANGED
@@ -1,16 +1,18 @@
1
- .wpo-wizzard {
2
  background:#f9f9f9;
3
  }
4
 
5
  .wpo-wcpdf-setup {
6
- padding:0;
 
7
  font-family: 'Ubuntu', sans-serif;
8
  font-size: 14px;
9
- line-height: 22px;
10
- color:#444;
11
- background:none;
12
- -webkit-box-shadow: none;
13
  box-shadow: none;
 
14
  }
15
 
16
  .wpo-wcpdf-setup h1, .wpo-wcpdf-setup h2 {
@@ -32,12 +34,12 @@
32
  background-color:#f9f9f9;
33
  font-family: 'Ubuntu', sans-serif;
34
  font-size: 14px;
35
- line-height: 22px;
36
- color:#444;
37
- width:100%;
38
- height:100%;
39
- margin:0;
40
- padding:0;
41
  }
42
 
43
  .confetti {
@@ -51,11 +53,10 @@
51
  display:block;
52
  background-color:#f2fafa;
53
  max-width:900px;
54
- margin:100px auto 100px auto;
55
- padding:0;
56
- border-radius:10px;
57
- box-shadow:10px 10px 80px rgba(0,0,0,0.05);
58
- overflow:hidden;
59
  }
60
 
61
  .wpo-plugin-title {
@@ -223,8 +224,8 @@
223
  position:absolute;
224
  left:50%;
225
  -ms-transform: translate(-50%, 0%); /* IE 9 */
226
- -webkit-transform: translate(-50%, 0%); /* Safari */
227
- transform: translate(-50%, 0%);
228
  }
229
 
230
  /* Attach to */
@@ -319,7 +320,7 @@
319
  /* Landscape phones and smaller */
320
  @media (max-width: 480px) {
321
 
322
- .wpo-wizzard, .wpo-wcpdf-setup {
323
  margin:0;
324
  height:100%;
325
  }
1
+ .wpo-wizard {
2
  background:#f9f9f9;
3
  }
4
 
5
  .wpo-wcpdf-setup {
6
+ margin: 100px auto 25px;
7
+ padding: 0;
8
  font-family: 'Ubuntu', sans-serif;
9
  font-size: 14px;
10
+ line-height: 22px;
11
+ color:#444;
12
+ background: none;
13
+ -webkit-box-shadow: none;
14
  box-shadow: none;
15
+ border: none;
16
  }
17
 
18
  .wpo-wcpdf-setup h1, .wpo-wcpdf-setup h2 {
34
  background-color:#f9f9f9;
35
  font-family: 'Ubuntu', sans-serif;
36
  font-size: 14px;
37
+ line-height: 22px;
38
+ color:#444;
39
+ width:100%;
40
+ height:100%;
41
+ margin:0;
42
+ padding:0;
43
  }
44
 
45
  .confetti {
53
  display:block;
54
  background-color:#f2fafa;
55
  max-width:900px;
56
+ padding:0;
57
+ border-radius:10px;
58
+ box-shadow:10px 10px 80px rgba(0,0,0,0.05);
59
+ overflow:hidden;
 
60
  }
61
 
62
  .wpo-plugin-title {
224
  position:absolute;
225
  left:50%;
226
  -ms-transform: translate(-50%, 0%); /* IE 9 */
227
+ -webkit-transform: translate(-50%, 0%); /* Safari */
228
+ transform: translate(-50%, 0%);
229
  }
230
 
231
  /* Attach to */
320
  /* Landscape phones and smaller */
321
  @media (max-width: 480px) {
322
 
323
+ .wpo-wizard, .wpo-wcpdf-setup {
324
  margin:0;
325
  height:100%;
326
  }
assets/css/setup-wizard.min.css CHANGED
@@ -1 +1 @@
1
- .wpo-wizzard{background:#f9f9f9}.wpo-wcpdf-setup{padding:0;font-family:Ubuntu,sans-serif;font-size:14px;line-height:22px;color:#444;background:0 0;-webkit-box-shadow:none;box-shadow:none}.wpo-wcpdf-setup h1,.wpo-wcpdf-setup h2{border:none;color:#444;margin:0}#confetti{width:100%;height:100%;position:absolute;left:0;top:0;z-index:-999}.wpo-setup{background-color:#f9f9f9;font-family:Ubuntu,sans-serif;font-size:14px;line-height:22px;color:#444;width:100%;height:100%;margin:0;padding:0}.confetti{width:100%;height:100%;z-index:-999;position:relative}.wpo-setup-card{display:block;background-color:#f2fafa;max-width:900px;margin:100px auto 100px auto;padding:0;border-radius:10px;box-shadow:10px 10px 80px rgba(0,0,0,.05);overflow:hidden}.wpo-plugin-title{width:100%;padding:30px 0 50px 0;margin:0;background-color:#fdfdfd;text-align:center;display:block;color:#61707d}.wpo-progress-bar{width:100%;height:36px;overflow:hidden;list-style:none;margin:-18px 0 0 0;padding:0}.wpo-progress-bar li{width:14.285%;float:left;box-sizing:border-box}.wpo-progress-marker{height:24px;width:24px;background-color:#fdfdfd;border:6px solid #3e9b9a;border-radius:50%;margin:0 auto}.wpo-progress-bar .completed{background-color:#3e9b9a}.wpo-progress-bar .active{background-color:#2d7170}.wpo-setup-content{float:left;width:100%;overflow:hidden}.wpo-step-description{width:50%;float:left;padding:50px;box-sizing:border-box}.wpo-step-description ul{padding-left:16px}.wpo-setup-input{width:50%;float:left;padding:50px 50px 50px 0;box-sizing:border-box;position:relative}.wpo-setup-input select{width:100%;border:none;font-size:1.4em;background-color:#fdfdfd;color:#444;border:1px solid #3e9b9a;height:40px}.wpo-setup-buttons{width:100%;float:left;padding:0 50px 50px 50px;box-sizing:border-box}.wpo-button-next,.wpo-button-previous,.wpo-skip-step{background-color:#3e9b9a;border-radius:5px;padding:10px 20px;border:none;box-sizing:border-box;font-size:1em;text-decoration:none;cursor:pointer;color:#fdfdfd;font-size:1.4em;box-sizing:border-box}.wpo-button-next:hover,.wpo-button-previous:hover{background-color:#2d7170}.wpo-button-next,.wpo-skip-step{float:right;margin-left:10px}.wpo-button-previous{float:left}.wpo-skip-step{background-color:#fdfdfd;color:#61707d}.wpo-skip-step:hover{color:#333}.wpo-setup-input .shop-name{width:100%;height:40px;padding:10px 15px;box-sizing:border-box;font-size:1.2em;margin-bottom:20px;border:1px solid #3e9b9a;font-family:Ubuntu,sans-serif}.wpo-setup-input .shop-address{width:100%;height:200px;padding:15px 15px;font-size:1.2em;line-height:1.4em;box-sizing:border-box;border:1px solid #3e9b9a;resize:none;float:left;margin:0;font-family:Ubuntu,sans-serif;text-align:left!important}.wpo-setup-input #img-header_logo{width:100%;height:auto;background:#fdfdfd;margin-bottom:20px;padding:20px;box-sizing:border-box;position:relative}.wpo-setup-input #logo-preview img{height:80%;position:absolute;left:50%;-ms-transform:translate(-50%,0);-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.wpo-setup-input input[type=checkbox]{background-color:#fdfdfd;border:1px solid #cacece;border-radius:3px;vertical-align:text-bottom;margin-right:20px}.wpo-setup-input .checkbox{font-size:1.1em}.wpo-setup-input .how-to-box{float:right;width:auto;max-width:100%;height:auto;border:1px solid #3e9b9a;overflow:hidden;background:#fff}.wpo-setup-input .how-to-box img{width:100%}.wpo-step-description a:link,.wpo-step-description a:visited{color:#3e9b9a;text-decoration:none}.wpo-final{text-align:center;width:100%;padding:50px 200px}.wpo-final h1{font-size:3em;line-height:1em}@media (min-width:768px) and (max-width:991px){.wpo-setup-card{width:80%}}@media (max-width:767px){.wpo-setup-card{width:100%;min-height:100%;border-radius:0;margin:0}.wpo-setup-input,.wpo-step-description{width:100%;padding-left:50px}.wpo-final{padding:50px}.wpo-progress-bar{margin-top:-12px}.wpo-progress-marker{height:16px;width:16px;border-width:4px}.wpo-button-next,.wpo-button-previous,.wpo-skip-step{font-size:1em;padding:8px 12px}}@media (max-width:480px){.wpo-wcpdf-setup,.wpo-wizzard{margin:0;height:100%}.wpo-wcpdf-setup form{height:100%}.wpo-setup-card{width:100%;min-height:100%;border-radius:0;margin:0}.wpo-plugin-title{padding:25px 0 30px 0;font-size:1.4em}.wpo-setup-buttons,.wpo-setup-input,.wpo-step-description{width:100%;padding:20px}.wpo-step-description{padding-bottom:0}.wpo-progress-bar{margin-top:-12px}.wpo-progress-marker{height:16px;width:16px;border-width:4px}.wpo-button-next,.wpo-button-previous,.wpo-skip-step{font-size:1em;padding:8px 12px}.wpo-setup-input .checkbox{font-size:1em}}
1
+ .wpo-wizard{background:#f9f9f9}.wpo-wcpdf-setup{margin:100px auto 25px;padding:0;font-family:Ubuntu,sans-serif;font-size:14px;line-height:22px;color:#444;background:0 0;-webkit-box-shadow:none;box-shadow:none;border:none}.wpo-wcpdf-setup h1,.wpo-wcpdf-setup h2{border:none;color:#444;margin:0}#confetti{width:100%;height:100%;position:absolute;left:0;top:0;z-index:-999}.wpo-setup{background-color:#f9f9f9;font-family:Ubuntu,sans-serif;font-size:14px;line-height:22px;color:#444;width:100%;height:100%;margin:0;padding:0}.confetti{width:100%;height:100%;z-index:-999;position:relative}.wpo-setup-card{display:block;background-color:#f2fafa;max-width:900px;padding:0;border-radius:10px;box-shadow:10px 10px 80px rgba(0,0,0,.05);overflow:hidden}.wpo-plugin-title{width:100%;padding:30px 0 50px 0;margin:0;background-color:#fdfdfd;text-align:center;display:block;color:#61707d}.wpo-progress-bar{width:100%;height:36px;overflow:hidden;list-style:none;margin:-18px 0 0 0;padding:0}.wpo-progress-bar li{width:14.285%;float:left;box-sizing:border-box}.wpo-progress-marker{height:24px;width:24px;background-color:#fdfdfd;border:6px solid #3e9b9a;border-radius:50%;margin:0 auto}.wpo-progress-bar .completed{background-color:#3e9b9a}.wpo-progress-bar .active{background-color:#2d7170}.wpo-setup-content{float:left;width:100%;overflow:hidden}.wpo-step-description{width:50%;float:left;padding:50px;box-sizing:border-box}.wpo-step-description ul{padding-left:16px}.wpo-setup-input{width:50%;float:left;padding:50px 50px 50px 0;box-sizing:border-box;position:relative}.wpo-setup-input select{width:100%;border:none;font-size:1.4em;background-color:#fdfdfd;color:#444;border:1px solid #3e9b9a;height:40px}.wpo-setup-buttons{width:100%;float:left;padding:0 50px 50px 50px;box-sizing:border-box}.wpo-button-next,.wpo-button-previous,.wpo-skip-step{background-color:#3e9b9a;border-radius:5px;padding:10px 20px;border:none;box-sizing:border-box;font-size:1em;text-decoration:none;cursor:pointer;color:#fdfdfd;font-size:1.4em;box-sizing:border-box}.wpo-button-next:hover,.wpo-button-previous:hover{background-color:#2d7170}.wpo-button-next,.wpo-skip-step{float:right;margin-left:10px}.wpo-button-previous{float:left}.wpo-skip-step{background-color:#fdfdfd;color:#61707d}.wpo-skip-step:hover{color:#333}.wpo-setup-input .shop-name{width:100%;height:40px;padding:10px 15px;box-sizing:border-box;font-size:1.2em;margin-bottom:20px;border:1px solid #3e9b9a;font-family:Ubuntu,sans-serif}.wpo-setup-input .shop-address{width:100%;height:200px;padding:15px 15px;font-size:1.2em;line-height:1.4em;box-sizing:border-box;border:1px solid #3e9b9a;resize:none;float:left;margin:0;font-family:Ubuntu,sans-serif;text-align:left!important}.wpo-setup-input #img-header_logo{width:100%;height:auto;background:#fdfdfd;margin-bottom:20px;padding:20px;box-sizing:border-box;position:relative}.wpo-setup-input #logo-preview img{height:80%;position:absolute;left:50%;-ms-transform:translate(-50%,0);-webkit-transform:translate(-50%,0);transform:translate(-50%,0)}.wpo-setup-input input[type=checkbox]{background-color:#fdfdfd;border:1px solid #cacece;border-radius:3px;vertical-align:text-bottom;margin-right:20px}.wpo-setup-input .checkbox{font-size:1.1em}.wpo-setup-input .how-to-box{float:right;width:auto;max-width:100%;height:auto;border:1px solid #3e9b9a;overflow:hidden;background:#fff}.wpo-setup-input .how-to-box img{width:100%}.wpo-step-description a:link,.wpo-step-description a:visited{color:#3e9b9a;text-decoration:none}.wpo-final{text-align:center;width:100%;padding:50px 200px}.wpo-final h1{font-size:3em;line-height:1em}@media (min-width:768px) and (max-width:991px){.wpo-setup-card{width:80%}}@media (max-width:767px){.wpo-setup-card{width:100%;min-height:100%;border-radius:0;margin:0}.wpo-setup-input,.wpo-step-description{width:100%;padding-left:50px}.wpo-final{padding:50px}.wpo-progress-bar{margin-top:-12px}.wpo-progress-marker{height:16px;width:16px;border-width:4px}.wpo-button-next,.wpo-button-previous,.wpo-skip-step{font-size:1em;padding:8px 12px}}@media (max-width:480px){.wpo-wcpdf-setup,.wpo-wizard{margin:0;height:100%}.wpo-wcpdf-setup form{height:100%}.wpo-setup-card{width:100%;min-height:100%;border-radius:0;margin:0}.wpo-plugin-title{padding:25px 0 30px 0;font-size:1.4em}.wpo-setup-buttons,.wpo-setup-input,.wpo-step-description{width:100%;padding:20px}.wpo-step-description{padding-bottom:0}.wpo-progress-bar{margin-top:-12px}.wpo-progress-marker{height:16px;width:16px;border-width:4px}.wpo-button-next,.wpo-button-previous,.wpo-skip-step{font-size:1em;padding:8px 12px}.wpo-setup-input .checkbox{font-size:1em}}
assets/js/media-upload.js CHANGED
@@ -73,7 +73,7 @@ jQuery(document).ready(function($) {
73
  file_frame.open();
74
  });
75
 
76
- $( '#wpo-wcpdf-settings' ).on( 'click', '.wpo_remove_image_button', function( event ){
77
  // get source & target elements
78
  let $settings_wrapper = $(this).parent();
79
  let $input = $settings_wrapper.find( 'input#header_logo' );
73
  file_frame.open();
74
  });
75
 
76
+ $( '#wpo-wcpdf-settings, .wpo-wcpdf-setup' ).on( 'click', '.wpo_remove_image_button', function( event ){
77
  // get source & target elements
78
  let $settings_wrapper = $(this).parent();
79
  let $input = $settings_wrapper.find( 'input#header_logo' );
assets/js/media-upload.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(document).ready(function(a){var b;a("#wpo-wcpdf-settings, .wpo-wcpdf-setup").on("click",".wpo_upload_image_button",function(c){c.preventDefault();let d=a(this).parent();return b?void b.open():void(b=wp.media.frames.file_frame=wp.media({title:a(this).data("uploader_title"),button:{text:a(this).data("uploader_button_text")},multiple:!1}),b.on("select",function(){let c=d.find("input#header_logo"),e=d.find("img#img-header_logo"),f=b.state().get("selection").first().toJSON();c.val(f.id),e.length&&e.attr("src",f.url),a(".attachment-resolution, .attachment-resolution-warning").remove(),d.css("opacity","0.25");let g={security:c.data("ajax_nonce"),action:"wpo_wcpdf_get_media_upload_setting_html",args:c.data("settings_callback_args"),attachment_id:f.id};xhr=a.ajax({type:"POST",url:wpo_wcpdf_admin.ajaxurl,data:g,success:function(a){a&&"undefined"!=typeof a.success&&!0===a.success&&d.html(a.data),d.removeAttr("style")},error:function(){d.removeAttr("style")}})}),b.open())}),a("#wpo-wcpdf-settings").on("click",".wpo_remove_image_button",function(){let b=a(this).parent(),c=b.find("input#header_logo"),d=b.find("img#img-header_logo");c.val(""),d.remove(),a(this).remove(),a(".attachment-resolution, .attachment-resolution-warning").remove()})});
1
+ jQuery(document).ready(function(a){var b;a("#wpo-wcpdf-settings, .wpo-wcpdf-setup").on("click",".wpo_upload_image_button",function(c){c.preventDefault();let d=a(this).parent();return b?void b.open():void(b=wp.media.frames.file_frame=wp.media({title:a(this).data("uploader_title"),button:{text:a(this).data("uploader_button_text")},multiple:!1}),b.on("select",function(){let c=d.find("input#header_logo"),e=d.find("img#img-header_logo"),f=b.state().get("selection").first().toJSON();c.val(f.id),e.length&&e.attr("src",f.url),a(".attachment-resolution, .attachment-resolution-warning").remove(),d.css("opacity","0.25");let g={security:c.data("ajax_nonce"),action:"wpo_wcpdf_get_media_upload_setting_html",args:c.data("settings_callback_args"),attachment_id:f.id};xhr=a.ajax({type:"POST",url:wpo_wcpdf_admin.ajaxurl,data:g,success:function(a){a&&"undefined"!=typeof a.success&&!0===a.success&&d.html(a.data),d.removeAttr("style")},error:function(){d.removeAttr("style")}})}),b.open())}),a("#wpo-wcpdf-settings, .wpo-wcpdf-setup").on("click",".wpo_remove_image_button",function(){let b=a(this).parent(),c=b.find("input#header_logo"),d=b.find("img#img-header_logo");c.val(""),d.remove(),a(this).remove(),a(".attachment-resolution, .attachment-resolution-warning").remove()})});
composer.lock CHANGED
@@ -1,305 +1,305 @@
1
- {
2
- "_readme": [
3
- "This file locks the dependencies of your project to a known state",
4
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
- "This file is @generated automatically"
6
- ],
7
- "content-hash": "73484b19852eaabedb9da17ed3b8d7ba",
8
- "packages": [
9
- {
10
- "name": "dompdf/dompdf",
11
- "version": "v1.0.2",
12
- "source": {
13
- "type": "git",
14
- "url": "https://github.com/dompdf/dompdf.git",
15
- "reference": "8768448244967a46d6e67b891d30878e0e15d25c"
16
- },
17
- "dist": {
18
- "type": "zip",
19
- "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8768448244967a46d6e67b891d30878e0e15d25c",
20
- "reference": "8768448244967a46d6e67b891d30878e0e15d25c",
21
- "shasum": ""
22
- },
23
- "require": {
24
- "ext-dom": "*",
25
- "ext-mbstring": "*",
26
- "phenx/php-font-lib": "^0.5.2",
27
- "phenx/php-svg-lib": "^0.3.3",
28
- "php": "^7.1 || ^8.0"
29
- },
30
- "require-dev": {
31
- "mockery/mockery": "^1.3",
32
- "phpunit/phpunit": "^7.5 || ^8 || ^9",
33
- "squizlabs/php_codesniffer": "^3.5"
34
- },
35
- "suggest": {
36
- "ext-gd": "Needed to process images",
37
- "ext-gmagick": "Improves image processing performance",
38
- "ext-imagick": "Improves image processing performance",
39
- "ext-zlib": "Needed for pdf stream compression"
40
- },
41
- "type": "library",
42
- "extra": {
43
- "branch-alias": {
44
- "dev-develop": "0.7-dev"
45
- }
46
- },
47
- "autoload": {
48
- "psr-4": {
49
- "Dompdf\\": "src/"
50
- },
51
- "classmap": [
52
- "lib/"
53
- ]
54
- },
55
- "notification-url": "https://packagist.org/downloads/",
56
- "license": [
57
- "LGPL-2.1"
58
- ],
59
- "authors": [
60
- {
61
- "name": "Fabien Ménager",
62
- "email": "fabien.menager@gmail.com"
63
- },
64
- {
65
- "name": "Brian Sweeney",
66
- "email": "eclecticgeek@gmail.com"
67
- },
68
- {
69
- "name": "Gabriel Bull",
70
- "email": "me@gabrielbull.com"
71
- }
72
- ],
73
- "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
74
- "homepage": "https://github.com/dompdf/dompdf",
75
- "support": {
76
- "issues": "https://github.com/dompdf/dompdf/issues",
77
- "source": "https://github.com/dompdf/dompdf/tree/v1.0.2"
78
- },
79
- "time": "2021-01-08T14:18:52+00:00"
80
- },
81
- {
82
- "name": "phenx/php-font-lib",
83
- "version": "0.5.2",
84
- "source": {
85
- "type": "git",
86
- "url": "https://github.com/PhenX/php-font-lib.git",
87
- "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8"
88
- },
89
- "dist": {
90
- "type": "zip",
91
- "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8",
92
- "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8",
93
- "shasum": ""
94
- },
95
- "require-dev": {
96
- "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7"
97
- },
98
- "type": "library",
99
- "autoload": {
100
- "psr-4": {
101
- "FontLib\\": "src/FontLib"
102
- }
103
- },
104
- "notification-url": "https://packagist.org/downloads/",
105
- "license": [
106
- "LGPL-3.0"
107
- ],
108
- "authors": [
109
- {
110
- "name": "Fabien Ménager",
111
- "email": "fabien.menager@gmail.com"
112
- }
113
- ],
114
- "description": "A library to read, parse, export and make subsets of different types of font files.",
115
- "homepage": "https://github.com/PhenX/php-font-lib",
116
- "support": {
117
- "issues": "https://github.com/PhenX/php-font-lib/issues",
118
- "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2"
119
- },
120
- "time": "2020-03-08T15:31:32+00:00"
121
- },
122
- {
123
- "name": "phenx/php-svg-lib",
124
- "version": "v0.3.3",
125
- "source": {
126
- "type": "git",
127
- "url": "https://github.com/PhenX/php-svg-lib.git",
128
- "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32"
129
- },
130
- "dist": {
131
- "type": "zip",
132
- "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
133
- "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
134
- "shasum": ""
135
- },
136
- "require": {
137
- "sabberworm/php-css-parser": "^8.3"
138
- },
139
- "require-dev": {
140
- "phpunit/phpunit": "^5.5|^6.5"
141
- },
142
- "type": "library",
143
- "autoload": {
144
- "psr-4": {
145
- "Svg\\": "src/Svg"
146
- }
147
- },
148
- "notification-url": "https://packagist.org/downloads/",
149
- "license": [
150
- "LGPL-3.0"
151
- ],
152
- "authors": [
153
- {
154
- "name": "Fabien Ménager",
155
- "email": "fabien.menager@gmail.com"
156
- }
157
- ],
158
- "description": "A library to read, parse and export to PDF SVG files.",
159
- "homepage": "https://github.com/PhenX/php-svg-lib",
160
- "support": {
161
- "issues": "https://github.com/PhenX/php-svg-lib/issues",
162
- "source": "https://github.com/PhenX/php-svg-lib/tree/master"
163
- },
164
- "time": "2019-09-11T20:02:13+00:00"
165
- },
166
- {
167
- "name": "sabberworm/php-css-parser",
168
- "version": "8.3.1",
169
- "source": {
170
- "type": "git",
171
- "url": "https://github.com/sabberworm/PHP-CSS-Parser.git",
172
- "reference": "d217848e1396ef962fb1997cf3e2421acba7f796"
173
- },
174
- "dist": {
175
- "type": "zip",
176
- "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796",
177
- "reference": "d217848e1396ef962fb1997cf3e2421acba7f796",
178
- "shasum": ""
179
- },
180
- "require": {
181
- "php": ">=5.3.2"
182
- },
183
- "require-dev": {
184
- "codacy/coverage": "^1.4",
185
- "phpunit/phpunit": "~4.8"
186
- },
187
- "type": "library",
188
- "autoload": {
189
- "psr-0": {
190
- "Sabberworm\\CSS": "lib/"
191
- }
192
- },
193
- "notification-url": "https://packagist.org/downloads/",
194
- "license": [
195
- "MIT"
196
- ],
197
- "authors": [
198
- {
199
- "name": "Raphael Schweikert"
200
- }
201
- ],
202
- "description": "Parser for CSS Files written in PHP",
203
- "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser",
204
- "keywords": [
205
- "css",
206
- "parser",
207
- "stylesheet"
208
- ],
209
- "support": {
210
- "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues",
211
- "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1"
212
- },
213
- "time": "2020-06-01T09:10:00+00:00"
214
- },
215
- {
216
- "name": "symfony/polyfill-mbstring",
217
- "version": "v1.20.0",
218
- "source": {
219
- "type": "git",
220
- "url": "https://github.com/symfony/polyfill-mbstring.git",
221
- "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
222
- },
223
- "dist": {
224
- "type": "zip",
225
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
226
- "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
227
- "shasum": ""
228
- },
229
- "require": {
230
- "php": ">=7.1"
231
- },
232
- "suggest": {
233
- "ext-mbstring": "For best performance"
234
- },
235
- "type": "library",
236
- "extra": {
237
- "branch-alias": {
238
- "dev-main": "1.20-dev"
239
- },
240
- "thanks": {
241
- "name": "symfony/polyfill",
242
- "url": "https://github.com/symfony/polyfill"
243
- }
244
- },
245
- "autoload": {
246
- "psr-4": {
247
- "Symfony\\Polyfill\\Mbstring\\": ""
248
- },
249
- "files": [
250
- "bootstrap.php"
251
- ]
252
- },
253
- "notification-url": "https://packagist.org/downloads/",
254
- "license": [
255
- "MIT"
256
- ],
257
- "authors": [
258
- {
259
- "name": "Nicolas Grekas",
260
- "email": "p@tchwork.com"
261
- },
262
- {
263
- "name": "Symfony Community",
264
- "homepage": "https://symfony.com/contributors"
265
- }
266
- ],
267
- "description": "Symfony polyfill for the Mbstring extension",
268
- "homepage": "https://symfony.com",
269
- "keywords": [
270
- "compatibility",
271
- "mbstring",
272
- "polyfill",
273
- "portable",
274
- "shim"
275
- ],
276
- "support": {
277
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0"
278
- },
279
- "funding": [
280
- {
281
- "url": "https://symfony.com/sponsor",
282
- "type": "custom"
283
- },
284
- {
285
- "url": "https://github.com/fabpot",
286
- "type": "github"
287
- },
288
- {
289
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
290
- "type": "tidelift"
291
- }
292
- ],
293
- "time": "2020-10-23T14:02:19+00:00"
294
- }
295
- ],
296
- "packages-dev": [],
297
- "aliases": [],
298
- "minimum-stability": "stable",
299
- "stability-flags": [],
300
- "prefer-stable": false,
301
- "prefer-lowest": false,
302
- "platform": [],
303
- "platform-dev": [],
304
- "plugin-api-version": "2.0.0"
305
- }
1
+ {
2
+ "_readme": [
3
+ "This file locks the dependencies of your project to a known state",
4
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
+ "This file is @generated automatically"
6
+ ],
7
+ "content-hash": "73484b19852eaabedb9da17ed3b8d7ba",
8
+ "packages": [
9
+ {
10
+ "name": "dompdf/dompdf",
11
+ "version": "v1.0.2",
12
+ "source": {
13
+ "type": "git",
14
+ "url": "https://github.com/dompdf/dompdf.git",
15
+ "reference": "8768448244967a46d6e67b891d30878e0e15d25c"
16
+ },
17
+ "dist": {
18
+ "type": "zip",
19
+ "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8768448244967a46d6e67b891d30878e0e15d25c",
20
+ "reference": "8768448244967a46d6e67b891d30878e0e15d25c",
21
+ "shasum": ""
22
+ },
23
+ "require": {
24
+ "ext-dom": "*",
25
+ "ext-mbstring": "*",
26
+ "phenx/php-font-lib": "^0.5.2",
27
+ "phenx/php-svg-lib": "^0.3.3",
28
+ "php": "^7.1 || ^8.0"
29
+ },
30
+ "require-dev": {
31
+ "mockery/mockery": "^1.3",
32
+ "phpunit/phpunit": "^7.5 || ^8 || ^9",
33
+ "squizlabs/php_codesniffer": "^3.5"
34
+ },
35
+ "suggest": {
36
+ "ext-gd": "Needed to process images",
37
+ "ext-gmagick": "Improves image processing performance",
38
+ "ext-imagick": "Improves image processing performance",
39
+ "ext-zlib": "Needed for pdf stream compression"
40
+ },
41
+ "type": "library",
42
+ "extra": {
43
+ "branch-alias": {
44
+ "dev-develop": "0.7-dev"
45
+ }
46
+ },
47
+ "autoload": {
48
+ "psr-4": {
49
+ "Dompdf\\": "src/"
50
+ },
51
+ "classmap": [
52
+ "lib/"
53
+ ]
54
+ },
55
+ "notification-url": "https://packagist.org/downloads/",
56
+ "license": [
57
+ "LGPL-2.1"
58
+ ],
59
+ "authors": [
60
+ {
61
+ "name": "Fabien Ménager",
62
+ "email": "fabien.menager@gmail.com"
63
+ },
64
+ {
65
+ "name": "Brian Sweeney",
66
+ "email": "eclecticgeek@gmail.com"
67
+ },
68
+ {
69
+ "name": "Gabriel Bull",
70
+ "email": "me@gabrielbull.com"
71
+ }
72
+ ],
73
+ "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
74
+ "homepage": "https://github.com/dompdf/dompdf",
75
+ "support": {
76
+ "issues": "https://github.com/dompdf/dompdf/issues",
77
+ "source": "https://github.com/dompdf/dompdf/tree/v1.0.2"
78
+ },
79
+ "time": "2021-01-08T14:18:52+00:00"
80
+ },
81
+ {
82
+ "name": "phenx/php-font-lib",
83
+ "version": "0.5.2",
84
+ "source": {
85
+ "type": "git",
86
+ "url": "https://github.com/PhenX/php-font-lib.git",
87
+ "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8"
88
+ },
89
+ "dist": {
90
+ "type": "zip",
91
+ "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8",
92
+ "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8",
93
+ "shasum": ""
94
+ },
95
+ "require-dev": {
96
+ "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7"
97
+ },
98
+ "type": "library",
99
+ "autoload": {
100
+ "psr-4": {
101
+ "FontLib\\": "src/FontLib"
102
+ }
103
+ },
104
+ "notification-url": "https://packagist.org/downloads/",
105
+ "license": [
106
+ "LGPL-3.0"
107
+ ],
108
+ "authors": [
109
+ {
110
+ "name": "Fabien Ménager",
111
+ "email": "fabien.menager@gmail.com"
112
+ }
113
+ ],
114
+ "description": "A library to read, parse, export and make subsets of different types of font files.",
115
+ "homepage": "https://github.com/PhenX/php-font-lib",
116
+ "support": {
117
+ "issues": "https://github.com/PhenX/php-font-lib/issues",
118
+ "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2"
119
+ },
120
+ "time": "2020-03-08T15:31:32+00:00"
121
+ },
122
+ {
123
+ "name": "phenx/php-svg-lib",
124
+ "version": "v0.3.3",
125
+ "source": {
126
+ "type": "git",
127
+ "url": "https://github.com/PhenX/php-svg-lib.git",
128
+ "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32"
129
+ },
130
+ "dist": {
131
+ "type": "zip",
132
+ "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
133
+ "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
134
+ "shasum": ""
135
+ },
136
+ "require": {
137
+ "sabberworm/php-css-parser": "^8.3"
138
+ },
139
+ "require-dev": {
140
+ "phpunit/phpunit": "^5.5|^6.5"
141
+ },
142
+ "type": "library",
143
+ "autoload": {
144
+ "psr-4": {
145
+ "Svg\\": "src/Svg"
146
+ }
147
+ },
148
+ "notification-url": "https://packagist.org/downloads/",
149
+ "license": [
150
+ "LGPL-3.0"
151
+ ],
152
+ "authors": [
153
+ {
154
+ "name": "Fabien Ménager",
155
+ "email": "fabien.menager@gmail.com"
156
+ }
157
+ ],
158
+ "description": "A library to read, parse and export to PDF SVG files.",
159
+ "homepage": "https://github.com/PhenX/php-svg-lib",
160
+ "support": {
161
+ "issues": "https://github.com/PhenX/php-svg-lib/issues",
162
+ "source": "https://github.com/PhenX/php-svg-lib/tree/master"
163
+ },
164
+ "time": "2019-09-11T20:02:13+00:00"
165
+ },
166
+ {
167
+ "name": "sabberworm/php-css-parser",
168
+ "version": "8.3.1",
169
+ "source": {
170
+ "type": "git",
171
+ "url": "https://github.com/sabberworm/PHP-CSS-Parser.git",
172
+ "reference": "d217848e1396ef962fb1997cf3e2421acba7f796"
173
+ },
174
+ "dist": {
175
+ "type": "zip",
176
+ "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796",
177
+ "reference": "d217848e1396ef962fb1997cf3e2421acba7f796",
178
+ "shasum": ""
179
+ },
180
+ "require": {
181
+ "php": ">=5.3.2"
182
+ },
183
+ "require-dev": {
184
+ "codacy/coverage": "^1.4",
185
+ "phpunit/phpunit": "~4.8"
186
+ },
187
+ "type": "library",
188
+ "autoload": {
189
+ "psr-0": {
190
+ "Sabberworm\\CSS": "lib/"
191
+ }
192
+ },
193
+ "notification-url": "https://packagist.org/downloads/",
194
+ "license": [
195
+ "MIT"
196
+ ],
197
+ "authors": [
198
+ {
199
+ "name": "Raphael Schweikert"
200
+ }
201
+ ],
202
+ "description": "Parser for CSS Files written in PHP",
203
+ "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser",
204
+ "keywords": [
205
+ "css",
206
+ "parser",
207
+ "stylesheet"
208
+ ],
209
+ "support": {
210
+ "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues",
211
+ "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1"
212
+ },
213
+ "time": "2020-06-01T09:10:00+00:00"
214
+ },
215
+ {
216
+ "name": "symfony/polyfill-mbstring",
217
+ "version": "v1.20.0",
218
+ "source": {
219
+ "type": "git",
220
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
221
+ "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
222
+ },
223
+ "dist": {
224
+ "type": "zip",
225
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
226
+ "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
227
+ "shasum": ""
228
+ },
229
+ "require": {
230
+ "php": ">=7.1"
231
+ },
232
+ "suggest": {
233
+ "ext-mbstring": "For best performance"
234
+ },
235
+ "type": "library",
236
+ "extra": {
237
+ "branch-alias": {
238
+ "dev-main": "1.20-dev"
239
+ },
240
+ "thanks": {
241
+ "name": "symfony/polyfill",
242
+ "url": "https://github.com/symfony/polyfill"
243
+ }
244
+ },
245
+ "autoload": {
246
+ "psr-4": {
247
+ "Symfony\\Polyfill\\Mbstring\\": ""
248
+ },
249
+ "files": [
250
+ "bootstrap.php"
251
+ ]
252
+ },
253
+ "notification-url": "https://packagist.org/downloads/",
254
+ "license": [
255
+ "MIT"
256
+ ],
257
+ "authors": [
258
+ {
259
+ "name": "Nicolas Grekas",
260
+ "email": "p@tchwork.com"
261
+ },
262
+ {
263
+ "name": "Symfony Community",
264
+ "homepage": "https://symfony.com/contributors"
265
+ }
266
+ ],
267
+ "description": "Symfony polyfill for the Mbstring extension",
268
+ "homepage": "https://symfony.com",
269
+ "keywords": [
270
+ "compatibility",
271
+ "mbstring",
272
+ "polyfill",
273
+ "portable",
274
+ "shim"
275
+ ],
276
+ "support": {
277
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0"
278
+ },
279
+ "funding": [
280
+ {
281
+ "url": "https://symfony.com/sponsor",
282
+ "type": "custom"
283
+ },
284
+ {
285
+ "url": "https://github.com/fabpot",
286
+ "type": "github"
287
+ },
288
+ {
289
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
290
+ "type": "tidelift"
291
+ }
292
+ ],
293
+ "time": "2020-10-23T14:02:19+00:00"
294
+ }
295
+ ],
296
+ "packages-dev": [],
297
+ "aliases": [],
298
+ "minimum-stability": "stable",
299
+ "stability-flags": [],
300
+ "prefer-stable": false,
301
+ "prefer-lowest": false,
302
+ "platform": [],
303
+ "platform-dev": [],
304
+ "plugin-api-version": "2.0.0"
305
+ }
includes/class-wcpdf-admin.php CHANGED
@@ -89,12 +89,12 @@ class Admin {
89
  ?>
90
  <div class="notice notice-info is-dismissible wpo-wcpdf-review-notice">
91
  <?php /* translators: rounded count */ ?>
92
- <h3><?php printf( __( 'Wow, you have created more than %d invoices with our plugin!', 'woocommerce-pdf-invoices-packing-slips' ), $rounded_count ); ?></h3>
93
- <p><?php _e( 'It would mean a lot to us if you would quickly give our plugin a 5-star rating. Help us spread the word and boost our motivation!', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
94
  <ul>
95
- <li><a href="https://wordpress.org/support/plugin/woocommerce-pdf-invoices-packing-slips/reviews/?rate=5#new-post" class="button"><?php _e( 'Yes you deserve it!', 'woocommerce-pdf-invoices-packing-slips' ); ?></span></a></li>
96
- <li><a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_dismis_review', true ) ); ?>" class="wpo-wcpdf-dismiss"><?php _e( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ); ?> / <?php _e( 'Already did!', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></li>
97
- <li><a href="mailto:support@wpovernight.com?Subject=Here%20is%20how%20I%20think%20you%20can%20do%20better"><?php _e( 'Actually, I have a complaint...', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></li>
98
  </ul>
99
  </div>
100
  <script type="text/javascript">
@@ -129,8 +129,8 @@ class Admin {
129
  if ( get_transient( 'wpo_wcpdf_new_install' ) !== false ) {
130
  ?>
131
  <div class="notice notice-info is-dismissible wpo-wcpdf-install-notice">
132
- <p><strong><?php _e( 'New to WooCommerce PDF Invoices & Packing Slips?', 'woocommerce-pdf-invoices-packing-slips' ); ?></strong> &#8211; <?php _e( 'Jumpstart the plugin by following our wizard!', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
133
- <p class="submit"><a href="<?php echo esc_url( admin_url( 'admin.php?page=wpo-wcpdf-setup' ) ); ?>" class="button-primary"><?php _e( 'Run the Setup Wizard', 'woocommerce-pdf-invoices-packing-slips' ); ?></a> <a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_dismis_install', true ) ); ?>" class="wpo-wcpdf-dismiss-wizard"><?php _e( 'I am the wizard', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
134
  </div>
135
  <script type="text/javascript">
136
  jQuery( function( $ ) {
@@ -179,14 +179,20 @@ class Admin {
179
 
180
  $listing_actions = array();
181
  $documents = WPO_WCPDF()->documents->get_documents();
182
- foreach ($documents as $document) {
183
  $document_title = $document->get_title();
184
- $icon = !empty($document->icon) ? $document->icon : WPO_WCPDF()->plugin_url() . "/assets/images/generic_document.png";
185
  if ( $document = wcpdf_get_document( $document->get_type(), $order ) ) {
 
 
 
 
 
186
  $document_title = is_callable( array( $document, 'get_title' ) ) ? $document->get_title() : $document_title;
187
  $document_exists = is_callable( array( $document, 'exists' ) ) ? $document->exists() : false;
 
188
  $listing_actions[$document->get_type()] = array(
189
- 'url' => wp_nonce_url( admin_url( "admin-ajax.php?action=generate_wpo_wcpdf&document_type={$document->get_type()}&order_ids=" . WCX_Order::get_id( $order ) ), 'generate_wpo_wcpdf' ),
190
  'img' => $icon,
191
  'alt' => "PDF " . $document_title,
192
  'exists' => $document_exists,
@@ -201,9 +207,14 @@ class Admin {
201
  if ( !isset( $data['class'] ) ) {
202
  $data['class'] = $data['exists'] ? "exists " . $action : $action;
203
  }
204
- ?><a href="<?php echo $data['url']; ?>" class="button tips wpo_wcpdf <?php echo $data['class']; ?>" target="_blank" alt="<?php echo $data['alt']; ?>" data-tip="<?php echo $data['alt']; ?>">
205
- <img src="<?php echo $data['img']; ?>" alt="<?php echo $data['alt']; ?>" width="16">
206
- </a><?php
 
 
 
 
 
207
  }
208
  }
209
 
@@ -320,7 +331,7 @@ class Admin {
320
  <input type="submit" class="button save_order button-primary" name="save" value="<?php esc_attr_e( 'Save order & send email', 'woocommerce-pdf-invoices-packing-slips' ); ?>" />
321
  <?php
322
  $title = __( 'Send email', 'woocommerce-pdf-invoices-packing-slips' );
323
- $url = wp_nonce_url( add_query_arg('wpo_wcpdf_action','resend_email'), 'generate_wpo_wcpdf' );
324
  ?>
325
  </li>
326
  </ul>
@@ -337,13 +348,18 @@ class Admin {
337
  $meta_box_actions = array();
338
  $documents = WPO_WCPDF()->documents->get_documents();
339
  $order = WCX::get_order( $post->ID );
340
- foreach ($documents as $document) {
341
  $document_title = $document->get_title();
342
  if ( $document = wcpdf_get_document( $document->get_type(), $order ) ) {
 
 
 
 
 
343
  $document_title = is_callable( array( $document, 'get_title' ) ) ? $document->get_title() : $document_title;
344
  $meta_box_actions[$document->get_type()] = array(
345
- 'url' => wp_nonce_url( admin_url( "admin-ajax.php?action=generate_wpo_wcpdf&document_type={$document->get_type()}&order_ids=" . $post_id ), 'generate_wpo_wcpdf' ),
346
- 'alt' => esc_attr( "PDF " . $document_title ),
347
  'title' => "PDF " . $document_title,
348
  'exists' => is_callable( array( $document, 'exists' ) ) ? $document->exists() : false,
349
  );
@@ -356,8 +372,14 @@ class Admin {
356
  <ul class="wpo_wcpdf-actions">
357
  <?php
358
  foreach ($meta_box_actions as $document_type => $data) {
359
- $exists = ( isset( $data['exists'] ) && $data['exists'] == true ) ? 'exists' : '';
360
- printf('<li><a href="%1$s" class="button %4$s" target="_blank" alt="%2$s">%3$s</a></li>', $data['url'], $data['alt'], $data['title'], $exists);
 
 
 
 
 
 
361
  }
362
  ?>
363
  </ul>
@@ -428,11 +450,11 @@ class Admin {
428
  if( empty( $document ) || empty( $data ) ) return;
429
  $data = $this->get_current_values_for_document( $document, $data );
430
  ?>
431
- <div class="wcpdf-data-fields" data-document="<?= $document->get_type(); ?>" data-order_id="<?php echo WCX_Order::get_id( $document->order ); ?>">
432
  <section class="wcpdf-data-fields-section number-date">
433
  <!-- Title -->
434
  <h4>
435
- <?= $document->get_title(); ?>
436
  <?php if( $document->exists() && ( isset( $data['number'] ) || isset( $data['date'] ) ) ) : ?>
437
  <span class="wpo-wcpdf-edit-date-number dashicons dashicons-edit"></span>
438
  <span class="wpo-wcpdf-delete-document dashicons dashicons-trash" data-action="delete" data-nonce="<?php echo wp_create_nonce( "wpo_wcpdf_delete_document" ); ?>"></span>
@@ -444,21 +466,21 @@ class Admin {
444
  <div class="read-only">
445
  <?php if( $document->exists() ) : ?>
446
  <?php if( isset( $data['number'] ) ) : ?>
447
- <div class="<?= $document->get_type(); ?>-number">
448
- <p class="form-field <?= $data['number']['name']; ?>_field">
449
  <p>
450
- <span><strong><?= $data['number']['label']; ?></strong></span>
451
- <span><?= $data['number']['formatted']; ?></span>
452
  </p>
453
  </p>
454
  </div>
455
  <?php endif; ?>
456
  <?php if( isset( $data['date'] ) ) : ?>
457
- <div class="<?= $document->get_type(); ?>-date">
458
  <p class="form-field form-field-wide">
459
  <p>
460
- <span><strong><?= $data['date']['label']; ?></strong></span>
461
- <span><?= $data['date']['formatted']; ?></span>
462
  </p>
463
  </p>
464
  </div>
@@ -466,22 +488,22 @@ class Admin {
466
  <?php do_action( 'wpo_wcpdf_meta_box_after_document_data', $document, $document->order ); ?>
467
  <?php else : ?>
468
  <?php /* translators: document title */ ?>
469
- <span class="wpo-wcpdf-set-date-number button"><?php printf( __( 'Set %s number & date', 'woocommerce-pdf-invoices-packing-slips' ), $document->get_title() ); ?></span>
470
  <?php endif; ?>
471
  </div>
472
 
473
  <!-- Editable -->
474
  <div class="editable">
475
  <?php if( isset( $data['number'] ) ) : ?>
476
- <p class="form-field <?= $data['number']['name']; ?>_field ">
477
- <label for="<?= $data['number']['name']; ?>"><?= $data['number']['label']; ?></label>
478
- <input type="text" class="short" style="" name="<?= $data['number']['name']; ?>" id="<?= $data['number']['name']; ?>" value="<?= $data['number']['plain']; ?>" disabled="disabled" > (<?= __( 'unformatted!', 'woocommerce-pdf-invoices-packing-slips' ) ?>)
479
  </p>
480
  <?php endif; ?>
481
  <?php if( isset( $data['date'] ) ) : ?>
482
  <p class="form-field form-field-wide">
483
- <label for="<?= $data['date']['name'] ?>[date]"><?= $data['date']['label']; ?></label>
484
- <input type="text" class="date-picker-field" name="<?= $data['date']['name'] ?>[date]" id="<?= $data['date']['name'] ?>[date]" maxlength="10" value="<?= $data['date']['date']; ?>" pattern="[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])" disabled="disabled"/>@<input type="number" class="hour" disabled="disabled" placeholder="<?php _e( 'h', 'woocommerce' ); ?>" name="<?= $data['date']['name']; ?>[hour]" id="<?= $data['date']['name']; ?>[hour]" min="0" max="23" size="2" value="<?= $data['date']['hour']; ?>" pattern="([01]?[0-9]{1}|2[0-3]{1})" />:<input type="number" class="minute" placeholder="<?php _e( 'm', 'woocommerce' ); ?>" name="<?= $data['date']['name']; ?>[minute]" id="<?= $data['date']['name']; ?>[minute]" min="0" max="59" size="2" value="<?= $data['date']['minute']; ?>" pattern="[0-5]{1}[0-9]{1}" disabled="disabled" />
485
  </p>
486
  <?php endif; ?>
487
  </div>
@@ -493,15 +515,15 @@ class Admin {
493
 
494
  <!-- Read only -->
495
  <div class="read-only">
496
- <span><strong><?= $data['notes']['label']; ?></strong></span>
497
  <span class="wpo-wcpdf-edit-document-notes dashicons dashicons-edit" data-edit="notes"></span>
498
- <p><?= ( $data['notes']['value'] == strip_tags( $data['notes']['value'] ) ) ? nl2br( $data['notes']['value'] ) : $data['notes']['value']; ?></p>
499
  </div>
500
  <!-- Editable -->
501
  <div class="editable-notes">
502
  <p class="form-field form-field-wide">
503
- <label for="<?= $data['notes']['name']; ?>"><?= $data['notes']['label']; ?></label>
504
- <p><textarea name="<?= $data['notes']['name']; ?>" class="<?= $data['notes']['name']; ?>" cols="60" rows="5" disabled="disabled"><?= $data['notes']['value']; ?></textarea></p>
505
  </p>
506
  </div>
507
 
@@ -515,8 +537,8 @@ class Admin {
515
  <!-- Save/Cancel buttons -->
516
  <section class="wcpdf-data-fields-section wpo-wcpdf-document-buttons">
517
  <div>
518
- <a class="button button-primary wpo-wcpdf-save-document" data-nonce="<?php echo wp_create_nonce( "wpo_wcpdf_save_document" ); ?>" data-action="save"><?php _e( 'Save changes', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
519
- <a class="button wpo-wcpdf-cancel"><?php _e( 'Cancel', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
520
  </div>
521
  </section>
522
  <!-- / Save/Cancel buttons -->
@@ -595,7 +617,7 @@ class Admin {
595
 
596
  if ( $is_new ) {
597
  /* translators: name/description of the context for document creation logs */
598
- WPO_WCPDF()->main->log_to_order_notes( $invoice, __( 'order details (number and/or date set manually)', 'woocommerce-pdf-invoices-packing-slips' ) );
599
  }
600
  }
601
 
@@ -644,7 +666,7 @@ class Admin {
644
  if ( $mail->id == $email_to_send ) {
645
  $mail->trigger( $order->get_id(), $order );
646
  /* translators: %s: email title */
647
- $order->add_order_note( sprintf( __( '%s email notification manually sent.', 'woocommerce-pdf-invoices-packing-slips' ), $mail->title ), false, true );
648
  }
649
  }
650
  }
@@ -731,25 +753,25 @@ class Admin {
731
  public function ajax_crud_document() {
732
  if ( check_ajax_referer( 'wpo_wcpdf_regenerate_document', 'security', false ) === false && check_ajax_referer( 'wpo_wcpdf_save_document', 'security', false ) === false && check_ajax_referer( 'wpo_wcpdf_delete_document', 'security', false ) === false ) {
733
  wp_send_json_error( array(
734
- 'message' => __( 'Nonce expired!', 'woocommerce-pdf-invoices-packing-slips' ),
735
  ) );
736
  }
737
 
738
  if ( ! isset($_POST['action']) || ! in_array( $_POST['action'], array( 'wpo_wcpdf_regenerate_document', 'wpo_wcpdf_save_document', 'wpo_wcpdf_delete_document' ) ) ) {
739
  wp_send_json_error( array(
740
- 'message' => __( 'Bad action!', 'woocommerce-pdf-invoices-packing-slips' ),
741
  ) );
742
  }
743
 
744
  if( empty($_POST['order_id']) || empty($_POST['document_type']) || empty($_POST['action_type']) ) {
745
  wp_send_json_error( array(
746
- 'message' => __( 'Incomplete request!', 'woocommerce-pdf-invoices-packing-slips' ),
747
  ) );
748
  }
749
 
750
  if ( !current_user_can('manage_woocommerce') ) {
751
  wp_send_json_error( array(
752
- 'message' => __( 'No permissions!', 'woocommerce-pdf-invoices-packing-slips' ),
753
  ) );
754
  }
755
 
@@ -829,7 +851,7 @@ class Admin {
829
 
830
  if ( $is_new ) {
831
  /* translators: name/description of the context for document creation logs */
832
- WPO_WCPDF()->main->log_to_order_notes( $document, __( 'order details (number and/or date set manually)', 'woocommerce-pdf-invoices-packing-slips' ) );
833
  }
834
 
835
  $response = array(
@@ -840,21 +862,26 @@ class Admin {
840
  } else {
841
  $message_complement = __( 'Document does not exist.', 'woocommerce-pdf-invoices-packing-slips' );
842
  wp_send_json_error( array(
843
- 'message' => $notice_messages[$notice]['error'] . ' ' . $message_complement,
844
  ) );
845
  }
846
 
 
 
 
 
 
847
  wp_send_json_success( $response );
848
 
849
  } else {
850
  $message_complement = __( 'Document is empty.', 'woocommerce-pdf-invoices-packing-slips' );
851
  wp_send_json_error( array(
852
- 'message' => $notice_messages[$notice]['error'] . ' ' . $message_complement,
853
  ) );
854
  }
855
- } catch ( \Exception $e ) {
856
  wp_send_json_error( array(
857
- 'message' => $notice_messages[$notice]['error'] . ' ' . $e->getMessage(),
858
  ) );
859
  }
860
  }
@@ -881,7 +908,7 @@ class Admin {
881
  $title = __( 'DEBUG output enabled', 'woocommerce-pdf-invoices-packing-slips' );
882
  $args = array(
883
  'id' => 'admin_bar_wpo_debug_mode',
884
- 'title' => sprintf( '<a href="%s" style="background-color: red; color: white;">%s</a>', $status_settings_url, $title ),
885
  );
886
  $wp_admin_bar->add_node( $args );
887
  }
89
  ?>
90
  <div class="notice notice-info is-dismissible wpo-wcpdf-review-notice">
91
  <?php /* translators: rounded count */ ?>
92
+ <h3><?php printf( esc_html__( 'Wow, you have created more than %d invoices with our plugin!', 'woocommerce-pdf-invoices-packing-slips' ), $rounded_count ); ?></h3>
93
+ <p><?php esc_html_e( 'It would mean a lot to us if you would quickly give our plugin a 5-star rating. Help us spread the word and boost our motivation!', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
94
  <ul>
95
+ <li><a href="https://wordpress.org/support/plugin/woocommerce-pdf-invoices-packing-slips/reviews/?rate=5#new-post" class="button"><?php esc_html_e( 'Yes you deserve it!', 'woocommerce-pdf-invoices-packing-slips' ); ?></span></a></li>
96
+ <li><a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_dismis_review', true ) ); ?>" class="wpo-wcpdf-dismiss"><?php esc_html_e( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ); ?> / <?php esc_html_e( 'Already did!', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></li>
97
+ <li><a href="mailto:support@wpovernight.com?Subject=Here%20is%20how%20I%20think%20you%20can%20do%20better"><?php esc_html_e( 'Actually, I have a complaint...', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></li>
98
  </ul>
99
  </div>
100
  <script type="text/javascript">
129
  if ( get_transient( 'wpo_wcpdf_new_install' ) !== false ) {
130
  ?>
131
  <div class="notice notice-info is-dismissible wpo-wcpdf-install-notice">
132
+ <p><strong><?php esc_html_e( 'New to WooCommerce PDF Invoices & Packing Slips?', 'woocommerce-pdf-invoices-packing-slips' ); ?></strong> &#8211; <?php esc_html_e( 'Jumpstart the plugin by following our wizard!', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
133
+ <p class="submit"><a href="<?php echo esc_url( admin_url( 'admin.php?page=wpo-wcpdf-setup' ) ); ?>" class="button-primary"><?php esc_html_e( 'Run the Setup Wizard', 'woocommerce-pdf-invoices-packing-slips' ); ?></a> <a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_dismis_install', true ) ); ?>" class="wpo-wcpdf-dismiss-wizard"><?php esc_html_e( 'I am the wizard', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
134
  </div>
135
  <script type="text/javascript">
136
  jQuery( function( $ ) {
179
 
180
  $listing_actions = array();
181
  $documents = WPO_WCPDF()->documents->get_documents();
182
+ foreach ( $documents as $document ) {
183
  $document_title = $document->get_title();
184
+ $icon = ! empty( $document->icon ) ? $document->icon : WPO_WCPDF()->plugin_url() . "/assets/images/generic_document.png";
185
  if ( $document = wcpdf_get_document( $document->get_type(), $order ) ) {
186
+ $pdf_url = wp_nonce_url( add_query_arg( array(
187
+ 'action' => 'generate_wpo_wcpdf',
188
+ 'document_type' => $document->get_type(),
189
+ 'order_ids' => WCX_Order::get_id( $order ),
190
+ ), admin_url( 'admin-ajax.php' ) ), 'generate_wpo_wcpdf' );
191
  $document_title = is_callable( array( $document, 'get_title' ) ) ? $document->get_title() : $document_title;
192
  $document_exists = is_callable( array( $document, 'exists' ) ) ? $document->exists() : false;
193
+
194
  $listing_actions[$document->get_type()] = array(
195
+ 'url' => $pdf_url,
196
  'img' => $icon,
197
  'alt' => "PDF " . $document_title,
198
  'exists' => $document_exists,
207
  if ( !isset( $data['class'] ) ) {
208
  $data['class'] = $data['exists'] ? "exists " . $action : $action;
209
  }
210
+
211
+ printf(
212
+ '<a href="%1$s" class="button tips wpo_wcpdf %2$s" target="_blank" alt="%3$s" data-tip="%3$s"><img src="%4$s" alt="%3$s" width="16"></a>',
213
+ esc_attr( $data['url'] ),
214
+ esc_attr( $data['class'] ),
215
+ esc_attr( $data['alt'] ),
216
+ esc_attr( $data['img'] ),
217
+ );
218
  }
219
  }
220
 
331
  <input type="submit" class="button save_order button-primary" name="save" value="<?php esc_attr_e( 'Save order & send email', 'woocommerce-pdf-invoices-packing-slips' ); ?>" />
332
  <?php
333
  $title = __( 'Send email', 'woocommerce-pdf-invoices-packing-slips' );
334
+ $url = wp_nonce_url( add_query_arg( 'wpo_wcpdf_action', 'resend_email' ), 'generate_wpo_wcpdf' );
335
  ?>
336
  </li>
337
  </ul>
348
  $meta_box_actions = array();
349
  $documents = WPO_WCPDF()->documents->get_documents();
350
  $order = WCX::get_order( $post->ID );
351
+ foreach ( $documents as $document ) {
352
  $document_title = $document->get_title();
353
  if ( $document = wcpdf_get_document( $document->get_type(), $order ) ) {
354
+ $pdf_url = wp_nonce_url( add_query_arg( array(
355
+ 'action' => 'generate_wpo_wcpdf',
356
+ 'document_type' => $document->get_type(),
357
+ 'order_ids' => $post_id,
358
+ ), admin_url( 'admin-ajax.php' ) ), 'generate_wpo_wcpdf' );
359
  $document_title = is_callable( array( $document, 'get_title' ) ) ? $document->get_title() : $document_title;
360
  $meta_box_actions[$document->get_type()] = array(
361
+ 'url' => $pdf_url,
362
+ 'alt' => "PDF " . $document_title,
363
  'title' => "PDF " . $document_title,
364
  'exists' => is_callable( array( $document, 'exists' ) ) ? $document->exists() : false,
365
  );
372
  <ul class="wpo_wcpdf-actions">
373
  <?php
374
  foreach ($meta_box_actions as $document_type => $data) {
375
+ $data['class'] = ( isset( $data['exists'] ) && $data['exists'] == true ) ? 'exists' : '';
376
+ printf(
377
+ '<li><a href="%1$s" class="button %2$s" target="_blank" alt="%3$s">%4$s</a></li>',
378
+ esc_attr( $data['url'] ),
379
+ esc_attr( $data['class'] ),
380
+ esc_attr( $data['alt'] ),
381
+ esc_html( $data['title'] ),
382
+ );
383
  }
384
  ?>
385
  </ul>
450
  if( empty( $document ) || empty( $data ) ) return;
451
  $data = $this->get_current_values_for_document( $document, $data );
452
  ?>
453
+ <div class="wcpdf-data-fields" data-document="<?= esc_attr( $document->get_type() ); ?>" data-order_id="<?php echo esc_attr( WCX_Order::get_id( $document->order ) ); ?>">
454
  <section class="wcpdf-data-fields-section number-date">
455
  <!-- Title -->
456
  <h4>
457
+ <?php echo wp_kses_post( $document->get_title() ); ?>
458
  <?php if( $document->exists() && ( isset( $data['number'] ) || isset( $data['date'] ) ) ) : ?>
459
  <span class="wpo-wcpdf-edit-date-number dashicons dashicons-edit"></span>
460
  <span class="wpo-wcpdf-delete-document dashicons dashicons-trash" data-action="delete" data-nonce="<?php echo wp_create_nonce( "wpo_wcpdf_delete_document" ); ?>"></span>
466
  <div class="read-only">
467
  <?php if( $document->exists() ) : ?>
468
  <?php if( isset( $data['number'] ) ) : ?>
469
+ <div class="<?= esc_attr( $document->get_type() ); ?>-number">
470
+ <p class="form-field <?= esc_attr( $data['number']['name'] ); ?>_field">
471
  <p>
472
+ <span><strong><?= wp_kses_post( $data['number']['label'] ); ?></strong></span>
473
+ <span><?= esc_attr( $data['number']['formatted'] ); ?></span>
474
  </p>
475
  </p>
476
  </div>
477
  <?php endif; ?>
478
  <?php if( isset( $data['date'] ) ) : ?>
479
+ <div class="<?= esc_attr( $document->get_type() ); ?>-number">
480
  <p class="form-field form-field-wide">
481
  <p>
482
+ <span><strong><?= wp_kses_post( $data['date']['label'] ); ?></strong></span>
483
+ <span><?= esc_attr( $data['date']['formatted'] ); ?></span>
484
  </p>
485
  </p>
486
  </div>
488
  <?php do_action( 'wpo_wcpdf_meta_box_after_document_data', $document, $document->order ); ?>
489
  <?php else : ?>
490
  <?php /* translators: document title */ ?>
491
+ <span class="wpo-wcpdf-set-date-number button"><?php printf( esc_html__( 'Set %s number & date', 'woocommerce-pdf-invoices-packing-slips' ), wp_kses_post( $document->get_title() ) ); ?></span>
492
  <?php endif; ?>
493
  </div>
494
 
495
  <!-- Editable -->
496
  <div class="editable">
497
  <?php if( isset( $data['number'] ) ) : ?>
498
+ <p class="form-field <?= esc_attr( $data['number']['name'] ); ?>_field">
499
+ <label for="<?= esc_attr( $data['number']['name'] ); ?>"><?= wp_kses_post( $data['number']['label'] ); ?></label>
500
+ <input type="text" class="short" style="" name="<?= esc_attr( $data['number']['name'] ); ?>" id="<?= esc_attr( $data['number']['name'] ); ?>" value="<?= esc_attr( $data['number']['plain'] ); ?>" disabled="disabled" > (<?= esc_html__( 'unformatted!', 'woocommerce-pdf-invoices-packing-slips' ); ?>)
501
  </p>
502
  <?php endif; ?>
503
  <?php if( isset( $data['date'] ) ) : ?>
504
  <p class="form-field form-field-wide">
505
+ <label for="<?= esc_attr( $data['date']['name'] ); ?>[date]"><?= wp_kses_post( $data['date']['label'] ); ?></label>
506
+ <input type="text" class="date-picker-field" name="<?= esc_attr( $data['date']['name'] ); ?>[date]" id="<?= esc_attr( $data['date']['name'] ); ?>[date]" maxlength="10" value="<?= esc_attr( $data['date']['date'] ); ?>" pattern="[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])" disabled="disabled"/>@<input type="number" class="hour" disabled="disabled" placeholder="<?php esc_attr_e( 'h', 'woocommerce' ); ?>" name="<?= esc_attr( $data['date']['name'] ); ?>[hour]" id="<?= esc_attr( $data['date']['name'] ); ?>[hour]" min="0" max="23" size="2" value="<?= esc_attr( $data['date']['hour'] ); ?>" pattern="([01]?[0-9]{1}|2[0-3]{1})" />:<input type="number" class="minute" placeholder="<?php esc_attr_e( 'm', 'woocommerce' ); ?>" name="<?= esc_attr( $data['date']['name'] ); ?>[minute]" id="<?= esc_attr( $data['date']['name'] ); ?>[minute]" min="0" max="59" size="2" value="<?= esc_attr( $data['date']['minute'] ); ?>" pattern="[0-5]{1}[0-9]{1}" disabled="disabled" />
507
  </p>
508
  <?php endif; ?>
509
  </div>
515
 
516
  <!-- Read only -->
517
  <div class="read-only">
518
+ <span><strong><?= wp_kses_post( $data['notes']['label'] ); ?></strong></span>
519
  <span class="wpo-wcpdf-edit-document-notes dashicons dashicons-edit" data-edit="notes"></span>
520
+ <p><?= ( $data['notes']['value'] == strip_tags( $data['notes']['value'] ) ) ? wp_kses_post( nl2br( $data['notes']['value'] ) ) : wp_kses_post( $data['notes']['value'] ); ?></p>
521
  </div>
522
  <!-- Editable -->
523
  <div class="editable-notes">
524
  <p class="form-field form-field-wide">
525
+ <label for="<?= esc_attr( $data['notes']['name'] ); ?>"><?= wp_kses_post( $data['notes']['label'] ); ?></label>
526
+ <p><textarea name="<?= esc_attr( $data['notes']['name'] ); ?>" class="<?= esc_attr( $data['notes']['name'] ); ?>" cols="60" rows="5" disabled="disabled"><?= wp_kses_post( $data['notes']['value'] ); ?></textarea></p>
527
  </p>
528
  </div>
529
 
537
  <!-- Save/Cancel buttons -->
538
  <section class="wcpdf-data-fields-section wpo-wcpdf-document-buttons">
539
  <div>
540
+ <a class="button button-primary wpo-wcpdf-save-document" data-nonce="<?php echo wp_create_nonce( "wpo_wcpdf_save_document" ); ?>" data-action="save"><?php esc_html_e( 'Save changes', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
541
+ <a class="button wpo-wcpdf-cancel"><?php esc_html_e( 'Cancel', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
542
  </div>
543
  </section>
544
  <!-- / Save/Cancel buttons -->
617
 
618
  if ( $is_new ) {
619
  /* translators: name/description of the context for document creation logs */
620
+ WPO_WCPDF()->main->log_to_order_notes( $invoice, esc_html__( 'order details (number and/or date set manually)', 'woocommerce-pdf-invoices-packing-slips' ) );
621
  }
622
  }
623
 
666
  if ( $mail->id == $email_to_send ) {
667
  $mail->trigger( $order->get_id(), $order );
668
  /* translators: %s: email title */
669
+ $order->add_order_note( sprintf( esc_html__( '%s email notification manually sent.', 'woocommerce-pdf-invoices-packing-slips' ), $mail->title ), false, true );
670
  }
671
  }
672
  }
753
  public function ajax_crud_document() {
754
  if ( check_ajax_referer( 'wpo_wcpdf_regenerate_document', 'security', false ) === false && check_ajax_referer( 'wpo_wcpdf_save_document', 'security', false ) === false && check_ajax_referer( 'wpo_wcpdf_delete_document', 'security', false ) === false ) {
755
  wp_send_json_error( array(
756
+ 'message' => esc_html__( 'Nonce expired!', 'woocommerce-pdf-invoices-packing-slips' ),
757
  ) );
758
  }
759
 
760
  if ( ! isset($_POST['action']) || ! in_array( $_POST['action'], array( 'wpo_wcpdf_regenerate_document', 'wpo_wcpdf_save_document', 'wpo_wcpdf_delete_document' ) ) ) {
761
  wp_send_json_error( array(
762
+ 'message' => esc_html__( 'Bad action!', 'woocommerce-pdf-invoices-packing-slips' ),
763
  ) );
764
  }
765
 
766
  if( empty($_POST['order_id']) || empty($_POST['document_type']) || empty($_POST['action_type']) ) {
767
  wp_send_json_error( array(
768
+ 'message' => esc_html__( 'Incomplete request!', 'woocommerce-pdf-invoices-packing-slips' ),
769
  ) );
770
  }
771
 
772
  if ( !current_user_can('manage_woocommerce') ) {
773
  wp_send_json_error( array(
774
+ 'message' => esc_html__( 'No permissions!', 'woocommerce-pdf-invoices-packing-slips' ),
775
  ) );
776
  }
777
 
851
 
852
  if ( $is_new ) {
853
  /* translators: name/description of the context for document creation logs */
854
+ WPO_WCPDF()->main->log_to_order_notes( $document, esc_html__( 'order details (number and/or date set manually)', 'woocommerce-pdf-invoices-packing-slips' ) );
855
  }
856
 
857
  $response = array(
862
  } else {
863
  $message_complement = __( 'Document does not exist.', 'woocommerce-pdf-invoices-packing-slips' );
864
  wp_send_json_error( array(
865
+ 'message' => wp_kses_post( $notice_messages[$notice]['error'] . ' ' . $message_complement ),
866
  ) );
867
  }
868
 
869
+ // clean/escape response message
870
+ if ( ! empty( $response['message'] ) ) {
871
+ $response['message'] = wp_kses_post( $response['message'] );
872
+ }
873
+
874
  wp_send_json_success( $response );
875
 
876
  } else {
877
  $message_complement = __( 'Document is empty.', 'woocommerce-pdf-invoices-packing-slips' );
878
  wp_send_json_error( array(
879
+ 'message' => wp_kses_post( $notice_messages[$notice]['error'] . ' ' . $message_complement ),
880
  ) );
881
  }
882
+ } catch ( \Throwable $e ) {
883
  wp_send_json_error( array(
884
+ 'message' => wp_kses_post( $notice_messages[$notice]['error'] . ' ' . $e->getMessage() ),
885
  ) );
886
  }
887
  }
908
  $title = __( 'DEBUG output enabled', 'woocommerce-pdf-invoices-packing-slips' );
909
  $args = array(
910
  'id' => 'admin_bar_wpo_debug_mode',
911
+ 'title' => sprintf( '<a href="%s" style="background-color: red; color: white;">%s</a>', esc_attr( $status_settings_url ), esc_html( $title ) ),
912
  );
913
  $wp_admin_bar->add_node( $args );
914
  }
includes/class-wcpdf-frontend.php CHANGED
@@ -17,7 +17,7 @@ class Frontend {
17
  add_filter( 'woocommerce_my_account_my_orders_actions', array( $this, 'my_account_pdf_link' ), 10, 2 );
18
  add_filter( 'woocommerce_api_order_response', array( $this, 'woocommerce_api_invoice_number' ), 10, 2 );
19
  add_action( 'wp_enqueue_scripts', array( $this, 'open_my_account_pdf_link_on_new_tab' ), 999 );
20
- add_shortcode( 'wcpdf_download_invoice', array($this, 'download_invoice_shortcode') );
21
  }
22
 
23
  /**
@@ -28,11 +28,16 @@ class Frontend {
28
 
29
  $invoice = wcpdf_get_invoice( $order );
30
  if ( $invoice && $invoice->is_enabled() ) {
31
- $pdf_url = wp_nonce_url( admin_url( 'admin-ajax.php?action=generate_wpo_wcpdf&document_type=invoice&order_ids=' . WCX_Order::get_id( $order ) . '&my-account'), 'generate_wpo_wcpdf' );
 
 
 
 
 
32
 
33
  // check my account button settings
34
- $button_setting = $invoice->get_setting('my_account_buttons', 'available');
35
- switch ($button_setting) {
36
  case 'available':
37
  $invoice_allowed = $invoice->exists();
38
  break;
@@ -43,7 +48,7 @@ class Frontend {
43
  $invoice_allowed = false;
44
  break;
45
  case 'custom':
46
- $allowed_statuses = $button_setting = $invoice->get_setting('my_account_restrict', array());
47
  if ( !empty( $allowed_statuses ) && in_array( WCX_Order::get_status( $order ), array_keys( $allowed_statuses ) ) ) {
48
  $invoice_allowed = true;
49
  } else {
@@ -53,7 +58,7 @@ class Frontend {
53
  }
54
 
55
  // Check if invoice has been created already or if status allows download (filter your own array of allowed statuses)
56
- if ( $invoice_allowed || in_array(WCX_Order::get_status( $order ), apply_filters( 'wpo_wcpdf_myaccount_allowed_order_statuses', array() ) ) ) {
57
  $actions['invoice'] = array(
58
  'url' => $pdf_url,
59
  'name' => apply_filters( 'wpo_wcpdf_myaccount_button_text', $invoice->get_title(), $invoice )
@@ -103,47 +108,65 @@ class Frontend {
103
  * Download invoice frontend shortcode
104
  */
105
  public function download_invoice_shortcode( $atts ) {
106
-
107
- if( is_admin() ) return;
 
 
 
108
 
109
  // Default values
110
- $values = shortcode_atts(array(
111
  'order_id' => '',
112
  'link_text' => ''
113
- ), $atts);
114
- if( !$values ) return;
115
 
116
- global $wp;
 
 
117
 
118
  // Get $order
119
- if( is_checkout() && !empty(is_wc_endpoint_url('order-received')) && empty($values['order_id']) && isset($wp->query_vars['order-received']) ) {
120
- $order = wc_get_order( $wp->query_vars['order-received'] );
121
- } elseif( is_account_page() && !empty(is_wc_endpoint_url('view-order')) && empty($values['order_id']) && isset($wp->query_vars['view-order']) ) {
122
- $order = wc_get_order( $wp->query_vars['view-order'] );
123
- } elseif( !empty($values['order_id']) ) {
 
 
124
  $order = wc_get_order( $values['order_id'] );
125
  }
126
- if( empty($order) || !is_object($order) ) return;
 
 
 
127
 
128
  // Link text
129
- $link_text = __('Download invoice (PDF)', 'woocommerce-pdf-invoices-packing-slips');
130
- if( ! empty($values['link_text']) ) {
131
  $link_text = $values['link_text'];
 
 
132
  }
133
 
134
- // User permissions
135
- $debug_settings = get_option('wpo_wcpdf_settings_debug', array());
136
- $text = null;
 
 
 
 
 
 
137
  if( is_user_logged_in() ) {
138
- $pdf_url = wp_nonce_url( admin_url( 'admin-ajax.php?action=generate_wpo_wcpdf&template_type=invoice&order_ids=' . $order->get_id() . '&my-account'), 'generate_wpo_wcpdf' );
139
- $text = '<p><a href="'.esc_attr($pdf_url).'" target="_blank">'.$link_text.'</a></p>';
140
- } elseif( ! is_user_logged_in() && isset($debug_settings['guest_access']) ) {
141
- $pdf_url = admin_url( 'admin-ajax.php?action=generate_wpo_wcpdf&template_type=invoice&order_ids=' . $order->get_id() . '&order_key=' . $order->get_order_key() );
142
- $text = '<p><a href="'.esc_attr($pdf_url).'" target="_blank">'.$link_text.'</a></p>';
143
  }
 
 
 
144
 
145
  return $text;
146
-
147
  }
148
 
149
  /**
17
  add_filter( 'woocommerce_my_account_my_orders_actions', array( $this, 'my_account_pdf_link' ), 10, 2 );
18
  add_filter( 'woocommerce_api_order_response', array( $this, 'woocommerce_api_invoice_number' ), 10, 2 );
19
  add_action( 'wp_enqueue_scripts', array( $this, 'open_my_account_pdf_link_on_new_tab' ), 999 );
20
+ add_shortcode( 'wcpdf_download_invoice', array( $this, 'download_invoice_shortcode' ) );
21
  }
22
 
23
  /**
28
 
29
  $invoice = wcpdf_get_invoice( $order );
30
  if ( $invoice && $invoice->is_enabled() ) {
31
+ $pdf_url = wp_nonce_url( add_query_arg( array(
32
+ 'action' => 'generate_wpo_wcpdf',
33
+ 'document_type' => 'invoice',
34
+ 'order_ids' => WCX_Order::get_id( $order ),
35
+ 'my-account' => true,
36
+ ), admin_url( 'admin-ajax.php' ) ), 'generate_wpo_wcpdf' );
37
 
38
  // check my account button settings
39
+ $button_setting = $invoice->get_setting( 'my_account_buttons', 'available' );
40
+ switch ( $button_setting ) {
41
  case 'available':
42
  $invoice_allowed = $invoice->exists();
43
  break;
48
  $invoice_allowed = false;
49
  break;
50
  case 'custom':
51
+ $allowed_statuses = $button_setting = $invoice->get_setting( 'my_account_restrict', array() );
52
  if ( !empty( $allowed_statuses ) && in_array( WCX_Order::get_status( $order ), array_keys( $allowed_statuses ) ) ) {
53
  $invoice_allowed = true;
54
  } else {
58
  }
59
 
60
  // Check if invoice has been created already or if status allows download (filter your own array of allowed statuses)
61
+ if ( $invoice_allowed || in_array( WCX_Order::get_status( $order ), apply_filters( 'wpo_wcpdf_myaccount_allowed_order_statuses', array() ) ) ) {
62
  $actions['invoice'] = array(
63
  'url' => $pdf_url,
64
  'name' => apply_filters( 'wpo_wcpdf_myaccount_button_text', $invoice->get_title(), $invoice )
108
  * Download invoice frontend shortcode
109
  */
110
  public function download_invoice_shortcode( $atts ) {
111
+ global $wp;
112
+
113
+ if ( is_admin() ) {
114
+ return;
115
+ }
116
 
117
  // Default values
118
+ $values = shortcode_atts (array(
119
  'order_id' => '',
120
  'link_text' => ''
121
+ ), $atts );
 
122
 
123
+ if ( empty( $values ) ) {
124
+ return;
125
+ }
126
 
127
  // Get $order
128
+ if ( empty( $values['order_id'] ) ) {
129
+ if( is_checkout() && is_wc_endpoint_url( 'order-received' ) && isset( $wp->query_vars['order-received'] ) ) {
130
+ $order = wc_get_order( $wp->query_vars['order-received'] );
131
+ } elseif( is_account_page() && is_wc_endpoint_url( 'view-order' ) && isset( $wp->query_vars['view-order'] ) ) {
132
+ $order = wc_get_order( $wp->query_vars['view-order'] );
133
+ }
134
+ } else {
135
  $order = wc_get_order( $values['order_id'] );
136
  }
137
+
138
+ if ( empty( $order ) || ! is_object( $order ) ) {
139
+ return;
140
+ }
141
 
142
  // Link text
143
+ if( ! empty( $values['link_text'] ) ) {
 
144
  $link_text = $values['link_text'];
145
+ } else {
146
+ $link_text = __( 'Download invoice (PDF)', 'woocommerce-pdf-invoices-packing-slips' );
147
  }
148
 
149
+ // Basic query args for PDF
150
+ $query_args = array(
151
+ 'action' => 'generate_wpo_wcpdf',
152
+ 'document_type' => 'invoice',
153
+ 'order_ids' => $order->get_id(),
154
+ );
155
+
156
+ // Add query args based on user permissions and guest access setting
157
+ $debug_settings = get_option( 'wpo_wcpdf_settings_debug', array() );
158
  if( is_user_logged_in() ) {
159
+ $query_args['my-account'] = true;
160
+ } elseif( ! is_user_logged_in() && isset( $debug_settings['guest_access'] ) ) {
161
+ $query_args['order_key'] = $order->get_order_key();
162
+ } else {
163
+ return; // no business here
164
  }
165
+
166
+ $pdf_url = wp_nonce_url( add_query_arg( $query_args, admin_url( 'admin-ajax.php' ) ), 'generate_wpo_wcpdf' );
167
+ $text = sprintf( '<p><a href="%s" target="_blank">%s</a></p>', esc_attr( $pdf_url ), esc_html( $link_text ) );
168
 
169
  return $text;
 
170
  }
171
 
172
  /**
includes/class-wcpdf-main.php CHANGED
@@ -255,12 +255,12 @@ class Main {
255
  public function generate_pdf_ajax() {
256
  $guest_access = isset( WPO_WCPDF()->settings->debug_settings['guest_access'] );
257
  if ( !$guest_access && current_filter() == 'wp_ajax_nopriv_generate_wpo_wcpdf') {
258
- wp_die( __( 'You do not have sufficient permissions to access this page.', 'woocommerce-pdf-invoices-packing-slips' ) );
259
  }
260
 
261
  // Check the nonce - guest access doesn't use nonces but checks the unique order key (hash)
262
  if( empty( $_GET['action'] ) || ( !$guest_access && !check_admin_referer( $_GET['action'] ) ) ) {
263
- wp_die( __( 'You do not have sufficient permissions to access this page.', 'woocommerce-pdf-invoices-packing-slips' ) );
264
  }
265
 
266
  // Check if all parameters are set
@@ -269,11 +269,11 @@ class Main {
269
  }
270
 
271
  if ( empty( $_GET['order_ids'] ) ) {
272
- wp_die( __( "You haven't selected any orders", 'woocommerce-pdf-invoices-packing-slips' ) );
273
  }
274
 
275
  if( empty( $_GET['document_type'] ) ) {
276
- wp_die( __( 'Some of the export parameters are missing.', 'woocommerce-pdf-invoices-packing-slips' ) );
277
  }
278
 
279
  // debug enabled by URL
@@ -334,7 +334,7 @@ class Main {
334
  $allowed = apply_filters( 'wpo_wcpdf_check_privs', $allowed, $order_ids );
335
 
336
  if ( ! $allowed ) {
337
- wp_die( __( 'You do not have sufficient permissions to access this page.', 'woocommerce-pdf-invoices-packing-slips' ) );
338
  }
339
 
340
  // if we got here, we're safe to go!
@@ -375,7 +375,7 @@ class Main {
375
  }
376
  } else {
377
  /* translators: document type */
378
- wp_die( sprintf( __( "Document of type '%s' for the selected order(s) could not be generated", 'woocommerce-pdf-invoices-packing-slips' ), $document_type ) );
379
  }
380
  } catch ( \Dompdf\Exception $e ) {
381
  $message = 'DOMPDF Exception: '.$e->getMessage();
@@ -600,12 +600,12 @@ class Main {
600
  ?>
601
  <div class="error">
602
  <?php /* translators: 1. plugin name, 2. directory path */ ?>
603
- <p><?php printf( __( 'The %1$s directory %2$s couldn\'t be created or is not writable!', 'woocommerce-pdf-invoices-packing-slips' ), '<strong>WooCommerce PDF Invoices & Packing Slips</strong>' ,'<code>' . $path . '</code>' ); ?></p>
604
- <p><?php _e( 'Please check your directories write permissions or contact your hosting service provider.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
605
- <p><a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_hide_no_dir_notice', 'true' ) ); ?>"><?php _e( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
606
  </div>
607
  <?php
608
- echo ob_get_clean();
609
 
610
  // save option to hide notice
611
  if ( isset( $_GET['wpo_wcpdf_hide_no_dir_notice'] ) ) {
@@ -690,21 +690,21 @@ class Main {
690
 
691
  // get local font dir from filtered options
692
  $dompdf_options = apply_filters( 'wpo_wcpdf_dompdf_options', array(
693
- 'defaultFont' => 'dejavu sans',
694
- 'tempDir' => $this->get_tmp_path('dompdf'),
695
- 'logOutputFile' => $this->get_tmp_path('dompdf') . "/log.htm",
696
- 'fontDir' => $this->get_tmp_path('fonts'),
697
- 'fontCache' => $this->get_tmp_path('fonts'),
698
- 'isRemoteEnabled' => true,
699
- 'isFontSubsettingEnabled' => true,
700
- 'isHtml5ParserEnabled' => true,
701
  ) );
702
  $fontDir = $dompdf_options['fontDir'];
703
 
704
  // merge font family cache with local/custom if present
705
  $font_cache_files = array(
706
- 'cache' => 'dompdf_font_family_cache.php',
707
- 'cache_dist' => 'dompdf_font_family_cache.dist.php',
708
  );
709
  foreach ( $font_cache_files as $font_cache_name => $font_cache_filename ) {
710
  $plugin_fonts = @require $dompdf_font_dir . $font_cache_filename;
@@ -844,7 +844,7 @@ class Main {
844
  if ( !empty($document) && $header_logo_height = $document->get_header_logo_height() ) {
845
  ?>
846
  td.header img {
847
- max-height: <?php echo $header_logo_height; ?>;
848
  }
849
  <?php
850
  }
@@ -887,10 +887,10 @@ class Main {
887
  */
888
  public function remove_order_personal_data_meta( $meta_to_remove ) {
889
  $wcpdf_private_meta = array(
890
- '_wcpdf_invoice_number' => 'numeric_id',
891
- '_wcpdf_invoice_number_data' => 'array',
892
- '_wcpdf_invoice_date' => 'timestamp',
893
- '_wcpdf_invoice_date_formatted' => 'date',
894
  );
895
  return $meta_to_remove + $wcpdf_private_meta;
896
  }
@@ -915,8 +915,8 @@ class Main {
915
  public function export_order_personal_data_meta( $meta_to_export ) {
916
  $private_address_meta = array(
917
  // _wcpdf_invoice_number_data & _wcpdf_invoice_date are duplicates of the below and therefor not included
918
- '_wcpdf_invoice_number' => __( 'Invoice Number', 'woocommerce-pdf-invoices-packing-slips' ),
919
- '_wcpdf_invoice_date_formatted' => __( 'Invoice Date', 'woocommerce-pdf-invoices-packing-slips' ),
920
  );
921
  return $meta_to_export + $private_address_meta;
922
  }
@@ -983,11 +983,11 @@ class Main {
983
  $note = sprintf( $message, $document->get_title(), $created_via );
984
 
985
  if( is_callable( array( $order, 'add_order_note' ) ) ) { // order
986
- $order->add_order_note( $note );
987
  } elseif ( $document->is_refund( $order ) ) { // refund order
988
  $parent_order = $document->get_refund_parent( $order );
989
  if( ! empty( $parent_order ) && is_callable( array( $parent_order, 'add_order_note' ) ) ) {
990
- $parent_order->add_order_note( $note );
991
  }
992
  }
993
  }
@@ -1023,7 +1023,7 @@ class Main {
1023
  $documents = WPO_WCPDF()->documents->get_documents();
1024
  foreach ($documents as $document) {
1025
  /* translators: document title */
1026
- $topics["order.{$document->type}-saved"] = sprintf( __( 'Order %s Saved', 'woocommerce-pdf-invoices-packing-slips' ), $document->get_title() );
1027
  }
1028
  return $topics;
1029
  }
255
  public function generate_pdf_ajax() {
256
  $guest_access = isset( WPO_WCPDF()->settings->debug_settings['guest_access'] );
257
  if ( !$guest_access && current_filter() == 'wp_ajax_nopriv_generate_wpo_wcpdf') {
258
+ wp_die( esc_attr__( 'You do not have sufficient permissions to access this page.', 'woocommerce-pdf-invoices-packing-slips' ) );
259
  }
260
 
261
  // Check the nonce - guest access doesn't use nonces but checks the unique order key (hash)
262
  if( empty( $_GET['action'] ) || ( !$guest_access && !check_admin_referer( $_GET['action'] ) ) ) {
263
+ wp_die( esc_attr__( 'You do not have sufficient permissions to access this page.', 'woocommerce-pdf-invoices-packing-slips' ) );
264
  }
265
 
266
  // Check if all parameters are set
269
  }
270
 
271
  if ( empty( $_GET['order_ids'] ) ) {
272
+ wp_die( esc_attr__( "You haven't selected any orders", 'woocommerce-pdf-invoices-packing-slips' ) );
273
  }
274
 
275
  if( empty( $_GET['document_type'] ) ) {
276
+ wp_die( esc_attr__( 'Some of the export parameters are missing.', 'woocommerce-pdf-invoices-packing-slips' ) );
277
  }
278
 
279
  // debug enabled by URL
334
  $allowed = apply_filters( 'wpo_wcpdf_check_privs', $allowed, $order_ids );
335
 
336
  if ( ! $allowed ) {
337
+ wp_die( esc_attr__( 'You do not have sufficient permissions to access this page.', 'woocommerce-pdf-invoices-packing-slips' ) );
338
  }
339
 
340
  // if we got here, we're safe to go!
375
  }
376
  } else {
377
  /* translators: document type */
378
+ wp_die( sprintf( esc_html__( "Document of type '%s' for the selected order(s) could not be generated", 'woocommerce-pdf-invoices-packing-slips' ), $document_type ) );
379
  }
380
  } catch ( \Dompdf\Exception $e ) {
381
  $message = 'DOMPDF Exception: '.$e->getMessage();
600
  ?>
601
  <div class="error">
602
  <?php /* translators: 1. plugin name, 2. directory path */ ?>
603
+ <p><?php printf( esc_html__( 'The %1$s directory %2$s couldn\'t be created or is not writable!', 'woocommerce-pdf-invoices-packing-slips' ), '<strong>WooCommerce PDF Invoices & Packing Slips</strong>' ,'<code>' . $path . '</code>' ); ?></p>
604
+ <p><?php esc_html_e( 'Please check your directories write permissions or contact your hosting service provider.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
605
+ <p><a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_hide_no_dir_notice', 'true' ) ); ?>"><?php esc_html_e( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
606
  </div>
607
  <?php
608
+ echo wp_kses_post( ob_get_clean() );
609
 
610
  // save option to hide notice
611
  if ( isset( $_GET['wpo_wcpdf_hide_no_dir_notice'] ) ) {
690
 
691
  // get local font dir from filtered options
692
  $dompdf_options = apply_filters( 'wpo_wcpdf_dompdf_options', array(
693
+ 'defaultFont' => 'dejavu sans',
694
+ 'tempDir' => $this->get_tmp_path('dompdf'),
695
+ 'logOutputFile' => $this->get_tmp_path('dompdf') . "/log.htm",
696
+ 'fontDir' => $this->get_tmp_path('fonts'),
697
+ 'fontCache' => $this->get_tmp_path('fonts'),
698
+ 'isRemoteEnabled' => true,
699
+ 'isFontSubsettingEnabled' => true,
700
+ 'isHtml5ParserEnabled' => true,
701
  ) );
702
  $fontDir = $dompdf_options['fontDir'];
703
 
704
  // merge font family cache with local/custom if present
705
  $font_cache_files = array(
706
+ 'cache' => 'dompdf_font_family_cache.php',
707
+ 'cache_dist' => 'dompdf_font_family_cache.dist.php',
708
  );
709
  foreach ( $font_cache_files as $font_cache_name => $font_cache_filename ) {
710
  $plugin_fonts = @require $dompdf_font_dir . $font_cache_filename;
844
  if ( !empty($document) && $header_logo_height = $document->get_header_logo_height() ) {
845
  ?>
846
  td.header img {
847
+ max-height: <?php echo esc_html( $header_logo_height ); ?>;
848
  }
849
  <?php
850
  }
887
  */
888
  public function remove_order_personal_data_meta( $meta_to_remove ) {
889
  $wcpdf_private_meta = array(
890
+ '_wcpdf_invoice_number' => 'numeric_id',
891
+ '_wcpdf_invoice_number_data' => 'array',
892
+ '_wcpdf_invoice_date' => 'timestamp',
893
+ '_wcpdf_invoice_date_formatted' => 'date',
894
  );
895
  return $meta_to_remove + $wcpdf_private_meta;
896
  }
915
  public function export_order_personal_data_meta( $meta_to_export ) {
916
  $private_address_meta = array(
917
  // _wcpdf_invoice_number_data & _wcpdf_invoice_date are duplicates of the below and therefor not included
918
+ '_wcpdf_invoice_number' => esc_html__( 'Invoice Number', 'woocommerce-pdf-invoices-packing-slips' ),
919
+ '_wcpdf_invoice_date_formatted' => esc_html__( 'Invoice Date', 'woocommerce-pdf-invoices-packing-slips' ),
920
  );
921
  return $meta_to_export + $private_address_meta;
922
  }
983
  $note = sprintf( $message, $document->get_title(), $created_via );
984
 
985
  if( is_callable( array( $order, 'add_order_note' ) ) ) { // order
986
+ $order->add_order_note( strip_tags( $note ) );
987
  } elseif ( $document->is_refund( $order ) ) { // refund order
988
  $parent_order = $document->get_refund_parent( $order );
989
  if( ! empty( $parent_order ) && is_callable( array( $parent_order, 'add_order_note' ) ) ) {
990
+ $parent_order->add_order_note( strip_tags( $note ) );
991
  }
992
  }
993
  }
1023
  $documents = WPO_WCPDF()->documents->get_documents();
1024
  foreach ($documents as $document) {
1025
  /* translators: document title */
1026
+ $topics["order.{$document->type}-saved"] = esc_html( sprintf( __( 'Order %s Saved', 'woocommerce-pdf-invoices-packing-slips' ), $document->get_title() ) );
1027
  }
1028
  return $topics;
1029
  }
includes/class-wcpdf-settings-callbacks.php CHANGED
@@ -24,7 +24,7 @@ class Settings_Callbacks {
24
  * @return void.
25
  */
26
  public function debug_section() {
27
- _e( '<b>Warning!</b> The settings below are meant for debugging/development only. Do not use them on a live website!' , 'woocommerce-pdf-invoices-packing-slips' );
28
  }
29
 
30
  /**
@@ -33,7 +33,7 @@ class Settings_Callbacks {
33
  * @return void.
34
  */
35
  public function custom_fields_section() {
36
- _e( 'These are used for the (optional) footer columns in the <em>Modern (Premium)</em> template, but can also be used for other elements in your custom template' , 'woocommerce-pdf-invoices-packing-slips' );
37
  }
38
 
39
  /**
@@ -52,16 +52,16 @@ class Settings_Callbacks {
52
  extract( $this->normalize_settings_args( $args ) );
53
 
54
  // output checkbox
55
- printf( '<input type="checkbox" id="%1$s" name="%2$s" value="%3$s" %4$s %5$s/>', $id, $setting_name, $value, checked( $value, $current, false ), !empty($disabled) ? 'disabled="disabled"' : '' );
56
 
57
  // print store empty input if true
58
  if( $store_unchecked ) {
59
- printf( '<input type="hidden" name="%s[wpo_wcpdf_setting_store_empty][]" value="%s"/>', $option_name, $id );
60
  }
61
 
62
  // output description.
63
- if ( isset( $description ) ) {
64
- printf( '<p class="description">%s</p>', $description );
65
  }
66
  }
67
 
@@ -81,15 +81,15 @@ class Settings_Callbacks {
81
  public function text_input( $args ) {
82
  extract( $this->normalize_settings_args( $args ) );
83
 
84
- if (empty($type)) {
85
  $type = 'text';
86
  }
87
 
88
- printf( '<input type="%1$s" id="%2$s" name="%3$s" value="%4$s" size="%5$s" placeholder="%6$s" %7$s/>', $type, $id, $setting_name, esc_attr( $current ), $size, $placeholder, !empty($disabled) ? 'disabled="disabled"' : '' );
89
 
90
  // output description.
91
- if ( isset( $description ) ) {
92
- printf( '<p class="description">%s</p>', $description );
93
  }
94
  }
95
 
@@ -108,7 +108,7 @@ class Settings_Callbacks {
108
  public function checkbox_text_input( $args ) {
109
  $args = $this->normalize_settings_args( $args );
110
  extract( $args );
111
- unset($args['description']); // already extracted, should only be used here
112
 
113
  // get checkbox
114
  ob_start();
@@ -121,21 +121,21 @@ class Settings_Callbacks {
121
  'default' => isset( $args['text_input_default'] ) ? (string) $args['text_input_default'] : NULL,
122
  'size' => isset( $args['text_input_size'] ) ? $args['text_input_size'] : NULL,
123
  ) + $args;
124
- unset($input_args['current']);
125
 
126
  ob_start();
127
  $this->text_input( $input_args );
128
  $text_input = ob_get_clean();
129
 
130
- if (!empty($text_input_wrap)) {
131
  printf( "{$checkbox} {$text_input_wrap}", $text_input);
132
  } else {
133
  echo "{$checkbox} {$text_input}";
134
  }
135
 
136
  // output description.
137
- if ( isset( $description ) ) {
138
- printf( '<p class="description">%s</p>', $description );
139
  }
140
  }
141
 
@@ -155,14 +155,12 @@ class Settings_Callbacks {
155
  $current = isset( $args['default'] ) ? $args['default'] : '';
156
  }
157
 
158
- $html = sprintf( '<input type="text" id="%1$s" name="%2$s" value="%3$s" size="%4$s" class="%5$s"/>', $id, $option_name, $current, $size, $class );
159
 
160
- // Displays option description.
161
  if ( isset( $args['description'] ) ) {
162
- $html .= sprintf( '<p class="description">%s</p>', $args['description'] );
163
  }
164
-
165
- echo $html;
166
  }
167
 
168
 
@@ -182,11 +180,11 @@ class Settings_Callbacks {
182
  public function textarea( $args ) {
183
  extract( $this->normalize_settings_args( $args ) );
184
 
185
- printf( '<textarea id="%1$s" name="%2$s" cols="%4$s" rows="%5$s" placeholder="%6$s"/>%3$s</textarea>', $id, $setting_name, esc_textarea( $current ), $width, $height, $placeholder );
186
 
187
  // output description.
188
- if ( isset( $description ) ) {
189
- printf( '<p class="description">%s</p>', $description );
190
  }
191
  }
192
 
@@ -200,38 +198,38 @@ class Settings_Callbacks {
200
  public function select( $args ) {
201
  extract( $this->normalize_settings_args( $args ) );
202
 
203
- if ( isset( $enhanced_select ) ) {
204
- if ( isset( $multiple ) ) {
205
  $setting_name = "{$setting_name}[]";
206
  $multiple = 'multiple=multiple';
207
  } else {
208
  $multiple = '';
209
  }
210
 
211
- $placeholder = isset($placeholder) ? esc_attr( $placeholder ) : '';
212
- $title = isset($title) ? esc_attr( $title ) : '';
213
  $class = 'wc-enhanced-select wpo-wcpdf-enhanced-select';
214
  $css = 'width:400px';
215
- printf( '<select id="%1$s" name="%2$s" data-placeholder="%3$s" title="%4$s" class="%5$s" style="%6$s" %7$s>', $id, $setting_name, $placeholder, $title, $class, $css, $multiple );
216
  } else {
217
- printf( '<select id="%1$s" name="%2$s">', $id, $setting_name );
218
  }
219
 
220
  foreach ( $options as $key => $label ) {
221
- if ( isset( $multiple ) && is_array( $current ) ) {
222
- $selected = in_array($key, $current) ? ' selected="selected"' : '';
223
- printf( '<option value="%s"%s>%s</option>', $key, $selected, $label );
224
  } else {
225
- printf( '<option value="%s"%s>%s</option>', $key, selected( $current, $key, false ), $label );
226
  }
227
  }
228
 
229
  echo '</select>';
230
 
231
- if (isset($custom)) {
232
- printf( '<div class="%1$s_custom custom">', $id );
233
 
234
- if (is_callable( array( $this, $custom['type'] ) ) ) {
235
  $this->{$custom['type']}( $custom['args'] );
236
  }
237
  echo '</div>';
@@ -259,9 +257,9 @@ class Settings_Callbacks {
259
  <?php
260
  }
261
 
262
- // Displays option description.
263
- if ( isset( $args['description'] ) ) {
264
- printf( '<p class="description">%s</p>', $args['description'] );
265
  }
266
 
267
  }
@@ -270,14 +268,14 @@ class Settings_Callbacks {
270
  extract( $this->normalize_settings_args( $args ) );
271
 
272
  foreach ( $options as $key => $label ) {
273
- printf( '<input type="radio" class="radio" id="%1$s[%3$s]" name="%2$s" value="%3$s"%4$s />', $id, $setting_name, $key, checked( $current, $key, false ) );
274
- printf( '<label for="%1$s[%3$s]"> %4$s</label><br>', $id, $setting_name, $key, $label);
275
  }
276
 
277
 
278
- // Displays option description.
279
- if ( isset( $args['description'] ) ) {
280
- printf( '<p class="description">%s</p>', $args['description'] );
281
  }
282
 
283
  }
@@ -290,38 +288,38 @@ class Settings_Callbacks {
290
  public function multiple_text_input( $args ) {
291
  extract( $this->normalize_settings_args( $args ) );
292
 
293
- if (!empty($header)) {
294
- echo "<p><strong>{$header}</strong>:</p>";
295
  }
296
 
297
- printf('<p class="%s multiple-text-input">', $id);
298
  foreach ($fields as $name => $field) {
299
  $size = $field['size'];
300
  $placeholder = isset( $field['placeholder'] ) ? $field['placeholder'] : '';
301
 
302
- if (isset($field['label_width'])) {
303
  $style = sprintf( 'style="display:inline-block; width:%1$s;"', $field['label_width'] );
304
  } else {
305
  $style = '';
306
  }
307
 
308
- $description = isset( $field['description'] ) ? '<span style="font-style:italic;">'.$field['description'].'</span>' : '';
309
 
310
  // output field label
311
- if (isset($field['label'])) {
312
- printf( '<label for="%1$s_%2$s" %3$s>%4$s:</label>', $id, $name, $style, $field['label'] );
313
  }
314
 
315
  // output field
316
- $field_current = isset($current[$name]) ? $current[$name] : '';
317
  $type = isset( $field['type'] ) ? $field['type'] : 'text';
318
- printf( '<input type="%1$s" id="%2$s_%4$s" name="%3$s[%4$s]" value="%5$s" size="%6$s" placeholder="%7$s"/> %8$s<br/>', $type, $id, $setting_name, $name, esc_attr( $field_current ), $size, $placeholder, $description );
319
  }
320
  echo "</p>";
321
 
322
- // Displays option description.
323
- if ( isset( $args['description'] ) ) {
324
- printf( '<p class="description">%s</p>', $args['description'] );
325
  }
326
  }
327
 
@@ -333,21 +331,19 @@ class Settings_Callbacks {
333
  public function multiple_checkboxes( $args ) {
334
  extract( $this->normalize_settings_args( $args ) );
335
 
336
- foreach ($fields as $name => $label) {
337
- // $label = $field['label'];
338
-
339
  // output checkbox
340
- $field_current = isset($current[$name]) ? $current[$name] : '';
341
- printf( '<input type="checkbox" id="%1$s_%3$s" name="%2$s[%3$s]" value="%4$s"%5$s />', $id, $setting_name, $name, $value, checked( $value, $field_current, false ) );
342
 
343
  // output field label
344
- printf( '<label for="%1$s_%2$s">%3$s</label><br>', $id, $name, $label );
345
 
346
  }
347
 
348
- // Displays option description.
349
- if ( isset( $args['description'] ) ) {
350
- printf( '<p class="description">%s</p>', $args['description'] );
351
  }
352
  }
353
 
@@ -361,34 +357,34 @@ class Settings_Callbacks {
361
  public function media_upload( $args ) {
362
  extract( $this->normalize_settings_args( $args ) );
363
 
364
- if( !empty($current) && $attachment = wp_get_attachment_image_src( $current, 'full', false ) ) {
365
  $general_settings = get_option('wpo_wcpdf_settings_general');
366
  $attachment_src = $attachment[0];
367
  $attachment_width = $attachment[1];
368
  $attachment_height = $attachment[2];
369
  // check if we have the height saved on settings
370
- $header_logo_height = !empty($general_settings['header_logo_height']) ? $general_settings['header_logo_height'] : '3cm';
371
  if ( stripos( $header_logo_height, 'mm' ) != false ) {
372
- $in_height = floatval($header_logo_height)/25.4;
373
  } elseif ( stripos( $header_logo_height, 'cm' ) != false ) {
374
- $in_height = floatval($header_logo_height)/2.54;
375
  } elseif ( stripos( $header_logo_height, 'in' ) != false ) {
376
- $in_height = floatval($header_logo_height);
377
  } else {
378
  // don't display resolution
379
  }
380
 
381
- printf('<img src="%1$s" style="display:block" id="img-%4$s"/>', $attachment_src, $attachment_width, $attachment_height, $id );
382
- if ( !empty($attachment_height) && !empty($in_height) ) {
383
- $attachment_resolution = round(absint($attachment_height)/$in_height);
384
  printf(
385
  '<div class="attachment-resolution"><p class="description">%s: %sdpi</p></div>',
386
- __( 'Image resolution', 'woocommerce-pdf-invoices-packing-slips' ),
387
  $attachment_resolution
388
  );
389
 
390
  // warn the user if the image is unnecessarily large
391
- if ($attachment_resolution > 600 ) {
392
  printf(
393
  '<div class="attachment-resolution-warning notice notice-warning inline"><p>%s</p></div>',
394
  esc_html__( 'The image resolution exceeds the recommended maximum of 600dpi. This will unnecessarily increase the size of your PDF files and could negatively affect performance.', 'woocommerce-pdf-invoices-packing-slips' )
@@ -396,16 +392,16 @@ class Settings_Callbacks {
396
  }
397
  }
398
 
399
- printf('<span class="button wpo_remove_image_button" data-input_id="%1$s">%2$s</span> ', $id, $remove_button_text );
400
  }
401
 
402
- printf( '<input id="%1$s" name="%2$s" type="hidden" value="%3$s" data-settings_callback_args="%4$s" data-ajax_nonce="%5$s"/>', $id, $setting_name, $current, esc_attr( json_encode( $args ) ), wp_create_nonce( "wpo_wcpdf_get_media_upload_setting_html" ) );
403
 
404
- printf( '<span class="button wpo_upload_image_button %4$s" data-uploader_title="%1$s" data-uploader_button_text="%2$s" data-remove_button_text="%3$s" data-input_id="%4$s">%2$s</span>', $uploader_title, $uploader_button_text, $remove_button_text, $id );
405
 
406
  // Displays option description.
407
- if ( isset( $description ) ) {
408
- printf( '<p class="description">%s</p>', $description );
409
  }
410
  }
411
 
@@ -420,10 +416,17 @@ class Settings_Callbacks {
420
  $number_store = new Sequential_Number_Store( $store, $number_store_method );
421
  $next_number = $number_store->get_next();
422
  $nonce = wp_create_nonce( "wpo_wcpdf_next_{$store}" );
423
- printf( '<input id="next_%1$s" class="next-number-input" type="text" size="%2$s" value="%3$s" disabled="disabled" data-store="%1$s" data-nonce="%4$s"/> <span class="edit-next-number dashicons dashicons-edit"></span><span class="save-next-number button secondary" style="display:none;">%5$s</span>', $store, $size, $next_number, $nonce, __( 'Save', 'woocommerce-pdf-invoices-packing-slips' ) );
 
 
 
 
 
 
 
424
  // Displays option description.
425
- if ( isset( $description ) ) {
426
- printf( '<p class="description">%s</p>', $description );
427
  }
428
  }
429
 
@@ -437,34 +440,34 @@ class Settings_Callbacks {
437
  extract( $this->normalize_settings_args( $args ) );
438
 
439
  if ( $languages = $this->get_languages() ) {
440
- printf( '<div id="%s-%s-translations" class="translations">', $option_name, $id)
441
  ?>
442
  <ul>
443
  <?php foreach ( $languages as $lang_code => $language_name ) {
444
  $translation_id = "{$option_name}_{$id}_{$lang_code}";
445
- printf('<li><a href="#%s">%s</a></li>', $translation_id, $language_name );
446
  }
447
  ?>
448
  </ul>
449
  <?php foreach ( $languages as $lang_code => $language_name ) {
450
  $translation_id = "{$option_name}_{$id}_{$lang_code}";
451
- printf( '<div id="%s">', $translation_id );
452
  $args['lang'] = $lang_code;
453
  // don't use internationalized placeholders since they're not translated,
454
  // to avoid confusion (user thinking they're all the same)
455
  if ( $callback == 'multiple_text_input' ) {
456
- foreach ($fields as $key => $field_args) {
457
- if (!empty($field_args['placeholder']) && isset($field_args['i18n_placeholder'])) {
458
  $args['fields'][$key]['placeholder'] = '';
459
  }
460
  }
461
  } else {
462
- if (!empty($args['placeholder']) && isset($args['i18n_placeholder'])) {
463
  $args['placeholder'] = '';
464
  }
465
  }
466
  // specific description for internationalized fields (to compensate for missing placeholder)
467
- if (!empty($args['i18n_description'])) {
468
  $args['description'] = $args['i18n_description'];
469
  }
470
  if ( is_array( $callback ) ) {
@@ -489,15 +492,15 @@ class Settings_Callbacks {
489
  }
490
 
491
  public function get_languages () {
492
- $multilingual = function_exists('icl_get_languages');
493
  // $multilingual = true; // for development
494
 
495
- if ($multilingual) {
496
  // use this instead of function call for development outside of WPML
497
  // $icl_get_languages = 'a:3:{s:2:"en";a:8:{s:2:"id";s:1:"1";s:6:"active";s:1:"1";s:11:"native_name";s:7:"English";s:7:"missing";s:1:"0";s:15:"translated_name";s:7:"English";s:13:"language_code";s:2:"en";s:16:"country_flag_url";s:43:"http://yourdomain/wpmlpath/res/flags/en.png";s:3:"url";s:23:"http://yourdomain/about";}s:2:"fr";a:8:{s:2:"id";s:1:"4";s:6:"active";s:1:"0";s:11:"native_name";s:9:"Français";s:7:"missing";s:1:"0";s:15:"translated_name";s:6:"French";s:13:"language_code";s:2:"fr";s:16:"country_flag_url";s:43:"http://yourdomain/wpmlpath/res/flags/fr.png";s:3:"url";s:29:"http://yourdomain/fr/a-propos";}s:2:"it";a:8:{s:2:"id";s:2:"27";s:6:"active";s:1:"0";s:11:"native_name";s:8:"Italiano";s:7:"missing";s:1:"0";s:15:"translated_name";s:7:"Italian";s:13:"language_code";s:2:"it";s:16:"country_flag_url";s:43:"http://yourdomain/wpmlpath/res/flags/it.png";s:3:"url";s:26:"http://yourdomain/it/circa";}}';
498
  // $icl_get_languages = unserialize($icl_get_languages);
499
 
500
- $icl_get_languages = icl_get_languages('skip_missing=0');
501
  $languages = array();
502
  foreach ($icl_get_languages as $lang => $data) {
503
  $languages[$data['language_code']] = $data['native_name'];
@@ -518,7 +521,9 @@ class Settings_Callbacks {
518
  // get main settings array
519
  $option = get_option( $args['option_name'] );
520
 
521
- $args['setting_name'] = "{$args['option_name']}[{$args['id']}]";
 
 
522
 
523
  if ( !isset($args['lang']) && !empty($args['translatable']) ) {
524
  $args['lang'] = 'default';
@@ -580,17 +585,16 @@ class Settings_Callbacks {
580
  * @return array validated options.
581
  */
582
  public function validate( $input ) {
583
- // echo '<pre>';var_dump($input);die('</pre>');
584
  // Create our array for storing the validated options.
585
  $output = array();
586
 
587
- if (empty($input) || !is_array($input)) {
588
  return $input;
589
  }
590
 
591
- if (!empty($input['wpo_wcpdf_setting_store_empty'])) { //perhaps we should use a more unique/specific name for this
592
- foreach ($input['wpo_wcpdf_setting_store_empty'] as $key) {
593
- if (empty($input[$key])) {
594
  $output[$key] = 0;
595
  }
596
  }
24
  * @return void.
25
  */
26
  public function debug_section() {
27
+ echo wp_kses_post( __( '<b>Warning!</b> The settings below are meant for debugging/development only. Do not use them on a live website!' , 'woocommerce-pdf-invoices-packing-slips' ) );
28
  }
29
 
30
  /**
33
  * @return void.
34
  */
35
  public function custom_fields_section() {
36
+ echo wp_kses_post( __( 'These are used for the (optional) footer columns in the <em>Modern (Premium)</em> template, but can also be used for other elements in your custom template' , 'woocommerce-pdf-invoices-packing-slips' ) );
37
  }
38
 
39
  /**
52
  extract( $this->normalize_settings_args( $args ) );
53
 
54
  // output checkbox
55
+ printf( '<input type="checkbox" id="%1$s" name="%2$s" value="%3$s" %4$s %5$s/>', esc_attr( $id ), esc_attr( $setting_name ), esc_attr( $value ), checked( $value, $current, false ), ! empty( $disabled ) ? 'disabled="disabled"' : '' );
56
 
57
  // print store empty input if true
58
  if( $store_unchecked ) {
59
+ printf( '<input type="hidden" name="%s[wpo_wcpdf_setting_store_empty][]" value="%s"/>', $option_name, esc_attr( $id ) );
60
  }
61
 
62
  // output description.
63
+ if ( ! empty( $description ) ) {
64
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
65
  }
66
  }
67
 
81
  public function text_input( $args ) {
82
  extract( $this->normalize_settings_args( $args ) );
83
 
84
+ if ( empty( $type ) ) {
85
  $type = 'text';
86
  }
87
 
88
+ printf( '<input type="%1$s" id="%2$s" name="%3$s" value="%4$s" size="%5$s" placeholder="%6$s" %7$s/>', esc_attr( $type ), esc_attr( $id ), esc_attr( $setting_name ), esc_attr( $current ), esc_attr( $size ), esc_attr( $placeholder ), ! empty( $disabled ) ? 'disabled="disabled"' : '' );
89
 
90
  // output description.
91
+ if ( ! empty( $description ) ) {
92
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
93
  }
94
  }
95
 
108
  public function checkbox_text_input( $args ) {
109
  $args = $this->normalize_settings_args( $args );
110
  extract( $args );
111
+ unset( $args['description'] ); // already extracted, should only be used here
112
 
113
  // get checkbox
114
  ob_start();
121
  'default' => isset( $args['text_input_default'] ) ? (string) $args['text_input_default'] : NULL,
122
  'size' => isset( $args['text_input_size'] ) ? $args['text_input_size'] : NULL,
123
  ) + $args;
124
+ unset( $input_args['current'] );
125
 
126
  ob_start();
127
  $this->text_input( $input_args );
128
  $text_input = ob_get_clean();
129
 
130
+ if (! empty( $text_input_wrap ) ) {
131
  printf( "{$checkbox} {$text_input_wrap}", $text_input);
132
  } else {
133
  echo "{$checkbox} {$text_input}";
134
  }
135
 
136
  // output description.
137
+ if ( ! empty( $description ) ) {
138
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
139
  }
140
  }
141
 
155
  $current = isset( $args['default'] ) ? $args['default'] : '';
156
  }
157
 
158
+ printf( '<input type="text" id="%1$s" name="%2$s" value="%3$s" size="%4$s" class="%5$s"/>', esc_attr( $id ), esc_attr( $option_name ), esc_attr( $current ), esc_attr( $size ), esc_attr( $class ) );
159
 
160
+ // output description.
161
  if ( isset( $args['description'] ) ) {
162
+ printf( '<p class="description">%s</p>', wp_kses_post( $args['description'] ) );
163
  }
 
 
164
  }
165
 
166
 
180
  public function textarea( $args ) {
181
  extract( $this->normalize_settings_args( $args ) );
182
 
183
+ printf( '<textarea id="%1$s" name="%2$s" cols="%4$s" rows="%5$s" placeholder="%6$s"/>%3$s</textarea>', esc_attr( $id ), esc_attr( $setting_name ), esc_textarea( $current ), esc_attr( $width ), esc_attr( $height ), esc_attr( $placeholder ) );
184
 
185
  // output description.
186
+ if ( ! empty( $description ) ) {
187
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
188
  }
189
  }
190
 
198
  public function select( $args ) {
199
  extract( $this->normalize_settings_args( $args ) );
200
 
201
+ if ( ! empty( $enhanced_select ) ) {
202
+ if ( ! empty( $multiple ) ) {
203
  $setting_name = "{$setting_name}[]";
204
  $multiple = 'multiple=multiple';
205
  } else {
206
  $multiple = '';
207
  }
208
 
209
+ $placeholder = ! empty( $placeholder ) ? esc_attr( $placeholder ) : '';
210
+ $title = ! empty( $title ) ? esc_attr( $title ) : '';
211
  $class = 'wc-enhanced-select wpo-wcpdf-enhanced-select';
212
  $css = 'width:400px';
213
+ printf( '<select id="%1$s" name="%2$s" data-placeholder="%3$s" title="%4$s" class="%5$s" style="%6$s" %7$s>', esc_attr( $id ), esc_attr( $setting_name ), esc_attr( $placeholder ), esc_attr( $title ), esc_attr( $class ), esc_attr( $css ), $multiple );
214
  } else {
215
+ printf( '<select id="%1$s" name="%2$s">', esc_attr( $id ), esc_attr( $setting_name ) );
216
  }
217
 
218
  foreach ( $options as $key => $label ) {
219
+ if ( ! empty( $multiple ) && is_array( $current ) ) {
220
+ $selected = in_array( $key, $current ) ? ' selected="selected"' : '';
221
+ printf( '<option value="%s"%s>%s</option>', esc_attr( $key ), $selected, esc_html( $label ) );
222
  } else {
223
+ printf( '<option value="%s"%s>%s</option>', esc_attr( $key ), selected( $current, $key, false ), esc_html( $label ) );
224
  }
225
  }
226
 
227
  echo '</select>';
228
 
229
+ if ( ! empty( $custom ) ) {
230
+ printf( '<div class="%1$s_custom custom">', esc_attr( $id ) );
231
 
232
+ if ( is_callable( array( $this, $custom['type'] ) ) ) {
233
  $this->{$custom['type']}( $custom['args'] );
234
  }
235
  echo '</div>';
257
  <?php
258
  }
259
 
260
+ // output description.
261
+ if ( ! empty( $description ) ) {
262
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
263
  }
264
 
265
  }
268
  extract( $this->normalize_settings_args( $args ) );
269
 
270
  foreach ( $options as $key => $label ) {
271
+ printf( '<input type="radio" class="radio" id="%1$s[%3$s]" name="%2$s" value="%3$s"%4$s />', esc_attr( $id ), esc_attr( $setting_name ), esc_attr( $key ), checked( $current, $key, false ) );
272
+ printf( '<label for="%1$s[%3$s]"> %4$s</label><br>', esc_attr( $id ), esc_attr( $setting_name ), esc_attr( $key ), esc_html( $label ) );
273
  }
274
 
275
 
276
+ // output description.
277
+ if ( ! empty( $description ) ) {
278
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
279
  }
280
 
281
  }
288
  public function multiple_text_input( $args ) {
289
  extract( $this->normalize_settings_args( $args ) );
290
 
291
+ if ( ! empty( $header ) ) {
292
+ echo wp_kses_post( "<p><strong>{$header}</strong>:</p>" );
293
  }
294
 
295
+ printf('<p class="%s multiple-text-input">', esc_attr( $id ) );
296
  foreach ($fields as $name => $field) {
297
  $size = $field['size'];
298
  $placeholder = isset( $field['placeholder'] ) ? $field['placeholder'] : '';
299
 
300
+ if ( isset( $field['label_width'] ) ) {
301
  $style = sprintf( 'style="display:inline-block; width:%1$s;"', $field['label_width'] );
302
  } else {
303
  $style = '';
304
  }
305
 
306
+ $field_description = ! empty( $field['description'] ) ? '<span style="font-style:italic;">'.$field['description'].'</span>' : '';
307
 
308
  // output field label
309
+ if ( isset( $field['label'] ) ) {
310
+ printf( '<label for="%1$s_%2$s" %3$s>%4$s:</label>', esc_attr( $id ), esc_attr( $name ), esc_attr( $style ), esc_html( $field['label'] ) );
311
  }
312
 
313
  // output field
314
+ $field_current = isset( $current[$name] ) ? $current[$name] : '';
315
  $type = isset( $field['type'] ) ? $field['type'] : 'text';
316
+ printf( '<input type="%1$s" id="%2$s_%4$s" name="%3$s[%4$s]" value="%5$s" size="%6$s" placeholder="%7$s"/> %8$s<br/>', esc_attr( $type ), esc_attr( $id ), esc_attr( $setting_name ), esc_attr( $name ), esc_attr( $field_current ), esc_attr( $size ), esc_attr( $placeholder ), wp_kses_post( $field_description ) );
317
  }
318
  echo "</p>";
319
 
320
+ // output description.
321
+ if ( ! empty( $description ) ) {
322
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
323
  }
324
  }
325
 
331
  public function multiple_checkboxes( $args ) {
332
  extract( $this->normalize_settings_args( $args ) );
333
 
334
+ foreach ( $fields as $name => $label ) {
 
 
335
  // output checkbox
336
+ $field_current = isset( $current[$name] ) ? $current[$name] : '';
337
+ printf( '<input type="checkbox" id="%1$s_%3$s" name="%2$s[%3$s]" value="%4$s"%5$s />', esc_attr( $id ), esc_attr( $setting_name ), esc_attr( $name ), esc_attr( $value ), checked( $value, $field_current, false ) );
338
 
339
  // output field label
340
+ printf( '<label for="%1$s_%2$s">%3$s</label><br>', esc_attr( $id ), esc_attr( $name ), esc_html( $label ) );
341
 
342
  }
343
 
344
+ // output description.
345
+ if ( ! empty( $description ) ) {
346
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
347
  }
348
  }
349
 
357
  public function media_upload( $args ) {
358
  extract( $this->normalize_settings_args( $args ) );
359
 
360
+ if( ! empty( $current ) && $attachment = wp_get_attachment_image_src( $current, 'full', false ) ) {
361
  $general_settings = get_option('wpo_wcpdf_settings_general');
362
  $attachment_src = $attachment[0];
363
  $attachment_width = $attachment[1];
364
  $attachment_height = $attachment[2];
365
  // check if we have the height saved on settings
366
+ $header_logo_height = !empty( $general_settings['header_logo_height'] ) ? $general_settings['header_logo_height'] : '3cm';
367
  if ( stripos( $header_logo_height, 'mm' ) != false ) {
368
+ $in_height = floatval( $header_logo_height )/25.4;
369
  } elseif ( stripos( $header_logo_height, 'cm' ) != false ) {
370
+ $in_height = floatval( $header_logo_height )/2.54;
371
  } elseif ( stripos( $header_logo_height, 'in' ) != false ) {
372
+ $in_height = floatval( $header_logo_height );
373
  } else {
374
  // don't display resolution
375
  }
376
 
377
+ printf( '<img src="%1$s" style="display:block" id="img-%2$s"/>', esc_attr( $attachment_src ), esc_attr( $id ) );
378
+ if ( ! empty( $attachment_height ) && ! empty( $in_height ) ) {
379
+ $attachment_resolution = round( absint( $attachment_height ) / $in_height );
380
  printf(
381
  '<div class="attachment-resolution"><p class="description">%s: %sdpi</p></div>',
382
+ esc_html__( 'Image resolution', 'woocommerce-pdf-invoices-packing-slips' ),
383
  $attachment_resolution
384
  );
385
 
386
  // warn the user if the image is unnecessarily large
387
+ if ( $attachment_resolution > 600 ) {
388
  printf(
389
  '<div class="attachment-resolution-warning notice notice-warning inline"><p>%s</p></div>',
390
  esc_html__( 'The image resolution exceeds the recommended maximum of 600dpi. This will unnecessarily increase the size of your PDF files and could negatively affect performance.', 'woocommerce-pdf-invoices-packing-slips' )
392
  }
393
  }
394
 
395
+ printf('<span class="button wpo_remove_image_button" data-input_id="%1$s">%2$s</span> ', esc_attr( $id ), esc_attr( $remove_button_text ) );
396
  }
397
 
398
+ printf( '<input id="%1$s" name="%2$s" type="hidden" value="%3$s" data-settings_callback_args="%4$s" data-ajax_nonce="%5$s"/>', esc_attr( $id ), esc_attr( $setting_name ), esc_attr( $current ), esc_attr( json_encode( $args ) ), wp_create_nonce( "wpo_wcpdf_get_media_upload_setting_html" ) );
399
 
400
+ printf( '<span class="button wpo_upload_image_button %4$s" data-uploader_title="%1$s" data-uploader_button_text="%2$s" data-remove_button_text="%3$s" data-input_id="%4$s">%2$s</span>', esc_attr( $uploader_title ), esc_attr( $uploader_button_text ), esc_attr( $remove_button_text ), esc_attr( $id ) );
401
 
402
  // Displays option description.
403
+ if ( ! empty( $description ) ) {
404
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
405
  }
406
  }
407
 
416
  $number_store = new Sequential_Number_Store( $store, $number_store_method );
417
  $next_number = $number_store->get_next();
418
  $nonce = wp_create_nonce( "wpo_wcpdf_next_{$store}" );
419
+ printf(
420
+ '<input id="next_%1$s" class="next-number-input" type="text" size="%2$s" value="%3$s" disabled="disabled" data-store="%1$s" data-nonce="%4$s"/> <span class="edit-next-number dashicons dashicons-edit"></span><span class="save-next-number button secondary" style="display:none;">%5$s</span>',
421
+ esc_attr( $store ),
422
+ esc_attr( $size ),
423
+ esc_attr( $next_number ),
424
+ esc_attr( $nonce ),
425
+ esc_html__( 'Save', 'woocommerce-pdf-invoices-packing-slips' )
426
+ );
427
  // Displays option description.
428
+ if ( ! empty( $description ) ) {
429
+ printf( '<p class="description">%s</p>', wp_kses_post( $description ) );
430
  }
431
  }
432
 
440
  extract( $this->normalize_settings_args( $args ) );
441
 
442
  if ( $languages = $this->get_languages() ) {
443
+ printf( '<div id="%s-%s-translations" class="translations">', esc_attr( $option_name ), esc_attr( $id ) );
444
  ?>
445
  <ul>
446
  <?php foreach ( $languages as $lang_code => $language_name ) {
447
  $translation_id = "{$option_name}_{$id}_{$lang_code}";
448
+ printf( '<li><a href="#%s">%s</a></li>', esc_attr( $translation_id ), esc_html( $language_name ) );
449
  }
450
  ?>
451
  </ul>
452
  <?php foreach ( $languages as $lang_code => $language_name ) {
453
  $translation_id = "{$option_name}_{$id}_{$lang_code}";
454
+ printf( '<div id="%s">', esc_attr( $translation_id ) );
455
  $args['lang'] = $lang_code;
456
  // don't use internationalized placeholders since they're not translated,
457
  // to avoid confusion (user thinking they're all the same)
458
  if ( $callback == 'multiple_text_input' ) {
459
+ foreach ( $fields as $key => $field_args ) {
460
+ if ( ! empty( $field_args['placeholder'] ) && isset( $field_args['i18n_placeholder'] ) ) {
461
  $args['fields'][$key]['placeholder'] = '';
462
  }
463
  }
464
  } else {
465
+ if ( !empty( $args['placeholder'] ) && isset( $args['i18n_placeholder'] ) ) {
466
  $args['placeholder'] = '';
467
  }
468
  }
469
  // specific description for internationalized fields (to compensate for missing placeholder)
470
+ if ( ! empty( $args['i18n_description'] ) ) {
471
  $args['description'] = $args['i18n_description'];
472
  }
473
  if ( is_array( $callback ) ) {
492
  }
493
 
494
  public function get_languages () {
495
+ $multilingual = function_exists( 'icl_get_languages' );
496
  // $multilingual = true; // for development
497
 
498
+ if ( $multilingual ) {
499
  // use this instead of function call for development outside of WPML
500
  // $icl_get_languages = 'a:3:{s:2:"en";a:8:{s:2:"id";s:1:"1";s:6:"active";s:1:"1";s:11:"native_name";s:7:"English";s:7:"missing";s:1:"0";s:15:"translated_name";s:7:"English";s:13:"language_code";s:2:"en";s:16:"country_flag_url";s:43:"http://yourdomain/wpmlpath/res/flags/en.png";s:3:"url";s:23:"http://yourdomain/about";}s:2:"fr";a:8:{s:2:"id";s:1:"4";s:6:"active";s:1:"0";s:11:"native_name";s:9:"Français";s:7:"missing";s:1:"0";s:15:"translated_name";s:6:"French";s:13:"language_code";s:2:"fr";s:16:"country_flag_url";s:43:"http://yourdomain/wpmlpath/res/flags/fr.png";s:3:"url";s:29:"http://yourdomain/fr/a-propos";}s:2:"it";a:8:{s:2:"id";s:2:"27";s:6:"active";s:1:"0";s:11:"native_name";s:8:"Italiano";s:7:"missing";s:1:"0";s:15:"translated_name";s:7:"Italian";s:13:"language_code";s:2:"it";s:16:"country_flag_url";s:43:"http://yourdomain/wpmlpath/res/flags/it.png";s:3:"url";s:26:"http://yourdomain/it/circa";}}';
501
  // $icl_get_languages = unserialize($icl_get_languages);
502
 
503
+ $icl_get_languages = icl_get_languages( 'skip_missing=0' );
504
  $languages = array();
505
  foreach ($icl_get_languages as $lang => $data) {
506
  $languages[$data['language_code']] = $data['native_name'];
521
  // get main settings array
522
  $option = get_option( $args['option_name'] );
523
 
524
+ if ( empty ( $args['setting_name'] ) ) {
525
+ $args['setting_name'] = "{$args['option_name']}[{$args['id']}]";
526
+ }
527
 
528
  if ( !isset($args['lang']) && !empty($args['translatable']) ) {
529
  $args['lang'] = 'default';
585
  * @return array validated options.
586
  */
587
  public function validate( $input ) {
 
588
  // Create our array for storing the validated options.
589
  $output = array();
590
 
591
+ if ( empty( $input ) || ! is_array( $input ) ) {
592
  return $input;
593
  }
594
 
595
+ if ( ! empty( $input['wpo_wcpdf_setting_store_empty'] ) ) { //perhaps we should use a more unique/specific name for this
596
+ foreach ( $input['wpo_wcpdf_setting_store_empty'] as $key ) {
597
+ if ( empty( $input[$key] ) ) {
598
  $output[$key] = 0;
599
  }
600
  }
includes/class-wcpdf-settings-debug.php CHANGED
@@ -32,7 +32,7 @@ class Settings_Debug {
32
  }
33
 
34
  public function debug_tools( $tab, $section ) {
35
- if ($tab !== 'debug') {
36
  return;
37
  }
38
  ?>
@@ -42,9 +42,9 @@ class Settings_Debug {
42
  <form method="post">
43
  <?php wp_nonce_field( 'wpo_wcpdf_debug_tools_action', 'security' ); ?>
44
  <input type="hidden" name="wpo_wcpdf_debug_tools_action" value="generate_random_string">
45
- <input type="submit" name="submit" id="submit" class="button" value="<?php _e( 'Generate random temporary folder name', 'woocommerce-pdf-invoices-packing-slips' ); ?>">
46
  <?php
47
- if ( !empty($_POST) && isset($_POST['wpo_wcpdf_debug_tools_action']) && $_POST['wpo_wcpdf_debug_tools_action'] == 'generate_random_string' ) {
48
  // check permissions
49
  if ( !check_admin_referer( 'wpo_wcpdf_debug_tools_action', 'security' ) ) {
50
  return;
@@ -55,7 +55,7 @@ class Settings_Debug {
55
  $new_path = WPO_WCPDF()->main->get_tmp_base();
56
  WPO_WCPDF()->main->copy_directory( $old_path, $new_path );
57
  /* translators: directory path */
58
- printf('<div class="notice notice-success"><p>%s</p></div>', sprintf( __( 'Temporary folder moved to %s', 'woocommerce-pdf-invoices-packing-slips' ), '<code>'.$new_path.'</code>' ) );
59
  }
60
  ?>
61
  </form>
@@ -65,28 +65,28 @@ class Settings_Debug {
65
  <form method="post">
66
  <?php wp_nonce_field( 'wpo_wcpdf_debug_tools_action', 'security' ); ?>
67
  <input type="hidden" name="wpo_wcpdf_debug_tools_action" value="install_fonts">
68
- <input type="submit" name="submit" id="submit" class="button" value="<?php _e( 'Reinstall fonts', 'woocommerce-pdf-invoices-packing-slips' ); ?>">
69
  <?php
70
- if ( !empty($_POST) && isset($_POST['wpo_wcpdf_debug_tools_action']) && $_POST['wpo_wcpdf_debug_tools_action'] == 'install_fonts' ) {
71
  // check permissions
72
- if ( !check_admin_referer( 'wpo_wcpdf_debug_tools_action', 'security' ) ) {
73
  return;
74
  }
75
 
76
  $font_path = WPO_WCPDF()->main->get_tmp_path( 'fonts' );
77
 
78
  // clear folder first
79
- if ( function_exists("glob") && $files = glob( $font_path.'/*.*' ) ) {
80
  $exclude_files = array( 'index.php', '.htaccess' );
81
- foreach($files as $file) {
82
- if( is_file($file) && !in_array( basename($file), $exclude_files ) ) {
83
- unlink($file);
84
  }
85
  }
86
  }
87
 
88
  WPO_WCPDF()->main->copy_fonts( $font_path );
89
- printf('<div class="notice notice-success"><p>%s</p></div>', __( 'Fonts reinstalled!', 'woocommerce-pdf-invoices-packing-slips' ) );
90
  }
91
  ?>
92
  </form>
@@ -95,26 +95,26 @@ class Settings_Debug {
95
  <form method="post">
96
  <?php wp_nonce_field( 'wpo_wcpdf_debug_tools_action', 'security' ); ?>
97
  <input type="hidden" name="wpo_wcpdf_debug_tools_action" value="clear_tmp">
98
- <input type="submit" name="submit" id="submit" class="button" value="<?php _e( 'Remove temporary files', 'woocommerce-pdf-invoices-packing-slips' ); ?>">
99
  <?php
100
- if ( !empty($_POST) && isset($_POST['wpo_wcpdf_debug_tools_action']) && $_POST['wpo_wcpdf_debug_tools_action'] == 'clear_tmp' ) {
101
  // check permissions
102
- if ( !check_admin_referer( 'wpo_wcpdf_debug_tools_action', 'security' ) ) {
103
  return;
104
  }
105
- $tmp_path = WPO_WCPDF()->main->get_tmp_path('attachments');
106
 
107
- if ( !function_exists("glob") ) {
108
  // glob is disabled
109
- printf('<div class="notice notice-error"><p>%s<br><code>%s</code></p></div>', __( "Unable to read temporary folder contents!", 'woocommerce-pdf-invoices-packing-slips' ), $tmp_path);
110
  } else {
111
  $success = 0;
112
  $error = 0;
113
- if ( $files = glob($tmp_path.'*.pdf') ) { // get all pdf files
114
- foreach($files as $file) {
115
- if(is_file($file)) {
116
  // delete file
117
- if ( unlink($file) === true ) {
118
  $success++;
119
  } else {
120
  $error++;
@@ -122,17 +122,17 @@ class Settings_Debug {
122
  }
123
  }
124
 
125
- if ($error > 0) {
126
  /* translators: 1,2. file count */
127
- $message = sprintf( __( 'Unable to delete %1$d files! (deleted %2$d)', 'woocommerce-pdf-invoices-packing-slips' ), $error, $success);
128
- printf('<div class="notice notice-error"><p>%s</p></div>', $message);
129
  } else {
130
  /* translators: file count */
131
- $message = sprintf( __( 'Successfully deleted %d files!', 'woocommerce-pdf-invoices-packing-slips' ), $success );
132
- printf('<div class="notice notice-success"><p>%s</p></div>', $message);
133
  }
134
  } else {
135
- printf('<div class="notice notice-success"><p>%s</p></div>', __( 'Nothing to delete!', 'woocommerce-pdf-invoices-packing-slips' ) );
136
  }
137
  }
138
  }
@@ -143,11 +143,11 @@ class Settings_Debug {
143
  <form method="post">
144
  <?php wp_nonce_field( 'wpo_wcpdf_debug_tools_action', 'security' ); ?>
145
  <input type="hidden" name="wpo_wcpdf_debug_tools_action" value="delete_legacy_settings">
146
- <input type="submit" name="submit" id="submit" class="button" value="<?php _e( 'Delete legacy (1.X) settings', 'woocommerce-pdf-invoices-packing-slips' ); ?>">
147
  <?php
148
- if ( !empty($_POST) && isset($_POST['wpo_wcpdf_debug_tools_action']) && $_POST['wpo_wcpdf_debug_tools_action'] == 'delete_legacy_settings' ) {
149
  // check permissions
150
- if ( !check_admin_referer( 'wpo_wcpdf_debug_tools_action', 'security' ) ) {
151
  return;
152
  }
153
  // delete options
@@ -159,7 +159,7 @@ class Settings_Debug {
159
  wp_cache_delete( 'wpo_wcpdf_template_settings','options' );
160
  wp_cache_delete( 'wpo_wcpdf_debug_settings','options' );
161
 
162
- printf('<div class="notice notice-success"><p>%s</p></div>', __( 'Legacy settings deleted!', 'woocommerce-pdf-invoices-packing-slips' ) );
163
  }
164
  ?>
165
  </form>
@@ -170,13 +170,13 @@ class Settings_Debug {
170
  }
171
 
172
  public function work_at_wpovernight( $tab, $section ) {
173
- if ($tab === 'debug') {
174
  include( WPO_WCPDF()->plugin_path() . '/includes/views/work-at-wpovernight.php' );
175
  }
176
  }
177
 
178
  public function dompdf_status( $tab, $section ) {
179
- if ($tab === 'debug') {
180
  include( WPO_WCPDF()->plugin_path() . '/includes/views/dompdf-status.php' );
181
  }
182
  }
32
  }
33
 
34
  public function debug_tools( $tab, $section ) {
35
+ if ( $tab !== 'debug' ) {
36
  return;
37
  }
38
  ?>
42
  <form method="post">
43
  <?php wp_nonce_field( 'wpo_wcpdf_debug_tools_action', 'security' ); ?>
44
  <input type="hidden" name="wpo_wcpdf_debug_tools_action" value="generate_random_string">
45
+ <input type="submit" name="submit" id="submit" class="button" value="<?php esc_attr_e( 'Generate random temporary folder name', 'woocommerce-pdf-invoices-packing-slips' ); ?>">
46
  <?php
47
+ if ( ! empty( $_POST ) && isset( $_POST['wpo_wcpdf_debug_tools_action'] ) && $_POST['wpo_wcpdf_debug_tools_action'] == 'generate_random_string' ) {
48
  // check permissions
49
  if ( !check_admin_referer( 'wpo_wcpdf_debug_tools_action', 'security' ) ) {
50
  return;
55
  $new_path = WPO_WCPDF()->main->get_tmp_base();
56
  WPO_WCPDF()->main->copy_directory( $old_path, $new_path );
57
  /* translators: directory path */
58
+ printf('<div class="notice notice-success"><p>%s</p></div>', sprintf( esc_html__( 'Temporary folder moved to %s', 'woocommerce-pdf-invoices-packing-slips' ), '<code>'.$new_path.'</code>' ) );
59
  }
60
  ?>
61
  </form>
65
  <form method="post">
66
  <?php wp_nonce_field( 'wpo_wcpdf_debug_tools_action', 'security' ); ?>
67
  <input type="hidden" name="wpo_wcpdf_debug_tools_action" value="install_fonts">
68
+ <input type="submit" name="submit" id="submit" class="button" value="<?php esc_attr_e( 'Reinstall fonts', 'woocommerce-pdf-invoices-packing-slips' ); ?>">
69
  <?php
70
+ if ( ! empty( $_POST ) && isset( $_POST['wpo_wcpdf_debug_tools_action'] ) && $_POST['wpo_wcpdf_debug_tools_action'] == 'install_fonts' ) {
71
  // check permissions
72
+ if ( ! check_admin_referer( 'wpo_wcpdf_debug_tools_action', 'security' ) ) {
73
  return;
74
  }
75
 
76
  $font_path = WPO_WCPDF()->main->get_tmp_path( 'fonts' );
77
 
78
  // clear folder first
79
+ if ( function_exists( "glob" ) && $files = glob( $font_path.'/*.*' ) ) {
80
  $exclude_files = array( 'index.php', '.htaccess' );
81
+ foreach( $files as $file ) {
82
+ if( is_file( $file ) && !in_array( basename( $file ), $exclude_files ) ) {
83
+ unlink( $file );
84
  }
85
  }
86
  }
87
 
88
  WPO_WCPDF()->main->copy_fonts( $font_path );
89
+ printf('<div class="notice notice-success"><p>%s</p></div>', esc_html__( 'Fonts reinstalled!', 'woocommerce-pdf-invoices-packing-slips' ) );
90
  }
91
  ?>
92
  </form>
95
  <form method="post">
96
  <?php wp_nonce_field( 'wpo_wcpdf_debug_tools_action', 'security' ); ?>
97
  <input type="hidden" name="wpo_wcpdf_debug_tools_action" value="clear_tmp">
98
+ <input type="submit" name="submit" id="submit" class="button" value="<?php esc_attr_e( 'Remove temporary files', 'woocommerce-pdf-invoices-packing-slips' ); ?>">
99
  <?php
100
+ if ( ! empty( $_POST ) && isset( $_POST['wpo_wcpdf_debug_tools_action'] ) && $_POST['wpo_wcpdf_debug_tools_action'] == 'clear_tmp' ) {
101
  // check permissions
102
+ if ( ! check_admin_referer( 'wpo_wcpdf_debug_tools_action', 'security' ) ) {
103
  return;
104
  }
105
+ $tmp_path = WPO_WCPDF()->main->get_tmp_path( 'attachments' );
106
 
107
+ if ( ! function_exists( "glob" ) ) {
108
  // glob is disabled
109
+ printf('<div class="notice notice-error"><p>%s<br><code>%s</code></p></div>', esc_html__( "Unable to read temporary folder contents!", 'woocommerce-pdf-invoices-packing-slips' ), $tmp_path);
110
  } else {
111
  $success = 0;
112
  $error = 0;
113
+ if ( $files = glob( $tmp_path.'*.pdf' ) ) { // get all pdf files
114
+ foreach( $files as $file ) {
115
+ if( is_file( $file ) ) {
116
  // delete file
117
+ if ( unlink( $file ) === true ) {
118
  $success++;
119
  } else {
120
  $error++;
122
  }
123
  }
124
 
125
+ if ( $error > 0 ) {
126
  /* translators: 1,2. file count */
127
+ $message = sprintf( esc_html__( 'Unable to delete %1$d files! (deleted %2$d)', 'woocommerce-pdf-invoices-packing-slips' ), $error, $success );
128
+ printf( '<div class="notice notice-error"><p>%s</p></div>', $message );
129
  } else {
130
  /* translators: file count */
131
+ $message = sprintf( esc_html__( 'Successfully deleted %d files!', 'woocommerce-pdf-invoices-packing-slips' ), $success );
132
+ printf( '<div class="notice notice-success"><p>%s</p></div>', $message );
133
  }
134
  } else {
135
+ printf( '<div class="notice notice-success"><p>%s</p></div>', esc_html__( 'Nothing to delete!', 'woocommerce-pdf-invoices-packing-slips' ) );
136
  }
137
  }
138
  }
143
  <form method="post">
144
  <?php wp_nonce_field( 'wpo_wcpdf_debug_tools_action', 'security' ); ?>
145
  <input type="hidden" name="wpo_wcpdf_debug_tools_action" value="delete_legacy_settings">
146
+ <input type="submit" name="submit" id="submit" class="button" value="<?php esc_attr_e( 'Delete legacy (1.X) settings', 'woocommerce-pdf-invoices-packing-slips' ); ?>">
147
  <?php
148
+ if ( ! empty( $_POST ) && isset( $_POST['wpo_wcpdf_debug_tools_action'] ) && $_POST['wpo_wcpdf_debug_tools_action'] == 'delete_legacy_settings' ) {
149
  // check permissions
150
+ if ( ! check_admin_referer( 'wpo_wcpdf_debug_tools_action', 'security' ) ) {
151
  return;
152
  }
153
  // delete options
159
  wp_cache_delete( 'wpo_wcpdf_template_settings','options' );
160
  wp_cache_delete( 'wpo_wcpdf_debug_settings','options' );
161
 
162
+ printf('<div class="notice notice-success"><p>%s</p></div>', esc_html__( 'Legacy settings deleted!', 'woocommerce-pdf-invoices-packing-slips' ) );
163
  }
164
  ?>
165
  </form>
170
  }
171
 
172
  public function work_at_wpovernight( $tab, $section ) {
173
+ if ( $tab === 'debug' ) {
174
  include( WPO_WCPDF()->plugin_path() . '/includes/views/work-at-wpovernight.php' );
175
  }
176
  }
177
 
178
  public function dompdf_status( $tab, $section ) {
179
+ if ( $tab === 'debug' ) {
180
  include( WPO_WCPDF()->plugin_path() . '/includes/views/dompdf-status.php' );
181
  }
182
  }
includes/class-wcpdf-settings-documents.php CHANGED
@@ -15,58 +15,34 @@ class Settings_Documents {
15
  }
16
 
17
  public function init_settings() {
18
- $documents = WPO_WCPDF()->documents->get_documents('all');
19
- foreach ($documents as $document) {
20
  $document->init_settings();
21
  }
22
  }
23
 
24
  public function output( $section ) {
25
- $section = !empty($section) ? $section : 'invoice';
26
- if ( !empty( $section ) ) {
27
- $documents = WPO_WCPDF()->documents->get_documents('all');
28
- ?>
29
- <div class="wcpdf_document_settings_sections">
30
- <?php _e( 'Documents', 'woocommerce-pdf-invoices-packing-slips' ); ?>:
31
- <ul>
32
- <?php
33
- foreach ($documents as $document) {
34
- $title = strip_tags($document->get_title());
35
- if (empty(trim($title))) {
36
- $title = '['.__( 'untitled', 'woocommerce-pdf-invoices-packing-slips' ).']';
37
- }
38
- printf('<li><a href="%s" class="%s">%s</a></li>', add_query_arg( 'section', $document->get_type() ), $document->get_type() == $section ? 'active' : '', $title );
39
- }
40
- ?>
41
- </ul>
42
- </div>
43
- <?php
44
- settings_fields( "wpo_wcpdf_documents_settings_{$section}" );
45
- do_settings_sections( "wpo_wcpdf_documents_settings_{$section}" );
46
- submit_button();
47
- } else {
48
- $documents = WPO_WCPDF()->documents->get_documents('all');
49
- ?>
50
- <p><?php _e('All available documents are listed below. Click on a document to configure it.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
51
- <table class="wcpdf_documents_settings_list">
52
  <?php
53
- $c = false;
54
- foreach ($documents as $document) {
55
- $title = strip_tags($document->get_title());
56
- if (empty(trim($title))) {
57
- $title = __( 'untitled', 'woocommerce-pdf-invoices-packing-slips' );
58
  }
59
- ?>
60
- <tr class="<?php echo (($c = !$c)?"odd":"even"); ?>">
61
- <td class="title"><a href="<?php echo add_query_arg( 'section', $document->get_type() ); ?>"><?php echo $title; ?></a></td>
62
- <td class="settings-icon"><a href="<?php echo add_query_arg( 'section', $document->get_type() ); ?>"><span class="dashicons dashicons-admin-settings"></span></a></td>
63
- </tr>
64
- <?php
65
  }
66
  ?>
67
- </table>
68
- <?php
69
- }
 
 
 
70
  }
71
 
72
  }
15
  }
16
 
17
  public function init_settings() {
18
+ $documents = WPO_WCPDF()->documents->get_documents( 'all' );
19
+ foreach ( $documents as $document ) {
20
  $document->init_settings();
21
  }
22
  }
23
 
24
  public function output( $section ) {
25
+ $section = ! empty( $section ) ? $section : 'invoice';
26
+ $documents = WPO_WCPDF()->documents->get_documents( 'all' );
27
+ ?>
28
+ <div class="wcpdf_document_settings_sections">
29
+ <?php esc_attr_e( 'Documents', 'woocommerce-pdf-invoices-packing-slips' ); ?>:
30
+ <ul>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  <?php
32
+ foreach ( $documents as $document ) {
33
+ $title = strip_tags( $document->get_title() );
34
+ if ( empty( trim( $title ) ) ) {
35
+ $title = '['.__( 'untitled', 'woocommerce-pdf-invoices-packing-slips' ).']';
 
36
  }
37
+ printf( '<li><a href="%s" class="%s">%s</a></li>', add_query_arg( 'section', $document->get_type() ), $document->get_type() == $section ? 'active' : '', esc_html( $title ) );
 
 
 
 
 
38
  }
39
  ?>
40
+ </ul>
41
+ </div>
42
+ <?php
43
+ settings_fields( "wpo_wcpdf_documents_settings_{$section}" );
44
+ do_settings_sections( "wpo_wcpdf_documents_settings_{$section}" );
45
+ submit_button();
46
  }
47
 
48
  }
includes/class-wcpdf-settings-general.php CHANGED
@@ -260,13 +260,13 @@ class Settings_General {
260
  $hide_hint = get_option( 'wpo_wcpdf_hide_attachments_hint' );
261
  }
262
 
263
- if ( $active_tab == 'general' && !$hide_hint ) {
264
  $documents = WPO_WCPDF()->documents->get_documents();
265
 
266
- foreach ($documents as $document) {
267
  if ( $document->get_type() == 'invoice' ) {
268
  $invoice_email_ids = $document->get_attach_to_email_ids();
269
- if (empty($invoice_email_ids)) {
270
  include_once( WPO_WCPDF()->plugin_path() . '/includes/views/attachment-settings-hint.php' );
271
  }
272
  }
@@ -314,18 +314,18 @@ class Settings_General {
314
 
315
  $template_paths = apply_filters( 'wpo_wcpdf_template_paths', $template_paths );
316
 
317
- if ( defined('WP_CONTENT_DIR') && strpos( WP_CONTENT_DIR, ABSPATH ) !== false ) {
318
- $forwardslash_basepath = str_replace('\\','/', ABSPATH);
319
  } else {
320
- $forwardslash_basepath = str_replace('\\','/', WP_CONTENT_DIR);
321
  }
322
 
323
  foreach ($template_paths as $template_source => $template_path) {
324
- $dirs = (array) glob( $template_path . '*' , GLOB_ONLYDIR);
325
 
326
  foreach ($dirs as $dir) {
327
  // we're stripping abspath to make the plugin settings more portable
328
- $forwardslash_dir = str_replace('\\','/', $dir);
329
  $installed_templates[ str_replace( $forwardslash_basepath, '', $forwardslash_dir ) ] = basename($dir);
330
  }
331
  }
260
  $hide_hint = get_option( 'wpo_wcpdf_hide_attachments_hint' );
261
  }
262
 
263
+ if ( $active_tab == 'general' && ! $hide_hint ) {
264
  $documents = WPO_WCPDF()->documents->get_documents();
265
 
266
+ foreach ( $documents as $document ) {
267
  if ( $document->get_type() == 'invoice' ) {
268
  $invoice_email_ids = $document->get_attach_to_email_ids();
269
+ if ( empty( $invoice_email_ids ) ) {
270
  include_once( WPO_WCPDF()->plugin_path() . '/includes/views/attachment-settings-hint.php' );
271
  }
272
  }
314
 
315
  $template_paths = apply_filters( 'wpo_wcpdf_template_paths', $template_paths );
316
 
317
+ if ( defined( 'WP_CONTENT_DIR' ) && strpos( WP_CONTENT_DIR, ABSPATH ) !== false ) {
318
+ $forwardslash_basepath = str_replace( '\\', '/', ABSPATH );
319
  } else {
320
+ $forwardslash_basepath = str_replace( '\\', '/', WP_CONTENT_DIR );
321
  }
322
 
323
  foreach ($template_paths as $template_source => $template_path) {
324
+ $dirs = (array) glob( $template_path . '*' , GLOB_ONLYDIR );
325
 
326
  foreach ($dirs as $dir) {
327
  // we're stripping abspath to make the plugin settings more portable
328
+ $forwardslash_dir = str_replace( '\\', '/', $dir );
329
  $installed_templates[ str_replace( $forwardslash_basepath, '', $forwardslash_dir ) ] = basename($dir);
330
  }
331
  }
includes/class-wcpdf-settings.php CHANGED
@@ -55,8 +55,8 @@ class Settings {
55
 
56
  $this->options_page_hook = add_submenu_page(
57
  $parent_slug,
58
- __( 'PDF Invoices', 'woocommerce-pdf-invoices-packing-slips' ),
59
- __( 'PDF Invoices', 'woocommerce-pdf-invoices-packing-slips' ),
60
  'manage_woocommerce',
61
  'wpo_wcpdf_options_page',
62
  array( $this, 'settings_page' )
@@ -68,7 +68,7 @@ class Settings {
68
  */
69
  public function add_settings_link( $links ) {
70
  $action_links = array(
71
- 'settings' => '<a href="admin.php?page=wpo_wcpdf_options_page">'. __( 'Settings', 'woocommerce' ) . '</a>',
72
  );
73
 
74
  return array_merge( $action_links, $links );
@@ -81,8 +81,8 @@ class Settings {
81
  public function add_support_links( $links, $file ) {
82
  if ( $file == WPO_WCPDF()->plugin_basename ) {
83
  $row_meta = array(
84
- 'docs' => '<a href="https://docs.wpovernight.com/topic/woocommerce-pdf-invoices-packing-slips/" target="_blank" title="' . __( 'Documentation', 'woocommerce-pdf-invoices-packing-slips' ) . '">' . __( 'Documentation', 'woocommerce-pdf-invoices-packing-slips' ) . '</a>',
85
- 'support' => '<a href="https://wordpress.org/support/plugin/woocommerce-pdf-invoices-packing-slips" target="_blank" title="' . __( 'Support Forum', 'woocommerce-pdf-invoices-packing-slips' ) . '">' . __( 'Support Forum', 'woocommerce-pdf-invoices-packing-slips' ) . '</a>',
86
  );
87
 
88
  return array_merge( $links, $row_meta );
@@ -92,10 +92,10 @@ class Settings {
92
 
93
  function check_auto_increment_increment() {
94
  global $wpdb;
95
- $row = $wpdb->get_row("SHOW VARIABLES LIKE 'auto_increment_increment'");
96
- if ( !empty($row) && !empty($row->Value) && $row->Value != 1 ) {
97
  /* translators: database row value */
98
- $error = sprintf( __( "<strong>Warning!</strong> Your database has an AUTO_INCREMENT step size of %s, your invoice numbers may not be sequential. Enable the 'Calculate document numbers (slow)' setting in the Status tab to use an alternate method." , 'woocommerce-pdf-invoices-packing-slips' ), $row->Value );
99
  printf( '<div class="error"><p>%s</p></div>', $error );
100
  }
101
  }
@@ -103,23 +103,23 @@ class Settings {
103
 
104
  public function settings_page() {
105
  $settings_tabs = apply_filters( 'wpo_wcpdf_settings_tabs', array (
106
- 'general' => __('General', 'woocommerce-pdf-invoices-packing-slips' ),
107
- 'documents' => __('Documents', 'woocommerce-pdf-invoices-packing-slips' ),
108
  )
109
  );
110
 
111
  // add status tab last in row
112
- $settings_tabs['debug'] = __('Status', 'woocommerce-pdf-invoices-packing-slips' );
113
 
114
  $active_tab = isset( $_GET[ 'tab' ] ) ? sanitize_text_field( $_GET[ 'tab' ] ) : 'general';
115
  $active_section = isset( $_GET[ 'section' ] ) ? sanitize_text_field( $_GET[ 'section' ] ) : '';
116
 
117
- include('views/wcpdf-settings-page.php');
118
  }
119
 
120
  public function add_settings_fields( $settings_fields, $page, $option_group, $option_name ) {
121
  foreach ( $settings_fields as $settings_field ) {
122
- if (!isset($settings_field['callback'])) {
123
  continue;
124
  } elseif ( is_callable( array( $this->callbacks, $settings_field['callback'] ) ) ) {
125
  $callback = array( $this->callbacks, $settings_field['callback'] );
@@ -146,7 +146,7 @@ class Settings {
146
  $settings_field['args']
147
  );
148
  // register option separately for singular options
149
- if (is_string($settings_field['callback']) && $settings_field['callback'] == 'singular_text_element') {
150
  register_setting( $option_group, $settings_field['args']['option_name'], array( $this->callbacks, 'validate' ) );
151
  }
152
  }
@@ -181,8 +181,8 @@ class Settings {
181
  }
182
 
183
  public function get_document_settings( $document_type ) {
184
- $documents = WPO_WCPDF()->documents->get_documents('all');
185
- foreach ($documents as $document) {
186
  if ( $document->get_type() == $document_type ) {
187
  return $document->settings;
188
  }
@@ -232,7 +232,7 @@ class Settings {
232
 
233
  // add base path, checking if it's not already there
234
  // alternative setups like Bedrock have WP_CONTENT_DIR & ABSPATH separated
235
- if ( defined('WP_CONTENT_DIR') && strpos( WP_CONTENT_DIR, ABSPATH ) !== false ) {
236
  $base_path = $this->normalize_path( ABSPATH );
237
  } else {
238
  $base_path = $this->normalize_path( WP_CONTENT_DIR );
@@ -396,7 +396,7 @@ class Settings {
396
  $this->general_settings['template_path'] = $template_match;
397
  update_option( 'wpo_wcpdf_settings_general', $this->general_settings );
398
  /* translators: 1. path, 2. template ID */
399
- wcpdf_log_error( sprintf( __( 'Template setting migrated from %1$s to %2$s', 'woocommerce-pdf-invoices-packing-slips' ), $path, $template_id ), 'info' );
400
  }
401
  }
402
  }
@@ -404,7 +404,7 @@ class Settings {
404
  public function set_number_store() {
405
  check_ajax_referer( "wpo_wcpdf_next_{$_POST['store']}", 'security' );
406
  // check permissions
407
- if ( !current_user_can('manage_woocommerce') ) {
408
  die();
409
  }
410
 
@@ -422,7 +422,7 @@ class Settings {
422
 
423
  // safety first - always use calculate when auto_increment_increment is not 1
424
  $row = $wpdb->get_row("SHOW VARIABLES LIKE 'auto_increment_increment'");
425
- if ( !empty($row) && !empty($row->Value) && $row->Value != 1 ) {
426
  $method = 'calculate';
427
  }
428
 
55
 
56
  $this->options_page_hook = add_submenu_page(
57
  $parent_slug,
58
+ esc_html__( 'PDF Invoices', 'woocommerce-pdf-invoices-packing-slips' ),
59
+ esc_html__( 'PDF Invoices', 'woocommerce-pdf-invoices-packing-slips' ),
60
  'manage_woocommerce',
61
  'wpo_wcpdf_options_page',
62
  array( $this, 'settings_page' )
68
  */
69
  public function add_settings_link( $links ) {
70
  $action_links = array(
71
+ 'settings' => '<a href="admin.php?page=wpo_wcpdf_options_page">'. esc_html__( 'Settings', 'woocommerce' ) . '</a>',
72
  );
73
 
74
  return array_merge( $action_links, $links );
81
  public function add_support_links( $links, $file ) {
82
  if ( $file == WPO_WCPDF()->plugin_basename ) {
83
  $row_meta = array(
84
+ 'docs' => '<a href="https://docs.wpovernight.com/topic/woocommerce-pdf-invoices-packing-slips/" target="_blank" title="' . esc_html__( 'Documentation', 'woocommerce-pdf-invoices-packing-slips' ) . '">' . esc_html__( 'Documentation', 'woocommerce-pdf-invoices-packing-slips' ) . '</a>',
85
+ 'support' => '<a href="https://wordpress.org/support/plugin/woocommerce-pdf-invoices-packing-slips" target="_blank" title="' . esc_html__( 'Support Forum', 'woocommerce-pdf-invoices-packing-slips' ) . '">' . esc_html__( 'Support Forum', 'woocommerce-pdf-invoices-packing-slips' ) . '</a>',
86
  );
87
 
88
  return array_merge( $links, $row_meta );
92
 
93
  function check_auto_increment_increment() {
94
  global $wpdb;
95
+ $row = $wpdb->get_row( "SHOW VARIABLES LIKE 'auto_increment_increment'" );
96
+ if ( ! empty( $row ) && ! empty( $row->Value ) && $row->Value != 1 ) {
97
  /* translators: database row value */
98
+ $error = wp_kses_post( sprintf( __( "<strong>Warning!</strong> Your database has an AUTO_INCREMENT step size of %d, your invoice numbers may not be sequential. Enable the 'Calculate document numbers (slow)' setting in the Status tab to use an alternate method." , 'woocommerce-pdf-invoices-packing-slips' ), intval( $row->Value ) ) );
99
  printf( '<div class="error"><p>%s</p></div>', $error );
100
  }
101
  }
103
 
104
  public function settings_page() {
105
  $settings_tabs = apply_filters( 'wpo_wcpdf_settings_tabs', array (
106
+ 'general' => __( 'General', 'woocommerce-pdf-invoices-packing-slips' ),
107
+ 'documents' => __( 'Documents', 'woocommerce-pdf-invoices-packing-slips' ),
108
  )
109
  );
110
 
111
  // add status tab last in row
112
+ $settings_tabs['debug'] = __( 'Status', 'woocommerce-pdf-invoices-packing-slips' );
113
 
114
  $active_tab = isset( $_GET[ 'tab' ] ) ? sanitize_text_field( $_GET[ 'tab' ] ) : 'general';
115
  $active_section = isset( $_GET[ 'section' ] ) ? sanitize_text_field( $_GET[ 'section' ] ) : '';
116
 
117
+ include( 'views/wcpdf-settings-page.php' );
118
  }
119
 
120
  public function add_settings_fields( $settings_fields, $page, $option_group, $option_name ) {
121
  foreach ( $settings_fields as $settings_field ) {
122
+ if ( ! isset( $settings_field['callback'] ) ) {
123
  continue;
124
  } elseif ( is_callable( array( $this->callbacks, $settings_field['callback'] ) ) ) {
125
  $callback = array( $this->callbacks, $settings_field['callback'] );
146
  $settings_field['args']
147
  );
148
  // register option separately for singular options
149
+ if ( is_string( $settings_field['callback'] ) && $settings_field['callback'] == 'singular_text_element') {
150
  register_setting( $option_group, $settings_field['args']['option_name'], array( $this->callbacks, 'validate' ) );
151
  }
152
  }
181
  }
182
 
183
  public function get_document_settings( $document_type ) {
184
+ $documents = WPO_WCPDF()->documents->get_documents( 'all' );
185
+ foreach ( $documents as $document ) {
186
  if ( $document->get_type() == $document_type ) {
187
  return $document->settings;
188
  }
232
 
233
  // add base path, checking if it's not already there
234
  // alternative setups like Bedrock have WP_CONTENT_DIR & ABSPATH separated
235
+ if ( defined( 'WP_CONTENT_DIR' ) && strpos( WP_CONTENT_DIR, ABSPATH ) !== false ) {
236
  $base_path = $this->normalize_path( ABSPATH );
237
  } else {
238
  $base_path = $this->normalize_path( WP_CONTENT_DIR );
396
  $this->general_settings['template_path'] = $template_match;
397
  update_option( 'wpo_wcpdf_settings_general', $this->general_settings );
398
  /* translators: 1. path, 2. template ID */
399
+ wcpdf_log_error( sprintf( 'Template setting migrated from %1$s to %2$s', $path, $template_id ), 'info' );
400
  }
401
  }
402
  }
404
  public function set_number_store() {
405
  check_ajax_referer( "wpo_wcpdf_next_{$_POST['store']}", 'security' );
406
  // check permissions
407
+ if ( ! current_user_can( 'manage_woocommerce' ) ) {
408
  die();
409
  }
410
 
422
 
423
  // safety first - always use calculate when auto_increment_increment is not 1
424
  $row = $wpdb->get_row("SHOW VARIABLES LIKE 'auto_increment_increment'");
425
+ if ( ! empty( $row ) && ! empty( $row->Value ) && $row->Value != 1 ) {
426
  $method = 'calculate';
427
  }
428
 
includes/class-wcpdf-setup-wizard.php CHANGED
@@ -96,9 +96,7 @@ class Setup_Wizard {
96
  );
97
  wp_enqueue_media();
98
 
99
-
100
-
101
- $step_keys = array_keys($this->steps);
102
  if ( end( $step_keys ) === $this->step ) {
103
  wp_register_script(
104
  'wpo-wcpdf-setup-confetti',
@@ -110,10 +108,11 @@ class Setup_Wizard {
110
 
111
  if ( ! empty( $_POST['save_step'] ) ) {
112
  $this->save_step();
113
- // echo '<pre>';var_dump($_POST);echo '</pre>';die();
114
- // call_user_func( $this->steps[ $this->step ]['handler'], $this );
115
  }
116
 
 
 
 
117
  ob_start();
118
  $this->setup_wizard_header();
119
  $this->setup_wizard_steps();
@@ -128,7 +127,7 @@ class Setup_Wizard {
128
  public function setup_wizard_header() {
129
  ?>
130
  <!DOCTYPE html>
131
- <html <?php language_attributes(); ?> class="wpo-wizzard">
132
  <head>
133
  <meta name="viewport" content="width=device-width" />
134
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
@@ -152,16 +151,16 @@ class Setup_Wizard {
152
  // array_shift( $output_steps );
153
  ?>
154
  <div class="wpo-setup-card">
155
- <h1 class="wpo-plugin-title">PDF Invoices & Packing Slips</h1>
156
  <ol class="wpo-progress-bar">
157
  <?php foreach ( $output_steps as $step_key => $step ) : ?>
158
- <a href="<?php echo $this->get_step_link($step_key); ?>" ><li><div class="wpo-progress-marker <?php
159
  if ( $step_key === $this->step ) {
160
  echo 'active';
161
  } elseif ( array_search( $this->step, array_keys( $this->steps ) ) > array_search( $step_key, array_keys( $this->steps ) ) ) {
162
  echo 'completed';
163
  }
164
- ?>"><?php //echo esc_html( $step['name'] ); ?></div></li></a>
165
  <?php endforeach; ?>
166
  </ol>
167
  <?php
@@ -181,18 +180,18 @@ class Setup_Wizard {
181
  */
182
  public function setup_wizard_footer() {
183
  ?>
184
- <input type="hidden" name="wpo_wcpdf_step" value="<?php echo $this->step ?>">
185
  <div class="wpo-setup-buttons">
186
- <?php if ($step = $this->get_step(-1)): ?>
187
- <a href="<?php echo $this->get_step_link($step); ?>" class="wpo-button-previous"><?php _e( 'Previous', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
188
  <?php endif ?>
189
  <!-- <input type="submit" class="wpo-button-next" value="Next" /> -->
190
- <?php if ($step = $this->get_step(1)): ?>
191
  <?php wp_nonce_field( 'wpo-wcpdf-setup' ); ?>
192
  <input type="submit" class="wpo-button-next" value="<?php esc_attr_e( 'Next', 'woocommerce-pdf-invoices-packing-slips' ); ?>" name="save_step" />
193
- <a href="<?php echo $this->get_step_link($step); ?>" class="wpo-skip-step"><?php _e( 'Skip this step', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
194
  <?php else: ?>
195
- <a href="<?php echo $this->get_step_link($step); ?>" class="wpo-button-next"><?php _e( 'Finish', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
196
  <?php endif ?>
197
  </div>
198
  </div>
@@ -205,7 +204,7 @@ class Setup_Wizard {
205
 
206
  public function get_step_link( $step ) {
207
  $step_keys = array_keys( $this->steps );
208
- if ( end( $step_keys ) === $this->step && empty($step)) {
209
  return admin_url('admin.php?page=wpo_wcpdf_options_page');
210
  }
211
  return add_query_arg( 'step', $step );
@@ -216,7 +215,7 @@ class Setup_Wizard {
216
  $step_keys = array_keys( $this->steps );
217
  $current_step_pos = array_search( $this->step, $step_keys );
218
  $new_step_pos = $current_step_pos + $delta;
219
- if (isset($step_keys[$new_step_pos])) {
220
  return $step_keys[$new_step_pos];
221
  } else {
222
  return false;
@@ -231,35 +230,33 @@ class Setup_Wizard {
231
  } else {
232
  $user_id = get_current_user_id();
233
  $hidden = get_user_meta( $user_id, 'manageedit-shop_ordercolumnshidden', true );
234
- if (!empty($_POST['wcpdf_settings']) && is_array($_POST['wcpdf_settings'])) {
235
  check_admin_referer( 'wpo-wcpdf-setup' );
236
- foreach ($_POST['wcpdf_settings'] as $option => $settings) {
237
  // sanitize posted settings
238
- foreach ($settings as $key => $value) {
239
- if ( $key == 'shop_address' && function_exists('sanitize_textarea_field') ) {
240
  $sanitize_function = 'sanitize_textarea_field';
241
  } else {
242
  $sanitize_function = 'sanitize_text_field';
243
  }
244
 
245
- if (is_array($value)) {
246
- $settings[$key] = array_map($sanitize_function, $value);
247
  } else {
248
- $settings[$key] = call_user_func($sanitize_function, $value );
249
  }
250
  }
251
  $current_settings = get_option( $option, array() );
252
  $new_settings = $settings + $current_settings;
253
- // echo "<pre>".var_export($settings,true)."</pre>";
254
- // echo "<pre>".var_export($new_settings,true)."</pre>";die();
255
  update_option( $option, $new_settings );
256
  }
257
  } elseif ( $_POST['wpo_wcpdf_step'] == 'show-action-buttons' ) {
258
- if ( !empty( $_POST['wc_show_action_buttons'] ) ) {
259
  $hidden = array_filter( $hidden, function( $setting ){ return $setting !== 'wc_actions'; } );
260
  update_user_meta( $user_id, 'manageedit-shop_ordercolumnshidden', $hidden );
261
  } else {
262
- array_push($hidden, 'wc_actions');
263
  update_user_meta( $user_id, 'manageedit-shop_ordercolumnshidden', $hidden );
264
  }
265
  }
96
  );
97
  wp_enqueue_media();
98
 
99
+ $step_keys = array_keys( $this->steps );
 
 
100
  if ( end( $step_keys ) === $this->step ) {
101
  wp_register_script(
102
  'wpo-wcpdf-setup-confetti',
108
 
109
  if ( ! empty( $_POST['save_step'] ) ) {
110
  $this->save_step();
 
 
111
  }
112
 
113
+ // disable query monitor during wizard
114
+ add_filter( 'qm/dispatch/html', '__return_false' );
115
+
116
  ob_start();
117
  $this->setup_wizard_header();
118
  $this->setup_wizard_steps();
127
  public function setup_wizard_header() {
128
  ?>
129
  <!DOCTYPE html>
130
+ <html <?php language_attributes(); ?> class="wpo-wizard">
131
  <head>
132
  <meta name="viewport" content="width=device-width" />
133
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
151
  // array_shift( $output_steps );
152
  ?>
153
  <div class="wpo-setup-card">
154
+ <h1 class="wpo-plugin-title"><?php esc_html_e( 'PDF Invoices & Packing Slips', 'woocommerce-pdf-invoices-packing-slips' ); ?></h1>
155
  <ol class="wpo-progress-bar">
156
  <?php foreach ( $output_steps as $step_key => $step ) : ?>
157
+ <a href="<?php echo esc_attr( $this->get_step_link( $step_key ) ); ?>" ><li><div class="wpo-progress-marker <?php
158
  if ( $step_key === $this->step ) {
159
  echo 'active';
160
  } elseif ( array_search( $this->step, array_keys( $this->steps ) ) > array_search( $step_key, array_keys( $this->steps ) ) ) {
161
  echo 'completed';
162
  }
163
+ ?>"></div></li></a>
164
  <?php endforeach; ?>
165
  </ol>
166
  <?php
180
  */
181
  public function setup_wizard_footer() {
182
  ?>
183
+ <input type="hidden" name="wpo_wcpdf_step" value="<?php echo esc_attr( $this->step ); ?>">
184
  <div class="wpo-setup-buttons">
185
+ <?php if ( $step = $this->get_step( -1 ) ): ?>
186
+ <a href="<?php echo esc_attr( $this->get_step_link( $step ) ); ?>" class="wpo-button-previous"><?php esc_html_e( 'Previous', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
187
  <?php endif ?>
188
  <!-- <input type="submit" class="wpo-button-next" value="Next" /> -->
189
+ <?php if ( $step = $this->get_step( 1 ) ): ?>
190
  <?php wp_nonce_field( 'wpo-wcpdf-setup' ); ?>
191
  <input type="submit" class="wpo-button-next" value="<?php esc_attr_e( 'Next', 'woocommerce-pdf-invoices-packing-slips' ); ?>" name="save_step" />
192
+ <a href="<?php echo esc_attr( $this->get_step_link( $step ) ); ?>" class="wpo-skip-step"><?php esc_html_e( 'Skip this step', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
193
  <?php else: ?>
194
+ <a href="<?php echo esc_attr( $this->get_step_link($step) ); ?>" class="wpo-button-next"><?php esc_html_e( 'Finish', 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
195
  <?php endif ?>
196
  </div>
197
  </div>
204
 
205
  public function get_step_link( $step ) {
206
  $step_keys = array_keys( $this->steps );
207
+ if ( end( $step_keys ) === $this->step && empty( $step ) ) {
208
  return admin_url('admin.php?page=wpo_wcpdf_options_page');
209
  }
210
  return add_query_arg( 'step', $step );
215
  $step_keys = array_keys( $this->steps );
216
  $current_step_pos = array_search( $this->step, $step_keys );
217
  $new_step_pos = $current_step_pos + $delta;
218
+ if ( isset( $step_keys[$new_step_pos] ) ) {
219
  return $step_keys[$new_step_pos];
220
  } else {
221
  return false;
230
  } else {
231
  $user_id = get_current_user_id();
232
  $hidden = get_user_meta( $user_id, 'manageedit-shop_ordercolumnshidden', true );
233
+ if ( ! empty( $_POST['wcpdf_settings'] ) && is_array( $_POST['wcpdf_settings'] ) ) {
234
  check_admin_referer( 'wpo-wcpdf-setup' );
235
+ foreach ( $_POST['wcpdf_settings'] as $option => $settings ) {
236
  // sanitize posted settings
237
+ foreach ( $settings as $key => $value ) {
238
+ if ( $key == 'shop_address' && function_exists( 'sanitize_textarea_field' ) ) {
239
  $sanitize_function = 'sanitize_textarea_field';
240
  } else {
241
  $sanitize_function = 'sanitize_text_field';
242
  }
243
 
244
+ if ( is_array( $value ) ) {
245
+ $settings[$key] = array_map( $sanitize_function, $value );
246
  } else {
247
+ $settings[$key] = call_user_func( $sanitize_function, $value );
248
  }
249
  }
250
  $current_settings = get_option( $option, array() );
251
  $new_settings = $settings + $current_settings;
 
 
252
  update_option( $option, $new_settings );
253
  }
254
  } elseif ( $_POST['wpo_wcpdf_step'] == 'show-action-buttons' ) {
255
+ if ( ! empty( $_POST['wc_show_action_buttons'] ) ) {
256
  $hidden = array_filter( $hidden, function( $setting ){ return $setting !== 'wc_actions'; } );
257
  update_user_meta( $user_id, 'manageedit-shop_ordercolumnshidden', $hidden );
258
  } else {
259
+ array_push( $hidden, 'wc_actions' );
260
  update_user_meta( $user_id, 'manageedit-shop_ordercolumnshidden', $hidden );
261
  }
262
  }
includes/documents/abstract-wcpdf-order-document.php CHANGED
@@ -225,9 +225,9 @@ abstract class Order_Document {
225
  // pass data to setter functions
226
  $this->set_data( array(
227
  // always load date before number, because date is used in number formatting
228
- 'date' => WCX_Order::get_meta( $order, "_wcpdf_{$this->slug}_date", true ),
229
- 'number' => $number,
230
- 'notes' => WCX_Order::get_meta( $order, "_wcpdf_{$this->slug}_notes", true ),
231
  ), $order );
232
 
233
  return;
@@ -334,6 +334,7 @@ abstract class Order_Document {
334
  $parent_order = wc_get_order( $order->get_parent_id() );
335
  } /*translators: 1. credit note title, 2. refund id */
336
  $note = $refund_id ? sprintf( __( '%1$s (refund #%2$s) was regenerated.', 'woocommerce-pdf-invoices-packing-slips' ), ucfirst( $this->get_title() ), $refund_id ) : sprintf( __( '%s was regenerated', 'woocommerce-pdf-invoices-packing-slips' ), ucfirst( $this->get_title() ) );
 
337
  $parent_order ? $parent_order->add_order_note( $note ) : $order->add_order_note( $note );
338
 
339
  do_action( 'wpo_wcpdf_regenerate_document', $this );
@@ -605,13 +606,13 @@ abstract class Order_Document {
605
  $attachment_width = $attachment[1];
606
  $attachment_height = $attachment[2];
607
 
608
- if ( apply_filters('wpo_wcpdf_use_path', true) && file_exists($attachment_path) ) {
609
  $src = $attachment_path;
610
  } else {
611
  $src = $attachment_src;
612
  }
613
 
614
- $img_element = sprintf('<img src="%1$s" alt="%4$s" />', $src, $attachment_width, $attachment_height, esc_attr( $company ) );
615
 
616
  echo apply_filters( 'wpo_wcpdf_header_logo_img_element', $img_element, $attachment, $this );
617
  }
225
  // pass data to setter functions
226
  $this->set_data( array(
227
  // always load date before number, because date is used in number formatting
228
+ 'date' => WCX_Order::get_meta( $order, "_wcpdf_{$this->slug}_date", true ),
229
+ 'number' => $number,
230
+ 'notes' => WCX_Order::get_meta( $order, "_wcpdf_{$this->slug}_notes", true ),
231
  ), $order );
232
 
233
  return;
334
  $parent_order = wc_get_order( $order->get_parent_id() );
335
  } /*translators: 1. credit note title, 2. refund id */
336
  $note = $refund_id ? sprintf( __( '%1$s (refund #%2$s) was regenerated.', 'woocommerce-pdf-invoices-packing-slips' ), ucfirst( $this->get_title() ), $refund_id ) : sprintf( __( '%s was regenerated', 'woocommerce-pdf-invoices-packing-slips' ), ucfirst( $this->get_title() ) );
337
+ $note = wp_kses( $note, 'strip' );
338
  $parent_order ? $parent_order->add_order_note( $note ) : $order->add_order_note( $note );
339
 
340
  do_action( 'wpo_wcpdf_regenerate_document', $this );
606
  $attachment_width = $attachment[1];
607
  $attachment_height = $attachment[2];
608
 
609
+ if ( apply_filters( 'wpo_wcpdf_use_path', true ) && file_exists( $attachment_path ) ) {
610
  $src = $attachment_path;
611
  } else {
612
  $src = $attachment_src;
613
  }
614
 
615
+ $img_element = sprintf('<img src="%1$s" alt="%2$s" />', esc_attr( $src ), esc_attr( $company ) );
616
 
617
  echo apply_filters( 'wpo_wcpdf_header_logo_img_element', $img_element, $attachment, $this );
618
  }
includes/views/attachment-settings-hint.php CHANGED
@@ -1,9 +1,9 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <?php
3
  $invoice_settings_url = add_query_arg( array(
4
- 'tab' => 'documents',
5
- 'section' => 'invoice',
6
- ) );
7
  ?>
8
  <style>
9
  .wcpdf-attachment-settings-hint {
@@ -17,9 +17,8 @@ $invoice_settings_url = add_query_arg( array(
17
  font-size: 120%;
18
  }
19
  </style>
20
- <!-- <div id="message" class="updated woocommerce-message"> -->
21
  <div class="wcpdf-attachment-settings-hint">
22
- <?php /* translators: <a> tags */ ?>
23
- <?php printf(__( 'It looks like you haven\'t setup any email attachments yet, check the settings under <b>%1$sDocuments > Invoice%2$s</b>', 'woocommerce-pdf-invoices-packing-slips' ), '<a href="'.$invoice_settings_url.'">', '</a>'); ?><br>
24
- <?php printf('<a href="%s" style="font">%s</a>', add_query_arg( 'wpo_wcpdf_hide_attachments_hint', 'true' ), __( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ) ); ?>
25
  </div>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <?php
3
  $invoice_settings_url = add_query_arg( array(
4
+ 'tab' => 'documents',
5
+ 'section' => 'invoice',
6
+ ) );
7
  ?>
8
  <style>
9
  .wcpdf-attachment-settings-hint {
17
  font-size: 120%;
18
  }
19
  </style>
 
20
  <div class="wcpdf-attachment-settings-hint">
21
+ <?php /* translators: <a> tags */ ?>
22
+ <?php printf( wp_kses_post( __( 'It looks like you haven\'t setup any email attachments yet, check the settings under <b>%1$sDocuments > Invoice%2$s</b>', 'woocommerce-pdf-invoices-packing-slips' ) ), '<a href="'.$invoice_settings_url.'">', '</a>' ); ?><br>
23
+ <?php printf( '<a href="%s" style="font">%s</a>', add_query_arg( 'wpo_wcpdf_hide_attachments_hint', 'true' ), esc_html__( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ) ); ?>
24
  </div>
includes/views/dompdf-status.php CHANGED
@@ -95,25 +95,25 @@ if ( ( $gm = extension_loaded('gmagick') ) || ( $im = extension_loaded('imagick'
95
 
96
  if( ! $server_configs['PHP version']['result'] ) {
97
  /* translators: <a> tags */
98
- $server_configs['PHP version']['required'] .= sprintf( __( '<br/>Download %1$sthis addon%2$s to enable backwards compatibility.', 'woocommerce-pdf-invoices-packing-slips' ), '<a href="https://docs.wpovernight.com/woocommerce-pdf-invoices-packing-slips/backwards-compatibility-with-php-5-6/" target="_blank">', '</a>' );
99
  }
100
 
101
  ?>
102
 
103
- <h3 id="system"><?php _e( 'System Configuration', 'woocommerce-pdf-invoices-packing-slips' ); ?></h3>
104
 
105
  <table cellspacing="1px" cellpadding="4px" style="background-color: white; padding: 5px; border: 1px solid #ccc;">
106
  <tr>
107
  <th align="left">&nbsp;</th>
108
- <th align="left"><?php _e( 'Required', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
109
- <th align="left"><?php _e( 'Present', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
110
  </tr>
111
 
112
- <?php foreach( $server_configs as $label => $server_config ) {
113
  if ( $server_config['result'] ) {
114
  $background = '#9e4';
115
  $color = 'black';
116
- } elseif ( isset($server_config['fallback']) ) {
117
  $background = '#FCC612';
118
  $color = 'black';
119
  } else {
@@ -122,18 +122,18 @@ if( ! $server_configs['PHP version']['result'] ) {
122
  }
123
  ?>
124
  <tr>
125
- <td class="title"><?php echo $label; ?></td>
126
- <td><?php echo ($server_config['required'] === true ? 'Yes' : $server_config['required']); ?></td>
127
  <td style="background-color:<?php echo $background; ?>; color:<?php echo $color; ?>">
128
  <?php
129
- echo $server_config['value'];
130
- if ($server_config['result'] && !$server_config['value']) echo 'Yes';
131
- if (!$server_config['result']) {
132
- if (isset($server_config['fallback'])) {
133
- echo '<div>No. '.$server_config['fallback'].'</div>';
134
  }
135
- if (isset($server_config['failure'])) {
136
- echo '<div>'.$server_config['failure'].'</div>';
137
  }
138
  }
139
  ?>
@@ -180,12 +180,12 @@ if( ! $server_configs['PHP version']['result'] ) {
180
  $upload_base = trailingslashit( $upload_dir['basedir'] );
181
  ?>
182
  <br />
183
- <h3 id="system"><?php _e( 'Write Permissions', 'woocommerce-pdf-invoices-packing-slips' ); ?></h3>
184
  <table cellspacing="1px" cellpadding="4px" style="background-color: white; padding: 5px; border: 1px solid #ccc;">
185
  <tr>
186
- <th align="left"><?php _e( 'Description', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
187
- <th align="left"><?php _e( 'Value', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
188
- <th align="left"><?php _e( 'Status', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
189
  </tr>
190
  <?php
191
  foreach ( $permissions as $permission ) {
@@ -198,9 +198,9 @@ if( ! $server_configs['PHP version']['result'] ) {
198
  }
199
  ?>
200
  <tr>
201
- <td><?php echo $permission['description']; ?></td>
202
- <td><?php echo str_replace( array('/','\\' ), array('/<wbr>','\\<wbr>' ), $permission['value'] ); ?></td>
203
- <td style="background-color:<?php echo $background; ?>; color:<?php echo $color; ?>"><?php echo $permission['status_message']; ?></td>
204
  </tr>
205
 
206
  <?php } ?>
@@ -210,7 +210,7 @@ if( ! $server_configs['PHP version']['result'] ) {
210
  <p>
211
  <?php
212
  /* translators: 1,2. directory paths, 3. UPLOADS, 4. wpo_wcpdf_tmp_path, 5. attachments, 6. dompdf, 7. fonts */
213
- printf( __( 'The central temp folder is %1$s. By default, this folder is created in the WordPress uploads folder (%2$s), which can be defined by setting %3$s in wp-config.php. Alternatively, you can control the specific folder for PDF invoices by using the %4$s filter. Make sure this folder is writable and that the subfolders %5$s, %6$s and %7$s are present (these will be created by the plugin if the central temp folder is writable).', 'woocommerce-pdf-invoices-packing-slips' ),
214
  '<code>'.WPO_WCPDF()->main->get_tmp_path().'</code>',
215
  '<code>'.$upload_base.'</code>',
216
  '<code>UPLOADS</code>',
@@ -223,7 +223,7 @@ if( ! $server_configs['PHP version']['result'] ) {
223
  </p>
224
  <?php
225
  /* translators: directory path */
226
- printf( __('If the temporary folders were not automatically created by the plugin, verify that all the font files (from %s) are copied to the fonts folder. Normally, this is fully automated, but if your server has strict security settings, this automated copying may have been prohibited. In that case, you also need to make sure these folders get synchronized on plugin updates!', 'woocommerce-pdf-invoices-packing-slips' ),
227
  '<code>'.WPO_WCPDF()->plugin_path() . "/vendor/dompdf/dompdf/lib/fonts/".'</code>'
228
  );
229
  ?>
95
 
96
  if( ! $server_configs['PHP version']['result'] ) {
97
  /* translators: <a> tags */
98
+ $server_configs['PHP version']['required'] .= '<br/>' . sprintf( __( 'Download %1$sthis addon%2$s to enable backwards compatibility.', 'woocommerce-pdf-invoices-packing-slips' ), '<a href="https://docs.wpovernight.com/woocommerce-pdf-invoices-packing-slips/backwards-compatibility-with-php-5-6/" target="_blank">', '</a>' );
99
  }
100
 
101
  ?>
102
 
103
+ <h3 id="system"><?php esc_html_e( 'System Configuration', 'woocommerce-pdf-invoices-packing-slips' ); ?></h3>
104
 
105
  <table cellspacing="1px" cellpadding="4px" style="background-color: white; padding: 5px; border: 1px solid #ccc;">
106
  <tr>
107
  <th align="left">&nbsp;</th>
108
+ <th align="left"><?php esc_html_e( 'Required', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
109
+ <th align="left"><?php esc_html_e( 'Present', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
110
  </tr>
111
 
112
+ <?php foreach ( $server_configs as $label => $server_config ) {
113
  if ( $server_config['result'] ) {
114
  $background = '#9e4';
115
  $color = 'black';
116
+ } elseif ( isset( $server_config['fallback'] ) ) {
117
  $background = '#FCC612';
118
  $color = 'black';
119
  } else {
122
  }
123
  ?>
124
  <tr>
125
+ <td class="title"><?php echo wp_kses_post( $label ); ?></td>
126
+ <td><?php echo wp_kses_post( $server_config['required'] === true ? esc_html__( 'Yes', 'woocommerce-pdf-invoices-packing-slips' ) : $server_config['required'] ); ?></td>
127
  <td style="background-color:<?php echo $background; ?>; color:<?php echo $color; ?>">
128
  <?php
129
+ echo wp_kses_post( $server_config['value'] );
130
+ if ( $server_config['result'] && ! $server_config['value'] ) echo esc_html__( 'Yes', 'woocommerce-pdf-invoices-packing-slips' );
131
+ if ( ! $server_config['result'] ) {
132
+ if ( isset( $server_config['fallback'] ) ) {
133
+ printf( '<div>%s. %s</div>', esc_html__( 'No', 'woocommerce-pdf-invoices-packing-slips' ), esc_html( $server_config['fallback'] ) );
134
  }
135
+ if ( isset( $server_config['failure'] ) ) {
136
+ printf( '<div>%s</div>', wp_kses_post( $server_config['failure'] ) );
137
  }
138
  }
139
  ?>
180
  $upload_base = trailingslashit( $upload_dir['basedir'] );
181
  ?>
182
  <br />
183
+ <h3 id="system"><?php esc_html_e( 'Write Permissions', 'woocommerce-pdf-invoices-packing-slips' ); ?></h3>
184
  <table cellspacing="1px" cellpadding="4px" style="background-color: white; padding: 5px; border: 1px solid #ccc;">
185
  <tr>
186
+ <th align="left"><?php esc_html_e( 'Description', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
187
+ <th align="left"><?php esc_html_e( 'Value', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
188
+ <th align="left"><?php esc_html_e( 'Status', 'woocommerce-pdf-invoices-packing-slips' ); ?></th>
189
  </tr>
190
  <?php
191
  foreach ( $permissions as $permission ) {
198
  }
199
  ?>
200
  <tr>
201
+ <td><?php echo wp_kses_post( $permission['description'] ); ?></td>
202
+ <td><?php echo str_replace( array('/','\\' ), array('/<wbr>','\\<wbr>' ), wp_kses_post( $permission['value'] ) ); ?></td>
203
+ <td style="background-color:<?php echo $background; ?>; color:<?php echo $color; ?>"><?php echo wp_kses_post( $permission['status_message'] ); ?></td>
204
  </tr>
205
 
206
  <?php } ?>
210
  <p>
211
  <?php
212
  /* translators: 1,2. directory paths, 3. UPLOADS, 4. wpo_wcpdf_tmp_path, 5. attachments, 6. dompdf, 7. fonts */
213
+ printf( esc_attr__( 'The central temp folder is %1$s. By default, this folder is created in the WordPress uploads folder (%2$s), which can be defined by setting %3$s in wp-config.php. Alternatively, you can control the specific folder for PDF invoices by using the %4$s filter. Make sure this folder is writable and that the subfolders %5$s, %6$s and %7$s are present (these will be created by the plugin if the central temp folder is writable).', 'woocommerce-pdf-invoices-packing-slips' ),
214
  '<code>'.WPO_WCPDF()->main->get_tmp_path().'</code>',
215
  '<code>'.$upload_base.'</code>',
216
  '<code>UPLOADS</code>',
223
  </p>
224
  <?php
225
  /* translators: directory path */
226
+ printf( esc_attr__('If the temporary folders were not automatically created by the plugin, verify that all the font files (from %s) are copied to the fonts folder. Normally, this is fully automated, but if your server has strict security settings, this automated copying may have been prohibited. In that case, you also need to make sure these folders get synchronized on plugin updates!', 'woocommerce-pdf-invoices-packing-slips' ),
227
  '<code>'.WPO_WCPDF()->plugin_path() . "/vendor/dompdf/dompdf/lib/fonts/".'</code>'
228
  );
229
  ?>
includes/views/setup-wizard/attach-to.php CHANGED
@@ -1,31 +1,35 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
- <h2><?php _e( 'Attach too...', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
- <p><?php _e( 'Select to which emails you would like to attach your invoice.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
  <table>
8
  <?php
9
  $current_settings = get_option( 'wpo_wcpdf_documents_settings_invoice', array() );
10
- // echo "<pre>".var_dump($current_settings)."</pre>";
11
  // load invoice to reuse method to get wc emails
12
  $invoice = wcpdf_get_invoice( null );
13
  $wc_emails = $invoice->get_wc_emails();
14
- foreach ($wc_emails as $email_id => $name) {
15
- if (!empty($current_settings['attach_to_email_ids'][$email_id])) {
16
  $checked = 'checked';
17
  } else {
18
  $checked = '';
19
  }
20
- printf('<tr>
21
- <th>
22
- <input type="hidden" value="" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][attach_to_email_ids][%1$s]">
23
- <input type="checkbox" %3$s name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][attach_to_email_ids][%1$s]" value="1">
24
- </th>
25
- <td>
26
- <span class="checkbox">%2$s</span><br>
27
- </td>
28
- </tr>', $email_id, $name, $checked);
 
 
 
 
 
29
 
30
  }
31
  ?>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
+ <h2><?php esc_html_e( 'Attach to...', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
+ <p><?php esc_html_e( 'Select to which emails you would like to attach your invoice.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
  <table>
8
  <?php
9
  $current_settings = get_option( 'wpo_wcpdf_documents_settings_invoice', array() );
 
10
  // load invoice to reuse method to get wc emails
11
  $invoice = wcpdf_get_invoice( null );
12
  $wc_emails = $invoice->get_wc_emails();
13
+ foreach ( $wc_emails as $email_id => $name ) {
14
+ if ( ! empty( $current_settings['attach_to_email_ids'][$email_id] ) ) {
15
  $checked = 'checked';
16
  } else {
17
  $checked = '';
18
  }
19
+ printf(
20
+ '<tr>
21
+ <th>
22
+ <input type="hidden" value="" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][attach_to_email_ids][%1$s]">
23
+ <input type="checkbox" %3$s name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][attach_to_email_ids][%1$s]" value="1">
24
+ </th>
25
+ <td>
26
+ <span class="checkbox">%2$s</span><br>
27
+ </td>
28
+ </tr>',
29
+ esc_attr( $email_id ),
30
+ esc_html( $name ),
31
+ esc_attr( $checked )
32
+ );
33
 
34
  }
35
  ?>
includes/views/setup-wizard/display-options.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
- <h2><?php _e( 'Display options', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
- <p><?php _e( 'Select some additional display options for your invoice.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
  <table>
@@ -11,46 +11,46 @@
11
  <tr>
12
  <th>
13
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_shipping_address]" value="">
14
- <input type="checkbox" <?php echo !empty($current_settings['display_shipping_address']) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_shipping_address]" value="1">
15
  </th>
16
  <td>
17
- <span class="checkbox"><?php _e( 'Display shipping address', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
18
  </td>
19
  </tr>
20
  <tr>
21
  <th>
22
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_email]" value="">
23
- <input type="checkbox" <?php echo !empty($current_settings['display_email']) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_email]" value="1">
24
  </th>
25
  <td>
26
- <span class="checkbox"><?php _e( 'Display email address', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
27
  </td>
28
  </tr>
29
  <tr>
30
  <th>
31
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_phone]" value="">
32
- <input type="checkbox" <?php echo !empty($current_settings['display_phone']) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_phone]" value="1">
33
  </th>
34
  <td>
35
- <span class="checkbox"><?php _e( 'Display phone number', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
36
  </td>
37
  </tr>
38
  <tr>
39
  <th>
40
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_date]" value="">
41
- <input type="checkbox" <?php echo !empty($current_settings['display_date']) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_date]" value="invoice_date">
42
  </th>
43
  <td>
44
- <span class="checkbox"><?php _e( 'Display invoice date', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
45
  </td>
46
  <tr>
47
  </tr>
48
  <th>
49
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_number]" value="">
50
- <input type="checkbox" <?php echo !empty($current_settings['display_number']) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_number]" value="invoice_number">
51
  </th>
52
  <td>
53
- <span class="checkbox"><?php _e( 'Display invoice number', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
54
  </td>
55
  </tr>
56
  </table>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
+ <h2><?php esc_html_e( 'Display options', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
+ <p><?php esc_html_e( 'Select some additional display options for your invoice.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
  <table>
11
  <tr>
12
  <th>
13
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_shipping_address]" value="">
14
+ <input type="checkbox" <?php echo ! empty( $current_settings['display_shipping_address'] ) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_shipping_address]" value="1">
15
  </th>
16
  <td>
17
+ <span class="checkbox"><?php esc_html_e( 'Display shipping address', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
18
  </td>
19
  </tr>
20
  <tr>
21
  <th>
22
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_email]" value="">
23
+ <input type="checkbox" <?php echo ! empty( $current_settings['display_email'] ) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_email]" value="1">
24
  </th>
25
  <td>
26
+ <span class="checkbox"><?php esc_html_e( 'Display email address', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
27
  </td>
28
  </tr>
29
  <tr>
30
  <th>
31
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_phone]" value="">
32
+ <input type="checkbox" <?php echo ! empty( $current_settings['display_phone'] ) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_phone]" value="1">
33
  </th>
34
  <td>
35
+ <span class="checkbox"><?php esc_html_e( 'Display phone number', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
36
  </td>
37
  </tr>
38
  <tr>
39
  <th>
40
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_date]" value="">
41
+ <input type="checkbox" <?php echo ! empty( $current_settings['display_date'] ) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_date]" value="invoice_date">
42
  </th>
43
  <td>
44
+ <span class="checkbox"><?php esc_html_e( 'Display invoice date', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
45
  </td>
46
  <tr>
47
  </tr>
48
  <th>
49
  <input type="hidden" name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_number]" value="">
50
+ <input type="checkbox" <?php echo ! empty( $current_settings['display_number'] ) ? 'checked' : ''; ?> name="wcpdf_settings[wpo_wcpdf_documents_settings_invoice][display_number]" value="invoice_number">
51
  </th>
52
  <td>
53
+ <span class="checkbox"><?php esc_html_e( 'Display invoice number', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
54
  </td>
55
  </tr>
56
  </table>
includes/views/setup-wizard/good-to-go.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description wpo-final">
3
- <h1><?php _e( 'You are good to go!' , 'woocommerce-pdf-invoices-packing-slips' ); ?></h1>
4
- <p><?php _e( 'If you have any questions please have a look at our documentation:', 'woocommerce-pdf-invoices-packing-slips' ); ?><br>
5
- <a href="https://docs.wpovernight.com/topic/woocommerce-pdf-invoices-packing-slips/" target="_blank"><?php _e( 'Invoices & Packing Slips' , 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
6
- <h2><?php _e( 'Happy selling!' , 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
7
  </div>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description wpo-final">
3
+ <h1><?php esc_html_e( 'You are good to go!' , 'woocommerce-pdf-invoices-packing-slips' ); ?></h1>
4
+ <p><?php esc_html_e( 'If you have any questions please have a look at our documentation:', 'woocommerce-pdf-invoices-packing-slips' ); ?><br>
5
+ <a href="https://docs.wpovernight.com/topic/woocommerce-pdf-invoices-packing-slips/" target="_blank"><?php esc_html_e( 'Invoices & Packing Slips' , 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
6
+ <h2><?php esc_html_e( 'Happy selling!' , 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
7
  </div>
includes/views/setup-wizard/logo.php CHANGED
@@ -1,21 +1,18 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
- <h2><?php _e( 'Your logo' , 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
- <p><?php _e( 'Set the header image that will display on your invoice.' , 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
 
7
  <?php
8
- $current_settings = get_option( 'wpo_wcpdf_settings_general', array() );
9
- $logo_id = !empty($current_settings['header_logo']) ? $current_settings['header_logo'] : '';
10
-
11
- if ( !empty($logo_id) && $logo = wp_get_attachment_image_src( $logo_id, 'full', false ) ) {
12
- $logo_src = $logo[0];
13
- } else {
14
- // empty image
15
- $logo_src = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';
16
- }
17
  ?>
18
- <img src="<?php echo $logo_src; ?>" width="100%" height="20px" alt="" id="img-header_logo"/>
19
- <input id="header_logo" name="wcpdf_settings[wpo_wcpdf_settings_general][header_logo]" type="hidden" value="<?php echo $logo_id; ?>" />
20
- <span class="button wpo_upload_image_button header_logo" data-uploader_title="<?php _e( 'Select or upload your invoice header/logo', 'woocommerce-pdf-invoices-packing-slips' ); ?>" data-uploader_button_text="<?php _e( 'Set image', 'woocommerce-pdf-invoices-packing-slips' ); ?>" data-remove_button_text="<?php _e( 'Remove image', 'woocommerce-pdf-invoices-packing-slips' ); ?>" data-input_id="header_logo"><?php _e( 'Set image', 'woocommerce-pdf-invoices-packing-slips' ); ?></span>
21
  </div>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
+ <h2><?php esc_html_e( 'Your logo' , 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
+ <p><?php esc_html_e( 'Set the header image that will display on your invoice.' , 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
+ <script><?php echo "var wpo_wcpdf_admin = " . wp_json_encode( array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) ) . ';'; ?></script>
8
  <?php
9
+ WPO_WCPDF()->settings->callbacks->media_upload( array(
10
+ 'option_name' => 'wpo_wcpdf_settings_general',
11
+ 'setting_name' => 'wcpdf_settings[wpo_wcpdf_settings_general][header_logo]',
12
+ 'id' => 'header_logo',
13
+ 'uploader_title' => __( 'Select or upload your invoice header/logo', 'woocommerce-pdf-invoices-packing-slips' ),
14
+ 'uploader_button_text' => __( 'Set image', 'woocommerce-pdf-invoices-packing-slips' ),
15
+ 'remove_button_text' => __( 'Remove image', 'woocommerce-pdf-invoices-packing-slips' ),
16
+ ) );
 
17
  ?>
 
 
 
18
  </div>
includes/views/setup-wizard/paper-format.php CHANGED
@@ -1,15 +1,16 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
- <h2><?php _e( 'Paper format', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
- <p><?php _e( 'Select the paper format for your invoice.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
  <?php
8
- $current_settings = get_option( 'wpo_wcpdf_settings_general', array() );
 
 
9
  ?>
10
-
11
  <select name="wcpdf_settings[wpo_wcpdf_settings_general][paper_size]">
12
- <option <?php echo $current_settings['paper_size'] == 'a4' ? 'selected' : ''; ?> value="a4"><?php _e( 'A4', 'woocommerce-pdf-invoices-packing-slips' ); ?></option>
13
- <option <?php echo $current_settings['paper_size'] == 'letter' ? 'selected' : ''; ?> value="letter"><?php _e( 'Letter', 'woocommerce-pdf-invoices-packing-slips' ); ?></option>
14
  </select>
15
  </div>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
+ <h2><?php esc_html_e( 'Paper format', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
+ <p><?php esc_html_e( 'Select the paper format for your invoice.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
  <?php
8
+ $current_settings = wp_parse_args( get_option( 'wpo_wcpdf_settings_general', array() ), array(
9
+ 'paper_size' => 'a4',
10
+ ) );
11
  ?>
 
12
  <select name="wcpdf_settings[wpo_wcpdf_settings_general][paper_size]">
13
+ <option <?php echo $current_settings['paper_size'] == 'a4' ? 'selected' : ''; ?> value="a4"><?php esc_html_e( 'A4', 'woocommerce-pdf-invoices-packing-slips' ); ?></option>
14
+ <option <?php echo $current_settings['paper_size'] == 'letter' ? 'selected' : ''; ?> value="letter"><?php esc_html_e( 'Letter', 'woocommerce-pdf-invoices-packing-slips' ); ?></option>
15
  </select>
16
  </div>
includes/views/setup-wizard/shop-name.php CHANGED
@@ -1,12 +1,15 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
- <h2><?php _e( 'Enter your shop name', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
- <p><?php _e( 'Lets quickly setup your invoice. Please enter the name and address of your shop in the fields on the right.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
  <?php
8
- $current_settings = get_option( 'wpo_wcpdf_settings_general', array() );
 
 
 
9
  ?>
10
- <input type="text" class="shop-name" placeholder="Shop name" name="wcpdf_settings[wpo_wcpdf_settings_general][shop_name][default]" value="<?php echo !empty($current_settings['shop_name']) ? array_pop($current_settings['shop_name']) : get_bloginfo( 'name' ); ?>">
11
- <textarea class="shop-address" placeholder="Shop address" name="wcpdf_settings[wpo_wcpdf_settings_general][shop_address][default]"><?php echo isset($current_settings['shop_address']) ? array_pop($current_settings['shop_address']) : ''; ?></textarea>
12
  </div>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
+ <h2><?php esc_html_e( 'Enter your shop name', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
+ <p><?php esc_html_e( 'Lets quickly setup your invoice. Please enter the name and address of your shop in the fields on the right.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
  </div>
6
  <div class="wpo-setup-input">
7
  <?php
8
+ $current_settings = wp_parse_args( get_option( 'wpo_wcpdf_settings_general', array() ), array(
9
+ 'shop_name' => array( 'default' => get_bloginfo( 'name' ) ),
10
+ 'shop_address' => array( 'default' => '' ),
11
+ ) );
12
  ?>
13
+ <input type="text" class="shop-name" placeholder="<?php esc_attr_e( 'Shop name', 'woocommerce-pdf-invoices-packing-slips' ); ?>" name="wcpdf_settings[wpo_wcpdf_settings_general][shop_name][default]" value="<?php echo esc_attr( array_pop( $current_settings['shop_name'] ) ); ?>">
14
+ <textarea class="shop-address" placeholder="<?php esc_attr_e( 'Shop address', 'woocommerce-pdf-invoices-packing-slips' ); ?>" name="wcpdf_settings[wpo_wcpdf_settings_general][shop_address][default]"><?php echo esc_html( array_pop( $current_settings['shop_address'] ) ); ?></textarea>
15
  </div>
includes/views/setup-wizard/show-action-buttons.php CHANGED
@@ -1,8 +1,8 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
- <h2><?php _e( 'Action buttons', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
- <p><?php _e( 'Would you like to display the action buttons in your WooCommerce order list? The action buttons allow you to manually create a PDF.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
- <p><small><?php _e( '(You can always change this setting later via the Screen Options menu)', 'woocommerce-pdf-invoices-packing-slips' ); ?></small></p>
6
  </div>
7
  <div class="wpo-setup-input">
8
  <?php
@@ -15,5 +15,5 @@
15
  if ( in_array( 'wc_actions', $hidden ) )
16
  $actions = false
17
  ?>
18
- <input type="checkbox" <?php echo $actions !== false ? 'checked' : ''; ?> name="wc_show_action_buttons" value="1"><span class="checkbox"><?php _e( 'Show action buttons', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
19
  </div>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
  <div class="wpo-step-description">
3
+ <h2><?php esc_html_e( 'Action buttons', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
4
+ <p><?php esc_html_e( 'Would you like to display the action buttons in your WooCommerce order list? The action buttons allow you to manually create a PDF.', 'woocommerce-pdf-invoices-packing-slips' ); ?></p>
5
+ <p><small><?php esc_html_e( '(You can always change this setting later via the Screen Options menu)', 'woocommerce-pdf-invoices-packing-slips' ); ?></small></p>
6
  </div>
7
  <div class="wpo-setup-input">
8
  <?php
15
  if ( in_array( 'wc_actions', $hidden ) )
16
  $actions = false
17
  ?>
18
+ <input type="checkbox" <?php echo $actions !== false ? 'checked' : ''; ?> name="wc_show_action_buttons" value="1"><span class="checkbox"><?php esc_html_e( 'Show action buttons', 'woocommerce-pdf-invoices-packing-slips' ); ?></span><br>
19
  </div>
includes/views/wcpdf-extensions.php CHANGED
@@ -1,4 +1,5 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
 
2
  <script type="text/javascript">
3
  jQuery(document).ready(function() {
4
  jQuery('.extensions .more').hide();
@@ -11,93 +12,93 @@ jQuery(document).ready(function() {
11
  </script>
12
 
13
  <div class="wcpdf-extensions-ad">
14
- <?php $no_pro = !class_exists('WooCommerce_PDF_IPS_Pro') && !class_exists('WPO_WCPDF_Templates'); ?>
15
- <img src="<?php echo WPO_WCPDF()->plugin_url() . '/assets/images/wpo-helper.png'; ?>" class="wpo-helper">
16
- <h3><?php _e( 'Check out these premium extensions!', 'woocommerce-pdf-invoices-packing-slips' ); ?></h3>
17
- <i>(<?php _e( 'click items to read more', 'woocommerce-pdf-invoices-packing-slips' ); ?>)</i>
18
  <ul class="extensions">
19
  <?php if ( $no_pro ): ?>
20
  <!-- No Pro extensions: Ad for PDF bundle -->
21
  <li>
22
- <?php _e('Premium PDF Invoice bundle: Everything you need for a perfect invoicing system', 'woocommerce-pdf-invoices-packing-slips' )?>
23
  <div class="more" style="display:none;">
24
- <h4><?php _e( 'Supercharge WooCommerce PDF Invoices & Packing Slips with the all our premium extensions:', 'woocommerce-pdf-invoices-packing-slips' ); ?></h4>
25
- <?php _e( 'Professional features:', 'woocommerce-pdf-invoices-packing-slips' ); ?>
26
  <ul>
27
- <li><?php _e( 'Email/print/download <b>PDF Credit Notes & Proforma invoices</b>', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
28
- <li><?php _e( 'Send out a separate <b>notification email</b> with (or without) PDF invoices/packing slips, for example to a drop-shipper or a supplier.', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
29
- <li><?php _e( 'Attach <b>up to 3 static files</b> (for example a terms & conditions document) to the WooCommerce emails of your choice.', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
30
- <li><?php _e( 'Use <b>separate numbering systems</b> and/or format for proforma invoices and credit notes or utilize the main invoice numbering system', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
31
- <li><?php _e( '<b>Customize</b> the <b>shipping & billing address</b> format to include additional custom fields, font sizes etc. without the need to create a custom template.', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
32
- <li><?php _e( 'Use the plugin in multilingual <b>WPML</b> setups', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
33
  </ul>
34
- <?php _e('Advanced, customizable templates', 'woocommerce-pdf-invoices-packing-slips' )?>
35
  <ul>
36
- <li><?php _e( 'Completely customize the invoice contents (prices, taxes, thumbnails) to your needs with a drag & drop customizer', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
37
- <li><?php _e( 'Two extra stylish premade templates (Modern & Business)', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
38
  </ul>
39
- <?php _e('Upload automatically to dropbox', 'woocommerce-pdf-invoices-packing-slips' )?>
40
  <ul>
41
- <li><?php _e( 'This extension conveniently uploads all the invoices (and other pdf documents from the professional extension) that are emailed to your customers to Dropbox. The best way to keep your invoice administration up to date!', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
42
  </ul>
43
  <br>
44
- <a href="https://wpovernight.com/downloads/woocommerce-pdf-invoices-packing-slips-bundle/" target="_blank"><?php _e("Get WooCommerce PDF Invoices & Packing Slips Bundle", 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
45
  </div>
46
  </li>
47
  <?php endif; ?>
48
  <?php
49
  // NO BUNDLE: separate ads
50
- if (!class_exists('WooCommerce_PDF_IPS_Pro') && !$no_pro) {
51
  ?>
52
  <li>
53
- <?php _e('Go Pro: Proforma invoices, credit notes (=refunds) & more!', 'woocommerce-pdf-invoices-packing-slips' )?>
54
  <div class="more" style="display:none;">
55
- <?php _e( 'Supercharge WooCommerce PDF Invoices & Packing Slips with the following features:', 'woocommerce-pdf-invoices-packing-slips' ); ?>
56
  <ul>
57
- <li><?php _e( 'Email/print/download <b>PDF Credit Notes & Proforma invoices</b>', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
58
- <li><?php _e( 'Send out a separate <b>notification email</b> with (or without) PDF invoices/packing slips, for example to a drop-shipper or a supplier.', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
59
- <li><?php _e( 'Attach <b>up to 3 static files</b> (for example a terms & conditions document) to the WooCommerce emails of your choice.', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
60
- <li><?php _e( 'Use <b>separate numbering systems</b> and/or format for proforma invoices and credit notes or utilize the main invoice numbering system', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
61
- <li><?php _e( '<b>Customize</b> the <b>shipping & billing address</b> format to include additional custom fields, font sizes etc. without the need to create a custom template.', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
62
- <li><?php _e( 'Use the plugin in multilingual <b>WPML</b> setups', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
63
- <li><?php _e( 'Upload automatically to dropbox', 'woocommerce-pdf-invoices-packing-slips' )?></li>
64
  </ul>
65
- <a href="https://wpovernight.com/downloads/woocommerce-pdf-invoices-packing-slips-professional/" target="_blank"><?php _e("Get WooCommerce PDF Invoices & Packing Slips Professional!", 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
66
  </li>
67
  <?php } ?>
68
 
69
  <?php
70
- if (!class_exists('WPO_WC_Smart_Reminder_Emails')) {
71
  ?>
72
  <li>
73
- <?php _e('Automatically send payment reminders to your customers', 'woocommerce-pdf-invoices-packing-slips' )?>
74
  <div class="more" style="display:none;">
75
- <?php _e('WooCommerce Smart Reminder emails', 'woocommerce-pdf-invoices-packing-slips' )?>
76
  <ul>
77
- <li><?php _e( '<b>Completely automatic</b> scheduled emails', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
78
- <li><?php _e( '<b>Rich text editor</b> for the email text, including placeholders for data from the order (name, order total, etc)', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
79
- <li><?php _e( 'Configure the exact requirements for sending an email (time after order, order status, payment method)', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
80
- <li><?php _e( 'Fully <b>WPML Compatible</b> – emails will be automatically sent in the order language.', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
81
- <li><?php _e( '<b>Super versatile!</b> Can be used for any kind of reminder email (review reminders, repeat purchases)', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
82
- <li><b><?php _e( 'Integrates seamlessly with the PDF Invoices & Packing Slips plugin', 'woocommerce-pdf-invoices-packing-slips' ); ?></b></li>
83
  </ul>
84
- <a href="https://wpovernight.com/downloads/woocommerce-reminder-emails-payment-reminders/" target="_blank"><?php _e("Get WooCommerce Smart Reminder Emails", 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
85
  </div>
86
  </li>
87
  <?php } ?>
88
 
89
  <?php
90
- if (!class_exists('WooCommerce_Ext_PrintOrders')) {
91
  ?>
92
  <li>
93
- <?php _e('Automatically send new orders or packing slips to your printer, as soon as the customer orders!', 'woocommerce-pdf-invoices-packing-slips' )?>
94
  <div class="more" style="display:none;">
95
  <table>
96
  <tr>
97
- <td><img src="<?php echo WPO_WCPDF()->plugin_url() . '/assets/images/cloud-print.png'; ?>" class="cloud-logo"></td>
98
  <td>
99
- <?php _e( 'Check out the WooCommerce Automatic Order Printing extension from our partners at Simba Hosting', 'woocommerce-pdf-invoices-packing-slips' ); ?><br/>
100
- <a href="https://www.simbahosting.co.uk/s3/product/woocommerce-printnode-automatic-order-printing/?affiliates=2" target="_blank"><?php _e("WooCommerce Automatic Order Printing", 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
101
  </td>
102
  </tr>
103
  </table>
@@ -106,20 +107,20 @@ jQuery(document).ready(function() {
106
  <?php } ?>
107
 
108
  <?php
109
- if (!class_exists('WooCommerce_PDF_IPS_Templates') && !class_exists('WPO_WCPDF_Templates') && !$no_pro) {
110
  $template_link = '<a href="https://wpovernight.com/downloads/woocommerce-pdf-invoices-packing-slips-premium-templates/" target="_blank">wpovernight.com</a>';
111
  $email_link = '<a href="mailto:support@wpovernight.com">support@wpovernight.com</a>'
112
  ?>
113
  <li>
114
- <?php _e('Advanced, customizable templates', 'woocommerce-pdf-invoices-packing-slips' )?>
115
  <div class="more" style="display:none;">
116
  <ul>
117
- <li><?php _e( 'Completely customize the invoice contents (prices, taxes, thumbnails) to your needs with a drag & drop customizer', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
118
- <li><?php _e( 'Two extra stylish premade templates (Modern & Business)', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
119
  <?php /* translators: Premium Templates link */?>
120
- <li><?php printf( __("Check out the Premium PDF Invoice & Packing Slips templates at %s.", 'woocommerce-pdf-invoices-packing-slips' ), $template_link );?></li>
121
  <?php /* translators: email link */?>
122
- <li><?php printf( __("For custom templates, contact us at %s.", 'woocommerce-pdf-invoices-packing-slips' ), $email_link );?></li>
123
  </ul>
124
  </div>
125
  </li>
@@ -127,8 +128,8 @@ jQuery(document).ready(function() {
127
  </ul>
128
  <?php
129
  // link to hide message when one of the premium extensions is installed
130
- if ( class_exists('WooCommerce_PDF_IPS_Pro') || class_exists('WPO_WCPDF_Templates') || class_exists('WooCommerce_PDF_IPS_Templates') || class_exists('WooCommerce_Ext_PrintOrders') || class_exists('WPO_WC_Smart_Reminder_Emails') ) {
131
- printf('<a href="%s" style="display:inline-block; margin-top: 10px;">%s</a>', add_query_arg( 'wpo_wcpdf_hide_extensions_ad', 'true' ), __( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ) );
132
  }
133
  ?>
134
  </div>
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
+
3
  <script type="text/javascript">
4
  jQuery(document).ready(function() {
5
  jQuery('.extensions .more').hide();
12
  </script>
13
 
14
  <div class="wcpdf-extensions-ad">
15
+ <?php $no_pro = ! class_exists( 'WooCommerce_PDF_IPS_Pro' ) && ! class_exists( 'WPO_WCPDF_Templates' ); ?>
16
+ <img src="<?php echo esc_url( WPO_WCPDF()->plugin_url() . '/assets/images/wpo-helper.png' ); ?>" class="wpo-helper">
17
+ <h3><?php esc_html_e( 'Check out these premium extensions!', 'woocommerce-pdf-invoices-packing-slips' ); ?></h3>
18
+ <i>(<?php esc_html_e( 'click items to read more', 'woocommerce-pdf-invoices-packing-slips' ); ?>)</i>
19
  <ul class="extensions">
20
  <?php if ( $no_pro ): ?>
21
  <!-- No Pro extensions: Ad for PDF bundle -->
22
  <li>
23
+ <?php esc_html_e( 'Premium PDF Invoice bundle: Everything you need for a perfect invoicing system', 'woocommerce-pdf-invoices-packing-slips' ); ?>
24
  <div class="more" style="display:none;">
25
+ <h4><?php esc_html_e( 'Supercharge WooCommerce PDF Invoices & Packing Slips with the all our premium extensions:', 'woocommerce-pdf-invoices-packing-slips' ); ?></h4>
26
+ <?php esc_html_e( 'Professional features:', 'woocommerce-pdf-invoices-packing-slips' ); ?>
27
  <ul>
28
+ <li><?php echo wp_kses_post( __( 'Email/print/download <b>PDF Credit Notes & Proforma invoices</b>', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
29
+ <li><?php echo wp_kses_post( __( 'Send out a separate <b>notification email</b> with (or without) PDF invoices/packing slips, for example to a drop-shipper or a supplier.', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
30
+ <li><?php echo wp_kses_post( __( 'Attach <b>up to 3 static files</b> (for example a terms & conditions document) to the WooCommerce emails of your choice.', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
31
+ <li><?php echo wp_kses_post( __( 'Use <b>separate numbering systems</b> and/or format for proforma invoices and credit notes or utilize the main invoice numbering system', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
32
+ <li><?php echo wp_kses_post( __( '<b>Customize</b> the <b>shipping & billing address</b> format to include additional custom fields, font sizes etc. without the need to create a custom template.', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
33
+ <li><?php echo wp_kses_post( __( 'Use the plugin in multilingual <b>WPML</b> setups', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
34
  </ul>
35
+ <?php esc_html_e( 'Advanced, customizable templates', 'woocommerce-pdf-invoices-packing-slips' ); ?>
36
  <ul>
37
+ <li><?php echo wp_kses_post( __( 'Completely customize the invoice contents (prices, taxes, thumbnails) to your needs with a drag & drop customizer', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
38
+ <li><?php echo wp_kses_post( __( 'Two extra stylish premade templates (Modern & Business)', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
39
  </ul>
40
+ <?php esc_html_e( 'Upload automatically to dropbox', 'woocommerce-pdf-invoices-packing-slips' ); ?>
41
  <ul>
42
+ <li><?php echo wp_kses_post( __( 'This extension conveniently uploads all the invoices (and other pdf documents from the professional extension) that are emailed to your customers to Dropbox. The best way to keep your invoice administration up to date!', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
43
  </ul>
44
  <br>
45
+ <a href="https://wpovernight.com/downloads/woocommerce-pdf-invoices-packing-slips-bundle/" target="_blank"><?php esc_html_e( "Get WooCommerce PDF Invoices & Packing Slips Bundle", 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
46
  </div>
47
  </li>
48
  <?php endif; ?>
49
  <?php
50
  // NO BUNDLE: separate ads
51
+ if ( ! class_exists( 'WooCommerce_PDF_IPS_Pro' ) && ! $no_pro ) {
52
  ?>
53
  <li>
54
+ <?php esc_html_e( 'Go Pro: Proforma invoices, credit notes (=refunds) & more!', 'woocommerce-pdf-invoices-packing-slips' ); ?>
55
  <div class="more" style="display:none;">
56
+ <?php esc_html_e( 'Supercharge WooCommerce PDF Invoices & Packing Slips with the following features:', 'woocommerce-pdf-invoices-packing-slips' ); ?>
57
  <ul>
58
+ <li><?php echo wp_kses_post( __( 'Email/print/download <b>PDF Credit Notes & Proforma invoices</b>', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
59
+ <li><?php echo wp_kses_post( __( 'Send out a separate <b>notification email</b> with (or without) PDF invoices/packing slips, for example to a drop-shipper or a supplier.', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
60
+ <li><?php echo wp_kses_post( __( 'Attach <b>up to 3 static files</b> (for example a terms & conditions document) to the WooCommerce emails of your choice.', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
61
+ <li><?php echo wp_kses_post( __( 'Use <b>separate numbering systems</b> and/or format for proforma invoices and credit notes or utilize the main invoice numbering system', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
62
+ <li><?php echo wp_kses_post( __( '<b>Customize</b> the <b>shipping & billing address</b> format to include additional custom fields, font sizes etc. without the need to create a custom template.', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
63
+ <li><?php echo wp_kses_post( __( 'Use the plugin in multilingual <b>WPML</b> setups', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
64
+ <li><?php echo wp_kses_post( __( 'Upload automatically to dropbox', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
65
  </ul>
66
+ <a href="https://wpovernight.com/downloads/woocommerce-pdf-invoices-packing-slips-professional/" target="_blank"><?php esc_html_e( "Get WooCommerce PDF Invoices & Packing Slips Professional!", 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
67
  </li>
68
  <?php } ?>
69
 
70
  <?php
71
+ if ( ! class_exists( 'WPO_WC_Smart_Reminder_Emails' ) ) {
72
  ?>
73
  <li>
74
+ <?php esc_html_e( 'Automatically send payment reminders to your customers', 'woocommerce-pdf-invoices-packing-slips' ); ?>
75
  <div class="more" style="display:none;">
76
+ <?php esc_html_e( 'WooCommerce Smart Reminder emails', 'woocommerce-pdf-invoices-packing-slips' ); ?>
77
  <ul>
78
+ <li><?php echo wp_kses_post( __( '<b>Completely automatic</b> scheduled emails', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
79
+ <li><?php echo wp_kses_post( __( '<b>Rich text editor</b> for the email text, including placeholders for data from the order (name, order total, etc)', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
80
+ <li><?php echo wp_kses_post( __( 'Configure the exact requirements for sending an email (time after order, order status, payment method)', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
81
+ <li><?php echo wp_kses_post( __( 'Fully <b>WPML Compatible</b> – emails will be automatically sent in the order language.', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
82
+ <li><?php echo wp_kses_post( __( '<b>Super versatile!</b> Can be used for any kind of reminder email (review reminders, repeat purchases)', 'woocommerce-pdf-invoices-packing-slips' ) ); ?></li>
83
+ <li><b><?php esc_html_e( 'Integrates seamlessly with the PDF Invoices & Packing Slips plugin', 'woocommerce-pdf-invoices-packing-slips' ); ?></b></li>
84
  </ul>
85
+ <a href="https://wpovernight.com/downloads/woocommerce-reminder-emails-payment-reminders/" target="_blank"><?php esc_html_e( "Get WooCommerce Smart Reminder Emails", 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
86
  </div>
87
  </li>
88
  <?php } ?>
89
 
90
  <?php
91
+ if ( ! class_exists( 'WooCommerce_Ext_PrintOrders' ) ) {
92
  ?>
93
  <li>
94
+ <?php esc_html_e( 'Automatically send new orders or packing slips to your printer, as soon as the customer orders!', 'woocommerce-pdf-invoices-packing-slips' ); ?>
95
  <div class="more" style="display:none;">
96
  <table>
97
  <tr>
98
+ <td><img src="<?php echo esc_url( WPO_WCPDF()->plugin_url() . '/assets/images/cloud-print.png' ); ?>" class="cloud-logo"></td>
99
  <td>
100
+ <?php esc_html_e( 'Check out the WooCommerce Automatic Order Printing extension from our partners at Simba Hosting', 'woocommerce-pdf-invoices-packing-slips' ); ?><br/>
101
+ <a href="https://www.simbahosting.co.uk/s3/product/woocommerce-printnode-automatic-order-printing/?affiliates=2" target="_blank"><?php esc_html_e( "WooCommerce Automatic Order Printing", 'woocommerce-pdf-invoices-packing-slips' ); ?></a>
102
  </td>
103
  </tr>
104
  </table>
107
  <?php } ?>
108
 
109
  <?php
110
+ if ( ! class_exists( 'WooCommerce_PDF_IPS_Templates' ) && ! class_exists( 'WPO_WCPDF_Templates' ) && ! $no_pro ) {
111
  $template_link = '<a href="https://wpovernight.com/downloads/woocommerce-pdf-invoices-packing-slips-premium-templates/" target="_blank">wpovernight.com</a>';
112
  $email_link = '<a href="mailto:support@wpovernight.com">support@wpovernight.com</a>'
113
  ?>
114
  <li>
115
+ <?php esc_html_e( 'Advanced, customizable templates', 'woocommerce-pdf-invoices-packing-slips' ); ?>
116
  <div class="more" style="display:none;">
117
  <ul>
118
+ <li><?php esc_html_e( 'Completely customize the invoice contents (prices, taxes, thumbnails) to your needs with a drag & drop customizer', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
119
+ <li><?php esc_html_e( 'Two extra stylish premade templates (Modern & Business)', 'woocommerce-pdf-invoices-packing-slips' ); ?></li>
120
  <?php /* translators: Premium Templates link */?>
121
+ <li><?php printf( esc_html__( "Check out the Premium PDF Invoice & Packing Slips templates at %s.", 'woocommerce-pdf-invoices-packing-slips' ), $template_link ); ?></li>
122
  <?php /* translators: email link */?>
123
+ <li><?php printf( esc_html__( "For custom templates, contact us at %s.", 'woocommerce-pdf-invoices-packing-slips' ), $email_link ); ?></li>
124
  </ul>
125
  </div>
126
  </li>
128
  </ul>
129
  <?php
130
  // link to hide message when one of the premium extensions is installed
131
+ if ( class_exists( 'WooCommerce_PDF_IPS_Pro' ) || class_exists( 'WPO_WCPDF_Templates' ) || class_exists( 'WooCommerce_PDF_IPS_Templates' ) || class_exists( 'WooCommerce_Ext_PrintOrders' ) || class_exists( 'WPO_WC_Smart_Reminder_Emails' ) ) {
132
+ printf('<a href="%s" style="display:inline-block; margin-top: 10px;">%s</a>', esc_url( add_query_arg( 'wpo_wcpdf_hide_extensions_ad', 'true' ) ), esc_html__( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ) );
133
  }
134
  ?>
135
  </div>
includes/views/wcpdf-settings-page.php CHANGED
@@ -1,17 +1,26 @@
1
  <?php defined( 'ABSPATH' ) or exit; ?>
 
 
 
 
 
 
 
 
 
2
  <script type="text/javascript">
3
  jQuery( function( $ ) {
4
- $("#footer-thankyou").html("If you like <strong>WooCommerce PDF Invoices & Packing Slips</strong> please leave us a <a href='https://wordpress.org/support/view/plugin-reviews/woocommerce-pdf-invoices-packing-slips?rate=5#postform'>★★★★★</a> rating. A huge thank you in advance!");
5
  });
6
  </script>
7
  <div class="wrap">
8
  <div class="icon32" id="icon-options-general"><br /></div>
9
- <h2><?php _e( 'WooCommerce PDF Invoices', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
10
  <h2 class="nav-tab-wrapper">
11
  <?php
12
- foreach ($settings_tabs as $tab_slug => $tab_title ) {
13
  $tab_link = esc_url("?page=wpo_wcpdf_options_page&tab={$tab_slug}");
14
- printf('<a href="%1$s" class="nav-tab nav-tab-%2$s %3$s">%4$s</a>', $tab_link, $tab_slug, (($active_tab == $tab_slug) ? 'nav-tab-active' : ''), $tab_title);
15
  }
16
  ?>
17
  </h2>
@@ -27,12 +36,12 @@
27
  $hide_ad = get_option( 'wpo_wcpdf_hide_extensions_ad' );
28
  }
29
 
30
- if ( !$hide_ad && !( class_exists('WooCommerce_PDF_IPS_Pro') && class_exists('WooCommerce_PDF_IPS_Templates') && class_exists('WooCommerce_Ext_PrintOrders') ) ) {
31
  include('wcpdf-extensions.php');
32
  }
33
 
34
  ?>
35
- <form method="post" action="options.php" id="wpo-wcpdf-settings" class="<?php echo "{$active_tab} {$active_section}"; ?>">
36
  <?php
37
  do_action( 'wpo_wcpdf_before_settings', $active_tab, $active_section );
38
  if ( has_action( 'wpo_wcpdf_settings_output_'.$active_tab ) ) {
1
  <?php defined( 'ABSPATH' ) or exit; ?>
2
+ <?php
3
+ $review_url = 'https://wordpress.org/support/plugin/woocommerce-pdf-invoices-packing-slips/reviews/#new-post';
4
+ $review_link = sprintf( '<a href="%s">★★★★★</a>', $review_url );
5
+ $review_invitation = sprintf(
6
+ /* translators: ★★★★★ (5-star) */
7
+ __( 'If you like <strong>WooCommerce PDF Invoices & Packing Slips</strong> please leave us a %s rating. A huge thank you in advance!', 'woocommerce-pdf-invoices-packing-slips' ),
8
+ $review_link
9
+ );
10
+ ?>
11
  <script type="text/javascript">
12
  jQuery( function( $ ) {
13
+ $("#footer-thankyou").html('<?php echo wp_kses_post( $review_invitation ); ?>');
14
  });
15
  </script>
16
  <div class="wrap">
17
  <div class="icon32" id="icon-options-general"><br /></div>
18
+ <h2><?php esc_html_e( 'WooCommerce PDF Invoices', 'woocommerce-pdf-invoices-packing-slips' ); ?></h2>
19
  <h2 class="nav-tab-wrapper">
20
  <?php
21
+ foreach ( $settings_tabs as $tab_slug => $tab_title ) {
22
  $tab_link = esc_url("?page=wpo_wcpdf_options_page&tab={$tab_slug}");
23
+ printf('<a href="%1$s" class="nav-tab nav-tab-%2$s %3$s">%4$s</a>', $tab_link, esc_attr( $tab_slug ), ( ( $active_tab == $tab_slug ) ? 'nav-tab-active' : '' ), esc_html( $tab_title ) );
24
  }
25
  ?>
26
  </h2>
36
  $hide_ad = get_option( 'wpo_wcpdf_hide_extensions_ad' );
37
  }
38
 
39
+ if ( ! $hide_ad && ! ( class_exists( 'WooCommerce_PDF_IPS_Pro' ) && class_exists( 'WooCommerce_PDF_IPS_Templates' ) && class_exists( 'WooCommerce_Ext_PrintOrders' ) ) ) {
40
  include('wcpdf-extensions.php');
41
  }
42
 
43
  ?>
44
+ <form method="post" action="options.php" id="wpo-wcpdf-settings" class="<?php echo esc_attr( "{$active_tab} {$active_section}" ); ?>">
45
  <?php
46
  do_action( 'wpo_wcpdf_before_settings', $active_tab, $active_section );
47
  if ( has_action( 'wpo_wcpdf_settings_output_'.$active_tab ) ) {
includes/wcpdf-functions.php CHANGED
@@ -162,8 +162,8 @@ function wcpdf_deprecated_function( $function, $version, $replacement = null ) {
162
  // if the deprecated function is called from one of our filters, $this should be $document
163
  $filter = current_filter();
164
  $global_wcpdf_filters = array( 'wp_ajax_generate_wpo_wcpdf' );
165
- if ( !in_array($filter, $global_wcpdf_filters) && strpos($filter, 'wpo_wcpdf') !== false && strpos($replacement, '$this') !== false ) {
166
- $replacement = str_replace('$this', '$document', $replacement);
167
  $replacement = "{$replacement} - check that the \$document parameter is included in your action or filter ($filter)!";
168
  }
169
  if ( is_ajax() ) {
@@ -181,7 +181,7 @@ function wcpdf_deprecated_function( $function, $version, $replacement = null ) {
181
  * Logger function to capture errors thrown by this plugin, uses the WC Logger when possible (WC3.0+)
182
  */
183
  function wcpdf_log_error( $message, $level = 'error', $e = null ) {
184
- if (function_exists('wc_get_logger')) {
185
  $logger = wc_get_logger();
186
  $context = array( 'source' => 'wpo-wcpdf' );
187
 
@@ -205,13 +205,13 @@ function wcpdf_log_error( $message, $level = 'error', $e = null ) {
205
  }
206
 
207
  function wcpdf_output_error( $message, $level = 'error', $e = null ) {
208
- if ( !current_user_can( 'edit_shop_orders' ) ) {
209
- _e( 'Error creating PDF, please contact the site owner.', 'woocommerce-pdf-invoices-packing-slips' );
210
  return;
211
  }
212
  ?>
213
  <div style="border: 2px solid red; padding: 5px;">
214
- <h3><?php echo $message; ?></h3>
215
  <?php if ( !empty($e) && is_callable( array( $e, 'getTraceAsString') ) ): ?>
216
  <pre><?php echo $e->getTraceAsString(); ?></pre>
217
  <?php endif ?>
162
  // if the deprecated function is called from one of our filters, $this should be $document
163
  $filter = current_filter();
164
  $global_wcpdf_filters = array( 'wp_ajax_generate_wpo_wcpdf' );
165
+ if ( ! in_array ($filter, $global_wcpdf_filters ) && strpos( $filter, 'wpo_wcpdf' ) !== false && strpos( $replacement, '$this' ) !== false ) {
166
+ $replacement = str_replace( '$this', '$document', $replacement );
167
  $replacement = "{$replacement} - check that the \$document parameter is included in your action or filter ($filter)!";
168
  }
169
  if ( is_ajax() ) {
181
  * Logger function to capture errors thrown by this plugin, uses the WC Logger when possible (WC3.0+)
182
  */
183
  function wcpdf_log_error( $message, $level = 'error', $e = null ) {
184
+ if ( function_exists( 'wc_get_logger' ) ) {
185
  $logger = wc_get_logger();
186
  $context = array( 'source' => 'wpo-wcpdf' );
187
 
205
  }
206
 
207
  function wcpdf_output_error( $message, $level = 'error', $e = null ) {
208
+ if ( ! current_user_can( 'edit_shop_orders' ) ) {
209
+ esc_html_e( 'Error creating PDF, please contact the site owner.', 'woocommerce-pdf-invoices-packing-slips' );
210
  return;
211
  }
212
  ?>
213
  <div style="border: 2px solid red; padding: 5px;">
214
+ <h3><?php echo wp_kses_post( $message ); ?></h3>
215
  <?php if ( !empty($e) && is_callable( array( $e, 'getTraceAsString') ) ): ?>
216
  <pre><?php echo $e->getTraceAsString(); ?></pre>
217
  <?php endif ?>
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: woocommerce, pdf, invoices, packing slips, print, delivery notes, invoice,
5
  Requires at least: 3.5
6
  Tested up to: 5.8
7
  Requires PHP: 7.1
8
- Stable tag: 2.10.4
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -102,6 +102,9 @@ There's a setting on the Status tab of the settings page that allows you to togg
102
 
103
  == Changelog ==
104
 
 
 
 
105
  = 2.10.4 =
106
  * Fix: Billing phone not displaying in Packing Slip when billing address was enabled
107
  * Fix: Support for special characters on sites without the PHP MB-string module
5
  Requires at least: 3.5
6
  Tested up to: 5.8
7
  Requires PHP: 7.1
8
+ Stable tag: 2.10.5
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
102
 
103
  == Changelog ==
104
 
105
+ = 2.10.5 =
106
+ * Security: Apply escaping to translated strings
107
+
108
  = 2.10.4 =
109
  * Fix: Billing phone not displaying in Packing Slip when billing address was enabled
110
  * Fix: Support for special characters on sites without the PHP MB-string module
vendor/composer/ClassLoader.php CHANGED
@@ -1,479 +1,479 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of Composer.
5
- *
6
- * (c) Nils Adermann <naderman@naderman.de>
7
- * Jordi Boggiano <j.boggiano@seld.be>
8
- *
9
- * For the full copyright and license information, please view the LICENSE
10
- * file that was distributed with this source code.
11
- */
12
-
13
- namespace Composer\Autoload;
14
-
15
- /**
16
- * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17
- *
18
- * $loader = new \Composer\Autoload\ClassLoader();
19
- *
20
- * // register classes with namespaces
21
- * $loader->add('Symfony\Component', __DIR__.'/component');
22
- * $loader->add('Symfony', __DIR__.'/framework');
23
- *
24
- * // activate the autoloader
25
- * $loader->register();
26
- *
27
- * // to enable searching the include path (eg. for PEAR packages)
28
- * $loader->setUseIncludePath(true);
29
- *
30
- * In this example, if you try to use a class in the Symfony\Component
31
- * namespace or one of its children (Symfony\Component\Console for instance),
32
- * the autoloader will first look for the class under the component/
33
- * directory, and it will then fallback to the framework/ directory if not
34
- * found before giving up.
35
- *
36
- * This class is loosely based on the Symfony UniversalClassLoader.
37
- *
38
- * @author Fabien Potencier <fabien@symfony.com>
39
- * @author Jordi Boggiano <j.boggiano@seld.be>
40
- * @see https://www.php-fig.org/psr/psr-0/
41
- * @see https://www.php-fig.org/psr/psr-4/
42
- */
43
- class ClassLoader
44
- {
45
- private $vendorDir;
46
-
47
- // PSR-4
48
- private $prefixLengthsPsr4 = array();
49
- private $prefixDirsPsr4 = array();
50
- private $fallbackDirsPsr4 = array();
51
-
52
- // PSR-0
53
- private $prefixesPsr0 = array();
54
- private $fallbackDirsPsr0 = array();
55
-
56
- private $useIncludePath = false;
57
- private $classMap = array();
58
- private $classMapAuthoritative = false;
59
- private $missingClasses = array();
60
- private $apcuPrefix;
61
-
62
- private static $registeredLoaders = array();
63
-
64
- public function __construct($vendorDir = null)
65
- {
66
- $this->vendorDir = $vendorDir;
67
- }
68
-
69
- public function getPrefixes()
70
- {
71
- if (!empty($this->prefixesPsr0)) {
72
- return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
73
- }
74
-
75
- return array();
76
- }
77
-
78
- public function getPrefixesPsr4()
79
- {
80
- return $this->prefixDirsPsr4;
81
- }
82
-
83
- public function getFallbackDirs()
84
- {
85
- return $this->fallbackDirsPsr0;
86
- }
87
-
88
- public function getFallbackDirsPsr4()
89
- {
90
- return $this->fallbackDirsPsr4;
91
- }
92
-
93
- public function getClassMap()
94
- {
95
- return $this->classMap;
96
- }
97
-
98
- /**
99
- * @param array $classMap Class to filename map
100
- */
101
- public function addClassMap(array $classMap)
102
- {
103
- if ($this->classMap) {
104
- $this->classMap = array_merge($this->classMap, $classMap);
105
- } else {
106
- $this->classMap = $classMap;
107
- }
108
- }
109
-
110
- /**
111
- * Registers a set of PSR-0 directories for a given prefix, either
112
- * appending or prepending to the ones previously set for this prefix.
113
- *
114
- * @param string $prefix The prefix
115
- * @param array|string $paths The PSR-0 root directories
116
- * @param bool $prepend Whether to prepend the directories
117
- */
118
- public function add($prefix, $paths, $prepend = false)
119
- {
120
- if (!$prefix) {
121
- if ($prepend) {
122
- $this->fallbackDirsPsr0 = array_merge(
123
- (array) $paths,
124
- $this->fallbackDirsPsr0
125
- );
126
- } else {
127
- $this->fallbackDirsPsr0 = array_merge(
128
- $this->fallbackDirsPsr0,
129
- (array) $paths
130
- );
131
- }
132
-
133
- return;
134
- }
135
-
136
- $first = $prefix[0];
137
- if (!isset($this->prefixesPsr0[$first][$prefix])) {
138
- $this->prefixesPsr0[$first][$prefix] = (array) $paths;
139
-
140
- return;
141
- }
142
- if ($prepend) {
143
- $this->prefixesPsr0[$first][$prefix] = array_merge(
144
- (array) $paths,
145
- $this->prefixesPsr0[$first][$prefix]
146
- );
147
- } else {
148
- $this->prefixesPsr0[$first][$prefix] = array_merge(
149
- $this->prefixesPsr0[$first][$prefix],
150
- (array) $paths
151
- );
152
- }
153
- }
154
-
155
- /**
156
- * Registers a set of PSR-4 directories for a given namespace, either
157
- * appending or prepending to the ones previously set for this namespace.
158
- *
159
- * @param string $prefix The prefix/namespace, with trailing '\\'
160
- * @param array|string $paths The PSR-4 base directories
161
- * @param bool $prepend Whether to prepend the directories
162
- *
163
- * @throws \InvalidArgumentException
164
- */
165
- public function addPsr4($prefix, $paths, $prepend = false)
166
- {
167
- if (!$prefix) {
168
- // Register directories for the root namespace.
169
- if ($prepend) {
170
- $this->fallbackDirsPsr4 = array_merge(
171
- (array) $paths,
172
- $this->fallbackDirsPsr4
173
- );
174
- } else {
175
- $this->fallbackDirsPsr4 = array_merge(
176
- $this->fallbackDirsPsr4,
177
- (array) $paths
178
- );
179
- }
180
- } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
181
- // Register directories for a new namespace.
182
- $length = strlen($prefix);
183
- if ('\\' !== $prefix[$length - 1]) {
184
- throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
185
- }
186
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
187
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
188
- } elseif ($prepend) {
189
- // Prepend directories for an already registered namespace.
190
- $this->prefixDirsPsr4[$prefix] = array_merge(
191
- (array) $paths,
192
- $this->prefixDirsPsr4[$prefix]
193
- );
194
- } else {
195
- // Append directories for an already registered namespace.
196
- $this->prefixDirsPsr4[$prefix] = array_merge(
197
- $this->prefixDirsPsr4[$prefix],
198
- (array) $paths
199
- );
200
- }
201
- }
202
-
203
- /**
204
- * Registers a set of PSR-0 directories for a given prefix,
205
- * replacing any others previously set for this prefix.
206
- *
207
- * @param string $prefix The prefix
208
- * @param array|string $paths The PSR-0 base directories
209
- */
210
- public function set($prefix, $paths)
211
- {
212
- if (!$prefix) {
213
- $this->fallbackDirsPsr0 = (array) $paths;
214
- } else {
215
- $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
216
- }
217
- }
218
-
219
- /**
220
- * Registers a set of PSR-4 directories for a given namespace,
221
- * replacing any others previously set for this namespace.
222
- *
223
- * @param string $prefix The prefix/namespace, with trailing '\\'
224
- * @param array|string $paths The PSR-4 base directories
225
- *
226
- * @throws \InvalidArgumentException
227
- */
228
- public function setPsr4($prefix, $paths)
229
- {
230
- if (!$prefix) {
231
- $this->fallbackDirsPsr4 = (array) $paths;
232
- } else {
233
- $length = strlen($prefix);
234
- if ('\\' !== $prefix[$length - 1]) {
235
- throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
236
- }
237
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
238
- $this->prefixDirsPsr4[$prefix] = (array) $paths;
239
- }
240
- }
241
-
242
- /**
243
- * Turns on searching the include path for class files.
244
- *
245
- * @param bool $useIncludePath
246
- */
247
- public function setUseIncludePath($useIncludePath)
248
- {
249
- $this->useIncludePath = $useIncludePath;
250
- }
251
-
252
- /**
253
- * Can be used to check if the autoloader uses the include path to check
254
- * for classes.
255
- *
256
- * @return bool
257
- */
258
- public function getUseIncludePath()
259
- {
260
- return $this->useIncludePath;
261
- }
262
-
263
- /**
264
- * Turns off searching the prefix and fallback directories for classes
265
- * that have not been registered with the class map.
266
- *
267
- * @param bool $classMapAuthoritative
268
- */
269
- public function setClassMapAuthoritative($classMapAuthoritative)
270
- {
271
- $this->classMapAuthoritative = $classMapAuthoritative;
272
- }
273
-
274
- /**
275
- * Should class lookup fail if not found in the current class map?
276
- *
277
- * @return bool
278
- */
279
- public function isClassMapAuthoritative()
280
- {
281
- return $this->classMapAuthoritative;
282
- }
283
-
284
- /**
285
- * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
286
- *
287
- * @param string|null $apcuPrefix
288
- */
289
- public function setApcuPrefix($apcuPrefix)
290
- {
291
- $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
292
- }
293
-
294
- /**
295
- * The APCu prefix in use, or null if APCu caching is not enabled.
296
- *
297
- * @return string|null
298
- */
299
- public function getApcuPrefix()
300
- {
301
- return $this->apcuPrefix;
302
- }
303
-
304
- /**
305
- * Registers this instance as an autoloader.
306
- *
307
- * @param bool $prepend Whether to prepend the autoloader or not
308
- */
309
- public function register($prepend = false)
310
- {
311
- spl_autoload_register(array($this, 'loadClass'), true, $prepend);
312
-
313
- if (null === $this->vendorDir) {
314
- return;
315
- }
316
-
317
- if ($prepend) {
318
- self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
319
- } else {
320
- unset(self::$registeredLoaders[$this->vendorDir]);
321
- self::$registeredLoaders[$this->vendorDir] = $this;
322
- }
323
- }
324
-
325
- /**
326
- * Unregisters this instance as an autoloader.
327
- */
328
- public function unregister()
329
- {
330
- spl_autoload_unregister(array($this, 'loadClass'));
331
-
332
- if (null !== $this->vendorDir) {
333
- unset(self::$registeredLoaders[$this->vendorDir]);
334
- }
335
- }
336
-
337
- /**
338
- * Loads the given class or interface.
339
- *
340
- * @param string $class The name of the class
341
- * @return bool|null True if loaded, null otherwise
342
- */
343
- public function loadClass($class)
344
- {
345
- if ($file = $this->findFile($class)) {
346
- includeFile($file);
347
-
348
- return true;
349
- }
350
- }
351
-
352
- /**
353
- * Finds the path to the file where the class is defined.
354
- *
355
- * @param string $class The name of the class
356
- *
357
- * @return string|false The path if found, false otherwise
358
- */
359
- public function findFile($class)
360
- {
361
- // class map lookup
362
- if (isset($this->classMap[$class])) {
363
- return $this->classMap[$class];
364
- }
365
- if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
366
- return false;
367
- }
368
- if (null !== $this->apcuPrefix) {
369
- $file = apcu_fetch($this->apcuPrefix.$class, $hit);
370
- if ($hit) {
371
- return $file;
372
- }
373
- }
374
-
375
- $file = $this->findFileWithExtension($class, '.php');
376
-
377
- // Search for Hack files if we are running on HHVM
378
- if (false === $file && defined('HHVM_VERSION')) {
379
- $file = $this->findFileWithExtension($class, '.hh');
380
- }
381
-
382
- if (null !== $this->apcuPrefix) {
383
- apcu_add($this->apcuPrefix.$class, $file);
384
- }
385
-
386
- if (false === $file) {
387
- // Remember that this class does not exist.
388
- $this->missingClasses[$class] = true;
389
- }
390
-
391
- return $file;
392
- }
393
-
394
- /**
395
- * Returns the currently registered loaders indexed by their corresponding vendor directories.
396
- *
397
- * @return self[]
398
- */
399
- public static function getRegisteredLoaders()
400
- {
401
- return self::$registeredLoaders;
402
- }
403
-
404
- private function findFileWithExtension($class, $ext)
405
- {
406
- // PSR-4 lookup
407
- $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
408
-
409
- $first = $class[0];
410
- if (isset($this->prefixLengthsPsr4[$first])) {
411
- $subPath = $class;
412
- while (false !== $lastPos = strrpos($subPath, '\\')) {
413
- $subPath = substr($subPath, 0, $lastPos);
414
- $search = $subPath . '\\';
415
- if (isset($this->prefixDirsPsr4[$search])) {
416
- $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
417
- foreach ($this->prefixDirsPsr4[$search] as $dir) {
418
- if (file_exists($file = $dir . $pathEnd)) {
419
- return $file;
420
- }
421
- }
422
- }
423
- }
424
- }
425
-
426
- // PSR-4 fallback dirs
427
- foreach ($this->fallbackDirsPsr4 as $dir) {
428
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
429
- return $file;
430
- }
431
- }
432
-
433
- // PSR-0 lookup
434
- if (false !== $pos = strrpos($class, '\\')) {
435
- // namespaced class name
436
- $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
437
- . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
438
- } else {
439
- // PEAR-like class name
440
- $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
441
- }
442
-
443
- if (isset($this->prefixesPsr0[$first])) {
444
- foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
445
- if (0 === strpos($class, $prefix)) {
446
- foreach ($dirs as $dir) {
447
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
448
- return $file;
449
- }
450
- }
451
- }
452
- }
453
- }
454
-
455
- // PSR-0 fallback dirs
456
- foreach ($this->fallbackDirsPsr0 as $dir) {
457
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
458
- return $file;
459
- }
460
- }
461
-
462
- // PSR-0 include paths.
463
- if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
464
- return $file;
465
- }
466
-
467
- return false;
468
- }
469
- }
470
-
471
- /**
472
- * Scope isolated include.
473
- *
474
- * Prevents access to $this/self from included files.
475
- */
476
- function includeFile($file)
477
- {
478
- include $file;
479
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Composer.
5
+ *
6
+ * (c) Nils Adermann <naderman@naderman.de>
7
+ * Jordi Boggiano <j.boggiano@seld.be>
8
+ *
9
+ * For the full copyright and license information, please view the LICENSE
10
+ * file that was distributed with this source code.
11
+ */
12
+
13
+ namespace Composer\Autoload;
14
+
15
+ /**
16
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
17
+ *
18
+ * $loader = new \Composer\Autoload\ClassLoader();
19
+ *
20
+ * // register classes with namespaces
21
+ * $loader->add('Symfony\Component', __DIR__.'/component');
22
+ * $loader->add('Symfony', __DIR__.'/framework');
23
+ *
24
+ * // activate the autoloader
25
+ * $loader->register();
26
+ *
27
+ * // to enable searching the include path (eg. for PEAR packages)
28
+ * $loader->setUseIncludePath(true);
29
+ *
30
+ * In this example, if you try to use a class in the Symfony\Component
31
+ * namespace or one of its children (Symfony\Component\Console for instance),
32
+ * the autoloader will first look for the class under the component/
33
+ * directory, and it will then fallback to the framework/ directory if not
34
+ * found before giving up.
35
+ *
36
+ * This class is loosely based on the Symfony UniversalClassLoader.
37
+ *
38
+ * @author Fabien Potencier <fabien@symfony.com>
39
+ * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see https://www.php-fig.org/psr/psr-0/
41
+ * @see https://www.php-fig.org/psr/psr-4/
42
+ */
43
+ class ClassLoader
44
+ {
45
+ private $vendorDir;
46
+
47
+ // PSR-4
48
+ private $prefixLengthsPsr4 = array();
49
+ private $prefixDirsPsr4 = array();
50
+ private $fallbackDirsPsr4 = array();
51
+
52
+ // PSR-0
53
+ private $prefixesPsr0 = array();
54
+ private $fallbackDirsPsr0 = array();
55
+
56
+ private $useIncludePath = false;
57
+ private $classMap = array();
58
+ private $classMapAuthoritative = false;
59
+ private $missingClasses = array();
60
+ private $apcuPrefix;
61
+
62
+ private static $registeredLoaders = array();
63
+
64
+ public function __construct($vendorDir = null)
65
+ {
66
+ $this->vendorDir = $vendorDir;
67
+ }
68
+
69
+ public function getPrefixes()
70
+ {
71
+ if (!empty($this->prefixesPsr0)) {
72
+ return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
73
+ }
74
+
75
+ return array();
76
+ }
77
+
78
+ public function getPrefixesPsr4()
79
+ {
80
+ return $this->prefixDirsPsr4;
81
+ }
82
+
83
+ public function getFallbackDirs()
84
+ {
85
+ return $this->fallbackDirsPsr0;
86
+ }
87
+
88
+ public function getFallbackDirsPsr4()
89
+ {
90
+ return $this->fallbackDirsPsr4;
91
+ }
92
+
93
+ public function getClassMap()
94
+ {
95
+ return $this->classMap;
96
+ }
97
+
98
+ /**
99
+ * @param array $classMap Class to filename map
100
+ */
101
+ public function addClassMap(array $classMap)
102
+ {
103
+ if ($this->classMap) {
104
+ $this->classMap = array_merge($this->classMap, $classMap);
105
+ } else {
106
+ $this->classMap = $classMap;
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Registers a set of PSR-0 directories for a given prefix, either
112
+ * appending or prepending to the ones previously set for this prefix.
113
+ *
114
+ * @param string $prefix The prefix
115
+ * @param array|string $paths The PSR-0 root directories
116
+ * @param bool $prepend Whether to prepend the directories
117
+ */
118
+ public function add($prefix, $paths, $prepend = false)
119
+ {
120
+ if (!$prefix) {
121
+ if ($prepend) {
122
+ $this->fallbackDirsPsr0 = array_merge(
123
+ (array) $paths,
124
+ $this->fallbackDirsPsr0
125
+ );
126
+ } else {
127
+ $this->fallbackDirsPsr0 = array_merge(
128
+ $this->fallbackDirsPsr0,
129
+ (array) $paths
130
+ );
131
+ }
132
+
133
+ return;
134
+ }
135
+
136
+ $first = $prefix[0];
137
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
138
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
139
+
140
+ return;
141
+ }
142
+ if ($prepend) {
143
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
144
+ (array) $paths,
145
+ $this->prefixesPsr0[$first][$prefix]
146
+ );
147
+ } else {
148
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
149
+ $this->prefixesPsr0[$first][$prefix],
150
+ (array) $paths
151
+ );
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Registers a set of PSR-4 directories for a given namespace, either
157
+ * appending or prepending to the ones previously set for this namespace.
158
+ *
159
+ * @param string $prefix The prefix/namespace, with trailing '\\'
160
+ * @param array|string $paths The PSR-4 base directories
161
+ * @param bool $prepend Whether to prepend the directories
162
+ *
163
+ * @throws \InvalidArgumentException
164
+ */
165
+ public function addPsr4($prefix, $paths, $prepend = false)
166
+ {
167
+ if (!$prefix) {
168
+ // Register directories for the root namespace.
169
+ if ($prepend) {
170
+ $this->fallbackDirsPsr4 = array_merge(
171
+ (array) $paths,
172
+ $this->fallbackDirsPsr4
173
+ );
174
+ } else {
175
+ $this->fallbackDirsPsr4 = array_merge(
176
+ $this->fallbackDirsPsr4,
177
+ (array) $paths
178
+ );
179
+ }
180
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
181
+ // Register directories for a new namespace.
182
+ $length = strlen($prefix);
183
+ if ('\\' !== $prefix[$length - 1]) {
184
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
185
+ }
186
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
187
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
188
+ } elseif ($prepend) {
189
+ // Prepend directories for an already registered namespace.
190
+ $this->prefixDirsPsr4[$prefix] = array_merge(
191
+ (array) $paths,
192
+ $this->prefixDirsPsr4[$prefix]
193
+ );
194
+ } else {
195
+ // Append directories for an already registered namespace.
196
+ $this->prefixDirsPsr4[$prefix] = array_merge(
197
+ $this->prefixDirsPsr4[$prefix],
198
+ (array) $paths
199
+ );
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Registers a set of PSR-0 directories for a given prefix,
205
+ * replacing any others previously set for this prefix.
206
+ *
207
+ * @param string $prefix The prefix
208
+ * @param array|string $paths The PSR-0 base directories
209
+ */
210
+ public function set($prefix, $paths)
211
+ {
212
+ if (!$prefix) {
213
+ $this->fallbackDirsPsr0 = (array) $paths;
214
+ } else {
215
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Registers a set of PSR-4 directories for a given namespace,
221
+ * replacing any others previously set for this namespace.
222
+ *
223
+ * @param string $prefix The prefix/namespace, with trailing '\\'
224
+ * @param array|string $paths The PSR-4 base directories
225
+ *
226
+ * @throws \InvalidArgumentException
227
+ */
228
+ public function setPsr4($prefix, $paths)
229
+ {
230
+ if (!$prefix) {
231
+ $this->fallbackDirsPsr4 = (array) $paths;
232
+ } else {
233
+ $length = strlen($prefix);
234
+ if ('\\' !== $prefix[$length - 1]) {
235
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
236
+ }
237
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
238
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
239
+ }
240
+ }
241
+
242
+ /**
243
+ * Turns on searching the include path for class files.
244
+ *
245
+ * @param bool $useIncludePath
246
+ */
247
+ public function setUseIncludePath($useIncludePath)
248
+ {
249
+ $this->useIncludePath = $useIncludePath;
250
+ }
251
+
252
+ /**
253
+ * Can be used to check if the autoloader uses the include path to check
254
+ * for classes.
255
+ *
256
+ * @return bool
257
+ */
258
+ public function getUseIncludePath()
259
+ {
260
+ return $this->useIncludePath;
261
+ }
262
+
263
+ /**
264
+ * Turns off searching the prefix and fallback directories for classes
265
+ * that have not been registered with the class map.
266
+ *
267
+ * @param bool $classMapAuthoritative
268
+ */
269
+ public function setClassMapAuthoritative($classMapAuthoritative)
270
+ {
271
+ $this->classMapAuthoritative = $classMapAuthoritative;
272
+ }
273
+
274
+ /**
275
+ * Should class lookup fail if not found in the current class map?
276
+ *
277
+ * @return bool
278
+ */
279
+ public function isClassMapAuthoritative()
280
+ {
281
+ return $this->classMapAuthoritative;
282
+ }
283
+
284
+ /**
285
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
286
+ *
287
+ * @param string|null $apcuPrefix
288
+ */
289
+ public function setApcuPrefix($apcuPrefix)
290
+ {
291
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
292
+ }
293
+
294
+ /**
295
+ * The APCu prefix in use, or null if APCu caching is not enabled.
296
+ *
297
+ * @return string|null
298
+ */
299
+ public function getApcuPrefix()
300
+ {
301
+ return $this->apcuPrefix;
302
+ }
303
+
304
+ /**
305
+ * Registers this instance as an autoloader.
306
+ *
307
+ * @param bool $prepend Whether to prepend the autoloader or not
308
+ */
309
+ public function register($prepend = false)
310
+ {
311
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
312
+
313
+ if (null === $this->vendorDir) {
314
+ return;
315
+ }
316
+
317
+ if ($prepend) {
318
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
319
+ } else {
320
+ unset(self::$registeredLoaders[$this->vendorDir]);
321
+ self::$registeredLoaders[$this->vendorDir] = $this;
322
+ }
323
+ }
324
+
325
+ /**
326
+ * Unregisters this instance as an autoloader.
327
+ */
328
+ public function unregister()
329
+ {
330
+ spl_autoload_unregister(array($this, 'loadClass'));
331
+
332
+ if (null !== $this->vendorDir) {
333
+ unset(self::$registeredLoaders[$this->vendorDir]);
334
+ }
335
+ }
336
+
337
+ /**
338
+ * Loads the given class or interface.
339
+ *
340
+ * @param string $class The name of the class
341
+ * @return bool|null True if loaded, null otherwise
342
+ */
343
+ public function loadClass($class)
344
+ {
345
+ if ($file = $this->findFile($class)) {
346
+ includeFile($file);
347
+
348
+ return true;
349
+ }
350
+ }
351
+
352
+ /**
353
+ * Finds the path to the file where the class is defined.
354
+ *
355
+ * @param string $class The name of the class
356
+ *
357
+ * @return string|false The path if found, false otherwise
358
+ */
359
+ public function findFile($class)
360
+ {
361
+ // class map lookup
362
+ if (isset($this->classMap[$class])) {
363
+ return $this->classMap[$class];
364
+ }
365
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
366
+ return false;
367
+ }
368
+ if (null !== $this->apcuPrefix) {
369
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
370
+ if ($hit) {
371
+ return $file;
372
+ }
373
+ }
374
+
375
+ $file = $this->findFileWithExtension($class, '.php');
376
+
377
+ // Search for Hack files if we are running on HHVM
378
+ if (false === $file && defined('HHVM_VERSION')) {
379
+ $file = $this->findFileWithExtension($class, '.hh');
380
+ }
381
+
382
+ if (null !== $this->apcuPrefix) {
383
+ apcu_add($this->apcuPrefix.$class, $file);
384
+ }
385
+
386
+ if (false === $file) {
387
+ // Remember that this class does not exist.
388
+ $this->missingClasses[$class] = true;
389
+ }
390
+
391
+ return $file;
392
+ }
393
+
394
+ /**
395
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
396
+ *
397
+ * @return self[]
398
+ */
399
+ public static function getRegisteredLoaders()
400
+ {
401
+ return self::$registeredLoaders;
402
+ }
403
+
404
+ private function findFileWithExtension($class, $ext)
405
+ {
406
+ // PSR-4 lookup
407
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
408
+
409
+ $first = $class[0];
410
+ if (isset($this->prefixLengthsPsr4[$first])) {
411
+ $subPath = $class;
412
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
413
+ $subPath = substr($subPath, 0, $lastPos);
414
+ $search = $subPath . '\\';
415
+ if (isset($this->prefixDirsPsr4[$search])) {
416
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
417
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
418
+ if (file_exists($file = $dir . $pathEnd)) {
419
+ return $file;
420
+ }
421
+ }
422
+ }
423
+ }
424
+ }
425
+
426
+ // PSR-4 fallback dirs
427
+ foreach ($this->fallbackDirsPsr4 as $dir) {
428
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
429
+ return $file;
430
+ }
431
+ }
432
+
433
+ // PSR-0 lookup
434
+ if (false !== $pos = strrpos($class, '\\')) {
435
+ // namespaced class name
436
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
437
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
438
+ } else {
439
+ // PEAR-like class name
440
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
441
+ }
442
+
443
+ if (isset($this->prefixesPsr0[$first])) {
444
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
445
+ if (0 === strpos($class, $prefix)) {
446
+ foreach ($dirs as $dir) {
447
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
448
+ return $file;
449
+ }
450
+ }
451
+ }
452
+ }
453
+ }
454
+
455
+ // PSR-0 fallback dirs
456
+ foreach ($this->fallbackDirsPsr0 as $dir) {
457
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
458
+ return $file;
459
+ }
460
+ }
461
+
462
+ // PSR-0 include paths.
463
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
464
+ return $file;
465
+ }
466
+
467
+ return false;
468
+ }
469
+ }
470
+
471
+ /**
472
+ * Scope isolated include.
473
+ *
474
+ * Prevents access to $this/self from included files.
475
+ */
476
+ function includeFile($file)
477
+ {
478
+ include $file;
479
+ }
vendor/composer/InstalledVersions.php CHANGED
@@ -1,328 +1,328 @@
1
- <?php
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
- namespace Composer;
14
-
15
- use Composer\Autoload\ClassLoader;
16
- use Composer\Semver\VersionParser;
17
-
18
-
19
-
20
-
21
-
22
-
23
- class InstalledVersions
24
- {
25
- private static $installed = array (
26
- 'root' =>
27
- array (
28
- 'pretty_version' => 'dev-master',
29
- 'version' => 'dev-master',
30
- 'aliases' =>
31
- array (
32
- ),
33
- 'reference' => '0ff9b86fd28a59488d9b215bd51e57198655c7b9',
34
- 'name' => '__root__',
35
- ),
36
- 'versions' =>
37
- array (
38
- '__root__' =>
39
- array (
40
- 'pretty_version' => 'dev-master',
41
- 'version' => 'dev-master',
42
- 'aliases' =>
43
- array (
44
- ),
45
- 'reference' => '0ff9b86fd28a59488d9b215bd51e57198655c7b9',
46
- ),
47
- 'dompdf/dompdf' =>
48
- array (
49
- 'pretty_version' => 'v1.0.2',
50
- 'version' => '1.0.2.0',
51
- 'aliases' =>
52
- array (
53
- ),
54
- 'reference' => '8768448244967a46d6e67b891d30878e0e15d25c',
55
- ),
56
- 'phenx/php-font-lib' =>
57
- array (
58
- 'pretty_version' => '0.5.2',
59
- 'version' => '0.5.2.0',
60
- 'aliases' =>
61
- array (
62
- ),
63
- 'reference' => 'ca6ad461f032145fff5971b5985e5af9e7fa88d8',
64
- ),
65
- 'phenx/php-svg-lib' =>
66
- array (
67
- 'pretty_version' => 'v0.3.3',
68
- 'version' => '0.3.3.0',
69
- 'aliases' =>
70
- array (
71
- ),
72
- 'reference' => '5fa61b65e612ce1ae15f69b3d223cb14ecc60e32',
73
- ),
74
- 'sabberworm/php-css-parser' =>
75
- array (
76
- 'pretty_version' => '8.3.1',
77
- 'version' => '8.3.1.0',
78
- 'aliases' =>
79
- array (
80
- ),
81
- 'reference' => 'd217848e1396ef962fb1997cf3e2421acba7f796',
82
- ),
83
- 'symfony/polyfill-mbstring' =>
84
- array (
85
- 'pretty_version' => 'v1.20.0',
86
- 'version' => '1.20.0.0',
87
- 'aliases' =>
88
- array (
89
- ),
90
- 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531',
91
- ),
92
- ),
93
- );
94
- private static $canGetVendors;
95
- private static $installedByVendor = array();
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
- public static function getInstalledPackages()
104
- {
105
- $packages = array();
106
- foreach (self::getInstalled() as $installed) {
107
- $packages[] = array_keys($installed['versions']);
108
- }
109
-
110
-
111
- if (1 === \count($packages)) {
112
- return $packages[0];
113
- }
114
-
115
- return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
116
- }
117
-
118
-
119
-
120
-
121
-
122
-
123
-
124
-
125
-
126
- public static function isInstalled($packageName)
127
- {
128
- foreach (self::getInstalled() as $installed) {
129
- if (isset($installed['versions'][$packageName])) {
130
- return true;
131
- }
132
- }
133
-
134
- return false;
135
- }
136
-
137
-
138
-
139
-
140
-
141
-
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
-
150
- public static function satisfies(VersionParser $parser, $packageName, $constraint)
151
- {
152
- $constraint = $parser->parseConstraints($constraint);
153
- $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
154
-
155
- return $provided->matches($constraint);
156
- }
157
-
158
-
159
-
160
-
161
-
162
-
163
-
164
-
165
-
166
-
167
- public static function getVersionRanges($packageName)
168
- {
169
- foreach (self::getInstalled() as $installed) {
170
- if (!isset($installed['versions'][$packageName])) {
171
- continue;
172
- }
173
-
174
- $ranges = array();
175
- if (isset($installed['versions'][$packageName]['pretty_version'])) {
176
- $ranges[] = $installed['versions'][$packageName]['pretty_version'];
177
- }
178
- if (array_key_exists('aliases', $installed['versions'][$packageName])) {
179
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
180
- }
181
- if (array_key_exists('replaced', $installed['versions'][$packageName])) {
182
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
183
- }
184
- if (array_key_exists('provided', $installed['versions'][$packageName])) {
185
- $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
186
- }
187
-
188
- return implode(' || ', $ranges);
189
- }
190
-
191
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
192
- }
193
-
194
-
195
-
196
-
197
-
198
- public static function getVersion($packageName)
199
- {
200
- foreach (self::getInstalled() as $installed) {
201
- if (!isset($installed['versions'][$packageName])) {
202
- continue;
203
- }
204
-
205
- if (!isset($installed['versions'][$packageName]['version'])) {
206
- return null;
207
- }
208
-
209
- return $installed['versions'][$packageName]['version'];
210
- }
211
-
212
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
213
- }
214
-
215
-
216
-
217
-
218
-
219
- public static function getPrettyVersion($packageName)
220
- {
221
- foreach (self::getInstalled() as $installed) {
222
- if (!isset($installed['versions'][$packageName])) {
223
- continue;
224
- }
225
-
226
- if (!isset($installed['versions'][$packageName]['pretty_version'])) {
227
- return null;
228
- }
229
-
230
- return $installed['versions'][$packageName]['pretty_version'];
231
- }
232
-
233
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
234
- }
235
-
236
-
237
-
238
-
239
-
240
- public static function getReference($packageName)
241
- {
242
- foreach (self::getInstalled() as $installed) {
243
- if (!isset($installed['versions'][$packageName])) {
244
- continue;
245
- }
246
-
247
- if (!isset($installed['versions'][$packageName]['reference'])) {
248
- return null;
249
- }
250
-
251
- return $installed['versions'][$packageName]['reference'];
252
- }
253
-
254
- throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
255
- }
256
-
257
-
258
-
259
-
260
-
261
- public static function getRootPackage()
262
- {
263
- $installed = self::getInstalled();
264
-
265
- return $installed[0]['root'];
266
- }
267
-
268
-
269
-
270
-
271
-
272
-
273
-
274
- public static function getRawData()
275
- {
276
- return self::$installed;
277
- }
278
-
279
-
280
-
281
-
282
-
283
-
284
-
285
-
286
-
287
-
288
-
289
-
290
-
291
-
292
-
293
-
294
-
295
-
296
-
297
- public static function reload($data)
298
- {
299
- self::$installed = $data;
300
- self::$installedByVendor = array();
301
- }
302
-
303
-
304
-
305
-
306
- private static function getInstalled()
307
- {
308
- if (null === self::$canGetVendors) {
309
- self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
310
- }
311
-
312
- $installed = array();
313
-
314
- if (self::$canGetVendors) {
315
- foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
316
- if (isset(self::$installedByVendor[$vendorDir])) {
317
- $installed[] = self::$installedByVendor[$vendorDir];
318
- } elseif (is_file($vendorDir.'/composer/installed.php')) {
319
- $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
320
- }
321
- }
322
- }
323
-
324
- $installed[] = self::$installed;
325
-
326
- return $installed;
327
- }
328
- }
1
+ <?php
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+ namespace Composer;
14
+
15
+ use Composer\Autoload\ClassLoader;
16
+ use Composer\Semver\VersionParser;
17
+
18
+
19
+
20
+
21
+
22
+
23
+ class InstalledVersions
24
+ {
25
+ private static $installed = array (
26
+ 'root' =>
27
+ array (
28
+ 'pretty_version' => 'dev-master',
29
+ 'version' => 'dev-master',
30
+ 'aliases' =>
31
+ array (
32
+ ),
33
+ 'reference' => '0ff9b86fd28a59488d9b215bd51e57198655c7b9',
34
+ 'name' => '__root__',
35
+ ),
36
+ 'versions' =>
37
+ array (
38
+ '__root__' =>
39
+ array (
40
+ 'pretty_version' => 'dev-master',
41
+ 'version' => 'dev-master',
42
+ 'aliases' =>
43
+ array (
44
+ ),
45
+ 'reference' => '0ff9b86fd28a59488d9b215bd51e57198655c7b9',
46
+ ),
47
+ 'dompdf/dompdf' =>
48
+ array (
49
+ 'pretty_version' => 'v1.0.2',
50
+ 'version' => '1.0.2.0',
51
+ 'aliases' =>
52
+ array (
53
+ ),
54
+ 'reference' => '8768448244967a46d6e67b891d30878e0e15d25c',
55
+ ),
56
+ 'phenx/php-font-lib' =>
57
+ array (
58
+ 'pretty_version' => '0.5.2',
59
+ 'version' => '0.5.2.0',
60
+ 'aliases' =>
61
+ array (
62
+ ),
63
+ 'reference' => 'ca6ad461f032145fff5971b5985e5af9e7fa88d8',
64
+ ),
65
+ 'phenx/php-svg-lib' =>
66
+ array (
67
+ 'pretty_version' => 'v0.3.3',
68
+ 'version' => '0.3.3.0',
69
+ 'aliases' =>
70
+ array (
71
+ ),
72
+ 'reference' => '5fa61b65e612ce1ae15f69b3d223cb14ecc60e32',
73
+ ),
74
+ 'sabberworm/php-css-parser' =>
75
+ array (
76
+ 'pretty_version' => '8.3.1',
77
+ 'version' => '8.3.1.0',
78
+ 'aliases' =>
79
+ array (
80
+ ),
81
+ 'reference' => 'd217848e1396ef962fb1997cf3e2421acba7f796',
82
+ ),
83
+ 'symfony/polyfill-mbstring' =>
84
+ array (
85
+ 'pretty_version' => 'v1.20.0',
86
+ 'version' => '1.20.0.0',
87
+ 'aliases' =>
88
+ array (
89
+ ),
90
+ 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531',
91
+ ),
92
+ ),
93
+ );
94
+ private static $canGetVendors;
95
+ private static $installedByVendor = array();
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+ public static function getInstalledPackages()
104
+ {
105
+ $packages = array();
106
+ foreach (self::getInstalled() as $installed) {
107
+ $packages[] = array_keys($installed['versions']);
108
+ }
109
+
110
+
111
+ if (1 === \count($packages)) {
112
+ return $packages[0];
113
+ }
114
+
115
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
116
+ }
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+ public static function isInstalled($packageName)
127
+ {
128
+ foreach (self::getInstalled() as $installed) {
129
+ if (isset($installed['versions'][$packageName])) {
130
+ return true;
131
+ }
132
+ }
133
+
134
+ return false;
135
+ }
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
151
+ {
152
+ $constraint = $parser->parseConstraints($constraint);
153
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
154
+
155
+ return $provided->matches($constraint);
156
+ }
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+ public static function getVersionRanges($packageName)
168
+ {
169
+ foreach (self::getInstalled() as $installed) {
170
+ if (!isset($installed['versions'][$packageName])) {
171
+ continue;
172
+ }
173
+
174
+ $ranges = array();
175
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
176
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
177
+ }
178
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
179
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
180
+ }
181
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
182
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
183
+ }
184
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
185
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
186
+ }
187
+
188
+ return implode(' || ', $ranges);
189
+ }
190
+
191
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
192
+ }
193
+
194
+
195
+
196
+
197
+
198
+ public static function getVersion($packageName)
199
+ {
200
+ foreach (self::getInstalled() as $installed) {
201
+ if (!isset($installed['versions'][$packageName])) {
202
+ continue;
203
+ }
204
+
205
+ if (!isset($installed['versions'][$packageName]['version'])) {
206
+ return null;
207
+ }
208
+
209
+ return $installed['versions'][$packageName]['version'];
210
+ }
211
+
212
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
213
+ }
214
+
215
+
216
+
217
+
218
+
219
+ public static function getPrettyVersion($packageName)
220
+ {
221
+ foreach (self::getInstalled() as $installed) {
222
+ if (!isset($installed['versions'][$packageName])) {
223
+ continue;
224
+ }
225
+
226
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
227
+ return null;
228
+ }
229
+
230
+ return $installed['versions'][$packageName]['pretty_version'];
231
+ }
232
+
233
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
234
+ }
235
+
236
+
237
+
238
+
239
+
240
+ public static function getReference($packageName)
241
+ {
242
+ foreach (self::getInstalled() as $installed) {
243
+ if (!isset($installed['versions'][$packageName])) {
244
+ continue;
245
+ }
246
+
247
+ if (!isset($installed['versions'][$packageName]['reference'])) {
248
+ return null;
249
+ }
250
+
251
+ return $installed['versions'][$packageName]['reference'];
252
+ }
253
+
254
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
255
+ }
256
+
257
+
258
+
259
+
260
+
261
+ public static function getRootPackage()
262
+ {
263
+ $installed = self::getInstalled();
264
+
265
+ return $installed[0]['root'];
266
+ }
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+ public static function getRawData()
275
+ {
276
+ return self::$installed;
277
+ }
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+
297
+ public static function reload($data)
298
+ {
299
+ self::$installed = $data;
300
+ self::$installedByVendor = array();
301
+ }
302
+
303
+
304
+
305
+
306
+ private static function getInstalled()
307
+ {
308
+ if (null === self::$canGetVendors) {
309
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
310
+ }
311
+
312
+ $installed = array();
313
+
314
+ if (self::$canGetVendors) {
315
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
316
+ if (isset(self::$installedByVendor[$vendorDir])) {
317
+ $installed[] = self::$installedByVendor[$vendorDir];
318
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
319
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
320
+ }
321
+ }
322
+ }
323
+
324
+ $installed[] = self::$installed;
325
+
326
+ return $installed;
327
+ }
328
+ }
vendor/composer/autoload_files.php CHANGED
@@ -1,10 +1,10 @@
1
- <?php
2
-
3
- // autoload_files.php @generated by Composer
4
-
5
- $vendorDir = dirname(dirname(__FILE__));
6
- $baseDir = dirname($vendorDir);
7
-
8
- return array(
9
- '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
10
- );
1
+ <?php
2
+
3
+ // autoload_files.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
10
+ );
vendor/composer/autoload_psr4.php CHANGED
@@ -1,13 +1,13 @@
1
- <?php
2
-
3
- // autoload_psr4.php @generated by Composer
4
-
5
- $vendorDir = dirname(dirname(__FILE__));
6
- $baseDir = dirname($vendorDir);
7
-
8
- return array(
9
- 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
10
- 'Svg\\' => array($vendorDir . '/phenx/php-svg-lib/src/Svg'),
11
- 'FontLib\\' => array($vendorDir . '/phenx/php-font-lib/src/FontLib'),
12
- 'Dompdf\\' => array($vendorDir . '/dompdf/dompdf/src'),
13
- );
1
+ <?php
2
+
3
+ // autoload_psr4.php @generated by Composer
4
+
5
+ $vendorDir = dirname(dirname(__FILE__));
6
+ $baseDir = dirname($vendorDir);
7
+
8
+ return array(
9
+ 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
10
+ 'Svg\\' => array($vendorDir . '/phenx/php-svg-lib/src/Svg'),
11
+ 'FontLib\\' => array($vendorDir . '/phenx/php-font-lib/src/FontLib'),
12
+ 'Dompdf\\' => array($vendorDir . '/dompdf/dompdf/src'),
13
+ );
vendor/composer/autoload_real.php CHANGED
@@ -1,75 +1,75 @@
1
- <?php
2
-
3
- // autoload_real.php @generated by Composer
4
-
5
- class ComposerAutoloaderInit91fa098344a2dea6316819c06b8931af
6
- {
7
- private static $loader;
8
-
9
- public static function loadClassLoader($class)
10
- {
11
- if ('Composer\Autoload\ClassLoader' === $class) {
12
- require __DIR__ . '/ClassLoader.php';
13
- }
14
- }
15
-
16
- /**
17
- * @return \Composer\Autoload\ClassLoader
18
- */
19
- public static function getLoader()
20
- {
21
- if (null !== self::$loader) {
22
- return self::$loader;
23
- }
24
-
25
- require __DIR__ . '/platform_check.php';
26
-
27
- spl_autoload_register(array('ComposerAutoloaderInit91fa098344a2dea6316819c06b8931af', 'loadClassLoader'), true, true);
28
- self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
- spl_autoload_unregister(array('ComposerAutoloaderInit91fa098344a2dea6316819c06b8931af', 'loadClassLoader'));
30
-
31
- $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
- if ($useStaticLoader) {
33
- require __DIR__ . '/autoload_static.php';
34
-
35
- call_user_func(\Composer\Autoload\ComposerStaticInit91fa098344a2dea6316819c06b8931af::getInitializer($loader));
36
- } else {
37
- $map = require __DIR__ . '/autoload_namespaces.php';
38
- foreach ($map as $namespace => $path) {
39
- $loader->set($namespace, $path);
40
- }
41
-
42
- $map = require __DIR__ . '/autoload_psr4.php';
43
- foreach ($map as $namespace => $path) {
44
- $loader->setPsr4($namespace, $path);
45
- }
46
-
47
- $classMap = require __DIR__ . '/autoload_classmap.php';
48
- if ($classMap) {
49
- $loader->addClassMap($classMap);
50
- }
51
- }
52
-
53
- $loader->register(true);
54
-
55
- if ($useStaticLoader) {
56
- $includeFiles = Composer\Autoload\ComposerStaticInit91fa098344a2dea6316819c06b8931af::$files;
57
- } else {
58
- $includeFiles = require __DIR__ . '/autoload_files.php';
59
- }
60
- foreach ($includeFiles as $fileIdentifier => $file) {
61
- composerRequire91fa098344a2dea6316819c06b8931af($fileIdentifier, $file);
62
- }
63
-
64
- return $loader;
65
- }
66
- }
67
-
68
- function composerRequire91fa098344a2dea6316819c06b8931af($fileIdentifier, $file)
69
- {
70
- if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
71
- require $file;
72
-
73
- $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
74
- }
75
- }
1
+ <?php
2
+
3
+ // autoload_real.php @generated by Composer
4
+
5
+ class ComposerAutoloaderInit91fa098344a2dea6316819c06b8931af
6
+ {
7
+ private static $loader;
8
+
9
+ public static function loadClassLoader($class)
10
+ {
11
+ if ('Composer\Autoload\ClassLoader' === $class) {
12
+ require __DIR__ . '/ClassLoader.php';
13
+ }
14
+ }
15
+
16
+ /**
17
+ * @return \Composer\Autoload\ClassLoader
18
+ */
19
+ public static function getLoader()
20
+ {
21
+ if (null !== self::$loader) {
22
+ return self::$loader;
23
+ }
24
+
25
+ require __DIR__ . '/platform_check.php';
26
+
27
+ spl_autoload_register(array('ComposerAutoloaderInit91fa098344a2dea6316819c06b8931af', 'loadClassLoader'), true, true);
28
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInit91fa098344a2dea6316819c06b8931af', 'loadClassLoader'));
30
+
31
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
+ if ($useStaticLoader) {
33
+ require __DIR__ . '/autoload_static.php';
34
+
35
+ call_user_func(\Composer\Autoload\ComposerStaticInit91fa098344a2dea6316819c06b8931af::getInitializer($loader));
36
+ } else {
37
+ $map = require __DIR__ . '/autoload_namespaces.php';
38
+ foreach ($map as $namespace => $path) {
39
+ $loader->set($namespace, $path);
40
+ }
41
+
42
+ $map = require __DIR__ . '/autoload_psr4.php';
43
+ foreach ($map as $namespace => $path) {
44
+ $loader->setPsr4($namespace, $path);
45
+ }
46
+
47
+ $classMap = require __DIR__ . '/autoload_classmap.php';
48
+ if ($classMap) {
49
+ $loader->addClassMap($classMap);
50
+ }
51
+ }
52
+
53
+ $loader->register(true);
54
+
55
+ if ($useStaticLoader) {
56
+ $includeFiles = Composer\Autoload\ComposerStaticInit91fa098344a2dea6316819c06b8931af::$files;
57
+ } else {
58
+ $includeFiles = require __DIR__ . '/autoload_files.php';
59
+ }
60
+ foreach ($includeFiles as $fileIdentifier => $file) {
61
+ composerRequire91fa098344a2dea6316819c06b8931af($fileIdentifier, $file);
62
+ }
63
+
64
+ return $loader;
65
+ }
66
+ }
67
+
68
+ function composerRequire91fa098344a2dea6316819c06b8931af($fileIdentifier, $file)
69
+ {
70
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
71
+ require $file;
72
+
73
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
74
+ }
75
+ }
vendor/composer/autoload_static.php CHANGED
@@ -1,78 +1,78 @@
1
- <?php
2
-
3
- // autoload_static.php @generated by Composer
4
-
5
- namespace Composer\Autoload;
6
-
7
- class ComposerStaticInit91fa098344a2dea6316819c06b8931af
8
- {
9
- public static $files = array (
10
- '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
11
- );
12
-
13
- public static $prefixLengthsPsr4 = array (
14
- 'S' =>
15
- array (
16
- 'Symfony\\Polyfill\\Mbstring\\' => 26,
17
- 'Svg\\' => 4,
18
- ),
19
- 'F' =>
20
- array (
21
- 'FontLib\\' => 8,
22
- ),
23
- 'D' =>
24
- array (
25
- 'Dompdf\\' => 7,
26
- ),
27
- );
28
-
29
- public static $prefixDirsPsr4 = array (
30
- 'Symfony\\Polyfill\\Mbstring\\' =>
31
- array (
32
- 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
33
- ),
34
- 'Svg\\' =>
35
- array (
36
- 0 => __DIR__ . '/..' . '/phenx/php-svg-lib/src/Svg',
37
- ),
38
- 'FontLib\\' =>
39
- array (
40
- 0 => __DIR__ . '/..' . '/phenx/php-font-lib/src/FontLib',
41
- ),
42
- 'Dompdf\\' =>
43
- array (
44
- 0 => __DIR__ . '/..' . '/dompdf/dompdf/src',
45
- ),
46
- );
47
-
48
- public static $prefixesPsr0 = array (
49
- 'S' =>
50
- array (
51
- 'Sabberworm\\CSS' =>
52
- array (
53
- 0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib',
54
- ),
55
- ),
56
- );
57
-
58
- public static $classMap = array (
59
- 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
60
- 'Dompdf\\Cpdf' => __DIR__ . '/..' . '/dompdf/dompdf/lib/Cpdf.php',
61
- 'HTML5_Data' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Data.php',
62
- 'HTML5_InputStream' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/InputStream.php',
63
- 'HTML5_Parser' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Parser.php',
64
- 'HTML5_Tokenizer' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Tokenizer.php',
65
- 'HTML5_TreeBuilder' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/TreeBuilder.php',
66
- );
67
-
68
- public static function getInitializer(ClassLoader $loader)
69
- {
70
- return \Closure::bind(function () use ($loader) {
71
- $loader->prefixLengthsPsr4 = ComposerStaticInit91fa098344a2dea6316819c06b8931af::$prefixLengthsPsr4;
72
- $loader->prefixDirsPsr4 = ComposerStaticInit91fa098344a2dea6316819c06b8931af::$prefixDirsPsr4;
73
- $loader->prefixesPsr0 = ComposerStaticInit91fa098344a2dea6316819c06b8931af::$prefixesPsr0;
74
- $loader->classMap = ComposerStaticInit91fa098344a2dea6316819c06b8931af::$classMap;
75
-
76
- }, null, ClassLoader::class);
77
- }
78
- }
1
+ <?php
2
+
3
+ // autoload_static.php @generated by Composer
4
+
5
+ namespace Composer\Autoload;
6
+
7
+ class ComposerStaticInit91fa098344a2dea6316819c06b8931af
8
+ {
9
+ public static $files = array (
10
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
11
+ );
12
+
13
+ public static $prefixLengthsPsr4 = array (
14
+ 'S' =>
15
+ array (
16
+ 'Symfony\\Polyfill\\Mbstring\\' => 26,
17
+ 'Svg\\' => 4,
18
+ ),
19
+ 'F' =>
20
+ array (
21
+ 'FontLib\\' => 8,
22
+ ),
23
+ 'D' =>
24
+ array (
25
+ 'Dompdf\\' => 7,
26
+ ),
27
+ );
28
+
29
+ public static $prefixDirsPsr4 = array (
30
+ 'Symfony\\Polyfill\\Mbstring\\' =>
31
+ array (
32
+ 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
33
+ ),
34
+ 'Svg\\' =>
35
+ array (
36
+ 0 => __DIR__ . '/..' . '/phenx/php-svg-lib/src/Svg',
37
+ ),
38
+ 'FontLib\\' =>
39
+ array (
40
+ 0 => __DIR__ . '/..' . '/phenx/php-font-lib/src/FontLib',
41
+ ),
42
+ 'Dompdf\\' =>
43
+ array (
44
+ 0 => __DIR__ . '/..' . '/dompdf/dompdf/src',
45
+ ),
46
+ );
47
+
48
+ public static $prefixesPsr0 = array (
49
+ 'S' =>
50
+ array (
51
+ 'Sabberworm\\CSS' =>
52
+ array (
53
+ 0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/lib',
54
+ ),
55
+ ),
56
+ );
57
+
58
+ public static $classMap = array (
59
+ 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
60
+ 'Dompdf\\Cpdf' => __DIR__ . '/..' . '/dompdf/dompdf/lib/Cpdf.php',
61
+ 'HTML5_Data' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Data.php',
62
+ 'HTML5_InputStream' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/InputStream.php',
63
+ 'HTML5_Parser' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Parser.php',
64
+ 'HTML5_Tokenizer' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/Tokenizer.php',
65
+ 'HTML5_TreeBuilder' => __DIR__ . '/..' . '/dompdf/dompdf/lib/html5lib/TreeBuilder.php',
66
+ );
67
+
68
+ public static function getInitializer(ClassLoader $loader)
69
+ {
70
+ return \Closure::bind(function () use ($loader) {
71
+ $loader->prefixLengthsPsr4 = ComposerStaticInit91fa098344a2dea6316819c06b8931af::$prefixLengthsPsr4;
72
+ $loader->prefixDirsPsr4 = ComposerStaticInit91fa098344a2dea6316819c06b8931af::$prefixDirsPsr4;
73
+ $loader->prefixesPsr0 = ComposerStaticInit91fa098344a2dea6316819c06b8931af::$prefixesPsr0;
74
+ $loader->classMap = ComposerStaticInit91fa098344a2dea6316819c06b8931af::$classMap;
75
+
76
+ }, null, ClassLoader::class);
77
+ }
78
+ }
vendor/composer/installed.json CHANGED
@@ -1,307 +1,307 @@
1
- {
2
- "packages": [
3
- {
4
- "name": "dompdf/dompdf",
5
- "version": "v1.0.2",
6
- "version_normalized": "1.0.2.0",
7
- "source": {
8
- "type": "git",
9
- "url": "https://github.com/dompdf/dompdf.git",
10
- "reference": "8768448244967a46d6e67b891d30878e0e15d25c"
11
- },
12
- "dist": {
13
- "type": "zip",
14
- "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8768448244967a46d6e67b891d30878e0e15d25c",
15
- "reference": "8768448244967a46d6e67b891d30878e0e15d25c",
16
- "shasum": ""
17
- },
18
- "require": {
19
- "ext-dom": "*",
20
- "ext-mbstring": "*",
21
- "phenx/php-font-lib": "^0.5.2",
22
- "phenx/php-svg-lib": "^0.3.3",
23
- "php": "^7.1 || ^8.0"
24
- },
25
- "require-dev": {
26
- "mockery/mockery": "^1.3",
27
- "phpunit/phpunit": "^7.5 || ^8 || ^9",
28
- "squizlabs/php_codesniffer": "^3.5"
29
- },
30
- "suggest": {
31
- "ext-gd": "Needed to process images",
32
- "ext-gmagick": "Improves image processing performance",
33
- "ext-imagick": "Improves image processing performance",
34
- "ext-zlib": "Needed for pdf stream compression"
35
- },
36
- "time": "2021-01-08T14:18:52+00:00",
37
- "type": "library",
38
- "extra": {
39
- "branch-alias": {
40
- "dev-develop": "0.7-dev"
41
- }
42
- },
43
- "installation-source": "dist",
44
- "autoload": {
45
- "psr-4": {
46
- "Dompdf\\": "src/"
47
- },
48
- "classmap": [
49
- "lib/"
50
- ]
51
- },
52
- "notification-url": "https://packagist.org/downloads/",
53
- "license": [
54
- "LGPL-2.1"
55
- ],
56
- "authors": [
57
- {
58
- "name": "Fabien Ménager",
59
- "email": "fabien.menager@gmail.com"
60
- },
61
- {
62
- "name": "Brian Sweeney",
63
- "email": "eclecticgeek@gmail.com"
64
- },
65
- {
66
- "name": "Gabriel Bull",
67
- "email": "me@gabrielbull.com"
68
- }
69
- ],
70
- "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
71
- "homepage": "https://github.com/dompdf/dompdf",
72
- "support": {
73
- "issues": "https://github.com/dompdf/dompdf/issues",
74
- "source": "https://github.com/dompdf/dompdf/tree/v1.0.2"
75
- },
76
- "install-path": "../dompdf/dompdf"
77
- },
78
- {
79
- "name": "phenx/php-font-lib",
80
- "version": "0.5.2",
81
- "version_normalized": "0.5.2.0",
82
- "source": {
83
- "type": "git",
84
- "url": "https://github.com/PhenX/php-font-lib.git",
85
- "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8"
86
- },
87
- "dist": {
88
- "type": "zip",
89
- "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8",
90
- "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8",
91
- "shasum": ""
92
- },
93
- "require-dev": {
94
- "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7"
95
- },
96
- "time": "2020-03-08T15:31:32+00:00",
97
- "type": "library",
98
- "installation-source": "dist",
99
- "autoload": {
100
- "psr-4": {
101
- "FontLib\\": "src/FontLib"
102
- }
103
- },
104
- "notification-url": "https://packagist.org/downloads/",
105
- "license": [
106
- "LGPL-3.0"
107
- ],
108
- "authors": [
109
- {
110
- "name": "Fabien Ménager",
111
- "email": "fabien.menager@gmail.com"
112
- }
113
- ],
114
- "description": "A library to read, parse, export and make subsets of different types of font files.",
115
- "homepage": "https://github.com/PhenX/php-font-lib",
116
- "support": {
117
- "issues": "https://github.com/PhenX/php-font-lib/issues",
118
- "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2"
119
- },
120
- "install-path": "../phenx/php-font-lib"
121
- },
122
- {
123
- "name": "phenx/php-svg-lib",
124
- "version": "v0.3.3",
125
- "version_normalized": "0.3.3.0",
126
- "source": {
127
- "type": "git",
128
- "url": "https://github.com/PhenX/php-svg-lib.git",
129
- "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32"
130
- },
131
- "dist": {
132
- "type": "zip",
133
- "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
134
- "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
135
- "shasum": ""
136
- },
137
- "require": {
138
- "sabberworm/php-css-parser": "^8.3"
139
- },
140
- "require-dev": {
141
- "phpunit/phpunit": "^5.5|^6.5"
142
- },
143
- "time": "2019-09-11T20:02:13+00:00",
144
- "type": "library",
145
- "installation-source": "dist",
146
- "autoload": {
147
- "psr-4": {
148
- "Svg\\": "src/Svg"
149
- }
150
- },
151
- "notification-url": "https://packagist.org/downloads/",
152
- "license": [
153
- "LGPL-3.0"
154
- ],
155
- "authors": [
156
- {
157
- "name": "Fabien Ménager",
158
- "email": "fabien.menager@gmail.com"
159
- }
160
- ],
161
- "description": "A library to read, parse and export to PDF SVG files.",
162
- "homepage": "https://github.com/PhenX/php-svg-lib",
163
- "support": {
164
- "issues": "https://github.com/PhenX/php-svg-lib/issues",
165
- "source": "https://github.com/PhenX/php-svg-lib/tree/master"
166
- },
167
- "install-path": "../phenx/php-svg-lib"
168
- },
169
- {
170
- "name": "sabberworm/php-css-parser",
171
- "version": "8.3.1",
172
- "version_normalized": "8.3.1.0",
173
- "source": {
174
- "type": "git",
175
- "url": "https://github.com/sabberworm/PHP-CSS-Parser.git",
176
- "reference": "d217848e1396ef962fb1997cf3e2421acba7f796"
177
- },
178
- "dist": {
179
- "type": "zip",
180
- "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796",
181
- "reference": "d217848e1396ef962fb1997cf3e2421acba7f796",
182
- "shasum": ""
183
- },
184
- "require": {
185
- "php": ">=5.3.2"
186
- },
187
- "require-dev": {
188
- "codacy/coverage": "^1.4",
189
- "phpunit/phpunit": "~4.8"
190
- },
191
- "time": "2020-06-01T09:10:00+00:00",
192
- "type": "library",
193
- "installation-source": "dist",
194
- "autoload": {
195
- "psr-0": {
196
- "Sabberworm\\CSS": "lib/"
197
- }
198
- },
199
- "notification-url": "https://packagist.org/downloads/",
200
- "license": [
201
- "MIT"
202
- ],
203
- "authors": [
204
- {
205
- "name": "Raphael Schweikert"
206
- }
207
- ],
208
- "description": "Parser for CSS Files written in PHP",
209
- "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser",
210
- "keywords": [
211
- "css",
212
- "parser",
213
- "stylesheet"
214
- ],
215
- "support": {
216
- "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues",
217
- "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1"
218
- },
219
- "install-path": "../sabberworm/php-css-parser"
220
- },
221
- {
222
- "name": "symfony/polyfill-mbstring",
223
- "version": "v1.20.0",
224
- "version_normalized": "1.20.0.0",
225
- "source": {
226
- "type": "git",
227
- "url": "https://github.com/symfony/polyfill-mbstring.git",
228
- "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
229
- },
230
- "dist": {
231
- "type": "zip",
232
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
233
- "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
234
- "shasum": ""
235
- },
236
- "require": {
237
- "php": ">=7.1"
238
- },
239
- "suggest": {
240
- "ext-mbstring": "For best performance"
241
- },
242
- "time": "2020-10-23T14:02:19+00:00",
243
- "type": "library",
244
- "extra": {
245
- "branch-alias": {
246
- "dev-main": "1.20-dev"
247
- },
248
- "thanks": {
249
- "name": "symfony/polyfill",
250
- "url": "https://github.com/symfony/polyfill"
251
- }
252
- },
253
- "installation-source": "dist",
254
- "autoload": {
255
- "psr-4": {
256
- "Symfony\\Polyfill\\Mbstring\\": ""
257
- },
258
- "files": [
259
- "bootstrap.php"
260
- ]
261
- },
262
- "notification-url": "https://packagist.org/downloads/",
263
- "license": [
264
- "MIT"
265
- ],
266
- "authors": [
267
- {
268
- "name": "Nicolas Grekas",
269
- "email": "p@tchwork.com"
270
- },
271
- {
272
- "name": "Symfony Community",
273
- "homepage": "https://symfony.com/contributors"
274
- }
275
- ],
276
- "description": "Symfony polyfill for the Mbstring extension",
277
- "homepage": "https://symfony.com",
278
- "keywords": [
279
- "compatibility",
280
- "mbstring",
281
- "polyfill",
282
- "portable",
283
- "shim"
284
- ],
285
- "support": {
286
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0"
287
- },
288
- "funding": [
289
- {
290
- "url": "https://symfony.com/sponsor",
291
- "type": "custom"
292
- },
293
- {
294
- "url": "https://github.com/fabpot",
295
- "type": "github"
296
- },
297
- {
298
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
299
- "type": "tidelift"
300
- }
301
- ],
302
- "install-path": "../symfony/polyfill-mbstring"
303
- }
304
- ],
305
- "dev": true,
306
- "dev-package-names": []
307
- }
1
+ {
2
+ "packages": [
3
+ {
4
+ "name": "dompdf/dompdf",
5
+ "version": "v1.0.2",
6
+ "version_normalized": "1.0.2.0",
7
+ "source": {
8
+ "type": "git",
9
+ "url": "https://github.com/dompdf/dompdf.git",
10
+ "reference": "8768448244967a46d6e67b891d30878e0e15d25c"
11
+ },
12
+ "dist": {
13
+ "type": "zip",
14
+ "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8768448244967a46d6e67b891d30878e0e15d25c",
15
+ "reference": "8768448244967a46d6e67b891d30878e0e15d25c",
16
+ "shasum": ""
17
+ },
18
+ "require": {
19
+ "ext-dom": "*",
20
+ "ext-mbstring": "*",
21
+ "phenx/php-font-lib": "^0.5.2",
22
+ "phenx/php-svg-lib": "^0.3.3",
23
+ "php": "^7.1 || ^8.0"
24
+ },
25
+ "require-dev": {
26
+ "mockery/mockery": "^1.3",
27
+ "phpunit/phpunit": "^7.5 || ^8 || ^9",
28
+ "squizlabs/php_codesniffer": "^3.5"
29
+ },
30
+ "suggest": {
31
+ "ext-gd": "Needed to process images",
32
+ "ext-gmagick": "Improves image processing performance",
33
+ "ext-imagick": "Improves image processing performance",
34
+ "ext-zlib": "Needed for pdf stream compression"
35
+ },
36
+ "time": "2021-01-08T14:18:52+00:00",
37
+ "type": "library",
38
+ "extra": {
39
+ "branch-alias": {
40
+ "dev-develop": "0.7-dev"
41
+ }
42
+ },
43
+ "installation-source": "dist",
44
+ "autoload": {
45
+ "psr-4": {
46
+ "Dompdf\\": "src/"
47
+ },
48
+ "classmap": [
49
+ "lib/"
50
+ ]
51
+ },
52
+ "notification-url": "https://packagist.org/downloads/",
53
+ "license": [
54
+ "LGPL-2.1"
55
+ ],
56
+ "authors": [
57
+ {
58
+ "name": "Fabien Ménager",
59
+ "email": "fabien.menager@gmail.com"
60
+ },
61
+ {
62
+ "name": "Brian Sweeney",
63
+ "email": "eclecticgeek@gmail.com"
64
+ },
65
+ {
66
+ "name": "Gabriel Bull",
67
+ "email": "me@gabrielbull.com"
68
+ }
69
+ ],
70
+ "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
71
+ "homepage": "https://github.com/dompdf/dompdf",
72
+ "support": {
73
+ "issues": "https://github.com/dompdf/dompdf/issues",
74
+ "source": "https://github.com/dompdf/dompdf/tree/v1.0.2"
75
+ },
76
+ "install-path": "../dompdf/dompdf"
77
+ },
78
+ {
79
+ "name": "phenx/php-font-lib",
80
+ "version": "0.5.2",
81
+ "version_normalized": "0.5.2.0",
82
+ "source": {
83
+ "type": "git",
84
+ "url": "https://github.com/PhenX/php-font-lib.git",
85
+ "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8"
86
+ },
87
+ "dist": {
88
+ "type": "zip",
89
+ "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8",
90
+ "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8",
91
+ "shasum": ""
92
+ },
93
+ "require-dev": {
94
+ "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7"
95
+ },
96
+ "time": "2020-03-08T15:31:32+00:00",
97
+ "type": "library",
98
+ "installation-source": "dist",
99
+ "autoload": {
100
+ "psr-4": {
101
+ "FontLib\\": "src/FontLib"
102
+ }
103
+ },
104
+ "notification-url": "https://packagist.org/downloads/",
105
+ "license": [
106
+ "LGPL-3.0"
107
+ ],
108
+ "authors": [
109
+ {
110
+ "name": "Fabien Ménager",
111
+ "email": "fabien.menager@gmail.com"
112
+ }
113
+ ],
114
+ "description": "A library to read, parse, export and make subsets of different types of font files.",
115
+ "homepage": "https://github.com/PhenX/php-font-lib",
116
+ "support": {
117
+ "issues": "https://github.com/PhenX/php-font-lib/issues",
118
+ "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2"
119
+ },
120
+ "install-path": "../phenx/php-font-lib"
121
+ },
122
+ {
123
+ "name": "phenx/php-svg-lib",
124
+ "version": "v0.3.3",
125
+ "version_normalized": "0.3.3.0",
126
+ "source": {
127
+ "type": "git",
128
+ "url": "https://github.com/PhenX/php-svg-lib.git",
129
+ "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32"
130
+ },
131
+ "dist": {
132
+ "type": "zip",
133
+ "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
134
+ "reference": "5fa61b65e612ce1ae15f69b3d223cb14ecc60e32",
135
+ "shasum": ""
136
+ },
137
+ "require": {
138
+ "sabberworm/php-css-parser": "^8.3"
139
+ },
140
+ "require-dev": {
141
+ "phpunit/phpunit": "^5.5|^6.5"
142
+ },
143
+ "time": "2019-09-11T20:02:13+00:00",
144
+ "type": "library",
145
+ "installation-source": "dist",
146
+ "autoload": {
147
+ "psr-4": {
148
+ "Svg\\": "src/Svg"
149
+ }
150
+ },
151
+ "notification-url": "https://packagist.org/downloads/",
152
+ "license": [
153
+ "LGPL-3.0"
154
+ ],
155
+ "authors": [
156
+ {
157
+ "name": "Fabien Ménager",
158
+ "email": "fabien.menager@gmail.com"
159
+ }
160
+ ],
161
+ "description": "A library to read, parse and export to PDF SVG files.",
162
+ "homepage": "https://github.com/PhenX/php-svg-lib",
163
+ "support": {
164
+ "issues": "https://github.com/PhenX/php-svg-lib/issues",
165
+ "source": "https://github.com/PhenX/php-svg-lib/tree/master"
166
+ },
167
+ "install-path": "../phenx/php-svg-lib"
168
+ },
169
+ {
170
+ "name": "sabberworm/php-css-parser",
171
+ "version": "8.3.1",
172
+ "version_normalized": "8.3.1.0",
173
+ "source": {
174
+ "type": "git",
175
+ "url": "https://github.com/sabberworm/PHP-CSS-Parser.git",
176
+ "reference": "d217848e1396ef962fb1997cf3e2421acba7f796"
177
+ },
178
+ "dist": {
179
+ "type": "zip",
180
+ "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796",
181
+ "reference": "d217848e1396ef962fb1997cf3e2421acba7f796",
182
+ "shasum": ""
183
+ },
184
+ "require": {
185
+ "php": ">=5.3.2"
186
+ },
187
+ "require-dev": {
188
+ "codacy/coverage": "^1.4",
189
+ "phpunit/phpunit": "~4.8"
190
+ },
191
+ "time": "2020-06-01T09:10:00+00:00",
192
+ "type": "library",
193
+ "installation-source": "dist",
194
+ "autoload": {
195
+ "psr-0": {
196
+ "Sabberworm\\CSS": "lib/"
197
+ }
198
+ },
199
+ "notification-url": "https://packagist.org/downloads/",
200
+ "license": [
201
+ "MIT"
202
+ ],
203
+ "authors": [
204
+ {
205
+ "name": "Raphael Schweikert"
206
+ }
207
+ ],
208
+ "description": "Parser for CSS Files written in PHP",
209
+ "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser",
210
+ "keywords": [
211
+ "css",
212
+ "parser",
213
+ "stylesheet"
214
+ ],
215
+ "support": {
216
+ "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues",
217
+ "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1"
218
+ },
219
+ "install-path": "../sabberworm/php-css-parser"
220
+ },
221
+ {
222
+ "name": "symfony/polyfill-mbstring",
223
+ "version": "v1.20.0",
224
+ "version_normalized": "1.20.0.0",
225
+ "source": {
226
+ "type": "git",
227
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
228
+ "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
229
+ },
230
+ "dist": {
231
+ "type": "zip",
232
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
233
+ "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
234
+ "shasum": ""
235
+ },
236
+ "require": {
237
+ "php": ">=7.1"
238
+ },
239
+ "suggest": {
240
+ "ext-mbstring": "For best performance"
241
+ },
242
+ "time": "2020-10-23T14:02:19+00:00",
243
+ "type": "library",
244
+ "extra": {
245
+ "branch-alias": {
246
+ "dev-main": "1.20-dev"
247
+ },
248
+ "thanks": {
249
+ "name": "symfony/polyfill",
250
+ "url": "https://github.com/symfony/polyfill"
251
+ }
252
+ },
253
+ "installation-source": "dist",
254
+ "autoload": {
255
+ "psr-4": {
256
+ "Symfony\\Polyfill\\Mbstring\\": ""
257
+ },
258
+ "files": [
259
+ "bootstrap.php"
260
+ ]
261
+ },
262
+ "notification-url": "https://packagist.org/downloads/",
263
+ "license": [
264
+ "MIT"
265
+ ],
266
+ "authors": [
267
+ {
268
+ "name": "Nicolas Grekas",
269
+ "email": "p@tchwork.com"
270
+ },
271
+ {
272
+ "name": "Symfony Community",
273
+ "homepage": "https://symfony.com/contributors"
274
+ }
275
+ ],
276
+ "description": "Symfony polyfill for the Mbstring extension",
277
+ "homepage": "https://symfony.com",
278
+ "keywords": [
279
+ "compatibility",
280
+ "mbstring",
281
+ "polyfill",
282
+ "portable",
283
+ "shim"
284
+ ],
285
+ "support": {
286
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0"
287
+ },
288
+ "funding": [
289
+ {
290
+ "url": "https://symfony.com/sponsor",
291
+ "type": "custom"
292
+ },
293
+ {
294
+ "url": "https://github.com/fabpot",
295
+ "type": "github"
296
+ },
297
+ {
298
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
299
+ "type": "tidelift"
300
+ }
301
+ ],
302
+ "install-path": "../symfony/polyfill-mbstring"
303
+ }
304
+ ],
305
+ "dev": true,
306
+ "dev-package-names": []
307
+ }
vendor/composer/installed.php CHANGED
@@ -1,69 +1,69 @@
1
- <?php return array (
2
- 'root' =>
3
- array (
4
- 'pretty_version' => 'dev-master',
5
- 'version' => 'dev-master',
6
- 'aliases' =>
7
- array (
8
- ),
9
- 'reference' => '0ff9b86fd28a59488d9b215bd51e57198655c7b9',
10
- 'name' => '__root__',
11
- ),
12
- 'versions' =>
13
- array (
14
- '__root__' =>
15
- array (
16
- 'pretty_version' => 'dev-master',
17
- 'version' => 'dev-master',
18
- 'aliases' =>
19
- array (
20
- ),
21
- 'reference' => '0ff9b86fd28a59488d9b215bd51e57198655c7b9',
22
- ),
23
- 'dompdf/dompdf' =>
24
- array (
25
- 'pretty_version' => 'v1.0.2',
26
- 'version' => '1.0.2.0',
27
- 'aliases' =>
28
- array (
29
- ),
30
- 'reference' => '8768448244967a46d6e67b891d30878e0e15d25c',
31
- ),
32
- 'phenx/php-font-lib' =>
33
- array (
34
- 'pretty_version' => '0.5.2',
35
- 'version' => '0.5.2.0',
36
- 'aliases' =>
37
- array (
38
- ),
39
- 'reference' => 'ca6ad461f032145fff5971b5985e5af9e7fa88d8',
40
- ),
41
- 'phenx/php-svg-lib' =>
42
- array (
43
- 'pretty_version' => 'v0.3.3',
44
- 'version' => '0.3.3.0',
45
- 'aliases' =>
46
- array (
47
- ),
48
- 'reference' => '5fa61b65e612ce1ae15f69b3d223cb14ecc60e32',
49
- ),
50
- 'sabberworm/php-css-parser' =>
51
- array (
52
- 'pretty_version' => '8.3.1',
53
- 'version' => '8.3.1.0',
54
- 'aliases' =>
55
- array (
56
- ),
57
- 'reference' => 'd217848e1396ef962fb1997cf3e2421acba7f796',
58
- ),
59
- 'symfony/polyfill-mbstring' =>
60
- array (
61
- 'pretty_version' => 'v1.20.0',
62
- 'version' => '1.20.0.0',
63
- 'aliases' =>
64
- array (
65
- ),
66
- 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531',
67
- ),
68
- ),
69
- );
1
+ <?php return array (
2
+ 'root' =>
3
+ array (
4
+ 'pretty_version' => 'dev-master',
5
+ 'version' => 'dev-master',
6
+ 'aliases' =>
7
+ array (
8
+ ),
9
+ 'reference' => '0ff9b86fd28a59488d9b215bd51e57198655c7b9',
10
+ 'name' => '__root__',
11
+ ),
12
+ 'versions' =>
13
+ array (
14
+ '__root__' =>
15
+ array (
16
+ 'pretty_version' => 'dev-master',
17
+ 'version' => 'dev-master',
18
+ 'aliases' =>
19
+ array (
20
+ ),
21
+ 'reference' => '0ff9b86fd28a59488d9b215bd51e57198655c7b9',
22
+ ),
23
+ 'dompdf/dompdf' =>
24
+ array (
25
+ 'pretty_version' => 'v1.0.2',
26
+ 'version' => '1.0.2.0',
27
+ 'aliases' =>
28
+ array (
29
+ ),
30
+ 'reference' => '8768448244967a46d6e67b891d30878e0e15d25c',
31
+ ),
32
+ 'phenx/php-font-lib' =>
33
+ array (
34
+ 'pretty_version' => '0.5.2',
35
+ 'version' => '0.5.2.0',
36
+ 'aliases' =>
37
+ array (
38
+ ),
39
+ 'reference' => 'ca6ad461f032145fff5971b5985e5af9e7fa88d8',
40
+ ),
41
+ 'phenx/php-svg-lib' =>
42
+ array (
43
+ 'pretty_version' => 'v0.3.3',
44
+ 'version' => '0.3.3.0',
45
+ 'aliases' =>
46
+ array (
47
+ ),
48
+ 'reference' => '5fa61b65e612ce1ae15f69b3d223cb14ecc60e32',
49
+ ),
50
+ 'sabberworm/php-css-parser' =>
51
+ array (
52
+ 'pretty_version' => '8.3.1',
53
+ 'version' => '8.3.1.0',
54
+ 'aliases' =>
55
+ array (
56
+ ),
57
+ 'reference' => 'd217848e1396ef962fb1997cf3e2421acba7f796',
58
+ ),
59
+ 'symfony/polyfill-mbstring' =>
60
+ array (
61
+ 'pretty_version' => 'v1.20.0',
62
+ 'version' => '1.20.0.0',
63
+ 'aliases' =>
64
+ array (
65
+ ),
66
+ 'reference' => '39d483bdf39be819deabf04ec872eb0b2410b531',
67
+ ),
68
+ ),
69
+ );
vendor/symfony/polyfill-mbstring/LICENSE CHANGED
@@ -1,19 +1,19 @@
1
- Copyright (c) 2015-2019 Fabien Potencier
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy
4
- of this software and associated documentation files (the "Software"), to deal
5
- in the Software without restriction, including without limitation the rights
6
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
- copies of the Software, and to permit persons to whom the Software is furnished
8
- to do so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in all
11
- copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
- THE SOFTWARE.
1
+ Copyright (c) 2015-2019 Fabien Potencier
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is furnished
8
+ to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
vendor/symfony/polyfill-mbstring/Mbstring.php CHANGED
@@ -1,846 +1,846 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- namespace Symfony\Polyfill\Mbstring;
13
-
14
- /**
15
- * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
16
- *
17
- * Implemented:
18
- * - mb_chr - Returns a specific character from its Unicode code point
19
- * - mb_convert_encoding - Convert character encoding
20
- * - mb_convert_variables - Convert character code in variable(s)
21
- * - mb_decode_mimeheader - Decode string in MIME header field
22
- * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
23
- * - mb_decode_numericentity - Decode HTML numeric string reference to character
24
- * - mb_encode_numericentity - Encode character to HTML numeric string reference
25
- * - mb_convert_case - Perform case folding on a string
26
- * - mb_detect_encoding - Detect character encoding
27
- * - mb_get_info - Get internal settings of mbstring
28
- * - mb_http_input - Detect HTTP input character encoding
29
- * - mb_http_output - Set/Get HTTP output character encoding
30
- * - mb_internal_encoding - Set/Get internal character encoding
31
- * - mb_list_encodings - Returns an array of all supported encodings
32
- * - mb_ord - Returns the Unicode code point of a character
33
- * - mb_output_handler - Callback function converts character encoding in output buffer
34
- * - mb_scrub - Replaces ill-formed byte sequences with substitute characters
35
- * - mb_strlen - Get string length
36
- * - mb_strpos - Find position of first occurrence of string in a string
37
- * - mb_strrpos - Find position of last occurrence of a string in a string
38
- * - mb_str_split - Convert a string to an array
39
- * - mb_strtolower - Make a string lowercase
40
- * - mb_strtoupper - Make a string uppercase
41
- * - mb_substitute_character - Set/Get substitution character
42
- * - mb_substr - Get part of string
43
- * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
44
- * - mb_stristr - Finds first occurrence of a string within another, case insensitive
45
- * - mb_strrchr - Finds the last occurrence of a character in a string within another
46
- * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
47
- * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
48
- * - mb_strstr - Finds first occurrence of a string within another
49
- * - mb_strwidth - Return width of string
50
- * - mb_substr_count - Count the number of substring occurrences
51
- *
52
- * Not implemented:
53
- * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
54
- * - mb_ereg_* - Regular expression with multibyte support
55
- * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
56
- * - mb_preferred_mime_name - Get MIME charset string
57
- * - mb_regex_encoding - Returns current encoding for multibyte regex as string
58
- * - mb_regex_set_options - Set/Get the default options for mbregex functions
59
- * - mb_send_mail - Send encoded mail
60
- * - mb_split - Split multibyte string using regular expression
61
- * - mb_strcut - Get part of string
62
- * - mb_strimwidth - Get truncated string with specified width
63
- *
64
- * @author Nicolas Grekas <p@tchwork.com>
65
- *
66
- * @internal
67
- */
68
- final class Mbstring
69
- {
70
- const MB_CASE_FOLD = PHP_INT_MAX;
71
-
72
- private static $encodingList = array('ASCII', 'UTF-8');
73
- private static $language = 'neutral';
74
- private static $internalEncoding = 'UTF-8';
75
- private static $caseFold = array(
76
- array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"),
77
- array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'),
78
- );
79
-
80
- public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
81
- {
82
- if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
83
- $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
84
- } else {
85
- $fromEncoding = self::getEncoding($fromEncoding);
86
- }
87
-
88
- $toEncoding = self::getEncoding($toEncoding);
89
-
90
- if ('BASE64' === $fromEncoding) {
91
- $s = base64_decode($s);
92
- $fromEncoding = $toEncoding;
93
- }
94
-
95
- if ('BASE64' === $toEncoding) {
96
- return base64_encode($s);
97
- }
98
-
99
- if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
100
- if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
101
- $fromEncoding = 'Windows-1252';
102
- }
103
- if ('UTF-8' !== $fromEncoding) {
104
- $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
105
- }
106
-
107
- return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
108
- }
109
-
110
- if ('HTML-ENTITIES' === $fromEncoding) {
111
- $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
112
- $fromEncoding = 'UTF-8';
113
- }
114
-
115
- return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
116
- }
117
-
118
- public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)
119
- {
120
- $ok = true;
121
- array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
122
- if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
123
- $ok = false;
124
- }
125
- });
126
-
127
- return $ok ? $fromEncoding : false;
128
- }
129
-
130
- public static function mb_decode_mimeheader($s)
131
- {
132
- return iconv_mime_decode($s, 2, self::$internalEncoding);
133
- }
134
-
135
- public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
136
- {
137
- trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
138
- }
139
-
140
- public static function mb_decode_numericentity($s, $convmap, $encoding = null)
141
- {
142
- if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
143
- trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
144
-
145
- return null;
146
- }
147
-
148
- if (!\is_array($convmap) || !$convmap) {
149
- return false;
150
- }
151
-
152
- if (null !== $encoding && !\is_scalar($encoding)) {
153
- trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
154
-
155
- return ''; // Instead of null (cf. mb_encode_numericentity).
156
- }
157
-
158
- $s = (string) $s;
159
- if ('' === $s) {
160
- return '';
161
- }
162
-
163
- $encoding = self::getEncoding($encoding);
164
-
165
- if ('UTF-8' === $encoding) {
166
- $encoding = null;
167
- if (!preg_match('//u', $s)) {
168
- $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
169
- }
170
- } else {
171
- $s = iconv($encoding, 'UTF-8//IGNORE', $s);
172
- }
173
-
174
- $cnt = floor(\count($convmap) / 4) * 4;
175
-
176
- for ($i = 0; $i < $cnt; $i += 4) {
177
- // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
178
- $convmap[$i] += $convmap[$i + 2];
179
- $convmap[$i + 1] += $convmap[$i + 2];
180
- }
181
-
182
- $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
183
- $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
184
- for ($i = 0; $i < $cnt; $i += 4) {
185
- if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
186
- return Mbstring::mb_chr($c - $convmap[$i + 2]);
187
- }
188
- }
189
-
190
- return $m[0];
191
- }, $s);
192
-
193
- if (null === $encoding) {
194
- return $s;
195
- }
196
-
197
- return iconv('UTF-8', $encoding.'//IGNORE', $s);
198
- }
199
-
200
- public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
201
- {
202
- if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
203
- trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
204
-
205
- return null;
206
- }
207
-
208
- if (!\is_array($convmap) || !$convmap) {
209
- return false;
210
- }
211
-
212
- if (null !== $encoding && !\is_scalar($encoding)) {
213
- trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
214
-
215
- return null; // Instead of '' (cf. mb_decode_numericentity).
216
- }
217
-
218
- if (null !== $is_hex && !\is_scalar($is_hex)) {
219
- trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING);
220
-
221
- return null;
222
- }
223
-
224
- $s = (string) $s;
225
- if ('' === $s) {
226
- return '';
227
- }
228
-
229
- $encoding = self::getEncoding($encoding);
230
-
231
- if ('UTF-8' === $encoding) {
232
- $encoding = null;
233
- if (!preg_match('//u', $s)) {
234
- $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
235
- }
236
- } else {
237
- $s = iconv($encoding, 'UTF-8//IGNORE', $s);
238
- }
239
-
240
- static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
241
-
242
- $cnt = floor(\count($convmap) / 4) * 4;
243
- $i = 0;
244
- $len = \strlen($s);
245
- $result = '';
246
-
247
- while ($i < $len) {
248
- $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
249
- $uchr = substr($s, $i, $ulen);
250
- $i += $ulen;
251
- $c = self::mb_ord($uchr);
252
-
253
- for ($j = 0; $j < $cnt; $j += 4) {
254
- if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
255
- $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
256
- $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';
257
- continue 2;
258
- }
259
- }
260
- $result .= $uchr;
261
- }
262
-
263
- if (null === $encoding) {
264
- return $result;
265
- }
266
-
267
- return iconv('UTF-8', $encoding.'//IGNORE', $result);
268
- }
269
-
270
- public static function mb_convert_case($s, $mode, $encoding = null)
271
- {
272
- $s = (string) $s;
273
- if ('' === $s) {
274
- return '';
275
- }
276
-
277
- $encoding = self::getEncoding($encoding);
278
-
279
- if ('UTF-8' === $encoding) {
280
- $encoding = null;
281
- if (!preg_match('//u', $s)) {
282
- $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
283
- }
284
- } else {
285
- $s = iconv($encoding, 'UTF-8//IGNORE', $s);
286
- }
287
-
288
- if (MB_CASE_TITLE == $mode) {
289
- static $titleRegexp = null;
290
- if (null === $titleRegexp) {
291
- $titleRegexp = self::getData('titleCaseRegexp');
292
- }
293
- $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
294
- } else {
295
- if (MB_CASE_UPPER == $mode) {
296
- static $upper = null;
297
- if (null === $upper) {
298
- $upper = self::getData('upperCase');
299
- }
300
- $map = $upper;
301
- } else {
302
- if (self::MB_CASE_FOLD === $mode) {
303
- $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
304
- }
305
-
306
- static $lower = null;
307
- if (null === $lower) {
308
- $lower = self::getData('lowerCase');
309
- }
310
- $map = $lower;
311
- }
312
-
313
- static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
314
-
315
- $i = 0;
316
- $len = \strlen($s);
317
-
318
- while ($i < $len) {
319
- $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
320
- $uchr = substr($s, $i, $ulen);
321
- $i += $ulen;
322
-
323
- if (isset($map[$uchr])) {
324
- $uchr = $map[$uchr];
325
- $nlen = \strlen($uchr);
326
-
327
- if ($nlen == $ulen) {
328
- $nlen = $i;
329
- do {
330
- $s[--$nlen] = $uchr[--$ulen];
331
- } while ($ulen);
332
- } else {
333
- $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
334
- $len += $nlen - $ulen;
335
- $i += $nlen - $ulen;
336
- }
337
- }
338
- }
339
- }
340
-
341
- if (null === $encoding) {
342
- return $s;
343
- }
344
-
345
- return iconv('UTF-8', $encoding.'//IGNORE', $s);
346
- }
347
-
348
- public static function mb_internal_encoding($encoding = null)
349
- {
350
- if (null === $encoding) {
351
- return self::$internalEncoding;
352
- }
353
-
354
- $encoding = self::getEncoding($encoding);
355
-
356
- if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
357
- self::$internalEncoding = $encoding;
358
-
359
- return true;
360
- }
361
-
362
- return false;
363
- }
364
-
365
- public static function mb_language($lang = null)
366
- {
367
- if (null === $lang) {
368
- return self::$language;
369
- }
370
-
371
- switch ($lang = strtolower($lang)) {
372
- case 'uni':
373
- case 'neutral':
374
- self::$language = $lang;
375
-
376
- return true;
377
- }
378
-
379
- return false;
380
- }
381
-
382
- public static function mb_list_encodings()
383
- {
384
- return array('UTF-8');
385
- }
386
-
387
- public static function mb_encoding_aliases($encoding)
388
- {
389
- switch (strtoupper($encoding)) {
390
- case 'UTF8':
391
- case 'UTF-8':
392
- return array('utf8');
393
- }
394
-
395
- return false;
396
- }
397
-
398
- public static function mb_check_encoding($var = null, $encoding = null)
399
- {
400
- if (null === $encoding) {
401
- if (null === $var) {
402
- return false;
403
- }
404
- $encoding = self::$internalEncoding;
405
- }
406
-
407
- return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
408
- }
409
-
410
- public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
411
- {
412
- if (null === $encodingList) {
413
- $encodingList = self::$encodingList;
414
- } else {
415
- if (!\is_array($encodingList)) {
416
- $encodingList = array_map('trim', explode(',', $encodingList));
417
- }
418
- $encodingList = array_map('strtoupper', $encodingList);
419
- }
420
-
421
- foreach ($encodingList as $enc) {
422
- switch ($enc) {
423
- case 'ASCII':
424
- if (!preg_match('/[\x80-\xFF]/', $str)) {
425
- return $enc;
426
- }
427
- break;
428
-
429
- case 'UTF8':
430
- case 'UTF-8':
431
- if (preg_match('//u', $str)) {
432
- return 'UTF-8';
433
- }
434
- break;
435
-
436
- default:
437
- if (0 === strncmp($enc, 'ISO-8859-', 9)) {
438
- return $enc;
439
- }
440
- }
441
- }
442
-
443
- return false;
444
- }
445
-
446
- public static function mb_detect_order($encodingList = null)
447
- {
448
- if (null === $encodingList) {
449
- return self::$encodingList;
450
- }
451
-
452
- if (!\is_array($encodingList)) {
453
- $encodingList = array_map('trim', explode(',', $encodingList));
454
- }
455
- $encodingList = array_map('strtoupper', $encodingList);
456
-
457
- foreach ($encodingList as $enc) {
458
- switch ($enc) {
459
- default:
460
- if (strncmp($enc, 'ISO-8859-', 9)) {
461
- return false;
462
- }
463
- // no break
464
- case 'ASCII':
465
- case 'UTF8':
466
- case 'UTF-8':
467
- }
468
- }
469
-
470
- self::$encodingList = $encodingList;
471
-
472
- return true;
473
- }
474
-
475
- public static function mb_strlen($s, $encoding = null)
476
- {
477
- $encoding = self::getEncoding($encoding);
478
- if ('CP850' === $encoding || 'ASCII' === $encoding) {
479
- return \strlen($s);
480
- }
481
-
482
- return @iconv_strlen($s, $encoding);
483
- }
484
-
485
- public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
486
- {
487
- $encoding = self::getEncoding($encoding);
488
- if ('CP850' === $encoding || 'ASCII' === $encoding) {
489
- return strpos($haystack, $needle, $offset);
490
- }
491
-
492
- $needle = (string) $needle;
493
- if ('' === $needle) {
494
- trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
495
-
496
- return false;
497
- }
498
-
499
- return iconv_strpos($haystack, $needle, $offset, $encoding);
500
- }
501
-
502
- public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
503
- {
504
- $encoding = self::getEncoding($encoding);
505
- if ('CP850' === $encoding || 'ASCII' === $encoding) {
506
- return strrpos($haystack, $needle, $offset);
507
- }
508
-
509
- if ($offset != (int) $offset) {
510
- $offset = 0;
511
- } elseif ($offset = (int) $offset) {
512
- if ($offset < 0) {
513
- if (0 > $offset += self::mb_strlen($needle)) {
514
- $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
515
- }
516
- $offset = 0;
517
- } else {
518
- $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
519
- }
520
- }
521
-
522
- $pos = iconv_strrpos($haystack, $needle, $encoding);
523
-
524
- return false !== $pos ? $offset + $pos : false;
525
- }
526
-
527
- public static function mb_str_split($string, $split_length = 1, $encoding = null)
528
- {
529
- if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) {
530
- trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING);
531
-
532
- return null;
533
- }
534
-
535
- if (1 > $split_length = (int) $split_length) {
536
- trigger_error('The length of each segment must be greater than zero', E_USER_WARNING);
537
-
538
- return false;
539
- }
540
-
541
- if (null === $encoding) {
542
- $encoding = mb_internal_encoding();
543
- }
544
-
545
- if ('UTF-8' === $encoding = self::getEncoding($encoding)) {
546
- $rx = '/(';
547
- while (65535 < $split_length) {
548
- $rx .= '.{65535}';
549
- $split_length -= 65535;
550
- }
551
- $rx .= '.{'.$split_length.'})/us';
552
-
553
- return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
554
- }
555
-
556
- $result = array();
557
- $length = mb_strlen($string, $encoding);
558
-
559
- for ($i = 0; $i < $length; $i += $split_length) {
560
- $result[] = mb_substr($string, $i, $split_length, $encoding);
561
- }
562
-
563
- return $result;
564
- }
565
-
566
- public static function mb_strtolower($s, $encoding = null)
567
- {
568
- return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
569
- }
570
-
571
- public static function mb_strtoupper($s, $encoding = null)
572
- {
573
- return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
574
- }
575
-
576
- public static function mb_substitute_character($c = null)
577
- {
578
- if (0 === strcasecmp($c, 'none')) {
579
- return true;
580
- }
581
-
582
- return null !== $c ? false : 'none';
583
- }
584
-
585
- public static function mb_substr($s, $start, $length = null, $encoding = null)
586
- {
587
- $encoding = self::getEncoding($encoding);
588
- if ('CP850' === $encoding || 'ASCII' === $encoding) {
589
- return (string) substr($s, $start, null === $length ? 2147483647 : $length);
590
- }
591
-
592
- if ($start < 0) {
593
- $start = iconv_strlen($s, $encoding) + $start;
594
- if ($start < 0) {
595
- $start = 0;
596
- }
597
- }
598
-
599
- if (null === $length) {
600
- $length = 2147483647;
601
- } elseif ($length < 0) {
602
- $length = iconv_strlen($s, $encoding) + $length - $start;
603
- if ($length < 0) {
604
- return '';
605
- }
606
- }
607
-
608
- return (string) iconv_substr($s, $start, $length, $encoding);
609
- }
610
-
611
- public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
612
- {
613
- $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
614
- $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
615
-
616
- return self::mb_strpos($haystack, $needle, $offset, $encoding);
617
- }
618
-
619
- public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
620
- {
621
- $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
622
-
623
- return self::getSubpart($pos, $part, $haystack, $encoding);
624
- }
625
-
626
- public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
627
- {
628
- $encoding = self::getEncoding($encoding);
629
- if ('CP850' === $encoding || 'ASCII' === $encoding) {
630
- $pos = strrpos($haystack, $needle);
631
- } else {
632
- $needle = self::mb_substr($needle, 0, 1, $encoding);
633
- $pos = iconv_strrpos($haystack, $needle, $encoding);
634
- }
635
-
636
- return self::getSubpart($pos, $part, $haystack, $encoding);
637
- }
638
-
639
- public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
640
- {
641
- $needle = self::mb_substr($needle, 0, 1, $encoding);
642
- $pos = self::mb_strripos($haystack, $needle, $encoding);
643
-
644
- return self::getSubpart($pos, $part, $haystack, $encoding);
645
- }
646
-
647
- public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
648
- {
649
- $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
650
- $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
651
-
652
- return self::mb_strrpos($haystack, $needle, $offset, $encoding);
653
- }
654
-
655
- public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
656
- {
657
- $pos = strpos($haystack, $needle);
658
- if (false === $pos) {
659
- return false;
660
- }
661
- if ($part) {
662
- return substr($haystack, 0, $pos);
663
- }
664
-
665
- return substr($haystack, $pos);
666
- }
667
-
668
- public static function mb_get_info($type = 'all')
669
- {
670
- $info = array(
671
- 'internal_encoding' => self::$internalEncoding,
672
- 'http_output' => 'pass',
673
- 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
674
- 'func_overload' => 0,
675
- 'func_overload_list' => 'no overload',
676
- 'mail_charset' => 'UTF-8',
677
- 'mail_header_encoding' => 'BASE64',
678
- 'mail_body_encoding' => 'BASE64',
679
- 'illegal_chars' => 0,
680
- 'encoding_translation' => 'Off',
681
- 'language' => self::$language,
682
- 'detect_order' => self::$encodingList,
683
- 'substitute_character' => 'none',
684
- 'strict_detection' => 'Off',
685
- );
686
-
687
- if ('all' === $type) {
688
- return $info;
689
- }
690
- if (isset($info[$type])) {
691
- return $info[$type];
692
- }
693
-
694
- return false;
695
- }
696
-
697
- public static function mb_http_input($type = '')
698
- {
699
- return false;
700
- }
701
-
702
- public static function mb_http_output($encoding = null)
703
- {
704
- return null !== $encoding ? 'pass' === $encoding : 'pass';
705
- }
706
-
707
- public static function mb_strwidth($s, $encoding = null)
708
- {
709
- $encoding = self::getEncoding($encoding);
710
-
711
- if ('UTF-8' !== $encoding) {
712
- $s = iconv($encoding, 'UTF-8//IGNORE', $s);
713
- }
714
-
715
- $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
716
-
717
- return ($wide << 1) + iconv_strlen($s, 'UTF-8');
718
- }
719
-
720
- public static function mb_substr_count($haystack, $needle, $encoding = null)
721
- {
722
- return substr_count($haystack, $needle);
723
- }
724
-
725
- public static function mb_output_handler($contents, $status)
726
- {
727
- return $contents;
728
- }
729
-
730
- public static function mb_chr($code, $encoding = null)
731
- {
732
- if (0x80 > $code %= 0x200000) {
733
- $s = \chr($code);
734
- } elseif (0x800 > $code) {
735
- $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
736
- } elseif (0x10000 > $code) {
737
- $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
738
- } else {
739
- $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
740
- }
741
-
742
- if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
743
- $s = mb_convert_encoding($s, $encoding, 'UTF-8');
744
- }
745
-
746
- return $s;
747
- }
748
-
749
- public static function mb_ord($s, $encoding = null)
750
- {
751
- if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
752
- $s = mb_convert_encoding($s, 'UTF-8', $encoding);
753
- }
754
-
755
- if (1 === \strlen($s)) {
756
- return \ord($s);
757
- }
758
-
759
- $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
760
- if (0xF0 <= $code) {
761
- return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
762
- }
763
- if (0xE0 <= $code) {
764
- return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
765
- }
766
- if (0xC0 <= $code) {
767
- return (($code - 0xC0) << 6) + $s[2] - 0x80;
768
- }
769
-
770
- return $code;
771
- }
772
-
773
- private static function getSubpart($pos, $part, $haystack, $encoding)
774
- {
775
- if (false === $pos) {
776
- return false;
777
- }
778
- if ($part) {
779
- return self::mb_substr($haystack, 0, $pos, $encoding);
780
- }
781
-
782
- return self::mb_substr($haystack, $pos, null, $encoding);
783
- }
784
-
785
- private static function html_encoding_callback(array $m)
786
- {
787
- $i = 1;
788
- $entities = '';
789
- $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
790
-
791
- while (isset($m[$i])) {
792
- if (0x80 > $m[$i]) {
793
- $entities .= \chr($m[$i++]);
794
- continue;
795
- }
796
- if (0xF0 <= $m[$i]) {
797
- $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
798
- } elseif (0xE0 <= $m[$i]) {
799
- $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
800
- } else {
801
- $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
802
- }
803
-
804
- $entities .= '&#'.$c.';';
805
- }
806
-
807
- return $entities;
808
- }
809
-
810
- private static function title_case(array $s)
811
- {
812
- return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');
813
- }
814
-
815
- private static function getData($file)
816
- {
817
- if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
818
- return require $file;
819
- }
820
-
821
- return false;
822
- }
823
-
824
- private static function getEncoding($encoding)
825
- {
826
- if (null === $encoding) {
827
- return self::$internalEncoding;
828
- }
829
-
830
- if ('UTF-8' === $encoding) {
831
- return 'UTF-8';
832
- }
833
-
834
- $encoding = strtoupper($encoding);
835
-
836
- if ('8BIT' === $encoding || 'BINARY' === $encoding) {
837
- return 'CP850';
838
- }
839
-
840
- if ('UTF8' === $encoding) {
841
- return 'UTF-8';
842
- }
843
-
844
- return $encoding;
845
- }
846
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Polyfill\Mbstring;
13
+
14
+ /**
15
+ * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
16
+ *
17
+ * Implemented:
18
+ * - mb_chr - Returns a specific character from its Unicode code point
19
+ * - mb_convert_encoding - Convert character encoding
20
+ * - mb_convert_variables - Convert character code in variable(s)
21
+ * - mb_decode_mimeheader - Decode string in MIME header field
22
+ * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
23
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
24
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
25
+ * - mb_convert_case - Perform case folding on a string
26
+ * - mb_detect_encoding - Detect character encoding
27
+ * - mb_get_info - Get internal settings of mbstring
28
+ * - mb_http_input - Detect HTTP input character encoding
29
+ * - mb_http_output - Set/Get HTTP output character encoding
30
+ * - mb_internal_encoding - Set/Get internal character encoding
31
+ * - mb_list_encodings - Returns an array of all supported encodings
32
+ * - mb_ord - Returns the Unicode code point of a character
33
+ * - mb_output_handler - Callback function converts character encoding in output buffer
34
+ * - mb_scrub - Replaces ill-formed byte sequences with substitute characters
35
+ * - mb_strlen - Get string length
36
+ * - mb_strpos - Find position of first occurrence of string in a string
37
+ * - mb_strrpos - Find position of last occurrence of a string in a string
38
+ * - mb_str_split - Convert a string to an array
39
+ * - mb_strtolower - Make a string lowercase
40
+ * - mb_strtoupper - Make a string uppercase
41
+ * - mb_substitute_character - Set/Get substitution character
42
+ * - mb_substr - Get part of string
43
+ * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
44
+ * - mb_stristr - Finds first occurrence of a string within another, case insensitive
45
+ * - mb_strrchr - Finds the last occurrence of a character in a string within another
46
+ * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
47
+ * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
48
+ * - mb_strstr - Finds first occurrence of a string within another
49
+ * - mb_strwidth - Return width of string
50
+ * - mb_substr_count - Count the number of substring occurrences
51
+ *
52
+ * Not implemented:
53
+ * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
54
+ * - mb_ereg_* - Regular expression with multibyte support
55
+ * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
56
+ * - mb_preferred_mime_name - Get MIME charset string
57
+ * - mb_regex_encoding - Returns current encoding for multibyte regex as string
58
+ * - mb_regex_set_options - Set/Get the default options for mbregex functions
59
+ * - mb_send_mail - Send encoded mail
60
+ * - mb_split - Split multibyte string using regular expression
61
+ * - mb_strcut - Get part of string
62
+ * - mb_strimwidth - Get truncated string with specified width
63
+ *
64
+ * @author Nicolas Grekas <p@tchwork.com>
65
+ *
66
+ * @internal
67
+ */
68
+ final class Mbstring
69
+ {
70
+ const MB_CASE_FOLD = PHP_INT_MAX;
71
+
72
+ private static $encodingList = array('ASCII', 'UTF-8');
73
+ private static $language = 'neutral';
74
+ private static $internalEncoding = 'UTF-8';
75
+ private static $caseFold = array(
76
+ array('µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"),
77
+ array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'),
78
+ );
79
+
80
+ public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
81
+ {
82
+ if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
83
+ $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
84
+ } else {
85
+ $fromEncoding = self::getEncoding($fromEncoding);
86
+ }
87
+
88
+ $toEncoding = self::getEncoding($toEncoding);
89
+
90
+ if ('BASE64' === $fromEncoding) {
91
+ $s = base64_decode($s);
92
+ $fromEncoding = $toEncoding;
93
+ }
94
+
95
+ if ('BASE64' === $toEncoding) {
96
+ return base64_encode($s);
97
+ }
98
+
99
+ if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
100
+ if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
101
+ $fromEncoding = 'Windows-1252';
102
+ }
103
+ if ('UTF-8' !== $fromEncoding) {
104
+ $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
105
+ }
106
+
107
+ return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
108
+ }
109
+
110
+ if ('HTML-ENTITIES' === $fromEncoding) {
111
+ $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
112
+ $fromEncoding = 'UTF-8';
113
+ }
114
+
115
+ return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
116
+ }
117
+
118
+ public static function mb_convert_variables($toEncoding, $fromEncoding, &...$vars)
119
+ {
120
+ $ok = true;
121
+ array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
122
+ if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
123
+ $ok = false;
124
+ }
125
+ });
126
+
127
+ return $ok ? $fromEncoding : false;
128
+ }
129
+
130
+ public static function mb_decode_mimeheader($s)
131
+ {
132
+ return iconv_mime_decode($s, 2, self::$internalEncoding);
133
+ }
134
+
135
+ public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
136
+ {
137
+ trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
138
+ }
139
+
140
+ public static function mb_decode_numericentity($s, $convmap, $encoding = null)
141
+ {
142
+ if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
143
+ trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
144
+
145
+ return null;
146
+ }
147
+
148
+ if (!\is_array($convmap) || !$convmap) {
149
+ return false;
150
+ }
151
+
152
+ if (null !== $encoding && !\is_scalar($encoding)) {
153
+ trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
154
+
155
+ return ''; // Instead of null (cf. mb_encode_numericentity).
156
+ }
157
+
158
+ $s = (string) $s;
159
+ if ('' === $s) {
160
+ return '';
161
+ }
162
+
163
+ $encoding = self::getEncoding($encoding);
164
+
165
+ if ('UTF-8' === $encoding) {
166
+ $encoding = null;
167
+ if (!preg_match('//u', $s)) {
168
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
169
+ }
170
+ } else {
171
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
172
+ }
173
+
174
+ $cnt = floor(\count($convmap) / 4) * 4;
175
+
176
+ for ($i = 0; $i < $cnt; $i += 4) {
177
+ // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
178
+ $convmap[$i] += $convmap[$i + 2];
179
+ $convmap[$i + 1] += $convmap[$i + 2];
180
+ }
181
+
182
+ $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
183
+ $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
184
+ for ($i = 0; $i < $cnt; $i += 4) {
185
+ if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
186
+ return Mbstring::mb_chr($c - $convmap[$i + 2]);
187
+ }
188
+ }
189
+
190
+ return $m[0];
191
+ }, $s);
192
+
193
+ if (null === $encoding) {
194
+ return $s;
195
+ }
196
+
197
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
198
+ }
199
+
200
+ public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
201
+ {
202
+ if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
203
+ trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
204
+
205
+ return null;
206
+ }
207
+
208
+ if (!\is_array($convmap) || !$convmap) {
209
+ return false;
210
+ }
211
+
212
+ if (null !== $encoding && !\is_scalar($encoding)) {
213
+ trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
214
+
215
+ return null; // Instead of '' (cf. mb_decode_numericentity).
216
+ }
217
+
218
+ if (null !== $is_hex && !\is_scalar($is_hex)) {
219
+ trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING);
220
+
221
+ return null;
222
+ }
223
+
224
+ $s = (string) $s;
225
+ if ('' === $s) {
226
+ return '';
227
+ }
228
+
229
+ $encoding = self::getEncoding($encoding);
230
+
231
+ if ('UTF-8' === $encoding) {
232
+ $encoding = null;
233
+ if (!preg_match('//u', $s)) {
234
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
235
+ }
236
+ } else {
237
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
238
+ }
239
+
240
+ static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
241
+
242
+ $cnt = floor(\count($convmap) / 4) * 4;
243
+ $i = 0;
244
+ $len = \strlen($s);
245
+ $result = '';
246
+
247
+ while ($i < $len) {
248
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
249
+ $uchr = substr($s, $i, $ulen);
250
+ $i += $ulen;
251
+ $c = self::mb_ord($uchr);
252
+
253
+ for ($j = 0; $j < $cnt; $j += 4) {
254
+ if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
255
+ $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
256
+ $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';
257
+ continue 2;
258
+ }
259
+ }
260
+ $result .= $uchr;
261
+ }
262
+
263
+ if (null === $encoding) {
264
+ return $result;
265
+ }
266
+
267
+ return iconv('UTF-8', $encoding.'//IGNORE', $result);
268
+ }
269
+
270
+ public static function mb_convert_case($s, $mode, $encoding = null)
271
+ {
272
+ $s = (string) $s;
273
+ if ('' === $s) {
274
+ return '';
275
+ }
276
+
277
+ $encoding = self::getEncoding($encoding);
278
+
279
+ if ('UTF-8' === $encoding) {
280
+ $encoding = null;
281
+ if (!preg_match('//u', $s)) {
282
+ $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
283
+ }
284
+ } else {
285
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
286
+ }
287
+
288
+ if (MB_CASE_TITLE == $mode) {
289
+ static $titleRegexp = null;
290
+ if (null === $titleRegexp) {
291
+ $titleRegexp = self::getData('titleCaseRegexp');
292
+ }
293
+ $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
294
+ } else {
295
+ if (MB_CASE_UPPER == $mode) {
296
+ static $upper = null;
297
+ if (null === $upper) {
298
+ $upper = self::getData('upperCase');
299
+ }
300
+ $map = $upper;
301
+ } else {
302
+ if (self::MB_CASE_FOLD === $mode) {
303
+ $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
304
+ }
305
+
306
+ static $lower = null;
307
+ if (null === $lower) {
308
+ $lower = self::getData('lowerCase');
309
+ }
310
+ $map = $lower;
311
+ }
312
+
313
+ static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
314
+
315
+ $i = 0;
316
+ $len = \strlen($s);
317
+
318
+ while ($i < $len) {
319
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
320
+ $uchr = substr($s, $i, $ulen);
321
+ $i += $ulen;
322
+
323
+ if (isset($map[$uchr])) {
324
+ $uchr = $map[$uchr];
325
+ $nlen = \strlen($uchr);
326
+
327
+ if ($nlen == $ulen) {
328
+ $nlen = $i;
329
+ do {
330
+ $s[--$nlen] = $uchr[--$ulen];
331
+ } while ($ulen);
332
+ } else {
333
+ $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
334
+ $len += $nlen - $ulen;
335
+ $i += $nlen - $ulen;
336
+ }
337
+ }
338
+ }
339
+ }
340
+
341
+ if (null === $encoding) {
342
+ return $s;
343
+ }
344
+
345
+ return iconv('UTF-8', $encoding.'//IGNORE', $s);
346
+ }
347
+
348
+ public static function mb_internal_encoding($encoding = null)
349
+ {
350
+ if (null === $encoding) {
351
+ return self::$internalEncoding;
352
+ }
353
+
354
+ $encoding = self::getEncoding($encoding);
355
+
356
+ if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
357
+ self::$internalEncoding = $encoding;
358
+
359
+ return true;
360
+ }
361
+
362
+ return false;
363
+ }
364
+
365
+ public static function mb_language($lang = null)
366
+ {
367
+ if (null === $lang) {
368
+ return self::$language;
369
+ }
370
+
371
+ switch ($lang = strtolower($lang)) {
372
+ case 'uni':
373
+ case 'neutral':
374
+ self::$language = $lang;
375
+
376
+ return true;
377
+ }
378
+
379
+ return false;
380
+ }
381
+
382
+ public static function mb_list_encodings()
383
+ {
384
+ return array('UTF-8');
385
+ }
386
+
387
+ public static function mb_encoding_aliases($encoding)
388
+ {
389
+ switch (strtoupper($encoding)) {
390
+ case 'UTF8':
391
+ case 'UTF-8':
392
+ return array('utf8');
393
+ }
394
+
395
+ return false;
396
+ }
397
+
398
+ public static function mb_check_encoding($var = null, $encoding = null)
399
+ {
400
+ if (null === $encoding) {
401
+ if (null === $var) {
402
+ return false;
403
+ }
404
+ $encoding = self::$internalEncoding;
405
+ }
406
+
407
+ return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
408
+ }
409
+
410
+ public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
411
+ {
412
+ if (null === $encodingList) {
413
+ $encodingList = self::$encodingList;
414
+ } else {
415
+ if (!\is_array($encodingList)) {
416
+ $encodingList = array_map('trim', explode(',', $encodingList));
417
+ }
418
+ $encodingList = array_map('strtoupper', $encodingList);
419
+ }
420
+
421
+ foreach ($encodingList as $enc) {
422
+ switch ($enc) {
423
+ case 'ASCII':
424
+ if (!preg_match('/[\x80-\xFF]/', $str)) {
425
+ return $enc;
426
+ }
427
+ break;
428
+
429
+ case 'UTF8':
430
+ case 'UTF-8':
431
+ if (preg_match('//u', $str)) {
432
+ return 'UTF-8';
433
+ }
434
+ break;
435
+
436
+ default:
437
+ if (0 === strncmp($enc, 'ISO-8859-', 9)) {
438
+ return $enc;
439
+ }
440
+ }
441
+ }
442
+
443
+ return false;
444
+ }
445
+
446
+ public static function mb_detect_order($encodingList = null)
447
+ {
448
+ if (null === $encodingList) {
449
+ return self::$encodingList;
450
+ }
451
+
452
+ if (!\is_array($encodingList)) {
453
+ $encodingList = array_map('trim', explode(',', $encodingList));
454
+ }
455
+ $encodingList = array_map('strtoupper', $encodingList);
456
+
457
+ foreach ($encodingList as $enc) {
458
+ switch ($enc) {
459
+ default:
460
+ if (strncmp($enc, 'ISO-8859-', 9)) {
461
+ return false;
462
+ }
463
+ // no break
464
+ case 'ASCII':
465
+ case 'UTF8':
466
+ case 'UTF-8':
467
+ }
468
+ }
469
+
470
+ self::$encodingList = $encodingList;
471
+
472
+ return true;
473
+ }
474
+
475
+ public static function mb_strlen($s, $encoding = null)
476
+ {
477
+ $encoding = self::getEncoding($encoding);
478
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
479
+ return \strlen($s);
480
+ }
481
+
482
+ return @iconv_strlen($s, $encoding);
483
+ }
484
+
485
+ public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
486
+ {
487
+ $encoding = self::getEncoding($encoding);
488
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
489
+ return strpos($haystack, $needle, $offset);
490
+ }
491
+
492
+ $needle = (string) $needle;
493
+ if ('' === $needle) {
494
+ trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
495
+
496
+ return false;
497
+ }
498
+
499
+ return iconv_strpos($haystack, $needle, $offset, $encoding);
500
+ }
501
+
502
+ public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
503
+ {
504
+ $encoding = self::getEncoding($encoding);
505
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
506
+ return strrpos($haystack, $needle, $offset);
507
+ }
508
+
509
+ if ($offset != (int) $offset) {
510
+ $offset = 0;
511
+ } elseif ($offset = (int) $offset) {
512
+ if ($offset < 0) {
513
+ if (0 > $offset += self::mb_strlen($needle)) {
514
+ $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
515
+ }
516
+ $offset = 0;
517
+ } else {
518
+ $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
519
+ }
520
+ }
521
+
522
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
523
+
524
+ return false !== $pos ? $offset + $pos : false;
525
+ }
526
+
527
+ public static function mb_str_split($string, $split_length = 1, $encoding = null)
528
+ {
529
+ if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) {
530
+ trigger_error('mb_str_split() expects parameter 1 to be string, '.\gettype($string).' given', E_USER_WARNING);
531
+
532
+ return null;
533
+ }
534
+
535
+ if (1 > $split_length = (int) $split_length) {
536
+ trigger_error('The length of each segment must be greater than zero', E_USER_WARNING);
537
+
538
+ return false;
539
+ }
540
+
541
+ if (null === $encoding) {
542
+ $encoding = mb_internal_encoding();
543
+ }
544
+
545
+ if ('UTF-8' === $encoding = self::getEncoding($encoding)) {
546
+ $rx = '/(';
547
+ while (65535 < $split_length) {
548
+ $rx .= '.{65535}';
549
+ $split_length -= 65535;
550
+ }
551
+ $rx .= '.{'.$split_length.'})/us';
552
+
553
+ return preg_split($rx, $string, null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
554
+ }
555
+
556
+ $result = array();
557
+ $length = mb_strlen($string, $encoding);
558
+
559
+ for ($i = 0; $i < $length; $i += $split_length) {
560
+ $result[] = mb_substr($string, $i, $split_length, $encoding);
561
+ }
562
+
563
+ return $result;
564
+ }
565
+
566
+ public static function mb_strtolower($s, $encoding = null)
567
+ {
568
+ return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
569
+ }
570
+
571
+ public static function mb_strtoupper($s, $encoding = null)
572
+ {
573
+ return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
574
+ }
575
+
576
+ public static function mb_substitute_character($c = null)
577
+ {
578
+ if (0 === strcasecmp($c, 'none')) {
579
+ return true;
580
+ }
581
+
582
+ return null !== $c ? false : 'none';
583
+ }
584
+
585
+ public static function mb_substr($s, $start, $length = null, $encoding = null)
586
+ {
587
+ $encoding = self::getEncoding($encoding);
588
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
589
+ return (string) substr($s, $start, null === $length ? 2147483647 : $length);
590
+ }
591
+
592
+ if ($start < 0) {
593
+ $start = iconv_strlen($s, $encoding) + $start;
594
+ if ($start < 0) {
595
+ $start = 0;
596
+ }
597
+ }
598
+
599
+ if (null === $length) {
600
+ $length = 2147483647;
601
+ } elseif ($length < 0) {
602
+ $length = iconv_strlen($s, $encoding) + $length - $start;
603
+ if ($length < 0) {
604
+ return '';
605
+ }
606
+ }
607
+
608
+ return (string) iconv_substr($s, $start, $length, $encoding);
609
+ }
610
+
611
+ public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
612
+ {
613
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
614
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
615
+
616
+ return self::mb_strpos($haystack, $needle, $offset, $encoding);
617
+ }
618
+
619
+ public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
620
+ {
621
+ $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
622
+
623
+ return self::getSubpart($pos, $part, $haystack, $encoding);
624
+ }
625
+
626
+ public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
627
+ {
628
+ $encoding = self::getEncoding($encoding);
629
+ if ('CP850' === $encoding || 'ASCII' === $encoding) {
630
+ $pos = strrpos($haystack, $needle);
631
+ } else {
632
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
633
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
634
+ }
635
+
636
+ return self::getSubpart($pos, $part, $haystack, $encoding);
637
+ }
638
+
639
+ public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
640
+ {
641
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
642
+ $pos = self::mb_strripos($haystack, $needle, $encoding);
643
+
644
+ return self::getSubpart($pos, $part, $haystack, $encoding);
645
+ }
646
+
647
+ public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
648
+ {
649
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
650
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
651
+
652
+ return self::mb_strrpos($haystack, $needle, $offset, $encoding);
653
+ }
654
+
655
+ public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
656
+ {
657
+ $pos = strpos($haystack, $needle);
658
+ if (false === $pos) {
659
+ return false;
660
+ }
661
+ if ($part) {
662
+ return substr($haystack, 0, $pos);
663
+ }
664
+
665
+ return substr($haystack, $pos);
666
+ }
667
+
668
+ public static function mb_get_info($type = 'all')
669
+ {
670
+ $info = array(
671
+ 'internal_encoding' => self::$internalEncoding,
672
+ 'http_output' => 'pass',
673
+ 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
674
+ 'func_overload' => 0,
675
+ 'func_overload_list' => 'no overload',
676
+ 'mail_charset' => 'UTF-8',
677
+ 'mail_header_encoding' => 'BASE64',
678
+ 'mail_body_encoding' => 'BASE64',
679
+ 'illegal_chars' => 0,
680
+ 'encoding_translation' => 'Off',
681
+ 'language' => self::$language,
682
+ 'detect_order' => self::$encodingList,
683
+ 'substitute_character' => 'none',
684
+ 'strict_detection' => 'Off',
685
+ );
686
+
687
+ if ('all' === $type) {
688
+ return $info;
689
+ }
690
+ if (isset($info[$type])) {
691
+ return $info[$type];
692
+ }
693
+
694
+ return false;
695
+ }
696
+
697
+ public static function mb_http_input($type = '')
698
+ {
699
+ return false;
700
+ }
701
+
702
+ public static function mb_http_output($encoding = null)
703
+ {
704
+ return null !== $encoding ? 'pass' === $encoding : 'pass';
705
+ }
706
+
707
+ public static function mb_strwidth($s, $encoding = null)
708
+ {
709
+ $encoding = self::getEncoding($encoding);
710
+
711
+ if ('UTF-8' !== $encoding) {
712
+ $s = iconv($encoding, 'UTF-8//IGNORE', $s);
713
+ }
714
+
715
+ $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
716
+
717
+ return ($wide << 1) + iconv_strlen($s, 'UTF-8');
718
+ }
719
+
720
+ public static function mb_substr_count($haystack, $needle, $encoding = null)
721
+ {
722
+ return substr_count($haystack, $needle);
723
+ }
724
+
725
+ public static function mb_output_handler($contents, $status)
726
+ {
727
+ return $contents;
728
+ }
729
+
730
+ public static function mb_chr($code, $encoding = null)
731
+ {
732
+ if (0x80 > $code %= 0x200000) {
733
+ $s = \chr($code);
734
+ } elseif (0x800 > $code) {
735
+ $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
736
+ } elseif (0x10000 > $code) {
737
+ $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
738
+ } else {
739
+ $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
740
+ }
741
+
742
+ if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
743
+ $s = mb_convert_encoding($s, $encoding, 'UTF-8');
744
+ }
745
+
746
+ return $s;
747
+ }
748
+
749
+ public static function mb_ord($s, $encoding = null)
750
+ {
751
+ if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
752
+ $s = mb_convert_encoding($s, 'UTF-8', $encoding);
753
+ }
754
+
755
+ if (1 === \strlen($s)) {
756
+ return \ord($s);
757
+ }
758
+
759
+ $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
760
+ if (0xF0 <= $code) {
761
+ return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
762
+ }
763
+ if (0xE0 <= $code) {
764
+ return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
765
+ }
766
+ if (0xC0 <= $code) {
767
+ return (($code - 0xC0) << 6) + $s[2] - 0x80;
768
+ }
769
+
770
+ return $code;
771
+ }
772
+
773
+ private static function getSubpart($pos, $part, $haystack, $encoding)
774
+ {
775
+ if (false === $pos) {
776
+ return false;
777
+ }
778
+ if ($part) {
779
+ return self::mb_substr($haystack, 0, $pos, $encoding);
780
+ }
781
+
782
+ return self::mb_substr($haystack, $pos, null, $encoding);
783
+ }
784
+
785
+ private static function html_encoding_callback(array $m)
786
+ {
787
+ $i = 1;
788
+ $entities = '';
789
+ $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
790
+
791
+ while (isset($m[$i])) {
792
+ if (0x80 > $m[$i]) {
793
+ $entities .= \chr($m[$i++]);
794
+ continue;
795
+ }
796
+ if (0xF0 <= $m[$i]) {
797
+ $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
798
+ } elseif (0xE0 <= $m[$i]) {
799
+ $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
800
+ } else {
801
+ $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
802
+ }
803
+
804
+ $entities .= '&#'.$c.';';
805
+ }
806
+
807
+ return $entities;
808
+ }
809
+
810
+ private static function title_case(array $s)
811
+ {
812
+ return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');
813
+ }
814
+
815
+ private static function getData($file)
816
+ {
817
+ if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
818
+ return require $file;
819
+ }
820
+
821
+ return false;
822
+ }
823
+
824
+ private static function getEncoding($encoding)
825
+ {
826
+ if (null === $encoding) {
827
+ return self::$internalEncoding;
828
+ }
829
+
830
+ if ('UTF-8' === $encoding) {
831
+ return 'UTF-8';
832
+ }
833
+
834
+ $encoding = strtoupper($encoding);
835
+
836
+ if ('8BIT' === $encoding || 'BINARY' === $encoding) {
837
+ return 'CP850';
838
+ }
839
+
840
+ if ('UTF8' === $encoding) {
841
+ return 'UTF-8';
842
+ }
843
+
844
+ return $encoding;
845
+ }
846
+ }
vendor/symfony/polyfill-mbstring/README.md CHANGED
@@ -1,13 +1,13 @@
1
- Symfony Polyfill / Mbstring
2
- ===========================
3
-
4
- This component provides a partial, native PHP implementation for the
5
- [Mbstring](https://php.net/mbstring) extension.
6
-
7
- More information can be found in the
8
- [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
9
-
10
- License
11
- =======
12
-
13
- This library is released under the [MIT license](LICENSE).
1
+ Symfony Polyfill / Mbstring
2
+ ===========================
3
+
4
+ This component provides a partial, native PHP implementation for the
5
+ [Mbstring](https://php.net/mbstring) extension.
6
+
7
+ More information can be found in the
8
+ [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
9
+
10
+ License
11
+ =======
12
+
13
+ This library is released under the [MIT license](LICENSE).
vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php CHANGED
@@ -1,1397 +1,1397 @@
1
- <?php
2
-
3
- return array (
4
- 'A' => 'a',
5
- 'B' => 'b',
6
- 'C' => 'c',
7
- 'D' => 'd',
8
- 'E' => 'e',
9
- 'F' => 'f',
10
- 'G' => 'g',
11
- 'H' => 'h',
12
- 'I' => 'i',
13
- 'J' => 'j',
14
- 'K' => 'k',
15
- 'L' => 'l',
16
- 'M' => 'm',
17
- 'N' => 'n',
18
- 'O' => 'o',
19
- 'P' => 'p',
20
- 'Q' => 'q',
21
- 'R' => 'r',
22
- 'S' => 's',
23
- 'T' => 't',
24
- 'U' => 'u',
25
- 'V' => 'v',
26
- 'W' => 'w',
27
- 'X' => 'x',
28
- 'Y' => 'y',
29
- 'Z' => 'z',
30
- 'À' => 'à',
31
- 'Á' => 'á',
32
- 'Â' => 'â',
33
- 'Ã' => 'ã',
34
- 'Ä' => 'ä',
35
- 'Å' => 'å',
36
- 'Æ' => 'æ',
37
- 'Ç' => 'ç',
38
- 'È' => 'è',
39
- 'É' => 'é',
40
- 'Ê' => 'ê',
41
- 'Ë' => 'ë',
42
- 'Ì' => 'ì',
43
- 'Í' => 'í',
44
- 'Î' => 'î',
45
- 'Ï' => 'ï',
46
- 'Ð' => 'ð',
47
- 'Ñ' => 'ñ',
48
- 'Ò' => 'ò',
49
- 'Ó' => 'ó',
50
- 'Ô' => 'ô',
51
- 'Õ' => 'õ',
52
- 'Ö' => 'ö',
53
- 'Ø' => 'ø',
54
- 'Ù' => 'ù',
55
- 'Ú' => 'ú',
56
- 'Û' => 'û',
57
- 'Ü' => 'ü',
58
- 'Ý' => 'ý',
59
- 'Þ' => 'þ',
60
- 'Ā' => 'ā',
61
- 'Ă' => 'ă',
62
- 'Ą' => 'ą',
63
- 'Ć' => 'ć',
64
- 'Ĉ' => 'ĉ',
65
- 'Ċ' => 'ċ',
66
- 'Č' => 'č',
67
- 'Ď' => 'ď',
68
- 'Đ' => 'đ',
69
- 'Ē' => 'ē',
70
- 'Ĕ' => 'ĕ',
71
- 'Ė' => 'ė',
72
- 'Ę' => 'ę',
73
- 'Ě' => 'ě',
74
- 'Ĝ' => 'ĝ',
75
- 'Ğ' => 'ğ',
76
- 'Ġ' => 'ġ',
77
- 'Ģ' => 'ģ',
78
- 'Ĥ' => 'ĥ',
79
- 'Ħ' => 'ħ',
80
- 'Ĩ' => 'ĩ',
81
- 'Ī' => 'ī',
82
- 'Ĭ' => 'ĭ',
83
- 'Į' => 'į',
84
- 'İ' => 'i',
85
- 'IJ' => 'ij',
86
- 'Ĵ' => 'ĵ',
87
- 'Ķ' => 'ķ',
88
- 'Ĺ' => 'ĺ',
89
- 'Ļ' => 'ļ',
90
- 'Ľ' => 'ľ',
91
- 'Ŀ' => 'ŀ',
92
- 'Ł' => 'ł',
93
- 'Ń' => 'ń',
94
- 'Ņ' => 'ņ',
95
- 'Ň' => 'ň',
96
- 'Ŋ' => 'ŋ',
97
- 'Ō' => 'ō',
98
- 'Ŏ' => 'ŏ',
99
- 'Ő' => 'ő',
100
- 'Œ' => 'œ',
101
- 'Ŕ' => 'ŕ',
102
- 'Ŗ' => 'ŗ',
103
- 'Ř' => 'ř',
104
- 'Ś' => 'ś',
105
- 'Ŝ' => 'ŝ',
106
- 'Ş' => 'ş',
107
- 'Š' => 'š',
108
- 'Ţ' => 'ţ',
109
- 'Ť' => 'ť',
110
- 'Ŧ' => 'ŧ',
111
- 'Ũ' => 'ũ',
112
- 'Ū' => 'ū',
113
- 'Ŭ' => 'ŭ',
114
- 'Ů' => 'ů',
115
- 'Ű' => 'ű',
116
- 'Ų' => 'ų',
117
- 'Ŵ' => 'ŵ',
118
- 'Ŷ' => 'ŷ',
119
- 'Ÿ' => 'ÿ',
120
- 'Ź' => 'ź',
121
- 'Ż' => 'ż',
122
- 'Ž' => 'ž',
123
- 'Ɓ' => 'ɓ',
124
- 'Ƃ' => 'ƃ',
125
- 'Ƅ' => 'ƅ',
126
- 'Ɔ' => 'ɔ',
127
- 'Ƈ' => 'ƈ',
128
- 'Ɖ' => 'ɖ',
129
- 'Ɗ' => 'ɗ',
130
- 'Ƌ' => 'ƌ',
131
- 'Ǝ' => 'ǝ',
132
- 'Ə' => 'ə',
133
- 'Ɛ' => 'ɛ',
134
- 'Ƒ' => 'ƒ',
135
- 'Ɠ' => 'ɠ',
136
- 'Ɣ' => 'ɣ',
137
- 'Ɩ' => 'ɩ',
138
- 'Ɨ' => 'ɨ',
139
- 'Ƙ' => 'ƙ',
140
- 'Ɯ' => 'ɯ',
141
- 'Ɲ' => 'ɲ',
142
- 'Ɵ' => 'ɵ',
143
- 'Ơ' => 'ơ',
144
- 'Ƣ' => 'ƣ',
145
- 'Ƥ' => 'ƥ',
146
- 'Ʀ' => 'ʀ',
147
- 'Ƨ' => 'ƨ',
148
- 'Ʃ' => 'ʃ',
149
- 'Ƭ' => 'ƭ',
150
- 'Ʈ' => 'ʈ',
151
- 'Ư' => 'ư',
152
- 'Ʊ' => 'ʊ',
153
- 'Ʋ' => 'ʋ',
154
- 'Ƴ' => 'ƴ',
155
- 'Ƶ' => 'ƶ',
156
- 'Ʒ' => 'ʒ',
157
- 'Ƹ' => 'ƹ',
158
- 'Ƽ' => 'ƽ',
159
- 'DŽ' => 'dž',
160
- 'Dž' => 'dž',
161
- 'LJ' => 'lj',
162
- 'Lj' => 'lj',
163
- 'NJ' => 'nj',
164
- 'Nj' => 'nj',
165
- 'Ǎ' => 'ǎ',
166
- 'Ǐ' => 'ǐ',
167
- 'Ǒ' => 'ǒ',
168
- 'Ǔ' => 'ǔ',
169
- 'Ǖ' => 'ǖ',
170
- 'Ǘ' => 'ǘ',
171
- 'Ǚ' => 'ǚ',
172
- 'Ǜ' => 'ǜ',
173
- 'Ǟ' => 'ǟ',
174
- 'Ǡ' => 'ǡ',
175
- 'Ǣ' => 'ǣ',
176
- 'Ǥ' => 'ǥ',
177
- 'Ǧ' => 'ǧ',
178
- 'Ǩ' => 'ǩ',
179
- 'Ǫ' => 'ǫ',
180
- 'Ǭ' => 'ǭ',
181
- 'Ǯ' => 'ǯ',
182
- 'DZ' => 'dz',
183
- 'Dz' => 'dz',
184
- 'Ǵ' => 'ǵ',
185
- 'Ƕ' => 'ƕ',
186
- 'Ƿ' => 'ƿ',
187
- 'Ǹ' => 'ǹ',
188
- 'Ǻ' => 'ǻ',
189
- 'Ǽ' => 'ǽ',
190
- 'Ǿ' => 'ǿ',
191
- 'Ȁ' => 'ȁ',
192
- 'Ȃ' => 'ȃ',
193
- 'Ȅ' => 'ȅ',
194
- 'Ȇ' => 'ȇ',
195
- 'Ȉ' => 'ȉ',
196
- 'Ȋ' => 'ȋ',
197
- 'Ȍ' => 'ȍ',
198
- 'Ȏ' => 'ȏ',
199
- 'Ȑ' => 'ȑ',
200
- 'Ȓ' => 'ȓ',
201
- 'Ȕ' => 'ȕ',
202
- 'Ȗ' => 'ȗ',
203
- 'Ș' => 'ș',
204
- 'Ț' => 'ț',
205
- 'Ȝ' => 'ȝ',
206
- 'Ȟ' => 'ȟ',
207
- 'Ƞ' => 'ƞ',
208
- 'Ȣ' => 'ȣ',
209
- 'Ȥ' => 'ȥ',
210
- 'Ȧ' => 'ȧ',
211
- 'Ȩ' => 'ȩ',
212
- 'Ȫ' => 'ȫ',
213
- 'Ȭ' => 'ȭ',
214
- 'Ȯ' => 'ȯ',
215
- 'Ȱ' => 'ȱ',
216
- 'Ȳ' => 'ȳ',
217
- 'Ⱥ' => 'ⱥ',
218
- 'Ȼ' => 'ȼ',
219
- 'Ƚ' => 'ƚ',
220
- 'Ⱦ' => 'ⱦ',
221
- 'Ɂ' => 'ɂ',
222
- 'Ƀ' => 'ƀ',
223
- 'Ʉ' => 'ʉ',
224
- 'Ʌ' => 'ʌ',
225
- 'Ɇ' => 'ɇ',
226
- 'Ɉ' => 'ɉ',
227
- 'Ɋ' => 'ɋ',
228
- 'Ɍ' => 'ɍ',
229
- 'Ɏ' => 'ɏ',
230
- 'Ͱ' => 'ͱ',
231
- 'Ͳ' => 'ͳ',
232
- 'Ͷ' => 'ͷ',
233
- 'Ϳ' => 'ϳ',
234
- 'Ά' => 'ά',
235
- 'Έ' => 'έ',
236
- 'Ή' => 'ή',
237
- 'Ί' => 'ί',
238
- 'Ό' => 'ό',
239
- 'Ύ' => 'ύ',
240
- 'Ώ' => 'ώ',
241
- 'Α' => 'α',
242
- 'Β' => 'β',
243
- 'Γ' => 'γ',
244
- 'Δ' => 'δ',
245
- 'Ε' => 'ε',
246
- 'Ζ' => 'ζ',
247
- 'Η' => 'η',
248
- 'Θ' => 'θ',
249
- 'Ι' => 'ι',
250
- 'Κ' => 'κ',
251
- 'Λ' => 'λ',
252
- 'Μ' => 'μ',
253
- 'Ν' => 'ν',
254
- 'Ξ' => 'ξ',
255
- 'Ο' => 'ο',
256
- 'Π' => 'π',
257
- 'Ρ' => 'ρ',
258
- 'Σ' => 'σ',
259
- 'Τ' => 'τ',
260
- 'Υ' => 'υ',
261
- 'Φ' => 'φ',
262
- 'Χ' => 'χ',
263
- 'Ψ' => 'ψ',
264
- 'Ω' => 'ω',
265
- 'Ϊ' => 'ϊ',
266
- 'Ϋ' => 'ϋ',
267
- 'Ϗ' => 'ϗ',
268
- 'Ϙ' => 'ϙ',
269
- 'Ϛ' => 'ϛ',
270
- 'Ϝ' => 'ϝ',
271
- 'Ϟ' => 'ϟ',
272
- 'Ϡ' => 'ϡ',
273
- 'Ϣ' => 'ϣ',
274
- 'Ϥ' => 'ϥ',
275
- 'Ϧ' => 'ϧ',
276
- 'Ϩ' => 'ϩ',
277
- 'Ϫ' => 'ϫ',
278
- 'Ϭ' => 'ϭ',
279
- 'Ϯ' => 'ϯ',
280
- 'ϴ' => 'θ',
281
- 'Ϸ' => 'ϸ',
282
- 'Ϲ' => 'ϲ',
283
- 'Ϻ' => 'ϻ',
284
- 'Ͻ' => 'ͻ',
285
- 'Ͼ' => 'ͼ',
286
- 'Ͽ' => 'ͽ',
287
- 'Ѐ' => 'ѐ',
288
- 'Ё' => 'ё',
289
- 'Ђ' => 'ђ',
290
- 'Ѓ' => 'ѓ',
291
- 'Є' => 'є',
292
- 'Ѕ' => 'ѕ',
293
- 'І' => 'і',
294
- 'Ї' => 'ї',
295
- 'Ј' => 'ј',
296
- 'Љ' => 'љ',
297
- 'Њ' => 'њ',
298
- 'Ћ' => 'ћ',
299
- 'Ќ' => 'ќ',
300
- 'Ѝ' => 'ѝ',
301
- 'Ў' => 'ў',
302
- 'Џ' => 'џ',
303
- 'А' => 'а',
304
- 'Б' => 'б',
305
- 'В' => 'в',
306
- 'Г' => 'г',
307
- 'Д' => 'д',
308
- 'Е' => 'е',
309
- 'Ж' => 'ж',
310
- 'З' => 'з',
311
- 'И' => 'и',
312
- 'Й' => 'й',
313
- 'К' => 'к',
314
- 'Л' => 'л',
315
- 'М' => 'м',
316
- 'Н' => 'н',
317
- 'О' => 'о',
318
- 'П' => 'п',
319
- 'Р' => 'р',
320
- 'С' => 'с',
321
- 'Т' => 'т',
322
- 'У' => 'у',
323
- 'Ф' => 'ф',
324
- 'Х' => 'х',
325
- 'Ц' => 'ц',
326
- 'Ч' => 'ч',
327
- 'Ш' => 'ш',
328
- 'Щ' => 'щ',
329
- 'Ъ' => 'ъ',
330
- 'Ы' => 'ы',
331
- 'Ь' => 'ь',
332
- 'Э' => 'э',
333
- 'Ю' => 'ю',
334
- 'Я' => 'я',
335
- 'Ѡ' => 'ѡ',
336
- 'Ѣ' => 'ѣ',
337
- 'Ѥ' => 'ѥ',
338
- 'Ѧ' => 'ѧ',
339
- 'Ѩ' => 'ѩ',
340
- 'Ѫ' => 'ѫ',
341
- 'Ѭ' => 'ѭ',
342
- 'Ѯ' => 'ѯ',
343
- 'Ѱ' => 'ѱ',
344
- 'Ѳ' => 'ѳ',
345
- 'Ѵ' => 'ѵ',
346
- 'Ѷ' => 'ѷ',
347
- 'Ѹ' => 'ѹ',
348
- 'Ѻ' => 'ѻ',
349
- 'Ѽ' => 'ѽ',
350
- 'Ѿ' => 'ѿ',
351
- 'Ҁ' => 'ҁ',
352
- 'Ҋ' => 'ҋ',
353
- 'Ҍ' => 'ҍ',
354
- 'Ҏ' => 'ҏ',
355
- 'Ґ' => 'ґ',
356
- 'Ғ' => 'ғ',
357
- 'Ҕ' => 'ҕ',
358
- 'Җ' => 'җ',
359
- 'Ҙ' => 'ҙ',
360
- 'Қ' => 'қ',
361
- 'Ҝ' => 'ҝ',
362
- 'Ҟ' => 'ҟ',
363
- 'Ҡ' => 'ҡ',
364
- 'Ң' => 'ң',
365
- 'Ҥ' => 'ҥ',
366
- 'Ҧ' => 'ҧ',
367
- 'Ҩ' => 'ҩ',
368
- 'Ҫ' => 'ҫ',
369
- 'Ҭ' => 'ҭ',
370
- 'Ү' => 'ү',
371
- 'Ұ' => 'ұ',
372
- 'Ҳ' => 'ҳ',
373
- 'Ҵ' => 'ҵ',
374
- 'Ҷ' => 'ҷ',
375
- 'Ҹ' => 'ҹ',
376
- 'Һ' => 'һ',
377
- 'Ҽ' => 'ҽ',
378
- 'Ҿ' => 'ҿ',
379
- 'Ӏ' => 'ӏ',
380
- 'Ӂ' => 'ӂ',
381
- 'Ӄ' => 'ӄ',
382
- 'Ӆ' => 'ӆ',
383
- 'Ӈ' => 'ӈ',
384
- 'Ӊ' => 'ӊ',
385
- 'Ӌ' => 'ӌ',
386
- 'Ӎ' => 'ӎ',
387
- 'Ӑ' => 'ӑ',
388
- 'Ӓ' => 'ӓ',
389
- 'Ӕ' => 'ӕ',
390
- 'Ӗ' => 'ӗ',
391
- 'Ә' => 'ә',
392
- 'Ӛ' => 'ӛ',
393
- 'Ӝ' => 'ӝ',
394
- 'Ӟ' => 'ӟ',
395
- 'Ӡ' => 'ӡ',
396
- 'Ӣ' => 'ӣ',
397
- 'Ӥ' => 'ӥ',
398
- 'Ӧ' => 'ӧ',
399
- 'Ө' => 'ө',
400
- 'Ӫ' => 'ӫ',
401
- 'Ӭ' => 'ӭ',
402
- 'Ӯ' => 'ӯ',
403
- 'Ӱ' => 'ӱ',
404
- 'Ӳ' => 'ӳ',
405
- 'Ӵ' => 'ӵ',
406
- 'Ӷ' => 'ӷ',
407
- 'Ӹ' => 'ӹ',
408
- 'Ӻ' => 'ӻ',
409
- 'Ӽ' => 'ӽ',
410
- 'Ӿ' => 'ӿ',
411
- 'Ԁ' => 'ԁ',
412
- 'Ԃ' => 'ԃ',
413
- 'Ԅ' => 'ԅ',
414
- 'Ԇ' => 'ԇ',
415
- 'Ԉ' => 'ԉ',
416
- 'Ԋ' => 'ԋ',
417
- 'Ԍ' => 'ԍ',
418
- 'Ԏ' => 'ԏ',
419
- 'Ԑ' => 'ԑ',
420
- 'Ԓ' => 'ԓ',
421
- 'Ԕ' => 'ԕ',
422
- 'Ԗ' => 'ԗ',
423
- 'Ԙ' => 'ԙ',
424
- 'Ԛ' => 'ԛ',
425
- 'Ԝ' => 'ԝ',
426
- 'Ԟ' => 'ԟ',
427
- 'Ԡ' => 'ԡ',
428
- 'Ԣ' => 'ԣ',
429
- 'Ԥ' => 'ԥ',
430
- 'Ԧ' => 'ԧ',
431
- 'Ԩ' => 'ԩ',
432
- 'Ԫ' => 'ԫ',
433
- 'Ԭ' => 'ԭ',
434
- 'Ԯ' => 'ԯ',
435
- 'Ա' => 'ա',
436
- 'Բ' => 'բ',
437
- 'Գ' => 'գ',
438
- 'Դ' => 'դ',
439
- 'Ե' => 'ե',
440
- 'Զ' => 'զ',
441
- 'Է' => 'է',
442
- 'Ը' => 'ը',
443
- 'Թ' => 'թ',
444
- 'Ժ' => 'ժ',
445
- 'Ի' => 'ի',
446
- 'Լ' => 'լ',
447
- 'Խ' => 'խ',
448
- 'Ծ' => 'ծ',
449
- 'Կ' => 'կ',
450
- 'Հ' => 'հ',
451
- 'Ձ' => 'ձ',
452
- 'Ղ' => 'ղ',
453
- 'Ճ' => 'ճ',
454
- 'Մ' => 'մ',
455
- 'Յ' => 'յ',
456
- 'Ն' => 'ն',
457
- 'Շ' => 'շ',
458
- 'Ո' => 'ո',
459
- 'Չ' => 'չ',
460
- 'Պ' => 'պ',
461
- 'Ջ' => 'ջ',
462
- 'Ռ' => 'ռ',
463
- 'Ս' => 'ս',
464
- 'Վ' => 'վ',
465
- 'Տ' => 'տ',
466
- 'Ր' => 'ր',
467
- 'Ց' => 'ց',
468
- 'Ւ' => 'ւ',
469
- 'Փ' => 'փ',
470
- 'Ք' => 'ք',
471
- 'Օ' => 'օ',
472
- 'Ֆ' => 'ֆ',
473
- 'Ⴀ' => 'ⴀ',
474
- 'Ⴁ' => 'ⴁ',
475
- 'Ⴂ' => 'ⴂ',
476
- 'Ⴃ' => 'ⴃ',
477
- 'Ⴄ' => 'ⴄ',
478
- 'Ⴅ' => 'ⴅ',
479
- 'Ⴆ' => 'ⴆ',
480
- 'Ⴇ' => 'ⴇ',
481
- 'Ⴈ' => 'ⴈ',
482
- 'Ⴉ' => 'ⴉ',
483
- 'Ⴊ' => 'ⴊ',
484
- 'Ⴋ' => 'ⴋ',
485
- 'Ⴌ' => 'ⴌ',
486
- 'Ⴍ' => 'ⴍ',
487
- 'Ⴎ' => 'ⴎ',
488
- 'Ⴏ' => 'ⴏ',
489
- 'Ⴐ' => 'ⴐ',
490
- 'Ⴑ' => 'ⴑ',
491
- 'Ⴒ' => 'ⴒ',
492
- 'Ⴓ' => 'ⴓ',
493
- 'Ⴔ' => 'ⴔ',
494
- 'Ⴕ' => 'ⴕ',
495
- 'Ⴖ' => 'ⴖ',
496
- 'Ⴗ' => 'ⴗ',
497
- 'Ⴘ' => 'ⴘ',
498
- 'Ⴙ' => 'ⴙ',
499
- 'Ⴚ' => 'ⴚ',
500
- 'Ⴛ' => 'ⴛ',
501
- 'Ⴜ' => 'ⴜ',
502
- 'Ⴝ' => 'ⴝ',
503
- 'Ⴞ' => 'ⴞ',
504
- 'Ⴟ' => 'ⴟ',
505
- 'Ⴠ' => 'ⴠ',
506
- 'Ⴡ' => 'ⴡ',
507
- 'Ⴢ' => 'ⴢ',
508
- 'Ⴣ' => 'ⴣ',
509
- 'Ⴤ' => 'ⴤ',
510
- 'Ⴥ' => 'ⴥ',
511
- 'Ⴧ' => 'ⴧ',
512
- 'Ⴭ' => 'ⴭ',
513
- 'Ꭰ' => 'ꭰ',
514
- 'Ꭱ' => 'ꭱ',
515
- 'Ꭲ' => 'ꭲ',
516
- 'Ꭳ' => 'ꭳ',
517
- 'Ꭴ' => 'ꭴ',
518
- 'Ꭵ' => 'ꭵ',
519
- 'Ꭶ' => 'ꭶ',
520
- 'Ꭷ' => 'ꭷ',
521
- 'Ꭸ' => 'ꭸ',
522
- 'Ꭹ' => 'ꭹ',
523
- 'Ꭺ' => 'ꭺ',
524
- 'Ꭻ' => 'ꭻ',
525
- 'Ꭼ' => 'ꭼ',
526
- 'Ꭽ' => 'ꭽ',
527
- 'Ꭾ' => 'ꭾ',
528
- 'Ꭿ' => 'ꭿ',
529
- 'Ꮀ' => 'ꮀ',
530
- 'Ꮁ' => 'ꮁ',
531
- 'Ꮂ' => 'ꮂ',
532
- 'Ꮃ' => 'ꮃ',
533
- 'Ꮄ' => 'ꮄ',
534
- 'Ꮅ' => 'ꮅ',
535
- 'Ꮆ' => 'ꮆ',
536
- 'Ꮇ' => 'ꮇ',
537
- 'Ꮈ' => 'ꮈ',
538
- 'Ꮉ' => 'ꮉ',
539
- 'Ꮊ' => 'ꮊ',
540
- 'Ꮋ' => 'ꮋ',
541
- 'Ꮌ' => 'ꮌ',
542
- 'Ꮍ' => 'ꮍ',
543
- 'Ꮎ' => 'ꮎ',
544
- 'Ꮏ' => 'ꮏ',
545
- 'Ꮐ' => 'ꮐ',
546
- 'Ꮑ' => 'ꮑ',
547
- 'Ꮒ' => 'ꮒ',
548
- 'Ꮓ' => 'ꮓ',
549
- 'Ꮔ' => 'ꮔ',
550
- 'Ꮕ' => 'ꮕ',
551
- 'Ꮖ' => 'ꮖ',
552
- 'Ꮗ' => 'ꮗ',
553
- 'Ꮘ' => 'ꮘ',
554
- 'Ꮙ' => 'ꮙ',
555
- 'Ꮚ' => 'ꮚ',
556
- 'Ꮛ' => 'ꮛ',
557
- 'Ꮜ' => 'ꮜ',
558
- 'Ꮝ' => 'ꮝ',
559
- 'Ꮞ' => 'ꮞ',
560
- 'Ꮟ' => 'ꮟ',
561
- 'Ꮠ' => 'ꮠ',
562
- 'Ꮡ' => 'ꮡ',
563
- 'Ꮢ' => 'ꮢ',
564
- 'Ꮣ' => 'ꮣ',
565
- 'Ꮤ' => 'ꮤ',
566
- 'Ꮥ' => 'ꮥ',
567
- 'Ꮦ' => 'ꮦ',
568
- 'Ꮧ' => 'ꮧ',
569
- 'Ꮨ' => 'ꮨ',
570
- 'Ꮩ' => 'ꮩ',
571
- 'Ꮪ' => 'ꮪ',
572
- 'Ꮫ' => 'ꮫ',
573
- 'Ꮬ' => 'ꮬ',
574
- 'Ꮭ' => 'ꮭ',
575
- 'Ꮮ' => 'ꮮ',
576
- 'Ꮯ' => 'ꮯ',
577
- 'Ꮰ' => 'ꮰ',
578
- 'Ꮱ' => 'ꮱ',
579
- 'Ꮲ' => 'ꮲ',
580
- 'Ꮳ' => 'ꮳ',
581
- 'Ꮴ' => 'ꮴ',
582
- 'Ꮵ' => 'ꮵ',
583
- 'Ꮶ' => 'ꮶ',
584
- 'Ꮷ' => 'ꮷ',
585
- 'Ꮸ' => 'ꮸ',
586
- 'Ꮹ' => 'ꮹ',
587
- 'Ꮺ' => 'ꮺ',
588
- 'Ꮻ' => 'ꮻ',
589
- 'Ꮼ' => 'ꮼ',
590
- 'Ꮽ' => 'ꮽ',
591
- 'Ꮾ' => 'ꮾ',
592
- 'Ꮿ' => 'ꮿ',
593
- 'Ᏸ' => 'ᏸ',
594
- 'Ᏹ' => 'ᏹ',
595
- 'Ᏺ' => 'ᏺ',
596
- 'Ᏻ' => 'ᏻ',
597
- 'Ᏼ' => 'ᏼ',
598
- 'Ᏽ' => 'ᏽ',
599
- 'Ა' => 'ა',
600
- 'Ბ' => 'ბ',
601
- 'Გ' => 'გ',
602
- 'Დ' => 'დ',
603
- 'Ე' => 'ე',
604
- 'Ვ' => 'ვ',
605
- 'Ზ' => 'ზ',
606
- 'Თ' => 'თ',
607
- 'Ი' => 'ი',
608
- 'Კ' => 'კ',
609
- 'Ლ' => 'ლ',
610
- 'Მ' => 'მ',
611
- 'Ნ' => 'ნ',
612
- 'Ო' => 'ო',
613
- 'Პ' => 'პ',
614
- 'Ჟ' => 'ჟ',
615
- 'Რ' => 'რ',
616
- 'Ს' => 'ს',
617
- 'Ტ' => 'ტ',
618
- 'Უ' => 'უ',
619
- 'Ფ' => 'ფ',
620
- 'Ქ' => 'ქ',
621
- 'Ღ' => 'ღ',
622
- 'Ყ' => 'ყ',
623
- 'Შ' => 'შ',
624
- 'Ჩ' => 'ჩ',
625
- 'Ც' => 'ც',
626
- 'Ძ' => 'ძ',
627
- 'Წ' => 'წ',
628
- 'Ჭ' => 'ჭ',
629
- 'Ხ' => 'ხ',
630
- 'Ჯ' => 'ჯ',
631
- 'Ჰ' => 'ჰ',
632
- 'Ჱ' => 'ჱ',
633
- 'Ჲ' => 'ჲ',
634
- 'Ჳ' => 'ჳ',
635
- 'Ჴ' => 'ჴ',
636
- 'Ჵ' => 'ჵ',
637
- 'Ჶ' => 'ჶ',
638
- 'Ჷ' => 'ჷ',
639
- 'Ჸ' => 'ჸ',
640
- 'Ჹ' => 'ჹ',
641
- 'Ჺ' => 'ჺ',
642
- 'Ჽ' => 'ჽ',
643
- 'Ჾ' => 'ჾ',
644
- 'Ჿ' => 'ჿ',
645
- 'Ḁ' => 'ḁ',
646
- 'Ḃ' => 'ḃ',
647
- 'Ḅ' => 'ḅ',
648
- 'Ḇ' => 'ḇ',
649
- 'Ḉ' => 'ḉ',
650
- 'Ḋ' => 'ḋ',
651
- 'Ḍ' => 'ḍ',
652
- 'Ḏ' => 'ḏ',
653
- 'Ḑ' => 'ḑ',
654
- 'Ḓ' => 'ḓ',
655
- 'Ḕ' => 'ḕ',
656
- 'Ḗ' => 'ḗ',
657
- 'Ḙ' => 'ḙ',
658
- 'Ḛ' => 'ḛ',
659
- 'Ḝ' => 'ḝ',
660
- 'Ḟ' => 'ḟ',
661
- 'Ḡ' => 'ḡ',
662
- 'Ḣ' => 'ḣ',
663
- 'Ḥ' => 'ḥ',
664
- 'Ḧ' => 'ḧ',
665
- 'Ḩ' => 'ḩ',
666
- 'Ḫ' => 'ḫ',
667
- 'Ḭ' => 'ḭ',
668
- 'Ḯ' => 'ḯ',
669
- 'Ḱ' => 'ḱ',
670
- 'Ḳ' => 'ḳ',
671
- 'Ḵ' => 'ḵ',
672
- 'Ḷ' => 'ḷ',
673
- 'Ḹ' => 'ḹ',
674
- 'Ḻ' => 'ḻ',
675
- 'Ḽ' => 'ḽ',
676
- 'Ḿ' => 'ḿ',
677
- 'Ṁ' => 'ṁ',
678
- 'Ṃ' => 'ṃ',
679
- 'Ṅ' => 'ṅ',
680
- 'Ṇ' => 'ṇ',
681
- 'Ṉ' => 'ṉ',
682
- 'Ṋ' => 'ṋ',
683
- 'Ṍ' => 'ṍ',
684
- 'Ṏ' => 'ṏ',
685
- 'Ṑ' => 'ṑ',
686
- 'Ṓ' => 'ṓ',
687
- 'Ṕ' => 'ṕ',
688
- 'Ṗ' => 'ṗ',
689
- 'Ṙ' => 'ṙ',
690
- 'Ṛ' => 'ṛ',
691
- 'Ṝ' => 'ṝ',
692
- 'Ṟ' => 'ṟ',
693
- 'Ṡ' => 'ṡ',
694
- 'Ṣ' => 'ṣ',
695
- 'Ṥ' => 'ṥ',
696
- 'Ṧ' => 'ṧ',
697
- 'Ṩ' => 'ṩ',
698
- 'Ṫ' => 'ṫ',
699
- 'Ṭ' => 'ṭ',
700
- 'Ṯ' => 'ṯ',
701
- 'Ṱ' => 'ṱ',
702
- 'Ṳ' => 'ṳ',
703
- 'Ṵ' => 'ṵ',
704
- 'Ṷ' => 'ṷ',
705
- 'Ṹ' => 'ṹ',
706
- 'Ṻ' => 'ṻ',
707
- 'Ṽ' => 'ṽ',
708
- 'Ṿ' => 'ṿ',
709
- 'Ẁ' => 'ẁ',
710
- 'Ẃ' => 'ẃ',
711
- 'Ẅ' => 'ẅ',
712
- 'Ẇ' => 'ẇ',
713
- 'Ẉ' => 'ẉ',
714
- 'Ẋ' => 'ẋ',
715
- 'Ẍ' => 'ẍ',
716
- 'Ẏ' => 'ẏ',
717
- 'Ẑ' => 'ẑ',
718
- 'Ẓ' => 'ẓ',
719
- 'Ẕ' => 'ẕ',
720
- 'ẞ' => 'ß',
721
- 'Ạ' => 'ạ',
722
- 'Ả' => 'ả',
723
- 'Ấ' => 'ấ',
724
- 'Ầ' => 'ầ',
725
- 'Ẩ' => 'ẩ',
726
- 'Ẫ' => 'ẫ',
727
- 'Ậ' => 'ậ',
728
- 'Ắ' => 'ắ',
729
- 'Ằ' => 'ằ',
730
- 'Ẳ' => 'ẳ',
731
- 'Ẵ' => 'ẵ',
732
- 'Ặ' => 'ặ',
733
- 'Ẹ' => 'ẹ',
734
- 'Ẻ' => 'ẻ',
735
- 'Ẽ' => 'ẽ',
736
- 'Ế' => 'ế',
737
- 'Ề' => 'ề',
738
- 'Ể' => 'ể',
739
- 'Ễ' => 'ễ',
740
- 'Ệ' => 'ệ',
741
- 'Ỉ' => 'ỉ',
742
- 'Ị' => 'ị',
743
- 'Ọ' => 'ọ',
744
- 'Ỏ' => 'ỏ',
745
- 'Ố' => 'ố',
746
- 'Ồ' => 'ồ',
747
- 'Ổ' => 'ổ',
748
- 'Ỗ' => 'ỗ',
749
- 'Ộ' => 'ộ',
750
- 'Ớ' => 'ớ',
751
- 'Ờ' => 'ờ',
752
- 'Ở' => 'ở',
753
- 'Ỡ' => 'ỡ',
754
- 'Ợ' => 'ợ',
755
- 'Ụ' => 'ụ',
756
- 'Ủ' => 'ủ',
757
- 'Ứ' => 'ứ',
758
- 'Ừ' => 'ừ',
759
- 'Ử' => 'ử',
760
- 'Ữ' => 'ữ',
761
- 'Ự' => 'ự',
762
- 'Ỳ' => 'ỳ',
763
- 'Ỵ' => 'ỵ',
764
- 'Ỷ' => 'ỷ',
765
- 'Ỹ' => 'ỹ',
766
- 'Ỻ' => 'ỻ',
767
- 'Ỽ' => 'ỽ',
768
- 'Ỿ' => 'ỿ',
769
- 'Ἀ' => 'ἀ',
770
- 'Ἁ' => 'ἁ',
771
- 'Ἂ' => 'ἂ',
772
- 'Ἃ' => 'ἃ',
773
- 'Ἄ' => 'ἄ',
774
- 'Ἅ' => 'ἅ',
775
- 'Ἆ' => 'ἆ',
776
- 'Ἇ' => 'ἇ',
777
- 'Ἐ' => 'ἐ',
778
- 'Ἑ' => 'ἑ',
779
- 'Ἒ' => 'ἒ',
780
- 'Ἓ' => 'ἓ',
781
- 'Ἔ' => 'ἔ',
782
- 'Ἕ' => 'ἕ',
783
- 'Ἠ' => 'ἠ',
784
- 'Ἡ' => 'ἡ',
785
- 'Ἢ' => 'ἢ',
786
- 'Ἣ' => 'ἣ',
787
- 'Ἤ' => 'ἤ',
788
- 'Ἥ' => 'ἥ',
789
- 'Ἦ' => 'ἦ',
790
- 'Ἧ' => 'ἧ',
791
- 'Ἰ' => 'ἰ',
792
- 'Ἱ' => 'ἱ',
793
- 'Ἲ' => 'ἲ',
794
- 'Ἳ' => 'ἳ',
795
- 'Ἴ' => 'ἴ',
796
- 'Ἵ' => 'ἵ',
797
- 'Ἶ' => 'ἶ',
798
- 'Ἷ' => 'ἷ',
799
- 'Ὀ' => 'ὀ',
800
- 'Ὁ' => 'ὁ',
801
- 'Ὂ' => 'ὂ',
802
- 'Ὃ' => 'ὃ',
803
- 'Ὄ' => 'ὄ',
804
- 'Ὅ' => 'ὅ',
805
- 'Ὑ' => 'ὑ',
806
- 'Ὓ' => 'ὓ',
807
- 'Ὕ' => 'ὕ',
808
- 'Ὗ' => 'ὗ',
809
- 'Ὠ' => 'ὠ',
810
- 'Ὡ' => 'ὡ',
811
- 'Ὢ' => 'ὢ',
812
- 'Ὣ' => 'ὣ',
813
- 'Ὤ' => 'ὤ',
814
- 'Ὥ' => 'ὥ',
815
- 'Ὦ' => 'ὦ',
816
- 'Ὧ' => 'ὧ',
817
- 'ᾈ' => 'ᾀ',
818
- 'ᾉ' => 'ᾁ',
819
- 'ᾊ' => 'ᾂ',
820
- 'ᾋ' => 'ᾃ',
821
- 'ᾌ' => 'ᾄ',
822
- 'ᾍ' => 'ᾅ',
823
- 'ᾎ' => 'ᾆ',
824
- 'ᾏ' => 'ᾇ',
825
- 'ᾘ' => 'ᾐ',
826
- 'ᾙ' => 'ᾑ',
827
- 'ᾚ' => 'ᾒ',
828
- 'ᾛ' => 'ᾓ',
829
- 'ᾜ' => 'ᾔ',
830
- 'ᾝ' => 'ᾕ',
831
- 'ᾞ' => 'ᾖ',
832
- 'ᾟ' => 'ᾗ',
833
- 'ᾨ' => 'ᾠ',
834
- 'ᾩ' => 'ᾡ',
835
- 'ᾪ' => 'ᾢ',
836
- 'ᾫ' => 'ᾣ',
837
- 'ᾬ' => 'ᾤ',
838
- 'ᾭ' => 'ᾥ',
839
- 'ᾮ' => 'ᾦ',
840
- 'ᾯ' => 'ᾧ',
841
- 'Ᾰ' => 'ᾰ',
842
- 'Ᾱ' => 'ᾱ',
843
- 'Ὰ' => 'ὰ',
844
- 'Ά' => 'ά',
845
- 'ᾼ' => 'ᾳ',
846
- 'Ὲ' => 'ὲ',
847
- 'Έ' => 'έ',
848
- 'Ὴ' => 'ὴ',
849
- 'Ή' => 'ή',
850
- 'ῌ' => 'ῃ',
851
- 'Ῐ' => 'ῐ',
852
- 'Ῑ' => 'ῑ',
853
- 'Ὶ' => 'ὶ',
854
- 'Ί' => 'ί',
855
- 'Ῠ' => 'ῠ',
856
- 'Ῡ' => 'ῡ',
857
- 'Ὺ' => 'ὺ',
858
- 'Ύ' => 'ύ',
859
- 'Ῥ' => 'ῥ',
860
- 'Ὸ' => 'ὸ',
861
- 'Ό' => 'ό',
862
- 'Ὼ' => 'ὼ',
863
- 'Ώ' => 'ώ',
864
- 'ῼ' => 'ῳ',
865
- 'Ω' => 'ω',
866
- 'K' => 'k',
867
- 'Å' => 'å',
868
- 'Ⅎ' => 'ⅎ',
869
- 'Ⅰ' => 'ⅰ',
870
- 'Ⅱ' => 'ⅱ',
871
- 'Ⅲ' => 'ⅲ',
872
- 'Ⅳ' => 'ⅳ',
873
- 'Ⅴ' => 'ⅴ',
874
- 'Ⅵ' => 'ⅵ',
875
- 'Ⅶ' => 'ⅶ',
876
- 'Ⅷ' => 'ⅷ',
877
- 'Ⅸ' => 'ⅸ',
878
- 'Ⅹ' => 'ⅹ',
879
- 'Ⅺ' => 'ⅺ',
880
- 'Ⅻ' => 'ⅻ',
881
- 'Ⅼ' => 'ⅼ',
882
- 'Ⅽ' => 'ⅽ',
883
- 'Ⅾ' => 'ⅾ',
884
- 'Ⅿ' => 'ⅿ',
885
- 'Ↄ' => 'ↄ',
886
- 'Ⓐ' => 'ⓐ',
887
- 'Ⓑ' => 'ⓑ',
888
- 'Ⓒ' => 'ⓒ',
889
- 'Ⓓ' => 'ⓓ',
890
- 'Ⓔ' => 'ⓔ',
891
- 'Ⓕ' => 'ⓕ',
892
- 'Ⓖ' => 'ⓖ',
893
- 'Ⓗ' => 'ⓗ',
894
- 'Ⓘ' => 'ⓘ',
895
- 'Ⓙ' => 'ⓙ',
896
- 'Ⓚ' => 'ⓚ',
897
- 'Ⓛ' => 'ⓛ',
898
- 'Ⓜ' => 'ⓜ',
899
- 'Ⓝ' => 'ⓝ',
900
- 'Ⓞ' => 'ⓞ',
901
- 'Ⓟ' => 'ⓟ',
902
- 'Ⓠ' => 'ⓠ',
903
- 'Ⓡ' => 'ⓡ',
904
- 'Ⓢ' => 'ⓢ',
905
- 'Ⓣ' => 'ⓣ',
906
- 'Ⓤ' => 'ⓤ',
907
- 'Ⓥ' => 'ⓥ',
908
- 'Ⓦ' => 'ⓦ',
909
- 'Ⓧ' => 'ⓧ',
910
- 'Ⓨ' => 'ⓨ',
911
- 'Ⓩ' => 'ⓩ',
912
- 'Ⰰ' => 'ⰰ',
913
- 'Ⰱ' => 'ⰱ',
914
- 'Ⰲ' => 'ⰲ',
915
- 'Ⰳ' => 'ⰳ',
916
- 'Ⰴ' => 'ⰴ',
917
- 'Ⰵ' => 'ⰵ',
918
- 'Ⰶ' => 'ⰶ',
919
- 'Ⰷ' => 'ⰷ',
920
- 'Ⰸ' => 'ⰸ',
921
- 'Ⰹ' => 'ⰹ',
922
- 'Ⰺ' => 'ⰺ',
923
- 'Ⰻ' => 'ⰻ',
924
- 'Ⰼ' => 'ⰼ',
925
- 'Ⰽ' => 'ⰽ',
926
- 'Ⰾ' => 'ⰾ',
927
- 'Ⰿ' => 'ⰿ',
928
- 'Ⱀ' => 'ⱀ',
929
- 'Ⱁ' => 'ⱁ',
930
- 'Ⱂ' => 'ⱂ',
931
- 'Ⱃ' => 'ⱃ',
932
- 'Ⱄ' => 'ⱄ',
933
- 'Ⱅ' => 'ⱅ',
934
- 'Ⱆ' => 'ⱆ',
935
- 'Ⱇ' => 'ⱇ',
936
- 'Ⱈ' => 'ⱈ',
937
- 'Ⱉ' => 'ⱉ',
938
- 'Ⱊ' => 'ⱊ',
939
- 'Ⱋ' => 'ⱋ',
940
- 'Ⱌ' => 'ⱌ',
941
- 'Ⱍ' => 'ⱍ',
942
- 'Ⱎ' => 'ⱎ',
943
- 'Ⱏ' => 'ⱏ',
944
- 'Ⱐ' => 'ⱐ',
945
- 'Ⱑ' => 'ⱑ',
946
- 'Ⱒ' => 'ⱒ',
947
- 'Ⱓ' => 'ⱓ',
948
- 'Ⱔ' => 'ⱔ',
949
- 'Ⱕ' => 'ⱕ',
950
- 'Ⱖ' => 'ⱖ',
951
- 'Ⱗ' => 'ⱗ',
952
- 'Ⱘ' => 'ⱘ',
953
- 'Ⱙ' => 'ⱙ',
954
- 'Ⱚ' => 'ⱚ',
955
- 'Ⱛ' => 'ⱛ',
956
- 'Ⱜ' => 'ⱜ',
957
- 'Ⱝ' => 'ⱝ',
958
- 'Ⱞ' => 'ⱞ',
959
- 'Ⱡ' => 'ⱡ',
960
- 'Ɫ' => 'ɫ',
961
- 'Ᵽ' => 'ᵽ',
962
- 'Ɽ' => 'ɽ',
963
- 'Ⱨ' => 'ⱨ',
964
- 'Ⱪ' => 'ⱪ',
965
- 'Ⱬ' => 'ⱬ',
966
- 'Ɑ' => 'ɑ',
967
- 'Ɱ' => 'ɱ',
968
- 'Ɐ' => 'ɐ',
969
- 'Ɒ' => 'ɒ',
970
- 'Ⱳ' => 'ⱳ',
971
- 'Ⱶ' => 'ⱶ',
972
- 'Ȿ' => 'ȿ',
973
- 'Ɀ' => 'ɀ',
974
- 'Ⲁ' => 'ⲁ',
975
- 'Ⲃ' => 'ⲃ',
976
- 'Ⲅ' => 'ⲅ',
977
- 'Ⲇ' => 'ⲇ',
978
- 'Ⲉ' => 'ⲉ',
979
- 'Ⲋ' => 'ⲋ',
980
- 'Ⲍ' => 'ⲍ',
981
- 'Ⲏ' => 'ⲏ',
982
- 'Ⲑ' => 'ⲑ',
983
- 'Ⲓ' => 'ⲓ',
984
- 'Ⲕ' => 'ⲕ',
985
- 'Ⲗ' => 'ⲗ',
986
- 'Ⲙ' => 'ⲙ',
987
- 'Ⲛ' => 'ⲛ',
988
- 'Ⲝ' => 'ⲝ',
989
- 'Ⲟ' => 'ⲟ',
990
- 'Ⲡ' => 'ⲡ',
991
- 'Ⲣ' => 'ⲣ',
992
- 'Ⲥ' => 'ⲥ',
993
- 'Ⲧ' => 'ⲧ',
994
- 'Ⲩ' => 'ⲩ',
995
- 'Ⲫ' => 'ⲫ',
996
- 'Ⲭ' => 'ⲭ',
997
- 'Ⲯ' => 'ⲯ',
998
- 'Ⲱ' => 'ⲱ',
999
- 'Ⲳ' => 'ⲳ',
1000
- 'Ⲵ' => 'ⲵ',
1001
- 'Ⲷ' => 'ⲷ',
1002
- 'Ⲹ' => 'ⲹ',
1003
- 'Ⲻ' => 'ⲻ',
1004
- 'Ⲽ' => 'ⲽ',
1005
- 'Ⲿ' => 'ⲿ',
1006
- 'Ⳁ' => 'ⳁ',
1007
- 'Ⳃ' => 'ⳃ',
1008
- 'Ⳅ' => 'ⳅ',
1009
- 'Ⳇ' => 'ⳇ',
1010
- 'Ⳉ' => 'ⳉ',
1011
- 'Ⳋ' => 'ⳋ',
1012
- 'Ⳍ' => 'ⳍ',
1013
- 'Ⳏ' => 'ⳏ',
1014
- 'Ⳑ' => 'ⳑ',
1015
- 'Ⳓ' => 'ⳓ',
1016
- 'Ⳕ' => 'ⳕ',
1017
- 'Ⳗ' => 'ⳗ',
1018
- 'Ⳙ' => 'ⳙ',
1019
- 'Ⳛ' => 'ⳛ',
1020
- 'Ⳝ' => 'ⳝ',
1021
- 'Ⳟ' => 'ⳟ',
1022
- 'Ⳡ' => 'ⳡ',
1023
- 'Ⳣ' => 'ⳣ',
1024
- 'Ⳬ' => 'ⳬ',
1025
- 'Ⳮ' => 'ⳮ',
1026
- 'Ⳳ' => 'ⳳ',
1027
- 'Ꙁ' => 'ꙁ',
1028
- 'Ꙃ' => 'ꙃ',
1029
- 'Ꙅ' => 'ꙅ',
1030
- 'Ꙇ' => 'ꙇ',
1031
- 'Ꙉ' => 'ꙉ',
1032
- 'Ꙋ' => 'ꙋ',
1033
- 'Ꙍ' => 'ꙍ',
1034
- 'Ꙏ' => 'ꙏ',
1035
- 'Ꙑ' => 'ꙑ',
1036
- 'Ꙓ' => 'ꙓ',
1037
- 'Ꙕ' => 'ꙕ',
1038
- 'Ꙗ' => 'ꙗ',
1039
- 'Ꙙ' => 'ꙙ',
1040
- 'Ꙛ' => 'ꙛ',
1041
- 'Ꙝ' => 'ꙝ',
1042
- 'Ꙟ' => 'ꙟ',
1043
- 'Ꙡ' => 'ꙡ',
1044
- 'Ꙣ' => 'ꙣ',
1045
- 'Ꙥ' => 'ꙥ',
1046
- 'Ꙧ' => 'ꙧ',
1047
- 'Ꙩ' => 'ꙩ',
1048
- 'Ꙫ' => 'ꙫ',
1049
- 'Ꙭ' => 'ꙭ',
1050
- 'Ꚁ' => 'ꚁ',
1051
- 'Ꚃ' => 'ꚃ',
1052
- 'Ꚅ' => 'ꚅ',
1053
- 'Ꚇ' => 'ꚇ',
1054
- 'Ꚉ' => 'ꚉ',
1055
- 'Ꚋ' => 'ꚋ',
1056
- 'Ꚍ' => 'ꚍ',
1057
- 'Ꚏ' => 'ꚏ',
1058
- 'Ꚑ' => 'ꚑ',
1059
- 'Ꚓ' => 'ꚓ',
1060
- 'Ꚕ' => 'ꚕ',
1061
- 'Ꚗ' => 'ꚗ',
1062
- 'Ꚙ' => 'ꚙ',
1063
- 'Ꚛ' => 'ꚛ',
1064
- 'Ꜣ' => 'ꜣ',
1065
- 'Ꜥ' => 'ꜥ',
1066
- 'Ꜧ' => 'ꜧ',
1067
- 'Ꜩ' => 'ꜩ',
1068
- 'Ꜫ' => 'ꜫ',
1069
- 'Ꜭ' => 'ꜭ',
1070
- 'Ꜯ' => 'ꜯ',
1071
- 'Ꜳ' => 'ꜳ',
1072
- 'Ꜵ' => 'ꜵ',
1073
- 'Ꜷ' => 'ꜷ',
1074
- 'Ꜹ' => 'ꜹ',
1075
- 'Ꜻ' => 'ꜻ',
1076
- 'Ꜽ' => 'ꜽ',
1077
- 'Ꜿ' => 'ꜿ',
1078
- 'Ꝁ' => 'ꝁ',
1079
- 'Ꝃ' => 'ꝃ',
1080
- 'Ꝅ' => 'ꝅ',
1081
- 'Ꝇ' => 'ꝇ',
1082
- 'Ꝉ' => 'ꝉ',
1083
- 'Ꝋ' => 'ꝋ',
1084
- 'Ꝍ' => 'ꝍ',
1085
- 'Ꝏ' => 'ꝏ',
1086
- 'Ꝑ' => 'ꝑ',
1087
- 'Ꝓ' => 'ꝓ',
1088
- 'Ꝕ' => 'ꝕ',
1089
- 'Ꝗ' => 'ꝗ',
1090
- 'Ꝙ' => 'ꝙ',
1091
- 'Ꝛ' => 'ꝛ',
1092
- 'Ꝝ' => 'ꝝ',
1093
- 'Ꝟ' => 'ꝟ',
1094
- 'Ꝡ' => 'ꝡ',
1095
- 'Ꝣ' => 'ꝣ',
1096
- 'Ꝥ' => 'ꝥ',
1097
- 'Ꝧ' => 'ꝧ',
1098
- 'Ꝩ' => 'ꝩ',
1099
- 'Ꝫ' => 'ꝫ',
1100
- 'Ꝭ' => 'ꝭ',
1101
- 'Ꝯ' => 'ꝯ',
1102
- 'Ꝺ' => 'ꝺ',
1103
- 'Ꝼ' => 'ꝼ',
1104
- 'Ᵹ' => 'ᵹ',
1105
- 'Ꝿ' => 'ꝿ',
1106
- 'Ꞁ' => 'ꞁ',
1107
- 'Ꞃ' => 'ꞃ',
1108
- 'Ꞅ' => 'ꞅ',
1109
- 'Ꞇ' => 'ꞇ',
1110
- 'Ꞌ' => 'ꞌ',
1111
- 'Ɥ' => 'ɥ',
1112
- 'Ꞑ' => 'ꞑ',
1113
- 'Ꞓ' => 'ꞓ',
1114
- 'Ꞗ' => 'ꞗ',
1115
- 'Ꞙ' => 'ꞙ',
1116
- 'Ꞛ' => 'ꞛ',
1117
- 'Ꞝ' => 'ꞝ',
1118
- 'Ꞟ' => 'ꞟ',
1119
- 'Ꞡ' => 'ꞡ',
1120
- 'Ꞣ' => 'ꞣ',
1121
- 'Ꞥ' => 'ꞥ',
1122
- 'Ꞧ' => 'ꞧ',
1123
- 'Ꞩ' => 'ꞩ',
1124
- 'Ɦ' => 'ɦ',
1125
- 'Ɜ' => 'ɜ',
1126
- 'Ɡ' => 'ɡ',
1127
- 'Ɬ' => 'ɬ',
1128
- 'Ɪ' => 'ɪ',
1129
- 'Ʞ' => 'ʞ',
1130
- 'Ʇ' => 'ʇ',
1131
- 'Ʝ' => 'ʝ',
1132
- 'Ꭓ' => 'ꭓ',
1133
- 'Ꞵ' => 'ꞵ',
1134
- 'Ꞷ' => 'ꞷ',
1135
- 'Ꞹ' => 'ꞹ',
1136
- 'Ꞻ' => 'ꞻ',
1137
- 'Ꞽ' => 'ꞽ',
1138
- 'Ꞿ' => 'ꞿ',
1139
- 'Ꟃ' => 'ꟃ',
1140
- 'Ꞔ' => 'ꞔ',
1141
- 'Ʂ' => 'ʂ',
1142
- 'Ᶎ' => 'ᶎ',
1143
- 'Ꟈ' => 'ꟈ',
1144
- 'Ꟊ' => 'ꟊ',
1145
- 'Ꟶ' => 'ꟶ',
1146
- 'A' => 'a',
1147
- 'B' => 'b',
1148
- 'C' => 'c',
1149
- 'D' => 'd',
1150
- 'E' => 'e',
1151
- 'F' => 'f',
1152
- 'G' => 'g',
1153
- 'H' => 'h',
1154
- 'I' => 'i',
1155
- 'J' => 'j',
1156
- 'K' => 'k',
1157
- 'L' => 'l',
1158
- 'M' => 'm',
1159
- 'N' => 'n',
1160
- 'O' => 'o',
1161
- 'P' => 'p',
1162
- 'Q' => 'q',
1163
- 'R' => 'r',
1164
- 'S' => 's',
1165
- 'T' => 't',
1166
- 'U' => 'u',
1167
- 'V' => 'v',
1168
- 'W' => 'w',
1169
- 'X' => 'x',
1170
- 'Y' => 'y',
1171
- 'Z' => 'z',
1172
- '𐐀' => '𐐨',
1173
- '𐐁' => '𐐩',
1174
- '𐐂' => '𐐪',
1175
- '𐐃' => '𐐫',
1176
- '𐐄' => '𐐬',
1177
- '𐐅' => '𐐭',
1178
- '𐐆' => '𐐮',
1179
- '𐐇' => '𐐯',
1180
- '𐐈' => '𐐰',
1181
- '𐐉' => '𐐱',
1182
- '𐐊' => '𐐲',
1183
- '𐐋' => '𐐳',
1184
- '𐐌' => '𐐴',
1185
- '𐐍' => '𐐵',
1186
- '𐐎' => '𐐶',
1187
- '𐐏' => '𐐷',
1188
- '𐐐' => '𐐸',
1189
- '𐐑' => '𐐹',
1190
- '𐐒' => '𐐺',
1191
- '𐐓' => '𐐻',
1192
- '𐐔' => '𐐼',
1193
- '𐐕' => '𐐽',
1194
- '𐐖' => '𐐾',
1195
- '𐐗' => '𐐿',
1196
- '𐐘' => '𐑀',
1197
- '𐐙' => '𐑁',
1198
- '𐐚' => '𐑂',
1199
- '𐐛' => '𐑃',
1200
- '𐐜' => '𐑄',
1201
- '𐐝' => '𐑅',
1202
- '𐐞' => '𐑆',
1203
- '𐐟' => '𐑇',
1204
- '𐐠' => '𐑈',
1205
- '𐐡' => '𐑉',
1206
- '𐐢' => '𐑊',
1207
- '𐐣' => '𐑋',
1208
- '𐐤' => '𐑌',
1209
- '𐐥' => '𐑍',
1210
- '𐐦' => '𐑎',
1211
- '𐐧' => '𐑏',
1212
- '𐒰' => '𐓘',
1213
- '𐒱' => '𐓙',
1214
- '𐒲' => '𐓚',
1215
- '𐒳' => '𐓛',
1216
- '𐒴' => '𐓜',
1217
- '𐒵' => '𐓝',
1218
- '𐒶' => '𐓞',
1219
- '𐒷' => '𐓟',
1220
- '𐒸' => '𐓠',
1221
- '𐒹' => '𐓡',
1222
- '𐒺' => '𐓢',
1223
- '𐒻' => '𐓣',
1224
- '𐒼' => '𐓤',
1225
- '𐒽' => '𐓥',
1226
- '𐒾' => '𐓦',
1227
- '𐒿' => '𐓧',
1228
- '𐓀' => '𐓨',
1229
- '𐓁' => '𐓩',
1230
- '𐓂' => '𐓪',
1231
- '𐓃' => '𐓫',
1232
- '𐓄' => '𐓬',
1233
- '𐓅' => '𐓭',
1234
- '𐓆' => '𐓮',
1235
- '𐓇' => '𐓯',
1236
- '𐓈' => '𐓰',
1237
- '𐓉' => '𐓱',
1238
- '𐓊' => '𐓲',
1239
- '𐓋' => '𐓳',
1240
- '𐓌' => '𐓴',
1241
- '𐓍' => '𐓵',
1242
- '𐓎' => '𐓶',
1243
- '𐓏' => '𐓷',
1244
- '𐓐' => '𐓸',
1245
- '𐓑' => '𐓹',
1246
- '𐓒' => '𐓺',
1247
- '𐓓' => '𐓻',
1248
- '𐲀' => '𐳀',
1249
- '𐲁' => '𐳁',
1250
- '𐲂' => '𐳂',
1251
- '𐲃' => '𐳃',
1252
- '𐲄' => '𐳄',
1253
- '𐲅' => '𐳅',
1254
- '𐲆' => '𐳆',
1255
- '𐲇' => '𐳇',
1256
- '𐲈' => '𐳈',
1257
- '𐲉' => '𐳉',
1258
- '𐲊' => '𐳊',
1259
- '𐲋' => '𐳋',
1260
- '𐲌' => '𐳌',
1261
- '𐲍' => '𐳍',
1262
- '𐲎' => '𐳎',
1263
- '𐲏' => '𐳏',
1264
- '𐲐' => '𐳐',
1265
- '𐲑' => '𐳑',
1266
- '𐲒' => '𐳒',
1267
- '𐲓' => '𐳓',
1268
- '𐲔' => '𐳔',
1269
- '𐲕' => '𐳕',
1270
- '𐲖' => '𐳖',
1271
- '𐲗' => '𐳗',
1272
- '𐲘' => '𐳘',
1273
- '𐲙' => '𐳙',
1274
- '𐲚' => '𐳚',
1275
- '𐲛' => '𐳛',
1276
- '𐲜' => '𐳜',
1277
- '𐲝' => '𐳝',
1278
- '𐲞' => '𐳞',
1279
- '𐲟' => '𐳟',
1280
- '𐲠' => '𐳠',
1281
- '𐲡' => '𐳡',
1282
- '𐲢' => '𐳢',
1283
- '𐲣' => '𐳣',
1284
- '𐲤' => '𐳤',
1285
- '𐲥' => '𐳥',
1286
- '𐲦' => '𐳦',
1287
- '𐲧' => '𐳧',
1288
- '𐲨' => '𐳨',
1289
- '𐲩' => '𐳩',
1290
- '𐲪' => '𐳪',
1291
- '𐲫' => '𐳫',
1292
- '𐲬' => '𐳬',
1293
- '𐲭' => '𐳭',
1294
- '𐲮' => '𐳮',
1295
- '𐲯' => '𐳯',
1296
- '𐲰' => '𐳰',
1297
- '𐲱' => '𐳱',
1298
- '𐲲' => '𐳲',
1299
- '𑢠' => '𑣀',
1300
- '𑢡' => '𑣁',
1301
- '𑢢' => '𑣂',
1302
- '𑢣' => '𑣃',
1303
- '𑢤' => '𑣄',
1304
- '𑢥' => '𑣅',
1305
- '𑢦' => '𑣆',
1306
- '𑢧' => '𑣇',
1307
- '𑢨' => '𑣈',
1308
- '𑢩' => '𑣉',
1309
- '𑢪' => '𑣊',
1310
- '𑢫' => '𑣋',
1311
- '𑢬' => '𑣌',
1312
- '𑢭' => '𑣍',
1313
- '𑢮' => '𑣎',
1314
- '𑢯' => '𑣏',
1315
- '𑢰' => '𑣐',
1316
- '𑢱' => '𑣑',
1317
- '𑢲' => '𑣒',
1318
- '𑢳' => '𑣓',
1319
- '𑢴' => '𑣔',
1320
- '𑢵' => '𑣕',
1321
- '𑢶' => '𑣖',
1322
- '𑢷' => '𑣗',
1323
- '𑢸' => '𑣘',
1324
- '𑢹' => '𑣙',
1325
- '𑢺' => '𑣚',
1326
- '𑢻' => '𑣛',
1327
- '𑢼' => '𑣜',
1328
- '𑢽' => '𑣝',
1329
- '𑢾' => '𑣞',
1330
- '𑢿' => '𑣟',
1331
- '𖹀' => '𖹠',
1332
- '𖹁' => '𖹡',
1333
- '𖹂' => '𖹢',
1334
- '𖹃' => '𖹣',
1335
- '𖹄' => '𖹤',
1336
- '𖹅' => '𖹥',
1337
- '𖹆' => '𖹦',
1338
- '𖹇' => '𖹧',
1339
- '𖹈' => '𖹨',
1340
- '𖹉' => '𖹩',
1341
- '𖹊' => '𖹪',
1342
- '𖹋' => '𖹫',
1343
- '𖹌' => '𖹬',
1344
- '𖹍' => '𖹭',
1345
- '𖹎' => '𖹮',
1346
- '𖹏' => '𖹯',
1347
- '𖹐' => '𖹰',
1348
- '𖹑' => '𖹱',
1349
- '𖹒' => '𖹲',
1350
- '𖹓' => '𖹳',
1351
- '𖹔' => '𖹴',
1352
- '𖹕' => '𖹵',
1353
- '𖹖' => '𖹶',
1354
- '𖹗' => '𖹷',
1355
- '𖹘' => '𖹸',
1356
- '𖹙' => '𖹹',
1357
- '𖹚' => '𖹺',
1358
- '𖹛' => '𖹻',
1359
- '𖹜' => '𖹼',
1360
- '𖹝' => '𖹽',
1361
- '𖹞' => '𖹾',
1362
- '𖹟' => '𖹿',
1363
- '𞤀' => '𞤢',
1364
- '𞤁' => '𞤣',
1365
- '𞤂' => '𞤤',
1366
- '𞤃' => '𞤥',
1367
- '𞤄' => '𞤦',
1368
- '𞤅' => '𞤧',
1369
- '𞤆' => '𞤨',
1370
- '𞤇' => '𞤩',
1371
- '𞤈' => '𞤪',
1372
- '𞤉' => '𞤫',
1373
- '𞤊' => '𞤬',
1374
- '𞤋' => '𞤭',
1375
- '𞤌' => '𞤮',
1376
- '𞤍' => '𞤯',
1377
- '𞤎' => '𞤰',
1378
- '𞤏' => '𞤱',
1379
- '𞤐' => '𞤲',
1380
- '𞤑' => '𞤳',
1381
- '𞤒' => '𞤴',
1382
- '𞤓' => '𞤵',
1383
- '𞤔' => '𞤶',
1384
- '𞤕' => '𞤷',
1385
- '𞤖' => '𞤸',
1386
- '𞤗' => '𞤹',
1387
- '𞤘' => '𞤺',
1388
- '𞤙' => '𞤻',
1389
- '𞤚' => '𞤼',
1390
- '𞤛' => '𞤽',
1391
- '𞤜' => '𞤾',
1392
- '𞤝' => '𞤿',
1393
- '𞤞' => '𞥀',
1394
- '𞤟' => '𞥁',
1395
- '𞤠' => '𞥂',
1396
- '𞤡' => '𞥃',
1397
- );
1
+ <?php
2
+
3
+ return array (
4
+ 'A' => 'a',
5
+ 'B' => 'b',
6
+ 'C' => 'c',
7
+ 'D' => 'd',
8
+ 'E' => 'e',
9
+ 'F' => 'f',
10
+ 'G' => 'g',
11
+ 'H' => 'h',
12
+ 'I' => 'i',
13
+ 'J' => 'j',
14
+ 'K' => 'k',
15
+ 'L' => 'l',
16
+ 'M' => 'm',
17
+ 'N' => 'n',
18
+ 'O' => 'o',
19
+ 'P' => 'p',
20
+ 'Q' => 'q',
21
+ 'R' => 'r',
22
+ 'S' => 's',
23
+ 'T' => 't',
24
+ 'U' => 'u',
25
+ 'V' => 'v',
26
+ 'W' => 'w',
27
+ 'X' => 'x',
28
+ 'Y' => 'y',
29
+ 'Z' => 'z',
30
+ 'À' => 'à',
31
+ 'Á' => 'á',
32
+ 'Â' => 'â',
33
+ 'Ã' => 'ã',
34
+ 'Ä' => 'ä',
35
+ 'Å' => 'å',
36
+ 'Æ' => 'æ',
37
+ 'Ç' => 'ç',
38
+ 'È' => 'è',
39
+ 'É' => 'é',
40
+ 'Ê' => 'ê',
41
+ 'Ë' => 'ë',
42
+ 'Ì' => 'ì',
43
+ 'Í' => 'í',
44
+ 'Î' => 'î',
45
+ 'Ï' => 'ï',
46
+ 'Ð' => 'ð',
47
+ 'Ñ' => 'ñ',
48
+ 'Ò' => 'ò',
49
+ 'Ó' => 'ó',
50
+ 'Ô' => 'ô',
51
+ 'Õ' => 'õ',
52
+ 'Ö' => 'ö',
53
+ 'Ø' => 'ø',
54
+ 'Ù' => 'ù',
55
+ 'Ú' => 'ú',
56
+ 'Û' => 'û',
57
+ 'Ü' => 'ü',
58
+ 'Ý' => 'ý',
59
+ 'Þ' => 'þ',
60
+ 'Ā' => 'ā',
61
+ 'Ă' => 'ă',
62
+ 'Ą' => 'ą',
63
+ 'Ć' => 'ć',
64
+ 'Ĉ' => 'ĉ',
65
+ 'Ċ' => 'ċ',
66
+ 'Č' => 'č',
67
+ 'Ď' => 'ď',
68
+ 'Đ' => 'đ',
69
+ 'Ē' => 'ē',
70
+ 'Ĕ' => 'ĕ',
71
+ 'Ė' => 'ė',
72
+ 'Ę' => 'ę',
73
+ 'Ě' => 'ě',
74
+ 'Ĝ' => 'ĝ',
75
+ 'Ğ' => 'ğ',
76
+ 'Ġ' => 'ġ',
77
+ 'Ģ' => 'ģ',
78
+ 'Ĥ' => 'ĥ',
79
+ 'Ħ' => 'ħ',
80
+ 'Ĩ' => 'ĩ',
81
+ 'Ī' => 'ī',
82
+ 'Ĭ' => 'ĭ',
83
+ 'Į' => 'į',
84
+ 'İ' => 'i',
85
+ 'IJ' => 'ij',
86
+ 'Ĵ' => 'ĵ',
87
+ 'Ķ' => 'ķ',
88
+ 'Ĺ' => 'ĺ',
89
+ 'Ļ' => 'ļ',
90
+ 'Ľ' => 'ľ',
91
+ 'Ŀ' => 'ŀ',
92
+ 'Ł' => 'ł',
93
+ 'Ń' => 'ń',
94
+ 'Ņ' => 'ņ',
95
+ 'Ň' => 'ň',
96
+ 'Ŋ' => 'ŋ',
97
+ 'Ō' => 'ō',
98
+ 'Ŏ' => 'ŏ',
99
+ 'Ő' => 'ő',
100
+ 'Œ' => 'œ',
101
+ 'Ŕ' => 'ŕ',
102
+ 'Ŗ' => 'ŗ',
103
+ 'Ř' => 'ř',
104
+ 'Ś' => 'ś',
105
+ 'Ŝ' => 'ŝ',
106
+ 'Ş' => 'ş',
107
+ 'Š' => 'š',
108
+ 'Ţ' => 'ţ',
109
+ 'Ť' => 'ť',
110
+ 'Ŧ' => 'ŧ',
111
+ 'Ũ' => 'ũ',
112
+ 'Ū' => 'ū',
113
+ 'Ŭ' => 'ŭ',
114
+ 'Ů' => 'ů',
115
+ 'Ű' => 'ű',
116
+ 'Ų' => 'ų',
117
+ 'Ŵ' => 'ŵ',
118
+ 'Ŷ' => 'ŷ',
119
+ 'Ÿ' => 'ÿ',
120
+ 'Ź' => 'ź',
121
+ 'Ż' => 'ż',
122
+ 'Ž' => 'ž',
123
+ 'Ɓ' => 'ɓ',
124
+ 'Ƃ' => 'ƃ',
125
+ 'Ƅ' => 'ƅ',
126
+ 'Ɔ' => 'ɔ',
127
+ 'Ƈ' => 'ƈ',
128
+ 'Ɖ' => 'ɖ',
129
+ 'Ɗ' => 'ɗ',
130
+ 'Ƌ' => 'ƌ',
131
+ 'Ǝ' => 'ǝ',
132
+ 'Ə' => 'ə',
133
+ 'Ɛ' => 'ɛ',
134
+ 'Ƒ' => 'ƒ',
135
+ 'Ɠ' => 'ɠ',
136
+ 'Ɣ' => 'ɣ',
137
+ 'Ɩ' => 'ɩ',
138
+ 'Ɨ' => 'ɨ',
139
+ 'Ƙ' => 'ƙ',
140
+ 'Ɯ' => 'ɯ',
141
+ 'Ɲ' => 'ɲ',
142
+ 'Ɵ' => 'ɵ',
143
+ 'Ơ' => 'ơ',
144
+ 'Ƣ' => 'ƣ',
145
+ 'Ƥ' => 'ƥ',
146
+ 'Ʀ' => 'ʀ',
147
+ 'Ƨ' => 'ƨ',
148
+ 'Ʃ' => 'ʃ',
149
+ 'Ƭ' => 'ƭ',
150
+ 'Ʈ' => 'ʈ',
151
+ 'Ư' => 'ư',
152
+ 'Ʊ' => 'ʊ',
153
+ 'Ʋ' => 'ʋ',
154
+ 'Ƴ' => 'ƴ',
155
+ 'Ƶ' => 'ƶ',
156
+ 'Ʒ' => 'ʒ',
157
+ 'Ƹ' => 'ƹ',
158
+ 'Ƽ' => 'ƽ',
159
+ 'DŽ' => 'dž',
160
+ 'Dž' => 'dž',
161
+ 'LJ' => 'lj',
162
+ 'Lj' => 'lj',
163
+ 'NJ' => 'nj',
164
+ 'Nj' => 'nj',
165
+ 'Ǎ' => 'ǎ',
166
+ 'Ǐ' => 'ǐ',
167
+ 'Ǒ' => 'ǒ',
168
+ 'Ǔ' => 'ǔ',
169
+ 'Ǖ' => 'ǖ',
170
+ 'Ǘ' => 'ǘ',
171
+ 'Ǚ' => 'ǚ',
172
+ 'Ǜ' => 'ǜ',
173
+ 'Ǟ' => 'ǟ',
174
+ 'Ǡ' => 'ǡ',
175
+ 'Ǣ' => 'ǣ',
176
+ 'Ǥ' => 'ǥ',
177
+ 'Ǧ' => 'ǧ',
178
+ 'Ǩ' => 'ǩ',
179
+ 'Ǫ' => 'ǫ',
180
+ 'Ǭ' => 'ǭ',
181
+ 'Ǯ' => 'ǯ',
182
+ 'DZ' => 'dz',
183
+ 'Dz' => 'dz',
184
+ 'Ǵ' => 'ǵ',
185
+ 'Ƕ' => 'ƕ',
186
+ 'Ƿ' => 'ƿ',
187
+ 'Ǹ' => 'ǹ',
188
+ 'Ǻ' => 'ǻ',
189
+ 'Ǽ' => 'ǽ',
190
+ 'Ǿ' => 'ǿ',
191
+ 'Ȁ' => 'ȁ',
192
+ 'Ȃ' => 'ȃ',
193
+ 'Ȅ' => 'ȅ',
194
+ 'Ȇ' => 'ȇ',
195
+ 'Ȉ' => 'ȉ',
196
+ 'Ȋ' => 'ȋ',
197
+ 'Ȍ' => 'ȍ',
198
+ 'Ȏ' => 'ȏ',
199
+ 'Ȑ' => 'ȑ',
200
+ 'Ȓ' => 'ȓ',
201
+ 'Ȕ' => 'ȕ',
202
+ 'Ȗ' => 'ȗ',
203
+ 'Ș' => 'ș',
204
+ 'Ț' => 'ț',
205
+ 'Ȝ' => 'ȝ',
206
+ 'Ȟ' => 'ȟ',
207
+ 'Ƞ' => 'ƞ',
208
+ 'Ȣ' => 'ȣ',
209
+ 'Ȥ' => 'ȥ',
210
+ 'Ȧ' => 'ȧ',
211
+ 'Ȩ' => 'ȩ',
212
+ 'Ȫ' => 'ȫ',
213
+ 'Ȭ' => 'ȭ',
214
+ 'Ȯ' => 'ȯ',
215
+ 'Ȱ' => 'ȱ',
216
+ 'Ȳ' => 'ȳ',
217
+ 'Ⱥ' => 'ⱥ',
218
+ 'Ȼ' => 'ȼ',
219
+ 'Ƚ' => 'ƚ',
220
+ 'Ⱦ' => 'ⱦ',
221
+ 'Ɂ' => 'ɂ',
222
+ 'Ƀ' => 'ƀ',
223
+ 'Ʉ' => 'ʉ',
224
+ 'Ʌ' => 'ʌ',
225
+ 'Ɇ' => 'ɇ',
226
+ 'Ɉ' => 'ɉ',
227
+ 'Ɋ' => 'ɋ',
228
+ 'Ɍ' => 'ɍ',
229
+ 'Ɏ' => 'ɏ',
230
+ 'Ͱ' => 'ͱ',
231
+ 'Ͳ' => 'ͳ',
232
+ 'Ͷ' => 'ͷ',
233
+ 'Ϳ' => 'ϳ',
234
+ 'Ά' => 'ά',
235
+ 'Έ' => 'έ',
236
+ 'Ή' => 'ή',
237
+ 'Ί' => 'ί',
238
+ 'Ό' => 'ό',
239
+ 'Ύ' => 'ύ',
240
+ 'Ώ' => 'ώ',
241
+ 'Α' => 'α',
242
+ 'Β' => 'β',
243
+ 'Γ' => 'γ',
244
+ 'Δ' => 'δ',
245
+ 'Ε' => 'ε',
246
+ 'Ζ' => 'ζ',
247
+ 'Η' => 'η',
248
+ 'Θ' => 'θ',
249
+ 'Ι' => 'ι',
250
+ 'Κ' => 'κ',
251
+ 'Λ' => 'λ',
252
+ 'Μ' => 'μ',
253
+ 'Ν' => 'ν',
254
+ 'Ξ' => 'ξ',
255
+ 'Ο' => 'ο',
256
+ 'Π' => 'π',
257
+ 'Ρ' => 'ρ',
258
+ 'Σ' => 'σ',
259
+ 'Τ' => 'τ',
260
+ 'Υ' => 'υ',
261
+ 'Φ' => 'φ',
262
+ 'Χ' => 'χ',
263
+ 'Ψ' => 'ψ',
264
+ 'Ω' => 'ω',
265
+ 'Ϊ' => 'ϊ',
266
+ 'Ϋ' => 'ϋ',
267
+ 'Ϗ' => 'ϗ',
268
+ 'Ϙ' => 'ϙ',
269
+ 'Ϛ' => 'ϛ',
270
+ 'Ϝ' => 'ϝ',
271
+ 'Ϟ' => 'ϟ',
272
+ 'Ϡ' => 'ϡ',
273
+ 'Ϣ' => 'ϣ',
274
+ 'Ϥ' => 'ϥ',
275
+ 'Ϧ' => 'ϧ',
276
+ 'Ϩ' => 'ϩ',
277
+ 'Ϫ' => 'ϫ',
278
+ 'Ϭ' => 'ϭ',
279
+ 'Ϯ' => 'ϯ',
280
+ 'ϴ' => 'θ',
281
+ 'Ϸ' => 'ϸ',
282
+ 'Ϲ' => 'ϲ',
283
+ 'Ϻ' => 'ϻ',
284
+ 'Ͻ' => 'ͻ',
285
+ 'Ͼ' => 'ͼ',
286
+ 'Ͽ' => 'ͽ',
287
+ 'Ѐ' => 'ѐ',
288
+ 'Ё' => 'ё',
289
+ 'Ђ' => 'ђ',
290
+ 'Ѓ' => 'ѓ',
291
+ 'Є' => 'є',
292
+ 'Ѕ' => 'ѕ',
293
+ 'І' => 'і',
294
+ 'Ї' => 'ї',
295
+ 'Ј' => 'ј',
296
+ 'Љ' => 'љ',
297
+ 'Њ' => 'њ',
298
+ 'Ћ' => 'ћ',
299
+ 'Ќ' => 'ќ',
300
+ 'Ѝ' => 'ѝ',
301
+ 'Ў' => 'ў',
302
+ 'Џ' => 'џ',
303
+ 'А' => 'а',
304
+ 'Б' => 'б',
305
+ 'В' => 'в',
306
+ 'Г' => 'г',
307
+ 'Д' => 'д',
308
+ 'Е' => 'е',
309
+ 'Ж' => 'ж',
310
+ 'З' => 'з',
311
+ 'И' => 'и',
312
+ 'Й' => 'й',
313
+ 'К' => 'к',
314
+ 'Л' => 'л',
315
+ 'М' => 'м',
316
+ 'Н' => 'н',
317
+ 'О' => 'о',
318
+ 'П' => 'п',
319
+ 'Р' => 'р',
320
+ 'С' => 'с',
321
+ 'Т' => 'т',
322
+ 'У' => 'у',
323
+ 'Ф' => 'ф',
324
+ 'Х' => 'х',
325
+ 'Ц' => 'ц',
326
+ 'Ч' => 'ч',
327
+ 'Ш' => 'ш',
328
+ 'Щ' => 'щ',
329
+ 'Ъ' => 'ъ',
330
+ 'Ы' => 'ы',
331
+ 'Ь' => 'ь',
332
+ 'Э' => 'э',
333
+ 'Ю' => 'ю',
334
+ 'Я' => 'я',
335
+ 'Ѡ' => 'ѡ',
336
+ 'Ѣ' => 'ѣ',
337
+ 'Ѥ' => 'ѥ',
338
+ 'Ѧ' => 'ѧ',
339
+ 'Ѩ' => 'ѩ',
340
+ 'Ѫ' => 'ѫ',
341
+ 'Ѭ' => 'ѭ',
342
+ 'Ѯ' => 'ѯ',
343
+ 'Ѱ' => 'ѱ',
344
+ 'Ѳ' => 'ѳ',
345
+ 'Ѵ' => 'ѵ',
346
+ 'Ѷ' => 'ѷ',
347
+ 'Ѹ' => 'ѹ',
348
+ 'Ѻ' => 'ѻ',
349
+ 'Ѽ' => 'ѽ',
350
+ 'Ѿ' => 'ѿ',
351
+ 'Ҁ' => 'ҁ',
352
+ 'Ҋ' => 'ҋ',
353
+ 'Ҍ' => 'ҍ',
354
+ 'Ҏ' => 'ҏ',
355
+ 'Ґ' => 'ґ',
356
+ 'Ғ' => 'ғ',
357
+ 'Ҕ' => 'ҕ',
358
+ 'Җ' => 'җ',
359
+ 'Ҙ' => 'ҙ',
360
+ 'Қ' => 'қ',
361
+ 'Ҝ' => 'ҝ',
362
+ 'Ҟ' => 'ҟ',
363
+ 'Ҡ' => 'ҡ',
364
+ 'Ң' => 'ң',
365
+ 'Ҥ' => 'ҥ',
366
+ 'Ҧ' => 'ҧ',
367
+ 'Ҩ' => 'ҩ',
368
+ 'Ҫ' => 'ҫ',
369
+ 'Ҭ' => 'ҭ',
370
+ 'Ү' => 'ү',
371
+ 'Ұ' => 'ұ',
372
+ 'Ҳ' => 'ҳ',
373
+ 'Ҵ' => 'ҵ',
374
+ 'Ҷ' => 'ҷ',
375
+ 'Ҹ' => 'ҹ',
376
+ 'Һ' => 'һ',
377
+ 'Ҽ' => 'ҽ',
378
+ 'Ҿ' => 'ҿ',
379
+ 'Ӏ' => 'ӏ',
380
+ 'Ӂ' => 'ӂ',
381
+ 'Ӄ' => 'ӄ',
382
+ 'Ӆ' => 'ӆ',
383
+ 'Ӈ' => 'ӈ',
384
+ 'Ӊ' => 'ӊ',
385
+ 'Ӌ' => 'ӌ',
386
+ 'Ӎ' => 'ӎ',
387
+ 'Ӑ' => 'ӑ',
388
+ 'Ӓ' => 'ӓ',
389
+ 'Ӕ' => 'ӕ',
390
+ 'Ӗ' => 'ӗ',
391
+ 'Ә' => 'ә',
392
+ 'Ӛ' => 'ӛ',
393
+ 'Ӝ' => 'ӝ',
394
+ 'Ӟ' => 'ӟ',
395
+ 'Ӡ' => 'ӡ',
396
+ 'Ӣ' => 'ӣ',
397
+ 'Ӥ' => 'ӥ',
398
+ 'Ӧ' => 'ӧ',
399
+ 'Ө' => 'ө',
400
+ 'Ӫ' => 'ӫ',
401
+ 'Ӭ' => 'ӭ',
402
+ 'Ӯ' => 'ӯ',
403
+ 'Ӱ' => 'ӱ',
404
+ 'Ӳ' => 'ӳ',
405
+ 'Ӵ' => 'ӵ',
406
+ 'Ӷ' => 'ӷ',
407
+ 'Ӹ' => 'ӹ',
408
+ 'Ӻ' => 'ӻ',
409
+ 'Ӽ' => 'ӽ',
410
+ 'Ӿ' => 'ӿ',
411
+ 'Ԁ' => 'ԁ',
412
+ 'Ԃ' => 'ԃ',
413
+ 'Ԅ' => 'ԅ',
414
+ 'Ԇ' => 'ԇ',
415
+ 'Ԉ' => 'ԉ',
416
+ 'Ԋ' => 'ԋ',
417
+ 'Ԍ' => 'ԍ',
418
+ 'Ԏ' => 'ԏ',
419
+ 'Ԑ' => 'ԑ',
420
+ 'Ԓ' => 'ԓ',
421
+ 'Ԕ' => 'ԕ',
422
+ 'Ԗ' => 'ԗ',
423
+ 'Ԙ' => 'ԙ',
424
+ 'Ԛ' => 'ԛ',
425
+ 'Ԝ' => 'ԝ',
426
+ 'Ԟ' => 'ԟ',
427
+ 'Ԡ' => 'ԡ',
428
+ 'Ԣ' => 'ԣ',
429
+ 'Ԥ' => 'ԥ',
430
+ 'Ԧ' => 'ԧ',
431
+ 'Ԩ' => 'ԩ',
432
+ 'Ԫ' => 'ԫ',
433
+ 'Ԭ' => 'ԭ',
434
+ 'Ԯ' => 'ԯ',
435
+ 'Ա' => 'ա',
436
+ 'Բ' => 'բ',
437
+ 'Գ' => 'գ',
438
+ 'Դ' => 'դ',
439
+ 'Ե' => 'ե',
440
+ 'Զ' => 'զ',
441
+ 'Է' => 'է',
442
+ 'Ը' => 'ը',
443
+ 'Թ' => 'թ',
444
+ 'Ժ' => 'ժ',
445
+ 'Ի' => 'ի',
446
+ 'Լ' => 'լ',
447
+ 'Խ' => 'խ',
448
+ 'Ծ' => 'ծ',
449
+ 'Կ' => 'կ',
450
+ 'Հ' => 'հ',
451
+ 'Ձ' => 'ձ',
452
+ 'Ղ' => 'ղ',
453
+ 'Ճ' => 'ճ',
454
+ 'Մ' => 'մ',
455
+ 'Յ' => 'յ',
456
+ 'Ն' => 'ն',
457
+ 'Շ' => 'շ',
458
+ 'Ո' => 'ո',
459
+ 'Չ' => 'չ',
460
+ 'Պ' => 'պ',
461
+ 'Ջ' => 'ջ',
462
+ 'Ռ' => 'ռ',
463
+ 'Ս' => 'ս',
464
+ 'Վ' => 'վ',
465
+ 'Տ' => 'տ',
466
+ 'Ր' => 'ր',
467
+ 'Ց' => 'ց',
468
+ 'Ւ' => 'ւ',
469
+ 'Փ' => 'փ',
470
+ 'Ք' => 'ք',
471
+ 'Օ' => 'օ',
472
+ 'Ֆ' => 'ֆ',
473
+ 'Ⴀ' => 'ⴀ',
474
+ 'Ⴁ' => 'ⴁ',
475
+ 'Ⴂ' => 'ⴂ',
476
+ 'Ⴃ' => 'ⴃ',
477
+ 'Ⴄ' => 'ⴄ',
478
+ 'Ⴅ' => 'ⴅ',
479
+ 'Ⴆ' => 'ⴆ',
480
+ 'Ⴇ' => 'ⴇ',
481
+ 'Ⴈ' => 'ⴈ',
482
+ 'Ⴉ' => 'ⴉ',
483
+ 'Ⴊ' => 'ⴊ',
484
+ 'Ⴋ' => 'ⴋ',
485
+ 'Ⴌ' => 'ⴌ',
486
+ 'Ⴍ' => 'ⴍ',
487
+ 'Ⴎ' => 'ⴎ',
488
+ 'Ⴏ' => 'ⴏ',
489
+ 'Ⴐ' => 'ⴐ',
490
+ 'Ⴑ' => 'ⴑ',
491
+ 'Ⴒ' => 'ⴒ',
492
+ 'Ⴓ' => 'ⴓ',
493
+ 'Ⴔ' => 'ⴔ',
494
+ 'Ⴕ' => 'ⴕ',
495
+ 'Ⴖ' => 'ⴖ',
496
+ 'Ⴗ' => 'ⴗ',
497
+ 'Ⴘ' => 'ⴘ',
498
+ 'Ⴙ' => 'ⴙ',
499
+ 'Ⴚ' => 'ⴚ',
500
+ 'Ⴛ' => 'ⴛ',
501
+ 'Ⴜ' => 'ⴜ',
502
+ 'Ⴝ' => 'ⴝ',
503
+ 'Ⴞ' => 'ⴞ',
504
+ 'Ⴟ' => 'ⴟ',
505
+ 'Ⴠ' => 'ⴠ',
506
+ 'Ⴡ' => 'ⴡ',
507
+ 'Ⴢ' => 'ⴢ',
508
+ 'Ⴣ' => 'ⴣ',
509
+ 'Ⴤ' => 'ⴤ',
510
+ 'Ⴥ' => 'ⴥ',
511
+ 'Ⴧ' => 'ⴧ',
512
+ 'Ⴭ' => 'ⴭ',
513
+ 'Ꭰ' => 'ꭰ',
514
+ 'Ꭱ' => 'ꭱ',
515
+ 'Ꭲ' => 'ꭲ',
516
+ 'Ꭳ' => 'ꭳ',
517
+ 'Ꭴ' => 'ꭴ',
518
+ 'Ꭵ' => 'ꭵ',
519
+ 'Ꭶ' => 'ꭶ',
520
+ 'Ꭷ' => 'ꭷ',
521
+ 'Ꭸ' => 'ꭸ',
522
+ 'Ꭹ' => 'ꭹ',
523
+ 'Ꭺ' => 'ꭺ',
524
+ 'Ꭻ' => 'ꭻ',
525
+ 'Ꭼ' => 'ꭼ',
526
+ 'Ꭽ' => 'ꭽ',
527
+ 'Ꭾ' => 'ꭾ',
528
+ 'Ꭿ' => 'ꭿ',
529
+ 'Ꮀ' => 'ꮀ',
530
+ 'Ꮁ' => 'ꮁ',
531
+ 'Ꮂ' => 'ꮂ',
532
+ 'Ꮃ' => 'ꮃ',
533
+ 'Ꮄ' => 'ꮄ',
534
+ 'Ꮅ' => 'ꮅ',
535
+ 'Ꮆ' => 'ꮆ',
536
+ 'Ꮇ' => 'ꮇ',
537
+ 'Ꮈ' => 'ꮈ',
538
+ 'Ꮉ' => 'ꮉ',
539
+ 'Ꮊ' => 'ꮊ',
540
+ 'Ꮋ' => 'ꮋ',
541
+ 'Ꮌ' => 'ꮌ',
542
+ 'Ꮍ' => 'ꮍ',
543
+ 'Ꮎ' => 'ꮎ',
544
+ 'Ꮏ' => 'ꮏ',
545
+ 'Ꮐ' => 'ꮐ',
546
+ 'Ꮑ' => 'ꮑ',
547
+ 'Ꮒ' => 'ꮒ',
548
+ 'Ꮓ' => 'ꮓ',
549
+ 'Ꮔ' => 'ꮔ',
550
+ 'Ꮕ' => 'ꮕ',
551
+ 'Ꮖ' => 'ꮖ',
552
+ 'Ꮗ' => 'ꮗ',
553
+ 'Ꮘ' => 'ꮘ',
554
+ 'Ꮙ' => 'ꮙ',
555
+ 'Ꮚ' => 'ꮚ',
556
+ 'Ꮛ' => 'ꮛ',
557
+ 'Ꮜ' => 'ꮜ',
558
+ 'Ꮝ' => 'ꮝ',
559
+ 'Ꮞ' => 'ꮞ',
560
+ 'Ꮟ' => 'ꮟ',
561
+ 'Ꮠ' => 'ꮠ',
562
+ 'Ꮡ' => 'ꮡ',
563
+ 'Ꮢ' => 'ꮢ',
564
+ 'Ꮣ' => 'ꮣ',
565
+ 'Ꮤ' => 'ꮤ',
566
+ 'Ꮥ' => 'ꮥ',
567
+ 'Ꮦ' => 'ꮦ',
568
+ 'Ꮧ' => 'ꮧ',
569
+ 'Ꮨ' => 'ꮨ',
570
+ 'Ꮩ' => 'ꮩ',
571
+ 'Ꮪ' => 'ꮪ',
572
+ 'Ꮫ' => 'ꮫ',
573
+ 'Ꮬ' => 'ꮬ',
574
+ 'Ꮭ' => 'ꮭ',
575
+ 'Ꮮ' => 'ꮮ',
576
+ 'Ꮯ' => 'ꮯ',
577
+ 'Ꮰ' => 'ꮰ',
578
+ 'Ꮱ' => 'ꮱ',
579
+ 'Ꮲ' => 'ꮲ',
580
+ 'Ꮳ' => 'ꮳ',
581
+ 'Ꮴ' => 'ꮴ',
582
+ 'Ꮵ' => 'ꮵ',
583
+ 'Ꮶ' => 'ꮶ',
584
+ 'Ꮷ' => 'ꮷ',
585
+ 'Ꮸ' => 'ꮸ',
586
+ 'Ꮹ' => 'ꮹ',
587
+ 'Ꮺ' => 'ꮺ',
588
+ 'Ꮻ' => 'ꮻ',
589
+ 'Ꮼ' => 'ꮼ',
590
+ 'Ꮽ' => 'ꮽ',
591
+ 'Ꮾ' => 'ꮾ',
592
+ 'Ꮿ' => 'ꮿ',
593
+ 'Ᏸ' => 'ᏸ',
594
+ 'Ᏹ' => 'ᏹ',
595
+ 'Ᏺ' => 'ᏺ',
596
+ 'Ᏻ' => 'ᏻ',
597
+ 'Ᏼ' => 'ᏼ',
598
+ 'Ᏽ' => 'ᏽ',
599
+ 'Ა' => 'ა',
600
+ 'Ბ' => 'ბ',
601
+ 'Გ' => 'გ',
602
+ 'Დ' => 'დ',
603
+ 'Ე' => 'ე',
604
+ 'Ვ' => 'ვ',
605
+ 'Ზ' => 'ზ',
606
+ 'Თ' => 'თ',
607
+ 'Ი' => 'ი',
608
+ 'Კ' => 'კ',
609
+ 'Ლ' => 'ლ',
610
+ 'Მ' => 'მ',
611
+ 'Ნ' => 'ნ',
612
+ 'Ო' => 'ო',
613
+ 'Პ' => 'პ',
614
+ 'Ჟ' => 'ჟ',
615
+ 'Რ' => 'რ',
616
+ 'Ს' => 'ს',
617
+ 'Ტ' => 'ტ',
618
+ 'Უ' => 'უ',
619
+ 'Ფ' => 'ფ',
620
+ 'Ქ' => 'ქ',
621
+ 'Ღ' => 'ღ',
622
+ 'Ყ' => 'ყ',
623
+ 'Შ' => 'შ',
624
+ 'Ჩ' => 'ჩ',
625
+ 'Ც' => 'ც',
626
+ 'Ძ' => 'ძ',
627
+ 'Წ' => 'წ',
628
+ 'Ჭ' => 'ჭ',
629
+ 'Ხ' => 'ხ',
630
+ 'Ჯ' => 'ჯ',
631
+ 'Ჰ' => 'ჰ',
632
+ 'Ჱ' => 'ჱ',
633
+ 'Ჲ' => 'ჲ',
634
+ 'Ჳ' => 'ჳ',
635
+ 'Ჴ' => 'ჴ',
636
+ 'Ჵ' => 'ჵ',
637
+ 'Ჶ' => 'ჶ',
638
+ 'Ჷ' => 'ჷ',
639
+ 'Ჸ' => 'ჸ',
640
+ 'Ჹ' => 'ჹ',
641
+ 'Ჺ' => 'ჺ',
642
+ 'Ჽ' => 'ჽ',
643
+ 'Ჾ' => 'ჾ',
644
+ 'Ჿ' => 'ჿ',
645
+ 'Ḁ' => 'ḁ',
646
+ 'Ḃ' => 'ḃ',
647
+ 'Ḅ' => 'ḅ',
648
+ 'Ḇ' => 'ḇ',
649
+ 'Ḉ' => 'ḉ',
650
+ 'Ḋ' => 'ḋ',
651
+ 'Ḍ' => 'ḍ',
652
+ 'Ḏ' => 'ḏ',
653
+ 'Ḑ' => 'ḑ',
654
+ 'Ḓ' => 'ḓ',
655
+ 'Ḕ' => 'ḕ',
656
+ 'Ḗ' => 'ḗ',
657
+ 'Ḙ' => 'ḙ',
658
+ 'Ḛ' => 'ḛ',
659
+ 'Ḝ' => 'ḝ',
660
+ 'Ḟ' => 'ḟ',
661
+ 'Ḡ' => 'ḡ',
662
+ 'Ḣ' => 'ḣ',
663
+ 'Ḥ' => 'ḥ',
664
+ 'Ḧ' => 'ḧ',
665
+ 'Ḩ' => 'ḩ',
666
+ 'Ḫ' => 'ḫ',
667
+ 'Ḭ' => 'ḭ',
668
+ 'Ḯ' => 'ḯ',
669
+ 'Ḱ' => 'ḱ',
670
+ 'Ḳ' => 'ḳ',
671
+ 'Ḵ' => 'ḵ',
672
+ 'Ḷ' => 'ḷ',
673
+ 'Ḹ' => 'ḹ',
674
+ 'Ḻ' => 'ḻ',
675
+ 'Ḽ' => 'ḽ',
676
+ 'Ḿ' => 'ḿ',
677
+ 'Ṁ' => 'ṁ',
678
+ 'Ṃ' => 'ṃ',
679
+ 'Ṅ' => 'ṅ',
680
+ 'Ṇ' => 'ṇ',
681
+ 'Ṉ' => 'ṉ',
682
+ 'Ṋ' => 'ṋ',
683
+ 'Ṍ' => 'ṍ',
684
+ 'Ṏ' => 'ṏ',
685
+ 'Ṑ' => 'ṑ',
686
+ 'Ṓ' => 'ṓ',
687
+ 'Ṕ' => 'ṕ',
688
+ 'Ṗ' => 'ṗ',
689
+ 'Ṙ' => 'ṙ',
690
+ 'Ṛ' => 'ṛ',
691
+ 'Ṝ' => 'ṝ',
692
+ 'Ṟ' => 'ṟ',
693
+ 'Ṡ' => 'ṡ',
694
+ 'Ṣ' => 'ṣ',
695
+ 'Ṥ' => 'ṥ',
696
+ 'Ṧ' => 'ṧ',
697
+ 'Ṩ' => 'ṩ',
698
+ 'Ṫ' => 'ṫ',
699
+ 'Ṭ' => 'ṭ',
700
+ 'Ṯ' => 'ṯ',
701
+ 'Ṱ' => 'ṱ',
702
+ 'Ṳ' => 'ṳ',
703
+ 'Ṵ' => 'ṵ',
704
+ 'Ṷ' => 'ṷ',
705
+ 'Ṹ' => 'ṹ',
706
+ 'Ṻ' => 'ṻ',
707
+ 'Ṽ' => 'ṽ',
708
+ 'Ṿ' => 'ṿ',
709
+ 'Ẁ' => 'ẁ',
710
+ 'Ẃ' => 'ẃ',
711
+ 'Ẅ' => 'ẅ',
712
+ 'Ẇ' => 'ẇ',
713
+ 'Ẉ' => 'ẉ',
714
+ 'Ẋ' => 'ẋ',
715
+ 'Ẍ' => 'ẍ',
716
+ 'Ẏ' => 'ẏ',
717
+ 'Ẑ' => 'ẑ',
718
+ 'Ẓ' => 'ẓ',
719
+ 'Ẕ' => 'ẕ',
720
+ 'ẞ' => 'ß',
721
+ 'Ạ' => 'ạ',
722
+ 'Ả' => 'ả',
723
+ 'Ấ' => 'ấ',
724
+ 'Ầ' => 'ầ',
725
+ 'Ẩ' => 'ẩ',
726
+ 'Ẫ' => 'ẫ',
727
+ 'Ậ' => 'ậ',
728
+ 'Ắ' => 'ắ',
729
+ 'Ằ' => 'ằ',
730
+ 'Ẳ' => 'ẳ',
731
+ 'Ẵ' => 'ẵ',
732
+ 'Ặ' => 'ặ',
733
+ 'Ẹ' => 'ẹ',
734
+ 'Ẻ' => 'ẻ',
735
+ 'Ẽ' => 'ẽ',
736
+ 'Ế' => 'ế',
737
+ 'Ề' => 'ề',
738
+ 'Ể' => 'ể',
739
+ 'Ễ' => 'ễ',
740
+ 'Ệ' => 'ệ',
741
+ 'Ỉ' => 'ỉ',
742
+ 'Ị' => 'ị',
743
+ 'Ọ' => 'ọ',
744
+ 'Ỏ' => 'ỏ',
745
+ 'Ố' => 'ố',
746
+ 'Ồ' => 'ồ',
747
+ 'Ổ' => 'ổ',
748
+ 'Ỗ' => 'ỗ',
749
+ 'Ộ' => 'ộ',
750
+ 'Ớ' => 'ớ',
751
+ 'Ờ' => 'ờ',
752
+ 'Ở' => 'ở',
753
+ 'Ỡ' => 'ỡ',
754
+ 'Ợ' => 'ợ',
755
+ 'Ụ' => 'ụ',
756
+ 'Ủ' => 'ủ',
757
+ 'Ứ' => 'ứ',
758
+ 'Ừ' => 'ừ',
759
+ 'Ử' => 'ử',
760
+ 'Ữ' => 'ữ',
761
+ 'Ự' => 'ự',
762
+ 'Ỳ' => 'ỳ',
763
+ 'Ỵ' => 'ỵ',
764
+ 'Ỷ' => 'ỷ',
765
+ 'Ỹ' => 'ỹ',
766
+ 'Ỻ' => 'ỻ',
767
+ 'Ỽ' => 'ỽ',
768
+ 'Ỿ' => 'ỿ',
769
+ 'Ἀ' => 'ἀ',
770
+ 'Ἁ' => 'ἁ',
771
+ 'Ἂ' => 'ἂ',
772
+ 'Ἃ' => 'ἃ',
773
+ 'Ἄ' => 'ἄ',
774
+ 'Ἅ' => 'ἅ',
775
+ 'Ἆ' => 'ἆ',
776
+ 'Ἇ' => 'ἇ',
777
+ 'Ἐ' => 'ἐ',
778
+ 'Ἑ' => 'ἑ',
779
+ 'Ἒ' => 'ἒ',
780
+ 'Ἓ' => 'ἓ',
781
+ 'Ἔ' => 'ἔ',
782
+ 'Ἕ' => 'ἕ',
783
+ 'Ἠ' => 'ἠ',
784
+ 'Ἡ' => 'ἡ',
785
+ 'Ἢ' => 'ἢ',
786
+ 'Ἣ' => 'ἣ',
787
+ 'Ἤ' => 'ἤ',
788
+ 'Ἥ' => 'ἥ',
789
+ 'Ἦ' => 'ἦ',
790
+ 'Ἧ' => 'ἧ',
791
+ 'Ἰ' => 'ἰ',
792
+ 'Ἱ' => 'ἱ',
793
+ 'Ἲ' => 'ἲ',
794
+ 'Ἳ' => 'ἳ',
795
+ 'Ἴ' => 'ἴ',
796
+ 'Ἵ' => 'ἵ',
797
+ 'Ἶ' => 'ἶ',
798
+ 'Ἷ' => 'ἷ',
799
+ 'Ὀ' => 'ὀ',
800
+ 'Ὁ' => 'ὁ',
801
+ 'Ὂ' => 'ὂ',
802
+ 'Ὃ' => 'ὃ',
803
+ 'Ὄ' => 'ὄ',
804
+ 'Ὅ' => 'ὅ',
805
+ 'Ὑ' => 'ὑ',
806
+ 'Ὓ' => 'ὓ',
807
+ 'Ὕ' => 'ὕ',
808
+ 'Ὗ' => 'ὗ',
809
+ 'Ὠ' => 'ὠ',
810
+ 'Ὡ' => 'ὡ',
811
+ 'Ὢ' => 'ὢ',
812
+ 'Ὣ' => 'ὣ',
813
+ 'Ὤ' => 'ὤ',
814
+ 'Ὥ' => 'ὥ',
815
+ 'Ὦ' => 'ὦ',
816
+ 'Ὧ' => 'ὧ',
817
+ 'ᾈ' => 'ᾀ',
818
+ 'ᾉ' => 'ᾁ',
819
+ 'ᾊ' => 'ᾂ',
820
+ 'ᾋ' => 'ᾃ',
821
+ 'ᾌ' => 'ᾄ',
822
+ 'ᾍ' => 'ᾅ',
823
+ 'ᾎ' => 'ᾆ',
824
+ 'ᾏ' => 'ᾇ',
825
+ 'ᾘ' => 'ᾐ',
826
+ 'ᾙ' => 'ᾑ',
827
+ 'ᾚ' => 'ᾒ',
828
+ 'ᾛ' => 'ᾓ',
829
+ 'ᾜ' => 'ᾔ',
830
+ 'ᾝ' => 'ᾕ',
831
+ 'ᾞ' => 'ᾖ',
832
+ 'ᾟ' => 'ᾗ',
833
+ 'ᾨ' => 'ᾠ',
834
+ 'ᾩ' => 'ᾡ',
835
+ 'ᾪ' => 'ᾢ',
836
+ 'ᾫ' => 'ᾣ',
837
+ 'ᾬ' => 'ᾤ',
838
+ 'ᾭ' => 'ᾥ',
839
+ 'ᾮ' => 'ᾦ',
840
+ 'ᾯ' => 'ᾧ',
841
+ 'Ᾰ' => 'ᾰ',
842
+ 'Ᾱ' => 'ᾱ',
843
+ 'Ὰ' => 'ὰ',
844
+ 'Ά' => 'ά',
845
+ 'ᾼ' => 'ᾳ',
846
+ 'Ὲ' => 'ὲ',
847
+ 'Έ' => 'έ',
848
+ 'Ὴ' => 'ὴ',
849
+ 'Ή' => 'ή',
850
+ 'ῌ' => 'ῃ',
851
+ 'Ῐ' => 'ῐ',
852
+ 'Ῑ' => 'ῑ',
853
+ 'Ὶ' => 'ὶ',
854
+ 'Ί' => 'ί',
855
+ 'Ῠ' => 'ῠ',
856
+ 'Ῡ' => 'ῡ',
857
+ 'Ὺ' => 'ὺ',
858
+ 'Ύ' => 'ύ',
859
+ 'Ῥ' => 'ῥ',
860
+ 'Ὸ' => 'ὸ',
861
+ 'Ό' => 'ό',
862
+ 'Ὼ' => 'ὼ',
863
+ 'Ώ' => 'ώ',
864
+ 'ῼ' => 'ῳ',
865
+ 'Ω' => 'ω',
866
+ 'K' => 'k',
867
+ 'Å' => 'å',
868
+ 'Ⅎ' => 'ⅎ',
869
+ 'Ⅰ' => 'ⅰ',
870
+ 'Ⅱ' => 'ⅱ',
871
+ 'Ⅲ' => 'ⅲ',
872
+ 'Ⅳ' => 'ⅳ',
873
+ 'Ⅴ' => 'ⅴ',
874
+ 'Ⅵ' => 'ⅵ',
875
+ 'Ⅶ' => 'ⅶ',
876
+ 'Ⅷ' => 'ⅷ',
877
+ 'Ⅸ' => 'ⅸ',
878
+ 'Ⅹ' => 'ⅹ',
879
+ 'Ⅺ' => 'ⅺ',
880
+ 'Ⅻ' => 'ⅻ',
881
+ 'Ⅼ' => 'ⅼ',
882
+ 'Ⅽ' => 'ⅽ',
883
+ 'Ⅾ' => 'ⅾ',
884
+ 'Ⅿ' => 'ⅿ',
885
+ 'Ↄ' => 'ↄ',
886
+ 'Ⓐ' => 'ⓐ',
887
+ 'Ⓑ' => 'ⓑ',
888
+ 'Ⓒ' => 'ⓒ',
889
+ 'Ⓓ' => 'ⓓ',
890
+ 'Ⓔ' => 'ⓔ',
891
+ 'Ⓕ' => 'ⓕ',
892
+ 'Ⓖ' => 'ⓖ',
893
+ 'Ⓗ' => 'ⓗ',
894
+ 'Ⓘ' => 'ⓘ',
895
+ 'Ⓙ' => 'ⓙ',
896
+ 'Ⓚ' => 'ⓚ',
897
+ 'Ⓛ' => 'ⓛ',
898
+ 'Ⓜ' => 'ⓜ',
899
+ 'Ⓝ' => 'ⓝ',
900
+ 'Ⓞ' => 'ⓞ',
901
+ 'Ⓟ' => 'ⓟ',
902
+ 'Ⓠ' => 'ⓠ',
903
+ 'Ⓡ' => 'ⓡ',
904
+ 'Ⓢ' => 'ⓢ',
905
+ 'Ⓣ' => 'ⓣ',
906
+ 'Ⓤ' => 'ⓤ',
907
+ 'Ⓥ' => 'ⓥ',
908
+ 'Ⓦ' => 'ⓦ',
909
+ 'Ⓧ' => 'ⓧ',
910
+ 'Ⓨ' => 'ⓨ',
911
+ 'Ⓩ' => 'ⓩ',
912
+ 'Ⰰ' => 'ⰰ',
913
+ 'Ⰱ' => 'ⰱ',
914
+ 'Ⰲ' => 'ⰲ',
915
+ 'Ⰳ' => 'ⰳ',
916
+ 'Ⰴ' => 'ⰴ',
917
+ 'Ⰵ' => 'ⰵ',
918
+ 'Ⰶ' => 'ⰶ',
919
+ 'Ⰷ' => 'ⰷ',
920
+ 'Ⰸ' => 'ⰸ',
921
+ 'Ⰹ' => 'ⰹ',
922
+ 'Ⰺ' => 'ⰺ',
923
+ 'Ⰻ' => 'ⰻ',
924
+ 'Ⰼ' => 'ⰼ',
925
+ 'Ⰽ' => 'ⰽ',
926
+ 'Ⰾ' => 'ⰾ',
927
+ 'Ⰿ' => 'ⰿ',
928
+ 'Ⱀ' => 'ⱀ',
929
+ 'Ⱁ' => 'ⱁ',
930
+ 'Ⱂ' => 'ⱂ',
931
+ 'Ⱃ' => 'ⱃ',
932
+ 'Ⱄ' => 'ⱄ',
933
+ 'Ⱅ' => 'ⱅ',
934
+ 'Ⱆ' => 'ⱆ',
935
+ 'Ⱇ' => 'ⱇ',
936
+ 'Ⱈ' => 'ⱈ',
937
+ 'Ⱉ' => 'ⱉ',
938
+ 'Ⱊ' => 'ⱊ',
939
+ 'Ⱋ' => 'ⱋ',
940
+ 'Ⱌ' => 'ⱌ',
941
+ 'Ⱍ' => 'ⱍ',
942
+ 'Ⱎ' => 'ⱎ',
943
+ 'Ⱏ' => 'ⱏ',
944
+ 'Ⱐ' => 'ⱐ',
945
+ 'Ⱑ' => 'ⱑ',
946
+ 'Ⱒ' => 'ⱒ',
947
+ 'Ⱓ' => 'ⱓ',
948
+ 'Ⱔ' => 'ⱔ',
949
+ 'Ⱕ' => 'ⱕ',
950
+ 'Ⱖ' => 'ⱖ',
951
+ 'Ⱗ' => 'ⱗ',
952
+ 'Ⱘ' => 'ⱘ',
953
+ 'Ⱙ' => 'ⱙ',
954
+ 'Ⱚ' => 'ⱚ',
955
+ 'Ⱛ' => 'ⱛ',
956
+ 'Ⱜ' => 'ⱜ',
957
+ 'Ⱝ' => 'ⱝ',
958
+ 'Ⱞ' => 'ⱞ',
959
+ 'Ⱡ' => 'ⱡ',
960
+ 'Ɫ' => 'ɫ',
961
+ 'Ᵽ' => 'ᵽ',
962
+ 'Ɽ' => 'ɽ',
963
+ 'Ⱨ' => 'ⱨ',
964
+ 'Ⱪ' => 'ⱪ',
965
+ 'Ⱬ' => 'ⱬ',
966
+ 'Ɑ' => 'ɑ',
967
+ 'Ɱ' => 'ɱ',
968
+ 'Ɐ' => 'ɐ',
969
+ 'Ɒ' => 'ɒ',
970
+ 'Ⱳ' => 'ⱳ',
971
+ 'Ⱶ' => 'ⱶ',
972
+ 'Ȿ' => 'ȿ',
973
+ 'Ɀ' => 'ɀ',
974
+ 'Ⲁ' => 'ⲁ',
975
+ 'Ⲃ' => 'ⲃ',
976
+ 'Ⲅ' => 'ⲅ',
977
+ 'Ⲇ' => 'ⲇ',
978
+ 'Ⲉ' => 'ⲉ',
979
+ 'Ⲋ' => 'ⲋ',
980
+ 'Ⲍ' => 'ⲍ',
981
+ 'Ⲏ' => 'ⲏ',
982
+ 'Ⲑ' => 'ⲑ',
983
+ 'Ⲓ' => 'ⲓ',
984
+ 'Ⲕ' => 'ⲕ',
985
+ 'Ⲗ' => 'ⲗ',
986
+ 'Ⲙ' => 'ⲙ',
987
+ 'Ⲛ' => 'ⲛ',
988
+ 'Ⲝ' => 'ⲝ',
989
+ 'Ⲟ' => 'ⲟ',
990
+ 'Ⲡ' => 'ⲡ',
991
+ 'Ⲣ' => 'ⲣ',
992
+ 'Ⲥ' => 'ⲥ',
993
+ 'Ⲧ' => 'ⲧ',
994
+ 'Ⲩ' => 'ⲩ',
995
+ 'Ⲫ' => 'ⲫ',
996
+ 'Ⲭ' => 'ⲭ',
997
+ 'Ⲯ' => 'ⲯ',
998
+ 'Ⲱ' => 'ⲱ',
999
+ 'Ⲳ' => 'ⲳ',
1000
+ 'Ⲵ' => 'ⲵ',
1001
+ 'Ⲷ' => 'ⲷ',
1002
+ 'Ⲹ' => 'ⲹ',
1003
+ 'Ⲻ' => 'ⲻ',
1004
+ 'Ⲽ' => 'ⲽ',
1005
+ 'Ⲿ' => 'ⲿ',
1006
+ 'Ⳁ' => 'ⳁ',
1007
+ 'Ⳃ' => 'ⳃ',
1008
+ 'Ⳅ' => 'ⳅ',
1009
+ 'Ⳇ' => 'ⳇ',
1010
+ 'Ⳉ' => 'ⳉ',
1011
+ 'Ⳋ' => 'ⳋ',
1012
+ 'Ⳍ' => 'ⳍ',
1013
+ 'Ⳏ' => 'ⳏ',
1014
+ 'Ⳑ' => 'ⳑ',
1015
+ 'Ⳓ' => 'ⳓ',
1016
+ 'Ⳕ' => 'ⳕ',
1017
+ 'Ⳗ' => 'ⳗ',
1018
+ 'Ⳙ' => 'ⳙ',
1019
+ 'Ⳛ' => 'ⳛ',
1020
+ 'Ⳝ' => 'ⳝ',
1021
+ 'Ⳟ' => 'ⳟ',
1022
+ 'Ⳡ' => 'ⳡ',
1023
+ 'Ⳣ' => 'ⳣ',
1024
+ 'Ⳬ' => 'ⳬ',
1025
+ 'Ⳮ' => 'ⳮ',
1026
+ 'Ⳳ' => 'ⳳ',
1027
+ 'Ꙁ' => 'ꙁ',
1028
+ 'Ꙃ' => 'ꙃ',
1029
+ 'Ꙅ' => 'ꙅ',
1030
+ 'Ꙇ' => 'ꙇ',
1031
+ 'Ꙉ' => 'ꙉ',
1032
+ 'Ꙋ' => 'ꙋ',
1033
+ 'Ꙍ' => 'ꙍ',
1034
+ 'Ꙏ' => 'ꙏ',
1035
+ 'Ꙑ' => 'ꙑ',
1036
+ 'Ꙓ' => 'ꙓ',
1037
+ 'Ꙕ' => 'ꙕ',
1038
+ 'Ꙗ' => 'ꙗ',
1039
+ 'Ꙙ' => 'ꙙ',
1040
+ 'Ꙛ' => 'ꙛ',
1041
+ 'Ꙝ' => 'ꙝ',
1042
+ 'Ꙟ' => 'ꙟ',
1043
+ 'Ꙡ' => 'ꙡ',
1044
+ 'Ꙣ' => 'ꙣ',
1045
+ 'Ꙥ' => 'ꙥ',
1046
+ 'Ꙧ' => 'ꙧ',
1047
+ 'Ꙩ' => 'ꙩ',
1048
+ 'Ꙫ' => 'ꙫ',
1049
+ 'Ꙭ' => 'ꙭ',
1050
+ 'Ꚁ' => 'ꚁ',
1051
+ 'Ꚃ' => 'ꚃ',
1052
+ 'Ꚅ' => 'ꚅ',
1053
+ 'Ꚇ' => 'ꚇ',
1054
+ 'Ꚉ' => 'ꚉ',
1055
+ 'Ꚋ' => 'ꚋ',
1056
+ 'Ꚍ' => 'ꚍ',
1057
+ 'Ꚏ' => 'ꚏ',
1058
+ 'Ꚑ' => 'ꚑ',
1059
+ 'Ꚓ' => 'ꚓ',
1060
+ 'Ꚕ' => 'ꚕ',
1061
+ 'Ꚗ' => 'ꚗ',
1062
+ 'Ꚙ' => 'ꚙ',
1063
+ 'Ꚛ' => 'ꚛ',
1064
+ 'Ꜣ' => 'ꜣ',
1065
+ 'Ꜥ' => 'ꜥ',
1066
+ 'Ꜧ' => 'ꜧ',
1067
+ 'Ꜩ' => 'ꜩ',
1068
+ 'Ꜫ' => 'ꜫ',
1069
+ 'Ꜭ' => 'ꜭ',
1070
+ 'Ꜯ' => 'ꜯ',
1071
+ 'Ꜳ' => 'ꜳ',
1072
+ 'Ꜵ' => 'ꜵ',
1073
+ 'Ꜷ' => 'ꜷ',
1074
+ 'Ꜹ' => 'ꜹ',
1075
+ 'Ꜻ' => 'ꜻ',
1076
+ 'Ꜽ' => 'ꜽ',
1077
+ 'Ꜿ' => 'ꜿ',
1078
+ 'Ꝁ' => 'ꝁ',
1079
+ 'Ꝃ' => 'ꝃ',
1080
+ 'Ꝅ' => 'ꝅ',
1081
+ 'Ꝇ' => 'ꝇ',
1082
+ 'Ꝉ' => 'ꝉ',
1083
+ 'Ꝋ' => 'ꝋ',
1084
+ 'Ꝍ' => 'ꝍ',
1085
+ 'Ꝏ' => 'ꝏ',
1086
+ 'Ꝑ' => 'ꝑ',
1087
+ 'Ꝓ' => 'ꝓ',
1088
+ 'Ꝕ' => 'ꝕ',
1089
+ 'Ꝗ' => 'ꝗ',
1090
+ 'Ꝙ' => 'ꝙ',
1091
+ 'Ꝛ' => 'ꝛ',
1092
+ 'Ꝝ' => 'ꝝ',
1093
+ 'Ꝟ' => 'ꝟ',
1094
+ 'Ꝡ' => 'ꝡ',
1095
+ 'Ꝣ' => 'ꝣ',
1096
+ 'Ꝥ' => 'ꝥ',
1097
+ 'Ꝧ' => 'ꝧ',
1098
+ 'Ꝩ' => 'ꝩ',
1099
+ 'Ꝫ' => 'ꝫ',
1100
+ 'Ꝭ' => 'ꝭ',
1101
+ 'Ꝯ' => 'ꝯ',
1102
+ 'Ꝺ' => 'ꝺ',
1103
+ 'Ꝼ' => 'ꝼ',
1104
+ 'Ᵹ' => 'ᵹ',
1105
+ 'Ꝿ' => 'ꝿ',
1106
+ 'Ꞁ' => 'ꞁ',
1107
+ 'Ꞃ' => 'ꞃ',
1108
+ 'Ꞅ' => 'ꞅ',
1109
+ 'Ꞇ' => 'ꞇ',
1110
+ 'Ꞌ' => 'ꞌ',
1111
+ 'Ɥ' => 'ɥ',
1112
+ 'Ꞑ' => 'ꞑ',
1113
+ 'Ꞓ' => 'ꞓ',
1114
+ 'Ꞗ' => 'ꞗ',
1115
+ 'Ꞙ' => 'ꞙ',
1116
+ 'Ꞛ' => 'ꞛ',
1117
+ 'Ꞝ' => 'ꞝ',
1118
+ 'Ꞟ' => 'ꞟ',
1119
+ 'Ꞡ' => 'ꞡ',
1120
+ 'Ꞣ' => 'ꞣ',
1121
+ 'Ꞥ' => 'ꞥ',
1122
+ 'Ꞧ' => 'ꞧ',
1123
+ 'Ꞩ' => 'ꞩ',
1124
+ 'Ɦ' => 'ɦ',
1125
+ 'Ɜ' => 'ɜ',
1126
+ 'Ɡ' => 'ɡ',
1127
+ 'Ɬ' => 'ɬ',
1128
+ 'Ɪ' => 'ɪ',
1129
+ 'Ʞ' => 'ʞ',
1130
+ 'Ʇ' => 'ʇ',
1131
+ 'Ʝ' => 'ʝ',
1132
+ 'Ꭓ' => 'ꭓ',
1133
+ 'Ꞵ' => 'ꞵ',
1134
+ 'Ꞷ' => 'ꞷ',
1135
+ 'Ꞹ' => 'ꞹ',
1136
+ 'Ꞻ' => 'ꞻ',
1137
+ 'Ꞽ' => 'ꞽ',
1138
+ 'Ꞿ' => 'ꞿ',
1139
+ 'Ꟃ' => 'ꟃ',
1140
+ 'Ꞔ' => 'ꞔ',
1141
+ 'Ʂ' => 'ʂ',
1142
+ 'Ᶎ' => 'ᶎ',
1143
+ 'Ꟈ' => 'ꟈ',
1144
+ 'Ꟊ' => 'ꟊ',
1145
+ 'Ꟶ' => 'ꟶ',
1146
+ 'A' => 'a',
1147
+ 'B' => 'b',
1148
+ 'C' => 'c',
1149
+ 'D' => 'd',
1150
+ 'E' => 'e',
1151
+ 'F' => 'f',
1152
+ 'G' => 'g',
1153
+ 'H' => 'h',
1154
+ 'I' => 'i',
1155
+ 'J' => 'j',
1156
+ 'K' => 'k',
1157
+ 'L' => 'l',
1158
+ 'M' => 'm',
1159
+ 'N' => 'n',
1160
+ 'O' => 'o',
1161
+ 'P' => 'p',
1162
+ 'Q' => 'q',
1163
+ 'R' => 'r',
1164
+ 'S' => 's',
1165
+ 'T' => 't',
1166
+ 'U' => 'u',
1167
+ 'V' => 'v',
1168
+ 'W' => 'w',
1169
+ 'X' => 'x',
1170
+ 'Y' => 'y',
1171
+ 'Z' => 'z',
1172
+ '𐐀' => '𐐨',
1173
+ '𐐁' => '𐐩',
1174
+ '𐐂' => '𐐪',
1175
+ '𐐃' => '𐐫',
1176
+ '𐐄' => '𐐬',
1177
+ '𐐅' => '𐐭',
1178
+ '𐐆' => '𐐮',
1179
+ '𐐇' => '𐐯',
1180
+ '𐐈' => '𐐰',
1181
+ '𐐉' => '𐐱',
1182
+ '𐐊' => '𐐲',
1183
+ '𐐋' => '𐐳',
1184
+ '𐐌' => '𐐴',
1185
+ '𐐍' => '𐐵',
1186
+ '𐐎' => '𐐶',
1187
+ '𐐏' => '𐐷',
1188
+ '𐐐' => '𐐸',
1189
+ '𐐑' => '𐐹',
1190
+ '𐐒' => '𐐺',
1191
+ '𐐓' => '𐐻',
1192
+ '𐐔' => '𐐼',
1193
+ '𐐕' => '𐐽',
1194
+ '𐐖' => '𐐾',
1195
+ '𐐗' => '𐐿',
1196
+ '𐐘' => '𐑀',
1197
+ '𐐙' => '𐑁',
1198
+ '𐐚' => '𐑂',
1199
+ '𐐛' => '𐑃',
1200
+ '𐐜' => '𐑄',
1201
+ '𐐝' => '𐑅',
1202
+ '𐐞' => '𐑆',
1203
+ '𐐟' => '𐑇',
1204
+ '𐐠' => '𐑈',
1205
+ '𐐡' => '𐑉',
1206
+ '𐐢' => '𐑊',
1207
+ '𐐣' => '𐑋',
1208
+ '𐐤' => '𐑌',
1209
+ '𐐥' => '𐑍',
1210
+ '𐐦' => '𐑎',
1211
+ '𐐧' => '𐑏',
1212
+ '𐒰' => '𐓘',
1213
+ '𐒱' => '𐓙',
1214
+ '𐒲' => '𐓚',
1215
+ '𐒳' => '𐓛',
1216
+ '𐒴' => '𐓜',
1217
+ '𐒵' => '𐓝',
1218
+ '𐒶' => '𐓞',
1219
+ '𐒷' => '𐓟',
1220
+ '𐒸' => '𐓠',
1221
+ '𐒹' => '𐓡',
1222
+ '𐒺' => '𐓢',
1223
+ '𐒻' => '𐓣',
1224
+ '𐒼' => '𐓤',
1225
+ '𐒽' => '𐓥',
1226
+ '𐒾' => '𐓦',
1227
+ '𐒿' => '𐓧',
1228
+ '𐓀' => '𐓨',
1229
+ '𐓁' => '𐓩',
1230
+ '𐓂' => '𐓪',
1231
+ '𐓃' => '𐓫',
1232
+ '𐓄' => '𐓬',
1233
+ '𐓅' => '𐓭',
1234
+ '𐓆' => '𐓮',
1235
+ '𐓇' => '𐓯',
1236
+ '𐓈' => '𐓰',
1237
+ '𐓉' => '𐓱',
1238
+ '𐓊' => '𐓲',
1239
+ '𐓋' => '𐓳',
1240
+ '𐓌' => '𐓴',
1241
+ '𐓍' => '𐓵',
1242
+ '𐓎' => '𐓶',
1243
+ '𐓏' => '𐓷',
1244
+ '𐓐' => '𐓸',
1245
+ '𐓑' => '𐓹',
1246
+ '𐓒' => '𐓺',
1247
+ '𐓓' => '𐓻',
1248
+ '𐲀' => '𐳀',
1249
+ '𐲁' => '𐳁',
1250
+ '𐲂' => '𐳂',
1251
+ '𐲃' => '𐳃',
1252
+ '𐲄' => '𐳄',
1253
+ '𐲅' => '𐳅',
1254
+ '𐲆' => '𐳆',
1255
+ '𐲇' => '𐳇',
1256
+ '𐲈' => '𐳈',
1257
+ '𐲉' => '𐳉',
1258
+ '𐲊' => '𐳊',
1259
+ '𐲋' => '𐳋',
1260
+ '𐲌' => '𐳌',
1261
+ '𐲍' => '𐳍',
1262
+ '𐲎' => '𐳎',
1263
+ '𐲏' => '𐳏',
1264
+ '𐲐' => '𐳐',
1265
+ '𐲑' => '𐳑',
1266
+ '𐲒' => '𐳒',
1267
+ '𐲓' => '𐳓',
1268
+ '𐲔' => '𐳔',
1269
+ '𐲕' => '𐳕',
1270
+ '𐲖' => '𐳖',
1271
+ '𐲗' => '𐳗',
1272
+ '𐲘' => '𐳘',
1273
+ '𐲙' => '𐳙',
1274
+ '𐲚' => '𐳚',
1275
+ '𐲛' => '𐳛',
1276
+ '𐲜' => '𐳜',
1277
+ '𐲝' => '𐳝',
1278
+ '𐲞' => '𐳞',
1279
+ '𐲟' => '𐳟',
1280
+ '𐲠' => '𐳠',
1281
+ '𐲡' => '𐳡',
1282
+ '𐲢' => '𐳢',
1283
+ '𐲣' => '𐳣',
1284
+ '𐲤' => '𐳤',
1285
+ '𐲥' => '𐳥',
1286
+ '𐲦' => '𐳦',
1287
+ '𐲧' => '𐳧',
1288
+ '𐲨' => '𐳨',
1289
+ '𐲩' => '𐳩',
1290
+ '𐲪' => '𐳪',
1291
+ '𐲫' => '𐳫',
1292
+ '𐲬' => '𐳬',
1293
+ '𐲭' => '𐳭',
1294
+ '𐲮' => '𐳮',
1295
+ '𐲯' => '𐳯',
1296
+ '𐲰' => '𐳰',
1297
+ '𐲱' => '𐳱',
1298
+ '𐲲' => '𐳲',
1299
+ '𑢠' => '𑣀',
1300
+ '𑢡' => '𑣁',
1301
+ '𑢢' => '𑣂',
1302
+ '𑢣' => '𑣃',
1303
+ '𑢤' => '𑣄',
1304
+ '𑢥' => '𑣅',
1305
+ '𑢦' => '𑣆',
1306
+ '𑢧' => '𑣇',
1307
+ '𑢨' => '𑣈',
1308
+ '𑢩' => '𑣉',
1309
+ '𑢪' => '𑣊',
1310
+ '𑢫' => '𑣋',
1311
+ '𑢬' => '𑣌',
1312
+ '𑢭' => '𑣍',
1313
+ '𑢮' => '𑣎',
1314
+ '𑢯' => '𑣏',
1315
+ '𑢰' => '𑣐',
1316
+ '𑢱' => '𑣑',
1317
+ '𑢲' => '𑣒',
1318
+ '𑢳' => '𑣓',
1319
+ '𑢴' => '𑣔',
1320
+ '𑢵' => '𑣕',
1321
+ '𑢶' => '𑣖',
1322
+ '𑢷' => '𑣗',
1323
+ '𑢸' => '𑣘',
1324
+ '𑢹' => '𑣙',
1325
+ '𑢺' => '𑣚',
1326
+ '𑢻' => '𑣛',
1327
+ '𑢼' => '𑣜',
1328
+ '𑢽' => '𑣝',
1329
+ '𑢾' => '𑣞',
1330
+ '𑢿' => '𑣟',
1331
+ '𖹀' => '𖹠',
1332
+ '𖹁' => '𖹡',
1333
+ '𖹂' => '𖹢',
1334
+ '𖹃' => '𖹣',
1335
+ '𖹄' => '𖹤',
1336
+ '𖹅' => '𖹥',
1337
+ '𖹆' => '𖹦',
1338
+ '𖹇' => '𖹧',
1339
+ '𖹈' => '𖹨',
1340
+ '𖹉' => '𖹩',
1341
+ '𖹊' => '𖹪',
1342
+ '𖹋' => '𖹫',
1343
+ '𖹌' => '𖹬',
1344
+ '𖹍' => '𖹭',
1345
+ '𖹎' => '𖹮',
1346
+ '𖹏' => '𖹯',
1347
+ '𖹐' => '𖹰',
1348
+ '𖹑' => '𖹱',
1349
+ '𖹒' => '𖹲',
1350
+ '𖹓' => '𖹳',
1351
+ '𖹔' => '𖹴',
1352
+ '𖹕' => '𖹵',
1353
+ '𖹖' => '𖹶',
1354
+ '𖹗' => '𖹷',
1355
+ '𖹘' => '𖹸',
1356
+ '𖹙' => '𖹹',
1357
+ '𖹚' => '𖹺',
1358
+ '𖹛' => '𖹻',
1359
+ '𖹜' => '𖹼',
1360
+ '𖹝' => '𖹽',
1361
+ '𖹞' => '𖹾',
1362
+ '𖹟' => '𖹿',
1363
+ '𞤀' => '𞤢',
1364
+ '𞤁' => '𞤣',
1365
+ '𞤂' => '𞤤',
1366
+ '𞤃' => '𞤥',
1367
+ '𞤄' => '𞤦',
1368
+ '𞤅' => '𞤧',
1369
+ '𞤆' => '𞤨',
1370
+ '𞤇' => '𞤩',
1371
+ '𞤈' => '𞤪',
1372
+ '𞤉' => '𞤫',
1373
+ '𞤊' => '𞤬',
1374
+ '𞤋' => '𞤭',
1375
+ '𞤌' => '𞤮',
1376
+ '𞤍' => '𞤯',
1377
+ '𞤎' => '𞤰',
1378
+ '𞤏' => '𞤱',
1379
+ '𞤐' => '𞤲',
1380
+ '𞤑' => '𞤳',
1381
+ '𞤒' => '𞤴',
1382
+ '𞤓' => '𞤵',
1383
+ '𞤔' => '𞤶',
1384
+ '𞤕' => '𞤷',
1385
+ '𞤖' => '𞤸',
1386
+ '𞤗' => '𞤹',
1387
+ '𞤘' => '𞤺',
1388
+ '𞤙' => '𞤻',
1389
+ '𞤚' => '𞤼',
1390
+ '𞤛' => '𞤽',
1391
+ '𞤜' => '𞤾',
1392
+ '𞤝' => '𞤿',
1393
+ '𞤞' => '𞥀',
1394
+ '𞤟' => '𞥁',
1395
+ '𞤠' => '𞥂',
1396
+ '𞤡' => '𞥃',
1397
+ );
vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php CHANGED
@@ -1,5 +1,5 @@
1
- <?php
2
-
3
- // from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
4
-
5
- return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
1
+ <?php
2
+
3
+ // from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
4
+
5
+ return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x{2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{ABED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A}\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php CHANGED
@@ -1,1414 +1,1414 @@
1
- <?php
2
-
3
- return array (
4
- 'a' => 'A',
5
- 'b' => 'B',
6
- 'c' => 'C',
7
- 'd' => 'D',
8
- 'e' => 'E',
9
- 'f' => 'F',
10
- 'g' => 'G',
11
- 'h' => 'H',
12
- 'i' => 'I',
13
- 'j' => 'J',
14
- 'k' => 'K',
15
- 'l' => 'L',
16
- 'm' => 'M',
17
- 'n' => 'N',
18
- 'o' => 'O',
19
- 'p' => 'P',
20
- 'q' => 'Q',
21
- 'r' => 'R',
22
- 's' => 'S',
23
- 't' => 'T',
24
- 'u' => 'U',
25
- 'v' => 'V',
26
- 'w' => 'W',
27
- 'x' => 'X',
28
- 'y' => 'Y',
29
- 'z' => 'Z',
30
- 'µ' => 'Μ',
31
- 'à' => 'À',
32
- 'á' => 'Á',
33
- 'â' => 'Â',
34
- 'ã' => 'Ã',
35
- 'ä' => 'Ä',
36
- 'å' => 'Å',
37
- 'æ' => 'Æ',
38
- 'ç' => 'Ç',
39
- 'è' => 'È',
40
- 'é' => 'É',
41
- 'ê' => 'Ê',
42
- 'ë' => 'Ë',
43
- 'ì' => 'Ì',
44
- 'í' => 'Í',
45
- 'î' => 'Î',
46
- 'ï' => 'Ï',
47
- 'ð' => 'Ð',
48
- 'ñ' => 'Ñ',
49
- 'ò' => 'Ò',
50
- 'ó' => 'Ó',
51
- 'ô' => 'Ô',
52
- 'õ' => 'Õ',
53
- 'ö' => 'Ö',
54
- 'ø' => 'Ø',
55
- 'ù' => 'Ù',
56
- 'ú' => 'Ú',
57
- 'û' => 'Û',
58
- 'ü' => 'Ü',
59
- 'ý' => 'Ý',
60
- 'þ' => 'Þ',
61
- 'ÿ' => 'Ÿ',
62
- 'ā' => 'Ā',
63
- 'ă' => 'Ă',
64
- 'ą' => 'Ą',
65
- 'ć' => 'Ć',
66
- 'ĉ' => 'Ĉ',
67
- 'ċ' => 'Ċ',
68
- 'č' => 'Č',
69
- 'ď' => 'Ď',
70
- 'đ' => 'Đ',
71
- 'ē' => 'Ē',
72
- 'ĕ' => 'Ĕ',
73
- 'ė' => 'Ė',
74
- 'ę' => 'Ę',
75
- 'ě' => 'Ě',
76
- 'ĝ' => 'Ĝ',
77
- 'ğ' => 'Ğ',
78
- 'ġ' => 'Ġ',
79
- 'ģ' => 'Ģ',
80
- 'ĥ' => 'Ĥ',
81
- 'ħ' => 'Ħ',
82
- 'ĩ' => 'Ĩ',
83
- 'ī' => 'Ī',
84
- 'ĭ' => 'Ĭ',
85
- 'į' => 'Į',
86
- 'ı' => 'I',
87
- 'ij' => 'IJ',
88
- 'ĵ' => 'Ĵ',
89
- 'ķ' => 'Ķ',
90
- 'ĺ' => 'Ĺ',
91
- 'ļ' => 'Ļ',
92
- 'ľ' => 'Ľ',
93
- 'ŀ' => 'Ŀ',
94
- 'ł' => 'Ł',
95
- 'ń' => 'Ń',
96
- 'ņ' => 'Ņ',
97
- 'ň' => 'Ň',
98
- 'ŋ' => 'Ŋ',
99
- 'ō' => 'Ō',
100
- 'ŏ' => 'Ŏ',
101
- 'ő' => 'Ő',
102
- 'œ' => 'Œ',
103
- 'ŕ' => 'Ŕ',
104
- 'ŗ' => 'Ŗ',
105
- 'ř' => 'Ř',
106
- 'ś' => 'Ś',
107
- 'ŝ' => 'Ŝ',
108
- 'ş' => 'Ş',
109
- 'š' => 'Š',
110
- 'ţ' => 'Ţ',
111
- 'ť' => 'Ť',
112
- 'ŧ' => 'Ŧ',
113
- 'ũ' => 'Ũ',
114
- 'ū' => 'Ū',
115
- 'ŭ' => 'Ŭ',
116
- 'ů' => 'Ů',
117
- 'ű' => 'Ű',
118
- 'ų' => 'Ų',
119
- 'ŵ' => 'Ŵ',
120
- 'ŷ' => 'Ŷ',
121
- 'ź' => 'Ź',
122
- 'ż' => 'Ż',
123
- 'ž' => 'Ž',
124
- 'ſ' => 'S',
125
- 'ƀ' => 'Ƀ',
126
- 'ƃ' => 'Ƃ',
127
- 'ƅ' => 'Ƅ',
128
- 'ƈ' => 'Ƈ',
129
- 'ƌ' => 'Ƌ',
130
- 'ƒ' => 'Ƒ',
131
- 'ƕ' => 'Ƕ',
132
- 'ƙ' => 'Ƙ',
133
- 'ƚ' => 'Ƚ',
134
- 'ƞ' => 'Ƞ',
135
- 'ơ' => 'Ơ',
136
- 'ƣ' => 'Ƣ',
137
- 'ƥ' => 'Ƥ',
138
- 'ƨ' => 'Ƨ',
139
- 'ƭ' => 'Ƭ',
140
- 'ư' => 'Ư',
141
- 'ƴ' => 'Ƴ',
142
- 'ƶ' => 'Ƶ',
143
- 'ƹ' => 'Ƹ',
144
- 'ƽ' => 'Ƽ',
145
- 'ƿ' => 'Ƿ',
146
- 'Dž' => 'DŽ',
147
- 'dž' => 'DŽ',
148
- 'Lj' => 'LJ',
149
- 'lj' => 'LJ',
150
- 'Nj' => 'NJ',
151
- 'nj' => 'NJ',
152
- 'ǎ' => 'Ǎ',
153
- 'ǐ' => 'Ǐ',
154
- 'ǒ' => 'Ǒ',
155
- 'ǔ' => 'Ǔ',
156
- 'ǖ' => 'Ǖ',
157
- 'ǘ' => 'Ǘ',
158
- 'ǚ' => 'Ǚ',
159
- 'ǜ' => 'Ǜ',
160
- 'ǝ' => 'Ǝ',
161
- 'ǟ' => 'Ǟ',
162
- 'ǡ' => 'Ǡ',
163
- 'ǣ' => 'Ǣ',
164
- 'ǥ' => 'Ǥ',
165
- 'ǧ' => 'Ǧ',
166
- 'ǩ' => 'Ǩ',
167
- 'ǫ' => 'Ǫ',
168
- 'ǭ' => 'Ǭ',
169
- 'ǯ' => 'Ǯ',
170
- 'Dz' => 'DZ',
171
- 'dz' => 'DZ',
172
- 'ǵ' => 'Ǵ',
173
- 'ǹ' => 'Ǹ',
174
- 'ǻ' => 'Ǻ',
175
- 'ǽ' => 'Ǽ',
176
- 'ǿ' => 'Ǿ',
177
- 'ȁ' => 'Ȁ',
178
- 'ȃ' => 'Ȃ',
179
- 'ȅ' => 'Ȅ',
180
- 'ȇ' => 'Ȇ',
181
- 'ȉ' => 'Ȉ',
182
- 'ȋ' => 'Ȋ',
183
- 'ȍ' => 'Ȍ',
184
- 'ȏ' => 'Ȏ',
185
- 'ȑ' => 'Ȑ',
186
- 'ȓ' => 'Ȓ',
187
- 'ȕ' => 'Ȕ',
188
- 'ȗ' => 'Ȗ',
189
- 'ș' => 'Ș',
190
- 'ț' => 'Ț',
191
- 'ȝ' => 'Ȝ',
192
- 'ȟ' => 'Ȟ',
193
- 'ȣ' => 'Ȣ',
194
- 'ȥ' => 'Ȥ',
195
- 'ȧ' => 'Ȧ',
196
- 'ȩ' => 'Ȩ',
197
- 'ȫ' => 'Ȫ',
198
- 'ȭ' => 'Ȭ',
199
- 'ȯ' => 'Ȯ',
200
- 'ȱ' => 'Ȱ',
201
- 'ȳ' => 'Ȳ',
202
- 'ȼ' => 'Ȼ',
203
- 'ȿ' => 'Ȿ',
204
- 'ɀ' => 'Ɀ',
205
- 'ɂ' => 'Ɂ',
206
- 'ɇ' => 'Ɇ',
207
- 'ɉ' => 'Ɉ',
208
- 'ɋ' => 'Ɋ',
209
- 'ɍ' => 'Ɍ',
210
- 'ɏ' => 'Ɏ',
211
- 'ɐ' => 'Ɐ',
212
- 'ɑ' => 'Ɑ',
213
- 'ɒ' => 'Ɒ',
214
- 'ɓ' => 'Ɓ',
215
- 'ɔ' => 'Ɔ',
216
- 'ɖ' => 'Ɖ',
217
- 'ɗ' => 'Ɗ',
218
- 'ə' => 'Ə',
219
- 'ɛ' => 'Ɛ',
220
- 'ɜ' => 'Ɜ',
221
- 'ɠ' => 'Ɠ',
222
- 'ɡ' => 'Ɡ',
223
- 'ɣ' => 'Ɣ',
224
- 'ɥ' => 'Ɥ',
225
- 'ɦ' => 'Ɦ',
226
- 'ɨ' => 'Ɨ',
227
- 'ɩ' => 'Ɩ',
228
- 'ɪ' => 'Ɪ',
229
- 'ɫ' => 'Ɫ',
230
- 'ɬ' => 'Ɬ',
231
- 'ɯ' => 'Ɯ',
232
- 'ɱ' => 'Ɱ',
233
- 'ɲ' => 'Ɲ',
234
- 'ɵ' => 'Ɵ',
235
- 'ɽ' => 'Ɽ',
236
- 'ʀ' => 'Ʀ',
237
- 'ʂ' => 'Ʂ',
238
- 'ʃ' => 'Ʃ',
239
- 'ʇ' => 'Ʇ',
240
- 'ʈ' => 'Ʈ',
241
- 'ʉ' => 'Ʉ',
242
- 'ʊ' => 'Ʊ',
243
- 'ʋ' => 'Ʋ',
244
- 'ʌ' => 'Ʌ',
245
- 'ʒ' => 'Ʒ',
246
- 'ʝ' => 'Ʝ',
247
- 'ʞ' => 'Ʞ',
248
- 'ͅ' => 'Ι',
249
- 'ͱ' => 'Ͱ',
250
- 'ͳ' => 'Ͳ',
251
- 'ͷ' => 'Ͷ',
252
- 'ͻ' => 'Ͻ',
253
- 'ͼ' => 'Ͼ',
254
- 'ͽ' => 'Ͽ',
255
- 'ά' => 'Ά',
256
- 'έ' => 'Έ',
257
- 'ή' => 'Ή',
258
- 'ί' => 'Ί',
259
- 'α' => 'Α',
260
- 'β' => 'Β',
261
- 'γ' => 'Γ',
262
- 'δ' => 'Δ',
263
- 'ε' => 'Ε',
264
- 'ζ' => 'Ζ',
265
- 'η' => 'Η',
266
- 'θ' => 'Θ',
267
- 'ι' => 'Ι',
268
- 'κ' => 'Κ',
269
- 'λ' => 'Λ',
270
- 'μ' => 'Μ',
271
- 'ν' => 'Ν',
272
- 'ξ' => 'Ξ',
273
- 'ο' => 'Ο',
274
- 'π' => 'Π',
275
- 'ρ' => 'Ρ',
276
- 'ς' => 'Σ',
277
- 'σ' => 'Σ',
278
- 'τ' => 'Τ',
279
- 'υ' => 'Υ',
280
- 'φ' => 'Φ',
281
- 'χ' => 'Χ',
282
- 'ψ' => 'Ψ',
283
- 'ω' => 'Ω',
284
- 'ϊ' => 'Ϊ',
285
- 'ϋ' => 'Ϋ',
286
- 'ό' => 'Ό',
287
- 'ύ' => 'Ύ',
288
- 'ώ' => 'Ώ',
289
- 'ϐ' => 'Β',
290
- 'ϑ' => 'Θ',
291
- 'ϕ' => 'Φ',
292
- 'ϖ' => 'Π',
293
- 'ϗ' => 'Ϗ',
294
- 'ϙ' => 'Ϙ',
295
- 'ϛ' => 'Ϛ',
296
- 'ϝ' => 'Ϝ',
297
- 'ϟ' => 'Ϟ',
298
- 'ϡ' => 'Ϡ',
299
- 'ϣ' => 'Ϣ',
300
- 'ϥ' => 'Ϥ',
301
- 'ϧ' => 'Ϧ',
302
- 'ϩ' => 'Ϩ',
303
- 'ϫ' => 'Ϫ',
304
- 'ϭ' => 'Ϭ',
305
- 'ϯ' => 'Ϯ',
306
- 'ϰ' => 'Κ',
307
- 'ϱ' => 'Ρ',
308
- 'ϲ' => 'Ϲ',
309
- 'ϳ' => 'Ϳ',
310
- 'ϵ' => 'Ε',
311
- 'ϸ' => 'Ϸ',
312
- 'ϻ' => 'Ϻ',
313
- 'а' => 'А',
314
- 'б' => 'Б',
315
- 'в' => 'В',
316
- 'г' => 'Г',
317
- 'д' => 'Д',
318
- 'е' => 'Е',
319
- 'ж' => 'Ж',
320
- 'з' => 'З',
321
- 'и' => 'И',
322
- 'й' => 'Й',
323
- 'к' => 'К',
324
- 'л' => 'Л',
325
- 'м' => 'М',
326
- 'н' => 'Н',
327
- 'о' => 'О',
328
- 'п' => 'П',
329
- 'р' => 'Р',
330
- 'с' => 'С',
331
- 'т' => 'Т',
332
- 'у' => 'У',
333
- 'ф' => 'Ф',
334
- 'х' => 'Х',
335
- 'ц' => 'Ц',
336
- 'ч' => 'Ч',
337
- 'ш' => 'Ш',
338
- 'щ' => 'Щ',
339
- 'ъ' => 'Ъ',
340
- 'ы' => 'Ы',
341
- 'ь' => 'Ь',
342
- 'э' => 'Э',
343
- 'ю' => 'Ю',
344
- 'я' => 'Я',
345
- 'ѐ' => 'Ѐ',
346
- 'ё' => 'Ё',
347
- 'ђ' => 'Ђ',
348
- 'ѓ' => 'Ѓ',
349
- 'є' => 'Є',
350
- 'ѕ' => 'Ѕ',
351
- 'і' => 'І',
352
- 'ї' => 'Ї',
353
- 'ј' => 'Ј',
354
- 'љ' => 'Љ',
355
- 'њ' => 'Њ',
356
- 'ћ' => 'Ћ',
357
- 'ќ' => 'Ќ',
358
- 'ѝ' => 'Ѝ',
359
- 'ў' => 'Ў',
360
- 'џ' => 'Џ',
361
- 'ѡ' => 'Ѡ',
362
- 'ѣ' => 'Ѣ',
363
- 'ѥ' => 'Ѥ',
364
- 'ѧ' => 'Ѧ',
365
- 'ѩ' => 'Ѩ',
366
- 'ѫ' => 'Ѫ',
367
- 'ѭ' => 'Ѭ',
368
- 'ѯ' => 'Ѯ',
369
- 'ѱ' => 'Ѱ',
370
- 'ѳ' => 'Ѳ',
371
- 'ѵ' => 'Ѵ',
372
- 'ѷ' => 'Ѷ',
373
- 'ѹ' => 'Ѹ',
374
- 'ѻ' => 'Ѻ',
375
- 'ѽ' => 'Ѽ',
376
- 'ѿ' => 'Ѿ',
377
- 'ҁ' => 'Ҁ',
378
- 'ҋ' => 'Ҋ',
379
- 'ҍ' => 'Ҍ',
380
- 'ҏ' => 'Ҏ',
381
- 'ґ' => 'Ґ',
382
- 'ғ' => 'Ғ',
383
- 'ҕ' => 'Ҕ',
384
- 'җ' => 'Җ',
385
- 'ҙ' => 'Ҙ',
386
- 'қ' => 'Қ',
387
- 'ҝ' => 'Ҝ',
388
- 'ҟ' => 'Ҟ',
389
- 'ҡ' => 'Ҡ',
390
- 'ң' => 'Ң',
391
- 'ҥ' => 'Ҥ',
392
- 'ҧ' => 'Ҧ',
393
- 'ҩ' => 'Ҩ',
394
- 'ҫ' => 'Ҫ',
395
- 'ҭ' => 'Ҭ',
396
- 'ү' => 'Ү',
397
- 'ұ' => 'Ұ',
398
- 'ҳ' => 'Ҳ',
399
- 'ҵ' => 'Ҵ',
400
- 'ҷ' => 'Ҷ',
401
- 'ҹ' => 'Ҹ',
402
- 'һ' => 'Һ',
403
- 'ҽ' => 'Ҽ',
404
- 'ҿ' => 'Ҿ',
405
- 'ӂ' => 'Ӂ',
406
- 'ӄ' => 'Ӄ',
407
- 'ӆ' => 'Ӆ',
408
- 'ӈ' => 'Ӈ',
409
- 'ӊ' => 'Ӊ',
410
- 'ӌ' => 'Ӌ',
411
- 'ӎ' => 'Ӎ',
412
- 'ӏ' => 'Ӏ',
413
- 'ӑ' => 'Ӑ',
414
- 'ӓ' => 'Ӓ',
415
- 'ӕ' => 'Ӕ',
416
- 'ӗ' => 'Ӗ',
417
- 'ә' => 'Ә',
418
- 'ӛ' => 'Ӛ',
419
- 'ӝ' => 'Ӝ',
420
- 'ӟ' => 'Ӟ',
421
- 'ӡ' => 'Ӡ',
422
- 'ӣ' => 'Ӣ',
423
- 'ӥ' => 'Ӥ',
424
- 'ӧ' => 'Ӧ',
425
- 'ө' => 'Ө',
426
- 'ӫ' => 'Ӫ',
427
- 'ӭ' => 'Ӭ',
428
- 'ӯ' => 'Ӯ',
429
- 'ӱ' => 'Ӱ',
430
- 'ӳ' => 'Ӳ',
431
- 'ӵ' => 'Ӵ',
432
- 'ӷ' => 'Ӷ',
433
- 'ӹ' => 'Ӹ',
434
- 'ӻ' => 'Ӻ',
435
- 'ӽ' => 'Ӽ',
436
- 'ӿ' => 'Ӿ',
437
- 'ԁ' => 'Ԁ',
438
- 'ԃ' => 'Ԃ',
439
- 'ԅ' => 'Ԅ',
440
- 'ԇ' => 'Ԇ',
441
- 'ԉ' => 'Ԉ',
442
- 'ԋ' => 'Ԋ',
443
- 'ԍ' => 'Ԍ',
444
- 'ԏ' => 'Ԏ',
445
- 'ԑ' => 'Ԑ',
446
- 'ԓ' => 'Ԓ',
447
- 'ԕ' => 'Ԕ',
448
- 'ԗ' => 'Ԗ',
449
- 'ԙ' => 'Ԙ',
450
- 'ԛ' => 'Ԛ',
451
- 'ԝ' => 'Ԝ',
452
- 'ԟ' => 'Ԟ',
453
- 'ԡ' => 'Ԡ',
454
- 'ԣ' => 'Ԣ',
455
- 'ԥ' => 'Ԥ',
456
- 'ԧ' => 'Ԧ',
457
- 'ԩ' => 'Ԩ',
458
- 'ԫ' => 'Ԫ',
459
- 'ԭ' => 'Ԭ',
460
- 'ԯ' => 'Ԯ',
461
- 'ա' => 'Ա',
462
- 'բ' => 'Բ',
463
- 'գ' => 'Գ',
464
- 'դ' => 'Դ',
465
- 'ե' => 'Ե',
466
- 'զ' => 'Զ',
467
- 'է' => 'Է',
468
- 'ը' => 'Ը',
469
- 'թ' => 'Թ',
470
- 'ժ' => 'Ժ',
471
- 'ի' => 'Ի',
472
- 'լ' => 'Լ',
473
- 'խ' => 'Խ',
474
- 'ծ' => 'Ծ',
475
- 'կ' => 'Կ',
476
- 'հ' => 'Հ',
477
- 'ձ' => 'Ձ',
478
- 'ղ' => 'Ղ',
479
- 'ճ' => 'Ճ',
480
- 'մ' => 'Մ',
481
- 'յ' => 'Յ',
482
- 'ն' => 'Ն',
483
- 'շ' => 'Շ',
484
- 'ո' => 'Ո',
485
- 'չ' => 'Չ',
486
- 'պ' => 'Պ',
487
- 'ջ' => 'Ջ',
488
- 'ռ' => 'Ռ',
489
- 'ս' => 'Ս',
490
- 'վ' => 'Վ',
491
- 'տ' => 'Տ',
492
- 'ր' => 'Ր',
493
- 'ց' => 'Ց',
494
- 'ւ' => 'Ւ',
495
- 'փ' => 'Փ',
496
- 'ք' => 'Ք',
497
- 'օ' => 'Օ',
498
- 'ֆ' => 'Ֆ',
499
- 'ა' => 'Ა',
500
- 'ბ' => 'Ბ',
501
- 'გ' => 'Გ',
502
- 'დ' => 'Დ',
503
- 'ე' => 'Ე',
504
- 'ვ' => 'Ვ',
505
- 'ზ' => 'Ზ',
506
- 'თ' => 'Თ',
507
- 'ი' => 'Ი',
508
- 'კ' => 'Კ',
509
- 'ლ' => 'Ლ',
510
- 'მ' => 'Მ',
511
- 'ნ' => 'Ნ',
512
- 'ო' => 'Ო',
513
- 'პ' => 'Პ',
514
- 'ჟ' => 'Ჟ',
515
- 'რ' => 'Რ',
516
- 'ს' => 'Ს',
517
- 'ტ' => 'Ტ',
518
- 'უ' => 'Უ',
519
- 'ფ' => 'Ფ',
520
- 'ქ' => 'Ქ',
521
- 'ღ' => 'Ღ',
522
- 'ყ' => 'Ყ',
523
- 'შ' => 'Შ',
524
- 'ჩ' => 'Ჩ',
525
- 'ც' => 'Ც',
526
- 'ძ' => 'Ძ',
527
- 'წ' => 'Წ',
528
- 'ჭ' => 'Ჭ',
529
- 'ხ' => 'Ხ',
530
- 'ჯ' => 'Ჯ',
531
- 'ჰ' => 'Ჰ',
532
- 'ჱ' => 'Ჱ',
533
- 'ჲ' => 'Ჲ',
534
- 'ჳ' => 'Ჳ',
535
- 'ჴ' => 'Ჴ',
536
- 'ჵ' => 'Ჵ',
537
- 'ჶ' => 'Ჶ',
538
- 'ჷ' => 'Ჷ',
539
- 'ჸ' => 'Ჸ',
540
- 'ჹ' => 'Ჹ',
541
- 'ჺ' => 'Ჺ',
542
- 'ჽ' => 'Ჽ',
543
- 'ჾ' => 'Ჾ',
544
- 'ჿ' => 'Ჿ',
545
- 'ᏸ' => 'Ᏸ',
546
- 'ᏹ' => 'Ᏹ',
547
- 'ᏺ' => 'Ᏺ',
548
- 'ᏻ' => 'Ᏻ',
549
- 'ᏼ' => 'Ᏼ',
550
- 'ᏽ' => 'Ᏽ',
551
- 'ᲀ' => 'В',
552
- 'ᲁ' => 'Д',
553
- 'ᲂ' => 'О',
554
- 'ᲃ' => 'С',
555
- 'ᲄ' => 'Т',
556
- 'ᲅ' => 'Т',
557
- 'ᲆ' => 'Ъ',
558
- 'ᲇ' => 'Ѣ',
559
- 'ᲈ' => 'Ꙋ',
560
- 'ᵹ' => 'Ᵹ',
561
- 'ᵽ' => 'Ᵽ',
562
- 'ᶎ' => 'Ᶎ',
563
- 'ḁ' => 'Ḁ',
564
- 'ḃ' => 'Ḃ',
565
- 'ḅ' => 'Ḅ',
566
- 'ḇ' => 'Ḇ',
567
- 'ḉ' => 'Ḉ',
568
- 'ḋ' => 'Ḋ',
569
- 'ḍ' => 'Ḍ',
570
- 'ḏ' => 'Ḏ',
571
- 'ḑ' => 'Ḑ',
572
- 'ḓ' => 'Ḓ',
573
- 'ḕ' => 'Ḕ',
574
- 'ḗ' => 'Ḗ',
575
- 'ḙ' => 'Ḙ',
576
- 'ḛ' => 'Ḛ',
577
- 'ḝ' => 'Ḝ',
578
- 'ḟ' => 'Ḟ',
579
- 'ḡ' => 'Ḡ',
580
- 'ḣ' => 'Ḣ',
581
- 'ḥ' => 'Ḥ',
582
- 'ḧ' => 'Ḧ',
583
- 'ḩ' => 'Ḩ',
584
- 'ḫ' => 'Ḫ',
585
- 'ḭ' => 'Ḭ',
586
- 'ḯ' => 'Ḯ',
587
- 'ḱ' => 'Ḱ',
588
- 'ḳ' => 'Ḳ',
589
- 'ḵ' => 'Ḵ',
590
- 'ḷ' => 'Ḷ',
591
- 'ḹ' => 'Ḹ',
592
- 'ḻ' => 'Ḻ',
593
- 'ḽ' => 'Ḽ',
594
- 'ḿ' => 'Ḿ',
595
- 'ṁ' => 'Ṁ',
596
- 'ṃ' => 'Ṃ',
597
- 'ṅ' => 'Ṅ',
598
- 'ṇ' => 'Ṇ',
599
- 'ṉ' => 'Ṉ',
600
- 'ṋ' => 'Ṋ',
601
- 'ṍ' => 'Ṍ',
602
- 'ṏ' => 'Ṏ',
603
- 'ṑ' => 'Ṑ',
604
- 'ṓ' => 'Ṓ',
605
- 'ṕ' => 'Ṕ',
606
- 'ṗ' => 'Ṗ',
607
- 'ṙ' => 'Ṙ',
608
- 'ṛ' => 'Ṛ',
609
- 'ṝ' => 'Ṝ',
610
- 'ṟ' => 'Ṟ',
611
- 'ṡ' => 'Ṡ',
612
- 'ṣ' => 'Ṣ',
613
- 'ṥ' => 'Ṥ',
614
- 'ṧ' => 'Ṧ',
615
- 'ṩ' => 'Ṩ',
616
- 'ṫ' => 'Ṫ',
617
- 'ṭ' => 'Ṭ',
618
- 'ṯ' => 'Ṯ',
619
- 'ṱ' => 'Ṱ',
620
- 'ṳ' => 'Ṳ',
621
- 'ṵ' => 'Ṵ',
622
- 'ṷ' => 'Ṷ',
623
- 'ṹ' => 'Ṹ',
624
- 'ṻ' => 'Ṻ',
625
- 'ṽ' => 'Ṽ',
626
- 'ṿ' => 'Ṿ',
627
- 'ẁ' => 'Ẁ',
628
- 'ẃ' => 'Ẃ',
629
- 'ẅ' => 'Ẅ',
630
- 'ẇ' => 'Ẇ',
631
- 'ẉ' => 'Ẉ',
632
- 'ẋ' => 'Ẋ',
633
- 'ẍ' => 'Ẍ',
634
- 'ẏ' => 'Ẏ',
635
- 'ẑ' => 'Ẑ',
636
- 'ẓ' => 'Ẓ',
637
- 'ẕ' => 'Ẕ',
638
- 'ẛ' => 'Ṡ',
639
- 'ạ' => 'Ạ',
640
- 'ả' => 'Ả',
641
- 'ấ' => 'Ấ',
642
- 'ầ' => 'Ầ',
643
- 'ẩ' => 'Ẩ',
644
- 'ẫ' => 'Ẫ',
645
- 'ậ' => 'Ậ',
646
- 'ắ' => 'Ắ',
647
- 'ằ' => 'Ằ',
648
- 'ẳ' => 'Ẳ',
649
- 'ẵ' => 'Ẵ',
650
- 'ặ' => 'Ặ',
651
- 'ẹ' => 'Ẹ',
652
- 'ẻ' => 'Ẻ',
653
- 'ẽ' => 'Ẽ',
654
- 'ế' => 'Ế',
655
- 'ề' => 'Ề',
656
- 'ể' => 'Ể',
657
- 'ễ' => 'Ễ',
658
- 'ệ' => 'Ệ',
659
- 'ỉ' => 'Ỉ',
660
- 'ị' => 'Ị',
661
- 'ọ' => 'Ọ',
662
- 'ỏ' => 'Ỏ',
663
- 'ố' => 'Ố',
664
- 'ồ' => 'Ồ',
665
- 'ổ' => 'Ổ',
666
- 'ỗ' => 'Ỗ',
667
- 'ộ' => 'Ộ',
668
- 'ớ' => 'Ớ',
669
- 'ờ' => 'Ờ',
670
- 'ở' => 'Ở',
671
- 'ỡ' => 'Ỡ',
672
- 'ợ' => 'Ợ',
673
- 'ụ' => 'Ụ',
674
- 'ủ' => 'Ủ',
675
- 'ứ' => 'Ứ',
676
- 'ừ' => 'Ừ',
677
- 'ử' => 'Ử',
678
- 'ữ' => 'Ữ',
679
- 'ự' => 'Ự',
680
- 'ỳ' => 'Ỳ',
681
- 'ỵ' => 'Ỵ',
682
- 'ỷ' => 'Ỷ',
683
- 'ỹ' => 'Ỹ',
684
- 'ỻ' => 'Ỻ',
685
- 'ỽ' => 'Ỽ',
686
- 'ỿ' => 'Ỿ',
687
- 'ἀ' => 'Ἀ',
688
- 'ἁ' => 'Ἁ',
689
- 'ἂ' => 'Ἂ',
690
- 'ἃ' => 'Ἃ',
691
- 'ἄ' => 'Ἄ',
692
- 'ἅ' => 'Ἅ',
693
- 'ἆ' => 'Ἆ',
694
- 'ἇ' => 'Ἇ',
695
- 'ἐ' => 'Ἐ',
696
- 'ἑ' => 'Ἑ',
697
- 'ἒ' => 'Ἒ',
698
- 'ἓ' => 'Ἓ',
699
- 'ἔ' => 'Ἔ',
700
- 'ἕ' => 'Ἕ',
701
- 'ἠ' => 'Ἠ',
702
- 'ἡ' => 'Ἡ',
703
- 'ἢ' => 'Ἢ',
704
- 'ἣ' => 'Ἣ',
705
- 'ἤ' => 'Ἤ',
706
- 'ἥ' => 'Ἥ',
707
- 'ἦ' => 'Ἦ',
708
- 'ἧ' => 'Ἧ',
709
- 'ἰ' => 'Ἰ',
710
- 'ἱ' => 'Ἱ',
711
- 'ἲ' => 'Ἲ',
712
- 'ἳ' => 'Ἳ',
713
- 'ἴ' => 'Ἴ',
714
- 'ἵ' => 'Ἵ',
715
- 'ἶ' => 'Ἶ',
716
- 'ἷ' => 'Ἷ',
717
- 'ὀ' => 'Ὀ',
718
- 'ὁ' => 'Ὁ',
719
- 'ὂ' => 'Ὂ',
720
- 'ὃ' => 'Ὃ',
721
- 'ὄ' => 'Ὄ',
722
- 'ὅ' => 'Ὅ',
723
- 'ὑ' => 'Ὑ',
724
- 'ὓ' => 'Ὓ',
725
- 'ὕ' => 'Ὕ',
726
- 'ὗ' => 'Ὗ',
727
- 'ὠ' => 'Ὠ',
728
- 'ὡ' => 'Ὡ',
729
- 'ὢ' => 'Ὢ',
730
- 'ὣ' => 'Ὣ',
731
- 'ὤ' => 'Ὤ',
732
- 'ὥ' => 'Ὥ',
733
- 'ὦ' => 'Ὦ',
734
- 'ὧ' => 'Ὧ',
735
- 'ὰ' => 'Ὰ',
736
- 'ά' => 'Ά',
737
- 'ὲ' => 'Ὲ',
738
- 'έ' => 'Έ',
739
- 'ὴ' => 'Ὴ',
740
- 'ή' => 'Ή',
741
- 'ὶ' => 'Ὶ',
742
- 'ί' => 'Ί',
743
- 'ὸ' => 'Ὸ',
744
- 'ό' => 'Ό',
745
- 'ὺ' => 'Ὺ',
746
- 'ύ' => 'Ύ',
747
- 'ὼ' => 'Ὼ',
748
- 'ώ' => 'Ώ',
749
- 'ᾀ' => 'ᾈ',
750
- 'ᾁ' => 'ᾉ',
751
- 'ᾂ' => 'ᾊ',
752
- 'ᾃ' => 'ᾋ',
753
- 'ᾄ' => 'ᾌ',
754
- 'ᾅ' => 'ᾍ',
755
- 'ᾆ' => 'ᾎ',
756
- 'ᾇ' => 'ᾏ',
757
- 'ᾐ' => 'ᾘ',
758
- 'ᾑ' => 'ᾙ',
759
- 'ᾒ' => 'ᾚ',
760
- 'ᾓ' => 'ᾛ',
761
- 'ᾔ' => 'ᾜ',
762
- 'ᾕ' => 'ᾝ',
763
- 'ᾖ' => 'ᾞ',
764
- 'ᾗ' => 'ᾟ',
765
- 'ᾠ' => 'ᾨ',
766
- 'ᾡ' => 'ᾩ',
767
- 'ᾢ' => 'ᾪ',
768
- 'ᾣ' => 'ᾫ',
769
- 'ᾤ' => 'ᾬ',
770
- 'ᾥ' => 'ᾭ',
771
- 'ᾦ' => 'ᾮ',
772
- 'ᾧ' => 'ᾯ',
773
- 'ᾰ' => 'Ᾰ',
774
- 'ᾱ' => 'Ᾱ',
775
- 'ᾳ' => 'ᾼ',
776
- 'ι' => 'Ι',
777
- 'ῃ' => 'ῌ',
778
- 'ῐ' => 'Ῐ',
779
- 'ῑ' => 'Ῑ',
780
- 'ῠ' => 'Ῠ',
781
- 'ῡ' => 'Ῡ',
782
- 'ῥ' => 'Ῥ',
783
- 'ῳ' => 'ῼ',
784
- 'ⅎ' => 'Ⅎ',
785
- 'ⅰ' => 'Ⅰ',
786
- 'ⅱ' => 'Ⅱ',
787
- 'ⅲ' => 'Ⅲ',
788
- 'ⅳ' => 'Ⅳ',
789
- 'ⅴ' => 'Ⅴ',
790
- 'ⅵ' => 'Ⅵ',
791
- 'ⅶ' => 'Ⅶ',
792
- 'ⅷ' => 'Ⅷ',
793
- 'ⅸ' => 'Ⅸ',
794
- 'ⅹ' => 'Ⅹ',
795
- 'ⅺ' => 'Ⅺ',
796
- 'ⅻ' => 'Ⅻ',
797
- 'ⅼ' => 'Ⅼ',
798
- 'ⅽ' => 'Ⅽ',
799
- 'ⅾ' => 'Ⅾ',
800
- 'ⅿ' => 'Ⅿ',
801
- 'ↄ' => 'Ↄ',
802
- 'ⓐ' => 'Ⓐ',
803
- 'ⓑ' => 'Ⓑ',
804
- 'ⓒ' => 'Ⓒ',
805
- 'ⓓ' => 'Ⓓ',
806
- 'ⓔ' => 'Ⓔ',
807
- 'ⓕ' => 'Ⓕ',
808
- 'ⓖ' => 'Ⓖ',
809
- 'ⓗ' => 'Ⓗ',
810
- 'ⓘ' => 'Ⓘ',
811
- 'ⓙ' => 'Ⓙ',
812
- 'ⓚ' => 'Ⓚ',
813
- 'ⓛ' => 'Ⓛ',
814
- 'ⓜ' => 'Ⓜ',
815
- 'ⓝ' => 'Ⓝ',
816
- 'ⓞ' => 'Ⓞ',
817
- 'ⓟ' => 'Ⓟ',
818
- 'ⓠ' => 'Ⓠ',
819
- 'ⓡ' => 'Ⓡ',
820
- 'ⓢ' => 'Ⓢ',
821
- 'ⓣ' => 'Ⓣ',
822
- 'ⓤ' => 'Ⓤ',
823
- 'ⓥ' => 'Ⓥ',
824
- 'ⓦ' => 'Ⓦ',
825
- 'ⓧ' => 'Ⓧ',
826
- 'ⓨ' => 'Ⓨ',
827
- 'ⓩ' => 'Ⓩ',
828
- 'ⰰ' => 'Ⰰ',
829
- 'ⰱ' => 'Ⰱ',
830
- 'ⰲ' => 'Ⰲ',
831
- 'ⰳ' => 'Ⰳ',
832
- 'ⰴ' => 'Ⰴ',
833
- 'ⰵ' => 'Ⰵ',
834
- 'ⰶ' => 'Ⰶ',
835
- 'ⰷ' => 'Ⰷ',
836
- 'ⰸ' => 'Ⰸ',
837
- 'ⰹ' => 'Ⰹ',
838
- 'ⰺ' => 'Ⰺ',
839
- 'ⰻ' => 'Ⰻ',
840
- 'ⰼ' => 'Ⰼ',
841
- 'ⰽ' => 'Ⰽ',
842
- 'ⰾ' => 'Ⰾ',
843
- 'ⰿ' => 'Ⰿ',
844
- 'ⱀ' => 'Ⱀ',
845
- 'ⱁ' => 'Ⱁ',
846
- 'ⱂ' => 'Ⱂ',
847
- 'ⱃ' => 'Ⱃ',
848
- 'ⱄ' => 'Ⱄ',
849
- 'ⱅ' => 'Ⱅ',
850
- 'ⱆ' => 'Ⱆ',
851
- 'ⱇ' => 'Ⱇ',
852
- 'ⱈ' => 'Ⱈ',
853
- 'ⱉ' => 'Ⱉ',
854
- 'ⱊ' => 'Ⱊ',
855
- 'ⱋ' => 'Ⱋ',
856
- 'ⱌ' => 'Ⱌ',
857
- 'ⱍ' => 'Ⱍ',
858
- 'ⱎ' => 'Ⱎ',
859
- 'ⱏ' => 'Ⱏ',
860
- 'ⱐ' => 'Ⱐ',
861
- 'ⱑ' => 'Ⱑ',
862
- 'ⱒ' => 'Ⱒ',
863
- 'ⱓ' => 'Ⱓ',
864
- 'ⱔ' => 'Ⱔ',
865
- 'ⱕ' => 'Ⱕ',
866
- 'ⱖ' => 'Ⱖ',
867
- 'ⱗ' => 'Ⱗ',
868
- 'ⱘ' => 'Ⱘ',
869
- 'ⱙ' => 'Ⱙ',
870
- 'ⱚ' => 'Ⱚ',
871
- 'ⱛ' => 'Ⱛ',
872
- 'ⱜ' => 'Ⱜ',
873
- 'ⱝ' => 'Ⱝ',
874
- 'ⱞ' => 'Ⱞ',
875
- 'ⱡ' => 'Ⱡ',
876
- 'ⱥ' => 'Ⱥ',
877
- 'ⱦ' => 'Ⱦ',
878
- 'ⱨ' => 'Ⱨ',
879
- 'ⱪ' => 'Ⱪ',
880
- 'ⱬ' => 'Ⱬ',
881
- 'ⱳ' => 'Ⱳ',
882
- 'ⱶ' => 'Ⱶ',
883
- 'ⲁ' => 'Ⲁ',
884
- 'ⲃ' => 'Ⲃ',
885
- 'ⲅ' => 'Ⲅ',
886
- 'ⲇ' => 'Ⲇ',
887
- 'ⲉ' => 'Ⲉ',
888
- 'ⲋ' => 'Ⲋ',
889
- 'ⲍ' => 'Ⲍ',
890
- 'ⲏ' => 'Ⲏ',
891
- 'ⲑ' => 'Ⲑ',
892
- 'ⲓ' => 'Ⲓ',
893
- 'ⲕ' => 'Ⲕ',
894
- 'ⲗ' => 'Ⲗ',
895
- 'ⲙ' => 'Ⲙ',
896
- 'ⲛ' => 'Ⲛ',
897
- 'ⲝ' => 'Ⲝ',
898
- 'ⲟ' => 'Ⲟ',
899
- 'ⲡ' => 'Ⲡ',
900
- 'ⲣ' => 'Ⲣ',
901
- 'ⲥ' => 'Ⲥ',
902
- 'ⲧ' => 'Ⲧ',
903
- 'ⲩ' => 'Ⲩ',
904
- 'ⲫ' => 'Ⲫ',
905
- 'ⲭ' => 'Ⲭ',
906
- 'ⲯ' => 'Ⲯ',
907
- 'ⲱ' => 'Ⲱ',
908
- 'ⲳ' => 'Ⲳ',
909
- 'ⲵ' => 'Ⲵ',
910
- 'ⲷ' => 'Ⲷ',
911
- 'ⲹ' => 'Ⲹ',
912
- 'ⲻ' => 'Ⲻ',
913
- 'ⲽ' => 'Ⲽ',
914
- 'ⲿ' => 'Ⲿ',
915
- 'ⳁ' => 'Ⳁ',
916
- 'ⳃ' => 'Ⳃ',
917
- 'ⳅ' => 'Ⳅ',
918
- 'ⳇ' => 'Ⳇ',
919
- 'ⳉ' => 'Ⳉ',
920
- 'ⳋ' => 'Ⳋ',
921
- 'ⳍ' => 'Ⳍ',
922
- 'ⳏ' => 'Ⳏ',
923
- 'ⳑ' => 'Ⳑ',
924
- 'ⳓ' => 'Ⳓ',
925
- 'ⳕ' => 'Ⳕ',
926
- 'ⳗ' => 'Ⳗ',
927
- 'ⳙ' => 'Ⳙ',
928
- 'ⳛ' => 'Ⳛ',
929
- 'ⳝ' => 'Ⳝ',
930
- 'ⳟ' => 'Ⳟ',
931
- 'ⳡ' => 'Ⳡ',
932
- 'ⳣ' => 'Ⳣ',
933
- 'ⳬ' => 'Ⳬ',
934
- 'ⳮ' => 'Ⳮ',
935
- 'ⳳ' => 'Ⳳ',
936
- 'ⴀ' => 'Ⴀ',
937
- 'ⴁ' => 'Ⴁ',
938
- 'ⴂ' => 'Ⴂ',
939
- 'ⴃ' => 'Ⴃ',
940
- 'ⴄ' => 'Ⴄ',
941
- 'ⴅ' => 'Ⴅ',
942
- 'ⴆ' => 'Ⴆ',
943
- 'ⴇ' => 'Ⴇ',
944
- 'ⴈ' => 'Ⴈ',
945
- 'ⴉ' => 'Ⴉ',
946
- 'ⴊ' => 'Ⴊ',
947
- 'ⴋ' => 'Ⴋ',
948
- 'ⴌ' => 'Ⴌ',
949
- 'ⴍ' => 'Ⴍ',
950
- 'ⴎ' => 'Ⴎ',
951
- 'ⴏ' => 'Ⴏ',
952
- 'ⴐ' => 'Ⴐ',
953
- 'ⴑ' => 'Ⴑ',
954
- 'ⴒ' => 'Ⴒ',
955
- 'ⴓ' => 'Ⴓ',
956
- 'ⴔ' => 'Ⴔ',
957
- 'ⴕ' => 'Ⴕ',
958
- 'ⴖ' => 'Ⴖ',
959
- 'ⴗ' => 'Ⴗ',
960
- 'ⴘ' => 'Ⴘ',
961
- 'ⴙ' => 'Ⴙ',
962
- 'ⴚ' => 'Ⴚ',
963
- 'ⴛ' => 'Ⴛ',
964
- 'ⴜ' => 'Ⴜ',
965
- 'ⴝ' => 'Ⴝ',
966
- 'ⴞ' => 'Ⴞ',
967
- 'ⴟ' => 'Ⴟ',
968
- 'ⴠ' => 'Ⴠ',
969
- 'ⴡ' => 'Ⴡ',
970
- 'ⴢ' => 'Ⴢ',
971
- 'ⴣ' => 'Ⴣ',
972
- 'ⴤ' => 'Ⴤ',
973
- 'ⴥ' => 'Ⴥ',
974
- 'ⴧ' => 'Ⴧ',
975
- 'ⴭ' => 'Ⴭ',
976
- 'ꙁ' => 'Ꙁ',
977
- 'ꙃ' => 'Ꙃ',
978
- 'ꙅ' => 'Ꙅ',
979
- 'ꙇ' => 'Ꙇ',
980
- 'ꙉ' => 'Ꙉ',
981
- 'ꙋ' => 'Ꙋ',
982
- 'ꙍ' => 'Ꙍ',
983
- 'ꙏ' => 'Ꙏ',
984
- 'ꙑ' => 'Ꙑ',
985
- 'ꙓ' => 'Ꙓ',
986
- 'ꙕ' => 'Ꙕ',
987
- 'ꙗ' => 'Ꙗ',
988
- 'ꙙ' => 'Ꙙ',
989
- 'ꙛ' => 'Ꙛ',
990
- 'ꙝ' => 'Ꙝ',
991
- 'ꙟ' => 'Ꙟ',
992
- 'ꙡ' => 'Ꙡ',
993
- 'ꙣ' => 'Ꙣ',
994
- 'ꙥ' => 'Ꙥ',
995
- 'ꙧ' => 'Ꙧ',
996
- 'ꙩ' => 'Ꙩ',
997
- 'ꙫ' => 'Ꙫ',
998
- 'ꙭ' => 'Ꙭ',
999
- 'ꚁ' => 'Ꚁ',
1000
- 'ꚃ' => 'Ꚃ',
1001
- 'ꚅ' => 'Ꚅ',
1002
- 'ꚇ' => 'Ꚇ',
1003
- 'ꚉ' => 'Ꚉ',
1004
- 'ꚋ' => 'Ꚋ',
1005
- 'ꚍ' => 'Ꚍ',
1006
- 'ꚏ' => 'Ꚏ',
1007
- 'ꚑ' => 'Ꚑ',
1008
- 'ꚓ' => 'Ꚓ',
1009
- 'ꚕ' => 'Ꚕ',
1010
- 'ꚗ' => 'Ꚗ',
1011
- 'ꚙ' => 'Ꚙ',
1012
- 'ꚛ' => 'Ꚛ',
1013
- 'ꜣ' => 'Ꜣ',
1014
- 'ꜥ' => 'Ꜥ',
1015
- 'ꜧ' => 'Ꜧ',
1016
- 'ꜩ' => 'Ꜩ',
1017
- 'ꜫ' => 'Ꜫ',
1018
- 'ꜭ' => 'Ꜭ',
1019
- 'ꜯ' => 'Ꜯ',
1020
- 'ꜳ' => 'Ꜳ',
1021
- 'ꜵ' => 'Ꜵ',
1022
- 'ꜷ' => 'Ꜷ',
1023
- 'ꜹ' => 'Ꜹ',
1024
- 'ꜻ' => 'Ꜻ',
1025
- 'ꜽ' => 'Ꜽ',
1026
- 'ꜿ' => 'Ꜿ',
1027
- 'ꝁ' => 'Ꝁ',
1028
- 'ꝃ' => 'Ꝃ',
1029
- 'ꝅ' => 'Ꝅ',
1030
- 'ꝇ' => 'Ꝇ',
1031
- 'ꝉ' => 'Ꝉ',
1032
- 'ꝋ' => 'Ꝋ',
1033
- 'ꝍ' => 'Ꝍ',
1034
- 'ꝏ' => 'Ꝏ',
1035
- 'ꝑ' => 'Ꝑ',
1036
- 'ꝓ' => 'Ꝓ',
1037
- 'ꝕ' => 'Ꝕ',
1038
- 'ꝗ' => 'Ꝗ',
1039
- 'ꝙ' => 'Ꝙ',
1040
- 'ꝛ' => 'Ꝛ',
1041
- 'ꝝ' => 'Ꝝ',
1042
- 'ꝟ' => 'Ꝟ',
1043
- 'ꝡ' => 'Ꝡ',
1044
- 'ꝣ' => 'Ꝣ',
1045
- 'ꝥ' => 'Ꝥ',
1046
- 'ꝧ' => 'Ꝧ',
1047
- 'ꝩ' => 'Ꝩ',
1048
- 'ꝫ' => 'Ꝫ',
1049
- 'ꝭ' => 'Ꝭ',
1050
- 'ꝯ' => 'Ꝯ',
1051
- 'ꝺ' => 'Ꝺ',
1052
- 'ꝼ' => 'Ꝼ',
1053
- 'ꝿ' => 'Ꝿ',
1054
- 'ꞁ' => 'Ꞁ',
1055
- 'ꞃ' => 'Ꞃ',
1056
- 'ꞅ' => 'Ꞅ',
1057
- 'ꞇ' => 'Ꞇ',
1058
- 'ꞌ' => 'Ꞌ',
1059
- 'ꞑ' => 'Ꞑ',
1060
- 'ꞓ' => 'Ꞓ',
1061
- 'ꞔ' => 'Ꞔ',
1062
- 'ꞗ' => 'Ꞗ',
1063
- 'ꞙ' => 'Ꞙ',
1064
- 'ꞛ' => 'Ꞛ',
1065
- 'ꞝ' => 'Ꞝ',
1066
- 'ꞟ' => 'Ꞟ',
1067
- 'ꞡ' => 'Ꞡ',
1068
- 'ꞣ' => 'Ꞣ',
1069
- 'ꞥ' => 'Ꞥ',
1070
- 'ꞧ' => 'Ꞧ',
1071
- 'ꞩ' => 'Ꞩ',
1072
- 'ꞵ' => 'Ꞵ',
1073
- 'ꞷ' => 'Ꞷ',
1074
- 'ꞹ' => 'Ꞹ',
1075
- 'ꞻ' => 'Ꞻ',
1076
- 'ꞽ' => 'Ꞽ',
1077
- 'ꞿ' => 'Ꞿ',
1078
- 'ꟃ' => 'Ꟃ',
1079
- 'ꟈ' => 'Ꟈ',
1080
- 'ꟊ' => 'Ꟊ',
1081
- 'ꟶ' => 'Ꟶ',
1082
- 'ꭓ' => 'Ꭓ',
1083
- 'ꭰ' => 'Ꭰ',
1084
- 'ꭱ' => 'Ꭱ',
1085
- 'ꭲ' => 'Ꭲ',
1086
- 'ꭳ' => 'Ꭳ',
1087
- 'ꭴ' => 'Ꭴ',
1088
- 'ꭵ' => 'Ꭵ',
1089
- 'ꭶ' => 'Ꭶ',
1090
- 'ꭷ' => 'Ꭷ',
1091
- 'ꭸ' => 'Ꭸ',
1092
- 'ꭹ' => 'Ꭹ',
1093
- 'ꭺ' => 'Ꭺ',
1094
- 'ꭻ' => 'Ꭻ',
1095
- 'ꭼ' => 'Ꭼ',
1096
- 'ꭽ' => 'Ꭽ',
1097
- 'ꭾ' => 'Ꭾ',
1098
- 'ꭿ' => 'Ꭿ',
1099
- 'ꮀ' => 'Ꮀ',
1100
- 'ꮁ' => 'Ꮁ',
1101
- 'ꮂ' => 'Ꮂ',
1102
- 'ꮃ' => 'Ꮃ',
1103
- 'ꮄ' => 'Ꮄ',
1104
- 'ꮅ' => 'Ꮅ',
1105
- 'ꮆ' => 'Ꮆ',
1106
- 'ꮇ' => 'Ꮇ',
1107
- 'ꮈ' => 'Ꮈ',
1108
- 'ꮉ' => 'Ꮉ',
1109
- 'ꮊ' => 'Ꮊ',
1110
- 'ꮋ' => 'Ꮋ',
1111
- 'ꮌ' => 'Ꮌ',
1112
- 'ꮍ' => 'Ꮍ',
1113
- 'ꮎ' => 'Ꮎ',
1114
- 'ꮏ' => 'Ꮏ',
1115
- 'ꮐ' => 'Ꮐ',
1116
- 'ꮑ' => 'Ꮑ',
1117
- 'ꮒ' => 'Ꮒ',
1118
- 'ꮓ' => 'Ꮓ',
1119
- 'ꮔ' => 'Ꮔ',
1120
- 'ꮕ' => 'Ꮕ',
1121
- 'ꮖ' => 'Ꮖ',
1122
- 'ꮗ' => 'Ꮗ',
1123
- 'ꮘ' => 'Ꮘ',
1124
- 'ꮙ' => 'Ꮙ',
1125
- 'ꮚ' => 'Ꮚ',
1126
- 'ꮛ' => 'Ꮛ',
1127
- 'ꮜ' => 'Ꮜ',
1128
- 'ꮝ' => 'Ꮝ',
1129
- 'ꮞ' => 'Ꮞ',
1130
- 'ꮟ' => 'Ꮟ',
1131
- 'ꮠ' => 'Ꮠ',
1132
- 'ꮡ' => 'Ꮡ',
1133
- 'ꮢ' => 'Ꮢ',
1134
- 'ꮣ' => 'Ꮣ',
1135
- 'ꮤ' => 'Ꮤ',
1136
- 'ꮥ' => 'Ꮥ',
1137
- 'ꮦ' => 'Ꮦ',
1138
- 'ꮧ' => 'Ꮧ',
1139
- 'ꮨ' => 'Ꮨ',
1140
- 'ꮩ' => 'Ꮩ',
1141
- 'ꮪ' => 'Ꮪ',
1142
- 'ꮫ' => 'Ꮫ',
1143
- 'ꮬ' => 'Ꮬ',
1144
- 'ꮭ' => 'Ꮭ',
1145
- 'ꮮ' => 'Ꮮ',
1146
- 'ꮯ' => 'Ꮯ',
1147
- 'ꮰ' => 'Ꮰ',
1148
- 'ꮱ' => 'Ꮱ',
1149
- 'ꮲ' => 'Ꮲ',
1150
- 'ꮳ' => 'Ꮳ',
1151
- 'ꮴ' => 'Ꮴ',
1152
- 'ꮵ' => 'Ꮵ',
1153
- 'ꮶ' => 'Ꮶ',
1154
- 'ꮷ' => 'Ꮷ',
1155
- 'ꮸ' => 'Ꮸ',
1156
- 'ꮹ' => 'Ꮹ',
1157
- 'ꮺ' => 'Ꮺ',
1158
- 'ꮻ' => 'Ꮻ',
1159
- 'ꮼ' => 'Ꮼ',
1160
- 'ꮽ' => 'Ꮽ',
1161
- 'ꮾ' => 'Ꮾ',
1162
- 'ꮿ' => 'Ꮿ',
1163
- 'a' => 'A',
1164
- 'b' => 'B',
1165
- 'c' => 'C',
1166
- 'd' => 'D',
1167
- 'e' => 'E',
1168
- 'f' => 'F',
1169
- 'g' => 'G',
1170
- 'h' => 'H',
1171
- 'i' => 'I',
1172
- 'j' => 'J',
1173
- 'k' => 'K',
1174
- 'l' => 'L',
1175
- 'm' => 'M',
1176
- 'n' => 'N',
1177
- 'o' => 'O',
1178
- 'p' => 'P',
1179
- 'q' => 'Q',
1180
- 'r' => 'R',
1181
- 's' => 'S',
1182
- 't' => 'T',
1183
- 'u' => 'U',
1184
- 'v' => 'V',
1185
- 'w' => 'W',
1186
- 'x' => 'X',
1187
- 'y' => 'Y',
1188
- 'z' => 'Z',
1189
- '𐐨' => '𐐀',
1190
- '𐐩' => '𐐁',
1191
- '𐐪' => '𐐂',
1192
- '𐐫' => '𐐃',
1193
- '𐐬' => '𐐄',
1194
- '𐐭' => '𐐅',
1195
- '𐐮' => '𐐆',
1196
- '𐐯' => '𐐇',
1197
- '𐐰' => '𐐈',
1198
- '𐐱' => '𐐉',
1199
- '𐐲' => '𐐊',
1200
- '𐐳' => '𐐋',
1201
- '𐐴' => '𐐌',
1202
- '𐐵' => '𐐍',
1203
- '𐐶' => '𐐎',
1204
- '𐐷' => '𐐏',
1205
- '𐐸' => '𐐐',
1206
- '𐐹' => '𐐑',
1207
- '𐐺' => '𐐒',
1208
- '𐐻' => '𐐓',
1209
- '𐐼' => '𐐔',
1210
- '𐐽' => '𐐕',
1211
- '𐐾' => '𐐖',
1212
- '𐐿' => '𐐗',
1213
- '𐑀' => '𐐘',
1214
- '𐑁' => '𐐙',
1215
- '𐑂' => '𐐚',
1216
- '𐑃' => '𐐛',
1217
- '𐑄' => '𐐜',
1218
- '𐑅' => '𐐝',
1219
- '𐑆' => '𐐞',
1220
- '𐑇' => '𐐟',
1221
- '𐑈' => '𐐠',
1222
- '𐑉' => '𐐡',
1223
- '𐑊' => '𐐢',
1224
- '𐑋' => '𐐣',
1225
- '𐑌' => '𐐤',
1226
- '𐑍' => '𐐥',
1227
- '𐑎' => '𐐦',
1228
- '𐑏' => '𐐧',
1229
- '𐓘' => '𐒰',
1230
- '𐓙' => '𐒱',
1231
- '𐓚' => '𐒲',
1232
- '𐓛' => '𐒳',
1233
- '𐓜' => '𐒴',
1234
- '𐓝' => '𐒵',
1235
- '𐓞' => '𐒶',
1236
- '𐓟' => '𐒷',
1237
- '𐓠' => '𐒸',
1238
- '𐓡' => '𐒹',
1239
- '𐓢' => '𐒺',
1240
- '𐓣' => '𐒻',
1241
- '𐓤' => '𐒼',
1242
- '𐓥' => '𐒽',
1243
- '𐓦' => '𐒾',
1244
- '𐓧' => '𐒿',
1245
- '𐓨' => '𐓀',
1246
- '𐓩' => '𐓁',
1247
- '𐓪' => '𐓂',
1248
- '𐓫' => '𐓃',
1249
- '𐓬' => '𐓄',
1250
- '𐓭' => '𐓅',
1251
- '𐓮' => '𐓆',
1252
- '𐓯' => '𐓇',
1253
- '𐓰' => '𐓈',
1254
- '𐓱' => '𐓉',
1255
- '𐓲' => '𐓊',
1256
- '𐓳' => '𐓋',
1257
- '𐓴' => '𐓌',
1258
- '𐓵' => '𐓍',
1259
- '𐓶' => '𐓎',
1260
- '𐓷' => '𐓏',
1261
- '𐓸' => '𐓐',
1262
- '𐓹' => '𐓑',
1263
- '𐓺' => '𐓒',
1264
- '𐓻' => '𐓓',
1265
- '𐳀' => '𐲀',
1266
- '𐳁' => '𐲁',
1267
- '𐳂' => '𐲂',
1268
- '𐳃' => '𐲃',
1269
- '𐳄' => '𐲄',
1270
- '𐳅' => '𐲅',
1271
- '𐳆' => '𐲆',
1272
- '𐳇' => '𐲇',
1273
- '𐳈' => '𐲈',
1274
- '𐳉' => '𐲉',
1275
- '𐳊' => '𐲊',
1276
- '𐳋' => '𐲋',
1277
- '𐳌' => '𐲌',
1278
- '𐳍' => '𐲍',
1279
- '𐳎' => '𐲎',
1280
- '𐳏' => '𐲏',
1281
- '𐳐' => '𐲐',
1282
- '𐳑' => '𐲑',
1283
- '𐳒' => '𐲒',
1284
- '𐳓' => '𐲓',
1285
- '𐳔' => '𐲔',
1286
- '𐳕' => '𐲕',
1287
- '𐳖' => '𐲖',
1288
- '𐳗' => '𐲗',
1289
- '𐳘' => '𐲘',
1290
- '𐳙' => '𐲙',
1291
- '𐳚' => '𐲚',
1292
- '𐳛' => '𐲛',
1293
- '𐳜' => '𐲜',
1294
- '𐳝' => '𐲝',
1295
- '𐳞' => '𐲞',
1296
- '𐳟' => '𐲟',
1297
- '𐳠' => '𐲠',
1298
- '𐳡' => '𐲡',
1299
- '𐳢' => '𐲢',
1300
- '𐳣' => '𐲣',
1301
- '𐳤' => '𐲤',
1302
- '𐳥' => '𐲥',
1303
- '𐳦' => '𐲦',
1304
- '𐳧' => '𐲧',
1305
- '𐳨' => '𐲨',
1306
- '𐳩' => '𐲩',
1307
- '𐳪' => '𐲪',
1308
- '𐳫' => '𐲫',
1309
- '𐳬' => '𐲬',
1310
- '𐳭' => '𐲭',
1311
- '𐳮' => '𐲮',
1312
- '𐳯' => '𐲯',
1313
- '𐳰' => '𐲰',
1314
- '𐳱' => '𐲱',
1315
- '𐳲' => '𐲲',
1316
- '𑣀' => '𑢠',
1317
- '𑣁' => '𑢡',
1318
- '𑣂' => '𑢢',
1319
- '𑣃' => '𑢣',
1320
- '𑣄' => '𑢤',
1321
- '𑣅' => '𑢥',
1322
- '𑣆' => '𑢦',
1323
- '𑣇' => '𑢧',
1324
- '𑣈' => '𑢨',
1325
- '𑣉' => '𑢩',
1326
- '𑣊' => '𑢪',
1327
- '𑣋' => '𑢫',
1328
- '𑣌' => '𑢬',
1329
- '𑣍' => '𑢭',
1330
- '𑣎' => '𑢮',
1331
- '𑣏' => '𑢯',
1332
- '𑣐' => '𑢰',
1333
- '𑣑' => '𑢱',
1334
- '𑣒' => '𑢲',
1335
- '𑣓' => '𑢳',
1336
- '𑣔' => '𑢴',
1337
- '𑣕' => '𑢵',
1338
- '𑣖' => '𑢶',
1339
- '𑣗' => '𑢷',
1340
- '𑣘' => '𑢸',
1341
- '𑣙' => '𑢹',
1342
- '𑣚' => '𑢺',
1343
- '𑣛' => '𑢻',
1344
- '𑣜' => '𑢼',
1345
- '𑣝' => '𑢽',
1346
- '𑣞' => '𑢾',
1347
- '𑣟' => '𑢿',
1348
- '𖹠' => '𖹀',
1349
- '𖹡' => '𖹁',
1350
- '𖹢' => '𖹂',
1351
- '𖹣' => '𖹃',
1352
- '𖹤' => '𖹄',
1353
- '𖹥' => '𖹅',
1354
- '𖹦' => '𖹆',
1355
- '𖹧' => '𖹇',
1356
- '𖹨' => '𖹈',
1357
- '𖹩' => '𖹉',
1358
- '𖹪' => '𖹊',
1359
- '𖹫' => '𖹋',
1360
- '𖹬' => '𖹌',
1361
- '𖹭' => '𖹍',
1362
- '𖹮' => '𖹎',
1363
- '𖹯' => '𖹏',
1364
- '𖹰' => '𖹐',
1365
- '𖹱' => '𖹑',
1366
- '𖹲' => '𖹒',
1367
- '𖹳' => '𖹓',
1368
- '𖹴' => '𖹔',
1369
- '𖹵' => '𖹕',
1370
- '𖹶' => '𖹖',
1371
- '𖹷' => '𖹗',
1372
- '𖹸' => '𖹘',
1373
- '𖹹' => '𖹙',
1374
- '𖹺' => '𖹚',
1375
- '𖹻' => '𖹛',
1376
- '𖹼' => '𖹜',
1377
- '𖹽' => '𖹝',
1378
- '𖹾' => '𖹞',
1379
- '𖹿' => '𖹟',
1380
- '𞤢' => '𞤀',
1381
- '𞤣' => '𞤁',
1382
- '𞤤' => '𞤂',
1383
- '𞤥' => '𞤃',
1384
- '𞤦' => '𞤄',
1385
- '𞤧' => '𞤅',
1386
- '𞤨' => '𞤆',
1387
- '𞤩' => '𞤇',
1388
- '𞤪' => '𞤈',
1389
- '𞤫' => '𞤉',
1390
- '𞤬' => '𞤊',
1391
- '𞤭' => '𞤋',
1392
- '𞤮' => '𞤌',
1393
- '𞤯' => '𞤍',
1394
- '𞤰' => '𞤎',
1395
- '𞤱' => '𞤏',
1396
- '𞤲' => '𞤐',
1397
- '𞤳' => '𞤑',
1398
- '𞤴' => '𞤒',
1399
- '𞤵' => '𞤓',
1400
- '𞤶' => '𞤔',
1401
- '𞤷' => '𞤕',
1402
- '𞤸' => '𞤖',
1403
- '𞤹' => '𞤗',
1404
- '𞤺' => '𞤘',
1405
- '𞤻' => '𞤙',
1406
- '𞤼' => '𞤚',
1407
- '𞤽' => '𞤛',
1408
- '𞤾' => '𞤜',
1409
- '𞤿' => '𞤝',
1410
- '𞥀' => '𞤞',
1411
- '𞥁' => '𞤟',
1412
- '𞥂' => '𞤠',
1413
- '𞥃' => '𞤡',
1414
- );
1
+ <?php
2
+
3
+ return array (
4
+ 'a' => 'A',
5
+ 'b' => 'B',
6
+ 'c' => 'C',
7
+ 'd' => 'D',
8
+ 'e' => 'E',
9
+ 'f' => 'F',
10
+ 'g' => 'G',
11
+ 'h' => 'H',
12
+ 'i' => 'I',
13
+ 'j' => 'J',
14
+ 'k' => 'K',
15
+ 'l' => 'L',
16
+ 'm' => 'M',
17
+ 'n' => 'N',
18
+ 'o' => 'O',
19
+ 'p' => 'P',
20
+ 'q' => 'Q',
21
+ 'r' => 'R',
22
+ 's' => 'S',
23
+ 't' => 'T',
24
+ 'u' => 'U',
25
+ 'v' => 'V',
26
+ 'w' => 'W',
27
+ 'x' => 'X',
28
+ 'y' => 'Y',
29
+ 'z' => 'Z',
30
+ 'µ' => 'Μ',
31
+ 'à' => 'À',
32
+ 'á' => 'Á',
33
+ 'â' => 'Â',
34
+ 'ã' => 'Ã',
35
+ 'ä' => 'Ä',
36
+ 'å' => 'Å',
37
+ 'æ' => 'Æ',
38
+ 'ç' => 'Ç',
39
+ 'è' => 'È',
40
+ 'é' => 'É',
41
+ 'ê' => 'Ê',
42
+ 'ë' => 'Ë',
43
+ 'ì' => 'Ì',
44
+ 'í' => 'Í',
45
+ 'î' => 'Î',
46
+ 'ï' => 'Ï',
47
+ 'ð' => 'Ð',
48
+ 'ñ' => 'Ñ',
49
+ 'ò' => 'Ò',
50
+ 'ó' => 'Ó',
51
+ 'ô' => 'Ô',
52
+ 'õ' => 'Õ',
53
+ 'ö' => 'Ö',
54
+ 'ø' => 'Ø',
55
+ 'ù' => 'Ù',
56
+ 'ú' => 'Ú',
57
+ 'û' => 'Û',
58
+ 'ü' => 'Ü',
59
+ 'ý' => 'Ý',
60
+ 'þ' => 'Þ',
61
+ 'ÿ' => 'Ÿ',
62
+ 'ā' => 'Ā',
63
+ 'ă' => 'Ă',
64
+ 'ą' => 'Ą',
65
+ 'ć' => 'Ć',
66
+ 'ĉ' => 'Ĉ',
67
+ 'ċ' => 'Ċ',
68
+ 'č' => 'Č',
69
+ 'ď' => 'Ď',
70
+ 'đ' => 'Đ',
71
+ 'ē' => 'Ē',
72
+ 'ĕ' => 'Ĕ',
73
+ 'ė' => 'Ė',
74
+ 'ę' => 'Ę',
75
+ 'ě' => 'Ě',
76
+ 'ĝ' => 'Ĝ',
77
+ 'ğ' => 'Ğ',
78
+ 'ġ' => 'Ġ',
79
+ 'ģ' => 'Ģ',
80
+ 'ĥ' => 'Ĥ',
81
+ 'ħ' => 'Ħ',
82
+ 'ĩ' => 'Ĩ',
83
+ 'ī' => 'Ī',
84
+ 'ĭ' => 'Ĭ',
85
+ 'į' => 'Į',
86
+ 'ı' => 'I',
87
+ 'ij' => 'IJ',
88
+ 'ĵ' => 'Ĵ',
89
+ 'ķ' => 'Ķ',
90
+ 'ĺ' => 'Ĺ',
91
+ 'ļ' => 'Ļ',
92
+ 'ľ' => 'Ľ',
93
+ 'ŀ' => 'Ŀ',
94
+ 'ł' => 'Ł',
95
+ 'ń' => 'Ń',
96
+ 'ņ' => 'Ņ',
97
+ 'ň' => 'Ň',
98
+ 'ŋ' => 'Ŋ',
99
+ 'ō' => 'Ō',
100
+ 'ŏ' => 'Ŏ',
101
+ 'ő' => 'Ő',
102
+ 'œ' => 'Œ',
103
+ 'ŕ' => 'Ŕ',
104
+ 'ŗ' => 'Ŗ',
105
+ 'ř' => 'Ř',
106
+ 'ś' => 'Ś',
107
+ 'ŝ' => 'Ŝ',
108
+ 'ş' => 'Ş',
109
+ 'š' => 'Š',
110
+ 'ţ' => 'Ţ',
111
+ 'ť' => 'Ť',
112
+ 'ŧ' => 'Ŧ',
113
+ 'ũ' => 'Ũ',
114
+ 'ū' => 'Ū',
115
+ 'ŭ' => 'Ŭ',
116
+ 'ů' => 'Ů',
117
+ 'ű' => 'Ű',
118
+ 'ų' => 'Ų',
119
+ 'ŵ' => 'Ŵ',
120
+ 'ŷ' => 'Ŷ',
121
+ 'ź' => 'Ź',
122
+ 'ż' => 'Ż',
123
+ 'ž' => 'Ž',
124
+ 'ſ' => 'S',
125
+ 'ƀ' => 'Ƀ',
126
+ 'ƃ' => 'Ƃ',
127
+ 'ƅ' => 'Ƅ',
128
+ 'ƈ' => 'Ƈ',
129
+ 'ƌ' => 'Ƌ',
130
+ 'ƒ' => 'Ƒ',
131
+ 'ƕ' => 'Ƕ',
132
+ 'ƙ' => 'Ƙ',
133
+ 'ƚ' => 'Ƚ',
134
+ 'ƞ' => 'Ƞ',
135
+ 'ơ' => 'Ơ',
136
+ 'ƣ' => 'Ƣ',
137
+ 'ƥ' => 'Ƥ',
138
+ 'ƨ' => 'Ƨ',
139
+ 'ƭ' => 'Ƭ',
140
+ 'ư' => 'Ư',
141
+ 'ƴ' => 'Ƴ',
142
+ 'ƶ' => 'Ƶ',
143
+ 'ƹ' => 'Ƹ',
144
+ 'ƽ' => 'Ƽ',
145
+ 'ƿ' => 'Ƿ',
146
+ 'Dž' => 'DŽ',
147
+ 'dž' => 'DŽ',
148
+ 'Lj' => 'LJ',
149
+ 'lj' => 'LJ',
150
+ 'Nj' => 'NJ',
151
+ 'nj' => 'NJ',
152
+ 'ǎ' => 'Ǎ',
153
+ 'ǐ' => 'Ǐ',
154
+ 'ǒ' => 'Ǒ',
155
+ 'ǔ' => 'Ǔ',
156
+ 'ǖ' => 'Ǖ',
157
+ 'ǘ' => 'Ǘ',
158
+ 'ǚ' => 'Ǚ',
159
+ 'ǜ' => 'Ǜ',
160
+ 'ǝ' => 'Ǝ',
161
+ 'ǟ' => 'Ǟ',
162
+ 'ǡ' => 'Ǡ',
163
+ 'ǣ' => 'Ǣ',
164
+ 'ǥ' => 'Ǥ',
165
+ 'ǧ' => 'Ǧ',
166
+ 'ǩ' => 'Ǩ',
167
+ 'ǫ' => 'Ǫ',
168
+ 'ǭ' => 'Ǭ',
169
+ 'ǯ' => 'Ǯ',
170
+ 'Dz' => 'DZ',
171
+ 'dz' => 'DZ',
172
+ 'ǵ' => 'Ǵ',
173
+ 'ǹ' => 'Ǹ',
174
+ 'ǻ' => 'Ǻ',
175
+ 'ǽ' => 'Ǽ',
176
+ 'ǿ' => 'Ǿ',
177
+ 'ȁ' => 'Ȁ',
178
+ 'ȃ' => 'Ȃ',
179
+ 'ȅ' => 'Ȅ',
180
+ 'ȇ' => 'Ȇ',
181
+ 'ȉ' => 'Ȉ',
182
+ 'ȋ' => 'Ȋ',
183
+ 'ȍ' => 'Ȍ',
184
+ 'ȏ' => 'Ȏ',
185
+ 'ȑ' => 'Ȑ',
186
+ 'ȓ' => 'Ȓ',
187
+ 'ȕ' => 'Ȕ',
188
+ 'ȗ' => 'Ȗ',
189
+ 'ș' => 'Ș',
190
+ 'ț' => 'Ț',
191
+ 'ȝ' => 'Ȝ',
192
+ 'ȟ' => 'Ȟ',
193
+ 'ȣ' => 'Ȣ',
194
+ 'ȥ' => 'Ȥ',
195
+ 'ȧ' => 'Ȧ',
196
+ 'ȩ' => 'Ȩ',
197
+ 'ȫ' => 'Ȫ',
198
+ 'ȭ' => 'Ȭ',
199
+ 'ȯ' => 'Ȯ',
200
+ 'ȱ' => 'Ȱ',
201
+ 'ȳ' => 'Ȳ',
202
+ 'ȼ' => 'Ȼ',
203
+ 'ȿ' => 'Ȿ',
204
+ 'ɀ' => 'Ɀ',
205
+ 'ɂ' => 'Ɂ',
206
+ 'ɇ' => 'Ɇ',
207
+ 'ɉ' => 'Ɉ',
208
+ 'ɋ' => 'Ɋ',
209
+ 'ɍ' => 'Ɍ',
210
+ 'ɏ' => 'Ɏ',
211
+ 'ɐ' => 'Ɐ',
212
+ 'ɑ' => 'Ɑ',
213
+ 'ɒ' => 'Ɒ',
214
+ 'ɓ' => 'Ɓ',
215
+ 'ɔ' => 'Ɔ',
216
+ 'ɖ' => 'Ɖ',
217
+ 'ɗ' => 'Ɗ',
218
+ 'ə' => 'Ə',
219
+ 'ɛ' => 'Ɛ',
220
+ 'ɜ' => 'Ɜ',
221
+ 'ɠ' => 'Ɠ',
222
+ 'ɡ' => 'Ɡ',
223
+ 'ɣ' => 'Ɣ',
224
+ 'ɥ' => 'Ɥ',
225
+ 'ɦ' => 'Ɦ',
226
+ 'ɨ' => 'Ɨ',
227
+ 'ɩ' => 'Ɩ',
228
+ 'ɪ' => 'Ɪ',
229
+ 'ɫ' => 'Ɫ',
230
+ 'ɬ' => 'Ɬ',
231
+ 'ɯ' => 'Ɯ',
232
+ 'ɱ' => 'Ɱ',
233
+ 'ɲ' => 'Ɲ',
234
+ 'ɵ' => 'Ɵ',
235
+ 'ɽ' => 'Ɽ',
236
+ 'ʀ' => 'Ʀ',
237
+ 'ʂ' => 'Ʂ',
238
+ 'ʃ' => 'Ʃ',
239
+ 'ʇ' => 'Ʇ',
240
+ 'ʈ' => 'Ʈ',
241
+ 'ʉ' => 'Ʉ',
242
+ 'ʊ' => 'Ʊ',
243
+ 'ʋ' => 'Ʋ',
244
+ 'ʌ' => 'Ʌ',
245
+ 'ʒ' => 'Ʒ',
246
+ 'ʝ' => 'Ʝ',
247
+ 'ʞ' => 'Ʞ',
248
+ 'ͅ' => 'Ι',
249
+ 'ͱ' => 'Ͱ',
250
+ 'ͳ' => 'Ͳ',
251
+ 'ͷ' => 'Ͷ',
252
+ 'ͻ' => 'Ͻ',
253
+ 'ͼ' => 'Ͼ',
254
+ 'ͽ' => 'Ͽ',
255
+ 'ά' => 'Ά',
256
+ 'έ' => 'Έ',
257
+ 'ή' => 'Ή',
258
+ 'ί' => 'Ί',
259
+ 'α' => 'Α',
260
+ 'β' => 'Β',
261
+ 'γ' => 'Γ',
262
+ 'δ' => 'Δ',
263
+ 'ε' => 'Ε',
264
+ 'ζ' => 'Ζ',
265
+ 'η' => 'Η',
266
+ 'θ' => 'Θ',
267
+ 'ι' => 'Ι',
268
+ 'κ' => 'Κ',
269
+ 'λ' => 'Λ',
270
+ 'μ' => 'Μ',
271
+ 'ν' => 'Ν',
272
+ 'ξ' => 'Ξ',
273
+ 'ο' => 'Ο',
274
+ 'π' => 'Π',
275
+ 'ρ' => 'Ρ',
276
+ 'ς' => 'Σ',
277
+ 'σ' => 'Σ',
278
+ 'τ' => 'Τ',
279
+ 'υ' => 'Υ',
280
+ 'φ' => 'Φ',
281
+ 'χ' => 'Χ',
282
+ 'ψ' => 'Ψ',
283
+ 'ω' => 'Ω',
284
+ 'ϊ' => 'Ϊ',
285
+ 'ϋ' => 'Ϋ',
286
+ 'ό' => 'Ό',
287
+ 'ύ' => 'Ύ',
288
+ 'ώ' => 'Ώ',
289
+ 'ϐ' => 'Β',
290
+ 'ϑ' => 'Θ',
291
+ 'ϕ' => 'Φ',
292
+ 'ϖ' => 'Π',
293
+ 'ϗ' => 'Ϗ',
294
+ 'ϙ' => 'Ϙ',
295
+ 'ϛ' => 'Ϛ',
296
+ 'ϝ' => 'Ϝ',
297
+ 'ϟ' => 'Ϟ',
298
+ 'ϡ' => 'Ϡ',
299
+ 'ϣ' => 'Ϣ',
300
+ 'ϥ' => 'Ϥ',
301
+ 'ϧ' => 'Ϧ',
302
+ 'ϩ' => 'Ϩ',
303
+ 'ϫ' => 'Ϫ',
304
+ 'ϭ' => 'Ϭ',
305
+ 'ϯ' => 'Ϯ',
306
+ 'ϰ' => 'Κ',
307
+ 'ϱ' => 'Ρ',
308
+ 'ϲ' => 'Ϲ',
309
+ 'ϳ' => 'Ϳ',
310
+ 'ϵ' => 'Ε',
311
+ 'ϸ' => 'Ϸ',
312
+ 'ϻ' => 'Ϻ',
313
+ 'а' => 'А',
314
+ 'б' => 'Б',
315
+ 'в' => 'В',
316
+ 'г' => 'Г',
317
+ 'д' => 'Д',
318
+ 'е' => 'Е',
319
+ 'ж' => 'Ж',
320
+ 'з' => 'З',
321
+ 'и' => 'И',
322
+ 'й' => 'Й',
323
+ 'к' => 'К',
324
+ 'л' => 'Л',
325
+ 'м' => 'М',
326
+ 'н' => 'Н',
327
+ 'о' => 'О',
328
+ 'п' => 'П',
329
+ 'р' => 'Р',
330
+ 'с' => 'С',
331
+ 'т' => 'Т',
332
+ 'у' => 'У',
333
+ 'ф' => 'Ф',
334
+ 'х' => 'Х',
335
+ 'ц' => 'Ц',
336
+ 'ч' => 'Ч',
337
+ 'ш' => 'Ш',
338
+ 'щ' => 'Щ',
339
+ 'ъ' => 'Ъ',
340
+ 'ы' => 'Ы',
341
+ 'ь' => 'Ь',
342
+ 'э' => 'Э',
343
+ 'ю' => 'Ю',
344
+ 'я' => 'Я',
345
+ 'ѐ' => 'Ѐ',
346
+ 'ё' => 'Ё',
347
+ 'ђ' => 'Ђ',
348
+ 'ѓ' => 'Ѓ',
349
+ 'є' => 'Є',
350
+ 'ѕ' => 'Ѕ',
351
+ 'і' => 'І',
352
+ 'ї' => 'Ї',
353
+ 'ј' => 'Ј',
354
+ 'љ' => 'Љ',
355
+ 'њ' => 'Њ',
356
+ 'ћ' => 'Ћ',
357
+ 'ќ' => 'Ќ',
358
+ 'ѝ' => 'Ѝ',
359
+ 'ў' => 'Ў',
360
+ 'џ' => 'Џ',
361
+ 'ѡ' => 'Ѡ',
362
+ 'ѣ' => 'Ѣ',
363
+ 'ѥ' => 'Ѥ',
364
+ 'ѧ' => 'Ѧ',
365
+ 'ѩ' => 'Ѩ',
366
+ 'ѫ' => 'Ѫ',
367
+ 'ѭ' => 'Ѭ',
368
+ 'ѯ' => 'Ѯ',
369
+ 'ѱ' => 'Ѱ',
370
+ 'ѳ' => 'Ѳ',
371
+ 'ѵ' => 'Ѵ',
372
+ 'ѷ' => 'Ѷ',
373
+ 'ѹ' => 'Ѹ',
374
+ 'ѻ' => 'Ѻ',
375
+ 'ѽ' => 'Ѽ',
376
+ 'ѿ' => 'Ѿ',
377
+ 'ҁ' => 'Ҁ',
378
+ 'ҋ' => 'Ҋ',
379
+ 'ҍ' => 'Ҍ',
380
+ 'ҏ' => 'Ҏ',
381
+ 'ґ' => 'Ґ',
382
+ 'ғ' => 'Ғ',
383
+ 'ҕ' => 'Ҕ',
384
+ 'җ' => 'Җ',
385
+ 'ҙ' => 'Ҙ',
386
+ 'қ' => 'Қ',
387
+ 'ҝ' => 'Ҝ',
388
+ 'ҟ' => 'Ҟ',
389
+ 'ҡ' => 'Ҡ',
390
+ 'ң' => 'Ң',
391
+ 'ҥ' => 'Ҥ',
392
+ 'ҧ' => 'Ҧ',
393
+ 'ҩ' => 'Ҩ',
394
+ 'ҫ' => 'Ҫ',
395
+ 'ҭ' => 'Ҭ',
396
+ 'ү' => 'Ү',
397
+ 'ұ' => 'Ұ',
398
+ 'ҳ' => 'Ҳ',
399
+ 'ҵ' => 'Ҵ',
400
+ 'ҷ' => 'Ҷ',
401
+ 'ҹ' => 'Ҹ',
402
+ 'һ' => 'Һ',
403
+ 'ҽ' => 'Ҽ',
404
+ 'ҿ' => 'Ҿ',
405
+ 'ӂ' => 'Ӂ',
406
+ 'ӄ' => 'Ӄ',
407
+ 'ӆ' => 'Ӆ',
408
+ 'ӈ' => 'Ӈ',
409
+ 'ӊ' => 'Ӊ',
410
+ 'ӌ' => 'Ӌ',
411
+ 'ӎ' => 'Ӎ',
412
+ 'ӏ' => 'Ӏ',
413
+ 'ӑ' => 'Ӑ',
414
+ 'ӓ' => 'Ӓ',
415
+ 'ӕ' => 'Ӕ',
416
+ 'ӗ' => 'Ӗ',
417
+ 'ә' => 'Ә',
418
+ 'ӛ' => 'Ӛ',
419
+ 'ӝ' => 'Ӝ',
420
+ 'ӟ' => 'Ӟ',
421
+ 'ӡ' => 'Ӡ',
422
+ 'ӣ' => 'Ӣ',
423
+ 'ӥ' => 'Ӥ',
424
+ 'ӧ' => 'Ӧ',
425
+ 'ө' => 'Ө',
426
+ 'ӫ' => 'Ӫ',
427
+ 'ӭ' => 'Ӭ',
428
+ 'ӯ' => 'Ӯ',
429
+ 'ӱ' => 'Ӱ',
430
+ 'ӳ' => 'Ӳ',
431
+ 'ӵ' => 'Ӵ',
432
+ 'ӷ' => 'Ӷ',
433
+ 'ӹ' => 'Ӹ',
434
+ 'ӻ' => 'Ӻ',
435
+ 'ӽ' => 'Ӽ',
436
+ 'ӿ' => 'Ӿ',
437
+ 'ԁ' => 'Ԁ',
438
+ 'ԃ' => 'Ԃ',
439
+ 'ԅ' => 'Ԅ',
440
+ 'ԇ' => 'Ԇ',
441
+ 'ԉ' => 'Ԉ',
442
+ 'ԋ' => 'Ԋ',
443
+ 'ԍ' => 'Ԍ',
444
+ 'ԏ' => 'Ԏ',
445
+ 'ԑ' => 'Ԑ',
446
+ 'ԓ' => 'Ԓ',
447
+ 'ԕ' => 'Ԕ',
448
+ 'ԗ' => 'Ԗ',
449
+ 'ԙ' => 'Ԙ',
450
+ 'ԛ' => 'Ԛ',
451
+ 'ԝ' => 'Ԝ',
452
+ 'ԟ' => 'Ԟ',
453
+ 'ԡ' => 'Ԡ',
454
+ 'ԣ' => 'Ԣ',
455
+ 'ԥ' => 'Ԥ',
456
+ 'ԧ' => 'Ԧ',
457
+ 'ԩ' => 'Ԩ',
458
+ 'ԫ' => 'Ԫ',
459
+ 'ԭ' => 'Ԭ',
460
+ 'ԯ' => 'Ԯ',
461
+ 'ա' => 'Ա',
462
+ 'բ' => 'Բ',
463
+ 'գ' => 'Գ',
464
+ 'դ' => 'Դ',
465
+ 'ե' => 'Ե',
466
+ 'զ' => 'Զ',
467
+ 'է' => 'Է',
468
+ 'ը' => 'Ը',
469
+ 'թ' => 'Թ',
470
+ 'ժ' => 'Ժ',
471
+ 'ի' => 'Ի',
472
+ 'լ' => 'Լ',
473
+ 'խ' => 'Խ',
474
+ 'ծ' => 'Ծ',
475
+ 'կ' => 'Կ',
476
+ 'հ' => 'Հ',
477
+ 'ձ' => 'Ձ',
478
+ 'ղ' => 'Ղ',
479
+ 'ճ' => 'Ճ',
480
+ 'մ' => 'Մ',
481
+ 'յ' => 'Յ',
482
+ 'ն' => 'Ն',
483
+ 'շ' => 'Շ',
484
+ 'ո' => 'Ո',
485
+ 'չ' => 'Չ',
486
+ 'պ' => 'Պ',
487
+ 'ջ' => 'Ջ',
488
+ 'ռ' => 'Ռ',
489
+ 'ս' => 'Ս',
490
+ 'վ' => 'Վ',
491
+ 'տ' => 'Տ',
492
+ 'ր' => 'Ր',
493
+ 'ց' => 'Ց',
494
+ 'ւ' => 'Ւ',
495
+ 'փ' => 'Փ',
496
+ 'ք' => 'Ք',
497
+ 'օ' => 'Օ',
498
+ 'ֆ' => 'Ֆ',
499
+ 'ა' => 'Ა',
500
+ 'ბ' => 'Ბ',
501
+ 'გ' => 'Გ',
502
+ 'დ' => 'Დ',
503
+ 'ე' => 'Ე',
504
+ 'ვ' => 'Ვ',
505
+ 'ზ' => 'Ზ',
506
+ 'თ' => 'Თ',
507
+ 'ი' => 'Ი',
508
+ 'კ' => 'Კ',
509
+ 'ლ' => 'Ლ',
510
+ 'მ' => 'Მ',
511
+ 'ნ' => 'Ნ',
512
+ 'ო' => 'Ო',
513
+ 'პ' => 'Პ',
514
+ 'ჟ' => 'Ჟ',
515
+ 'რ' => 'Რ',
516
+ 'ს' => 'Ს',
517
+ 'ტ' => 'Ტ',
518
+ 'უ' => 'Უ',
519
+ 'ფ' => 'Ფ',
520
+ 'ქ' => 'Ქ',
521
+ 'ღ' => 'Ღ',
522
+ 'ყ' => 'Ყ',
523
+ 'შ' => 'Შ',
524
+ 'ჩ' => 'Ჩ',
525
+ 'ც' => 'Ც',
526
+ 'ძ' => 'Ძ',
527
+ 'წ' => 'Წ',
528
+ 'ჭ' => 'Ჭ',
529
+ 'ხ' => 'Ხ',
530
+ 'ჯ' => 'Ჯ',
531
+ 'ჰ' => 'Ჰ',
532
+ 'ჱ' => 'Ჱ',
533
+ 'ჲ' => 'Ჲ',
534
+ 'ჳ' => 'Ჳ',
535
+ 'ჴ' => 'Ჴ',
536
+ 'ჵ' => 'Ჵ',
537
+ 'ჶ' => 'Ჶ',
538
+ 'ჷ' => 'Ჷ',
539
+ 'ჸ' => 'Ჸ',
540
+ 'ჹ' => 'Ჹ',
541
+ 'ჺ' => 'Ჺ',
542
+ 'ჽ' => 'Ჽ',
543
+ 'ჾ' => 'Ჾ',
544
+ 'ჿ' => 'Ჿ',
545
+ 'ᏸ' => 'Ᏸ',
546
+ 'ᏹ' => 'Ᏹ',
547
+ 'ᏺ' => 'Ᏺ',
548
+ 'ᏻ' => 'Ᏻ',
549
+ 'ᏼ' => 'Ᏼ',
550
+ 'ᏽ' => 'Ᏽ',
551
+ 'ᲀ' => 'В',
552
+ 'ᲁ' => 'Д',
553
+ 'ᲂ' => 'О',
554
+ 'ᲃ' => 'С',
555
+ 'ᲄ' => 'Т',
556
+ 'ᲅ' => 'Т',
557
+ 'ᲆ' => 'Ъ',
558
+ 'ᲇ' => 'Ѣ',
559
+ 'ᲈ' => 'Ꙋ',
560
+ 'ᵹ' => 'Ᵹ',
561
+ 'ᵽ' => 'Ᵽ',
562
+ 'ᶎ' => 'Ᶎ',
563
+ 'ḁ' => 'Ḁ',
564
+ 'ḃ' => 'Ḃ',
565
+ 'ḅ' => 'Ḅ',
566
+ 'ḇ' => 'Ḇ',
567
+ 'ḉ' => 'Ḉ',
568
+ 'ḋ' => 'Ḋ',
569
+ 'ḍ' => 'Ḍ',
570
+ 'ḏ' => 'Ḏ',
571
+ 'ḑ' => 'Ḑ',
572
+ 'ḓ' => 'Ḓ',
573
+ 'ḕ' => 'Ḕ',
574
+ 'ḗ' => 'Ḗ',
575
+ 'ḙ' => 'Ḙ',
576
+ 'ḛ' => 'Ḛ',
577
+ 'ḝ' => 'Ḝ',
578
+ 'ḟ' => 'Ḟ',
579
+ 'ḡ' => 'Ḡ',
580
+ 'ḣ' => 'Ḣ',
581
+ 'ḥ' => 'Ḥ',
582
+ 'ḧ' => 'Ḧ',
583
+ 'ḩ' => 'Ḩ',
584
+ 'ḫ' => 'Ḫ',
585
+ 'ḭ' => 'Ḭ',
586
+ 'ḯ' => 'Ḯ',
587
+ 'ḱ' => 'Ḱ',
588
+ 'ḳ' => 'Ḳ',
589
+ 'ḵ' => 'Ḵ',
590
+ 'ḷ' => 'Ḷ',
591
+ 'ḹ' => 'Ḹ',
592
+ 'ḻ' => 'Ḻ',
593
+ 'ḽ' => 'Ḽ',
594
+ 'ḿ' => 'Ḿ',
595
+ 'ṁ' => 'Ṁ',
596
+ 'ṃ' => 'Ṃ',
597
+ 'ṅ' => 'Ṅ',
598
+ 'ṇ' => 'Ṇ',
599
+ 'ṉ' => 'Ṉ',
600
+ 'ṋ' => 'Ṋ',
601
+ 'ṍ' => 'Ṍ',
602
+ 'ṏ' => 'Ṏ',
603
+ 'ṑ' => 'Ṑ',
604
+ 'ṓ' => 'Ṓ',
605
+ 'ṕ' => 'Ṕ',
606
+ 'ṗ' => 'Ṗ',
607
+ 'ṙ' => 'Ṙ',
608
+ 'ṛ' => 'Ṛ',
609
+ 'ṝ' => 'Ṝ',
610
+ 'ṟ' => 'Ṟ',
611
+ 'ṡ' => 'Ṡ',
612
+ 'ṣ' => 'Ṣ',
613
+ 'ṥ' => 'Ṥ',
614
+ 'ṧ' => 'Ṧ',
615
+ 'ṩ' => 'Ṩ',
616
+ 'ṫ' => 'Ṫ',
617
+ 'ṭ' => 'Ṭ',
618
+ 'ṯ' => 'Ṯ',
619
+ 'ṱ' => 'Ṱ',
620
+ 'ṳ' => 'Ṳ',
621
+ 'ṵ' => 'Ṵ',
622
+ 'ṷ' => 'Ṷ',
623
+ 'ṹ' => 'Ṹ',
624
+ 'ṻ' => 'Ṻ',
625
+ 'ṽ' => 'Ṽ',
626
+ 'ṿ' => 'Ṿ',
627
+ 'ẁ' => 'Ẁ',
628
+ 'ẃ' => 'Ẃ',
629
+ 'ẅ' => 'Ẅ',
630
+ 'ẇ' => 'Ẇ',
631
+ 'ẉ' => 'Ẉ',
632
+ 'ẋ' => 'Ẋ',
633
+ 'ẍ' => 'Ẍ',
634
+ 'ẏ' => 'Ẏ',
635
+ 'ẑ' => 'Ẑ',
636
+ 'ẓ' => 'Ẓ',
637
+ 'ẕ' => 'Ẕ',
638
+ 'ẛ' => 'Ṡ',
639
+ 'ạ' => 'Ạ',
640
+ 'ả' => 'Ả',
641
+ 'ấ' => 'Ấ',
642
+ 'ầ' => 'Ầ',
643
+ 'ẩ' => 'Ẩ',
644
+ 'ẫ' => 'Ẫ',
645
+ 'ậ' => 'Ậ',
646
+ 'ắ' => 'Ắ',
647
+ 'ằ' => 'Ằ',
648
+ 'ẳ' => 'Ẳ',
649
+ 'ẵ' => 'Ẵ',
650
+ 'ặ' => 'Ặ',
651
+ 'ẹ' => 'Ẹ',
652
+ 'ẻ' => 'Ẻ',
653
+ 'ẽ' => 'Ẽ',
654
+ 'ế' => 'Ế',
655
+ 'ề' => 'Ề',
656
+ 'ể' => 'Ể',
657
+ 'ễ' => 'Ễ',
658
+ 'ệ' => 'Ệ',
659
+ 'ỉ' => 'Ỉ',
660
+ 'ị' => 'Ị',
661
+ 'ọ' => 'Ọ',
662
+ 'ỏ' => 'Ỏ',
663
+ 'ố' => 'Ố',
664
+ 'ồ' => 'Ồ',
665
+ 'ổ' => 'Ổ',
666
+ 'ỗ' => 'Ỗ',
667
+ 'ộ' => 'Ộ',
668
+ 'ớ' => 'Ớ',
669
+ 'ờ' => 'Ờ',
670
+ 'ở' => 'Ở',
671
+ 'ỡ' => 'Ỡ',
672
+ 'ợ' => 'Ợ',
673
+ 'ụ' => 'Ụ',
674
+ 'ủ' => 'Ủ',
675
+ 'ứ' => 'Ứ',
676
+ 'ừ' => 'Ừ',
677
+ 'ử' => 'Ử',
678
+ 'ữ' => 'Ữ',
679
+ 'ự' => 'Ự',
680
+ 'ỳ' => 'Ỳ',
681
+ 'ỵ' => 'Ỵ',
682
+ 'ỷ' => 'Ỷ',
683
+ 'ỹ' => 'Ỹ',
684
+ 'ỻ' => 'Ỻ',
685
+ 'ỽ' => 'Ỽ',
686
+ 'ỿ' => 'Ỿ',
687
+ 'ἀ' => 'Ἀ',
688
+ 'ἁ' => 'Ἁ',
689
+ 'ἂ' => 'Ἂ',
690
+ 'ἃ' => 'Ἃ',
691
+ 'ἄ' => 'Ἄ',
692
+ 'ἅ' => 'Ἅ',
693
+ 'ἆ' => 'Ἆ',
694
+ 'ἇ' => 'Ἇ',
695
+ 'ἐ' => 'Ἐ',
696
+ 'ἑ' => 'Ἑ',
697
+ 'ἒ' => 'Ἒ',
698
+ 'ἓ' => 'Ἓ',
699
+ 'ἔ' => 'Ἔ',
700
+ 'ἕ' => 'Ἕ',
701
+ 'ἠ' => 'Ἠ',
702
+ 'ἡ' => 'Ἡ',
703
+ 'ἢ' => 'Ἢ',
704
+ 'ἣ' => 'Ἣ',
705
+ 'ἤ' => 'Ἤ',
706
+ 'ἥ' => 'Ἥ',
707
+ 'ἦ' => 'Ἦ',
708
+ 'ἧ' => 'Ἧ',
709
+ 'ἰ' => 'Ἰ',
710
+ 'ἱ' => 'Ἱ',
711
+ 'ἲ' => 'Ἲ',
712
+ 'ἳ' => 'Ἳ',
713
+ 'ἴ' => 'Ἴ',
714
+ 'ἵ' => 'Ἵ',
715
+ 'ἶ' => 'Ἶ',
716
+ 'ἷ' => 'Ἷ',
717
+ 'ὀ' => 'Ὀ',
718
+ 'ὁ' => 'Ὁ',
719
+ 'ὂ' => 'Ὂ',
720
+ 'ὃ' => 'Ὃ',
721
+ 'ὄ' => 'Ὄ',
722
+ 'ὅ' => 'Ὅ',
723
+ 'ὑ' => 'Ὑ',
724
+ 'ὓ' => 'Ὓ',
725
+ 'ὕ' => 'Ὕ',
726
+ 'ὗ' => 'Ὗ',
727
+ 'ὠ' => 'Ὠ',
728
+ 'ὡ' => 'Ὡ',
729
+ 'ὢ' => 'Ὢ',
730
+ 'ὣ' => 'Ὣ',
731
+ 'ὤ' => 'Ὤ',
732
+ 'ὥ' => 'Ὥ',
733
+ 'ὦ' => 'Ὦ',
734
+ 'ὧ' => 'Ὧ',
735
+ 'ὰ' => 'Ὰ',
736
+ 'ά' => 'Ά',
737
+ 'ὲ' => 'Ὲ',
738
+ 'έ' => 'Έ',
739
+ 'ὴ' => 'Ὴ',
740
+ 'ή' => 'Ή',
741
+ 'ὶ' => 'Ὶ',
742
+ 'ί' => 'Ί',
743
+ 'ὸ' => 'Ὸ',
744
+ 'ό' => 'Ό',
745
+ 'ὺ' => 'Ὺ',
746
+ 'ύ' => 'Ύ',
747
+ 'ὼ' => 'Ὼ',
748
+ 'ώ' => 'Ώ',
749
+ 'ᾀ' => 'ᾈ',
750
+ 'ᾁ' => 'ᾉ',
751
+ 'ᾂ' => 'ᾊ',
752
+ 'ᾃ' => 'ᾋ',
753
+ 'ᾄ' => 'ᾌ',
754
+ 'ᾅ' => 'ᾍ',
755
+ 'ᾆ' => 'ᾎ',
756
+ 'ᾇ' => 'ᾏ',
757
+ 'ᾐ' => 'ᾘ',
758
+ 'ᾑ' => 'ᾙ',
759
+ 'ᾒ' => 'ᾚ',
760
+ 'ᾓ' => 'ᾛ',
761
+ 'ᾔ' => 'ᾜ',
762
+ 'ᾕ' => 'ᾝ',
763
+ 'ᾖ' => 'ᾞ',
764
+ 'ᾗ' => 'ᾟ',
765
+ 'ᾠ' => 'ᾨ',
766
+ 'ᾡ' => 'ᾩ',
767
+ 'ᾢ' => 'ᾪ',
768
+ 'ᾣ' => 'ᾫ',
769
+ 'ᾤ' => 'ᾬ',
770
+ 'ᾥ' => 'ᾭ',
771
+ 'ᾦ' => 'ᾮ',
772
+ 'ᾧ' => 'ᾯ',
773
+ 'ᾰ' => 'Ᾰ',
774
+ 'ᾱ' => 'Ᾱ',
775
+ 'ᾳ' => 'ᾼ',
776
+ 'ι' => 'Ι',
777
+ 'ῃ' => 'ῌ',
778
+ 'ῐ' => 'Ῐ',
779
+ 'ῑ' => 'Ῑ',
780
+ 'ῠ' => 'Ῠ',
781
+ 'ῡ' => 'Ῡ',
782
+ 'ῥ' => 'Ῥ',
783
+ 'ῳ' => 'ῼ',
784
+ 'ⅎ' => 'Ⅎ',
785
+ 'ⅰ' => 'Ⅰ',
786
+ 'ⅱ' => 'Ⅱ',
787
+ 'ⅲ' => 'Ⅲ',
788
+ 'ⅳ' => 'Ⅳ',
789
+ 'ⅴ' => 'Ⅴ',
790
+ 'ⅵ' => 'Ⅵ',
791
+ 'ⅶ' => 'Ⅶ',
792
+ 'ⅷ' => 'Ⅷ',
793
+ 'ⅸ' => 'Ⅸ',
794
+ 'ⅹ' => 'Ⅹ',
795
+ 'ⅺ' => 'Ⅺ',
796
+ 'ⅻ' => 'Ⅻ',
797
+ 'ⅼ' => 'Ⅼ',
798
+ 'ⅽ' => 'Ⅽ',
799
+ 'ⅾ' => 'Ⅾ',
800
+ 'ⅿ' => 'Ⅿ',
801
+ 'ↄ' => 'Ↄ',
802
+ 'ⓐ' => 'Ⓐ',
803
+ 'ⓑ' => 'Ⓑ',
804
+ 'ⓒ' => 'Ⓒ',
805
+ 'ⓓ' => 'Ⓓ',
806
+ 'ⓔ' => 'Ⓔ',
807
+ 'ⓕ' => 'Ⓕ',
808
+ 'ⓖ' => 'Ⓖ',
809
+ 'ⓗ' => 'Ⓗ',
810
+ 'ⓘ' => 'Ⓘ',
811
+ 'ⓙ' => 'Ⓙ',
812
+ 'ⓚ' => 'Ⓚ',
813
+ 'ⓛ' => 'Ⓛ',
814
+ 'ⓜ' => 'Ⓜ',
815
+ 'ⓝ' => 'Ⓝ',
816
+ 'ⓞ' => 'Ⓞ',
817
+ 'ⓟ' => 'Ⓟ',
818
+ 'ⓠ' => 'Ⓠ',
819
+ 'ⓡ' => 'Ⓡ',
820
+ 'ⓢ' => 'Ⓢ',
821
+ 'ⓣ' => 'Ⓣ',
822
+ 'ⓤ' => 'Ⓤ',
823
+ 'ⓥ' => 'Ⓥ',
824
+ 'ⓦ' => 'Ⓦ',
825
+ 'ⓧ' => 'Ⓧ',
826
+ 'ⓨ' => 'Ⓨ',
827
+ 'ⓩ' => 'Ⓩ',
828
+ 'ⰰ' => 'Ⰰ',
829
+ 'ⰱ' => 'Ⰱ',
830
+ 'ⰲ' => 'Ⰲ',
831
+ 'ⰳ' => 'Ⰳ',
832
+ 'ⰴ' => 'Ⰴ',
833
+ 'ⰵ' => 'Ⰵ',
834
+ 'ⰶ' => 'Ⰶ',
835
+ 'ⰷ' => 'Ⰷ',
836
+ 'ⰸ' => 'Ⰸ',
837
+ 'ⰹ' => 'Ⰹ',
838
+ 'ⰺ' => 'Ⰺ',
839
+ 'ⰻ' => 'Ⰻ',
840
+ 'ⰼ' => 'Ⰼ',
841
+ 'ⰽ' => 'Ⰽ',
842
+ 'ⰾ' => 'Ⰾ',
843
+ 'ⰿ' => 'Ⰿ',
844
+ 'ⱀ' => 'Ⱀ',
845
+ 'ⱁ' => 'Ⱁ',
846
+ 'ⱂ' => 'Ⱂ',
847
+ 'ⱃ' => 'Ⱃ',
848
+ 'ⱄ' => 'Ⱄ',
849
+ 'ⱅ' => 'Ⱅ',
850
+ 'ⱆ' => 'Ⱆ',
851
+ 'ⱇ' => 'Ⱇ',
852
+ 'ⱈ' => 'Ⱈ',
853
+ 'ⱉ' => 'Ⱉ',
854
+ 'ⱊ' => 'Ⱊ',
855
+ 'ⱋ' => 'Ⱋ',
856
+ 'ⱌ' => 'Ⱌ',
857
+ 'ⱍ' => 'Ⱍ',
858
+ 'ⱎ' => 'Ⱎ',
859
+ 'ⱏ' => 'Ⱏ',
860
+ 'ⱐ' => 'Ⱐ',
861
+ 'ⱑ' => 'Ⱑ',
862
+ 'ⱒ' => 'Ⱒ',
863
+ 'ⱓ' => 'Ⱓ',
864
+ 'ⱔ' => 'Ⱔ',
865
+ 'ⱕ' => 'Ⱕ',
866
+ 'ⱖ' => 'Ⱖ',
867
+ 'ⱗ' => 'Ⱗ',
868
+ 'ⱘ' => 'Ⱘ',
869
+ 'ⱙ' => 'Ⱙ',
870
+ 'ⱚ' => 'Ⱚ',
871
+ 'ⱛ' => 'Ⱛ',
872
+ 'ⱜ' => 'Ⱜ',
873
+ 'ⱝ' => 'Ⱝ',
874
+ 'ⱞ' => 'Ⱞ',
875
+ 'ⱡ' => 'Ⱡ',
876
+ 'ⱥ' => 'Ⱥ',
877
+ 'ⱦ' => 'Ⱦ',
878
+ 'ⱨ' => 'Ⱨ',
879
+ 'ⱪ' => 'Ⱪ',
880
+ 'ⱬ' => 'Ⱬ',
881
+ 'ⱳ' => 'Ⱳ',
882
+ 'ⱶ' => 'Ⱶ',
883
+ 'ⲁ' => 'Ⲁ',
884
+ 'ⲃ' => 'Ⲃ',
885
+ 'ⲅ' => 'Ⲅ',
886
+ 'ⲇ' => 'Ⲇ',
887
+ 'ⲉ' => 'Ⲉ',
888
+ 'ⲋ' => 'Ⲋ',
889
+ 'ⲍ' => 'Ⲍ',
890
+ 'ⲏ' => 'Ⲏ',
891
+ 'ⲑ' => 'Ⲑ',
892
+ 'ⲓ' => 'Ⲓ',
893
+ 'ⲕ' => 'Ⲕ',
894
+ 'ⲗ' => 'Ⲗ',
895
+ 'ⲙ' => 'Ⲙ',
896
+ 'ⲛ' => 'Ⲛ',
897
+ 'ⲝ' => 'Ⲝ',
898
+ 'ⲟ' => 'Ⲟ',
899
+ 'ⲡ' => 'Ⲡ',
900
+ 'ⲣ' => 'Ⲣ',
901
+ 'ⲥ' => 'Ⲥ',
902
+ 'ⲧ' => 'Ⲧ',
903
+ 'ⲩ' => 'Ⲩ',
904
+ 'ⲫ' => 'Ⲫ',
905
+ 'ⲭ' => 'Ⲭ',
906
+ 'ⲯ' => 'Ⲯ',
907
+ 'ⲱ' => 'Ⲱ',
908
+ 'ⲳ' => 'Ⲳ',
909
+ 'ⲵ' => 'Ⲵ',
910
+ 'ⲷ' => 'Ⲷ',
911
+ 'ⲹ' => 'Ⲹ',
912
+ 'ⲻ' => 'Ⲻ',
913
+ 'ⲽ' => 'Ⲽ',
914
+ 'ⲿ' => 'Ⲿ',
915
+ 'ⳁ' => 'Ⳁ',
916
+ 'ⳃ' => 'Ⳃ',
917
+ 'ⳅ' => 'Ⳅ',
918
+ 'ⳇ' => 'Ⳇ',
919
+ 'ⳉ' => 'Ⳉ',
920
+ 'ⳋ' => 'Ⳋ',
921
+ 'ⳍ' => 'Ⳍ',
922
+ 'ⳏ' => 'Ⳏ',
923
+ 'ⳑ' => 'Ⳑ',
924
+ 'ⳓ' => 'Ⳓ',
925
+ 'ⳕ' => 'Ⳕ',
926
+ 'ⳗ' => 'Ⳗ',
927
+ 'ⳙ' => 'Ⳙ',
928
+ 'ⳛ' => 'Ⳛ',
929
+ 'ⳝ' => 'Ⳝ',
930
+ 'ⳟ' => 'Ⳟ',
931
+ 'ⳡ' => 'Ⳡ',
932
+ 'ⳣ' => 'Ⳣ',
933
+ 'ⳬ' => 'Ⳬ',
934
+ 'ⳮ' => 'Ⳮ',
935
+ 'ⳳ' => 'Ⳳ',
936
+ 'ⴀ' => 'Ⴀ',
937
+ 'ⴁ' => 'Ⴁ',
938
+ 'ⴂ' => 'Ⴂ',
939
+ 'ⴃ' => 'Ⴃ',
940
+ 'ⴄ' => 'Ⴄ',
941
+ 'ⴅ' => 'Ⴅ',
942
+ 'ⴆ' => 'Ⴆ',
943
+ 'ⴇ' => 'Ⴇ',
944
+ 'ⴈ' => 'Ⴈ',
945
+ 'ⴉ' => 'Ⴉ',
946
+ 'ⴊ' => 'Ⴊ',
947
+ 'ⴋ' => 'Ⴋ',
948
+ 'ⴌ' => 'Ⴌ',
949
+ 'ⴍ' => 'Ⴍ',
950
+ 'ⴎ' => 'Ⴎ',
951
+ 'ⴏ' => 'Ⴏ',
952
+ 'ⴐ' => 'Ⴐ',
953
+ 'ⴑ' => 'Ⴑ',
954
+ 'ⴒ' => 'Ⴒ',
955
+ 'ⴓ' => 'Ⴓ',
956
+ 'ⴔ' => 'Ⴔ',
957
+ 'ⴕ' => 'Ⴕ',
958
+ 'ⴖ' => 'Ⴖ',
959
+ 'ⴗ' => 'Ⴗ',
960
+ 'ⴘ' => 'Ⴘ',
961
+ 'ⴙ' => 'Ⴙ',
962
+ 'ⴚ' => 'Ⴚ',
963
+ 'ⴛ' => 'Ⴛ',
964
+ 'ⴜ' => 'Ⴜ',
965
+ 'ⴝ' => 'Ⴝ',
966
+ 'ⴞ' => 'Ⴞ',
967
+ 'ⴟ' => 'Ⴟ',
968
+ 'ⴠ' => 'Ⴠ',
969
+ 'ⴡ' => 'Ⴡ',
970
+ 'ⴢ' => 'Ⴢ',
971
+ 'ⴣ' => 'Ⴣ',
972
+ 'ⴤ' => 'Ⴤ',
973
+ 'ⴥ' => 'Ⴥ',
974
+ 'ⴧ' => 'Ⴧ',
975
+ 'ⴭ' => 'Ⴭ',
976
+ 'ꙁ' => 'Ꙁ',
977
+ 'ꙃ' => 'Ꙃ',
978
+ 'ꙅ' => 'Ꙅ',
979
+ 'ꙇ' => 'Ꙇ',
980
+ 'ꙉ' => 'Ꙉ',
981
+ 'ꙋ' => 'Ꙋ',
982
+ 'ꙍ' => 'Ꙍ',
983
+ 'ꙏ' => 'Ꙏ',
984
+ 'ꙑ' => 'Ꙑ',
985
+ 'ꙓ' => 'Ꙓ',
986
+ 'ꙕ' => 'Ꙕ',
987
+ 'ꙗ' => 'Ꙗ',
988
+ 'ꙙ' => 'Ꙙ',
989
+ 'ꙛ' => 'Ꙛ',
990
+ 'ꙝ' => 'Ꙝ',
991
+ 'ꙟ' => 'Ꙟ',
992
+ 'ꙡ' => 'Ꙡ',
993
+ 'ꙣ' => 'Ꙣ',
994
+ 'ꙥ' => 'Ꙥ',
995
+ 'ꙧ' => 'Ꙧ',
996
+ 'ꙩ' => 'Ꙩ',
997
+ 'ꙫ' => 'Ꙫ',
998
+ 'ꙭ' => 'Ꙭ',
999
+ 'ꚁ' => 'Ꚁ',
1000
+ 'ꚃ' => 'Ꚃ',
1001
+ 'ꚅ' => 'Ꚅ',
1002
+ 'ꚇ' => 'Ꚇ',
1003
+ 'ꚉ' => 'Ꚉ',
1004
+ 'ꚋ' => 'Ꚋ',
1005
+ 'ꚍ' => 'Ꚍ',
1006
+ 'ꚏ' => 'Ꚏ',
1007
+ 'ꚑ' => 'Ꚑ',
1008
+ 'ꚓ' => 'Ꚓ',
1009
+ 'ꚕ' => 'Ꚕ',
1010
+ 'ꚗ' => 'Ꚗ',
1011
+ 'ꚙ' => 'Ꚙ',
1012
+ 'ꚛ' => 'Ꚛ',
1013
+ 'ꜣ' => 'Ꜣ',
1014
+ 'ꜥ' => 'Ꜥ',
1015
+ 'ꜧ' => 'Ꜧ',
1016
+ 'ꜩ' => 'Ꜩ',
1017
+ 'ꜫ' => 'Ꜫ',
1018
+ 'ꜭ' => 'Ꜭ',
1019
+ 'ꜯ' => 'Ꜯ',
1020
+ 'ꜳ' => 'Ꜳ',
1021
+ 'ꜵ' => 'Ꜵ',
1022
+ 'ꜷ' => 'Ꜷ',
1023
+ 'ꜹ' => 'Ꜹ',
1024
+ 'ꜻ' => 'Ꜻ',
1025
+ 'ꜽ' => 'Ꜽ',
1026
+ 'ꜿ' => 'Ꜿ',
1027
+ 'ꝁ' => 'Ꝁ',
1028
+ 'ꝃ' => 'Ꝃ',
1029
+ 'ꝅ' => 'Ꝅ',
1030
+ 'ꝇ' => 'Ꝇ',
1031
+ 'ꝉ' => 'Ꝉ',
1032
+ 'ꝋ' => 'Ꝋ',
1033
+ 'ꝍ' => 'Ꝍ',
1034
+ 'ꝏ' => 'Ꝏ',
1035
+ 'ꝑ' => 'Ꝑ',
1036
+ 'ꝓ' => 'Ꝓ',
1037
+ 'ꝕ' => 'Ꝕ',
1038
+ 'ꝗ' => 'Ꝗ',
1039
+ 'ꝙ' => 'Ꝙ',
1040
+ 'ꝛ' => 'Ꝛ',
1041
+ 'ꝝ' => 'Ꝝ',
1042
+ 'ꝟ' => 'Ꝟ',
1043
+ 'ꝡ' => 'Ꝡ',
1044
+ 'ꝣ' => 'Ꝣ',
1045
+ 'ꝥ' => 'Ꝥ',
1046
+ 'ꝧ' => 'Ꝧ',
1047
+ 'ꝩ' => 'Ꝩ',
1048
+ 'ꝫ' => 'Ꝫ',
1049
+ 'ꝭ' => 'Ꝭ',
1050
+ 'ꝯ' => 'Ꝯ',
1051
+ 'ꝺ' => 'Ꝺ',
1052
+ 'ꝼ' => 'Ꝼ',
1053
+ 'ꝿ' => 'Ꝿ',
1054
+ 'ꞁ' => 'Ꞁ',
1055
+ 'ꞃ' => 'Ꞃ',
1056
+ 'ꞅ' => 'Ꞅ',
1057
+ 'ꞇ' => 'Ꞇ',
1058
+ 'ꞌ' => 'Ꞌ',
1059
+ 'ꞑ' => 'Ꞑ',
1060
+ 'ꞓ' => 'Ꞓ',
1061
+ 'ꞔ' => 'Ꞔ',
1062
+ 'ꞗ' => 'Ꞗ',
1063
+ 'ꞙ' => 'Ꞙ',
1064
+ 'ꞛ' => 'Ꞛ',
1065
+ 'ꞝ' => 'Ꞝ',
1066
+ 'ꞟ' => 'Ꞟ',
1067
+ 'ꞡ' => 'Ꞡ',
1068
+ 'ꞣ' => 'Ꞣ',
1069
+ 'ꞥ' => 'Ꞥ',
1070
+ 'ꞧ' => 'Ꞧ',
1071
+ 'ꞩ' => 'Ꞩ',
1072
+ 'ꞵ' => 'Ꞵ',
1073
+ 'ꞷ' => 'Ꞷ',
1074
+ 'ꞹ' => 'Ꞹ',
1075
+ 'ꞻ' => 'Ꞻ',
1076
+ 'ꞽ' => 'Ꞽ',
1077
+ 'ꞿ' => 'Ꞿ',
1078
+ 'ꟃ' => 'Ꟃ',
1079
+ 'ꟈ' => 'Ꟈ',
1080
+ 'ꟊ' => 'Ꟊ',
1081
+ 'ꟶ' => 'Ꟶ',
1082
+ 'ꭓ' => 'Ꭓ',
1083
+ 'ꭰ' => 'Ꭰ',
1084
+ 'ꭱ' => 'Ꭱ',
1085
+ 'ꭲ' => 'Ꭲ',
1086
+ 'ꭳ' => 'Ꭳ',
1087
+ 'ꭴ' => 'Ꭴ',
1088
+ 'ꭵ' => 'Ꭵ',
1089
+ 'ꭶ' => 'Ꭶ',
1090
+ 'ꭷ' => 'Ꭷ',
1091
+ 'ꭸ' => 'Ꭸ',
1092
+ 'ꭹ' => 'Ꭹ',
1093
+ 'ꭺ' => 'Ꭺ',
1094
+ 'ꭻ' => 'Ꭻ',
1095
+ 'ꭼ' => 'Ꭼ',
1096
+ 'ꭽ' => 'Ꭽ',
1097
+ 'ꭾ' => 'Ꭾ',
1098
+ 'ꭿ' => 'Ꭿ',
1099
+ 'ꮀ' => 'Ꮀ',
1100
+ 'ꮁ' => 'Ꮁ',
1101
+ 'ꮂ' => 'Ꮂ',
1102
+ 'ꮃ' => 'Ꮃ',
1103
+ 'ꮄ' => 'Ꮄ',
1104
+ 'ꮅ' => 'Ꮅ',
1105
+ 'ꮆ' => 'Ꮆ',
1106
+ 'ꮇ' => 'Ꮇ',
1107
+ 'ꮈ' => 'Ꮈ',
1108
+ 'ꮉ' => 'Ꮉ',
1109
+ 'ꮊ' => 'Ꮊ',
1110
+ 'ꮋ' => 'Ꮋ',
1111
+ 'ꮌ' => 'Ꮌ',
1112
+ 'ꮍ' => 'Ꮍ',
1113
+ 'ꮎ' => 'Ꮎ',
1114
+ 'ꮏ' => 'Ꮏ',
1115
+ 'ꮐ' => 'Ꮐ',
1116
+ 'ꮑ' => 'Ꮑ',
1117
+ 'ꮒ' => 'Ꮒ',
1118
+ 'ꮓ' => 'Ꮓ',
1119
+ 'ꮔ' => 'Ꮔ',
1120
+ 'ꮕ' => 'Ꮕ',
1121
+ 'ꮖ' => 'Ꮖ',
1122
+ 'ꮗ' => 'Ꮗ',
1123
+ 'ꮘ' => 'Ꮘ',
1124
+ 'ꮙ' => 'Ꮙ',
1125
+ 'ꮚ' => 'Ꮚ',
1126
+ 'ꮛ' => 'Ꮛ',
1127
+ 'ꮜ' => 'Ꮜ',
1128
+ 'ꮝ' => 'Ꮝ',
1129
+ 'ꮞ' => 'Ꮞ',
1130
+ 'ꮟ' => 'Ꮟ',
1131
+ 'ꮠ' => 'Ꮠ',
1132
+ 'ꮡ' => 'Ꮡ',
1133
+ 'ꮢ' => 'Ꮢ',
1134
+ 'ꮣ' => 'Ꮣ',
1135
+ 'ꮤ' => 'Ꮤ',
1136
+ 'ꮥ' => 'Ꮥ',
1137
+ 'ꮦ' => 'Ꮦ',
1138
+ 'ꮧ' => 'Ꮧ',
1139
+ 'ꮨ' => 'Ꮨ',
1140
+ 'ꮩ' => 'Ꮩ',
1141
+ 'ꮪ' => 'Ꮪ',
1142
+ 'ꮫ' => 'Ꮫ',
1143
+ 'ꮬ' => 'Ꮬ',
1144
+ 'ꮭ' => 'Ꮭ',
1145
+ 'ꮮ' => 'Ꮮ',
1146
+ 'ꮯ' => 'Ꮯ',
1147
+ 'ꮰ' => 'Ꮰ',
1148
+ 'ꮱ' => 'Ꮱ',
1149
+ 'ꮲ' => 'Ꮲ',
1150
+ 'ꮳ' => 'Ꮳ',
1151
+ 'ꮴ' => 'Ꮴ',
1152
+ 'ꮵ' => 'Ꮵ',
1153
+ 'ꮶ' => 'Ꮶ',
1154
+ 'ꮷ' => 'Ꮷ',
1155
+ 'ꮸ' => 'Ꮸ',
1156
+ 'ꮹ' => 'Ꮹ',
1157
+ 'ꮺ' => 'Ꮺ',
1158
+ 'ꮻ' => 'Ꮻ',
1159
+ 'ꮼ' => 'Ꮼ',
1160
+ 'ꮽ' => 'Ꮽ',
1161
+ 'ꮾ' => 'Ꮾ',
1162
+ 'ꮿ' => 'Ꮿ',
1163
+ 'a' => 'A',
1164
+ 'b' => 'B',
1165
+ 'c' => 'C',
1166
+ 'd' => 'D',
1167
+ 'e' => 'E',
1168
+ 'f' => 'F',
1169
+ 'g' => 'G',
1170
+ 'h' => 'H',
1171
+ 'i' => 'I',
1172
+ 'j' => 'J',
1173
+ 'k' => 'K',
1174
+ 'l' => 'L',
1175
+ 'm' => 'M',
1176
+ 'n' => 'N',
1177
+ 'o' => 'O',
1178
+ 'p' => 'P',
1179
+ 'q' => 'Q',
1180
+ 'r' => 'R',
1181
+ 's' => 'S',
1182
+ 't' => 'T',
1183
+ 'u' => 'U',
1184
+ 'v' => 'V',
1185
+ 'w' => 'W',
1186
+ 'x' => 'X',
1187
+ 'y' => 'Y',
1188
+ 'z' => 'Z',
1189
+ '𐐨' => '𐐀',
1190
+ '𐐩' => '𐐁',
1191
+ '𐐪' => '𐐂',
1192
+ '𐐫' => '𐐃',
1193
+ '𐐬' => '𐐄',
1194
+ '𐐭' => '𐐅',
1195
+ '𐐮' => '𐐆',
1196
+ '𐐯' => '𐐇',
1197
+ '𐐰' => '𐐈',
1198
+ '𐐱' => '𐐉',
1199
+ '𐐲' => '𐐊',
1200
+ '𐐳' => '𐐋',
1201
+ '𐐴' => '𐐌',
1202
+ '𐐵' => '𐐍',
1203
+ '𐐶' => '𐐎',
1204
+ '𐐷' => '𐐏',
1205
+ '𐐸' => '𐐐',
1206
+ '𐐹' => '𐐑',
1207
+ '𐐺' => '𐐒',
1208
+ '𐐻' => '𐐓',
1209
+ '𐐼' => '𐐔',
1210
+ '𐐽' => '𐐕',
1211
+ '𐐾' => '𐐖',
1212
+ '𐐿' => '𐐗',
1213
+ '𐑀' => '𐐘',
1214
+ '𐑁' => '𐐙',
1215
+ '𐑂' => '𐐚',
1216
+ '𐑃' => '𐐛',
1217
+ '𐑄' => '𐐜',
1218
+ '𐑅' => '𐐝',
1219
+ '𐑆' => '𐐞',
1220
+ '𐑇' => '𐐟',
1221
+ '𐑈' => '𐐠',
1222
+ '𐑉' => '𐐡',
1223
+ '𐑊' => '𐐢',
1224
+ '𐑋' => '𐐣',
1225
+ '𐑌' => '𐐤',
1226
+ '𐑍' => '𐐥',
1227
+ '𐑎' => '𐐦',
1228
+ '𐑏' => '𐐧',
1229
+ '𐓘' => '𐒰',
1230
+ '𐓙' => '𐒱',
1231
+ '𐓚' => '𐒲',
1232
+ '𐓛' => '𐒳',
1233
+ '𐓜' => '𐒴',
1234
+ '𐓝' => '𐒵',
1235
+ '𐓞' => '𐒶',
1236
+ '𐓟' => '𐒷',
1237
+ '𐓠' => '𐒸',
1238
+ '𐓡' => '𐒹',
1239
+ '𐓢' => '𐒺',
1240
+ '𐓣' => '𐒻',
1241
+ '𐓤' => '𐒼',
1242
+ '𐓥' => '𐒽',
1243
+ '𐓦' => '𐒾',
1244
+ '𐓧' => '𐒿',
1245
+ '𐓨' => '𐓀',
1246
+ '𐓩' => '𐓁',
1247
+ '𐓪' => '𐓂',
1248
+ '𐓫' => '𐓃',
1249
+ '𐓬' => '𐓄',
1250
+ '𐓭' => '𐓅',
1251
+ '𐓮' => '𐓆',
1252
+ '𐓯' => '𐓇',
1253
+ '𐓰' => '𐓈',
1254
+ '𐓱' => '𐓉',
1255
+ '𐓲' => '𐓊',
1256
+ '𐓳' => '𐓋',
1257
+ '𐓴' => '𐓌',
1258
+ '𐓵' => '𐓍',
1259
+ '𐓶' => '𐓎',
1260
+ '𐓷' => '𐓏',
1261
+ '𐓸' => '𐓐',
1262
+ '𐓹' => '𐓑',
1263
+ '𐓺' => '𐓒',
1264
+ '𐓻' => '𐓓',
1265
+ '𐳀' => '𐲀',
1266
+ '𐳁' => '𐲁',
1267
+ '𐳂' => '𐲂',
1268
+ '𐳃' => '𐲃',
1269
+ '𐳄' => '𐲄',
1270
+ '𐳅' => '𐲅',
1271
+ '𐳆' => '𐲆',
1272
+ '𐳇' => '𐲇',
1273
+ '𐳈' => '𐲈',
1274
+ '𐳉' => '𐲉',
1275
+ '𐳊' => '𐲊',
1276
+ '𐳋' => '𐲋',
1277
+ '𐳌' => '𐲌',
1278
+ '𐳍' => '𐲍',
1279
+ '𐳎' => '𐲎',
1280
+ '𐳏' => '𐲏',
1281
+ '𐳐' => '𐲐',
1282
+ '𐳑' => '𐲑',
1283
+ '𐳒' => '𐲒',
1284
+ '𐳓' => '𐲓',
1285
+ '𐳔' => '𐲔',
1286
+ '𐳕' => '𐲕',
1287
+ '𐳖' => '𐲖',
1288
+ '𐳗' => '𐲗',
1289
+ '𐳘' => '𐲘',
1290
+ '𐳙' => '𐲙',
1291
+ '𐳚' => '𐲚',
1292
+ '𐳛' => '𐲛',
1293
+ '𐳜' => '𐲜',
1294
+ '𐳝' => '𐲝',
1295
+ '𐳞' => '𐲞',
1296
+ '𐳟' => '𐲟',
1297
+ '𐳠' => '𐲠',
1298
+ '𐳡' => '𐲡',
1299
+ '𐳢' => '𐲢',
1300
+ '𐳣' => '𐲣',
1301
+ '𐳤' => '𐲤',
1302
+ '𐳥' => '𐲥',
1303
+ '𐳦' => '𐲦',
1304
+ '𐳧' => '𐲧',
1305
+ '𐳨' => '𐲨',
1306
+ '𐳩' => '𐲩',
1307
+ '𐳪' => '𐲪',
1308
+ '𐳫' => '𐲫',
1309
+ '𐳬' => '𐲬',
1310
+ '𐳭' => '𐲭',
1311
+ '𐳮' => '𐲮',
1312
+ '𐳯' => '𐲯',
1313
+ '𐳰' => '𐲰',
1314
+ '𐳱' => '𐲱',
1315
+ '𐳲' => '𐲲',
1316
+ '𑣀' => '𑢠',
1317
+ '𑣁' => '𑢡',
1318
+ '𑣂' => '𑢢',
1319
+ '𑣃' => '𑢣',
1320
+ '𑣄' => '𑢤',
1321
+ '𑣅' => '𑢥',
1322
+ '𑣆' => '𑢦',
1323
+ '𑣇' => '𑢧',
1324
+ '𑣈' => '𑢨',
1325
+ '𑣉' => '𑢩',
1326
+ '𑣊' => '𑢪',
1327
+ '𑣋' => '𑢫',
1328
+ '𑣌' => '𑢬',
1329
+ '𑣍' => '𑢭',
1330
+ '𑣎' => '𑢮',
1331
+ '𑣏' => '𑢯',
1332
+ '𑣐' => '𑢰',
1333
+ '𑣑' => '𑢱',
1334
+ '𑣒' => '𑢲',
1335
+ '𑣓' => '𑢳',
1336
+ '𑣔' => '𑢴',
1337
+ '𑣕' => '𑢵',
1338
+ '𑣖' => '𑢶',
1339
+ '𑣗' => '𑢷',
1340
+ '𑣘' => '𑢸',
1341
+ '𑣙' => '𑢹',
1342
+ '𑣚' => '𑢺',
1343
+ '𑣛' => '𑢻',
1344
+ '𑣜' => '𑢼',
1345
+ '𑣝' => '𑢽',
1346
+ '𑣞' => '𑢾',
1347
+ '𑣟' => '𑢿',
1348
+ '𖹠' => '𖹀',
1349
+ '𖹡' => '𖹁',
1350
+ '𖹢' => '𖹂',
1351
+ '𖹣' => '𖹃',
1352
+ '𖹤' => '𖹄',
1353
+ '𖹥' => '𖹅',
1354
+ '𖹦' => '𖹆',
1355
+ '𖹧' => '𖹇',
1356
+ '𖹨' => '𖹈',
1357
+ '𖹩' => '𖹉',
1358
+ '𖹪' => '𖹊',
1359
+ '𖹫' => '𖹋',
1360
+ '𖹬' => '𖹌',
1361
+ '𖹭' => '𖹍',
1362
+ '𖹮' => '𖹎',
1363
+ '𖹯' => '𖹏',
1364
+ '𖹰' => '𖹐',
1365
+ '𖹱' => '𖹑',
1366
+ '𖹲' => '𖹒',
1367
+ '𖹳' => '𖹓',
1368
+ '𖹴' => '𖹔',
1369
+ '𖹵' => '𖹕',
1370
+ '𖹶' => '𖹖',
1371
+ '𖹷' => '𖹗',
1372
+ '𖹸' => '𖹘',
1373
+ '𖹹' => '𖹙',
1374
+ '𖹺' => '𖹚',
1375
+ '𖹻' => '𖹛',
1376
+ '𖹼' => '𖹜',
1377
+ '𖹽' => '𖹝',
1378
+ '𖹾' => '𖹞',
1379
+ '𖹿' => '𖹟',
1380
+ '𞤢' => '𞤀',
1381
+ '𞤣' => '𞤁',
1382
+ '𞤤' => '𞤂',
1383
+ '𞤥' => '𞤃',
1384
+ '𞤦' => '𞤄',
1385
+ '𞤧' => '𞤅',
1386
+ '𞤨' => '𞤆',
1387
+ '𞤩' => '𞤇',
1388
+ '𞤪' => '𞤈',
1389
+ '𞤫' => '𞤉',
1390
+ '𞤬' => '𞤊',
1391
+ '𞤭' => '𞤋',
1392
+ '𞤮' => '𞤌',
1393
+ '𞤯' => '𞤍',
1394
+ '𞤰' => '𞤎',
1395
+ '𞤱' => '𞤏',
1396
+ '𞤲' => '𞤐',
1397
+ '𞤳' => '𞤑',
1398
+ '𞤴' => '𞤒',
1399
+ '𞤵' => '𞤓',
1400
+ '𞤶' => '𞤔',
1401
+ '𞤷' => '𞤕',
1402
+ '𞤸' => '𞤖',
1403
+ '𞤹' => '𞤗',
1404
+ '𞤺' => '𞤘',
1405
+ '𞤻' => '𞤙',
1406
+ '𞤼' => '𞤚',
1407
+ '𞤽' => '𞤛',
1408
+ '𞤾' => '𞤜',
1409
+ '𞤿' => '𞤝',
1410
+ '𞥀' => '𞤞',
1411
+ '𞥁' => '𞤟',
1412
+ '𞥂' => '𞤠',
1413
+ '𞥃' => '𞤡',
1414
+ );
vendor/symfony/polyfill-mbstring/bootstrap.php CHANGED
@@ -1,147 +1,147 @@
1
- <?php
2
-
3
- /*
4
- * This file is part of the Symfony package.
5
- *
6
- * (c) Fabien Potencier <fabien@symfony.com>
7
- *
8
- * For the full copyright and license information, please view the LICENSE
9
- * file that was distributed with this source code.
10
- */
11
-
12
- use Symfony\Polyfill\Mbstring as p;
13
-
14
- if (!function_exists('mb_convert_encoding')) {
15
- function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); }
16
- }
17
- if (!function_exists('mb_decode_mimeheader')) {
18
- function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); }
19
- }
20
- if (!function_exists('mb_encode_mimeheader')) {
21
- function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); }
22
- }
23
- if (!function_exists('mb_decode_numericentity')) {
24
- function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); }
25
- }
26
- if (!function_exists('mb_encode_numericentity')) {
27
- function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); }
28
- }
29
- if (!function_exists('mb_convert_case')) {
30
- function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); }
31
- }
32
- if (!function_exists('mb_internal_encoding')) {
33
- function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); }
34
- }
35
- if (!function_exists('mb_language')) {
36
- function mb_language($language = null) { return p\Mbstring::mb_language($language); }
37
- }
38
- if (!function_exists('mb_list_encodings')) {
39
- function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
40
- }
41
- if (!function_exists('mb_encoding_aliases')) {
42
- function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
43
- }
44
- if (!function_exists('mb_check_encoding')) {
45
- function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); }
46
- }
47
- if (!function_exists('mb_detect_encoding')) {
48
- function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); }
49
- }
50
- if (!function_exists('mb_detect_order')) {
51
- function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); }
52
- }
53
- if (!function_exists('mb_parse_str')) {
54
- function mb_parse_str($string, &$result = array()) { parse_str($string, $result); }
55
- }
56
- if (!function_exists('mb_strlen')) {
57
- function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); }
58
- }
59
- if (!function_exists('mb_strpos')) {
60
- function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); }
61
- }
62
- if (!function_exists('mb_strtolower')) {
63
- function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); }
64
- }
65
- if (!function_exists('mb_strtoupper')) {
66
- function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); }
67
- }
68
- if (!function_exists('mb_substitute_character')) {
69
- function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); }
70
- }
71
- if (!function_exists('mb_substr')) {
72
- function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); }
73
- }
74
- if (!function_exists('mb_stripos')) {
75
- function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); }
76
- }
77
- if (!function_exists('mb_stristr')) {
78
- function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); }
79
- }
80
- if (!function_exists('mb_strrchr')) {
81
- function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); }
82
- }
83
- if (!function_exists('mb_strrichr')) {
84
- function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); }
85
- }
86
- if (!function_exists('mb_strripos')) {
87
- function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); }
88
- }
89
- if (!function_exists('mb_strrpos')) {
90
- function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); }
91
- }
92
- if (!function_exists('mb_strstr')) {
93
- function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); }
94
- }
95
- if (!function_exists('mb_get_info')) {
96
- function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
97
- }
98
- if (!function_exists('mb_http_output')) {
99
- function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); }
100
- }
101
- if (!function_exists('mb_strwidth')) {
102
- function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); }
103
- }
104
- if (!function_exists('mb_substr_count')) {
105
- function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); }
106
- }
107
- if (!function_exists('mb_output_handler')) {
108
- function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); }
109
- }
110
- if (!function_exists('mb_http_input')) {
111
- function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
112
- }
113
-
114
- if (!function_exists('mb_convert_variables')) {
115
- if (PHP_VERSION_ID >= 80000) {
116
- function mb_convert_variables($to_encoding, $from_encoding, &$var, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, $var, ...$vars); }
117
- } else {
118
- function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); }
119
- }
120
- }
121
-
122
- if (!function_exists('mb_ord')) {
123
- function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); }
124
- }
125
- if (!function_exists('mb_chr')) {
126
- function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); }
127
- }
128
- if (!function_exists('mb_scrub')) {
129
- function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); }
130
- }
131
- if (!function_exists('mb_str_split')) {
132
- function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); }
133
- }
134
-
135
- if (extension_loaded('mbstring')) {
136
- return;
137
- }
138
-
139
- if (!defined('MB_CASE_UPPER')) {
140
- define('MB_CASE_UPPER', 0);
141
- }
142
- if (!defined('MB_CASE_LOWER')) {
143
- define('MB_CASE_LOWER', 1);
144
- }
145
- if (!defined('MB_CASE_TITLE')) {
146
- define('MB_CASE_TITLE', 2);
147
- }
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ use Symfony\Polyfill\Mbstring as p;
13
+
14
+ if (!function_exists('mb_convert_encoding')) {
15
+ function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); }
16
+ }
17
+ if (!function_exists('mb_decode_mimeheader')) {
18
+ function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); }
19
+ }
20
+ if (!function_exists('mb_encode_mimeheader')) {
21
+ function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); }
22
+ }
23
+ if (!function_exists('mb_decode_numericentity')) {
24
+ function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); }
25
+ }
26
+ if (!function_exists('mb_encode_numericentity')) {
27
+ function mb_encode_numericentity($string, $map, $encoding = null, $hex = false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); }
28
+ }
29
+ if (!function_exists('mb_convert_case')) {
30
+ function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); }
31
+ }
32
+ if (!function_exists('mb_internal_encoding')) {
33
+ function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); }
34
+ }
35
+ if (!function_exists('mb_language')) {
36
+ function mb_language($language = null) { return p\Mbstring::mb_language($language); }
37
+ }
38
+ if (!function_exists('mb_list_encodings')) {
39
+ function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
40
+ }
41
+ if (!function_exists('mb_encoding_aliases')) {
42
+ function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
43
+ }
44
+ if (!function_exists('mb_check_encoding')) {
45
+ function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); }
46
+ }
47
+ if (!function_exists('mb_detect_encoding')) {
48
+ function mb_detect_encoding($string, $encodings = null, $strict = false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); }
49
+ }
50
+ if (!function_exists('mb_detect_order')) {
51
+ function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); }
52
+ }
53
+ if (!function_exists('mb_parse_str')) {
54
+ function mb_parse_str($string, &$result = array()) { parse_str($string, $result); }
55
+ }
56
+ if (!function_exists('mb_strlen')) {
57
+ function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); }
58
+ }
59
+ if (!function_exists('mb_strpos')) {
60
+ function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); }
61
+ }
62
+ if (!function_exists('mb_strtolower')) {
63
+ function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); }
64
+ }
65
+ if (!function_exists('mb_strtoupper')) {
66
+ function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); }
67
+ }
68
+ if (!function_exists('mb_substitute_character')) {
69
+ function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); }
70
+ }
71
+ if (!function_exists('mb_substr')) {
72
+ function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); }
73
+ }
74
+ if (!function_exists('mb_stripos')) {
75
+ function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); }
76
+ }
77
+ if (!function_exists('mb_stristr')) {
78
+ function mb_stristr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); }
79
+ }
80
+ if (!function_exists('mb_strrchr')) {
81
+ function mb_strrchr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); }
82
+ }
83
+ if (!function_exists('mb_strrichr')) {
84
+ function mb_strrichr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); }
85
+ }
86
+ if (!function_exists('mb_strripos')) {
87
+ function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); }
88
+ }
89
+ if (!function_exists('mb_strrpos')) {
90
+ function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); }
91
+ }
92
+ if (!function_exists('mb_strstr')) {
93
+ function mb_strstr($haystack, $needle, $before_needle = false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); }
94
+ }
95
+ if (!function_exists('mb_get_info')) {
96
+ function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
97
+ }
98
+ if (!function_exists('mb_http_output')) {
99
+ function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); }
100
+ }
101
+ if (!function_exists('mb_strwidth')) {
102
+ function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); }
103
+ }
104
+ if (!function_exists('mb_substr_count')) {
105
+ function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); }
106
+ }
107
+ if (!function_exists('mb_output_handler')) {
108
+ function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); }
109
+ }
110
+ if (!function_exists('mb_http_input')) {
111
+ function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
112
+ }
113
+
114
+ if (!function_exists('mb_convert_variables')) {
115
+ if (PHP_VERSION_ID >= 80000) {
116
+ function mb_convert_variables($to_encoding, $from_encoding, &$var, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, $var, ...$vars); }
117
+ } else {
118
+ function mb_convert_variables($to_encoding, $from_encoding, &...$vars) { return p\Mbstring::mb_convert_variables($to_encoding, $from_encoding, ...$vars); }
119
+ }
120
+ }
121
+
122
+ if (!function_exists('mb_ord')) {
123
+ function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); }
124
+ }
125
+ if (!function_exists('mb_chr')) {
126
+ function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); }
127
+ }
128
+ if (!function_exists('mb_scrub')) {
129
+ function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? mb_internal_encoding() : $encoding; return mb_convert_encoding($string, $encoding, $encoding); }
130
+ }
131
+ if (!function_exists('mb_str_split')) {
132
+ function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); }
133
+ }
134
+
135
+ if (extension_loaded('mbstring')) {
136
+ return;
137
+ }
138
+
139
+ if (!defined('MB_CASE_UPPER')) {
140
+ define('MB_CASE_UPPER', 0);
141
+ }
142
+ if (!defined('MB_CASE_LOWER')) {
143
+ define('MB_CASE_LOWER', 1);
144
+ }
145
+ if (!defined('MB_CASE_TITLE')) {
146
+ define('MB_CASE_TITLE', 2);
147
+ }
vendor/symfony/polyfill-mbstring/composer.json CHANGED
@@ -1,38 +1,38 @@
1
- {
2
- "name": "symfony/polyfill-mbstring",
3
- "type": "library",
4
- "description": "Symfony polyfill for the Mbstring extension",
5
- "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"],
6
- "homepage": "https://symfony.com",
7
- "license": "MIT",
8
- "authors": [
9
- {
10
- "name": "Nicolas Grekas",
11
- "email": "p@tchwork.com"
12
- },
13
- {
14
- "name": "Symfony Community",
15
- "homepage": "https://symfony.com/contributors"
16
- }
17
- ],
18
- "require": {
19
- "php": ">=7.1"
20
- },
21
- "autoload": {
22
- "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
23
- "files": [ "bootstrap.php" ]
24
- },
25
- "suggest": {
26
- "ext-mbstring": "For best performance"
27
- },
28
- "minimum-stability": "dev",
29
- "extra": {
30
- "branch-alias": {
31
- "dev-main": "1.20-dev"
32
- },
33
- "thanks": {
34
- "name": "symfony/polyfill",
35
- "url": "https://github.com/symfony/polyfill"
36
- }
37
- }
38
- }
1
+ {
2
+ "name": "symfony/polyfill-mbstring",
3
+ "type": "library",
4
+ "description": "Symfony polyfill for the Mbstring extension",
5
+ "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"],
6
+ "homepage": "https://symfony.com",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "Nicolas Grekas",
11
+ "email": "p@tchwork.com"
12
+ },
13
+ {
14
+ "name": "Symfony Community",
15
+ "homepage": "https://symfony.com/contributors"
16
+ }
17
+ ],
18
+ "require": {
19
+ "php": ">=7.1"
20
+ },
21
+ "autoload": {
22
+ "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
23
+ "files": [ "bootstrap.php" ]
24
+ },
25
+ "suggest": {
26
+ "ext-mbstring": "For best performance"
27
+ },
28
+ "minimum-stability": "dev",
29
+ "extra": {
30
+ "branch-alias": {
31
+ "dev-main": "1.20-dev"
32
+ },
33
+ "thanks": {
34
+ "name": "symfony/polyfill",
35
+ "url": "https://github.com/symfony/polyfill"
36
+ }
37
+ }
38
+ }
woocommerce-pdf-invoices-packingslips.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: WooCommerce PDF Invoices & Packing Slips
4
  * Plugin URI: http://www.wpovernight.com
5
  * Description: Create, print & email PDF invoices & packing slips for WooCommerce orders.
6
- * Version: 2.10.4
7
  * Author: Ewout Fernhout
8
  * Author URI: http://www.wpovernight.com
9
  * License: GPLv2 or later
@@ -21,7 +21,7 @@ if ( !class_exists( 'WPO_WCPDF' ) ) :
21
 
22
  class WPO_WCPDF {
23
 
24
- public $version = '2.10.4';
25
  public $plugin_basename;
26
  public $legacy_mode;
27
  public $legacy_textdomain;
@@ -265,7 +265,7 @@ class WPO_WCPDF {
265
  */
266
  public function need_woocommerce() {
267
  /* translators: <a> tags */
268
- $error = sprintf( __( 'WooCommerce PDF Invoices & Packing Slips requires %1$sWooCommerce%2$s to be installed & activated!' , 'woocommerce-pdf-invoices-packing-slips' ), '<a href="http://wordpress.org/extend/plugins/woocommerce/">', '</a>' );
269
 
270
  $message = '<div class="error"><p>' . $error . '</p></div>';
271
 
@@ -290,7 +290,7 @@ class WPO_WCPDF {
290
  }
291
  $message .= '</div>';
292
 
293
- echo $message;
294
  }
295
 
296
  /**
@@ -374,7 +374,7 @@ class WPO_WCPDF {
374
  <p><a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_hide_nginx_notice', 'true' ) ); ?>"><?php _e( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
375
  </div>
376
  <?php
377
- echo ob_get_clean();
378
  }
379
 
380
  // protect PDF directory
@@ -418,7 +418,7 @@ class WPO_WCPDF {
418
  <p><a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_hide_mailpoet_notice', 'true' ) ); ?>"><?php _e( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
419
  </div>
420
  <?php
421
- echo ob_get_clean();
422
  }
423
  }
424
 
3
  * Plugin Name: WooCommerce PDF Invoices & Packing Slips
4
  * Plugin URI: http://www.wpovernight.com
5
  * Description: Create, print & email PDF invoices & packing slips for WooCommerce orders.
6
+ * Version: 2.10.5
7
  * Author: Ewout Fernhout
8
  * Author URI: http://www.wpovernight.com
9
  * License: GPLv2 or later
21
 
22
  class WPO_WCPDF {
23
 
24
+ public $version = '2.10.5';
25
  public $plugin_basename;
26
  public $legacy_mode;
27
  public $legacy_textdomain;
265
  */
266
  public function need_woocommerce() {
267
  /* translators: <a> tags */
268
+ $error = sprintf( esc_html__( 'WooCommerce PDF Invoices & Packing Slips requires %1$sWooCommerce%2$s to be installed & activated!' , 'woocommerce-pdf-invoices-packing-slips' ), '<a href="http://wordpress.org/extend/plugins/woocommerce/">', '</a>' );
269
 
270
  $message = '<div class="error"><p>' . $error . '</p></div>';
271
 
290
  }
291
  $message .= '</div>';
292
 
293
+ echo wp_kses_post( $message );
294
  }
295
 
296
  /**
374
  <p><a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_hide_nginx_notice', 'true' ) ); ?>"><?php _e( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
375
  </div>
376
  <?php
377
+ echo wp_kses_post( ob_get_clean() );
378
  }
379
 
380
  // protect PDF directory
418
  <p><a href="<?php echo esc_url( add_query_arg( 'wpo_wcpdf_hide_mailpoet_notice', 'true' ) ); ?>"><?php _e( 'Hide this message', 'woocommerce-pdf-invoices-packing-slips' ); ?></a></p>
419
  </div>
420
  <?php
421
+ echo wp_kses_post( ob_get_clean() );
422
  }
423
  }
424