PluginProbe
Zalomení / 1.3
Zalomení v1.3
2.0.1 trunk 1.0 1.1 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.5 2.0.0
zalomeni / zalomeni.php

zalomeni.php in Zalomení 1.3, at zalomeni.php

300 lines 16.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*
3 Plugin Name: Zalomení
4 Plugin URI: http://www.honza.info/category/wordpress/
5 Description: Puts non-breakable space after one-letter Czech prepositions like 'k', 's', 'v' or 'z'.
6 Version: 1.3
7 Author: Honza Skypala
8 Author URI: http://www.honza.info/
9 */
10
11 include_once(ABSPATH . 'wp-admin/includes/plugin.php');
12
13 class Zalomeni {
14 const version = '1.3';
15 const zkratky = 'cca., č., čís., čj., čp., fa, fě, fy, kupř., mj., např., p., pí, popř., př., přib., přibl., sl., str., sv., tj., tzn., tzv., zvl.';
16 const default_custom_terms = "Formule 1\nWindows \d\niPhone \d\niPhone S\d\niPad \d\nWii U\nPlayStation \d\nXBox 360";
17
18 public function __construct() {
19 register_activation_hook(__FILE__, array($this, 'activate'));
20 if (is_admin()){
21 add_action('admin_init', array($this, 'admin_init'));
22 $this->add_update_option_hooks();
23 add_filter('plugin_action_links', array($this, 'add_settings_to_plugin_actions'), 10, 2); // link from Plugins list admin page to settings of this plugin
24 } else {
25 $zalomeni_matches = get_option('zalomeni_matches');
26 if (!empty($zalomeni_matches)) {
27 $filters = array('comment_author', 'term_name', 'link_name', 'link_description',
28 'link_notes', 'bloginfo', 'wp_title', 'widget_title', 'term_description',
29 'the_title', 'the_content', 'the_excerpt', 'comment_text', 'single_post_title',
30 'list_cats');
31 foreach ($filters as $filter) {
32 add_filter($filter, array($this, 'texturize')); // content filter
33 }
34 }
35 }
36 }
37
38 static function activate() {
39 add_option('zalomeni_version', self::version);
40
41 add_option('zalomeni_prepositions', 'on');
42 add_option('zalomeni_prepositions_list', 'k, s, v, z');
43 add_option('zalomeni_conjunctions', '');
44 add_option('zalomeni_conjunctions_list', 'a, i, o, u');
45 add_option('zalomeni_abbreviations', '');
46 add_option('zalomeni_abbreviations_list', self::zkratky);
47 add_option('zalomeni_space_between_numbers', 'on');
48 add_option('zalomeni_space_after_ordered_number', 'on');
49 add_option('zalomeni_custom_terms', self::default_custom_terms);
50
51 self::update_matches_and_replacements();
52 }
53
54 private function update_plugin_version() {
55 $registered_version = get_option('zalomeni_version', '0');
56 if ($registered_version == '0') return;
57
58 if (version_compare($registered_version, self::version, '<')) {
59 if (version_compare($registered_version, '1.1', '<')) {
60 add_option('zalomeni_abbreviations', '');
61 add_option('zalomeni_abbreviations_list', self::zkratky);
62 add_option('zalomeni_space_between_numbers', 'on');
63 // please notice if version < 1.1, then it is also < 1.3, so the following block is executed as well
64 }
65
66 if (version_compare($registered_version, '1.3', '<')) {
67 $old_options = get_option('zalomeni_options');
68 update_option('zalomeni_prepositions', $old_options['zalomeni_prepositions']);
69 update_option('zalomeni_prepositions_list', $old_options['zalomeni_prepositions_list']);
70 update_option('zalomeni_conjunctions', $old_options['zalomeni_conjunctions']);
71 update_option('zalomeni_conjunctions_list', $old_options['zalomeni_conjunctions_list']);
72 if (!version_compare($registered_version, '1.1', '<')) {
73 // these options were introduced in version 1.1
74 update_option('zalomeni_abbreviations', $old_options['zalomeni_abbreviations']);
75 update_option('zalomeni_abbreviations_list', $old_options['zalomeni_abbreviations_list']);
76 update_option('zalomeni_space_between_numbers', $old_options['zalomeni_numbers']);
77 }
78 delete_option('zalomeni_options');
79
80 add_option('zalomeni_space_after_ordered_number', 'on');
81 add_option('zalomeni_custom_terms', self::default_custom_terms);
82 }
83
84 self::update_matches_and_replacements();
85 update_option('zalomeni_version', self::version);
86 }
87 }
88
89 protected static $this_plugin;
90 function add_settings_to_plugin_actions($links, $file) {
91 // Add settings link to plugin list for this plugin
92 if (!self::$this_plugin) self::$this_plugin = plugin_basename(__FILE__);
93 if ($file == self::$this_plugin) {
94 $settings_link = '<a href="options-reading.php#zalomeni_options_desc">' . __('Settings') . '</a>';
95 array_unshift( $links, $settings_link ); // before other links
96 }
97 return $links;
98 }
99
100 function admin_init() {
101 $this->update_plugin_version();
102
103 register_setting('reading', 'zalomeni_prepositions');
104 register_setting('reading', 'zalomeni_prepositions_list');
105 register_setting('reading', 'zalomeni_conjunctions');
106 register_setting('reading', 'zalomeni_conjunctions_list');
107 register_setting('reading', 'zalomeni_abbreviations');
108 register_setting('reading', 'zalomeni_abbreviations_list');
109 register_setting('reading', 'zalomeni_space_between_numbers');
110 register_setting('reading', 'zalomeni_space_after_ordered_number');
111 register_setting('reading', 'zalomeni_custom_terms');
112
113 add_settings_section('zalomeni_section', $this->texturize(__('Nevhodná slova a zalomení na konci řádku', 'zalomeni')), 'Zalomeni::settings_section_description', 'reading');
114
115 add_settings_field('zalomeni_prepositions', __('Předložky', 'zalomeni'), 'Zalomeni::settings_field_checkbox', 'reading', 'zalomeni_section', array('option'=>'prepositions', 'description'=>"Vkládat pevnou mezeru za následující předložky.", 'toggle_list_read_only'=>true));
116 add_settings_field('zalomeni_prepositions_list', '', 'Zalomeni::settings_field_textlist', 'reading', 'zalomeni_section', array('option'=>'prepositions', 'description'=>"(oddělte jednotlivé předložky čárkou)"));
117 add_settings_field('zalomeni_conjunctions', __('Spojky', 'zalomeni'), 'Zalomeni::settings_field_checkbox', 'reading', 'zalomeni_section', array('option'=>'conjunctions', 'description'=>"Vkládat pevnou mezeru za následující spojky.", 'toggle_list_read_only'=>true));
118 add_settings_field('zalomeni_conjunctions_list', '', 'Zalomeni::settings_field_textlist', 'reading', 'zalomeni_section', array('option'=>'conjunctions', 'description'=>"(oddělte jednotlivé spojky čárkou)"));
119 add_settings_field('zalomeni_abbreviations', __('Zkratky', 'zalomeni'), 'Zalomeni::settings_field_checkbox', 'reading', 'zalomeni_section', array('option'=>'abbreviations', 'description'=>"Vkládat pevnou mezeru za následující zkratky.", 'toggle_list_read_only'=>true));
120 add_settings_field('zalomeni_abbreviations_list', '', 'Zalomeni::settings_field_textlist', 'reading', 'zalomeni_section', array('option'=>'abbreviations', 'description'=>"(oddělte jednotlivé zkratky čárkou)"));
121 add_settings_field('zalomeni_space_between_numbers', __('Mezery uprostřed čísel', 'zalomeni'), 'Zalomeni::settings_field_checkbox', 'reading', 'zalomeni_section', array('option'=>'space_between_numbers', 'description'=>"Pokud jsou dvě čísla oddělena mezerou, předpokládat, že se jedná o formátování čísla pomocí mezery (např. telefonní číslo 800 123 456) a nahrazovat mezeru pevnou mezerou, aby nedošlo k zalomení řádku uprostřed čísla."));
122 add_settings_field('zalomeni_space_after_ordered_number', __('Řadové číslovky', 'zalomeni'), 'Zalomeni::settings_field_checkbox', 'reading', 'zalomeni_section', array('option'=>'space_after_ordered_number', 'description'=>"Zabránit zalomení řádku za řadovou číslovkou; díky tomu nedojde k zalomení řádku uprostřed data (např. 1. ledna) a v podobných případech (19. ročník, 3. svazek, 5. kapitola apod.)"));
123 add_settings_field('zalomeni_custom_terms', __('Vlastní výrazy', 'zalomeni'), 'Zalomeni::settings_field_custom_terms', 'reading', 'zalomeni_section');
124 }
125
126 public function settings_field_checkbox(array $args) {
127 echo(
128 '<input type="checkbox" name="zalomeni_' . $args['option'] . '" id="zalomeni_' . $args['option'] . '" value="on" '
129 . checked('on', get_option("zalomeni_" . $args['option']), false)
130 . ($args['toggle_list_read_only'] ? ' onchange="document.getElementById(\'zalomeni_' . $args['option'] . '_list\').readOnly = this.checked?\'\':\'1\';"' : '')
131 . ' /> '
132 . Zalomeni::texturize(__($args['description'], 'zalomeni'))
133 );
134 }
135
136 public function settings_field_textlist(array $args) {
137 echo(
138 '<input type="text" name="zalomeni_' . $args['option'] . '_list" id="zalomeni_' . $args['option'] . '_list" class="regular-text" value="' . get_option('zalomeni_' . $args['option'] . '_list') . '"'
139 . ((get_option("zalomeni_" . $args['option']) != 'on') ? ' readonly="1"' : '')
140 . ' /> '
141 . Zalomeni::texturize(__($args['description'], 'zalomeni'))
142 );
143 }
144
145 public function settings_field_custom_terms() {
146 echo(
147 Zalomeni::texturize(__('Zde můžete uvést vlastní termíny, v nichž mají být mezery nahrazeny pevnými mezerami tak, aby nedošlo k zalomení uvnitř těchto výrazů. Uveďte vždy každý výraz na samostatný řádek; pokud je výraz složen z více jak dvou slov, tedy je v něm více jak jedna mezera, pak všechny mezery budou nahrazeny za pevné mezery. Lze použít výrazu \\d pro libovolnou číslovku (pro pokročilé administrátory: algoritmus používá <a href="http://www.php.net/manual/en/reference.pcre.pattern.syntax.php" target="_blank">Perl Compatible Regular Expressions</a>, lze využít syntaxe této specifikace).', 'zalomeni'))
148 . '<p><textarea name="zalomeni_custom_terms" id="zalomeni_custom_terms" rows="10" cols="50" class="regular-text">'
149 . get_option('zalomeni_custom_terms')
150 . '</textarea></p>'
151 );
152 }
153
154 private function add_update_option_hooks() {
155 add_action('update_option_zalomeni_prepositions', array($this, 'update_matches_and_replacements'));
156 add_action('update_option_zalomeni_prepositions_list', array($this, 'update_matches_and_replacements'));
157 add_action('update_option_zalomeni_conjunctions', array($this, 'update_matches_and_replacements'));
158 add_action('update_option_zalomeni_conjunctions_list', array($this, 'update_matches_and_replacements'));
159 add_action('update_option_zalomeni_abbreviations', array($this, 'update_matches_and_replacements'));
160 add_action('update_option_zalomeni_abbreviations_list', array($this, 'update_matches_and_replacements'));
161 add_action('update_option_zalomeni_space_between_numbers', array($this, 'update_matches_and_replacements'));
162 add_action('update_option_zalomeni_space_after_ordered_number', array($this, 'update_matches_and_replacements'));
163 add_action('update_option_zalomeni_custom_terms', array($this, 'update_matches_and_replacements'));
164 }
165
166 public function update_matches_and_replacements() {
167 update_option('zalomeni_matches', Zalomeni::prepare_matches());
168 update_option('zalomeni_replacements', Zalomeni::prepare_replacements());
169 }
170
171 private function prepare_matches() {
172 $return_array = array();
173
174 $word_matches = '';
175 foreach (array('prepositions', 'conjunctions', 'abbreviations') as $i) {
176 if (get_option('zalomeni_'.$i) == 'on') {
177 $temp_array = explode(',', get_option('zalomeni_'.$i.'_list'));
178 foreach ($temp_array as $j) {
179 $j = strtolower(trim($j));
180 $word_matches .= ($word_matches == '' ? '' : '|') . $j;
181 }
182 }
183 }
184
185 if ($word_matches != '') {
186 $return_array['words'] = '@(^|;| |&nbsp;|\(|\n)('.$word_matches.') @i';
187 }
188
189 if (get_option('zalomeni_space_between_numbers') == 'on') {
190 $return_array['numbers'] = '@(\d) (\d)@i';
191 }
192
193 if (get_option('zalomeni_space_after_ordered_number') == 'on') {
194 $return_array['orders'] = '@(\d\.) ([a-záčďéěíňóřšťúýž])@';
195 }
196
197 if (get_option('zalomeni_custom_terms') != '') {
198 $term_counter = 1;
199 $custom_terms = explode(chr(10), str_replace(chr(13), '', get_option('zalomeni_custom_terms')));
200 foreach ($custom_terms as $i) {
201 if (strpos($i, ' ') !== false) {
202 $term = '';
203 $words_split = explode(' ', $i);
204 foreach ($words_split as $j) {
205 $term .= ($term == '' ? '(' : ' (') . str_replace(array('/', '(', ')'), array('\\/', '\\(', '\\)'), $j) . ')';
206 }
207 $term = '/' . $term . '/i';
208 $return_array['customterm' . $term_counter++] = $term;
209 }
210 }
211 }
212
213 return $return_array;
214 }
215
216 private function prepare_replacements() {
217 $return_array = array();
218
219 foreach (array('prepositions', 'conjunctions', 'abbreviations') as $i) {
220 if (get_option('zalomeni_'.$i) == 'on') {
221 $return_array['words'] = '$1$2&nbsp;';
222 break;
223 }
224 }
225
226 if (get_option('zalomeni_space_between_numbers') == 'on') {
227 $return_array['numbers'] = '$1&nbsp;$2';
228 }
229
230 if (get_option('zalomeni_space_after_ordered_number') == 'on') {
231 $return_array['orders'] = '$1&nbsp;$2';
232 }
233
234 if (get_option('zalomeni_custom_terms') != '') {
235 $term_counter = 1;
236 $custom_terms = explode(chr(10), str_replace(chr(13), '', get_option('zalomeni_custom_terms')));
237 foreach ($custom_terms as $i) {
238 if (strpos($i, ' ') !== false) {
239 $term = '';
240 $words_split = explode(' ', $i);
241 $word_counter = 1;
242 foreach ($words_split as $j) {
243 $term .= ($term == '' ? '' : '&nbsp;') . '$' . $word_counter++;
244 }
245 $return_array['customterm' . $term_counter++] = $term;
246 }
247 }
248 }
249
250 return $return_array;
251 }
252
253 public function settings_section_description() {
254 echo(
255 '<div id="zalomeni_options_desc" style="margin:0 0 15px 10px;-webkit-border-radius:3px;border-radius:3px;border-width:1px;border-color:#e6db55;border-style:solid;float:right;background:#FFFBCC;text-align:center;width:200px">'
256 . '<p style="line-height:1.5em;">Plugin <strong>Zalomení</strong><br />Autor: <a href="http://www.honza.info/" class="external" target="_blank" title="http://www.honza.info/">Honza Skýpala</a></p>'
257 . '</div>'
258 . '<p>' . Zalomeni::texturize(__('Upravujeme-li písemný dokument, radí nám <strong>Pravidla českého pravopisu</strong> nepsat neslabičné předložky <em>v, s, z, k</em> na konec řádku, ale psát je na stejný řádek se slovem, které nese přízvuk (např. ve spojení <em>k mostu</em>, <em>s bratrem</em>, <em>v Plzni</em>, <em>z nádraží</em>). Typografické normy jsou ještě přísnější: podle některých je nepatřičné ponechat na konci řádku jakékoli jednopísmenné slovo, tedy také předložky a spojky <em>a, i, o, u</em>;. Někteří pisatelé dokonce nechtějí z estetických důvodů ponechávat na konci řádků jakékoli jednoslabičné výrazy (např. <em>ve, ke, ku, že, na, do, od, pod</em>).', 'zalomeni')) . '</p>'
259 . '<p>' . Zalomeni::texturize(__('<a href="http://prirucka.ujc.cas.cz/?id=880" class="external" target="_blank">Více informací</a> na webu Ústavu pro jazyk český, Akademie věd ČR.', 'zalomeni')) . '</p>'
260 . '<p>' . Zalomeni::texturize(__('Tento plugin řeší některé z uvedených příkladů: v textu nahrazuje běžné mezery za pevné tak, aby nedošlo k zalomení řádku v nevhodném místě.', 'zalomeni')) . '</p>'
261 );
262 }
263
264 public function texturize($text) {
265 $output = '';
266 $curl = '';
267 $textarr = preg_split('/(<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
268 $stop = count($textarr);
269
270 $no_texturize_tags = apply_filters('no_texturize_tags', array('pre', 'code', 'kbd', 'style', 'script', 'tt'));
271 $no_texturize_shortcodes = apply_filters('no_texturize_shortcodes', array('code'));
272 $no_texturize_tags_stack = array();
273 $no_texturize_shortcodes_stack = array();
274
275 for ($i = 0; $i < $stop; $i++) {
276 $curl = $textarr[$i];
277
278 global $wp_version;
279 if (!empty($curl) && '<' != $curl{0} && '[' != $curl{0}
280 && empty($no_texturize_shortcodes_stack) && empty($no_texturize_tags_stack)) { // If it's not a tag
281 $curl = preg_replace(get_option('zalomeni_matches'), get_option('zalomeni_replacements'), $curl);
282 $curl = preg_replace(get_option('zalomeni_matches'), get_option('zalomeni_replacements'), $curl);
283 } else if (version_compare($wp_version, '2.9', '<')) {
284 wptexturize_pushpop_element($curl, $no_texturize_tags_stack, $no_texturize_tags, '<', '>');
285 wptexturize_pushpop_element($curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes, '[', ']');
286 } else {
287 _wptexturize_pushpop_element($curl, $no_texturize_tags_stack, $no_texturize_tags, '<', '>');
288 _wptexturize_pushpop_element($curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes, '[', ']');
289 }
290
291 $output .= $curl;
292 }
293
294 return $output;
295 }
296
297 }
298
299 $wpZalomeni = new Zalomeni();
300 ?>