Changeset 3416344
- Timestamp:
- 12/10/2025 11:34:13 AM (3 months ago)
- Location:
- safefonts
- Files:
-
- 34 added
- 9 edited
-
tags/1.2.0 (added)
-
tags/1.2.0/LICENSE (added)
-
tags/1.2.0/assets (added)
-
tags/1.2.0/assets/css (added)
-
tags/1.2.0/assets/css/admin.css (added)
-
tags/1.2.0/assets/css/fonts.css (added)
-
tags/1.2.0/assets/fonts (added)
-
tags/1.2.0/assets/fonts/index.php (added)
-
tags/1.2.0/assets/images (added)
-
tags/1.2.0/assets/images/index.php (added)
-
tags/1.2.0/assets/images/logo.png (added)
-
tags/1.2.0/assets/js (added)
-
tags/1.2.0/assets/js/admin.js (added)
-
tags/1.2.0/includes (added)
-
tags/1.2.0/includes/Admin (added)
-
tags/1.2.0/includes/Admin/AdminInterface.php (added)
-
tags/1.2.0/includes/Admin/CssReferencePage.php (added)
-
tags/1.2.0/includes/Autoloader.php (added)
-
tags/1.2.0/includes/Core.php (added)
-
tags/1.2.0/includes/FontManager.php (added)
-
tags/1.2.0/includes/FontPreloader.php (added)
-
tags/1.2.0/languages (added)
-
tags/1.2.0/languages/safefonts.pot (added)
-
tags/1.2.0/readme.txt (added)
-
tags/1.2.0/safefonts.php (added)
-
tags/1.2.0/uninstall.php (added)
-
tags/1.2.0/views (added)
-
tags/1.2.0/views/admin-page.php (added)
-
tags/1.2.0/views/dashboard-page.php (added)
-
tags/1.2.0/views/fonts-page.php (added)
-
tags/1.2.0/views/help-page.php (added)
-
tags/1.2.0/views/settings-page.php (added)
-
tags/1.2.0/views/system-page.php (added)
-
tags/1.2.0/views/upload-page.php (added)
-
trunk/LICENSE (modified) (1 diff)
-
trunk/assets/css/admin.css (modified) (1 diff)
-
trunk/assets/js/admin.js (modified) (2 diffs)
-
trunk/includes/Admin/AdminInterface.php (modified) (4 diffs)
-
trunk/includes/Core.php (modified) (2 diffs)
-
trunk/includes/FontManager.php (modified) (3 diffs)
-
trunk/languages/safefonts.pot (modified) (9 diffs)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/safefonts.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
safefonts/trunk/LICENSE
r3388505 r3416344 1 1 GPL v2 License 2 2 3 Copyright (c) 202 4Chris Martens3 Copyright (c) 2025 Chris Martens 4 4 5 5 This WordPress plugin is licensed under the GNU General Public License v2.0. 6 6 7 See: https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html 7 GNU GENERAL PUBLIC LICENSE 8 Version 2, June 1991 9 10 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 11 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 12 Everyone is permitted to copy and distribute verbatim copies 13 of this license document, but changing it is not allowed. 14 15 Preamble 16 17 The licenses for most software are designed to take away your 18 freedom to share and change it. By contrast, the GNU General Public 19 License is intended to guarantee your freedom to share and change free 20 software--to make sure the software is free for all its users. This 21 General Public License applies to most of the Free Software 22 Foundation's software and to any other program whose authors commit to 23 using it. (Some other Free Software Foundation software is covered by 24 the GNU Lesser General Public License instead.) You can apply it to 25 your programs, too. 26 27 When we speak of free software, we are referring to freedom, not 28 price. Our General Public Licenses are designed to make sure that you 29 have the freedom to distribute copies of free software (and charge for 30 this service if you wish), that you receive source code or can get it 31 if you want it, that you can change the software or use pieces of it 32 in new free programs; and that you know you can do these things. 33 34 To protect your rights, we need to make restrictions that forbid 35 anyone to deny you these rights or to ask you to surrender the rights. 36 These restrictions translate to certain responsibilities for you if you 37 distribute copies of the software, or if you modify it. 38 39 For example, if you distribute copies of such a program, whether 40 gratis or for a fee, you must give the recipients all the rights that 41 you have. You must make sure that they, too, receive or can get the 42 source code. And you must show them these terms so they know their 43 rights. 44 45 We protect your rights with two steps: (1) copyright the software, and 46 (2) offer you this license which gives you legal permission to copy, 47 distribute and/or modify the software. 48 49 Also, for each author's protection and ours, we want to make certain 50 that everyone understands that there is no warranty for this free 51 software. If the software is modified by someone else and passed on, we 52 want its recipients to know that what they have is not the original, so 53 that any problems introduced by others will not reflect on the original 54 authors' reputations. 55 56 Finally, any free program is threatened constantly by software 57 patents. We wish to avoid the danger that redistributors of a free 58 program will individually obtain patent licenses, in effect making the 59 program proprietary. To prevent this, we have made it clear that any 60 patent must be licensed for everyone's free use or not licensed at all. 61 62 The precise terms and conditions for copying, distribution and 63 modification follow. 64 65 GNU GENERAL PUBLIC LICENSE 66 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 67 68 0. This License applies to any program or other work which contains 69 a notice placed by the copyright holder saying it may be distributed 70 under the terms of this General Public License. The "Program", below, 71 refers to any such program or work, and a "work based on the Program" 72 means either the Program or any derivative work under copyright law: 73 that is to say, a work containing the Program or a portion of it, 74 either verbatim or with modifications and/or translated into another 75 language. (Hereinafter, translation is included without limitation in 76 the term "modification".) Each licensee is addressed as "you". 77 78 Activities other than copying, distribution and modification are not 79 covered by this License; they are outside its scope. The act of 80 running the Program is not restricted, and the output from the Program 81 is covered only if its contents constitute a work based on the 82 Program (independent of having been made by running the Program). 83 Whether that is true depends on what the Program does. 84 85 1. You may copy and distribute verbatim copies of the Program's 86 source code as you receive it, in any medium, provided that you 87 conspicuously and appropriately publish on each copy an appropriate 88 copyright notice and disclaimer of warranty; keep intact all the 89 notices that refer to this License and to the absence of any warranty; 90 and give any other recipients of the Program a copy of this License 91 along with the Program. 92 93 You may charge a fee for the physical act of transferring a copy, and 94 you may at your option offer warranty protection in exchange for a fee. 95 96 2. You may modify your copy or copies of the Program or any portion 97 of it, thus forming a work based on the Program, and copy and 98 distribute such modifications or work under the terms of Section 1 99 above, provided that you also meet all of these conditions: 100 101 a) You must cause the modified files to carry prominent notices 102 stating that you changed the files and the date of any change. 103 104 b) You must cause any work that you distribute or publish, that in 105 whole or in part contains or is derived from the Program or any 106 part thereof, to be licensed as a whole at no charge to all third 107 parties under the terms of this License. 108 109 c) If the modified program normally reads commands interactively 110 when run, you must cause it, when started running for such 111 interactive use in the most ordinary way, to print or display an 112 announcement including an appropriate copyright notice and a 113 notice that there is no warranty (or else, saying that you provide 114 a warranty) and that users may redistribute the program under 115 these conditions, and telling the user how to view a copy of this 116 License. (Exception: if the Program itself is interactive but 117 does not normally print such an announcement, your work based on 118 the Program is not required to print an announcement.) 119 120 These requirements apply to the modified work as a whole. If 121 identifiable sections of that work are not derived from the Program, 122 and can be reasonably considered independent and separate works in 123 themselves, then this License, and its terms, do not apply to those 124 sections when you distribute them as separate works. But when you 125 distribute the same sections as part of a whole which is a work based 126 on the Program, the distribution of the whole must be on the terms of 127 this License, whose permissions for other licensees extend to the 128 entire whole, and thus to each and every part regardless of who wrote it. 129 130 Thus, it is not the intent of this section to claim rights or contest 131 your rights to work written entirely by you; rather, the intent is to 132 exercise the right to control the distribution of derivative or 133 collective works based on the Program. 134 135 In addition, mere aggregation of another work not based on the Program 136 with the Program (or with a work based on the Program) on a volume of 137 a storage or distribution medium does not bring the other work under 138 the scope of this License. 139 140 3. You may copy and distribute the Program (or a work based on it, 141 under Section 2) in object code or executable form under the terms of 142 Sections 1 and 2 above provided that you also do one of the following: 143 144 a) Accompany it with the complete corresponding machine-readable 145 source code, which must be distributed under the terms of Sections 146 1 and 2 above on a medium customarily used for software interchange; or, 147 148 b) Accompany it with a written offer, valid for at least three 149 years, to give any third party, for a charge no more than your 150 cost of physically performing source distribution, a complete 151 machine-readable copy of the corresponding source code, to be 152 distributed under the terms of Sections 1 and 2 above on a medium 153 customarily used for software interchange; or, 154 155 c) Accompany it with the information you received as to the offer 156 to distribute corresponding source code. (This alternative is 157 allowed only for noncommercial distribution and only if you 158 received the program in object code or executable form with such 159 an offer, in accord with Subsection b above.) 160 161 The source code for a work means the preferred form of the work for 162 making modifications to it. For an executable work, complete source 163 code means all the source code for all modules it contains, plus any 164 associated interface definition files, plus the scripts used to 165 control compilation and installation of the executable. However, as a 166 special exception, the source code distributed need not include 167 anything that is normally distributed (in either source or binary 168 form) with the major components (compiler, kernel, and so on) of the 169 operating system on which the executable runs, unless that component 170 itself accompanies the executable. 171 172 If distribution of executable or object code is made by offering 173 access to copy from a designated place, then offering equivalent 174 access to copy the source code from the same place counts as 175 distribution of the source code, even though third parties are not 176 compelled to copy the source along with the object code. 177 178 4. You may not copy, modify, sublicense, or distribute the Program 179 except as expressly provided under this License. Any attempt 180 otherwise to copy, modify, sublicense or distribute the Program is 181 void, and will automatically terminate your rights under this License. 182 However, parties who have received copies, or rights, from you under 183 this License will not have their licenses terminated so long as such 184 parties remain in full compliance. 185 186 5. You are not required to accept this License, since you have not 187 signed it. However, nothing else grants you permission to modify or 188 distribute the Program or its derivative works. These actions are 189 prohibited by law if you do not accept this License. Therefore, by 190 modifying or distributing the Program (or any work based on the 191 Program), you indicate your acceptance of this License to do so, and 192 all its terms and conditions for copying, distributing or modifying 193 the Program or works based on it. 194 195 6. Each time you redistribute the Program (or any work based on the 196 Program), the recipient automatically receives a license from the 197 original licensor to copy, distribute or modify the Program subject to 198 these terms and conditions. You may not impose any further 199 restrictions on the recipients' exercise of the rights granted herein. 200 You are not responsible for enforcing compliance by third parties to 201 this License. 202 203 7. If, as a consequence of a court judgment or allegation of patent 204 infringement or for any other reason (not limited to patent issues), 205 conditions are imposed on you (whether by court order, agreement or 206 otherwise) that contradict the conditions of this License, they do not 207 excuse you from the conditions of this License. If you cannot 208 distribute so as to satisfy simultaneously your obligations under this 209 License and any other pertinent obligations, then as a consequence you 210 may not distribute the Program at all. For example, if a patent 211 license would not permit royalty-free redistribution of the Program by 212 all those who receive copies directly or indirectly through you, then 213 the only way you could satisfy both it and this License would be to 214 refrain entirely from distribution of the Program. 215 216 If any portion of this section is held invalid or unenforceable under 217 any particular circumstance, the balance of the section is intended to 218 apply and the section as a whole is intended to apply in other 219 circumstances. 220 221 It is not the purpose of this section to induce you to infringe any 222 patents or other property right claims or to contest validity of any 223 such claims; this section has the sole purpose of protecting the 224 integrity of the free software distribution system, which is 225 implemented by public license practices. Many people have made 226 generous contributions to the wide range of software distributed 227 through that system in reliance on consistent application of that 228 system; it is up to the author/donor to decide if he or she is willing 229 to distribute software through any other system and a licensee cannot 230 impose that choice. 231 232 This section is intended to make thoroughly clear what is believed to 233 be a consequence of the rest of this License. 234 235 8. If the distribution and/or use of the Program is restricted in 236 certain countries either by patents or by copyrighted interfaces, the 237 original copyright holder who places the Program under this License 238 may add an explicit geographical distribution limitation excluding 239 those countries, so that distribution is permitted only in or among 240 countries not thus excluded. In such case, this License incorporates 241 the limitation as if written in the body of this License. 242 243 9. The Free Software Foundation may publish revised and/or new versions 244 of the General Public License from time to time. Such new versions will 245 be similar in spirit to the present version, but may differ in detail to 246 address new problems or concerns. 247 248 Each version is given a distinguishing version number. If the Program 249 specifies a version number of this License which applies to it and "any 250 later version", you have the option of following the terms and conditions 251 either of that version or of any later version published by the Free 252 Software Foundation. If the Program does not specify a version number of 253 this License, you may choose any version ever published by the Free Software 254 Foundation. 255 256 10. If you wish to incorporate parts of the Program into other free 257 programs whose distribution conditions are different, write to the author 258 to ask for permission. For software which is copyrighted by the Free 259 Software Foundation, write to the Free Software Foundation; we sometimes 260 make exceptions for this. Our decision will be guided by the two goals 261 of preserving the free status of all derivatives of our free software and 262 of promoting the sharing and reuse of software generally. 263 264 NO WARRANTY 265 266 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 267 FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 268 OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 269 PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 270 OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 271 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 272 TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 273 PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 274 REPAIR OR CORRECTION. 275 276 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 277 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 278 REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 279 INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 280 OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 281 TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 282 YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 283 PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 284 POSSIBILITY OF SUCH DAMAGES. 285 286 END OF TERMS AND CONDITIONS 287 288 How to Apply These Terms to Your New Programs 289 290 If you develop a new program, and you want it to be of the greatest 291 possible use to the public, the best way to achieve this is to make it 292 free software which everyone can redistribute and change under these terms. 293 294 To do so, attach the following notices to the program. It is safest 295 to attach them to the start of each source file to most effectively 296 convey the exclusion of warranty; and each file should have at least 297 the "copyright" line and a pointer to where the full notice is found. 298 299 <one line to give the program's name and a brief idea of what it does.> 300 Copyright (C) <year> <name of author> 301 302 This program is free software; you can redistribute it and/or modify 303 it under the terms of the GNU General Public License as published by 304 the Free Software Foundation; either version 2 of the License, or 305 (at your option) any later version. 306 307 This program is distributed in the hope that it will be useful, 308 but WITHOUT ANY WARRANTY; without even the implied warranty of 309 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 310 GNU General Public License for more details. 311 312 You should have received a copy of the GNU General Public License along 313 with this program; if not, write to the Free Software Foundation, Inc., 314 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 315 316 Also add information on how to contact you by electronic and paper mail. 317 318 If the program is interactive, make it output a short notice like this 319 when it starts in an interactive mode: 320 321 Gnomovision version 69, Copyright (C) year name of author 322 Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 323 This is free software, and you are welcome to redistribute it 324 under certain conditions; type `show c' for details. 325 326 The hypothetical commands `show w' and `show c' should show the appropriate 327 parts of the General Public License. Of course, the commands you use may 328 be called something other than `show w' and `show c'; they could even be 329 mouse-clicks or menu items--whatever suits your program. 330 331 You should also get your employer (if you work as a programmer) or your 332 school, if any, to sign a "copyright disclaimer" for the program, if 333 necessary. Here is a sample; alter the names: 334 335 Yoyodyne, Inc., hereby disclaims all copyright interest in the program 336 `Gnomovision' (which makes passes at compilers) written by James Hacker. 337 338 <signature of Ty Coon>, 1 April 1989 339 Ty Coon, President of Vice 340 341 This General Public License does not permit incorporating your program into 342 proprietary programs. If your program is a subroutine library, you may 343 consider it more useful to permit linking proprietary applications with the 344 library. If this is what you want to do, use the GNU Lesser General 345 Public License instead of this License. -
safefonts/trunk/assets/css/admin.css
r3390097 r3416344 199 199 .safefonts-font-weight { 200 200 background: #f0b429 !important; 201 } 202 203 .safefonts-font-weight.safefonts-variable-font { 204 background: linear-gradient(90deg, #f0b429 0%, #ff6b6b 100%) !important; 201 205 } 202 206 -
safefonts/trunk/assets/js/admin.js
r3394862 r3416344 13 13 this.initTabs(); 14 14 this.initCssRegeneration(); 15 this.initVariableFontToggle(); 15 16 }, 16 17 … … 182 183 SafeFontsAdmin.handleCssRegeneration($(this)); 183 184 }); 185 }, 186 187 initVariableFontToggle: function() { 188 const $checkbox = $('#is_variable'); 189 const $staticRow = $('#static-weight-row'); 190 const $variableRow = $('#variable-weight-row'); 191 192 // Handle checkbox change 193 $checkbox.on('change', function() { 194 if ($(this).is(':checked')) { 195 $staticRow.hide(); 196 $variableRow.show(); 197 } else { 198 $staticRow.show(); 199 $variableRow.hide(); 200 } 201 }); 202 203 // Set initial state based on checkbox 204 if ($checkbox.is(':checked')) { 205 $staticRow.hide(); 206 $variableRow.show(); 207 } 184 208 }, 185 209 -
safefonts/trunk/includes/Admin/AdminInterface.php
r3395519 r3416344 298 298 <tr> 299 299 <th scope="row"> 300 <label for="is_variable"><?php esc_html_e('Variable Font', 'safefonts'); ?></label> 301 </th> 302 <td> 303 <label> 304 <input type="checkbox" id="is_variable" name="is_variable" value="1"> 305 <?php esc_html_e('This is a variable font', 'safefonts'); ?> 306 </label> 307 <p class="description"> 308 <?php esc_html_e('Variable fonts contain multiple weights in a single file.', 'safefonts'); ?> 309 </p> 310 </td> 311 </tr> 312 <tr id="static-weight-row"> 313 <th scope="row"> 300 314 <label for="font_weight"><?php esc_html_e('Font Weight', 'safefonts'); ?></label> 301 315 </th> … … 311 325 <option value="800">800 (Extra Bold)</option> 312 326 <option value="900">900 (Black)</option> 327 </select> 328 </td> 329 </tr> 330 <tr id="variable-weight-row" style="display: none;"> 331 <th scope="row"> 332 <label><?php esc_html_e('Weight Range', 'safefonts'); ?></label> 333 </th> 334 <td> 335 <select id="weight_min" name="weight_min"> 336 <option value="100" selected>100 (Thin)</option> 337 <option value="200">200 (Extra Light)</option> 338 <option value="300">300 (Light)</option> 339 <option value="400">400 (Normal)</option> 340 <option value="500">500 (Medium)</option> 341 <option value="600">600 (Semi Bold)</option> 342 <option value="700">700 (Bold)</option> 343 <option value="800">800 (Extra Bold)</option> 344 <option value="900">900 (Black)</option> 345 </select> 346 <span><?php esc_html_e('to', 'safefonts'); ?></span> 347 <select id="weight_max" name="weight_max"> 348 <option value="100">100 (Thin)</option> 349 <option value="200">200 (Extra Light)</option> 350 <option value="300">300 (Light)</option> 351 <option value="400">400 (Normal)</option> 352 <option value="500">500 (Medium)</option> 353 <option value="600">600 (Semi Bold)</option> 354 <option value="700">700 (Bold)</option> 355 <option value="800">800 (Extra Bold)</option> 356 <option value="900" selected>900 (Black)</option> 313 357 </select> 314 358 </td> … … 411 455 value="<?php echo esc_attr($font->id); ?>" 412 456 data-family="<?php echo esc_attr($font->font_family); ?>"> 413 <span class="safefonts-font-weight"><?php echo esc_html($font->font_weight); ?></span> 457 <?php if (!empty($font->is_variable) && !empty($font->weight_min) && !empty($font->weight_max)): ?> 458 <span class="safefonts-font-weight safefonts-variable-font" title="<?php esc_attr_e('Variable Font', 'safefonts'); ?>"><?php echo esc_html($font->weight_min . '-' . $font->weight_max); ?></span> 459 <?php else: ?> 460 <span class="safefonts-font-weight"><?php echo esc_html($font->font_weight); ?></span> 461 <?php endif; ?> 414 462 <span class="safefonts-font-style"><?php echo esc_html($font->font_style); ?></span> 415 463 <?php … … 420 468 </div> 421 469 470 <?php 471 // For variable fonts, use 400 for preview 472 $preview_weight = $font->font_weight; 473 if (!empty($font->is_variable) && !empty($font->weight_min) && !empty($font->weight_max)) { 474 $preview_weight = '400'; 475 } 476 ?> 422 477 <div class="safefonts-font-preview" 423 478 style="font-family: '<?php echo esc_attr($font->font_family); ?>', sans-serif; 424 font-weight: <?php echo esc_attr($ font->font_weight); ?>;479 font-weight: <?php echo esc_attr($preview_weight); ?>; 425 480 font-style: <?php echo esc_attr($font->font_style); ?>;"> 426 481 The quick brown fox jumps over the lazy dog. -
safefonts/trunk/includes/Core.php
r3395519 r3416344 499 499 font_style varchar(50) NOT NULL DEFAULT 'normal', 500 500 font_weight varchar(50) NOT NULL DEFAULT '400', 501 is_variable tinyint(1) NOT NULL DEFAULT 0, 502 weight_min int(11) DEFAULT NULL, 503 weight_max int(11) DEFAULT NULL, 501 504 file_path varchar(500) NOT NULL, 502 505 file_hash varchar(64) NOT NULL, … … 519 522 $wpdb->query($wpdb->prepare("ALTER TABLE %i ADD COLUMN family_slug varchar(255) NOT NULL DEFAULT '' AFTER font_family", $table_name)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Adding missing column for migration 520 523 $wpdb->query($wpdb->prepare("ALTER TABLE %i ADD KEY family_slug (family_slug)", $table_name)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Adding index for new column 524 } 525 526 // Migration check: Add variable font columns if they don't exist (v1.2.0+) 527 if (!in_array('is_variable', $columns, true)) { 528 $wpdb->query($wpdb->prepare("ALTER TABLE %i ADD COLUMN is_variable tinyint(1) NOT NULL DEFAULT 0 AFTER font_weight", $table_name)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Adding variable font column 529 $wpdb->query($wpdb->prepare("ALTER TABLE %i ADD COLUMN weight_min int(11) DEFAULT NULL AFTER is_variable", $table_name)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Adding weight_min column 530 $wpdb->query($wpdb->prepare("ALTER TABLE %i ADD COLUMN weight_max int(11) DEFAULT NULL AFTER weight_min", $table_name)); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Adding weight_max column 521 531 } 522 532 -
safefonts/trunk/includes/FontManager.php
r3395519 r3416344 127 127 $format = $this->get_font_format($font->file_path); 128 128 129 // Check if this is a variable font 130 $is_variable = !empty($font->is_variable); 131 129 132 $css .= "@font-face {\n"; 130 133 $css .= " font-family: '" . esc_attr($font->font_family) . "';\n"; 131 134 $css .= " font-style: " . esc_attr($font->font_style) . ";\n"; 132 $css .= " font-weight: " . esc_attr($font->font_weight) . ";\n"; 135 136 // Variable fonts use weight range, static fonts use single weight 137 if ($is_variable && !empty($font->weight_min) && !empty($font->weight_max)) { 138 $css .= " font-weight: " . intval($font->weight_min) . " " . intval($font->weight_max) . ";\n"; 139 // Use variable font format 140 $format = 'woff2-variations'; 141 } else { 142 $css .= " font-weight: " . esc_attr($font->font_weight) . ";\n"; 143 } 144 133 145 $css .= " font-display: swap;\n"; 134 146 $css .= " src: url('" . esc_url($font_url) . "') format('" . $format . "');\n"; … … 224 236 'font_style' => sanitize_text_field($font_info['style'] ?? 'normal'), 225 237 'font_weight' => sanitize_text_field($font_info['weight'] ?? '400'), 238 'is_variable' => isset($font_info['is_variable']) ? intval($font_info['is_variable']) : 0, 239 'weight_min' => isset($font_info['weight_min']) ? intval($font_info['weight_min']) : null, 240 'weight_max' => isset($font_info['weight_max']) ? intval($font_info['weight_max']) : null, 226 241 'file_path' => $relative_path, 227 242 'file_hash' => hash_file('sha256', $destination), … … 452 467 453 468 // Get font info from form 469 $is_variable = isset($_POST['is_variable']) && $_POST['is_variable'] === '1'; 470 454 471 $font_info = array( 455 472 'family' => isset($_POST['font_family']) ? sanitize_text_field(wp_unslash($_POST['font_family'])) : '', 456 473 'style' => isset($_POST['font_style']) ? sanitize_text_field(wp_unslash($_POST['font_style'])) : 'normal', 457 'weight' => isset($_POST['font_weight']) ? sanitize_text_field(wp_unslash($_POST['font_weight'])) : '400' 474 'weight' => isset($_POST['font_weight']) ? sanitize_text_field(wp_unslash($_POST['font_weight'])) : '400', 475 'is_variable' => $is_variable ? 1 : 0, 476 'weight_min' => $is_variable && isset($_POST['weight_min']) ? intval($_POST['weight_min']) : null, 477 'weight_max' => $is_variable && isset($_POST['weight_max']) ? intval($_POST['weight_max']) : null 458 478 ); 459 479 -
safefonts/trunk/languages/safefonts.pot
r3395526 r3416344 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: SafeFonts 1. 1.9\n"5 "Project-Id-Version: SafeFonts 1.2.0\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/safefonts\n" 7 7 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" … … 10 10 "Content-Type: text/plain; charset=UTF-8\n" 11 11 "Content-Transfer-Encoding: 8bit\n" 12 "POT-Creation-Date: 2025-1 1-14T07:25:20+00:00\n"12 "POT-Creation-Date: 2025-12-10T11:02:25+00:00\n" 13 13 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 14 14 "X-Generator: WP-CLI 2.12.0\n" … … 62 62 #: includes/Admin/AdminInterface.php:80 63 63 #: includes/Admin/AdminInterface.php:81 64 #: includes/Admin/AdminInterface.php: 46164 #: includes/Admin/AdminInterface.php:516 65 65 #: views/admin-page.php:26 66 66 #: views/dashboard-page.php:69 … … 90 90 91 91 #: includes/Admin/AdminInterface.php:160 92 #: includes/Admin/AdminInterface.php: 36192 #: includes/Admin/AdminInterface.php:405 93 93 msgid "Uploading..." 94 94 msgstr "" … … 147 147 148 148 #: includes/Admin/AdminInterface.php:300 149 #: includes/Admin/AdminInterface.php:458 150 msgid "Variable Font" 151 msgstr "" 152 153 #: includes/Admin/AdminInterface.php:305 154 msgid "This is a variable font" 155 msgstr "" 156 157 #: includes/Admin/AdminInterface.php:308 158 msgid "Variable fonts contain multiple weights in a single file." 159 msgstr "" 160 161 #: includes/Admin/AdminInterface.php:314 149 162 msgid "Font Weight" 150 163 msgstr "" 151 164 152 #: includes/Admin/AdminInterface.php:318 165 #: includes/Admin/AdminInterface.php:332 166 msgid "Weight Range" 167 msgstr "" 168 169 #: includes/Admin/AdminInterface.php:346 170 msgid "to" 171 msgstr "" 172 173 #: includes/Admin/AdminInterface.php:362 153 174 msgid "Font Style" 154 175 msgstr "" 155 176 156 #: includes/Admin/AdminInterface.php:3 29177 #: includes/Admin/AdminInterface.php:373 157 178 msgid "Font File" 158 179 msgstr "" 159 180 160 #: includes/Admin/AdminInterface.php:3 38181 #: includes/Admin/AdminInterface.php:382 161 182 msgid "Select a font file (.woff2, .woff, .ttf, .otf)." 162 183 msgstr "" 163 184 164 #: includes/Admin/AdminInterface.php:3 51185 #: includes/Admin/AdminInterface.php:395 165 186 msgid "Upload Font" 166 187 msgstr "" 167 188 168 #: includes/Admin/AdminInterface.php:3 53189 #: includes/Admin/AdminInterface.php:397 169 190 msgid "Upload font file" 170 191 msgstr "" 171 192 172 #: includes/Admin/AdminInterface.php: 374193 #: includes/Admin/AdminInterface.php:418 173 194 msgid "No fonts found. Upload font files to get started." 174 195 msgstr "" 175 196 176 #: includes/Admin/AdminInterface.php: 383177 #: includes/Admin/AdminInterface.php:7 01197 #: includes/Admin/AdminInterface.php:427 198 #: includes/Admin/AdminInterface.php:756 178 199 msgid "Installed Fonts" 179 200 msgstr "" 180 201 181 #: includes/Admin/AdminInterface.php: 387202 #: includes/Admin/AdminInterface.php:431 182 203 msgid "Select All" 183 204 msgstr "" 184 205 185 #: includes/Admin/AdminInterface.php: 394206 #: includes/Admin/AdminInterface.php:438 186 207 msgid "Delete Selected" 187 208 msgstr "" 188 209 189 210 #. translators: %s: font family name 190 #: includes/Admin/AdminInterface.php:4 32211 #: includes/Admin/AdminInterface.php:487 191 212 #, php-format 192 213 msgid "Delete %s font" 193 214 msgstr "" 194 215 195 #: includes/Admin/AdminInterface.php:4 39216 #: includes/Admin/AdminInterface.php:494 196 217 msgid "Delete" 197 218 msgstr "" 198 219 199 #: includes/Admin/AdminInterface.php: 467220 #: includes/Admin/AdminInterface.php:522 200 221 msgid "Maximum File Size (MB)" 201 222 msgstr "" 202 223 203 #: includes/Admin/AdminInterface.php: 478224 #: includes/Admin/AdminInterface.php:533 204 225 msgid "Maximum size for individual font files." 205 226 msgstr "" 206 227 207 #: includes/Admin/AdminInterface.php: 485208 #: includes/Admin/AdminInterface.php: 490228 #: includes/Admin/AdminInterface.php:540 229 #: includes/Admin/AdminInterface.php:545 209 230 #: views/help-page.php:129 210 231 msgid "Allowed Font Types" 211 232 msgstr "" 212 233 213 #: includes/Admin/AdminInterface.php: 498234 #: includes/Admin/AdminInterface.php:553 214 235 msgid "Recommended" 215 236 msgstr "" 216 237 217 #: includes/Admin/AdminInterface.php:5 26238 #: includes/Admin/AdminInterface.php:581 218 239 msgid "WOFF2 is recommended for best performance and compression." 219 240 msgstr "" 220 241 221 #: includes/Admin/AdminInterface.php:5 34222 #: includes/Admin/AdminInterface.php:5 43242 #: includes/Admin/AdminInterface.php:589 243 #: includes/Admin/AdminInterface.php:598 223 244 #: views/help-page.php:132 224 245 msgid "Font Preloading" 225 246 msgstr "" 226 247 227 #: includes/Admin/AdminInterface.php: 548248 #: includes/Admin/AdminInterface.php:603 228 249 msgid "No fonts uploaded yet. Upload fonts to enable preloading." 229 250 msgstr "" 230 251 231 #: includes/Admin/AdminInterface.php: 562252 #: includes/Admin/AdminInterface.php:617 232 253 msgid "weights" 233 254 msgstr "" 234 255 235 #: includes/Admin/AdminInterface.php: 579256 #: includes/Admin/AdminInterface.php:634 236 257 msgid "⚡ Font preloading tells the browser to download fonts earlier, reducing flash of invisible text (FOIT)." 237 258 msgstr "" 238 259 239 #: includes/Admin/AdminInterface.php: 580260 #: includes/Admin/AdminInterface.php:635 240 261 msgid "Tip:" 241 262 msgstr "" 242 263 243 #: includes/Admin/AdminInterface.php: 580264 #: includes/Admin/AdminInterface.php:635 244 265 msgid "Only preload 1-2 critical font weights (like your main body font weight) for best performance." 245 266 msgstr "" 246 267 247 #: includes/Admin/AdminInterface.php: 589248 #: includes/Admin/AdminInterface.php: 594268 #: includes/Admin/AdminInterface.php:644 269 #: includes/Admin/AdminInterface.php:649 249 270 #: views/help-page.php:139 250 271 msgid "Data Management" 251 272 msgstr "" 252 273 253 #: includes/Admin/AdminInterface.php:6 02274 #: includes/Admin/AdminInterface.php:657 254 275 msgid "Delete all plugin data when uninstalling" 255 276 msgstr "" 256 277 257 #: includes/Admin/AdminInterface.php:6 06278 #: includes/Admin/AdminInterface.php:661 258 279 msgid "⚠️ Warning: If checked, uninstalling this plugin will permanently delete:" 259 280 msgstr "" 260 281 261 #: includes/Admin/AdminInterface.php:6 07282 #: includes/Admin/AdminInterface.php:662 262 283 msgid "All uploaded font files" 263 284 msgstr "" 264 285 265 #: includes/Admin/AdminInterface.php:6 08286 #: includes/Admin/AdminInterface.php:663 266 287 msgid "Font database records" 267 288 msgstr "" 268 289 269 #: includes/Admin/AdminInterface.php:6 09290 #: includes/Admin/AdminInterface.php:664 270 291 msgid "All plugin settings" 271 292 msgstr "" 272 293 273 #: includes/Admin/AdminInterface.php:6 10294 #: includes/Admin/AdminInterface.php:665 274 295 msgid "This cannot be undone!" 275 296 msgstr "" 276 297 277 #: includes/Admin/AdminInterface.php:6 10298 #: includes/Admin/AdminInterface.php:665 278 299 msgid "Leave unchecked if you plan to reinstall later." 279 300 msgstr "" 280 301 281 #: includes/Admin/AdminInterface.php:6 18302 #: includes/Admin/AdminInterface.php:673 282 303 msgid "Font CSS" 283 304 msgstr "" 284 305 285 #: includes/Admin/AdminInterface.php:6 25306 #: includes/Admin/AdminInterface.php:680 286 307 msgid "Regenerate CSS" 287 308 msgstr "" 288 309 289 #: includes/Admin/AdminInterface.php:6 28310 #: includes/Admin/AdminInterface.php:683 290 311 msgid "Manually regenerate the fonts.css file. This is useful if fonts aren't displaying correctly after an update." 291 312 msgstr "" 292 313 293 #: includes/Admin/AdminInterface.php:6 41314 #: includes/Admin/AdminInterface.php:696 294 315 msgid "Save Settings" 295 316 msgstr "" 296 317 297 #: includes/Admin/AdminInterface.php: 662318 #: includes/Admin/AdminInterface.php:717 298 319 msgid "System Information" 299 320 msgstr "" 300 321 301 #: includes/Admin/AdminInterface.php: 666322 #: includes/Admin/AdminInterface.php:721 302 323 msgid "Plugin Version" 303 324 msgstr "" 304 325 305 #: includes/Admin/AdminInterface.php: 671326 #: includes/Admin/AdminInterface.php:726 306 327 msgid "WordPress Version" 307 328 msgstr "" 308 329 309 #: includes/Admin/AdminInterface.php: 676330 #: includes/Admin/AdminInterface.php:731 310 331 msgid "PHP Version" 311 332 msgstr "" 312 333 313 #: includes/Admin/AdminInterface.php: 681334 #: includes/Admin/AdminInterface.php:736 314 335 msgid "Fonts Directory" 315 336 msgstr "" 316 337 317 #: includes/Admin/AdminInterface.php: 688338 #: includes/Admin/AdminInterface.php:743 318 339 msgid "Writable" 319 340 msgstr "" 320 341 321 #: includes/Admin/AdminInterface.php: 690342 #: includes/Admin/AdminInterface.php:745 322 343 msgid "Not writable" 323 344 msgstr "" 324 345 325 #: includes/Admin/AdminInterface.php: 696346 #: includes/Admin/AdminInterface.php:751 326 347 msgid "Fonts URL" 327 348 msgstr "" 328 349 329 #: includes/Admin/AdminInterface.php:7 06350 #: includes/Admin/AdminInterface.php:761 330 351 msgid "Max Upload Size" 331 352 msgstr "" 332 353 333 #: includes/Admin/AdminInterface.php:7 11354 #: includes/Admin/AdminInterface.php:766 334 355 msgid "Memory Limit" 335 356 msgstr "" 336 357 337 #: includes/Admin/AdminInterface.php:7 16358 #: includes/Admin/AdminInterface.php:771 338 359 #: views/admin-page.php:65 339 360 #: views/dashboard-page.php:125 … … 342 363 msgstr "" 343 364 344 #: includes/Admin/AdminInterface.php:7 19365 #: includes/Admin/AdminInterface.php:774 345 366 msgid "WordPress 6.5+ Font Library Supported" 346 367 msgstr "" 347 368 348 #: includes/Admin/AdminInterface.php:7 21369 #: includes/Admin/AdminInterface.php:776 349 370 msgid "WordPress 6.5+ required for Font Library" 350 371 msgstr "" 351 372 352 #: includes/Admin/AdminInterface.php:7 28373 #: includes/Admin/AdminInterface.php:783 353 374 msgid "🚀 Want More Features?" 354 375 msgstr "" 355 376 356 #: includes/Admin/AdminInterface.php:7 29377 #: includes/Admin/AdminInterface.php:784 357 378 msgid "Upgrade to SafeFonts Pro for:" 358 379 msgstr "" 359 380 360 #: includes/Admin/AdminInterface.php:7 31381 #: includes/Admin/AdminInterface.php:786 361 382 msgid "✅ Page Builder Integration (Elementor, Bricks, Beaver Builder, Divi, Oxygen)" 362 383 msgstr "" 363 384 364 #: includes/Admin/AdminInterface.php:7 32385 #: includes/Admin/AdminInterface.php:787 365 386 msgid "✅ Bulk ZIP Package Import from Google Fonts Downloader" 366 387 msgstr "" 367 388 368 #: includes/Admin/AdminInterface.php:7 33389 #: includes/Admin/AdminInterface.php:788 369 390 msgid "✅ Professional Admin Interface with Drag & Drop" 370 391 msgstr "" 371 392 372 #: includes/Admin/AdminInterface.php:7 34393 #: includes/Admin/AdminInterface.php:789 373 394 msgid "✅ Advanced Font Management Tools" 374 395 msgstr "" 375 396 376 #: includes/Admin/AdminInterface.php:7 38397 #: includes/Admin/AdminInterface.php:793 377 398 msgid "Learn More About SafeFonts Pro →" 378 399 msgstr "" … … 577 598 msgstr "" 578 599 579 #: includes/Core.php: 791580 #: includes/Core.php:8 03600 #: includes/Core.php:801 601 #: includes/Core.php:813 581 602 msgid "SafeFonts Error:" 582 603 msgstr "" 583 604 584 605 #. translators: %s: directory path 585 #: includes/Core.php: 794606 #: includes/Core.php:804 586 607 #, php-format 587 608 msgid "Could not create the fonts directory at <code>%s</code>. Please create this directory manually and ensure it is writable by the web server." … … 589 610 590 611 #. translators: %s: directory path 591 #: includes/Core.php:8 06612 #: includes/Core.php:816 592 613 #, php-format 593 614 msgid "The fonts directory at <code>%s</code> is not writable. Please set the correct permissions (755 or 775) for this directory." 594 615 msgstr "" 595 616 596 #: includes/Core.php:8 10617 #: includes/Core.php:820 597 618 msgid "You can fix this by running:" 598 619 msgstr "" 599 620 600 #: includes/FontManager.php:1 82621 #: includes/FontManager.php:194 601 622 msgid "Failed to create font family directory." 602 623 msgstr "" 603 624 604 #: includes/FontManager.php: 189625 #: includes/FontManager.php:201 605 626 msgid "Font directory is not writable. Check file permissions." 606 627 msgstr "" 607 628 608 #: includes/FontManager.php:2 05629 #: includes/FontManager.php:217 609 630 msgid "Failed to copy font file." 610 631 msgstr "" 611 632 612 #: includes/FontManager.php:2 10633 #: includes/FontManager.php:222 613 634 msgid "Font file was not copied to destination." 614 635 msgstr "" 615 636 616 #: includes/FontManager.php:2 38637 #: includes/FontManager.php:253 617 638 msgid "Failed to save font to database." 618 639 msgstr "" 619 640 620 #: includes/FontManager.php:2 58641 #: includes/FontManager.php:273 621 642 msgid "Font file not found." 622 643 msgstr "" 623 644 624 #: includes/FontManager.php:2 64645 #: includes/FontManager.php:279 625 646 msgid "Font file is too large." 626 647 msgstr "" 627 648 628 649 #. translators: %1$s: file extension, %2$s: allowed file types 629 #: includes/FontManager.php:2 83650 #: includes/FontManager.php:298 630 651 #, php-format 631 652 msgid "Font file extension \"%1$s\" is not allowed. Allowed types: %2$s" … … 633 654 634 655 #. translators: %1$s: detected MIME type, %2$s: file extension 635 #: includes/FontManager.php: 294656 #: includes/FontManager.php:309 636 657 #, php-format 637 658 msgid "Font file MIME type \"%1$s\" is not valid for .%2$s files." 638 659 msgstr "" 639 660 640 #: includes/FontManager.php: 299661 #: includes/FontManager.php:314 641 662 msgid "Font file signature validation failed." 642 663 msgstr "" 643 664 644 #: includes/FontManager.php:4 38645 #: includes/FontManager.php: 485646 #: includes/FontManager.php:5 59665 #: includes/FontManager.php:453 666 #: includes/FontManager.php:505 667 #: includes/FontManager.php:579 647 668 msgid "Security check failed." 648 669 msgstr "" 649 670 650 #: includes/FontManager.php:4 42671 #: includes/FontManager.php:457 651 672 msgid "No file uploaded." 652 673 msgstr "" 653 674 654 #: includes/FontManager.php:4 50675 #: includes/FontManager.php:465 655 676 msgid "File upload error." 656 677 msgstr "" 657 678 658 #: includes/FontManager.php:4 61679 #: includes/FontManager.php:481 659 680 msgid "Font family name is required." 660 681 msgstr "" 661 682 662 #: includes/FontManager.php:4 73683 #: includes/FontManager.php:493 663 684 msgid "Font uploaded successfully!" 664 685 msgstr "" 665 686 666 #: includes/FontManager.php: 489687 #: includes/FontManager.php:509 667 688 msgid "Font ID is required." 668 689 msgstr "" 669 690 670 #: includes/FontManager.php:5 08691 #: includes/FontManager.php:528 671 692 msgid "Font not found." 672 693 msgstr "" 673 694 674 #: includes/FontManager.php:5 48695 #: includes/FontManager.php:568 675 696 msgid "Font deleted successfully." 676 697 msgstr "" 677 698 678 #: includes/FontManager.php:5 63699 #: includes/FontManager.php:583 679 700 msgid "No fonts selected." 680 701 msgstr "" 681 702 682 #: includes/FontManager.php:5 70703 #: includes/FontManager.php:590 683 704 msgid "No valid font IDs provided." 684 705 msgstr "" 685 706 686 707 #. translators: %d: number of fonts deleted 687 #: includes/FontManager.php:6 43708 #: includes/FontManager.php:663 688 709 #, php-format 689 710 msgid "%d font deleted successfully." -
safefonts/trunk/readme.txt
r3395519 r3416344 3 3 Tags: fonts, google fonts, custom fonts, typography, gutenberg 4 4 Requires at least: 6.2 5 Tested up to: 6. 86 Stable tag: 1. 1.95 Tested up to: 6.9 6 Stable tag: 1.2.0 7 7 Requires PHP: 7.4 8 8 License: GPLv2 or later … … 223 223 224 224 == Changelog == 225 226 = 1.2.0 = 227 * NEW: Variable font support - upload and use variable fonts with full weight range (e.g., 100-900 in a single file) 228 * NEW: Variable font toggle in upload form - mark fonts as variable and set weight range 229 * NEW: Automatic CSS generation with proper variable font format (font-weight: 100 900; format('woff2-variations')) 230 * NEW: Visual indicator in font list showing variable fonts with weight range badge 231 * IMPROVEMENT: Database schema updated with is_variable, weight_min, weight_max columns 232 * IMPROVEMENT: Font preview uses appropriate weight (400) for variable fonts 225 233 226 234 = 1.1.9 = -
safefonts/trunk/safefonts.php
r3395519 r3416344 4 4 * Plugin URI: https://safefonts.com 5 5 * Description: Secure font management for WordPress with Gutenberg integration and local hosting for GDPR compliance. 6 * Version: 1. 1.96 * Version: 1.2.0 7 7 * Requires at least: 6.2 8 8 * Requires PHP: 7.4 … … 21 21 22 22 // Define plugin constants 23 define('CHRMRTNS_SAFEFONTS_VERSION', '1. 1.9');23 define('CHRMRTNS_SAFEFONTS_VERSION', '1.2.0'); 24 24 define('CHRMRTNS_SAFEFONTS_PLUGIN_FILE', __FILE__); 25 25 define('CHRMRTNS_SAFEFONTS_PLUGIN_DIR', plugin_dir_path(__FILE__));
Note: See TracChangeset
for help on using the changeset viewer.