Font Organizer - Version 1.0.0

Version Description

  • Plugin publish initial release.

=

Download this release

Release Info

Developer hivewebstudios
Plugin Icon 128x128 Font Organizer
Version 1.0.0
Comparing to
See all releases

Version 1.0.0

assets/css/settings.css ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+
2
+ /* Custom elements table styles */
3
+ .wp-list-table .column-id { width: 10%; }
4
+ .wp-list-table .column-custom_elements { width: 73%; }
5
+ .wp-list-table .column-important { width: 17%;}
assets/js/settings.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ jQuery(document).ready(function(){
2
+ jQuery('#manage_font_id').change(function(){
3
+ select_font_form.submit();
4
+ });
5
+ });
classes/class-ElementsTable.php ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ defined( 'ABSPATH' ) or die( 'Jog on!' );
3
+
4
+ if ( ! class_exists( 'WP_List_Table' ) ) {
5
+ require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
6
+ }
7
+
8
+ class ElementsTable extends WP_List_Table {
9
+
10
+ private $custom_elements;
11
+
12
+ /** Class constructor */
13
+ public function __construct() {
14
+ parent::__construct( array(
15
+ 'singular' => 'custom_element', //singular name of the listed records
16
+ 'plural' => 'custom_elements', //plural name of the listed records
17
+ 'ajax' => false, //does this table support ajax?
18
+ ) );
19
+
20
+ /**
21
+ * Optional. You can handle your bulk actions however you see fit. In this
22
+ * case, we'll handle them within our package just to keep things clean.
23
+ */
24
+ $this->process_bulk_action();
25
+ }
26
+
27
+ /**
28
+ * Render a column when no column specific method exist.
29
+ *
30
+ * @param array $item
31
+ * @param string $column_name
32
+ *
33
+ * @return mixed
34
+ */
35
+ public function column_default( $item, $column_name ) {
36
+ switch ( $column_name ) {
37
+ case 'id':
38
+ case 'name':
39
+ case 'custom_elements':
40
+ case 'important':
41
+ return $item->$column_name;
42
+ default:
43
+ return print_r( $item, true ); //Show the whole array for troubleshooting purposes
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Render the bulk edit checkbox
49
+ *
50
+ * @param array $item
51
+ *
52
+ * @return string
53
+ */
54
+ function column_cb( $item ) {
55
+ return sprintf(
56
+ '<input type="checkbox" name="%1$s[]" value="%2$s" />',
57
+ /*$1%s*/ $this->_args['singular'], //Let's simply repurpose the table's singular label ("movie")
58
+ /*$2%s*/ $item->id //The value of the checkbox should be the record's id
59
+ );
60
+ }
61
+
62
+
63
+ /**
64
+ * Associative array of columns
65
+ *
66
+ * @return array
67
+ */
68
+ function get_columns() {
69
+ $columns = array(
70
+ 'cb' => '<input type="checkbox" />',
71
+ 'id' => __( 'Id', 'font-organizer' ),
72
+ 'custom_elements' => __( 'Custom Elements', 'font-organizer' ),
73
+ 'important' => __( 'Important', 'font-organizer' ),
74
+ );
75
+
76
+ return $columns;
77
+ }
78
+
79
+ function column_important( $item ) {
80
+ //Return the title contents
81
+ return sprintf( '%1$s <span style="color:silver"></span>',
82
+ /*$1%s*/ $item->important ? __('Yes', 'font-organizer') : __('No', 'font-organizer')
83
+ );
84
+ }
85
+
86
+ function column_id( $item ) {
87
+
88
+ //Build row actions
89
+ $actions = array(
90
+ //'edit' => sprintf( '<a href="?page=%s&type=%s&id=%s">Edit</a>', $_REQUEST['page'], 'edit', $item->user_id ),
91
+ 'delete' => sprintf( '<a href="?page=%s&action=%s&manage_font_id=%s&custom_element=%s#step6">Delete</a>', $_REQUEST['page'], 'delete', $item->font_id, $item->id ),
92
+ );
93
+
94
+ //Return the title contents
95
+ return sprintf( '%1$s %2$s',
96
+ /*$1%s*/ $item->id,
97
+ /*$2%s*/ $this->row_actions( $actions )
98
+ );
99
+ }
100
+
101
+ /**
102
+ * Columns to make sortable.
103
+ *
104
+ * @return array
105
+ */
106
+ public function get_sortable_columns() {
107
+ $sortable_columns = array(
108
+ 'id' => array( 'id', true ),
109
+ 'important' => array( 'important', false ),
110
+ );
111
+
112
+ return $sortable_columns;
113
+ }
114
+
115
+ /**
116
+ * Returns an associative array containing the bulk action
117
+ *
118
+ * @return array
119
+ */
120
+ public function get_bulk_actions() {
121
+ $actions = array(
122
+ 'bulk-delete' => __('Delete', 'font-organizer'),
123
+ );
124
+
125
+ return $actions;
126
+ }
127
+
128
+ /**
129
+ * Handles data query and filter, sorting, and pagination.
130
+ */
131
+ public function prepare_items_by_font($custom_elements, $font_id) {
132
+ $this->custom_elements = $custom_elements;
133
+
134
+ $columns = $this->get_columns();
135
+ $hidden = array();
136
+ $sortable = $this->get_sortable_columns();
137
+
138
+
139
+ /**
140
+ * REQUIRED. Finally, we build an array to be used by the class for column
141
+ * headers. The $this->_column_headers property takes an array which contains
142
+ * 3 other arrays. One for all columns, one for hidden columns, and one
143
+ * for sortable columns.
144
+ */
145
+ $this->_column_headers = array( $columns, $hidden, $sortable );
146
+
147
+ // Get the font given custom elements only!
148
+ $data = array();
149
+ foreach ($this->custom_elements as $custom_element) {
150
+ if($custom_element->font_id == $font_id)
151
+ $data[] = $custom_element;
152
+ }
153
+
154
+ $per_page = $this->get_items_per_page( 'custom_elements_per_page', 20 );
155
+ $current_page = $this->get_pagenum();
156
+ $total_items = count( $data );
157
+
158
+ $this->set_pagination_args( array(
159
+ 'total_items' => $total_items, //WE have to calculate the total number of items
160
+ 'per_page' => $per_page, //WE have to determine how many items to show on a page
161
+ 'total_pages' => ceil( $total_items/$per_page ) //WE have to calculate the total number of pages
162
+ ) );
163
+
164
+ /**
165
+ * This checks for sorting input and sorts the data in our array accordingly.
166
+ *
167
+ * In a real-world situation involving a database, you would probably want
168
+ * to handle sorting by passing the 'orderby' and 'order' values directly
169
+ * to a custom query. The returned data will be pre-sorted, and this array
170
+ * sorting technique would be unnecessary.
171
+ */
172
+ function usort_reorder_custom_elements( $a, $b ) {
173
+ $orderby = ( !empty( $_REQUEST['orderby'] ) ) ? $_REQUEST['orderby'] : 'id'; //If no sort, default to date
174
+ $order = ( !empty( $_REQUEST['order'] ) ) ? $_REQUEST['order'] : 'desc'; //If no order, default to desc
175
+ $result = strcmp( $a->$orderby, $b->$orderby ); //Determine sort order
176
+ return ( $order==='asc' ) ? $result : -$result; //Send final sort direction to usort
177
+ }
178
+
179
+ usort( $data, 'usort_reorder_custom_elements' );
180
+
181
+ /**
182
+ * The WP_List_Table class does not handle pagination for us, so we need
183
+ * to ensure that the data is trimmed to only the current page. We can use
184
+ * array_slice() to
185
+ */
186
+ $data = array_slice( $data, ( ( $current_page-1 )*$per_page ), $per_page );
187
+ $this->items = $data;
188
+ }
189
+
190
+ public function no_items() {
191
+ _e( 'No custom elements found.', 'font-organizer' );
192
+ }
193
+
194
+ private function delete_from_database($id){
195
+ global $wpdb;
196
+ $table_name = $wpdb->prefix . FO_ELEMENTS_DATABASE;
197
+
198
+ $wpdb->delete( $table_name, array( 'id' => $id ) );
199
+ }
200
+
201
+ public function process_bulk_action() {
202
+
203
+ //Detect when a bulk action is being triggered...
204
+ if ( 'delete' === $this->current_action() ) {
205
+ $this->delete_from_database( absint( $_GET['custom_element'] ) );
206
+ }
207
+
208
+ // If the delete bulk action is triggered
209
+ if ( ( isset( $_GET['action'] ) && $_GET['action'] == 'bulk-delete' )
210
+ || ( isset( $_GET['action2'] ) && $_GET['action2'] == 'bulk-delete' )
211
+ ) {
212
+ $delete_ids = esc_sql( $_GET['custom_element'] );
213
+
214
+ if(empty($delete_ids))
215
+ return;
216
+
217
+ // loop over the array of record IDs and delete them
218
+ foreach ( $delete_ids as $id ) {
219
+ $this->delete_from_database( absint( $id ) );
220
+ }
221
+ }
222
+ }
223
+ }
224
+ ?>
font-organizer.php ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * @package Font_Organizer
4
+ * @version 1.0.0
5
+ */
6
+ /*
7
+ Plugin Name: Font Organizer
8
+ Plugin URI: https://wordpress.org/plugins/font-organizer/
9
+ Description: Font Organizer is the complete solution for font implementation in WordPress websites.
10
+ Author: Hive
11
+ Version: 1.0.0
12
+ Author URI: https://hivewebstudios.com
13
+ */
14
+
15
+ define( 'FO_ABSPATH', plugin_dir_path( __FILE__ ) );
16
+ define( 'FO_USABLE_FONTS_DATABASE', 'fo_usable_fonts' );
17
+ define( 'FO_ELEMENTS_DATABASE', 'fo_elements' );
18
+ define( 'FO_DEFAULT_ROLE', 'administrator' );
19
+
20
+ global $fo_db_version;
21
+ $fo_db_version = '1.0.0';
22
+ global $css_full_file_path;
23
+ global $css_full_url_path;
24
+ global $css_directory_path;
25
+ $css_full_file_path = wp_upload_dir()['basedir'] . '/font-organizer' . '/fo-fonts.css';
26
+ $css_full_url_path = wp_upload_dir()['baseurl'] . '/font-organizer' . '/fo-fonts.css';
27
+ $css_directory_path = wp_upload_dir()['basedir'] . '/font-organizer';
28
+
29
+ function fo_update_db_check() {
30
+ global $fo_db_version;
31
+ if ( get_site_option( 'fo_db_version' ) != $fo_db_version ) {
32
+ fo_install();
33
+ }
34
+ }
35
+
36
+ add_action( 'plugins_loaded', 'fo_update_db_check' );
37
+ register_activation_hook( __FILE__, 'fo_install' );
38
+ register_deactivation_hook( __FILE__, 'fo_uninstall' );
39
+ add_action( 'init', 'fo_init' );
40
+ add_action('plugins_loaded', 'fo_load_textdomain');
41
+
42
+ function fo_load_textdomain() {
43
+ load_plugin_textdomain( 'font-organizer', false, dirname( plugin_basename(__FILE__) ) . '/languages/' );
44
+ }
45
+
46
+ function fo_init(){
47
+ global $css_full_file_path;
48
+
49
+ if( is_admin() ){
50
+ add_filter('upload_mimes', 'fo_allow_upload_types');
51
+ add_filter( 'plugin_action_links', 'fo_add_action_plugin', 10, 5 );
52
+
53
+ include FO_ABSPATH . 'helpers.php';
54
+
55
+ include FO_ABSPATH . 'settings.php';
56
+
57
+ $settings_page = new FoSettingsPage();
58
+ }else{
59
+ if(file_exists($css_full_file_path)){
60
+ add_action( 'wp_enqueue_scripts', 'fo_enqueue_fonts_css' );
61
+ }
62
+ }
63
+ }
64
+
65
+ function fo_enqueue_fonts_css(){
66
+ global $css_full_url_path;
67
+ wp_enqueue_style('fo-fonts', $css_full_url_path);
68
+ }
69
+
70
+ function fo_allow_upload_types($existing_mimes = array()){
71
+ $existing_mimes['ttf'] = 'application/octet-stream';
72
+ $existing_mimes['woff'] = 'application/x-font-woff';
73
+ $existing_mimes['woff2'] = 'application/x-font-woff';
74
+ $existing_mimes['otf'] = 'application/x-font-woff';
75
+
76
+ return $existing_mimes;
77
+ }
78
+
79
+ function fo_uninstall(){
80
+ $roles = wp_roles();
81
+
82
+ // Remove all capabilities added by this plugin.
83
+ foreach ($roles as $role_name => $role) {
84
+ if(array_key_exists('manage_fonts', $role['capabilities']) && $role['capabilities']['manage_fonts'])
85
+ $roles->remove_cap( $role_name, 'manage_fonts' );
86
+ }
87
+ }
88
+
89
+ function fo_install() {
90
+ global $wpdb;
91
+ global $fo_db_version;
92
+
93
+ $usable_table_name = $wpdb->prefix . FO_USABLE_FONTS_DATABASE;
94
+ $elements_table_name = $wpdb->prefix . FO_ELEMENTS_DATABASE;
95
+
96
+ $charset_collate = $wpdb->get_charset_collate();
97
+
98
+ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
99
+
100
+ $sql = "CREATE TABLE IF NOT EXISTS $usable_table_name (
101
+ id mediumint(9) NOT NULL AUTO_INCREMENT,
102
+ name varchar(255) NOT NULL,
103
+ url text DEFAULT NULL,
104
+ custom int(1) DEFAULT 0,
105
+ PRIMARY KEY (id)
106
+ ) $charset_collate;";
107
+
108
+ dbDelta( $sql );
109
+
110
+ $sql = "CREATE TABLE IF NOT EXISTS $elements_table_name (
111
+ id mediumint(9) NOT NULL AUTO_INCREMENT,
112
+ font_id mediumint(9) NOT NULL,
113
+ important int(1) DEFAULT 0,
114
+ custom_elements TEXT DEFAULT NULL,
115
+ PRIMARY KEY (id)
116
+ ) $charset_collate;";
117
+
118
+ dbDelta( $sql );
119
+
120
+ // Set the db version to current.
121
+ add_option( 'fo_db_version', $fo_db_version );
122
+
123
+ // Set roles
124
+ $role = get_role( 'administrator' );
125
+ if(!$role->has_cap('manage_fonts'))
126
+ $role->add_cap( 'manage_fonts' );
127
+ }
128
+
129
+ function fo_add_action_plugin( $actions, $plugin_file ) {
130
+ static $plugin;
131
+
132
+ if (!isset($plugin))
133
+ $plugin = plugin_basename(__FILE__);
134
+
135
+ if ($plugin == $plugin_file) {
136
+
137
+ $settings = array('settings' => '<a href="options-general.php?page=font-setting-admin">' . __('Font Settings', 'font-organizer') . '</a>');
138
+ $actions = array_merge($settings, $actions);
139
+
140
+ }
141
+
142
+ return $actions;
143
+ }
144
+ ?>
helpers.php ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ function fo_do_settings_section($page, $section_name){
3
+ global $wp_settings_sections, $wp_settings_fields;
4
+
5
+ if ( ! isset( $wp_settings_sections[$page] ) )
6
+ return;
7
+
8
+ foreach ( (array) $wp_settings_sections[$page] as $section_from_page ) {
9
+ if($section_name !== $section_from_page['id'])
10
+ continue;
11
+
12
+ if ( $section_from_page['title'] )
13
+ echo "<h2>{$section_from_page['title']}</h2>\n";
14
+
15
+ if ( $section_from_page['callback'] )
16
+ call_user_func( $section_from_page['callback'], $section_from_page );
17
+
18
+ if ( ! isset( $wp_settings_fields ) || !isset( $wp_settings_fields[$page] ) || !isset( $wp_settings_fields[$page][$section_from_page['id']] ) )
19
+ continue;
20
+
21
+ echo '<table class="form-table">';
22
+ do_settings_fields( $page, $section_from_page['id'] );
23
+ echo '</table>';
24
+ }
25
+ }
26
+
27
+ function fo_print_links($fonts, $fonts_per_link = 150){
28
+ if(empty($fonts))
29
+ return;
30
+
31
+ // Create list of names with no spaces.
32
+ $font_names = array_map(function($font) { return str_replace(' ', '+', $font->family); }, $fonts);
33
+
34
+ // Prepare to load the fonts in bulks to improve performance. Cannot include all.
35
+ for ($i=0; $i < count($font_names); $i+=$fonts_per_link) {
36
+ $calculated_length = count($font_names) - $i > $fonts_per_link ? $fonts_per_link : count($font_names) - $i;
37
+ $font_names_to_load = array_slice($font_names, $i, $calculated_length);
38
+ echo "<link href='http://fonts.googleapis.com/css?family=". implode("|", $font_names_to_load) . "' rel='stylesheet' type='text/css'>";
39
+ }
40
+ }
41
+
42
+ function fo_upload_file($uploadedfile, $upload_dir_callback, $should_override = false){
43
+ if ( ! function_exists( 'wp_handle_upload' ) )
44
+ require_once( ABSPATH . 'wp-admin/includes/file.php' );
45
+
46
+ $upload_overrides = array( 'test_form' => false );
47
+ if($should_override){
48
+ $upload_overrides['unique_filename_callback'] = 'fo_unique_filename_callback';
49
+ }
50
+ // Register our path override.
51
+ add_filter( 'upload_dir', $upload_dir_callback );
52
+
53
+ $movefile = wp_handle_upload( $uploadedfile, $upload_overrides );
54
+
55
+ // Set everything back to normal.
56
+ remove_filter( 'upload_dir', $upload_dir_callback );
57
+
58
+ return $movefile;
59
+ }
60
+
61
+ function fo_unique_filename_callback($dir, $name, $ext){
62
+ return $name.$ext;
63
+ }
64
+
65
+ function fo_get_font_format($url){
66
+ $extension = pathinfo($url, PATHINFO_EXTENSION);
67
+ switch ($extension) {
68
+ case 'ttf':
69
+ return 'truetype';
70
+ default:
71
+ return $extension;
72
+ }
73
+ }
74
+
75
+ function fo_print_source($kind){
76
+ switch ($kind) {
77
+ case 'webfonts#webfont':
78
+ _e('Google', 'font-organizer');
79
+ break;
80
+ case 'standard':
81
+ _e('Standard', 'font-organizer');
82
+ break;
83
+ case 'custom':
84
+ _e('Custom', 'font-organizer');
85
+ break;
86
+ default:
87
+ _e(ucfirst($kind), 'font-organizer');
88
+ break;
89
+ }
90
+ }
91
+ ?>
index.php ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ <?php
2
+ // Silence is golden.
3
+ ?>
languages/font-organizer-he_IL.mo ADDED
Binary file
languages/font-organizer-he_IL.po ADDED
@@ -0,0 +1,515 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Font Organizer\n"
4
+ "POT-Creation-Date: 2016-11-19 20:36+0200\n"
5
+ "PO-Revision-Date: 2016-11-19 20:38+0200\n"
6
+ "Last-Translator: \n"
7
+ "Language-Team: \n"
8
+ "Language: he_IL\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.8.2\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "X-Poedit-WPHeader: font-organizer.php\n"
15
+ "X-Poedit-SourceCharset: UTF-8\n"
16
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
17
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
18
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
19
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
20
+ "X-Poedit-SearchPath-0: .\n"
21
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
22
+
23
+ #: classes/class-ElementsTable.php:71
24
+ msgid "Id"
25
+ msgstr "מזהה"
26
+
27
+ #: classes/class-ElementsTable.php:72
28
+ msgid "Custom Elements"
29
+ msgstr "אלמנט מותאם אישית"
30
+
31
+ #: classes/class-ElementsTable.php:73 settings.php:1010 settings.php:1027
32
+ msgid "Important"
33
+ msgstr "חשוב"
34
+
35
+ #: classes/class-ElementsTable.php:82
36
+ msgid "Yes"
37
+ msgstr "כן"
38
+
39
+ #: classes/class-ElementsTable.php:82
40
+ msgid "No"
41
+ msgstr "לא"
42
+
43
+ #: classes/class-ElementsTable.php:122
44
+ msgid "Delete"
45
+ msgstr "מחק"
46
+
47
+ #: classes/class-ElementsTable.php:191
48
+ msgid "No custom elements found."
49
+ msgstr "לא נמצאו אלמנטים מותאמים אישית."
50
+
51
+ #: font-organizer.php:137 settings.php:180 settings.php:332
52
+ msgid "Font Settings"
53
+ msgstr "הגדרות גופנים"
54
+
55
+ #: helpers.php:78
56
+ msgid "Google"
57
+ msgstr "גוגל"
58
+
59
+ #: helpers.php:81
60
+ msgid "Standard"
61
+ msgstr "סטנדרטי"
62
+
63
+ #: helpers.php:84
64
+ msgid "Custom"
65
+ msgstr "מיובא"
66
+
67
+ #: settings.php:113
68
+ msgid "<body> Font"
69
+ msgstr "גופן לתגית <body>"
70
+
71
+ #: settings.php:114
72
+ msgid "<h1> Font"
73
+ msgstr "גופן לתגית <h1>"
74
+
75
+ #: settings.php:115
76
+ msgid "<h2> Font"
77
+ msgstr "גופן לתגית <h2>"
78
+
79
+ #: settings.php:116
80
+ msgid "<h3> Font"
81
+ msgstr "גופן לתגית <h3>"
82
+
83
+ #: settings.php:117
84
+ msgid "<h4> Font"
85
+ msgstr "גופן לתגית <h4>"
86
+
87
+ #: settings.php:118
88
+ msgid "<h5> Font"
89
+ msgstr "גופן לתגית <h5>"
90
+
91
+ #: settings.php:119
92
+ msgid "<h6> Font"
93
+ msgstr "גופן לתגית <h6>"
94
+
95
+ #: settings.php:120
96
+ msgid "<p> Font"
97
+ msgstr "גופן לתגית <p>"
98
+
99
+ #: settings.php:121
100
+ msgid "<q> Font"
101
+ msgstr "גופן לתגית <q>"
102
+
103
+ #: settings.php:122
104
+ msgid "<li> Font"
105
+ msgstr "גופן לתגית <li>"
106
+
107
+ #: settings.php:123
108
+ msgid "<a> Font"
109
+ msgstr "גופן לתגית <a>"
110
+
111
+ #: settings.php:294
112
+ msgid "Google API key is not valid: "
113
+ msgstr "המפתח של גוגל אינה חוקי:"
114
+
115
+ #: settings.php:297
116
+ msgid "Google API key is not set! Cannot display google fonts."
117
+ msgstr "המפתח של גוגל אינו מוגדר! אין אפשרות להציג גופנים של גוגל."
118
+
119
+ #: settings.php:343
120
+ msgid "General Settings"
121
+ msgstr "הגדרות כלליות"
122
+
123
+ #: settings.php:359
124
+ msgid "1. Add Fonts"
125
+ msgstr "1. הוספת גופנים"
126
+
127
+ #: settings.php:361
128
+ msgid ""
129
+ "Step 1: Select and add fonts to be used in your website. Select as many as "
130
+ "you wish."
131
+ msgstr "שלב 1: בחר והוסף גופנים לאתר האינטרנט שלך. ניתן לבחר כמה שתרצה."
132
+
133
+ #: settings.php:363
134
+ msgid "You can select google or regular fonts."
135
+ msgstr "באפשרותך לבחור בגופנים של גוגל או גופנים מוכרים."
136
+
137
+ #: settings.php:367
138
+ msgid "Available Fonts"
139
+ msgstr "גופנים זמינים"
140
+
141
+ #: settings.php:374
142
+ msgid "Use This Font"
143
+ msgstr "השתמש בגופן זה"
144
+
145
+ #: settings.php:385
146
+ msgid "2. Custom Fonts"
147
+ msgstr "2. גופנים מיובאים"
148
+
149
+ #: settings.php:387
150
+ msgid ""
151
+ "Step 2: Upload custom fonts to be used in your website. Here too, you can "
152
+ "upload as many as you wish."
153
+ msgstr "שלב 2: כאן ניתן לעלות גופנים לאתר שלך. גם כאן, ניתן להעלות כמה שתרצה."
154
+
155
+ #: settings.php:391
156
+ msgid "Font Name"
157
+ msgstr "שם גופן"
158
+
159
+ #: settings.php:395
160
+ msgid "Font File"
161
+ msgstr "קובץ הגופן"
162
+
163
+ #: settings.php:398
164
+ msgid "Accepted Font Format : "
165
+ msgstr "פורמט גופן נתמך:"
166
+
167
+ #: settings.php:405
168
+ msgid "Upload"
169
+ msgstr "העלה"
170
+
171
+ #: settings.php:416
172
+ msgid "3. Known Elements Settings"
173
+ msgstr "3. הגדרות אלמנטים הידועים"
174
+
175
+ #: settings.php:419
176
+ msgid ""
177
+ "Step 3: For each element you can assign a font you have added in step 1 & 2."
178
+ msgstr "שלב 3: עבור כל אלמנט ניתן להקצות גופן שהוספת בשלב 1 & 2."
179
+
180
+ #: settings.php:420
181
+ msgid "Note: "
182
+ msgstr "הערה:"
183
+
184
+ #: settings.php:420
185
+ msgid "Custom fonts you uploaded are automatically used in your website."
186
+ msgstr "גופנים מיובאים אוטומטית נוספים לאתר שלך."
187
+
188
+ #: settings.php:436
189
+ msgid "4. Custom Elements Settings"
190
+ msgstr "4. הגדרות אלמנטים מותאמים אישית"
191
+
192
+ #: settings.php:439
193
+ msgid ""
194
+ "Step 4: Assign font that you have added to your website to custom elements."
195
+ msgstr ""
196
+ "שלב 4: כאן ניתן לשייך גופן שהוספת לאתר האינטרנט שלך לאלמנטים מותאמים אישית."
197
+
198
+ #: settings.php:443 settings.php:477
199
+ msgid "Font"
200
+ msgstr "גופן"
201
+
202
+ #: settings.php:447
203
+ msgid "Custom Element"
204
+ msgstr "רכיב מותאם אישית"
205
+
206
+ #: settings.php:450
207
+ msgid ""
208
+ "Custom elements can be seperated by commas to allow multiple elements. "
209
+ "Example: #myelementid, .myelementclass, .myelementclass .foo, etc."
210
+ msgstr ""
211
+ "רכיבים מותאמים אישית ניתן להפריד בפסיקים כדי לאפשר מספר אלמנטים. דוגמה: ."
212
+ "myelementclass, #myelementid, .myelementclass .foo, וכו '."
213
+
214
+ #: settings.php:461
215
+ msgid "Apply Custom Elements"
216
+ msgstr "החל על אלמנטים אלה"
217
+
218
+ #: settings.php:472
219
+ msgid "5. Manage Fonts"
220
+ msgstr "5. ניהול גופנים"
221
+
222
+ #: settings.php:478
223
+ msgid "-- Select Font --"
224
+ msgstr "-- בחירת גופן --"
225
+
226
+ #: settings.php:487
227
+ msgid "Source"
228
+ msgstr "מקור"
229
+
230
+ #: settings.php:491
231
+ msgid "Urls"
232
+ msgstr "כתובת"
233
+
234
+ #: settings.php:523
235
+ msgid "Thank you"
236
+ msgstr "תודה לך!"
237
+
238
+ #: settings.php:528
239
+ msgid ""
240
+ "Thank you for using an <a href=\"http://hivewebstudios.com\" target=\"_blank"
241
+ "\">Hive</a> plugin! We 5 star you already, so why don't you <a href="
242
+ "\"https://wordpress.org/support/plugin/font-organizer/reviews/?rate=5#new-"
243
+ "post\" target=\"_blank\">5 star us too</a>?<br /><br /><p>Anyway, if you "
244
+ "need anything, this may help:</p> <ul style=\"list-style-type:disc;margin: 0 "
245
+ "20px;\">\n"
246
+ " <li><a href=\"http://hivewebstudios."
247
+ "com/font-organizer#faqs\" target=\"_blank\">FAQ</a></li>\n"
248
+ " <li><a href=\"https://wordpress.org/"
249
+ "support/plugin/font-organizer/reviews/\" target=\"_blank\">Support Forums</"
250
+ "a></li>\n"
251
+ " <li><a href=\"http://hivewebstudios."
252
+ "com/font-organizer\" target=\"_blank\">Contact us</a></li>\n"
253
+ " <li><a href=\"https://www.facebook."
254
+ "com/hivewp\" target=\"_blank\">Hive Facebook page</a></li>\n"
255
+ " </ul>"
256
+ msgstr ""
257
+ "המון תודה שאתה משתמש בפלאגין של <a href=\"http://hivewebstudios.com\" target="
258
+ "\"_blank\">Hive</a>! אתה בשבילנו כבר 5 כוכבים, אז למה שלא <a href=\"https://"
259
+ "wordpress.org/support/plugin/font-organizer/reviews/?rate=5#new-post\" "
260
+ "target=\"_blank\">תדרג אותנו 5 כוכבים גם</a>?\n"
261
+ "<p>בכל מקרה, אם תצטרך משהו, אולי זה יעזור:</p> \n"
262
+ "<ul style=\"list-style-type:disc;margin: 0 20px;\">\n"
263
+ " <li><a href=\"http://hivewebstudios."
264
+ "com/font-organizer#faqs\" target=\"_blank\">שאלות ותשובות</a></li>\n"
265
+ " <li><a href=\"https://wordpress.org/"
266
+ "support/plugin/font-organizer/reviews/\" target=\"_blank\">פורום תמיכה</a></"
267
+ "li>\n"
268
+ " <li><a href=\"http://hivewebstudios."
269
+ "com/font-organizer\" target=\"_blank\">צור קשר</a></li>\n"
270
+ " <li><a href=\"https://www.facebook."
271
+ "com/hivewp\" target=\"_blank\">עמוד פייסבוק שלנו</a></li>\n"
272
+ " </ul>"
273
+
274
+ #: settings.php:546 settings.php:573 settings.php:588 settings.php:607
275
+ msgid "Session ended, please try again."
276
+ msgstr "הסתיים הטיפול, אנא נסה שנית."
277
+
278
+ #: settings.php:552
279
+ msgid "Font name is empty or invalid."
280
+ msgstr "שם גופן הוא ריק או לא חוקי."
281
+
282
+ #: settings.php:557
283
+ msgid "Font file is not selected."
284
+ msgstr "לא נבחר קובץ הגופן."
285
+
286
+ #: settings.php:564
287
+ msgid "Font file is not valid."
288
+ msgstr "קובץ הגופן אינו חוקי."
289
+
290
+ #: settings.php:579
291
+ msgid "Usable font is empty or invalid."
292
+ msgstr "גופן לשימוש הוא ריק או לא חוקי."
293
+
294
+ #: settings.php:594
295
+ msgid "Custom elements is empty or invalid."
296
+ msgstr "אלמנטים מותאמים אישית ריק או לא חוקי."
297
+
298
+ #: settings.php:613
299
+ msgid "Something went horribly wrong. Ask the support!"
300
+ msgstr "משהו השתבש בצורה נוראית. תשאל את התמיכה!"
301
+
302
+ #: settings.php:689
303
+ msgid "Custom elements added to your website!"
304
+ msgstr "אלמנטים מותאמים אישית התווספו לאתר שלך!"
305
+
306
+ #: settings.php:697
307
+ msgid "Font can now be used in your website!"
308
+ msgstr "כעת ניתן להשתמש בגופן באתר האינטרנט שלך!"
309
+
310
+ #: settings.php:705
311
+ msgid "Font deleted from your website!"
312
+ msgstr "גופן נמחק מהאתר שלך!"
313
+
314
+ #: settings.php:713
315
+ msgid "The file has been uploaded!"
316
+ msgstr "הקובץ הועלה בהצלחה."
317
+
318
+ #: settings.php:721
319
+ msgid "Error uploading the file: "
320
+ msgstr "שגיאה בהעלאת הקובץ:"
321
+
322
+ #: settings.php:729
323
+ msgid "Error adding font to website fonts: "
324
+ msgstr "שגיאה בעת הוספת גופן לאתר:"
325
+
326
+ #: settings.php:737
327
+ msgid "Error deleting font: "
328
+ msgstr "שגיאה במחיקת גופן:"
329
+
330
+ #: settings.php:745
331
+ msgid "Failed to open or create the css file. Check for permissions."
332
+ msgstr "לא ניתן לפתוח או ליצור את קובץ ה-css. בדוק אם יש הרשאות."
333
+
334
+ #: settings.php:787
335
+ msgid "Google API Key"
336
+ msgstr "מפתח API של גוגל"
337
+
338
+ #: settings.php:794
339
+ msgid "Show Font Family Preview"
340
+ msgstr "טען תצוגה מקדימה לגופנים"
341
+
342
+ #: settings.php:804
343
+ msgid "Access Settings Role"
344
+ msgstr "רמת הרשאה להגדרות"
345
+
346
+ #: settings.php:916
347
+ msgid "This is the general settings for the site."
348
+ msgstr "אלה הם הגדרות כלליות עבור התוסף."
349
+
350
+ #: settings.php:935
351
+ #, php-format
352
+ msgid ""
353
+ "To get all the fonts, Google requires the mandatory use of an API key, get "
354
+ "one from <a href=\"%s\" target=\"_blank\">HERE</a>"
355
+ msgstr ""
356
+ "כדי לקבל את כל הגופנים, גוגל מחייב שימוש ב-API, ניתן לקבל אחד מ <a href=\"%s"
357
+ "\" target=\"_blank\">כאן</a> בחינם ובמהירות."
358
+
359
+ #: settings.php:959
360
+ msgid "Include Font Family Preview"
361
+ msgstr "הוסף גופן לדף זה לצפיה בתוצגה מוקדמת"
362
+
363
+ #: settings.php:961
364
+ msgid "Show font preview when listing the fonts (might be slow)"
365
+ msgstr "הצג תצוגה מקדימה של הגופן ברשימה של גופנים (עשוי להיות איטי)."
366
+
367
+ #: settings.php:1013 settings.php:1030
368
+ msgid "Include !important to this element to always apply."
369
+ msgstr "הוסף תגית important! על מנת שגופן זה תמיד יופיע."
370
+
371
+ #: settings.php:1042
372
+ msgid "Default"
373
+ msgstr "ברירת מחדל"
374
+
375
+ #. Plugin Name of the plugin/theme
376
+ msgid "Font Organizer"
377
+ msgstr "מארגן הגופנים"
378
+
379
+ #. Plugin URI of the plugin/theme
380
+ msgid "https://wordpress.org/plugins/font-organizer/"
381
+ msgstr "https://wordpress.org/plugins/font-organizer/"
382
+
383
+ #. Description of the plugin/theme
384
+ msgid ""
385
+ "Font Organizer is the complete solution for font implementation in WordPress "
386
+ "websites."
387
+ msgstr "Font Organizer הוא הפתרון המושלם לניהול ושימוש גופנים באתר וורדפרס."
388
+
389
+ #. Author of the plugin/theme
390
+ msgid "Hive"
391
+ msgstr ""
392
+
393
+ #. Author URI of the plugin/theme
394
+ msgid "https://hivewebstudios.com"
395
+ msgstr ""
396
+
397
+ #~ msgid ""
398
+ #~ "Thank you for using an <a href=\"http://hivewebstudios.com\" target="
399
+ #~ "\"_blank\">Hive</a> plugin! We 5 star you already, so why don't you <a "
400
+ #~ "href=\"https://wordpress.org/support/plugin/font-organizer/reviews/?"
401
+ #~ "rate=5#new-post\" target=\"_blank\">5 star us too</a>?<br /><br /"
402
+ #~ "><p>Anyway, if you need anything, this may help:</p> <ul style=\"list-"
403
+ #~ "style-type:disc\">\n"
404
+ #~ " <li><a href=\"http://"
405
+ #~ "hivewebstudios.com/font-organizer#faqs\" target=\"_blank\">FAQ</a></li>\n"
406
+ #~ " <li><a href=\"http://"
407
+ #~ "hivewebstudios.com/font-organizer\" target=\"_blank\">Contact us</a></"
408
+ #~ "li>\n"
409
+ #~ " <li><a href=\"https://wordpress."
410
+ #~ "org/support/plugin/font-organizer/reviews/\" target=\"_blank\">Support "
411
+ #~ "Forums</a></li>\n"
412
+ #~ " <li><a href=\"https://www."
413
+ #~ "facebook.com/hivewp\" target=\"_blank\">Hive Facebook page</a></li>\n"
414
+ #~ " </ul>"
415
+ #~ msgstr ""
416
+ #~ "המון תודה שאתה משתמש בפלאגין של <a href=\"http://hivewebstudios.com\" "
417
+ #~ "target=\"_blank\">Hive</a>! אתה בשבילנו כבר 5 כוכבים, אז למה שלא <a href="
418
+ #~ "\"https://wordpress.org/support/plugin/font-organizer/reviews/?rate=5#new-"
419
+ #~ "post\" target=\"_blank\">תדרג אותנו 5 כוכבים גםo</a> ?\n"
420
+ #~ "<p>בכל מקרה, אם תצטרך משהו, אולי זה יעזור:</p> \n"
421
+ #~ "<ul style=\"list-style-type:disc\">\n"
422
+ #~ " <li><a href=\"http://"
423
+ #~ "hivewebstudios.com/font-organizer#faqs\" target=\"_blank\">שאלות ותשובות</"
424
+ #~ "a></li>\n"
425
+ #~ " <li><a href=\"http://"
426
+ #~ "hivewebstudios.com/font-organizer\" target=\"_blank\">צור קשר</a></li>\n"
427
+ #~ " <li><a href=\"https://wordpress."
428
+ #~ "org/support/plugin/font-organizer/reviews/\" target=\"_blank\">פורום "
429
+ #~ "תמיכה</a></li>\n"
430
+ #~ " <li><a href=\"https://www."
431
+ #~ "facebook.com/hivewp\" target=\"_blank\">עמוד הפייסבוק שלנו</a></li>\n"
432
+ #~ " </ul>"
433
+
434
+ #~ msgid ""
435
+ #~ "Thank you for using an <a href=\"http://hivewebstudios.com\" target="
436
+ #~ "\"_blank\">Hive</a> plugin! We 5 star you already, so why don't you <a "
437
+ #~ "href=\"https://wordpress.org/support/plugin/font-organizer/reviews/?"
438
+ #~ "rate=5#new-post\" target=\"_blank\">5 star us too</a>?<br /><br /"
439
+ #~ "><p>Anyway, if you need anything, this may help:</p> <ul style=\"list-"
440
+ #~ "style-type:circle\">\n"
441
+ #~ " <li><a href=\"http://"
442
+ #~ "hivewebstudios.com/font-organizer#faqs\" target=\"_blank\">FAQ</a></li>\n"
443
+ #~ " <li><a href=\"http://"
444
+ #~ "hivewebstudios.com/font-organizer\" target=\"_blank\">Contact us</a></"
445
+ #~ "li>\n"
446
+ #~ " <li><a href=\"https://wordpress."
447
+ #~ "org/support/plugin/font-organizer/reviews/\" target=\"_blank\">Support "
448
+ #~ "Forums</a></li>\n"
449
+ #~ " <li><a href=\"https://www."
450
+ #~ "facebook.com/hivewp\" target=\"_blank\">Hive Facebook page</a></li>\n"
451
+ #~ " </ul>"
452
+ #~ msgstr ""
453
+ #~ "תודה שאתה משתמש פלאגין של <a href=\"http://hivewebstudios.com\" target="
454
+ #~ "\"_blank\">Hive</a>! אנחנו כבר נותנים לך 5 כוכבים, למה שלא <a href="
455
+ #~ "\"https://wordpress.org/support/plugin/font-organizer/reviews/?rate=5#new-"
456
+ #~ "post\" target=\"_blank\">תדרג אותנו 5 כוכבים גם</a>?\n"
457
+ #~ "<br /><p>בכל מקרה, אם יש משהו שנוכל לעזור, אולי הקישורים האלו יעזרו: </"
458
+ #~ "p>\n"
459
+ #~ " <ul style=\"list-style-type:circle\">\n"
460
+ #~ " <li><a href=\"http://"
461
+ #~ "hivewebstudios.com/font-organizer#faqs\" target=\"_blank\">שאלות ותשובות</"
462
+ #~ "a></li>\n"
463
+ #~ " <li><a href=\"http://"
464
+ #~ "hivewebstudios.com/font-organizer\" target=\"_blank\">צור קשר</a></li>\n"
465
+ #~ " <li><a href=\"https://wordpress."
466
+ #~ "org/support/plugin/font-organizer/reviews/\" target=\"_blank\">פורום "
467
+ #~ "תמיכה</a></li>\n"
468
+ #~ " <li><a href=\"https://www."
469
+ #~ "facebook.com/hivewp\" target=\"_blank\">עמוד הפייסבוק שלנו</a></li>\n"
470
+ #~ " </ul>"
471
+
472
+ #~ msgid ""
473
+ #~ "Thank you for using an <a href=\"http://hivewebstudios.com\" target="
474
+ #~ "\"_blank\">HiveTeam</a> plugin! We 5 star you already, so why don't you "
475
+ #~ "<a href=\"http://xxxxx.xxx\" target=\"_blank\">5 star us too</a>?"
476
+ #~ msgstr ""
477
+ #~ "תודה לך על השימוש בתוסף של <a href=\"http://hivewebstudios.com\" target="
478
+ #~ "\"_blank\">HiveTeam</a>! אנחנו מדרגים אותך 5 כוכבים כבר, אז למה לא <a "
479
+ #~ "href=\"http://xxxxx.xxx\" target=\"_blank\">תדרג אותנו 5 כוכבים</a>?"
480
+
481
+ #~ msgid "afsaf."
482
+ #~ msgstr "תיאור"
483
+
484
+ #~ msgid "HiveTeam"
485
+ #~ msgstr "HiveTeam"
486
+
487
+ #~ msgid "Toggle panel: General Settings"
488
+ #~ msgstr "לוח דו-מצביים: הגדרות כלליות"
489
+
490
+ #~ msgid "Toggle panel: First Step: Add Fonts"
491
+ #~ msgstr "לוח דו-מצביים: שלב ראשון: הוספת גופנים"
492
+
493
+ #~ msgid "Toggle panel: Custom Fonts"
494
+ #~ msgstr "לוח דו-מצביים: גופנים מיובאים"
495
+
496
+ #~ msgid "Toggle panel: Known Elements Settings"
497
+ #~ msgstr "לוח דו-מצביים: הגדרות אלמנטים ידועים"
498
+
499
+ #~ msgid "Toggle panel: Custom Elements Settings"
500
+ #~ msgstr "לוח דו-מצביים: הגדרות אלמנטים מותאמים אישית"
501
+
502
+ #~ msgid "Toggle panel: Manage Fonts"
503
+ #~ msgstr "לוח דו-מצביים: ניהול גופנים"
504
+
505
+ #~ msgid "None"
506
+ #~ msgstr "ללא"
507
+
508
+ #~ msgid "Google API key is not valid!"
509
+ #~ msgstr "המפתח של גוגל אינו חוקי!"
510
+
511
+ #~ msgid "Custom fonts you uploaded are automaticly used in your website."
512
+ #~ msgstr "גופנים מיובאים אוטומטית נוספים לאתר האינטרנט שלך."
513
+
514
+ #~ msgid "Something went horribly worng. Ask the support!"
515
+ #~ msgstr "משהו הלך נורא עובדת. תשאל את התמיכה!"
languages/font-organizer.pot ADDED
@@ -0,0 +1,373 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #, fuzzy
2
+ msgid ""
3
+ msgstr ""
4
+ "Project-Id-Version: Font Organizer\n"
5
+ "POT-Creation-Date: 2016-11-19 20:38+0200\n"
6
+ "PO-Revision-Date: 2016-11-09 15:53+0200\n"
7
+ "Last-Translator: \n"
8
+ "Language-Team: \n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.8.2\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "X-Poedit-WPHeader: font-organizer.php\n"
15
+ "X-Poedit-SourceCharset: UTF-8\n"
16
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
17
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;"
18
+ "_n_noop:1,2;_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+ "X-Poedit-SearchPathExcluded-0: *.js\n"
21
+
22
+ #: classes/class-ElementsTable.php:71
23
+ msgid "Id"
24
+ msgstr ""
25
+
26
+ #: classes/class-ElementsTable.php:72
27
+ msgid "Custom Elements"
28
+ msgstr ""
29
+
30
+ #: classes/class-ElementsTable.php:73 settings.php:1010 settings.php:1027
31
+ msgid "Important"
32
+ msgstr ""
33
+
34
+ #: classes/class-ElementsTable.php:82
35
+ msgid "Yes"
36
+ msgstr ""
37
+
38
+ #: classes/class-ElementsTable.php:82
39
+ msgid "No"
40
+ msgstr ""
41
+
42
+ #: classes/class-ElementsTable.php:122
43
+ msgid "Delete"
44
+ msgstr ""
45
+
46
+ #: classes/class-ElementsTable.php:191
47
+ msgid "No custom elements found."
48
+ msgstr ""
49
+
50
+ #: font-organizer.php:137 settings.php:180 settings.php:332
51
+ msgid "Font Settings"
52
+ msgstr ""
53
+
54
+ #: helpers.php:78
55
+ msgid "Google"
56
+ msgstr ""
57
+
58
+ #: helpers.php:81
59
+ msgid "Standard"
60
+ msgstr ""
61
+
62
+ #: helpers.php:84
63
+ msgid "Custom"
64
+ msgstr ""
65
+
66
+ #: settings.php:113
67
+ msgid "<body> Font"
68
+ msgstr ""
69
+
70
+ #: settings.php:114
71
+ msgid "<h1> Font"
72
+ msgstr ""
73
+
74
+ #: settings.php:115
75
+ msgid "<h2> Font"
76
+ msgstr ""
77
+
78
+ #: settings.php:116
79
+ msgid "<h3> Font"
80
+ msgstr ""
81
+
82
+ #: settings.php:117
83
+ msgid "<h4> Font"
84
+ msgstr ""
85
+
86
+ #: settings.php:118
87
+ msgid "<h5> Font"
88
+ msgstr ""
89
+
90
+ #: settings.php:119
91
+ msgid "<h6> Font"
92
+ msgstr ""
93
+
94
+ #: settings.php:120
95
+ msgid "<p> Font"
96
+ msgstr ""
97
+
98
+ #: settings.php:121
99
+ msgid "<q> Font"
100
+ msgstr ""
101
+
102
+ #: settings.php:122
103
+ msgid "<li> Font"
104
+ msgstr ""
105
+
106
+ #: settings.php:123
107
+ msgid "<a> Font"
108
+ msgstr ""
109
+
110
+ #: settings.php:294
111
+ msgid "Google API key is not valid: "
112
+ msgstr ""
113
+
114
+ #: settings.php:297
115
+ msgid "Google API key is not set! Cannot display google fonts."
116
+ msgstr ""
117
+
118
+ #: settings.php:343
119
+ msgid "General Settings"
120
+ msgstr ""
121
+
122
+ #: settings.php:359
123
+ msgid "1. Add Fonts"
124
+ msgstr ""
125
+
126
+ #: settings.php:361
127
+ msgid ""
128
+ "Step 1: Select and add fonts to be used in your website. Select as many as "
129
+ "you wish."
130
+ msgstr ""
131
+
132
+ #: settings.php:363
133
+ msgid "You can select google or regular fonts."
134
+ msgstr ""
135
+
136
+ #: settings.php:367
137
+ msgid "Available Fonts"
138
+ msgstr ""
139
+
140
+ #: settings.php:374
141
+ msgid "Use This Font"
142
+ msgstr ""
143
+
144
+ #: settings.php:385
145
+ msgid "2. Custom Fonts"
146
+ msgstr ""
147
+
148
+ #: settings.php:387
149
+ msgid ""
150
+ "Step 2: Upload custom fonts to be used in your website. Here too, you can "
151
+ "upload as many as you wish."
152
+ msgstr ""
153
+
154
+ #: settings.php:391
155
+ msgid "Font Name"
156
+ msgstr ""
157
+
158
+ #: settings.php:395
159
+ msgid "Font File"
160
+ msgstr ""
161
+
162
+ #: settings.php:398
163
+ msgid "Accepted Font Format : "
164
+ msgstr ""
165
+
166
+ #: settings.php:405
167
+ msgid "Upload"
168
+ msgstr ""
169
+
170
+ #: settings.php:416
171
+ msgid "3. Known Elements Settings"
172
+ msgstr ""
173
+
174
+ #: settings.php:419
175
+ msgid ""
176
+ "Step 3: For each element you can assign a font you have added in step 1 & 2."
177
+ msgstr ""
178
+
179
+ #: settings.php:420
180
+ msgid "Note: "
181
+ msgstr ""
182
+
183
+ #: settings.php:420
184
+ msgid "Custom fonts you uploaded are automatically used in your website."
185
+ msgstr ""
186
+
187
+ #: settings.php:436
188
+ msgid "4. Custom Elements Settings"
189
+ msgstr ""
190
+
191
+ #: settings.php:439
192
+ msgid ""
193
+ "Step 4: Assign font that you have added to your website to custom elements."
194
+ msgstr ""
195
+
196
+ #: settings.php:443 settings.php:477
197
+ msgid "Font"
198
+ msgstr ""
199
+
200
+ #: settings.php:447
201
+ msgid "Custom Element"
202
+ msgstr ""
203
+
204
+ #: settings.php:450
205
+ msgid ""
206
+ "Custom elements can be seperated by commas to allow multiple elements. "
207
+ "Example: #myelementid, .myelementclass, .myelementclass .foo, etc."
208
+ msgstr ""
209
+
210
+ #: settings.php:461
211
+ msgid "Apply Custom Elements"
212
+ msgstr ""
213
+
214
+ #: settings.php:472
215
+ msgid "5. Manage Fonts"
216
+ msgstr ""
217
+
218
+ #: settings.php:478
219
+ msgid "-- Select Font --"
220
+ msgstr ""
221
+
222
+ #: settings.php:487
223
+ msgid "Source"
224
+ msgstr ""
225
+
226
+ #: settings.php:491
227
+ msgid "Urls"
228
+ msgstr ""
229
+
230
+ #: settings.php:523
231
+ msgid "Thank you"
232
+ msgstr ""
233
+
234
+ #: settings.php:528
235
+ msgid ""
236
+ "Thank you for using an <a href=\"http://hivewebstudios.com\" target=\"_blank"
237
+ "\">Hive</a> plugin! We 5 star you already, so why don't you <a href="
238
+ "\"https://wordpress.org/support/plugin/font-organizer/reviews/?rate=5#new-"
239
+ "post\" target=\"_blank\">5 star us too</a>?<br /><br /><p>Anyway, if you "
240
+ "need anything, this may help:</p> <ul style=\"list-style-type:disc;margin: "
241
+ "0 20px;\">\n"
242
+ " <li><a href=\"http://hivewebstudios."
243
+ "com/font-organizer#faqs\" target=\"_blank\">FAQ</a></li>\n"
244
+ " <li><a href=\"https://wordpress.org/"
245
+ "support/plugin/font-organizer/reviews/\" target=\"_blank\">Support Forums</"
246
+ "a></li>\n"
247
+ " <li><a href=\"http://hivewebstudios."
248
+ "com/font-organizer\" target=\"_blank\">Contact us</a></li>\n"
249
+ " <li><a href=\"https://www.facebook."
250
+ "com/hivewp\" target=\"_blank\">Hive Facebook page</a></li>\n"
251
+ " </ul>"
252
+ msgstr ""
253
+
254
+ #: settings.php:546 settings.php:573 settings.php:588 settings.php:607
255
+ msgid "Session ended, please try again."
256
+ msgstr ""
257
+
258
+ #: settings.php:552
259
+ msgid "Font name is empty or invalid."
260
+ msgstr ""
261
+
262
+ #: settings.php:557
263
+ msgid "Font file is not selected."
264
+ msgstr ""
265
+
266
+ #: settings.php:564
267
+ msgid "Font file is not valid."
268
+ msgstr ""
269
+
270
+ #: settings.php:579
271
+ msgid "Usable font is empty or invalid."
272
+ msgstr ""
273
+
274
+ #: settings.php:594
275
+ msgid "Custom elements is empty or invalid."
276
+ msgstr ""
277
+
278
+ #: settings.php:613
279
+ msgid "Something went horribly wrong. Ask the support!"
280
+ msgstr ""
281
+
282
+ #: settings.php:689
283
+ msgid "Custom elements added to your website!"
284
+ msgstr ""
285
+
286
+ #: settings.php:697
287
+ msgid "Font can now be used in your website!"
288
+ msgstr ""
289
+
290
+ #: settings.php:705
291
+ msgid "Font deleted from your website!"
292
+ msgstr ""
293
+
294
+ #: settings.php:713
295
+ msgid "The file has been uploaded!"
296
+ msgstr ""
297
+
298
+ #: settings.php:721
299
+ msgid "Error uploading the file: "
300
+ msgstr ""
301
+
302
+ #: settings.php:729
303
+ msgid "Error adding font to website fonts: "
304
+ msgstr ""
305
+
306
+ #: settings.php:737
307
+ msgid "Error deleting font: "
308
+ msgstr ""
309
+
310
+ #: settings.php:745
311
+ msgid "Failed to open or create the css file. Check for permissions."
312
+ msgstr ""
313
+
314
+ #: settings.php:787
315
+ msgid "Google API Key"
316
+ msgstr ""
317
+
318
+ #: settings.php:794
319
+ msgid "Show Font Family Preview"
320
+ msgstr ""
321
+
322
+ #: settings.php:804
323
+ msgid "Access Settings Role"
324
+ msgstr ""
325
+
326
+ #: settings.php:916
327
+ msgid "This is the general settings for the site."
328
+ msgstr ""
329
+
330
+ #: settings.php:935
331
+ #, php-format
332
+ msgid ""
333
+ "To get all the fonts, Google requires the mandatory use of an API key, get "
334
+ "one from <a href=\"%s\" target=\"_blank\">HERE</a>"
335
+ msgstr ""
336
+
337
+ #: settings.php:959
338
+ msgid "Include Font Family Preview"
339
+ msgstr ""
340
+
341
+ #: settings.php:961
342
+ msgid "Show font preview when listing the fonts (might be slow)"
343
+ msgstr ""
344
+
345
+ #: settings.php:1013 settings.php:1030
346
+ msgid "Include !important to this element to always apply."
347
+ msgstr ""
348
+
349
+ #: settings.php:1042
350
+ msgid "Default"
351
+ msgstr ""
352
+
353
+ #. Plugin Name of the plugin/theme
354
+ msgid "Font Organizer"
355
+ msgstr ""
356
+
357
+ #. Plugin URI of the plugin/theme
358
+ msgid "https://wordpress.org/plugins/font-organizer/"
359
+ msgstr ""
360
+
361
+ #. Description of the plugin/theme
362
+ msgid ""
363
+ "Font Organizer is the complete solution for font implementation in "
364
+ "WordPress websites."
365
+ msgstr ""
366
+
367
+ #. Author of the plugin/theme
368
+ msgid "Hive"
369
+ msgstr ""
370
+
371
+ #. Author URI of the plugin/theme
372
+ msgid "https://hivewebstudios.com"
373
+ msgstr ""
readme.txt ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Font Organizer ===
2
+ Contributors: hivewebstudios,basaar,yardensade
3
+ Tags: fonts,google fonts,upload font,font,google
4
+ Requires at least: 3.0.1
5
+ Tested up to: 4.6.1
6
+ Stable tag: 1.0.0
7
+ License: GPLv2 or later
8
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
+
10
+ Font Organizer is the complete solution for font implementation including uploading custom fonts and using google fonts in WordPress websites.
11
+
12
+ == Description ==
13
+
14
+ Font Organizer is the complete solution for font implementation including uploading custom fonts and using google fonts in WordPress websites.
15
+
16
+ The plugin is intended for both developers and regular users in order to easily add native, google and custom fonts then assign
17
+ them to different elements in your website effortlessly.
18
+
19
+ Want to find out more? go to [our website](https://hivewebstudios.com/ "HiveWebStudios website") and find out more from us.
20
+
21
+ == Installation ==
22
+ Just download & install the plugin from your wordpress site. Or
23
+
24
+ 1. Download the plugin from here.
25
+
26
+ 2. Upload the plugin files to the `/wp-content/plugins/font-organizer` directory.
27
+
28
+ 3. Activate the plugin through the 'Plugins' screen in your WordPress site.
29
+
30
+ 4. Use the Settings->Font Settings screen to configure the plugin and follow the steps.
31
+
32
+ == Frequently Asked Questions ==
33
+
34
+ Q: What is API key, and why do I need it?
35
+
36
+ A: API key is a special key made by google in order to let users view their full list of fonts and use them in the plugin.
37
+ Without it the entire function of google fonts will not work.
38
+
39
+ Q: How do I create API key for the plugin?
40
+
41
+ A: Inside the plugin click on "HERE" at Settings->Font Settings->General Settings->Google API Key.
42
+ Open the Credentials page link. Select "Create a project".
43
+ Give the project a name, any name that makes sense to you is ok, then press OK.
44
+ Click on "Create credentials" > "API key".
45
+ There you go, google generated a brand new API key for you.
46
+ Copy the entire key and paste it on the designated place in the plugin settings.
47
+
48
+ Q: What the option "Show Font Family Preview" means?
49
+
50
+ A: When selecting fonts in section 1, you will see a lot of different fonts, ticking this option will let you to actually
51
+ see example of the font you are about to use.
52
+ Due to the need of loading each font example from google, this option will slow down the performance of the plugin page.
53
+
54
+ Q: What the option "Access Settings Role" means?
55
+
56
+ A: We wanted to give you the option to decide which roles in your wordpress website are allowed to use the plugin, so you may or may not allow other users with access to the website the ability to use the plugin.
57
+
58
+ == Screenshots ==
59
+ 1.Choosing Google & uploading fonts in just 1 step.
60
+ 2.Assigning the fonts you have chosen to various elements in your website.
61
+ 3.Assigning the fonts you have chosen to your own elements in your website & managing all your fonts.
62
+
63
+ 4.General settings & role restictions.
64
+ == Changelog ==
65
+
66
+ = 1.0.0 =
67
+ * Plugin publish initial release.
68
+
69
+ == Upgrade Notice ==
settings.php ADDED
@@ -0,0 +1,1443 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class FoSettingsPage
3
+ {
4
+ /**
5
+ * Holds the option values for the general section.
6
+ */
7
+ private $general_options;
8
+
9
+ /**
10
+ * Holds the option values for the elements section.
11
+ */
12
+ private $elements_options;
13
+
14
+ /**
15
+ * Holds all the fonts available.
16
+ * An Objects array that contains the information on each font.
17
+ */
18
+ private $available_fonts;
19
+
20
+ /**
21
+ * Holds all the usable to be used in the website from available fonts.
22
+ * An Objects array that contains the information on each font.
23
+ */
24
+ private $usable_fonts;
25
+
26
+ /**
27
+ * Holds all the usable fonts from the database.
28
+ * An Objects array that contains the information on each font.
29
+ */
30
+ private $usable_fonts_db;
31
+
32
+ /**
33
+ * Holds the known fonts available.
34
+ * An Objects array that contains the information on each font.
35
+ */
36
+ private $known_fonts;
37
+
38
+ /**
39
+ * Holds the custom fonts available.
40
+ * An Objects array that contains the information on each font.
41
+ */
42
+ private $custom_fonts;
43
+
44
+ /**
45
+ * Holds the google fonts available.
46
+ * An Objects array that contains the information on each font.
47
+ */
48
+ private $google_fonts;
49
+
50
+ /**
51
+ * Holds the number of google fonts to load per request
52
+ */
53
+ private $fonts_per_link;
54
+
55
+ /**
56
+ * Holds the list of the supported font files for this settings.
57
+ */
58
+ private $supported_font_files;
59
+
60
+ /**
61
+ * Holds the error, if any, recieved from uploading a font.
62
+ */
63
+ private $recent_error;
64
+
65
+ /**
66
+ * Holds the known elements id and title to select a font for.
67
+ */
68
+ private $elements;
69
+
70
+ /**
71
+ * Holds the value if it should include font link (aka include google fonts for the settings page).
72
+ * If set to false. loads only the usable fonts.
73
+ */
74
+ private $include_font_link;
75
+
76
+ /**
77
+ * Holds a list of all the custom elements from the database.
78
+ */
79
+ private $custom_elements;
80
+
81
+ /**
82
+ * The selected font to manage in last step.
83
+ */
84
+ private $selected_manage_font;
85
+
86
+ /**
87
+ * Should create a css file (override if exists) based on recent actions made.
88
+ */
89
+ private $should_create_css;
90
+
91
+ /**
92
+ * Is the current user admin or not.
93
+ */
94
+ private $is_admin;
95
+
96
+ /**
97
+ * Start up
98
+ */
99
+ public function __construct()
100
+ {
101
+ require_once FO_ABSPATH . 'classes/class-ElementsTable.php';
102
+
103
+ add_action( 'admin_menu', array( $this, 'add_plugin_page' ) );
104
+ add_action( 'admin_init', array( $this, 'page_init' ) );
105
+
106
+ $this->fonts_per_link = 150;
107
+ $this->supported_font_files = array('.woff', '.woff2', '.ttf','.otf');
108
+ $this->custom_fonts = array();
109
+ $this->available_fonts = array();
110
+ $this->google_fonts = array();
111
+ $this->should_create_css = false;
112
+ $this->is_admin = current_user_can('manage_options');
113
+ $this->elements = array('body_font' => __('<body> Font', 'font-organizer'),
114
+ 'h1_font' => __('<h1> Font', 'font-organizer'),
115
+ 'h2_font' => __('<h2> Font', 'font-organizer'),
116
+ 'h3_font' => __('<h3> Font', 'font-organizer'),
117
+ 'h4_font' => __('<h4> Font', 'font-organizer'),
118
+ 'h5_font' => __('<h5> Font', 'font-organizer'),
119
+ 'h6_font' => __('<h6> Font', 'font-organizer'),
120
+ 'p_font' => __('<p> Font', 'font-organizer'),
121
+ 'q_font' => __('<q> Font', 'font-organizer'),
122
+ 'li_font' => __('<li> Font', 'font-organizer'),
123
+ 'a_font' => __('<a> Font', 'font-organizer'),
124
+ );
125
+
126
+ // An upload is made. Upload the file and proccess it.
127
+ if (isset($_POST['submit_upload_font'])){
128
+ if($args = $this->validate_upload()){
129
+ $this->upload_file($args);
130
+ }else{
131
+ add_action( 'admin_notices', array($this, 'upload_failed_admin_notice') );
132
+ }
133
+ }
134
+
135
+ if (isset($_POST['submit_usable_font'])){
136
+ if($args = $this->validate_add_usable()){
137
+ $this->use_font($args);
138
+ }else{
139
+ add_action( 'admin_notices', array($this, 'use_font_failed_admin_notice') );
140
+ }
141
+ }
142
+
143
+ if (isset($_POST['delete_usable_font'])){
144
+ if($args = $this->validate_delete_usable()){
145
+ $this->delete_font($args);
146
+ $this->should_create_css = true;
147
+ }else{
148
+ add_action( 'admin_notices', array($this, 'delete_font_failed_admin_notice') );
149
+ }
150
+ }
151
+
152
+ if(isset($_POST['submit_custom_elements'])){
153
+ if($args = $this->validate_custom_elements()){
154
+ $this->add_custom_elements($args);
155
+ $this->should_create_css = true;
156
+ }else{
157
+ add_action( 'admin_notices', array($this, 'add_custom_elements_failed_admin_notice') );
158
+ }
159
+ }
160
+ }
161
+
162
+ /**
163
+ * Register all the required scripts for this page.
164
+ */
165
+ public function register_scripts() {
166
+ wp_enqueue_script( 'jquery-ui-core' );
167
+ wp_enqueue_script( 'jquery-ui-autocomplete' );
168
+ wp_enqueue_script( 'fo-settings-script', plugins_url( 'assets/js/settings.js', __FILE__ ) , array( 'jquery' ) );
169
+ wp_enqueue_style( 'fo-settings-css', plugins_url( 'assets/css/settings.css', __FILE__ ) );
170
+ }
171
+
172
+ /**
173
+ * Add options settings page in the wordpress settings.
174
+ */
175
+ public function add_plugin_page()
176
+ {
177
+ // This page will be under "Settings"
178
+ $hook = add_options_page(
179
+ 'Settings Admin',
180
+ __('Font Settings', 'font-organizer'),
181
+ 'manage_fonts',
182
+ 'font-setting-admin',
183
+ array( $this, 'create_font_settings_page' )
184
+ );
185
+
186
+ add_action( 'load-' . $hook, array( $this, 'init_page' ) );
187
+ add_action( 'load-' . $hook, array( $this, 'register_scripts' ) );
188
+ add_action( 'load-' . $hook, array( $this, 'create_css_file' ) );
189
+ add_filter( 'option_page_capability_fo_general_options', array($this, 'options_capability') );
190
+ add_filter( 'option_page_capability_fo_elements_options', array($this, 'options_capability') );
191
+ }
192
+
193
+ // Allows to tell wordpress that the options named fo_general_options & fo_elements_options
194
+ // can be saved by manage_fonts capability and by any role with this capability.
195
+ public function options_capability( $cap ) {
196
+ return 'manage_fonts';
197
+ }
198
+
199
+ public function init_page(){
200
+ $this->init();
201
+ }
202
+
203
+ public function create_css_file(){
204
+ global $css_full_file_path;
205
+ global $css_directory_path;
206
+
207
+ if((!isset($_GET['settings-updated']) || !$_GET['settings-updated']) && !$this->should_create_css){
208
+ return;
209
+ }
210
+
211
+ $content = "/* This Awesome CSS file was created by Font Orgranizer from Hive :) */\n\n";
212
+ $custom_fonts_content = '';
213
+ $google_fonts = array();
214
+ foreach ($this->usable_fonts as $key => $usable_font) {
215
+ switch ($usable_font->kind) {
216
+ case 'custom':
217
+ $url = $usable_font->files->regular;
218
+ $custom_fonts_content .= "
219
+ @font-face {
220
+ font-family: '" . $usable_font->family . "';
221
+ src: url('" . $url . "') format('" . fo_get_font_format($url) . "');
222
+ font-weight: normal;
223
+ font-style: normal;
224
+ }\n";
225
+ break;
226
+ case 'webfonts#webfont': // Google font
227
+ $google_fonts[] = str_replace(' ', '+', $usable_font->family);
228
+ case 'regular':
229
+ default:
230
+ break;
231
+ }
232
+ }
233
+
234
+ // Add Google fonts to the css. MUST BE FIRST.
235
+ if(!empty($google_fonts)){
236
+ // We are assuming not to much google fonts. If it is, we need to split the request.
237
+ // $content .= "<link href='http://fonts.googleapis.com/css?family=". implode("|", $google_fonts) . "' rel='stylesheet' type='text/css'>\n";
238
+ $content .= "@import url('http://fonts.googleapis.com/css?family=". implode("|", $google_fonts) . "');\n";
239
+ }
240
+
241
+ // Add the custom fonts css that was created before.
242
+ $content .= $custom_fonts_content;
243
+
244
+ // Add the known elements css.
245
+ foreach ($this->elements_options as $key => $value) {
246
+ if(strpos($key, 'important') || !$value)
247
+ continue;
248
+
249
+ $strip_key = str_replace('_font', '', $key);
250
+ $important = $this->elements_options[$key . '_important'];
251
+ $content .= sprintf("%s { font-family: '%s'%s; }\n", $strip_key, $value, $important ? '!important' : '');
252
+ }
253
+
254
+ // Add custom elements css.
255
+ foreach ($this->custom_elements as $custom_element_db) {
256
+ $content .= sprintf("%s { font-family: '%s'%s; }\n", $custom_element_db->custom_elements, $custom_element_db->name, $custom_element_db->important ? '!important' : '');
257
+ }
258
+
259
+ if($content){
260
+
261
+ // Make sure directory exists.
262
+ if(!is_dir($css_directory_path))
263
+ mkdir($css_directory_path, 0755, true);
264
+
265
+ $fhandler = fopen($css_full_file_path, "w");
266
+ if(!$fhandler){
267
+ add_action( 'admin_notices', array($this, 'generate_css_failed_admin_notice') );
268
+ return;
269
+ }
270
+
271
+ fwrite($fhandler, $content);
272
+ fclose($fhandler);
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Initialize the class private fields. Options, Google fonts list, known fonts, available fonts,
278
+ * and all the usable fonts.
279
+ */
280
+ public function init(){
281
+ $this->general_options = get_option( 'fo_general_options' );
282
+ $this->elements_options = get_option( 'fo_elements_options' );
283
+ $this->custom_elements_table = new ElementsTable();
284
+
285
+ $this->include_font_link = isset( $this->general_options['include_font_link'] ) && $this->general_options['include_font_link'];
286
+
287
+ if(isset($this->general_options['google_key']) && $this->general_options['google_key']){
288
+ // Add Google fonts.
289
+ set_time_limit(0);
290
+ $response = wp_remote_get("https://www.googleapis.com/webfonts/v1/webfonts?sort=alpha&key=" . $this->general_options['google_key']);
291
+ if( wp_remote_retrieve_response_code( $response ) == 200){
292
+ $this->google_fonts = json_decode(wp_remote_retrieve_body($response))->items;
293
+ }else{
294
+ add_settings_error('google_key', '', __('Google API key is not valid: ', 'font-organizer') . wp_remote_retrieve_response_message($response), 'error');
295
+ }
296
+ }else{
297
+ add_settings_error('google_key', '', __('Google API key is not set! Cannot display google fonts.', 'font-organizer'), 'error');
298
+ }
299
+
300
+ // Add known fonts.
301
+ $this->known_fonts = $this->get_known_fonts_array();
302
+
303
+ $this->available_fonts = array_merge($this->available_fonts, $this->google_fonts, $this->known_fonts );
304
+
305
+ // Get all usable fonts and add them to a list.
306
+ $this->load_usable_fonts();
307
+ $this->load_custom_elements();
308
+ }
309
+
310
+ /**
311
+ * Options page callback
312
+ */
313
+ public function create_font_settings_page(){
314
+ if(isset($_GET['manage_font_id'])){
315
+ foreach ($this->usable_fonts_db as $font_db) {
316
+ if(intval($_GET['manage_font_id']) == $font_db->id){
317
+ $this->selected_manage_font = $this->usable_fonts[$font_db->name];
318
+ $this->custom_elements_table->prepare_items_by_font($this->custom_elements, $font_db->id);
319
+ break;
320
+ }
321
+ }
322
+ }
323
+
324
+ // Load the google fonts if selected or if not specified. else load just whats usable.
325
+ if($this->include_font_link)
326
+ fo_print_links($this->google_fonts, $this->fonts_per_link);
327
+ else
328
+ fo_print_links($this->usable_fonts, $this->fonts_per_link);
329
+
330
+ ?>
331
+ <div class="wrap">
332
+ <h1><?php _e('Font Settings', 'font-organizer'); ?></h1>
333
+
334
+ <div id="poststuff">
335
+ <div id="post-body" class="metabox-holder columns-2">
336
+
337
+ <!-- main content -->
338
+ <div id="post-body-content">
339
+
340
+ <!-- General Settings Section -->
341
+ <div class="postbox">
342
+ <a name="step1"></a>
343
+ <h2 class="hndle ui-sortable-handle" style="cursor:default;"><span><?php _e('General Settings', 'font-organizer'); ?></span></h2>
344
+ <div class="inside">
345
+ <form method="post" action="options.php">
346
+ <?php
347
+ // This prints out all hidden setting fields
348
+ settings_fields( 'fo_general_options' );
349
+ fo_do_settings_section( 'font-setting-admin', 'setting_general' );
350
+ submit_button();
351
+ ?>
352
+ </form>
353
+ </div>
354
+ </div>
355
+
356
+ <!-- Add Google & Regular Fonts To Website Section -->
357
+ <div class="postbox">
358
+ <a name="step2"></a>
359
+ <h2 class="hndle ui-sortable-handle" style="cursor:default;"><span><?php _e('1. Add Fonts', 'font-organizer'); ?></span></h2>
360
+ <div class="inside">
361
+ <span><?php _e('Step 1: Select and add fonts to be used in your website. Select as many as you wish.', 'font-organizer'); ?></span>
362
+ <br />
363
+ <span><?php _e('You can select google or regular fonts.', 'font-organizer'); ?></span>
364
+ <form action="" id="add_usable_font_form" name="add_usable_font_form" method="post">
365
+ <table class="form-table">
366
+ <tr>
367
+ <th scope="row"><?php _e('Available Fonts', 'font-organizer'); ?></th>
368
+ <td><?php $this->print_available_fonts_list('usable_font'); ?></td>
369
+ </tr>
370
+ <tr>
371
+ <th scope="row"></th>
372
+ <td>
373
+ <?php wp_nonce_field( 'add_usable_font', 'add_usable_font_nonce' ); ?>
374
+ <input type="submit" name="submit_usable_font" id="submit_usable_font" class="button-primary" value="<?php _e('Use This Font', 'font-organizer'); ?>" />
375
+ </td>
376
+ </tr>
377
+ </table>
378
+ </form>
379
+ </div>
380
+ </div>
381
+
382
+ <!-- Add Custom Fonts To Website Section -->
383
+ <div class="postbox">
384
+ <a name="step3"></a>
385
+ <h2 class="hndle ui-sortable-handle" style="cursor:default;"><span><?php _e('2. Custom Fonts', 'font-organizer'); ?></span></h2>
386
+ <div class="inside">
387
+ <span><?php _e('Step 2: Upload custom fonts to be used in your website. Here too, you can upload as many as you wish.', 'font-organizer'); ?></span>
388
+ <form action="" id="add_font_form" name="add_font_form" method="post" enctype="multipart/form-data">
389
+ <table class="form-table">
390
+ <tr>
391
+ <th scope="row"><?php _e('Font Name', 'font-organizer'); ?></th>
392
+ <td><input type="text" id="font_name" name="font_name" value="" maxlength="20" class="required" /></td>
393
+ </tr>
394
+ <tr>
395
+ <th scope="row"><?php _e('Font File', 'font-organizer'); ?></th>
396
+ <td>
397
+ <input type="file" id="font_file" name="font_file" value="" class="required" accept="<?php echo join(',',$this->supported_font_files); ?>" /><br/>
398
+ <em><?php echo __('Accepted Font Format : ', 'font-organizer') . '<span style="direction: ltr">' . join(', ',$this->supported_font_files) . '</span>'; ?></em><br/>
399
+ </td>
400
+ </tr>
401
+ <tr>
402
+ <th scope="row"></th>
403
+ <td>
404
+ <?php wp_nonce_field( 'add_custom_font', 'add_custom_font_nonce' ); ?>
405
+ <input type="submit" name="submit_upload_font" id="submit_upload_font" class="button-primary" value="<?php _e('Upload', 'font-organizer'); ?>" />
406
+ </td>
407
+ </tr>
408
+ </table>
409
+ </form>
410
+ </div>
411
+ </div>
412
+
413
+ <!-- Assign Fonts To Known Elements Section -->
414
+ <div class="postbox">
415
+ <a name="step4"></a>
416
+ <h2 class="hndle ui-sortable-handle" style="cursor:default;"><span><?php _e('3. Known Elements Settings', 'font-organizer'); ?></span></h2>
417
+ <div class="inside">
418
+
419
+ <span><?php _e('Step 3: For each element you can assign a font you have added in step 1 & 2.', 'font-organizer'); ?></span>
420
+ <p><strong><?php _e('Note: ', 'font-organizer'); ?></strong><?php _e('Custom fonts you uploaded are automatically used in your website.', 'font-organizer'); ?></p>
421
+
422
+ <form method="post" action="options.php">
423
+ <?php
424
+ // This prints out all hidden setting fields
425
+ settings_fields( 'fo_elements_options' );
426
+ fo_do_settings_section( 'font-setting-admin', 'setting_elements' );
427
+ submit_button();
428
+ ?>
429
+ </form>
430
+ </div>
431
+ </div>
432
+
433
+ <!-- Assign Fonts To Custom Elements Section -->
434
+ <div class="postbox">
435
+ <a name="step5"></a>
436
+ <h2 class="hndle ui-sortable-handle" style="cursor:default;"><span><?php _e('4. Custom Elements Settings', 'font-organizer'); ?></span></h2>
437
+ <div class="inside">
438
+
439
+ <span><?php _e('Step 4: Assign font that you have added to your website to custom elements.', 'font-organizer'); ?></span>
440
+ <form action="" id="add_custom_elements_form" name="add_custom_elements_form" method="post">
441
+ <table class="form-table">
442
+ <tr>
443
+ <th scope="row"><?php _e('Font', 'font-organizer'); ?></th>
444
+ <td><?php $this->print_custom_elements_usable_fonts_list('font_id'); ?></td>
445
+ </tr>
446
+ <tr>
447
+ <th scope="row"><?php _e('Custom Element', 'font-organizer'); ?></th>
448
+ <td>
449
+ <textarea id="custom_elements" name="custom_elements" style="width: 100%" rows="2"></textarea>
450
+ <em><?php _e('Custom elements can be seperated by commas to allow multiple elements. Example: #myelementid, .myelementclass, .myelementclass .foo, etc.', 'font-organizer'); ?></em>
451
+ </td>
452
+ </tr>
453
+ <tr>
454
+ <th></th>
455
+ <td><?php $this->print_is_important_checkbox('important'); ?></td>
456
+ </tr>
457
+ <tr>
458
+ <th scope="row"></th>
459
+ <td>
460
+ <?php wp_nonce_field( 'add_custom_elements', 'add_custom_elements_nonce' ); ?>
461
+ <input type="submit" name="submit_custom_elements" id="submit_custom_elements" class="button-primary" value="<?php _e('Apply Custom Elements', 'font-organizer'); ?>" />
462
+ </td>
463
+ </tr>
464
+ </table>
465
+ </form>
466
+ </div>
467
+ </div>
468
+
469
+ <!-- Manage Used fonts Section -->
470
+ <div class="postbox">
471
+ <a name="step6"></a>
472
+ <h2 class="hndle ui-sortable-handle" style="cursor:default;"><span><?php _e('5. Manage Fonts', 'font-organizer'); ?></span></h2>
473
+ <div class="inside">
474
+ <form action="#step6" id="select_font_form" name="select_font_form" method="get">
475
+ <table class="form-table">
476
+ <tr>
477
+ <th scope="row"><?php _e('Font', 'font-organizer'); ?></th>
478
+ <td><?php $this->print_custom_elements_usable_fonts_list('manage_font_id', __('-- Select Font --', 'font-organizer')); ?></td>
479
+ </tr>
480
+ </table>
481
+ <input type="hidden" name="page" value="<?php echo wp_unslash( $_REQUEST['page'] ); ?>">
482
+ </form>
483
+ <?php if($this->selected_manage_font): ?>
484
+ <hr/>
485
+ <table class="form-table">
486
+ <tr>
487
+ <th scope="row"><?php _e('Source', 'font-organizer'); ?></th>
488
+ <td><span><?php fo_print_source($this->selected_manage_font->kind); ?></span></td>
489
+ </tr>
490
+ <tr>
491
+ <th scope="row"><?php _e('Urls', 'font-organizer'); ?></th>
492
+ <td>
493
+ <span>
494
+ <?php
495
+ $urls = explode('|', $this->selected_manage_font->files->regular);
496
+ foreach($urls as $url)
497
+ echo $url, '<br>';
498
+ ?>
499
+ </span>
500
+ </td>
501
+ </tr>
502
+ </table>
503
+ <div class="wp-table-fo-container">
504
+ <form id="custom_elements-filter" method="get" action="#step6">
505
+ <input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
506
+ <input type="hidden" name="manage_font_id" value="<?php echo $_GET['manage_font_id']; ?>">
507
+ <?php $this->custom_elements_table->display(); ?>
508
+ </form>
509
+ </div>
510
+ <?php
511
+ endif;
512
+ ?>
513
+ </div>
514
+ </div>
515
+
516
+ </div>
517
+
518
+ <!-- sidebar -->
519
+ <div id="postbox-container-1" class="postbox-container">
520
+ <div class="meta-box-sortables">
521
+ <div class="postbox">
522
+ <h2>
523
+ <span><?php esc_attr_e('Thank you', 'font-organizer'); ?></span>
524
+ </h2>
525
+
526
+ <div class="inside">
527
+ <p><?php _e(
528
+ 'Thank you for using an <a href="http://hivewebstudios.com" target="_blank">Hive</a> plugin! We 5 star you already, so why don\'t you <a href="https://wordpress.org/support/plugin/font-organizer/reviews/?rate=5#new-post" target="_blank">5 star us too</a>?' . '<br /><br />' . '<p>Anyway, if you need anything, this may help:</p> <ul style="list-style-type:disc;margin: 0 20px;">
529
+ <li><a href="http://hivewebstudios.com/font-organizer#faqs" target="_blank">FAQ</a></li>
530
+ <li><a href="https://wordpress.org/support/plugin/font-organizer/reviews/" target="_blank">Support Forums</a></li>
531
+ <li><a href="http://hivewebstudios.com/font-organizer" target="_blank">Contact us</a></li>
532
+ <li><a href="https://www.facebook.com/hivewp" target="_blank">Hive Facebook page</a></li>
533
+ </ul>' ,
534
+ 'font-organizer'
535
+ ); ?></p>
536
+ </div>
537
+ </div>
538
+ </div>
539
+ </form>
540
+ </div>
541
+ <?php
542
+ }
543
+
544
+ private function validate_upload(){
545
+ if(!isset( $_POST['add_custom_font_nonce'] ) || !wp_verify_nonce( $_POST['add_custom_font_nonce'], 'add_custom_font' )){
546
+ $this->recent_error = __('Session ended, please try again.', 'font-organizer');
547
+ return false;
548
+ }
549
+
550
+ $args['font_name'] = sanitize_text_field( $_POST['font_name'] );
551
+ if(!$args['font_name']){
552
+ $this->recent_error = __('Font name is empty or invalid.', 'font-organizer');
553
+ return false;
554
+ }
555
+
556
+ if(!isset($_FILES['font_file'])){
557
+ $this->recent_error = __('Font file is not selected.', 'font-organizer');
558
+ return false;
559
+ }
560
+
561
+ $args['font_file'] = $_FILES['font_file'];
562
+ $args['font_file_name'] = sanitize_file_name( $args['font_file']['name'] );
563
+ if(!$args['font_file_name']){
564
+ $this->recent_error = __('Font file is not valid.', 'font-organizer');
565
+ return false;
566
+ }
567
+
568
+ return $args;
569
+ }
570
+
571
+ private function validate_add_usable(){
572
+ if(!isset( $_POST['add_usable_font_nonce'] ) || !wp_verify_nonce( $_POST['add_usable_font_nonce'], 'add_usable_font' )){
573
+ $this->recent_error = __('Session ended, please try again.', 'font-organizer');
574
+ return false;
575
+ }
576
+
577
+ $args['usable_font'] = sanitize_text_field( $_POST['usable_font'] );
578
+ if(!$args['usable_font']){
579
+ $this->recent_error = __('Usable font is empty or invalid.', 'font-organizer');
580
+ return false;
581
+ }
582
+
583
+ return $args;
584
+ }
585
+
586
+ private function validate_custom_elements(){
587
+ if(!isset( $_POST['add_custom_elements_nonce'] ) || !wp_verify_nonce( $_POST['add_custom_elements_nonce'], 'add_custom_elements' )){
588
+ $this->recent_error = __('Session ended, please try again.', 'font-organizer');
589
+ return false;
590
+ }
591
+
592
+ $args['custom_elements'] = sanitize_text_field( $_POST['custom_elements'] );
593
+ if(!$args['custom_elements']){
594
+ $this->recent_error = __('Custom elements is empty or invalid.', 'font-organizer');
595
+ return false;
596
+ }
597
+
598
+ $args['important'] = $_POST['important'] ? 1 : 0;
599
+
600
+ $args['font_id'] = $_POST['font_id'];
601
+
602
+ return $args;
603
+ }
604
+
605
+ private function validate_delete_usable(){
606
+ if(!isset( $_POST['delete_usable_font_nonce'] ) || !wp_verify_nonce( $_POST['delete_usable_font_nonce'], 'delete_usable_font' )){
607
+ $this->recent_error = __('Session ended, please try again.', 'font-organizer');
608
+ return false;
609
+ }
610
+
611
+ $args['font_name'] = sanitize_text_field( $_POST['font_name'] );
612
+ if(!$args['font_name']){
613
+ $this->recent_error = __('Something went horribly wrong. Ask the support!', 'font-organizer');
614
+ return false;
615
+ }
616
+
617
+ return $args;
618
+ }
619
+
620
+ private function upload_file($args = array()){
621
+
622
+ $movefile = fo_upload_file($args['font_file'], array($this, 'fo_upload_dir'));
623
+
624
+ if ( $movefile && ! isset( $movefile['error'] ) ) {
625
+ add_action( 'admin_notices', array($this, 'upload_successfull_admin_notice') );
626
+ $this->save_usable_font_to_database($args['font_name'], $movefile['url'], true);
627
+ } else {
628
+ /**
629
+ * Error generated by _wp_handle_upload()
630
+ * @see _wp_handle_upload() in wp-admin/includes/file.php
631
+ */
632
+ $this->recent_error = $movefile['error'];
633
+ add_action( 'admin_notices', array($this, 'upload_failed_admin_notice') );
634
+ }
635
+ }
636
+
637
+ private function use_font($args = array()){
638
+ add_action( 'admin_notices', array($this, 'use_font_successfull_admin_notice') );
639
+ $this->save_usable_font_to_database($args['usable_font']);
640
+ }
641
+
642
+ private function add_custom_elements($args = array()){
643
+ add_action( 'admin_notices', array($this, 'add_custom_elements_successfull_admin_notice') );
644
+ $this->save_custom_elements_to_database($args['font_id'], $args['custom_elements'], $args['important']);
645
+ }
646
+
647
+ private function delete_font($args = array()){
648
+ add_action( 'admin_notices', array($this, 'delete_font_successfull_admin_notice') );
649
+ $this->delete_from_database($args['font_name']);
650
+ }
651
+
652
+ private function delete_from_database($name){
653
+ global $wpdb;
654
+ $table_name = $wpdb->prefix . FO_USABLE_FONTS_DATABASE;
655
+
656
+ $wpdb->delete( $table_name, array( 'name' => $name ) );
657
+ }
658
+
659
+ private function save_custom_elements_to_database($id, $custom_elements, $important){
660
+ global $wpdb;
661
+ $table_name = $wpdb->prefix . FO_ELEMENTS_DATABASE;
662
+
663
+ $wpdb->insert(
664
+ $table_name,
665
+ array(
666
+ 'font_id' => $id,
667
+ 'custom_elements' => $custom_elements,
668
+ 'important' => $important ? 1 : 0,
669
+ ));
670
+ }
671
+
672
+ private function save_usable_font_to_database($name, $url = '', $is_custom = false){
673
+ global $wpdb;
674
+ $table_name = $wpdb->prefix . FO_USABLE_FONTS_DATABASE;
675
+
676
+ $wpdb->insert(
677
+ $table_name,
678
+ array(
679
+ 'name' => $name,
680
+ 'url' => $url,
681
+ 'custom' => $is_custom ? 1 : 0,
682
+ ));
683
+ }
684
+
685
+
686
+ public function add_custom_elements_successfull_admin_notice() {
687
+ ?>
688
+ <div class="updated notice">
689
+ <p><?php _e( 'Custom elements added to your website!', 'font-organizer' ); ?></p>
690
+ </div>
691
+ <?php
692
+ }
693
+
694
+ public function use_font_successfull_admin_notice() {
695
+ ?>
696
+ <div class="updated notice">
697
+ <p><?php _e( 'Font can now be used in your website!', 'font-organizer' ); ?></p>
698
+ </div>
699
+ <?php
700
+ }
701
+
702
+ public function delete_font_successfull_admin_notice() {
703
+ ?>
704
+ <div class="updated notice">
705
+ <p><?php _e( 'Font deleted from your website!', 'font-organizer' ); ?></p>
706
+ </div>
707
+ <?php
708
+ }
709
+
710
+ public function upload_successfull_admin_notice() {
711
+ ?>
712
+ <div class="updated notice">
713
+ <p><?php _e( 'The file has been uploaded!', 'font-organizer' ); ?></p>
714
+ </div>
715
+ <?php
716
+ }
717
+
718
+ public function upload_failed_admin_notice() {
719
+ ?>
720
+ <div class="error notice">
721
+ <p><?php echo __( 'Error uploading the file: ', 'font-organizer' ) . $this->recent_error; ?></p>
722
+ </div>
723
+ <?php
724
+ }
725
+
726
+ public function use_font_failed_admin_notice() {
727
+ ?>
728
+ <div class="error notice">
729
+ <p><?php echo __( 'Error adding font to website fonts: ', 'font-organizer' ) . $this->recent_error; ?></p>
730
+ </div>
731
+ <?php
732
+ }
733
+
734
+ public function delete_font_failed_admin_notice() {
735
+ ?>
736
+ <div class="error notice">
737
+ <p><?php echo __( 'Error deleting font: ', 'font-organizer' ) . $this->recent_error; ?></p>
738
+ </div>
739
+ <?php
740
+ }
741
+
742
+ public function generate_css_failed_admin_notice() {
743
+ ?>
744
+ <div class="error notice">
745
+ <p><?php echo __( 'Failed to open or create the css file. Check for permissions.', 'font-organizer' ); ?></p>
746
+ </div>
747
+ <?php
748
+ }
749
+
750
+ /**
751
+ * Override the default upload path.
752
+ *
753
+ * @param array $dir
754
+ * @return array
755
+ */
756
+ public function fo_upload_dir( $dir ) {
757
+ return array(
758
+ 'path' => $dir['basedir'] . '/font-organizer',
759
+ 'url' => $dir['baseurl'] . '/font-organizer',
760
+ 'subdir' => '/font-organizer',
761
+ ) + $dir;
762
+ }
763
+
764
+ /**
765
+ * Register and add settings
766
+ */
767
+ public function page_init()
768
+ {
769
+ register_setting(
770
+ 'fo_general_options', // Option group
771
+ 'fo_general_options', // Option name
772
+ array( $this, 'general_sanitize' ) // Sanitize
773
+ );
774
+ register_setting(
775
+ 'fo_elements_options', // Option group
776
+ 'fo_elements_options', // Option name
777
+ array( $this, 'elements_sanitize' ) // Sanitize
778
+ );
779
+ add_settings_section(
780
+ 'setting_general', // ID
781
+ '', // Title
782
+ array( $this, 'print_general_section_info' ), // Callback
783
+ 'font-setting-admin' // Page
784
+ );
785
+ add_settings_field(
786
+ 'google_key', // ID
787
+ __('Google API Key', 'font-organizer'), // Title
788
+ array( $this, 'google_key_callback' ), // Callback
789
+ 'font-setting-admin', // Page
790
+ 'setting_general' // Section
791
+ );
792
+ add_settings_field(
793
+ 'include_font_link', // ID
794
+ __('Show Font Family Preview', 'font-organizer'), // Title
795
+ array( $this, 'include_font_link_callback' ), // Callback
796
+ 'font-setting-admin', // Page
797
+ 'setting_general' // Section
798
+ );
799
+
800
+ // If user is admin, display the permissions option.
801
+ if ($this->is_admin) {
802
+ add_settings_field(
803
+ 'permissions', // ID
804
+ __('Access Settings Role', 'font-organizer'), // Title
805
+ array( $this, 'permissions_callback' ), // Callback
806
+ 'font-setting-admin', // Page
807
+ 'setting_general' // Section
808
+ );
809
+ }
810
+
811
+ add_settings_section(
812
+ 'setting_elements', // ID
813
+ '', // Title
814
+ array( $this, 'print_elements_section_info' ), // Callback
815
+ 'font-setting-admin' // Page
816
+ );
817
+
818
+ // Add all the elements to the elements section.
819
+ foreach ($this->elements as $id => $title) {
820
+ add_settings_field(
821
+ $id, // ID
822
+ htmlspecialchars($title), // Title
823
+ array( $this, 'fonts_list_field_callback' ), // Callback
824
+ 'font-setting-admin', // Page
825
+ 'setting_elements', // Section
826
+ $id // Parameter for Callback
827
+ );
828
+
829
+ add_settings_field(
830
+ $id . '_important', // ID
831
+ '', // Title
832
+ array( $this, 'is_important_element_field_callback' ), // Callback
833
+ 'font-setting-admin', // Page
834
+ 'setting_elements', // Section
835
+ $id . '_important' // Parameter for Callback
836
+ );
837
+ }
838
+ }
839
+
840
+ /**
841
+ * Sanitize each setting field as needed
842
+ *
843
+ * @param array $input Contains all settings fields as array keys
844
+ */
845
+ public function general_sanitize( $input )
846
+ {
847
+ $new_input = array();
848
+ if( isset( $input['google_key'] ) )
849
+ $new_input['google_key'] = sanitize_text_field( $input['google_key'] );
850
+
851
+ if( !isset( $input['include_font_link'] ) )
852
+ $new_input['include_font_link'] = 0 ;
853
+ else
854
+ $new_input['include_font_link'] = $input['include_font_link'];
855
+
856
+ // Do not allow change in permissions if user is not admin.
857
+ if(!$this->is_admin)
858
+ return $new_input;
859
+
860
+ // Get the old permissions.
861
+ $this->general_options = get_option( 'fo_general_options' );
862
+ $old_permissions = isset($this->general_options['permissions']) ? $this->general_options['permissions'] : array();
863
+
864
+ // Get the new permissions.
865
+ $new_input['permissions'] = isset($input['permissions']) ? $input['permissions'] : array();
866
+ if($new_input != $old_permissions){
867
+
868
+ // Remove previus capabilities.
869
+ foreach ($old_permissions as $value) {
870
+ if($value != FO_DEFAULT_ROLE){
871
+ $prev_role = get_role($value);
872
+ $prev_role->remove_cap('manage_fonts');
873
+ }
874
+ }
875
+
876
+ // Add the new capabilities to the new roles.
877
+ foreach ($new_input['permissions'] as $value) {
878
+ $prev_role = get_role($value);
879
+ $prev_role->add_cap('manage_fonts');
880
+ }
881
+ }
882
+
883
+ return $new_input;
884
+ }
885
+
886
+ /**
887
+ * Sanitize each setting field as needed
888
+ *
889
+ * @param array $input Contains all settings fields as array keys
890
+ */
891
+ public function elements_sanitize( $input )
892
+ {
893
+ $new_input = array();
894
+ foreach ($this->elements as $id => $title) {
895
+ if( isset( $input[$id] ) ){
896
+ $new_input[$id] = sanitize_text_field( $input[$id] );
897
+ }else{
898
+ $new_input[$id] = '';
899
+ }
900
+
901
+ if( !isset( $input[$id . '_important'] ) )
902
+ $new_input[$id . '_important'] = 0 ;
903
+ else
904
+ $new_input[$id . '_important'] = intval($input[$id . '_important']);
905
+
906
+ }
907
+
908
+ return $new_input;
909
+ }
910
+
911
+ /**
912
+ * Print the Section text
913
+ */
914
+ public function print_general_section_info()
915
+ {
916
+ _e('This is the general settings for the site.', 'font-organizer');
917
+ }
918
+
919
+ /**
920
+ * Print the Section text
921
+ */
922
+ public function print_elements_section_info()
923
+ {
924
+ }
925
+
926
+ /**
927
+ * Get the settings option for google key array and print one of its values
928
+ */
929
+ public function google_key_callback()
930
+ {
931
+ echo '<span class="highlight info">';
932
+
933
+ $url = 'https://developers.google.com/fonts/docs/developer_api#acquiring_and_using_an_api_key';
934
+
935
+ echo sprintf( __( 'To get all the fonts, Google requires the mandatory use of an API key, get one from <a href="%s" target="_blank">HERE</a>', 'font-organizer' ), esc_url( $url ) );
936
+
937
+ echo '</span> <br />';
938
+
939
+ printf(
940
+ '<input type="text" id="google_key" name="fo_general_options[google_key]" value="%s" class="large-text" placeholder="Ex: AIzaSyB1I0couKSmsW1Nadr68IlJXXCaBi9wYwM" />',
941
+ isset( $this->general_options['google_key'] ) ? esc_attr( $this->general_options['google_key']) : ''
942
+ );
943
+ }
944
+
945
+ /**
946
+ * Get the settings option array and print one of its values
947
+ */
948
+ public function include_font_link_callback()
949
+ {
950
+ $checked = isset($this->general_options['include_font_link']) && $this->general_options['include_font_link'] ? 'checked="checked"' : '';
951
+ printf(
952
+ '<fieldset>
953
+ <legend class="screen-reader-text"><span>%s</span></legend>
954
+ <label for="include_font_link">
955
+ <input name="fo_general_options[include_font_link]" type="checkbox" id="include_font_link" value="1" %s>
956
+ %s
957
+ </label>
958
+ </fieldset>',
959
+ __('Include Font Family Preview', 'font-organizer'),
960
+ $checked,
961
+ __('Show font preview when listing the fonts (might be slow)', 'font-organizer')
962
+ );
963
+ }
964
+
965
+ /**
966
+ * Get the settings option array and print one of its values
967
+ */
968
+ public function permissions_callback(){
969
+ $wp_roles = new WP_Roles();
970
+ $roles = $wp_roles->get_names();
971
+ $checked_values = !isset($this->general_options['permissions']) ? array(FO_DEFAULT_ROLE) : $this->general_options['permissions'];
972
+
973
+ foreach ($roles as $role_value => $role_name) {
974
+ $checked = $role_value == 'administrator' || in_array($role_value, $checked_values) ? 'checked' : '';
975
+
976
+ echo '<p><input type="checkbox"'.disabled("administrator", $role_value, false).' name="fo_general_options[permissions][]" value="' . $role_value . '" '.$checked.'>'.translate_user_role($role_name).'</input></p>';
977
+ }
978
+ }
979
+
980
+ /**
981
+ * Prints the main fonts list.
982
+ */
983
+ public function fonts_list_field_callback($name)
984
+ {
985
+ $this->print_usable_fonts_list($name);
986
+ }
987
+
988
+ /**
989
+ * Prints the main fonts list.
990
+ */
991
+ public function is_important_element_field_callback($name)
992
+ {
993
+ $this->print_is_important_checkbox_options($name);
994
+ }
995
+
996
+ /**
997
+ * Get the settings option array and print one of its values
998
+ */
999
+ public function print_is_important_checkbox_options($name)
1000
+ {
1001
+ $checked = !isset($this->elements_options[$name]) || (isset($this->elements_options[$name]) && $this->elements_options[$name]) ? 'checked="checked"' : '';
1002
+ printf(
1003
+ '<fieldset>
1004
+ <legend class="screen-reader-text"><span>%s</span></legend>
1005
+ <label for="%s">
1006
+ <input name="fo_elements_options[%s]" type="checkbox" id="%s" value="1" %s>
1007
+ %s
1008
+ </label>
1009
+ </fieldset>',
1010
+ __('Important', 'font-organizer'),
1011
+ $name, $name, $name,
1012
+ $checked,
1013
+ __('Include !important to this element to always apply.', 'font-organizer')
1014
+ );
1015
+ }
1016
+
1017
+ public function print_is_important_checkbox($name, $checked = true)
1018
+ {
1019
+ printf(
1020
+ '<fieldset>
1021
+ <legend class="screen-reader-text"><span>%s</span></legend>
1022
+ <label for="%s">
1023
+ <input name="%s" type="checkbox" id="%s" value="1" %s>
1024
+ %s
1025
+ </label>
1026
+ </fieldset>',
1027
+ __('Important', 'font-organizer'),
1028
+ $name, $name, $name,
1029
+ checked(true, $checked, false),
1030
+ __('Include !important to this element to always apply.', 'font-organizer')
1031
+ );
1032
+ }
1033
+
1034
+ /**
1035
+ * Get the settings option array and print one of its values
1036
+ */
1037
+ private function print_usable_fonts_list($name)
1038
+ {
1039
+ $selected = isset( $this->elements_options[$name] ) ? esc_attr( $this->elements_options[$name]) : '';
1040
+ echo '<select id="'.$name.'" name="fo_elements_options['.$name.']">';
1041
+
1042
+ echo '<option value="" '. selected('', $selected, false) . '>' . __('Default', 'font-organizer') . '</option>';
1043
+
1044
+ //fonts section
1045
+ foreach($this->usable_fonts as $font)
1046
+ {
1047
+ $font_name = $font->family;
1048
+ $is_selected = selected($font_name, $selected, false);
1049
+ echo '<option value="'.$font_name.'" style="font-family: '.$font_name.';" '.$is_selected.'>'.$font_name.'</option>\n';
1050
+ }
1051
+
1052
+ echo '</select>';
1053
+ }
1054
+
1055
+ /**
1056
+ * Get the settings option array and print one of its values
1057
+ */
1058
+ private function print_custom_elements_usable_fonts_list($name, $default = '')
1059
+ {
1060
+ echo '<select id="'.$name.'" name="'.$name.'">';
1061
+
1062
+ if($default){
1063
+ echo '<option value="">'.$default.'</option>\n';
1064
+ }
1065
+
1066
+ //fonts section
1067
+ foreach($this->usable_fonts_db as $font)
1068
+ {
1069
+ $font_name = $font->name;
1070
+ $selected = isset($_GET[$name]) && $font->id == $_GET[$name];
1071
+ echo '<option value="' . $font->id . '" style="font-family: '.$font_name.';" ' . selected($selected) . '>'.$font_name.'</option>\n';
1072
+ }
1073
+
1074
+ echo '</select>';
1075
+ }
1076
+
1077
+ /**
1078
+ * Get the settings option array and print one of its values
1079
+ */
1080
+ private function print_available_fonts_list($name)
1081
+ {
1082
+ echo '<select id="'.$name.'" name="'.$name.'">';
1083
+
1084
+ //fonts section
1085
+ foreach($this->available_fonts as $font)
1086
+ {
1087
+ $font_name = $font->family;
1088
+ $is_selected = $font_name === $selected ? ' selected' : '';
1089
+ echo '<option value="'.$font_name.'" style="font-family: '.$font_name.';">'.$font_name.'</option>\n';
1090
+ }
1091
+
1092
+ echo '</select>';
1093
+ }
1094
+
1095
+ private function load_usable_fonts(){
1096
+ global $wpdb;
1097
+
1098
+ $this->usable_fonts_db = $wpdb->get_results('SELECT * FROM ' . $wpdb->prefix . FO_USABLE_FONTS_DATABASE . ' ORDER BY id DESC');
1099
+ foreach ( $this->usable_fonts_db as $usable_font) {
1100
+
1101
+ // Find the font from the lists.
1102
+ if($usable_font->custom){
1103
+ $font_obj = (object) [ 'family' => $usable_font->name, 'files' => (object) ['regular' => $usable_font->url], 'kind' => 'custom', 'variants' => array('regular')];
1104
+ $this->usable_fonts[$font_obj->family] = $font_obj;
1105
+ $this->custom_fonts[$font_obj->family] = $font_obj;
1106
+ }else{
1107
+ $i = 0;
1108
+ foreach ($this->available_fonts as $available_font) {
1109
+ if($available_font->family == $usable_font->name){
1110
+ $this->usable_fonts[$available_font->family] = $available_font;
1111
+
1112
+ // Remove the fond font from avaiable since it is already used.
1113
+ unset($this->available_fonts[$i]);
1114
+
1115
+ $found = true;
1116
+ break;
1117
+ }
1118
+
1119
+ $i++;
1120
+ }
1121
+ }
1122
+ }
1123
+ }
1124
+
1125
+ private function load_custom_elements(){
1126
+ global $wpdb;
1127
+
1128
+ $this->custom_elements = $wpdb->get_results('SELECT e.id, u.name, e.font_id, e.custom_elements, e.important FROM ' . $wpdb->prefix . FO_ELEMENTS_DATABASE . ' as e LEFT OUTER JOIN ' . $wpdb->prefix . FO_USABLE_FONTS_DATABASE . ' as u ON ' . ' e.font_id = u.id ORDER BY e.font_id DESC');
1129
+ }
1130
+
1131
+ private function get_known_fonts_array()
1132
+ {
1133
+ return array(
1134
+ (object) [ 'family' => 'Calibri', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1135
+ (object) [ 'family' => 'Abadi MT Condensed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1136
+ (object) [ 'family' => 'Adobe Minion Web', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1137
+ (object) [ 'family' => 'Agency FB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1138
+ (object) [ 'family' => 'Aharoni', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1139
+ (object) [ 'family' => 'Aldhabi', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1140
+ (object) [ 'family' => 'Algerian', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1141
+ (object) [ 'family' => 'Almanac MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1142
+ (object) [ 'family' => 'American Uncial', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1143
+ (object) [ 'family' => 'Andale Mono', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1144
+ (object) [ 'family' => 'Andalus', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1145
+ (object) [ 'family' => 'Andy', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1146
+ (object) [ 'family' => 'Angsana New', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1147
+ (object) [ 'family' => 'AngsanaUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1148
+ (object) [ 'family' => 'Aparajita', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1149
+ (object) [ 'family' => 'Arabic Transparent', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1150
+ (object) [ 'family' => 'Arabic Typesetting', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1151
+ (object) [ 'family' => 'Arial', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1152
+ (object) [ 'family' => 'Arial Black', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1153
+ (object) [ 'family' => 'Arial Narrow', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1154
+ (object) [ 'family' => 'Arial Narrow Special', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1155
+ (object) [ 'family' => 'Arial Rounded MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1156
+ (object) [ 'family' => 'Arial Special', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1157
+ (object) [ 'family' => 'Arial Unicode MS', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1158
+ (object) [ 'family' => 'Augsburger Initials', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1159
+ (object) [ 'family' => 'Baskerville Old Face', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1160
+ (object) [ 'family' => 'Batang', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1161
+ (object) [ 'family' => 'BatangChe', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1162
+ (object) [ 'family' => 'Bauhaus 93', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1163
+ (object) [ 'family' => 'Beesknees ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1164
+ (object) [ 'family' => 'Bell MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1165
+ (object) [ 'family' => 'Berlin Sans FB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1166
+ (object) [ 'family' => 'Bernard MT Condensed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1167
+ (object) [ 'family' => 'Bickley Script', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1168
+ (object) [ 'family' => 'Blackadder ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1169
+ (object) [ 'family' => 'Bodoni MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1170
+ (object) [ 'family' => 'Bodoni MT Condensed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1171
+ (object) [ 'family' => 'Bon Apetit MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1172
+ (object) [ 'family' => 'Book Antiqua', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1173
+ (object) [ 'family' => 'Bookman Old Style', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1174
+ (object) [ 'family' => 'Bookshelf Symbol', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1175
+ (object) [ 'family' => 'Bradley Hand ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1176
+ (object) [ 'family' => 'Braggadocio', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1177
+ (object) [ 'family' => 'BriemScript', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1178
+ (object) [ 'family' => 'Britannic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1179
+ (object) [ 'family' => 'Britannic Bold', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1180
+ (object) [ 'family' => 'Broadway', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1181
+ (object) [ 'family' => 'Browallia New', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1182
+ (object) [ 'family' => 'BrowalliaUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1183
+ (object) [ 'family' => 'Brush Script MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1184
+ (object) [ 'family' => 'Calibri', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1185
+ (object) [ 'family' => 'Californian FB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1186
+ (object) [ 'family' => 'Calisto MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1187
+ (object) [ 'family' => 'Cambria', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1188
+ (object) [ 'family' => 'Cambria Math', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1189
+ (object) [ 'family' => 'Candara', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1190
+ (object) [ 'family' => 'Cariadings', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1191
+ (object) [ 'family' => 'Castellar', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1192
+ (object) [ 'family' => 'Centaur', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1193
+ (object) [ 'family' => 'Century', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1194
+ (object) [ 'family' => 'Century Gothic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1195
+ (object) [ 'family' => 'Century Schoolbook', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1196
+ (object) [ 'family' => 'Chiller', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1197
+ (object) [ 'family' => 'Colonna MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1198
+ (object) [ 'family' => 'Comic Sans MS', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1199
+ (object) [ 'family' => 'Consolas', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1200
+ (object) [ 'family' => 'Constantia', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1201
+ (object) [ 'family' => 'Contemporary Brush', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1202
+ (object) [ 'family' => 'Cooper Black', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1203
+ (object) [ 'family' => 'Copperplate Gothic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1204
+ (object) [ 'family' => 'Corbel', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1205
+ (object) [ 'family' => 'Cordia New', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1206
+ (object) [ 'family' => 'CordiaUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1207
+ (object) [ 'family' => 'Courier New', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1208
+ (object) [ 'family' => 'Curlz MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1209
+ (object) [ 'family' => 'DaunPenh', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1210
+ (object) [ 'family' => 'David', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1211
+ (object) [ 'family' => 'Desdemona', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1212
+ (object) [ 'family' => 'DFKai-SB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1213
+ (object) [ 'family' => 'DilleniaUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1214
+ (object) [ 'family' => 'Directions MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1215
+ (object) [ 'family' => 'DokChampa', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1216
+ (object) [ 'family' => 'Dotum', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1217
+ (object) [ 'family' => 'DotumChe', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1218
+ (object) [ 'family' => 'Ebrima', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1219
+ (object) [ 'family' => 'Eckmann', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1220
+ (object) [ 'family' => 'Edda', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1221
+ (object) [ 'family' => 'Edwardian Script ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1222
+ (object) [ 'family' => 'Elephant', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1223
+ (object) [ 'family' => 'Engravers MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1224
+ (object) [ 'family' => 'Enviro', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1225
+ (object) [ 'family' => 'Eras ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1226
+ (object) [ 'family' => 'Estrangelo Edessa', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1227
+ (object) [ 'family' => 'EucrosiaUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1228
+ (object) [ 'family' => 'Euphemia', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1229
+ (object) [ 'family' => 'Eurostile', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1230
+ (object) [ 'family' => 'FangSong', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1231
+ (object) [ 'family' => 'Felix Titling', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1232
+ (object) [ 'family' => 'Fine Hand', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1233
+ (object) [ 'family' => 'Fixed Miriam Transparent', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1234
+ (object) [ 'family' => 'Flexure', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1235
+ (object) [ 'family' => 'Footlight MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1236
+ (object) [ 'family' => 'Forte', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1237
+ (object) [ 'family' => 'Franklin Gothic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1238
+ (object) [ 'family' => 'Franklin Gothic Medium', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1239
+ (object) [ 'family' => 'FrankRuehl', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1240
+ (object) [ 'family' => 'FreesiaUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1241
+ (object) [ 'family' => 'Freestyle Script', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1242
+ (object) [ 'family' => 'French Script MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1243
+ (object) [ 'family' => 'Futura', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1244
+ (object) [ 'family' => 'Gabriola', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1245
+ (object) [ 'family' => 'Gadugi', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1246
+ (object) [ 'family' => 'Garamond', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1247
+ (object) [ 'family' => 'Garamond MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1248
+ (object) [ 'family' => 'Gautami', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1249
+ (object) [ 'family' => 'Georgia', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1250
+ (object) [ 'family' => 'Georgia Ref', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1251
+ (object) [ 'family' => 'Gigi', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1252
+ (object) [ 'family' => 'Gill Sans MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1253
+ (object) [ 'family' => 'Gill Sans MT Condensed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1254
+ (object) [ 'family' => 'Gisha', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1255
+ (object) [ 'family' => 'Gloucester', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1256
+ (object) [ 'family' => 'Goudy Old Style', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1257
+ (object) [ 'family' => 'Goudy Stout', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1258
+ (object) [ 'family' => 'Gradl', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1259
+ (object) [ 'family' => 'Gulim', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1260
+ (object) [ 'family' => 'GulimChe', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1261
+ (object) [ 'family' => 'Gungsuh', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1262
+ (object) [ 'family' => 'GungsuhChe', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1263
+ (object) [ 'family' => 'Haettenschweiler', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1264
+ (object) [ 'family' => 'Harlow Solid Italic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1265
+ (object) [ 'family' => 'Harrington', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1266
+ (object) [ 'family' => 'High Tower Text', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1267
+ (object) [ 'family' => 'Holidays MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1268
+ (object) [ 'family' => 'Impact', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1269
+ (object) [ 'family' => 'Imprint MT Shadow', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1270
+ (object) [ 'family' => 'Informal Roman', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1271
+ (object) [ 'family' => 'IrisUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1272
+ (object) [ 'family' => 'Iskoola Pota', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1273
+ (object) [ 'family' => 'JasmineUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1274
+ (object) [ 'family' => 'Jokerman', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1275
+ (object) [ 'family' => 'Juice ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1276
+ (object) [ 'family' => 'KaiTi', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1277
+ (object) [ 'family' => 'Kalinga', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1278
+ (object) [ 'family' => 'Kartika', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1279
+ (object) [ 'family' => 'Keystrokes MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1280
+ (object) [ 'family' => 'Khmer UI', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1281
+ (object) [ 'family' => 'Kino MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1282
+ (object) [ 'family' => 'KodchiangUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1283
+ (object) [ 'family' => 'Kokila', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1284
+ (object) [ 'family' => 'Kristen ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1285
+ (object) [ 'family' => 'Kunstler Script', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1286
+ (object) [ 'family' => 'Lao UI', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1287
+ (object) [ 'family' => 'Latha', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1288
+ (object) [ 'family' => 'LCD', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1289
+ (object) [ 'family' => 'Leelawadee', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1290
+ (object) [ 'family' => 'Levenim MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1291
+ (object) [ 'family' => 'LilyUPC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1292
+ (object) [ 'family' => 'Lucida Blackletter', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1293
+ (object) [ 'family' => 'Lucida Bright', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1294
+ (object) [ 'family' => 'Lucida Bright Math', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1295
+ (object) [ 'family' => 'Lucida Calligraphy', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1296
+ (object) [ 'family' => 'Lucida Console', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1297
+ (object) [ 'family' => 'Lucida Fax', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1298
+ (object) [ 'family' => 'Lucida Handwriting', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1299
+ (object) [ 'family' => 'Lucida Sans', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1300
+ (object) [ 'family' => 'Lucida Sans Typewriter', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1301
+ (object) [ 'family' => 'Lucida Sans Unicode', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1302
+ (object) [ 'family' => 'Magneto', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1303
+ (object) [ 'family' => 'Maiandra GD', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1304
+ (object) [ 'family' => 'Malgun Gothic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1305
+ (object) [ 'family' => 'Mangal', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1306
+ (object) [ 'family' => 'Map Symbols', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1307
+ (object) [ 'family' => 'Marlett', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1308
+ (object) [ 'family' => 'Matisse ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1309
+ (object) [ 'family' => 'Matura MT Script Capitals', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1310
+ (object) [ 'family' => 'McZee', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1311
+ (object) [ 'family' => 'Mead Bold', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1312
+ (object) [ 'family' => 'Meiryo', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1313
+ (object) [ 'family' => 'Meiryo UI', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1314
+ (object) [ 'family' => 'Mercurius Script MT Bold', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1315
+ (object) [ 'family' => 'Microsoft Himalaya', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1316
+ (object) [ 'family' => 'Microsoft JhengHei', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1317
+ (object) [ 'family' => 'Microsoft JhengHei UI', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1318
+ (object) [ 'family' => 'Microsoft New Tai Lue', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1319
+ (object) [ 'family' => 'Microsoft PhagsPa', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1320
+ (object) [ 'family' => 'Microsoft Sans Serif', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1321
+ (object) [ 'family' => 'Microsoft Tai Le', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1322
+ (object) [ 'family' => 'Microsoft Uighur', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1323
+ (object) [ 'family' => 'Microsoft YaHei', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1324
+ (object) [ 'family' => 'Microsoft YaHei UI', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1325
+ (object) [ 'family' => 'Microsoft Yi Baiti', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1326
+ (object) [ 'family' => 'MingLiU', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1327
+ (object) [ 'family' => 'MingLiU_HKSCS', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1328
+ (object) [ 'family' => 'MingLiU_HKSCS-ExtB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1329
+ (object) [ 'family' => 'MingLiU-ExtB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1330
+ (object) [ 'family' => 'Minion Web', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1331
+ (object) [ 'family' => 'Miriam', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1332
+ (object) [ 'family' => 'Miriam Fixed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1333
+ (object) [ 'family' => 'Mistral', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1334
+ (object) [ 'family' => 'Modern No. 20', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1335
+ (object) [ 'family' => 'Mongolian Baiti', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1336
+ (object) [ 'family' => 'Monotype Corsiva', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1337
+ (object) [ 'family' => 'Monotype Sorts', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1338
+ (object) [ 'family' => 'Monotype.com', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1339
+ (object) [ 'family' => 'MoolBoran', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1340
+ (object) [ 'family' => 'MS Gothic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1341
+ (object) [ 'family' => 'MS LineDraw', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1342
+ (object) [ 'family' => 'MS Mincho', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1343
+ (object) [ 'family' => 'MS Outlook', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1344
+ (object) [ 'family' => 'MS PGothic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1345
+ (object) [ 'family' => 'MS PMincho', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1346
+ (object) [ 'family' => 'MS Reference', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1347
+ (object) [ 'family' => 'MS UI Gothic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1348
+ (object) [ 'family' => 'MT Extra', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1349
+ (object) [ 'family' => 'MV Boli', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1350
+ (object) [ 'family' => 'Myanmar Text', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1351
+ (object) [ 'family' => 'Narkisim', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1352
+ (object) [ 'family' => 'New Caledonia', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1353
+ (object) [ 'family' => 'News Gothic MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1354
+ (object) [ 'family' => 'Niagara', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1355
+ (object) [ 'family' => 'Nirmala UI', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1356
+ (object) [ 'family' => 'NSimSun', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1357
+ (object) [ 'family' => 'Nyala', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1358
+ (object) [ 'family' => 'OCR A Extended', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1359
+ (object) [ 'family' => 'OCRB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1360
+ (object) [ 'family' => 'OCR-B-Digits', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1361
+ (object) [ 'family' => 'Old English Text MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1362
+ (object) [ 'family' => 'Onyx', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1363
+ (object) [ 'family' => 'Palace Script MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1364
+ (object) [ 'family' => 'Palatino Linotype', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1365
+ (object) [ 'family' => 'Papyrus', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1366
+ (object) [ 'family' => 'Parade', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1367
+ (object) [ 'family' => 'Parchment', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1368
+ (object) [ 'family' => 'Parties MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1369
+ (object) [ 'family' => 'Peignot Medium', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1370
+ (object) [ 'family' => 'Pepita MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1371
+ (object) [ 'family' => 'Perpetua', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1372
+ (object) [ 'family' => 'Perpetua Titling MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1373
+ (object) [ 'family' => 'Placard Condensed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1374
+ (object) [ 'family' => 'Plantagenet Cherokee', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1375
+ (object) [ 'family' => 'Playbill', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1376
+ (object) [ 'family' => 'PMingLiU', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1377
+ (object) [ 'family' => 'PMingLiU-ExtB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1378
+ (object) [ 'family' => 'Poor Richard', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1379
+ (object) [ 'family' => 'Pristina', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1380
+ (object) [ 'family' => 'Raavi', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1381
+ (object) [ 'family' => 'Rage Italic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1382
+ (object) [ 'family' => 'Ransom', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1383
+ (object) [ 'family' => 'Ravie', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1384
+ (object) [ 'family' => 'RefSpecialty', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1385
+ (object) [ 'family' => 'Rockwell', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1386
+ (object) [ 'family' => 'Rockwell Condensed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1387
+ (object) [ 'family' => 'Rockwell Extra Bold', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1388
+ (object) [ 'family' => 'Rod', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1389
+ (object) [ 'family' => 'Runic MT Condensed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1390
+ (object) [ 'family' => 'Sakkal Majalla', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1391
+ (object) [ 'family' => 'Script MT Bold', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1392
+ (object) [ 'family' => 'Segoe Chess', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1393
+ (object) [ 'family' => 'Segoe Print', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1394
+ (object) [ 'family' => 'Segoe Pseudo', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1395
+ (object) [ 'family' => 'Segoe Script', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1396
+ (object) [ 'family' => 'Segoe UI', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1397
+ (object) [ 'family' => 'Segoe UI Symbol', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1398
+ (object) [ 'family' => 'Shonar Bangla', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1399
+ (object) [ 'family' => 'Showcard Gothic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1400
+ (object) [ 'family' => 'Shruti', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1401
+ (object) [ 'family' => 'Signs MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1402
+ (object) [ 'family' => 'SimHei', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1403
+ (object) [ 'family' => 'Simplified Arabic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1404
+ (object) [ 'family' => 'Simplified Arabic Fixed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1405
+ (object) [ 'family' => 'SimSun', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1406
+ (object) [ 'family' => 'SimSun-ExtB', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1407
+ (object) [ 'family' => 'Snap ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1408
+ (object) [ 'family' => 'Sports MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1409
+ (object) [ 'family' => 'Stencil', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1410
+ (object) [ 'family' => 'Stop', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1411
+ (object) [ 'family' => 'Sylfaen', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1412
+ (object) [ 'family' => 'Symbol', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1413
+ (object) [ 'family' => 'Tahoma', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1414
+ (object) [ 'family' => 'Temp Installer Font', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1415
+ (object) [ 'family' => 'Tempo Grunge', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1416
+ (object) [ 'family' => 'Tempus Sans ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1417
+ (object) [ 'family' => 'Times New Roman', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1418
+ (object) [ 'family' => 'Times New Roman Special', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1419
+ (object) [ 'family' => 'Traditional Arabic', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1420
+ (object) [ 'family' => 'Transport MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1421
+ (object) [ 'family' => 'Trebuchet MS', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1422
+ (object) [ 'family' => 'Tunga', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1423
+ (object) [ 'family' => 'Tw Cen MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1424
+ (object) [ 'family' => 'Tw Cen MT Condensed', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1425
+ (object) [ 'family' => 'Urdu Typesetting', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1426
+ (object) [ 'family' => 'Utsaah', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1427
+ (object) [ 'family' => 'Vacation MT', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1428
+ (object) [ 'family' => 'Vani', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1429
+ (object) [ 'family' => 'Verdana', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1430
+ (object) [ 'family' => 'Verdana Ref', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1431
+ (object) [ 'family' => 'Vijaya', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1432
+ (object) [ 'family' => 'Viner Hand ITC', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1433
+ (object) [ 'family' => 'Vivaldi', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1434
+ (object) [ 'family' => 'Vixar ASCI', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1435
+ (object) [ 'family' => 'Vladimir Script', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1436
+ (object) [ 'family' => 'Vrinda', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1437
+ (object) [ 'family' => 'Webdings', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1438
+ (object) [ 'family' => 'Westminster', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1439
+ (object) [ 'family' => 'Wide Latin', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1440
+ (object) [ 'family' => 'Wingdings', 'kind' => 'standard', 'variants' => array(), 'files' => (object) ['regular' => '']],
1441
+ );
1442
+ }
1443
+ }