TablePress - Version 1.6.1

Version Description

This update fixes an issue with the JavaScript features after the update to WordPress 4.3.

Download this release

Release Info

Developer TobiasBg
Plugin Icon 128x128 TablePress
Version 1.6.1
Comparing to
See all releases

Version 1.6.1

Files changed (120) hide show
  1. admin/css/codemirror.css +374 -0
  2. admin/css/codemirror.min.css +1 -0
  3. admin/css/common-rtl.css +29 -0
  4. admin/css/common-rtl.min.css +1 -0
  5. admin/css/common.css +155 -0
  6. admin/css/common.min.css +1 -0
  7. admin/css/edit.css +230 -0
  8. admin/css/edit.min.css +1 -0
  9. admin/css/index.php +1 -0
  10. admin/img/index.php +1 -0
  11. admin/img/tablepress-editor-button-2x.png +0 -0
  12. admin/img/tablepress-editor-button.png +0 -0
  13. admin/index.php +1 -0
  14. admin/js/add.js +74 -0
  15. admin/js/add.min.js +1 -0
  16. admin/js/codemirror.min.js +310 -0
  17. admin/js/common.js +81 -0
  18. admin/js/common.min.js +1 -0
  19. admin/js/edit.js +1264 -0
  20. admin/js/edit.min.js +1 -0
  21. admin/js/export.js +89 -0
  22. admin/js/export.min.js +1 -0
  23. admin/js/import.js +157 -0
  24. admin/js/import.min.js +1 -0
  25. admin/js/index.php +1 -0
  26. admin/js/list.js +116 -0
  27. admin/js/list.min.js +1 -0
  28. admin/js/options.js +75 -0
  29. admin/js/options.min.js +1 -0
  30. admin/js/quicktags-button.js +53 -0
  31. admin/js/quicktags-button.min.js +1 -0
  32. admin/js/tinymce-button.js +51 -0
  33. admin/js/tinymce-button.min.js +1 -0
  34. classes/class-admin-page-helper.php +129 -0
  35. classes/class-controller.php +190 -0
  36. classes/class-css.php +442 -0
  37. classes/class-evaluate.php +232 -0
  38. classes/class-export.php +196 -0
  39. classes/class-import.php +491 -0
  40. classes/class-model.php +32 -0
  41. classes/class-render.php +909 -0
  42. classes/class-tablepress.php +452 -0
  43. classes/class-view.php +462 -0
  44. classes/class-wp_option.php +162 -0
  45. classes/class-wp_user_option.php +101 -0
  46. classes/index.php +1 -0
  47. controllers/controller-admin.php +2092 -0
  48. controllers/controller-admin_ajax.php +319 -0
  49. controllers/controller-frontend.php +913 -0
  50. controllers/index.php +1 -0
  51. controllers/template-tag-functions.php +78 -0
  52. css/default-rtl.css +266 -0
  53. css/default-rtl.min.css +1 -0
  54. css/default.css +264 -0
  55. css/default.min.css +1 -0
  56. css/index.php +1 -0
  57. css/tablepress.eot +0 -0
  58. css/tablepress.svg +40 -0
  59. css/tablepress.ttf +0 -0
  60. css/tablepress.woff +0 -0
  61. css/warning.txt +10 -0
  62. i18n/datatables/index.php +1 -0
  63. i18n/datatables/lang-ar.json +16 -0
  64. i18n/datatables/lang-az.json +24 -0
  65. i18n/datatables/lang-bel.json +22 -0
  66. i18n/datatables/lang-bg_BG.json +18 -0
  67. i18n/datatables/lang-cs_CZ.json +18 -0
  68. i18n/datatables/lang-da_DK.json +18 -0
  69. i18n/datatables/lang-de_DE.json +24 -0
  70. i18n/datatables/lang-el.json +18 -0
  71. i18n/datatables/lang-en_US.json +24 -0
  72. i18n/datatables/lang-es_ES.json +24 -0
  73. i18n/datatables/lang-et.json +18 -0
  74. i18n/datatables/lang-fa_IR.json +16 -0
  75. i18n/datatables/lang-fi.json +18 -0
  76. i18n/datatables/lang-fr_FR.json +24 -0
  77. i18n/datatables/lang-ga.json +18 -0
  78. i18n/datatables/lang-he_IL.json +18 -0
  79. i18n/datatables/lang-hi_IN.json +18 -0
  80. i18n/datatables/lang-hr.json +24 -0
  81. i18n/datatables/lang-hu_HU.json +24 -0
  82. i18n/datatables/lang-id_ID.json +18 -0
  83. i18n/datatables/lang-is_IS.json +24 -0
  84. i18n/datatables/lang-it_IT.json +24 -0
  85. i18n/datatables/lang-ja.json +18 -0
  86. i18n/datatables/lang-ko_KR.json +24 -0
  87. i18n/datatables/lang-lt_LT.json +18 -0
  88. i18n/datatables/lang-lv.json +18 -0
  89. i18n/datatables/lang-mk_MK.json +20 -0
  90. i18n/datatables/lang-nb_NO.json +18 -0
  91. i18n/datatables/lang-nl_NL.json +20 -0
  92. i18n/datatables/lang-nn_NO.json +18 -0
  93. i18n/datatables/lang-pl_PL.json +24 -0
  94. i18n/datatables/lang-pt_BR.json +24 -0
  95. i18n/datatables/lang-pt_PT.json +18 -0
  96. i18n/datatables/lang-ro_RO.json +18 -0
  97. i18n/datatables/lang-ru_RU.json +22 -0
  98. i18n/datatables/lang-sk_SK.json +24 -0
  99. i18n/datatables/lang-sl_SI.json +24 -0
  100. i18n/datatables/lang-sq.json +24 -0
  101. i18n/datatables/lang-sr_RS.json +18 -0
  102. i18n/datatables/lang-sv_SE.json +24 -0
  103. i18n/datatables/lang-th.json +18 -0
  104. i18n/datatables/lang-tr_TR.json +18 -0
  105. i18n/datatables/lang-uk.json +22 -0
  106. i18n/datatables/lang-vi.json +18 -0
  107. i18n/datatables/lang-zh_CN.json +24 -0
  108. i18n/datatables/lang-zh_TW.json +18 -0
  109. i18n/datatables/warning.txt +25 -0
  110. i18n/index.php +1 -0
  111. i18n/tablepress-cs_CZ.mo +0 -0
  112. i18n/tablepress-cs_CZ.po +2913 -0
  113. i18n/tablepress-de_DE.mo +0 -0
  114. i18n/tablepress-de_DE.po +2898 -0
  115. i18n/tablepress-es_ES.mo +0 -0
  116. i18n/tablepress-es_ES.po +3056 -0
  117. i18n/tablepress-fi.mo +0 -0
  118. i18n/tablepress-fi.po +2337 -0
  119. i18n/tablepress-fr_FR.mo +0 -0
  120. i18n/tablepress-fr_FR.po +1501 -0
admin/css/codemirror.css ADDED
@@ -0,0 +1,374 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* CodeMirror Default Styling */
2
+ /* BASICS */
3
+
4
+ .CodeMirror {
5
+ /* Set height, width, borders, and global font properties here */
6
+ font-family: monospace;
7
+ height: 300px;
8
+ color: black;
9
+ }
10
+
11
+ /* PADDING */
12
+
13
+ .CodeMirror-lines {
14
+ padding: 4px 0; /* Vertical padding around content */
15
+ }
16
+ .CodeMirror pre {
17
+ padding: 0 4px; /* Horizontal padding of content */
18
+ }
19
+
20
+ .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
21
+ background-color: white; /* The little square between H and V scrollbars */
22
+ }
23
+
24
+ /* GUTTER */
25
+
26
+ .CodeMirror-gutters {
27
+ border-right: 1px solid #ddd;
28
+ background-color: #f7f7f7;
29
+ white-space: nowrap;
30
+ }
31
+ .CodeMirror-linenumbers {}
32
+ .CodeMirror-linenumber {
33
+ padding: 0 3px 0 5px;
34
+ min-width: 20px;
35
+ text-align: right;
36
+ color: #999;
37
+ white-space: nowrap;
38
+ }
39
+
40
+ .CodeMirror-guttermarker { color: black; }
41
+ .CodeMirror-guttermarker-subtle { color: #999; }
42
+
43
+ /* CURSOR */
44
+
45
+ .CodeMirror div.CodeMirror-cursor {
46
+ border-left: 1px solid black;
47
+ }
48
+ /* Shown when moving in bi-directional text */
49
+ .CodeMirror div.CodeMirror-secondarycursor {
50
+ border-left: 1px solid silver;
51
+ }
52
+ .CodeMirror.cm-fat-cursor div.CodeMirror-cursor {
53
+ width: auto;
54
+ border: 0;
55
+ background: #7e7;
56
+ }
57
+ .CodeMirror.cm-fat-cursor div.CodeMirror-cursors {
58
+ z-index: 1;
59
+ }
60
+
61
+ .cm-animate-fat-cursor {
62
+ width: auto;
63
+ border: 0;
64
+ -webkit-animation: blink 1.06s steps(1) infinite;
65
+ animation: blink 1.06s steps(1) infinite;
66
+ }
67
+ @-webkit-keyframes blink {
68
+ 0% { background: #7e7; }
69
+ 50% { background: none; }
70
+ 100% { background: #7e7; }
71
+ }
72
+ @keyframes blink {
73
+ 0% { background: #7e7; }
74
+ 50% { background: none; }
75
+ 100% { background: #7e7; }
76
+ }
77
+
78
+ /* Can style cursor different in overwrite (non-insert) mode */
79
+ div.CodeMirror-overwrite div.CodeMirror-cursor {}
80
+
81
+ .cm-tab { display: inline-block; text-decoration: inherit; }
82
+
83
+ .CodeMirror-ruler {
84
+ border-left: 1px solid #ccc;
85
+ position: absolute;
86
+ }
87
+
88
+ /* DEFAULT THEME */
89
+
90
+ .cm-s-default .cm-keyword {color: #708;}
91
+ .cm-s-default .cm-atom {color: #219;}
92
+ .cm-s-default .cm-number {color: #164;}
93
+ .cm-s-default .cm-def {color: #00f;}
94
+ .cm-s-default .cm-variable,
95
+ .cm-s-default .cm-punctuation,
96
+ .cm-s-default .cm-property,
97
+ .cm-s-default .cm-operator {}
98
+ .cm-s-default .cm-variable-2 {color: #05a;}
99
+ .cm-s-default .cm-variable-3 {color: #085;}
100
+ .cm-s-default .cm-comment {color: #a50;}
101
+ .cm-s-default .cm-string {color: #a11;}
102
+ .cm-s-default .cm-string-2 {color: #f50;}
103
+ .cm-s-default .cm-meta {color: #555;}
104
+ .cm-s-default .cm-qualifier {color: #555;}
105
+ .cm-s-default .cm-builtin {color: #30a;}
106
+ .cm-s-default .cm-bracket {color: #997;}
107
+ .cm-s-default .cm-tag {color: #170;}
108
+ .cm-s-default .cm-attribute {color: #00c;}
109
+ .cm-s-default .cm-header {color: blue;}
110
+ .cm-s-default .cm-quote {color: #090;}
111
+ .cm-s-default .cm-hr {color: #999;}
112
+ .cm-s-default .cm-link {color: #00c;}
113
+
114
+ .cm-negative {color: #d44;}
115
+ .cm-positive {color: #292;}
116
+ .cm-header, .cm-strong {font-weight: bold;}
117
+ .cm-em {font-style: italic;}
118
+ .cm-link {text-decoration: underline;}
119
+ .cm-strikethrough {text-decoration: line-through;}
120
+
121
+ .cm-s-default .cm-error {color: #f00;}
122
+ .cm-invalidchar {color: #f00;}
123
+
124
+ .CodeMirror-composing { border-bottom: 2px solid; }
125
+
126
+ /* Default styles for common addons */
127
+
128
+ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
129
+ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
130
+ .CodeMirror-matchingtag {
131
+ background: #ff9600;
132
+ background: rgba(255, 150, 0, .3);
133
+ }
134
+ .CodeMirror-activeline-background {background: #e8f2ff;}
135
+
136
+ /* STOP */
137
+
138
+ /* The rest of this file contains styles related to the mechanics of
139
+ the editor. You probably shouldn't touch them. */
140
+
141
+ .CodeMirror {
142
+ position: relative;
143
+ overflow: hidden;
144
+ background: white;
145
+ }
146
+
147
+ .CodeMirror-scroll {
148
+ overflow: scroll !important; /* Things will break if this is overridden */
149
+ /* 30px is the magic margin used to hide the element's real scrollbars */
150
+ /* See overflow: hidden in .CodeMirror */
151
+ margin-bottom: -30px; margin-right: -30px;
152
+ padding-bottom: 30px;
153
+ height: 100%;
154
+ outline: none; /* Prevent dragging from highlighting the element */
155
+ position: relative;
156
+ }
157
+ .CodeMirror-sizer {
158
+ position: relative;
159
+ border-right: 30px solid transparent;
160
+ }
161
+
162
+ /* The fake, visible scrollbars. Used to force redraw during scrolling
163
+ before actual scrolling happens, thus preventing shaking and
164
+ flickering artifacts. */
165
+ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
166
+ position: absolute;
167
+ z-index: 6;
168
+ display: none;
169
+ }
170
+ .CodeMirror-vscrollbar {
171
+ right: 0; top: 0;
172
+ overflow-x: hidden;
173
+ overflow-y: scroll;
174
+ }
175
+ .CodeMirror-hscrollbar {
176
+ bottom: 0; left: 0;
177
+ overflow-y: hidden;
178
+ overflow-x: scroll;
179
+ }
180
+ .CodeMirror-scrollbar-filler {
181
+ right: 0; bottom: 0;
182
+ }
183
+ .CodeMirror-gutter-filler {
184
+ left: 0; bottom: 0;
185
+ }
186
+
187
+ .CodeMirror-gutters {
188
+ position: absolute; left: 0; top: 0;
189
+ z-index: 3;
190
+ }
191
+ .CodeMirror-gutter {
192
+ white-space: normal;
193
+ height: 100%;
194
+ display: inline-block;
195
+ margin-bottom: -30px;
196
+ }
197
+ .CodeMirror-gutter-wrapper {
198
+ position: absolute;
199
+ z-index: 4;
200
+ height: 100%;
201
+ }
202
+ .CodeMirror-gutter-elt {
203
+ position: absolute;
204
+ cursor: default;
205
+ z-index: 4;
206
+ }
207
+ .CodeMirror-gutter-wrapper {
208
+ -webkit-user-select: none;
209
+ -moz-user-select: none;
210
+ -ms-user-select: none;
211
+ user-select: none;
212
+ }
213
+
214
+ .CodeMirror-lines {
215
+ cursor: text;
216
+ min-height: 1px; /* prevents collapsing before first draw */
217
+ }
218
+ .CodeMirror pre {
219
+ /* Reset some styles that the rest of the page might have set */
220
+ -webkit-border-radius: 0;
221
+ border-radius: 0;
222
+ border-width: 0;
223
+ background: transparent;
224
+ font-family: inherit;
225
+ font-size: inherit;
226
+ margin: 0;
227
+ white-space: pre;
228
+ word-wrap: normal;
229
+ line-height: inherit;
230
+ color: inherit;
231
+ z-index: 2;
232
+ position: relative;
233
+ overflow: visible;
234
+ -webkit-tap-highlight-color: transparent;
235
+ }
236
+ .CodeMirror-wrap pre {
237
+ word-wrap: break-word;
238
+ white-space: pre-wrap;
239
+ word-break: normal;
240
+ }
241
+
242
+ .CodeMirror-linebackground {
243
+ position: absolute;
244
+ left: 0; right: 0; top: 0; bottom: 0;
245
+ z-index: 0;
246
+ }
247
+
248
+ .CodeMirror-linewidget {
249
+ position: relative;
250
+ z-index: 2;
251
+ overflow: auto;
252
+ }
253
+
254
+ .CodeMirror-widget {}
255
+
256
+ .CodeMirror-code {
257
+ outline: none;
258
+ }
259
+
260
+ /* Force content-box sizing for the elements where we expect it */
261
+ .CodeMirror-scroll,
262
+ .CodeMirror-sizer,
263
+ .CodeMirror-gutter,
264
+ .CodeMirror-gutters,
265
+ .CodeMirror-linenumber {
266
+ -moz-box-sizing: content-box;
267
+ -webkit-box-sizing: content-box;
268
+ box-sizing: content-box;
269
+ }
270
+
271
+ .CodeMirror-measure {
272
+ position: absolute;
273
+ width: 100%;
274
+ height: 0;
275
+ overflow: hidden;
276
+ visibility: hidden;
277
+ }
278
+ .CodeMirror-measure pre { position: static; }
279
+
280
+ .CodeMirror div.CodeMirror-cursor {
281
+ position: absolute;
282
+ border-right: none;
283
+ width: 0;
284
+ }
285
+
286
+ div.CodeMirror-cursors {
287
+ visibility: hidden;
288
+ position: relative;
289
+ z-index: 3;
290
+ }
291
+ .CodeMirror-focused div.CodeMirror-cursors {
292
+ visibility: visible;
293
+ }
294
+
295
+ .CodeMirror-selected { background: #d9d9d9; }
296
+ .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
297
+ .CodeMirror-crosshair { cursor: crosshair; }
298
+ .CodeMirror ::-moz-selection { background: #d7d4f0; }
299
+ .CodeMirror ::selection { background: #d7d4f0; }
300
+
301
+ .cm-searching {
302
+ background: #ffa;
303
+ background: rgba(255, 255, 0, .4);
304
+ }
305
+
306
+ /* Used to force a border model for a node */
307
+ .cm-force-border { padding-right: .1px; }
308
+
309
+ @media print {
310
+ /* Hide the cursor when printing */
311
+ .CodeMirror div.CodeMirror-cursors {
312
+ visibility: hidden;
313
+ }
314
+ }
315
+
316
+ /* See issue #2901 */
317
+ .cm-tab-wrap-hack:after { content: ''; }
318
+
319
+ /* Help users use markselection to safely style text background */
320
+ span.CodeMirror-selectedtext { background: none; }
321
+
322
+ /* CodeMirror Styling for TablePress page/customizations compared to original CSS in this file */
323
+ #option-custom-css,
324
+ #tablepress-page .CodeMirror {
325
+ font-family: Consolas, Monaco, monospace;
326
+ font-size: 14px;
327
+ line-height: 1.4;
328
+ width: 99%;
329
+ height: 100px;
330
+ margin: 1px 1px 7px;
331
+ }
332
+ #option-custom-css {
333
+ margin: 1px;
334
+ -moz-tab-size: 2;
335
+ -o-tab-size: 2;
336
+ tab-size: 2;
337
+ }
338
+ #tablepress-page .CodeMirror-scroll {
339
+ background-color: #ffffff;
340
+ border: 1px solid #dddddd;
341
+ -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.07);
342
+ box-shadow: inset 0 1px 2px rgba(0,0,0,0.07);
343
+ height: 98px;
344
+ padding-bottom: 0;
345
+ margin-right: 0;
346
+ }
347
+ #option-custom-css,
348
+ #tablepress-page .CodeMirror-lines {
349
+ padding: 4px 6px 1px 6px;
350
+ }
351
+ #tablepress-page .CodeMirror pre {
352
+ padding: 0;
353
+ }
354
+ #tablepress-page .CodeMirror.disabled .CodeMirror-scroll {
355
+ background-color: #eeeeee;
356
+ }
357
+ #tablepress-page .CodeMirror-focused .CodeMirror-scroll {
358
+ border-color: #999999;
359
+ }
360
+ #tablepress-page .CodeMirror-focused {
361
+ -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.1);
362
+ box-shadow: 0 1px 2px rgba(0,0,0,0.1);
363
+ }
364
+ #tablepress-page .CodeMirror-focused .CodeMirror-scroll {
365
+ -webkit-box-shadow: none;
366
+ box-shadow: none;
367
+ }
368
+
369
+ #tablepress-page .CodeMirror.large {
370
+ height: 500px;
371
+ }
372
+ #tablepress-page .CodeMirror.large .CodeMirror-scroll {
373
+ height: 498px;
374
+ }
admin/css/codemirror.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .CodeMirror{font-family:monospace;height:300px;color:#000}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror div.CodeMirror-cursor{border-left:1px solid #000}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.CodeMirror.cm-fat-cursor div.CodeMirror-cursor{width:auto;border:0;background:#7e7}.CodeMirror.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1)infinite;animation:blink 1.06s steps(1)infinite}@-webkit-keyframes blink{0%,100%{background:#7e7}50%{background:0 0}}@keyframes blink{0%,100%{background:#7e7}50%{background:0 0}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:#ff9600;background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-measure pre{position:static}.CodeMirror div.CodeMirror-cursor{position:absolute;border-right:none;width:0}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror ::selection,.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror ::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}#option-custom-css,#tablepress-page .CodeMirror{font-family:Consolas,Monaco,monospace;font-size:14px;line-height:1.4;width:99%;height:100px;margin:1px 1px 7px}#option-custom-css{margin:1px;-moz-tab-size:2;-o-tab-size:2;tab-size:2}#tablepress-page .CodeMirror-scroll{background-color:#fff;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);height:98px;padding-bottom:0;margin-right:0}#option-custom-css,#tablepress-page .CodeMirror-lines{padding:4px 6px 1px}#tablepress-page .CodeMirror pre{padding:0}#tablepress-page .CodeMirror.disabled .CodeMirror-scroll{background-color:#eee}#tablepress-page .CodeMirror-focused{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1);box-shadow:0 1px 2px rgba(0,0,0,.1)}#tablepress-page .CodeMirror-focused .CodeMirror-scroll{border-color:#999;-webkit-box-shadow:none;box-shadow:none}#tablepress-page .CodeMirror.large{height:500px}#tablepress-page .CodeMirror.large .CodeMirror-scroll{height:498px}
admin/css/common-rtl.css ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CSS code for all TablePress admin screens, special things for RTL languages.
3
+ *
4
+ * Fixes for certain elements that should remain LTR.
5
+ *
6
+ * @package TablePress
7
+ * @subpackage Views CSS
8
+ * @author Tobias Bäthge
9
+ * @since 1.1.0
10
+ */
11
+
12
+ #row-import-source td.column-2,
13
+ #row-import-type td.column-2 {
14
+ direction: ltr;
15
+ text-align: right;
16
+ }
17
+ #tablepress_add-add-table .form-field-small,
18
+ #table-new-id {
19
+ float:right;
20
+ }
21
+ #tablepress-page .table-shortcode {
22
+ width: 125px;
23
+ direction: ltr;
24
+ font-size: 13px;
25
+ vertical-align: baseline;
26
+ }
27
+ #tablepress-page .CodeMirror {
28
+ direction: ltr;
29
+ }
admin/css/common-rtl.min.css ADDED
@@ -0,0 +1 @@
 
1
+ #row-import-source td.column-2,#row-import-type td.column-2{direction:ltr;text-align:right}#table-new-id,#tablepress_add-add-table .form-field-small{float:right}#tablepress-page .table-shortcode{width:125px;direction:ltr;font-size:13px;vertical-align:baseline}#tablepress-page .CodeMirror{direction:ltr}
admin/css/common.css ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CSS code for all TablePress admin screens
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views CSS
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* Margins for messages on screens */
11
+ #tablepress-page div.notice {
12
+ margin: 10px 0 0;
13
+ }
14
+
15
+ /* Nav Tab Menu */
16
+ #tablepress-nav .separator {
17
+ margin: 6px;
18
+ }
19
+ #tablepress-nav .nav-tab {
20
+ border-bottom: 1px solid #cccccc;
21
+ }
22
+ #tablepress-nav .nav-tab-active {
23
+ border-bottom: 1px solid #f1f1f1;
24
+ }
25
+
26
+ /* Add New Table form */
27
+ #tablepress_add-add-table .form-wrap {
28
+ max-width: 500px;
29
+ }
30
+ #tablepress_add-add-table .form-field {
31
+ margin: 0;
32
+ }
33
+ /* Number of rows/columns in the "Add New Table" form */
34
+ #tablepress_add-add-table .form-field-small {
35
+ float: left;
36
+ width: 150px;
37
+ margin-right: 20px;
38
+ }
39
+
40
+ /* Placeholder fields in gray text color, but only if JS is enabled */
41
+ .js #tablepress-page .placeholder-active {
42
+ color: #bbbbbb;
43
+ }
44
+
45
+ /* Width of the columns on the "All Tables" list */
46
+ .tablepress-all-tables thead .column-table_id {
47
+ width: 50px;
48
+ }
49
+ .tablepress-all-tables thead .column-table_name {
50
+ width: 30%;
51
+ }
52
+ .tablepress-all-tables thead .column-table_author {
53
+ width: 12%;
54
+ }
55
+ .tablepress-all-tables thead .column-table_last_modified {
56
+ width: 15%;
57
+ }
58
+ /* Font weight for the table ID column */
59
+ .tablepress-all-tables tbody .column-table_id {
60
+ font-weight: bold;
61
+ }
62
+
63
+ /* Search results for WP_List_Table */
64
+ #tablepress-page .subtitle {
65
+ float: left;
66
+ padding-left: 0;
67
+ }
68
+
69
+ /* Inline Shortcodes, in texts */
70
+ #tablepress-page .table-shortcode-inline {
71
+ background: transparent;
72
+ border: none;
73
+ color: #333333;
74
+ width: 110px;
75
+ margin: 0;
76
+ padding: 0;
77
+ font-weight: bold;
78
+ -webkit-box-shadow: none;
79
+ box-shadow: none;
80
+ text-align: center;
81
+ vertical-align: top;
82
+ }
83
+ #tablepress-page .table-shortcode {
84
+ cursor: text;
85
+ }
86
+
87
+ /* Table ID/name dropdown on "Export" screen */
88
+ #tablepress-page #tables-export {
89
+ width: 100%;
90
+ height: auto;
91
+ line-height: normal;
92
+ }
93
+
94
+ /* Red border for form fields that have invalid values */
95
+ #tablepress-page form :invalid,
96
+ #tablepress-page form .invalid {
97
+ border-color: #cc0000 !important;
98
+ }
99
+
100
+ /* Tables in postboxes (on the "Edit" and "Plugin Options" screens) */
101
+ .tablepress-postbox-table {
102
+ border-spacing: 0;
103
+ max-width: 1000px;
104
+ width: 100%;
105
+ }
106
+ /* Default column widths */
107
+ .tablepress-postbox-table .column-1 {
108
+ width: 25%;
109
+ }
110
+ .tablepress-postbox-table .column-2 {
111
+ width: 75%;
112
+ }
113
+ .tablepress-postbox-table th {
114
+ text-align:left;
115
+ font-weight: normal;
116
+ }
117
+ .tablepress-postbox-table th,
118
+ .tablepress-postbox-table td {
119
+ padding: 2px;
120
+ word-wrap: break-word;
121
+ }
122
+ .tablepress-postbox-table .top-border th,
123
+ .tablepress-postbox-table .top-border td {
124
+ padding-top: 6px;
125
+ }
126
+ .tablepress-postbox-table .bottom-border th,
127
+ .tablepress-postbox-table .bottom-border td {
128
+ padding-bottom: 6px;
129
+ border-bottom: 1px solid #eeeeee;
130
+ }
131
+ .tablepress-postbox-table .top-align {
132
+ vertical-align: top;
133
+ padding-top: 6px;
134
+ }
135
+ /* Adjust positioning of labels in relation to checkboxes/radio buttons */
136
+ #tablepress_edit-table-options .column-2 label,
137
+ #tablepress_edit-datatables-features .column-2 label {
138
+ vertical-align: top;
139
+ }
140
+ #tablepress_import-import-form .column-2 label,
141
+ #tablepress_import-import-wp-table-reloaded .column-2 label {
142
+ vertical-align: top;
143
+ margin-right: 20px; /* some margin on radio buttons */
144
+ }
145
+ #tablepress-page input,
146
+ #tablepress-page .button {
147
+ vertical-align: middle;
148
+ }
149
+ #tablepress-page .widefat th input {
150
+ vertical-align: text-top;
151
+ }
152
+ /* Red color for the "Uninstall TablePress" button on the "Plugin Options" screen */
153
+ #uninstall-tablepress {
154
+ color: #BC0B0B;
155
+ }
admin/css/common.min.css ADDED
@@ -0,0 +1 @@
 
1
+ #tablepress-page div.notice{margin:10px 0 0}#tablepress-nav .separator{margin:6px}#tablepress-nav .nav-tab{border-bottom:1px solid #ccc}#tablepress-nav .nav-tab-active{border-bottom:1px solid #f1f1f1}#tablepress_add-add-table .form-wrap{max-width:500px}#tablepress_add-add-table .form-field{margin:0}#tablepress_add-add-table .form-field-small{float:left;width:150px;margin-right:20px}.js #tablepress-page .placeholder-active{color:#bbb}.tablepress-all-tables thead .column-table_id{width:50px}.tablepress-all-tables thead .column-table_name{width:30%}.tablepress-all-tables thead .column-table_author{width:12%}.tablepress-all-tables thead .column-table_last_modified{width:15%}.tablepress-all-tables tbody .column-table_id{font-weight:700}#tablepress-page .subtitle{float:left;padding-left:0}#tablepress-page .table-shortcode-inline{background:0 0;border:none;color:#333;width:110px;margin:0;padding:0;font-weight:700;-webkit-box-shadow:none;box-shadow:none;text-align:center;vertical-align:top}#tablepress-page .table-shortcode{cursor:text}#tablepress-page #tables-export{width:100%;height:auto;line-height:normal}#tablepress-page form .invalid,#tablepress-page form :invalid{border-color:#c00!important}.tablepress-postbox-table{border-spacing:0;max-width:1000px;width:100%}.tablepress-postbox-table .column-1{width:25%}.tablepress-postbox-table .column-2{width:75%}.tablepress-postbox-table th{text-align:left;font-weight:400}.tablepress-postbox-table td,.tablepress-postbox-table th{padding:2px;word-wrap:break-word}.tablepress-postbox-table .top-border td,.tablepress-postbox-table .top-border th{padding-top:6px}.tablepress-postbox-table .bottom-border td,.tablepress-postbox-table .bottom-border th{padding-bottom:6px;border-bottom:1px solid #eee}.tablepress-postbox-table .top-align{vertical-align:top;padding-top:6px}#tablepress_edit-datatables-features .column-2 label,#tablepress_edit-table-options .column-2 label{vertical-align:top}#tablepress_import-import-form .column-2 label,#tablepress_import-import-wp-table-reloaded .column-2 label{vertical-align:top;margin-right:20px}#tablepress-page .button,#tablepress-page input{vertical-align:middle}#tablepress-page .widefat th input{vertical-align:text-top}#uninstall-tablepress{color:#BC0B0B}
admin/css/edit.css ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CSS code for the "Edit" screen
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views CSS
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* Hour glass cursor, while waiting for AJAX */
11
+ body.wait * {
12
+ cursor: wait !important;
13
+ }
14
+
15
+ /* container for Table Preview and Advanced Editor Thickboxes */
16
+ .hidden-container {
17
+ display: none;
18
+ }
19
+
20
+ /* Margin in Help boxes */
21
+ .hidden-help-box-container p {
22
+ margin: 6px;
23
+ }
24
+
25
+ /* Allow wide tables to scroll sideways, only on "Edit" screen */
26
+ body,
27
+ #wpwrap,
28
+ #wpbody-content {
29
+ overflow: visible !important; /* !important is necessary to override an inline style that postboxes.js sets via JS */
30
+ }
31
+
32
+ /* Move Thickbox more to the front, so that it's always above a jQuery UI dialog */
33
+ #TB_HideSelect {
34
+ z-index: 301099;
35
+ }
36
+ #TB_overlay,
37
+ .media-modal {
38
+ z-index: 301100;
39
+ }
40
+ #TB_window {
41
+ z-index: 301102;
42
+ }
43
+ #TB_load {
44
+ z-index: 301103;
45
+ }
46
+
47
+ /* Move backdrop of the wpLink dialog above the "Advanced Editor" dialog */
48
+ body #wp-link-backdrop {
49
+ z-index: 100103;
50
+ }
51
+
52
+ /* Table Preview (CSS for actual preview is directly in the preview HTML) */
53
+ #table-preview-iframe {
54
+ width: 100%;
55
+ height: 100%;
56
+ }
57
+ /* Account for additional padding of #TB_WindowContent in direct preview */
58
+ #table-preview {
59
+ height: 100%;
60
+ margin: -2px -15px -15px -15px;
61
+ }
62
+
63
+ /* Content of the Advanced Editor jQueryUI dialog */
64
+ #advanced-editor {
65
+ padding: 5px;
66
+ }
67
+ #advanced-editor .wp-editor-container {
68
+ border: none;
69
+ }
70
+ #advanced-editor .submitbox {
71
+ padding: 5px 5px 0;
72
+ font-size: 12px;
73
+ }
74
+ #advanced-editor-confirm {
75
+ float: right;
76
+ }
77
+ #advanced-editor-cancel {
78
+ line-height: 30px;
79
+ }
80
+
81
+ /* Spinner/loading animation that is shown during saving/preview preparation */
82
+ .spinner.animation-saving,
83
+ .spinner.animation-preview {
84
+ float: none;
85
+ margin: 0 0 0 6px;
86
+ }
87
+
88
+ /* Margins for dynamically created (inline) .notice messages */
89
+ #tablepress-page div.ajax-alert {
90
+ margin: -10px 0 15px;
91
+ }
92
+ #tablepress-page div.ajax-alert p {
93
+ font-weight: bold;
94
+ }
95
+ #tablepress-page div.ajax-alert pre {
96
+ margin: -6px 0 0.5em 2px;
97
+ }
98
+ #tablepress-page div.ajax-alert pre + p {
99
+ display: none;
100
+ }
101
+
102
+ #tablepress-page #tablepress_edit-table-data {
103
+ display: inline-block; /* Stretch to the width of the table */
104
+ min-width: 99.9%; /* but use the full width, minus approx. 1px as the box is wider than the others otherwise */
105
+ }
106
+ /* Reinstate hide-if-js functionality, due to higher specificity of ID selectors (necessary when hiding postboxes) */
107
+ #tablepress-page #tablepress_edit-table-data.hide-if-js {
108
+ display: none;
109
+ }
110
+
111
+ #tablepress-page .small-text {
112
+ width: 65px;
113
+ padding: 3px 5px;
114
+ }
115
+ #tablepress-page #table-new-id {
116
+ width: 120px;
117
+ }
118
+
119
+ /* Table cells */
120
+ #edit-form-body td {
121
+ padding: 2px 1px;
122
+ height: 32px;
123
+ }
124
+
125
+ /* Cells of currently focused row ("auto grow") */
126
+ .no-js #edit-form-body td,
127
+ #edit-form-body .focus td {
128
+ height: 70px;
129
+ }
130
+
131
+ /* Alternating row colors */
132
+ #edit-form-body .odd {
133
+ background-color: #f1f1f1;
134
+ }
135
+
136
+ #edit-form-body textarea {
137
+ display: block;
138
+ min-width: 150px;
139
+ width: 100%;
140
+ width: auto\0/IE; /* IE hack, as cells will otherwise shrink and overlap instead of horizontal scrolling kicking in */
141
+ height: 100%;
142
+ }
143
+ #edit-form-body textarea:focus {
144
+ border-color: #333333;
145
+ }
146
+
147
+ /* For faster drawing performance, and hopefully faster scrolling */
148
+ #tablepress-page input[type="text"],
149
+ #tablepress-page textarea,
150
+ #tablepress-page select {
151
+ -webkit-box-shadow: none;
152
+ box-shadow: none;
153
+ -webkit-transition: all 0 ease 0;
154
+ transition: all 0 ease 0;
155
+ }
156
+
157
+ #edit-form-foot input[type="checkbox"] {
158
+ margin: 6px 0 3px;
159
+ }
160
+
161
+ #edit-form {
162
+ border-collapse: collapse;
163
+ }
164
+
165
+ /* Allow moving rows and columns with jQueryUI sortable */
166
+ #edit-form .move-handle {
167
+ display: block;
168
+ margin: auto;
169
+ width: 16px;
170
+ height: 16px;
171
+ text-align: center;
172
+ font-weight: bold;
173
+ }
174
+ .js #edit-form .move-handle {
175
+ cursor: move;
176
+ }
177
+ #edit-form-body .move-handle {
178
+ margin: auto 3px;
179
+ min-width: 16px;
180
+ width: auto;
181
+ }
182
+
183
+ #edit-form .move-hover {
184
+ position: absolute;
185
+ z-index: 1000;
186
+ height: 26px; /* height of "#edit-form-body td" - 6px */
187
+ }
188
+ #edit-form .focus .move-hover {
189
+ height: 64px; /* height of "#edit-form-body .focus td" - 6px */
190
+ }
191
+
192
+ /* Highlighting of table head and foot in table cells */
193
+ #edit-form-body .head-row,
194
+ #edit-form-body .foot-row {
195
+ background-color: #d9edf7;
196
+ }
197
+
198
+ /* Head cells (column letters) and sorting */
199
+ #edit-form-head .sort-control {
200
+ float: right;
201
+ height: 18px;
202
+ cursor: pointer;
203
+ margin-right: 2px;
204
+ }
205
+ #edit-form-head .sorting-indicator {
206
+ display: block;
207
+ }
208
+ #edit-form-head .sort-asc .sorting-indicator:before {
209
+ content: '\f142';
210
+ }
211
+
212
+ #edit-form-head .sort-desc .sorting-indicator:before {
213
+ content: '\f140';
214
+ }
215
+
216
+ /* (red) highlighting of hidden rows and columns */
217
+ #edit-form .row-hidden td,
218
+ /* #edit-form .row-hidden th, */
219
+ #edit-form .row-hidden textarea,
220
+ #edit-form .column-hidden,
221
+ #edit-form .column-hidden textarea {
222
+ background-color: #ffe0e0;
223
+ }
224
+
225
+ #tablepress_edit-table-manipulation .column-1 {
226
+ width: 45%;
227
+ }
228
+ #tablepress_edit-table-manipulation .column-2 {
229
+ width: 55%;
230
+ }
admin/css/edit.min.css ADDED
@@ -0,0 +1 @@
 
1
+ #tablepress-page div.ajax-alert pre+p,.hidden-container{display:none}body.wait *{cursor:wait!important}.hidden-help-box-container p{margin:6px}#wpbody-content,#wpwrap,body{overflow:visible!important}#TB_HideSelect{z-index:301099}#TB_overlay,.media-modal{z-index:301100}#TB_window{z-index:301102}#TB_load{z-index:301103}body #wp-link-backdrop{z-index:100103}#table-preview-iframe{width:100%;height:100%}#table-preview{height:100%;margin:-2px -15px -15px}#advanced-editor{padding:5px}#advanced-editor .wp-editor-container{border:none}#advanced-editor .submitbox{padding:5px 5px 0;font-size:12px}#advanced-editor-confirm{float:right}#advanced-editor-cancel{line-height:30px}.spinner.animation-preview,.spinner.animation-saving{float:none;margin:0 0 0 6px}#tablepress-page div.ajax-alert{margin:-10px 0 15px}#tablepress-page div.ajax-alert p{font-weight:700}#tablepress-page div.ajax-alert pre{margin:-6px 0 .5em 2px}#tablepress-page #tablepress_edit-table-data{display:inline-block;min-width:99.9%}#tablepress-page #tablepress_edit-table-data.hide-if-js{display:none}#tablepress-page .small-text{width:65px;padding:3px 5px}#tablepress-page #table-new-id{width:120px}#edit-form-body td{padding:2px 1px;height:32px}#edit-form-body .focus td,.no-js #edit-form-body td{height:70px}#edit-form-body .odd{background-color:#f1f1f1}#edit-form-body textarea{display:block;min-width:150px;width:100%;width:auto\0/IE;height:100%}#edit-form-body textarea:focus{border-color:#333}#tablepress-page input[type=text],#tablepress-page select,#tablepress-page textarea{-webkit-box-shadow:none;box-shadow:none;-webkit-transition:all 0 ease 0;transition:all 0 ease 0}#edit-form-foot input[type=checkbox]{margin:6px 0 3px}#edit-form{border-collapse:collapse}#edit-form .move-handle{display:block;margin:auto;width:16px;height:16px;text-align:center;font-weight:700}.js #edit-form .move-handle{cursor:move}#edit-form-body .move-handle{margin:auto 3px;min-width:16px;width:auto}#edit-form .move-hover{position:absolute;z-index:1000;height:26px}#edit-form .focus .move-hover{height:64px}#edit-form-body .foot-row,#edit-form-body .head-row{background-color:#d9edf7}#edit-form-head .sort-control{float:right;height:18px;cursor:pointer;margin-right:2px}#edit-form-head .sorting-indicator{display:block}#edit-form-head .sort-asc .sorting-indicator:before{content:'\f142'}#edit-form-head .sort-desc .sorting-indicator:before{content:'\f140'}#edit-form .column-hidden,#edit-form .column-hidden textarea,#edit-form .row-hidden td,#edit-form .row-hidden textarea{background-color:#ffe0e0}#tablepress_edit-table-manipulation .column-1{width:45%}#tablepress_edit-table-manipulation .column-2{width:55%}
admin/css/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
admin/img/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
admin/img/tablepress-editor-button-2x.png ADDED
Binary file
admin/img/tablepress-editor-button.png ADDED
Binary file
admin/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
admin/js/add.js ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for the "Add New" screen
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* global validateForm */
11
+
12
+ jQuery( document ).ready( function( $ ) {
13
+
14
+ 'use strict';
15
+
16
+ /**
17
+ * Check, whether entered numbers for rows and columns are valid
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ $( '#tablepress-page' ).find( 'form' ).on( 'submit', function( /* event */ ) {
22
+ var valid_form = true;
23
+
24
+ // remove default values from required placeholders, if no value was entered
25
+ $( '#tablepress-page' ).find( '.form-required' ).find( '.placeholder' ).each( function() {
26
+ if ( this.value === this.defaultValue ) {
27
+ this.value = '';
28
+ $(this).removeClass( 'placeholder-active' );
29
+ }
30
+ } );
31
+
32
+ // WordPress validation function, checks if required fields (.form-required) are non-empty
33
+ if ( ! validateForm( $(this) ) ) {
34
+ valid_form = false;
35
+ }
36
+
37
+ // validate numerical values (.form-field-numbers-only): only 1 < x < 9...9 (up to maxlength) are allowed
38
+ $( '#tablepress-page' ).find( '.form-field-numbers-only' ).find( 'input' ).each( function() {
39
+ var $field = $(this),
40
+ maxlength = parseInt( $field.attr( 'maxlength' ), 10 ),
41
+ regexp_number;
42
+
43
+ if ( ! isNaN( maxlength ) ) {
44
+ maxlength += -1; // first number is handled already in RegExp
45
+ } else {
46
+ maxlength = '';
47
+ }
48
+
49
+ regexp_number = new RegExp( '^[1-9][0-9]{0,' + maxlength + '}$' );
50
+ if ( regexp_number.test( $field.val() ) ) {
51
+ return; // field is valid
52
+ }
53
+
54
+ $field
55
+ .one( 'change', function() { $(this).closest( '.form-invalid' ).removeClass( 'form-invalid' ); } )
56
+ .focus().select()
57
+ .closest( '.form-field' ).addClass( 'form-invalid' );
58
+ valid_form = false;
59
+ } );
60
+
61
+ if ( ! valid_form ) {
62
+ return false;
63
+ }
64
+ // at this point, the form is valid and will be submitted
65
+
66
+ // remove the default values of optional fields, as we don't want to save those
67
+ $( '#tablepress-page' ).find( '.placeholder' ).each( function() {
68
+ if ( this.value === this.defaultValue ) {
69
+ this.value = '';
70
+ }
71
+ } );
72
+ } );
73
+
74
+ } );
admin/js/add.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){"use strict";a("#tablepress-page").find("form").on("submit",function(){var b=!0;return a("#tablepress-page").find(".form-required").find(".placeholder").each(function(){this.value===this.defaultValue&&(this.value="",a(this).removeClass("placeholder-active"))}),validateForm(a(this))||(b=!1),a("#tablepress-page").find(".form-field-numbers-only").find("input").each(function(){var c,d=a(this),e=parseInt(d.attr("maxlength"),10);isNaN(e)?e="":e+=-1,c=new RegExp("^[1-9][0-9]{0,"+e+"}$"),c.test(d.val())||(d.one("change",function(){a(this).closest(".form-invalid").removeClass("form-invalid")}).focus().select().closest(".form-field").addClass("form-invalid"),b=!1)}),b?void a("#tablepress-page").find(".placeholder").each(function(){this.value===this.defaultValue&&(this.value="")}):!1})});
admin/js/codemirror.min.js ADDED
@@ -0,0 +1,310 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // CodeMirror version 5.2.0
2
+ (function(q){if("object"==typeof exports&&"object"==typeof module)module.exports=q();else{if("function"==typeof define&&define.amd)return define([],q);this.CodeMirror=q()}})(function(){function q(a,b){if(!(this instanceof q))return new q(a,b);this.options=b=b?V(b):{};V(qf,b,!1);wc(b);var c=b.value;"string"==typeof c&&(c=new P(c,b.mode));this.doc=c;var d=new q.inputStyles[b.inputStyle](this),d=this.display=new rf(a,c,d);d.wrapper.CodeMirror=this;Ad(this);Bd(this);b.lineWrapping&&(this.display.wrapper.className+=
3
+ " CodeMirror-wrap");b.autofocus&&!ab&&d.input.focus();Cd(this);this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,draggingText:!1,highlight:new bb,keySeq:null,specialChars:null};var e=this;B&&11>C&&setTimeout(function(){e.display.input.reset(!0)},20);sf(this);Dd||(tf(),Dd=!0);Ja(this);this.curOp.forceUpdate=!0;Ed(this,c);b.autofocus&&!ab||e.hasFocus()?setTimeout(cb(xc,this),20):db(this);for(var f in Ka)if(Ka.hasOwnProperty(f))Ka[f](this,
4
+ b[f],Fd);Gd(this);b.finishInit&&b.finishInit(this);for(c=0;c<yc.length;++c)yc[c](this);La(this);J&&b.lineWrapping&&"optimizelegibility"==getComputedStyle(d.lineDiv).textRendering&&(d.lineDiv.style.textRendering="auto")}function rf(a,b,c){this.input=c;this.scrollbarFiller=t("div",null,"CodeMirror-scrollbar-filler");this.scrollbarFiller.setAttribute("cm-not-content","true");this.gutterFiller=t("div",null,"CodeMirror-gutter-filler");this.gutterFiller.setAttribute("cm-not-content","true");this.lineDiv=
5
+ t("div",null,"CodeMirror-code");this.selectionDiv=t("div",null,null,"position: relative; z-index: 1");this.cursorDiv=t("div",null,"CodeMirror-cursors");this.measure=t("div",null,"CodeMirror-measure");this.lineMeasure=t("div",null,"CodeMirror-measure");this.lineSpace=t("div",[this.measure,this.lineMeasure,this.selectionDiv,this.cursorDiv,this.lineDiv],null,"position: relative; outline: none");this.mover=t("div",[t("div",[this.lineSpace],"CodeMirror-lines")],null,"position: relative");this.sizer=t("div",
6
+ [this.mover],"CodeMirror-sizer");this.sizerWidth=null;this.heightForcer=t("div",null,null,"position: absolute; height: "+Hd+"px; width: 1px;");this.gutters=t("div",null,"CodeMirror-gutters");this.lineGutter=null;this.scroller=t("div",[this.sizer,this.heightForcer,this.gutters],"CodeMirror-scroll");this.scroller.setAttribute("tabIndex","-1");this.wrapper=t("div",[this.scrollbarFiller,this.gutterFiller,this.scroller],"CodeMirror");B&&8>C&&(this.gutters.style.zIndex=-1,this.scroller.style.paddingRight=
7
+ 0);J||wa&&ab||(this.scroller.draggable=!0);a&&(a.appendChild?a.appendChild(this.wrapper):a(this.wrapper));this.reportedViewFrom=this.reportedViewTo=this.viewFrom=this.viewTo=b.first;this.view=[];this.externalMeasured=this.renderedView=null;this.lastWrapHeight=this.lastWrapWidth=this.viewOffset=0;this.updateLineNumbers=null;this.nativeBarWidth=this.barHeight=this.barWidth=0;this.scrollbarsClipped=!1;this.lineNumWidth=this.lineNumInnerWidth=this.lineNumChars=null;this.alignWidgets=!1;this.maxLine=this.cachedCharWidth=
8
+ this.cachedTextHeight=this.cachedPaddingH=null;this.maxLineLength=0;this.maxLineChanged=!1;this.wheelDX=this.wheelDY=this.wheelStartX=this.wheelStartY=null;this.shift=!1;this.activeTouch=this.selForContextMenu=null;c.init(this)}function zc(a){a.doc.mode=q.getMode(a.options,a.doc.modeOption);eb(a)}function eb(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null);a.styles&&(a.styles=null)});a.doc.frontier=a.doc.first;fb(a,100);a.state.modeGen++;a.curOp&&Q(a)}function Id(a){var b=xa(a.display),
9
+ c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/gb(a.display)-3);return function(e){if(ya(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;g<e.widgets.length;g++)e.widgets[g].height&&(f+=e.widgets[g].height);return c?f+(Math.ceil(e.text.length/d)||1)*b:f+b}}function Ac(a){var b=a.doc,c=Id(a);b.iter(function(a){var b=c(a);b!=a.height&&ca(a,b)})}function Bd(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+a.options.theme.replace(/(^|\s)\s*/g,
10
+ " cm-s-");hb(a)}function ib(a){Ad(a);Q(a);setTimeout(function(){Bc(a)},20)}function Ad(a){var b=a.display.gutters,c=a.options.gutters;za(b);for(var d=0;d<c.length;++d){var e=c[d],f=b.appendChild(t("div",null,"CodeMirror-gutter "+e));"CodeMirror-linenumbers"==e&&(a.display.lineGutter=f,f.style.width=(a.display.lineNumWidth||1)+"px")}b.style.display=d?"":"none";Cc(a)}function Cc(a){a.display.sizer.style.marginLeft=a.display.gutters.offsetWidth+"px"}function Kb(a){if(0==a.height)return 0;for(var b=a.text.length,
11
+ c,d=a;c=Aa(d,!0);)c=c.find(0,!0),d=c.from.line,b+=c.from.ch-c.to.ch;for(d=a;c=Aa(d,!1);)c=c.find(0,!0),b-=d.text.length-c.from.ch,d=c.to.line,b+=d.text.length-c.to.ch;return b}function Dc(a){var b=a.display;a=a.doc;b.maxLine=u(a,a.first);b.maxLineLength=Kb(b.maxLine);b.maxLineChanged=!0;a.iter(function(a){var d=Kb(a);d>b.maxLineLength&&(b.maxLineLength=d,b.maxLine=a)})}function wc(a){var b=D(a.gutters,"CodeMirror-linenumbers");-1==b&&a.lineNumbers?a.gutters=a.gutters.concat(["CodeMirror-linenumbers"]):
12
+ -1<b&&!a.lineNumbers&&(a.gutters=a.gutters.slice(0),a.gutters.splice(b,1))}function jb(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+Ec(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+da(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,gutterWidth:c}}function Fc(a,b,c){this.cm=
13
+ c;var d=this.vert=t("div",[t("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),e=this.horiz=t("div",[t("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");a(d);a(e);v(d,"scroll",function(){d.clientHeight&&b(d.scrollTop,"vertical")});v(e,"scroll",function(){e.clientWidth&&b(e.scrollLeft,"horizontal")});this.checkedOverlay=!1;B&&8>C&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function Gc(){}function Cd(a){a.display.scrollbars&&(a.display.scrollbars.clear(),
14
+ a.display.scrollbars.addClass&&kb(a.display.wrapper,a.display.scrollbars.addClass));a.display.scrollbars=new q.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller);v(b,"mousedown",function(){a.state.focused&&setTimeout(function(){a.display.input.focus()},0)});b.setAttribute("cm-not-content","true")},function(b,c){"horizontal"==c?Ma(a,b):lb(a,b)},a);a.display.scrollbars.addClass&&mb(a.display.wrapper,a.display.scrollbars.addClass)}function Na(a,
15
+ b){b||(b=jb(a));var c=a.display.barWidth,d=a.display.barHeight;Jd(a,b);for(var e=0;4>e&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&Lb(a),Jd(a,jb(a)),c=a.display.barWidth,d=a.display.barHeight}function Jd(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+"px";c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+"px";d.right&&d.bottom?(c.scrollbarFiller.style.display="block",c.scrollbarFiller.style.height=
16
+ d.bottom+"px",c.scrollbarFiller.style.width=d.right+"px"):c.scrollbarFiller.style.display="";d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display="block",c.gutterFiller.style.height=d.bottom+"px",c.gutterFiller.style.width=b.gutterWidth+"px"):c.gutterFiller.style.display=""}function Hc(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop,d=Math.floor(d-a.lineSpace.offsetTop),e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,d=Ba(b,d),
17
+ e=Ba(b,e);if(c&&c.ensure){var f=c.ensure.from.line;c=c.ensure.to.line;f<d?(d=f,e=Ba(b,ea(u(b,f))+a.wrapper.clientHeight)):Math.min(c,b.lastLine())>=e&&(d=Ba(b,ea(u(b,c))-a.wrapper.clientHeight),e=c)}return{from:d,to:Math.max(e,d+1)}}function Bc(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=Ic(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+"px",g=0;g<c.length;g++)if(!c[g].hidden){a.options.fixedGutter&&c[g].gutter&&(c[g].gutter.style.left=
18
+ f);var h=c[g].alignable;if(h)for(var k=0;k<h.length;k++)h[k].style.left=f}a.options.fixedGutter&&(b.gutters.style.left=d+e+"px")}}function Gd(a){if(!a.options.lineNumbers)return!1;var b=a.doc,b=Jc(a.options,b.first+b.size-1),c=a.display;if(b.length!=c.lineNumChars){var d=c.measure.appendChild(t("div",[t("div",b)],"CodeMirror-linenumber CodeMirror-gutter-elt")),e=d.firstChild.offsetWidth,d=d.offsetWidth-e;c.lineGutter.style.width="";c.lineNumInnerWidth=Math.max(e,c.lineGutter.offsetWidth-d)+1;c.lineNumWidth=
19
+ c.lineNumInnerWidth+d;c.lineNumChars=c.lineNumInnerWidth?b.length:-1;c.lineGutter.style.width=c.lineNumWidth+"px";Cc(a);return!0}return!1}function Jc(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}function Ic(a){return a.scroller.getBoundingClientRect().left-a.sizer.getBoundingClientRect().left}function Mb(a,b,c){var d=a.display;this.viewport=b;this.visible=Hc(d,a.doc,b);this.editorIsHidden=!d.wrapper.offsetWidth;this.wrapperHeight=d.wrapper.clientHeight;this.wrapperWidth=d.wrapper.clientWidth;
20
+ this.oldDisplayWidth=pa(a);this.force=c;this.dims=Kc(a);this.events=[]}function Lc(a,b){var c=a.display,d=a.doc;if(b.editorIsHidden)return qa(a),!1;if(!b.force&&b.visible.from>=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==Kd(a))return!1;Gd(a)&&(qa(a),b.dims=Kc(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,d.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFrom<f&&20>f-c.viewFrom&&
21
+ (f=Math.max(d.first,c.viewFrom));c.viewTo>g&&20>c.viewTo-g&&(g=Math.min(e,c.viewTo));ra&&(f=Mc(a.doc,f),g=Ld(a.doc,g));d=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;e=a.display;0==e.view.length||f>=e.viewTo||g<=e.viewFrom?(e.view=Nb(a,f,g),e.viewFrom=f):(e.viewFrom>f?e.view=Nb(a,f,e.viewFrom).concat(e.view):e.viewFrom<f&&(e.view=e.view.slice(Ca(a,f))),e.viewFrom=f,e.viewTo<g?e.view=e.view.concat(Nb(a,e.viewTo,g)):e.viewTo>g&&(e.view=e.view.slice(0,
22
+ Ca(a,g))));e.viewTo=g;c.viewOffset=ea(u(a.doc,c.viewFrom));a.display.mover.style.top=c.viewOffset+"px";g=Kd(a);if(!d&&0==g&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;f=fa();4<g&&(c.lineDiv.style.display="none");uf(a,c.updateLineNumbers,b.dims);4<g&&(c.lineDiv.style.display="");c.renderedView=c.view;f&&fa()!=f&&f.offsetHeight&&f.focus();za(c.cursorDiv);za(c.selectionDiv);c.gutters.style.height=0;d&&(c.lastWrapHeight=b.wrapperHeight,c.lastWrapWidth=
23
+ b.wrapperWidth,fb(a,400));c.updateLineNumbers=null;return!0}function Md(a,b){for(var c=b.viewport,d=!0;;d=!1){if(!d||!a.options.lineWrapping||b.oldDisplayWidth==pa(a))if(c&&null!=c.top&&(c={top:Math.min(a.doc.height+Ec(a.display)-Nc(a),c.top)}),b.visible=Hc(a.display,a.doc,c),b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)break;if(!Lc(a,b))break;Lb(a);d=jb(a);nb(a);Oc(a,d);Na(a,d)}b.signal(a,"update",a);if(a.display.viewFrom!=a.display.reportedViewFrom||a.display.viewTo!=a.display.reportedViewTo)b.signal(a,
24
+ "viewportChange",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo}function Pc(a,b){var c=new Mb(a,b);if(Lc(a,c)){Lb(a);Md(a,c);var d=jb(a);nb(a);Oc(a,d);Na(a,d);c.finish()}}function Oc(a,b){a.display.sizer.style.minHeight=b.docHeight+"px";var c=b.docHeight+a.display.barHeight;a.display.heightForcer.style.top=c+"px";a.display.gutters.style.height=Math.max(c+da(a),b.clientHeight)+"px"}function Lb(a){a=a.display;for(var b=
25
+ a.lineDiv.offsetTop,c=0;c<a.view.length;c++){var d=a.view[c],e;if(!d.hidden){if(B&&8>C){var f=d.node.offsetTop+d.node.offsetHeight;e=f-b;b=f}else e=d.node.getBoundingClientRect(),e=e.bottom-e.top;f=d.line.height-e;2>e&&(e=xa(a));if(.001<f||-.001>f)if(ca(d.line,e),Nd(d.line),d.rest)for(e=0;e<d.rest.length;e++)Nd(d.rest[e])}}}function Nd(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b)a.widgets[b].height=a.widgets[b].node.offsetHeight}function Kc(a){for(var b=a.display,c={},d={},e=b.gutters.clientLeft,
26
+ f=b.gutters.firstChild,g=0;f;f=f.nextSibling,++g)c[a.options.gutters[g]]=f.offsetLeft+f.clientLeft+e,d[a.options.gutters[g]]=f.clientWidth;return{fixedPos:Ic(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function uf(a,b,c){function d(b){var c=b.nextSibling;J&&W&&a.display.currentWheelTarget==b?b.style.display="none":b.parentNode.removeChild(b);return c}for(var e=a.display,f=a.options.lineNumbers,g=e.lineDiv,h=g.firstChild,k=e.view,e=e.viewFrom,
27
+ l=0;l<k.length;l++){var m=k[l];if(!m.hidden)if(m.node&&m.node.parentNode==g){for(;h!=m.node;)h=d(h);h=f&&null!=b&&b<=e&&m.lineNumber;m.changes&&(-1<D(m.changes,"gutter")&&(h=!1),Od(a,m,e,c));h&&(za(m.lineNumber),m.lineNumber.appendChild(document.createTextNode(Jc(a.options,e))));h=m.node.nextSibling}else{var p=vf(a,m,e,c);g.insertBefore(p,h)}e+=m.size}for(;h;)h=d(h)}function Od(a,b,c,d){for(var e=0;e<b.changes.length;e++){var f=b.changes[e];if("text"==f){var f=b,g=f.text.className,h=Pd(a,f);f.text==
28
+ f.node&&(f.node=h.pre);f.text.parentNode.replaceChild(h.pre,f.text);f.text=h.pre;h.bgClass!=f.bgClass||h.textClass!=f.textClass?(f.bgClass=h.bgClass,f.textClass=h.textClass,Qc(f)):g&&(f.text.className=g)}else if("gutter"==f)Qd(a,b,c,d);else if("class"==f)Qc(b);else if("widget"==f){f=a;g=b;h=d;g.alignable&&(g.alignable=null);for(var k=g.node.firstChild,l=void 0;k;k=l)l=k.nextSibling,"CodeMirror-linewidget"==k.className&&g.node.removeChild(k);Rd(f,g,h)}}b.changes=null}function Ob(a){a.node==a.text&&
29
+ (a.node=t("div",null,null,"position: relative"),a.text.parentNode&&a.text.parentNode.replaceChild(a.node,a.text),a.node.appendChild(a.text),B&&8>C&&(a.node.style.zIndex=2));return a.node}function Pd(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Sd(a,b)}function Qc(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line.bgClass;b&&(b+=" CodeMirror-linebackground");if(a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),
30
+ a.background=null);else if(b){var c=Ob(a);a.background=c.insertBefore(t("div",null,b),c.firstChild)}a.line.wrapClass?Ob(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className="");a.text.className=(a.textClass?a.textClass+" "+(a.line.textClass||""):a.line.textClass)||""}function Qd(a,b,c,d){b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null);var e=b.line.gutterMarkers;if(a.options.lineNumbers||e){var f=Ob(b),g=b.gutter=t("div",null,"CodeMirror-gutter-wrapper","left: "+(a.options.fixedGutter?
31
+ d.fixedPos:-d.gutterTotalWidth)+"px; width: "+d.gutterTotalWidth+"px");a.display.input.setUneditable(g);f.insertBefore(g,b.text);b.line.gutterClass&&(g.className+=" "+b.line.gutterClass);!a.options.lineNumbers||e&&e["CodeMirror-linenumbers"]||(b.lineNumber=g.appendChild(t("div",Jc(a.options,c),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+d.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+a.display.lineNumInnerWidth+"px")));if(e)for(b=0;b<a.options.gutters.length;++b)c=a.options.gutters[b],
32
+ (f=e.hasOwnProperty(c)&&e[c])&&g.appendChild(t("div",[f],"CodeMirror-gutter-elt","left: "+d.gutterLeft[c]+"px; width: "+d.gutterWidth[c]+"px"))}}function vf(a,b,c,d){var e=Pd(a,b);b.text=b.node=e.pre;e.bgClass&&(b.bgClass=e.bgClass);e.textClass&&(b.textClass=e.textClass);Qc(b);Qd(a,b,c,d);Rd(a,b,d);return b.node}function Rd(a,b,c){Td(a,b.line,b,c,!0);if(b.rest)for(var d=0;d<b.rest.length;d++)Td(a,b.rest[d],b,c,!1)}function Td(a,b,c,d,e){if(b.widgets){var f=Ob(c),g=0;for(b=b.widgets;g<b.length;++g){var h=
33
+ b[g],k=t("div",[h.node],"CodeMirror-linewidget");h.handleMouseEvents||k.setAttribute("cm-ignore-events","true");var l=h,m=k,p=d;if(l.noHScroll){(c.alignable||(c.alignable=[])).push(m);var n=p.wrapperWidth;m.style.left=p.fixedPos+"px";l.coverGutter||(n-=p.gutterTotalWidth,m.style.paddingLeft=p.gutterTotalWidth+"px");m.style.width=n+"px"}l.coverGutter&&(m.style.zIndex=5,m.style.position="relative",l.noHScroll||(m.style.marginLeft=-p.gutterTotalWidth+"px"));a.display.input.setUneditable(k);e&&h.above?
34
+ f.insertBefore(k,c.gutter||c.text):f.appendChild(k);L(h,"redraw")}}}function Rc(a){return r(a.line,a.ch)}function Pb(a,b){return 0>y(a,b)?b:a}function Qb(a,b){return 0>y(a,b)?a:b}function Ud(a){a.state.focused||(a.display.input.focus(),xc(a))}function Rb(a){return a.options.readOnly||a.doc.cantEdit}function Sc(a,b,c,d,e){var f=a.doc;a.display.shift=!1;d||(d=f.sel);var g=sa(b),h=null;a.state.pasteIncoming&&1<d.ranges.length&&(X&&X.join("\n")==b?h=0==d.ranges.length%X.length&&ob(X,sa):g.length==d.ranges.length&&
35
+ (h=ob(g,function(a){return[a]})));for(var k=d.ranges.length-1;0<=k;k--){var l=d.ranges[k],m=l.from(),p=l.to();l.empty()&&(c&&0<c?m=r(m.line,m.ch-c):a.state.overwrite&&!a.state.pasteIncoming&&(p=r(p.line,Math.min(u(f,p.line).text.length,p.ch+A(g).length))));var n=a.curOp.updateInput,m={from:m,to:p,text:h?h[k%h.length]:g,origin:e||(a.state.pasteIncoming?"paste":a.state.cutIncoming?"cut":"+input")};Oa(a.doc,m);L(a,"inputRead",a,m);if(b&&!a.state.pasteIncoming&&a.options.electricChars&&a.options.smartIndent&&
36
+ 100>l.head.ch&&(!k||d.ranges[k-1].head.line!=l.head.line)){l=a.getModeAt(l.head);m=ta(m);p=!1;if(l.electricChars)for(var E=0;E<l.electricChars.length;E++){if(-1<b.indexOf(l.electricChars.charAt(E))){p=pb(a,m.line,"smart");break}}else l.electricInput&&l.electricInput.test(u(f,m.line).text.slice(0,m.ch))&&(p=pb(a,m.line,"smart"));p&&L(a,"electricInput",a,m.line)}}Pa(a);a.curOp.updateInput=n;a.curOp.typing=!0;a.state.pasteIncoming=a.state.cutIncoming=!1}function Vd(a){for(var b=[],c=[],d=0;d<a.doc.sel.ranges.length;d++){var e=
37
+ a.doc.sel.ranges[d].head.line,e={anchor:r(e,0),head:r(e+1,0)};c.push(e);b.push(a.getRange(e.anchor,e.head))}return{text:b,ranges:c}}function Wd(a){a.setAttribute("autocorrect","off");a.setAttribute("autocapitalize","off");a.setAttribute("spellcheck","false")}function Tc(a){this.cm=a;this.prevInput="";this.pollingFast=!1;this.polling=new bb;this.hasSelection=this.inaccurateSelection=!1;this.composing=null}function Xd(){var a=t("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none"),
38
+ b=t("div",[a],null,"overflow: hidden; position: relative; width: 3px; height: 0px;");J?a.style.width="1000px":a.setAttribute("wrap","off");Qa&&(a.style.border="1px solid black");Wd(a);return b}function Uc(a){this.cm=a;this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null;this.polling=new bb;this.gracePeriod=!1}function Yd(a,b){var c=Vc(a,b.line);if(!c||c.hidden)return null;var d=u(a.doc,b.line),c=Zd(c,d,b.line);(d=Y(d))&&Sb(d,b.ch);d=$d(c.map,b.ch,"left");d.offset=
39
+ "right"==d.collapse?d.end:d.start;return d}function Ra(a,b){b&&(a.bad=!0);return a}function Tb(a,b,c){var d;if(b==a.display.lineDiv){d=a.display.lineDiv.childNodes[c];if(!d)return Ra(a.clipPos(r(a.display.viewTo-1)),!0);b=null;c=0}else for(d=b;;d=d.parentNode){if(!d||d==a.display.lineDiv)return null;if(d.parentNode&&d.parentNode==a.display.lineDiv)break}for(var e=0;e<a.display.view.length;e++){var f=a.display.view[e];if(f.node==d)return wf(f,b,c)}}function wf(a,b,c){function d(b,c,d){for(var e=-1;e<
40
+ (l?l.length:0);e++)for(var f=0>e?k.map:l[e],g=0;g<f.length;g+=3){var h=f[g+2];if(h==b||h==c){c=F(0>e?a.line:a.rest[e]);e=f[g]+d;if(0>d||h!=b)e=f[g+(d?1:0)];return r(c,e)}}}var e=a.text.firstChild,f=!1;if(!b||!Wc(e,b))return Ra(r(F(a.line),0),!0);if(b==e&&(f=!0,b=e.childNodes[c],c=0,!b))return c=a.rest?A(a.rest):a.line,Ra(r(F(c),c.text.length),f);var g=3==b.nodeType?b:null,h=b;g||1!=b.childNodes.length||3!=b.firstChild.nodeType||(g=b.firstChild,c&&(c=g.nodeValue.length));for(;h.parentNode!=e;)h=h.parentNode;
41
+ var k=a.measure,l=k.maps;if(b=d(g,h,c))return Ra(b,f);e=h.nextSibling;for(g=g?g.nodeValue.length-c:0;e;e=e.nextSibling){if(b=d(e,e.firstChild,0))return Ra(r(b.line,b.ch-g),f);g+=e.textContent.length}h=h.previousSibling;for(g=c;h;h=h.previousSibling){if(b=d(h,h.firstChild,-1))return Ra(r(b.line,b.ch+g),f);g+=e.textContent.length}}function xf(a,b,c,d,e){function f(a){return function(b){return b.id==a}}function g(b){if(1==b.nodeType){var c=b.getAttribute("cm-text");if(null!=c)""==c&&(c=b.textContent.replace(/\u200b/g,
42
+ "")),h+=c;else{var c=b.getAttribute("cm-marker"),p;if(c)b=a.findMarks(r(d,0),r(e+1,0),f(+c)),b.length&&(p=b[0].find())&&(h+=Da(a.doc,p.from,p.to).join("\n"));else if("false"!=b.getAttribute("contenteditable")){for(p=0;p<b.childNodes.length;p++)g(b.childNodes[p]);/^(pre|div|p)$/i.test(b.nodeName)&&(k=!0)}}}else 3==b.nodeType&&(b=b.nodeValue)&&(k&&(h+="\n",k=!1),h+=b)}for(var h="",k=!1;;){g(b);if(b==c)break;b=b.nextSibling}return h}function la(a,b){this.ranges=a;this.primIndex=b}function z(a,b){this.anchor=
43
+ a;this.head=b}function Z(a,b){var c=a[b];a.sort(function(a,b){return y(a.from(),b.from())});b=D(a,c);for(c=1;c<a.length;c++){var d=a[c],e=a[c-1];if(0<=y(e.to(),d.from())){var f=Qb(e.from(),d.from()),g=Pb(e.to(),d.to()),d=e.empty()?d.from()==d.head:e.from()==e.head;c<=b&&--b;a.splice(--c,2,new z(d?g:f,d?f:g))}}return new la(a,b)}function ga(a,b){return new la([new z(a,b||a)],0)}function w(a,b){if(b.line<a.first)return r(a.first,0);var c=a.first+a.size-1;if(b.line>c)return r(c,u(a,c).text.length);var c=
44
+ u(a,b.line).text.length,d=b.ch,c=null==d||d>c?r(b.line,c):0>d?r(b.line,0):b;return c}function qb(a,b){return b>=a.first&&b<a.first+a.size}function rb(a,b,c,d){return a.cm&&a.cm.display.shift||a.extend?(a=b.anchor,d&&(b=0>y(c,a),b!=0>y(d,a)?(a=c,c=d):b!=0>y(c,d)&&(c=d)),new z(a,c)):new z(d||c,c)}function Ub(a,b,c,d){H(a,new la([rb(a,a.sel.primary(),b,c)],0),d)}function ae(a,b,c){for(var d=[],e=0;e<a.sel.ranges.length;e++)d[e]=rb(a,a.sel.ranges[e],b[e],null);b=Z(d,a.sel.primIndex);H(a,b,c)}function Xc(a,
45
+ b,c,d){var e=a.sel.ranges.slice(0);e[b]=c;H(a,Z(e,a.sel.primIndex),d)}function yf(a,b){var c={ranges:b.ranges,update:function(b){this.ranges=[];for(var c=0;c<b.length;c++)this.ranges[c]=new z(w(a,b[c].anchor),w(a,b[c].head))}};K(a,"beforeSelectionChange",a,c);a.cm&&K(a.cm,"beforeSelectionChange",a.cm,c);return c.ranges!=b.ranges?Z(c.ranges,c.ranges.length-1):b}function be(a,b,c){var d=a.history.done,e=A(d);e&&e.ranges?(d[d.length-1]=b,Vb(a,b,c)):H(a,b,c)}function H(a,b,c){Vb(a,b,c);b=a.sel;var d=
46
+ a.cm?a.cm.curOp.id:NaN,e=a.history,f=c&&c.origin,g;if(!(g=d==e.lastSelOp)&&(g=f&&e.lastSelOrigin==f)&&!(g=e.lastModTime==e.lastSelTime&&e.lastOrigin==f)){g=A(e.done);var h=f.charAt(0);g="*"==h||"+"==h&&g.ranges.length==b.ranges.length&&g.somethingSelected()==b.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}g?e.done[e.done.length-1]=b:Wb(b,e.done);e.lastSelTime=+new Date;e.lastSelOrigin=f;e.lastSelOp=d;c&&!1!==c.clearRedo&&ce(e.undone)}function Vb(a,
47
+ b,c){if(S(a,"beforeSelectionChange")||a.cm&&S(a.cm,"beforeSelectionChange"))b=yf(a,b);var d=c&&c.bias||(0>y(b.primary().head,a.sel.primary().head)?-1:1);de(a,ee(a,b,d,!0));c&&!1===c.scroll||!a.cm||Pa(a.cm)}function de(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput=a.cm.curOp.selectionChanged=!0,fe(a.cm)),L(a,"cursorActivity",a))}function ge(a){de(a,ee(a,a.sel,null,!1),ha)}function ee(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges[f],h=Xb(a,g.anchor,c,d),k=Xb(a,g.head,c,
48
+ d);if(e||h!=g.anchor||k!=g.head)e||(e=b.ranges.slice(0,f)),e[f]=new z(h,k)}return e?Z(e,b.primIndex):b}function Xb(a,b,c,d){var e=!1,f=b,g=c||1;a.cantEdit=!1;a:for(;;){var h=u(a,f.line);if(h.markedSpans)for(var k=0;k<h.markedSpans.length;++k){var l=h.markedSpans[k],m=l.marker;if((null==l.from||(m.inclusiveLeft?l.from<=f.ch:l.from<f.ch))&&(null==l.to||(m.inclusiveRight?l.to>=f.ch:l.to>f.ch))){if(d&&(K(m,"beforeCursorEnter"),m.explicitlyCleared))if(h.markedSpans){--k;continue}else break;if(m.atomic){k=
49
+ m.find(0>g?-1:1);if(0==y(k,f)&&(k.ch+=g,0>k.ch?k=k.line>a.first?w(a,r(k.line-1)):null:k.ch>h.text.length&&(k=k.line<a.first+a.size-1?r(k.line+1,0):null),!k)){if(e){if(!d)return Xb(a,b,c,!0);a.cantEdit=!0;return r(a.first,0)}e=!0;k=b;g=-g}f=k;continue a}}}return f}}function nb(a){a.display.input.showSelection(a.display.input.prepareSelection())}function he(a,b){for(var c=a.doc,d={},e=d.cursors=document.createDocumentFragment(),f=d.selection=document.createDocumentFragment(),g=0;g<c.sel.ranges.length;g++)if(!1!==
50
+ b||g!=c.sel.primIndex){var h=c.sel.ranges[g],k=h.empty();if(k||a.options.showCursorWhenSelecting){var l=a,m=e,p=ma(l,h.head,"div",null,null,!l.options.singleCursorHeightPerLine),n=m.appendChild(t("div","\u00a0","CodeMirror-cursor"));n.style.left=p.left+"px";n.style.top=p.top+"px";n.style.height=Math.max(0,p.bottom-p.top)*l.options.cursorHeight+"px";p.other&&(l=m.appendChild(t("div","\u00a0","CodeMirror-cursor CodeMirror-secondarycursor")),l.style.display="",l.style.left=p.other.left+"px",l.style.top=
51
+ p.other.top+"px",l.style.height=.85*(p.other.bottom-p.other.top)+"px")}k||zf(a,h,f)}return d}function zf(a,b,c){function d(a,b,c,d){0>b&&(b=0);b=Math.round(b);d=Math.round(d);h.appendChild(t("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?m-a:c)+"px; height: "+(d-b)+"px"))}function e(b,c,e){var f=u(g,b),h=f.text.length,k,p;Af(Y(f),c||0,null==e?h:e,function(g,q,t){var u=Yb(a,r(b,g),"div",f,"left"),v,w;g==q?(v=u,t=w=u.left):(v=Yb(a,r(b,q-1),"div",
52
+ f,"right"),"rtl"==t&&(t=u,u=v,v=t),t=u.left,w=v.right);null==c&&0==g&&(t=l);3<v.top-u.top&&(d(t,u.top,null,u.bottom),t=l,u.bottom<v.top&&d(t,u.bottom,null,v.top));null==e&&q==h&&(w=m);if(!k||u.top<k.top||u.top==k.top&&u.left<k.left)k=u;if(!p||v.bottom>p.bottom||v.bottom==p.bottom&&v.right>p.right)p=v;t<l+1&&(t=l);d(t,v.top,w-t,v.bottom)});return{start:k,end:p}}var f=a.display,g=a.doc,h=document.createDocumentFragment(),k=ie(a.display),l=k.left,m=Math.max(f.sizerWidth,pa(a)-f.sizer.offsetLeft)-k.right,
53
+ f=b.from();b=b.to();if(f.line==b.line)e(f.line,f.ch,b.ch);else{var p=u(g,f.line),k=u(g,b.line),k=ia(p)==ia(k),f=e(f.line,f.ch,k?p.text.length+1:null).end;b=e(b.line,k?0:null,b.ch).start;k&&(f.top<b.top-2?(d(f.right,f.top,null,f.bottom),d(l,b.top,b.left,b.bottom)):d(f.right,f.top,b.left-f.right,f.bottom));f.bottom<b.top&&d(l,f.bottom,null,b.top)}c.appendChild(h)}function Yc(a){if(a.state.focused){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursorDiv.style.visibility="";0<a.options.cursorBlinkRate?
54
+ b.blinker=setInterval(function(){b.cursorDiv.style.visibility=(c=!c)?"":"hidden"},a.options.cursorBlinkRate):0>a.options.cursorBlinkRate&&(b.cursorDiv.style.visibility="hidden")}}function fb(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.viewTo&&a.state.highlight.set(b,cb(Bf,a))}function Bf(a){var b=a.doc;b.frontier<b.first&&(b.frontier=b.first);if(!(b.frontier>=a.display.viewTo)){var c=+new Date+a.options.workTime,d=Sa(b.mode,sb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,
55
+ a.display.viewTo+500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=je(a,f,d,!0);f.styles=h.styles;var k=f.styleClasses;(h=h.classes)?f.styleClasses=h:k&&(f.styleClasses=null);k=!g||g.length!=f.styles.length||k!=h&&(!k||!h||k.bgClass!=h.bgClass||k.textClass!=h.textClass);for(h=0;!k&&h<g.length;++h)k=g[h]!=f.styles[h];k&&e.push(b.frontier);f.stateAfter=Sa(b.mode,d)}else Zc(a,f.text,d),f.stateAfter=0==b.frontier%5?Sa(b.mode,d):null;++b.frontier;if(+new Date>c)return fb(a,a.options.workDelay),
56
+ !0});e.length&&T(a,function(){for(var b=0;b<e.length;b++)na(a,e[b],"text")})}}function Cf(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1E3:100);b>g;--b){if(b<=f.first)return f.first;var h=u(f,b-1);if(h.stateAfter&&(!c||b<=f.frontier))return b;h=aa(h.text,null,a.options.tabSize);if(null==e||d>h)e=b-1,d=h}return e}function sb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0;var f=Cf(a,b,c),g=f>d.first&&u(d,f-1).stateAfter,g=g?Sa(d.mode,g):Df(d.mode);d.iter(f,b,function(c){Zc(a,
57
+ c.text,g);c.stateAfter=f==b-1||0==f%5||f>=e.viewFrom&&f<e.viewTo?Sa(d.mode,g):null;++f});c&&(d.frontier=f);return g}function Ec(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}function ie(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=U(a.measure,t("pre","x")),b=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,b={left:parseInt(b.paddingLeft),right:parseInt(b.paddingRight)};isNaN(b.left)||isNaN(b.right)||(a.cachedPaddingH=b);return b}function da(a){return Hd-a.display.nativeBarWidth}
58
+ function pa(a){return a.display.scroller.clientWidth-da(a)-a.display.barWidth}function Nc(a){return a.display.scroller.clientHeight-da(a)-a.display.barHeight}function Zd(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;d<a.rest.length;d++)if(a.rest[d]==b)return{map:a.measure.maps[d],cache:a.measure.caches[d]};for(d=0;d<a.rest.length;d++)if(F(a.rest[d])>c)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}}function Vc(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.display.view[Ca(a,
59
+ b)];var c=a.display.externalMeasured;if(c&&b>=c.lineN&&b<c.lineN+c.size)return c}function Zb(a,b){var c=F(b),d=Vc(a,c);d&&!d.text?d=null:d&&d.changes&&Od(a,d,c,Kc(a));if(!d){var e;e=ia(b);d=F(e);e=a.display.externalMeasured=new ke(a.doc,e,d);e.lineN=d;d=e.built=Sd(a,e);e.text=d.pre;U(a.display.lineMeasure,d.pre);d=e}c=Zd(d,b,c);return{line:b,view:d,rect:null,map:c.map,cache:c.cache,before:c.before,hasHeights:!1}}function $c(a,b,c,d,e){b.before&&(c=-1);var f=c+(d||"");if(b.cache.hasOwnProperty(f))a=
60
+ b.cache[f];else{b.rect||(b.rect=b.view.text.getBoundingClientRect());if(!b.hasHeights){var g=b.view,h=b.rect,k=a.options.lineWrapping,l=k&&pa(a);if(!g.measure.heights||k&&g.measure.width!=l){var m=g.measure.heights=[];if(k)for(g.measure.width=l,g=g.text.firstChild.getClientRects(),k=0;k<g.length-1;k++){var l=g[k],p=g[k+1];2<Math.abs(l.bottom-p.bottom)&&m.push((l.bottom+p.top)/2-h.top)}m.push(h.bottom-h.top)}b.hasHeights=!0}g=d;k=$d(b.map,c,g);d=k.node;h=k.start;l=k.end;c=k.collapse;var n;if(3==d.nodeType){for(m=
61
+ 0;4>m;m++){for(;h&&tb(b.line.text.charAt(k.coverStart+h));)--h;for(;k.coverStart+l<k.coverEnd&&tb(b.line.text.charAt(k.coverStart+l));)++l;if(B&&9>C&&0==h&&l==k.coverEnd-k.coverStart)n=d.parentNode.getBoundingClientRect();else if(B&&a.options.lineWrapping){var E=Ea(d,h,l).getClientRects();n=E.length?E["right"==g?E.length-1:0]:ad}else n=Ea(d,h,l).getBoundingClientRect()||ad;if(n.left||n.right||0==h)break;l=h;--h;c="right"}B&&11>C&&((E=!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI)||
62
+ (null!=bd?E=bd:(m=U(a.display.measure,t("span","x")),E=m.getBoundingClientRect(),m=Ea(m,0,1).getBoundingClientRect(),E=bd=1<Math.abs(E.left-m.left)),E=!E),E||(E=screen.logicalXDPI/screen.deviceXDPI,m=screen.logicalYDPI/screen.deviceYDPI,n={left:n.left*E,right:n.right*E,top:n.top*m,bottom:n.bottom*m}))}else 0<h&&(c=g="right"),n=a.options.lineWrapping&&1<(E=d.getClientRects()).length?E["right"==g?E.length-1:0]:d.getBoundingClientRect();!(B&&9>C)||h||n&&(n.left||n.right)||(n=(n=d.parentNode.getClientRects()[0])?
63
+ {left:n.left,right:n.left+gb(a.display),top:n.top,bottom:n.bottom}:ad);E=n.top-b.rect.top;d=n.bottom-b.rect.top;h=(E+d)/2;g=b.view.measure.heights;for(m=0;m<g.length-1&&!(h<g[m]);m++);c={left:("right"==c?n.right:n.left)-b.rect.left,right:("left"==c?n.left:n.right)-b.rect.left,top:m?g[m-1]:0,bottom:g[m]};n.left||n.right||(c.bogus=!0);a.options.singleCursorHeightPerLine||(c.rtop=E,c.rbottom=d);a=c;a.bogus||(b.cache[f]=a)}return{left:a.left,right:a.right,top:e?a.rtop:a.top,bottom:e?a.rbottom:a.bottom}}
64
+ function $d(a,b,c){for(var d,e,f,g,h=0;h<a.length;h+=3){var k=a[h],l=a[h+1];if(b<k)e=0,f=1,g="left";else if(b<l)e=b-k,f=e+1;else if(h==a.length-3||b==l&&a[h+3]>b)f=l-k,e=f-1,b>=l&&(g="right");if(null!=e){d=a[h+2];k==l&&c==(d.insertLeft?"left":"right")&&(g=c);if("left"==c&&0==e)for(;h&&a[h-2]==a[h-3]&&a[h-1].insertLeft;)d=a[(h-=3)+2],g="left";if("right"==c&&e==l-k)for(;h<a.length-3&&a[h+3]==a[h+4]&&!a[h+5].insertLeft;)d=a[(h+=3)+2],g="right";break}}return{node:d,start:e,end:f,collapse:g,coverStart:k,
65
+ coverEnd:l}}function le(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,a.rest))for(var b=0;b<a.rest.length;b++)a.measure.caches[b]={}}function me(a){a.display.externalMeasure=null;za(a.display.lineMeasure);for(var b=0;b<a.display.view.length;b++)le(a.display.view[b])}function hb(a){me(a);a.display.cachedCharWidth=a.display.cachedTextHeight=a.display.cachedPaddingH=null;a.options.lineWrapping||(a.display.maxLineChanged=!0);a.display.lineNumChars=null}function cd(a,b,c,d){if(b.widgets)for(var e=
66
+ 0;e<b.widgets.length;++e)if(b.widgets[e].above){var f=ub(b.widgets[e]);c.top+=f;c.bottom+=f}if("line"==d)return c;d||(d="local");b=ea(b);b="local"==d?b+a.display.lineSpace.offsetTop:b-a.display.viewOffset;if("page"==d||"window"==d)a=a.display.lineSpace.getBoundingClientRect(),b+=a.top+("window"==d?0:window.pageYOffset||(document.documentElement||document.body).scrollTop),d=a.left+("window"==d?0:window.pageXOffset||(document.documentElement||document.body).scrollLeft),c.left+=d,c.right+=d;c.top+=b;
67
+ c.bottom+=b;return c}function ne(a,b,c){if("div"==c)return b;var d=b.left;b=b.top;"page"==c?(d-=window.pageXOffset||(document.documentElement||document.body).scrollLeft,b-=window.pageYOffset||(document.documentElement||document.body).scrollTop):"local"!=c&&c||(c=a.display.sizer.getBoundingClientRect(),d+=c.left,b+=c.top);a=a.display.lineSpace.getBoundingClientRect();return{left:d-a.left,top:b-a.top}}function Yb(a,b,c,d,e){d||(d=u(a.doc,b.line));var f=d;b=b.ch;d=$c(a,Zb(a,d),b,e);return cd(a,f,d,c)}
68
+ function ma(a,b,c,d,e,f){function g(b,g){var h=$c(a,e,b,g?"right":"left",f);g?h.left=h.right:h.right=h.left;return cd(a,d,h,c)}function h(a,b){var c=k[b],d=c.level%2;a==dd(c)&&b&&c.level<k[b-1].level?(c=k[--b],a=ed(c)-(c.level%2?0:1),d=!0):a==ed(c)&&b<k.length-1&&c.level<k[b+1].level&&(c=k[++b],a=dd(c)-c.level%2,d=!1);return d&&a==c.to&&a>c.from?g(a-1):g(a,d)}d=d||u(a.doc,b.line);e||(e=Zb(a,d));var k=Y(d);b=b.ch;if(!k)return g(b);var l=Sb(k,b),l=h(b,l);null!=vb&&(l.other=h(b,vb));return l}function oe(a,
69
+ b){var c=0;b=w(a.doc,b);a.options.lineWrapping||(c=gb(a.display)*b.ch);var d=u(a.doc,b.line),e=ea(d)+a.display.lineSpace.offsetTop;return{left:c,right:c,top:e,bottom:e+d.height}}function $b(a,b,c,d){a=r(a,b);a.xRel=d;c&&(a.outside=!0);return a}function fd(a,b,c){var d=a.doc;c+=a.display.viewOffset;if(0>c)return $b(d.first,0,!0,-1);var e=Ba(d,c),f=d.first+d.size-1;if(e>f)return $b(d.first+d.size-1,u(d,f).text.length,!0,1);0>b&&(b=0);for(d=u(d,e);;)if(e=Ef(a,d,e,b,c),f=(d=Aa(d,!1))&&d.find(0,!0),d&&
70
+ (e.ch>f.from.ch||e.ch==f.from.ch&&0<e.xRel))e=F(d=f.to.line);else return e}function Ef(a,b,c,d,e){function f(d){d=ma(a,r(c,d),"line",b,l);h=!0;if(g>d.bottom)return d.left-k;if(g<d.top)return d.left+k;h=!1;return d.left}var g=e-ea(b),h=!1,k=2*a.display.wrapper.clientWidth,l=Zb(a,b),m=Y(b),p=b.text.length;e=ac(b);var n=bc(b),E=f(e),q=h,t=f(n),u=h;if(d>t)return $b(c,n,u,1);for(;;){if(m?n==e||n==gd(b,e,1):1>=n-e){m=d<E||d-E<=t-d?e:n;for(d-=m==e?E:t;tb(b.text.charAt(m));)++m;return $b(c,m,m==e?q:u,-1>
71
+ d?-1:1<d?1:0)}var v=Math.ceil(p/2),w=e+v;if(m)for(var w=e,x=0;x<v;++x)w=gd(b,w,1);x=f(w);if(x>d){n=w;t=x;if(u=h)t+=1E3;p=v}else e=w,E=x,q=h,p-=v}}function xa(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Fa){Fa=t("pre");for(var b=0;49>b;++b)Fa.appendChild(document.createTextNode("x")),Fa.appendChild(t("br"));Fa.appendChild(document.createTextNode("x"))}U(a.measure,Fa);b=Fa.offsetHeight/50;3<b&&(a.cachedTextHeight=b);za(a.measure);return b||1}function gb(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;
72
+ var b=t("span","xxxxxxxxxx"),c=t("pre",[b]);U(a.measure,c);b=b.getBoundingClientRect();b=(b.right-b.left)/10;2<b&&(a.cachedCharWidth=b);return b||10}function Ja(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ff};Ta?Ta.ops.push(a.curOp):a.curOp.ownsGroup=Ta={ops:[a.curOp],delayedCallbacks:[]}}
73
+ function La(a){if(a=a.curOp.ownsGroup)try{var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c]();for(var d=0;d<a.ops.length;d++){var e=a.ops[d];if(e.cursorActivityHandlers)for(;e.cursorActivityCalled<e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++](e.cm)}}while(c<b.length)}finally{Ta=null;for(b=0;b<a.ops.length;b++)a.ops[b].cm.curOp=null;a=a.ops;for(b=0;b<a.length;b++){var e=a[b],c=e.cm,f=d=c.display;!f.scrollbarsClipped&&f.scroller.offsetWidth&&(f.nativeBarWidth=
74
+ f.scroller.offsetWidth-f.scroller.clientWidth,f.heightForcer.style.height=da(c)+"px",f.sizer.style.marginBottom=-f.nativeBarWidth+"px",f.sizer.style.borderRightWidth=da(c)+"px",f.scrollbarsClipped=!0);e.updateMaxLine&&Dc(c);e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<d.viewFrom||e.scrollToPos.to.line>=d.viewTo)||d.maxLineChanged&&c.options.lineWrapping;e.update=e.mustUpdate&&new Mb(c,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}for(b=
75
+ 0;b<a.length;b++)e=a[b],e.updatedDisplay=e.mustUpdate&&Lc(e.cm,e.update);for(b=0;b<a.length;b++)if(e=a[b],c=e.cm,d=c.display,e.updatedDisplay&&Lb(c),e.barMeasure=jb(c),d.maxLineChanged&&!c.options.lineWrapping&&(f=void 0,f=d.maxLine.text.length,f=$c(c,Zb(c,d.maxLine),f,void 0),e.adjustWidthTo=f.left+3,c.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(d.scroller.clientWidth,d.sizer.offsetLeft+e.adjustWidthTo+da(c)+c.display.barWidth),e.maxScrollLeft=Math.max(0,d.sizer.offsetLeft+
76
+ e.adjustWidthTo-pa(c))),e.updatedDisplay||e.selectionChanged)e.preparedSelection=d.input.prepareSelection();for(b=0;b<a.length;b++)e=a[b],c=e.cm,null!=e.adjustWidthTo&&(c.display.sizer.style.minWidth=e.adjustWidthTo+"px",e.maxScrollLeft<c.doc.scrollLeft&&Ma(c,Math.min(c.display.scroller.scrollLeft,e.maxScrollLeft),!0),c.display.maxLineChanged=!1),e.preparedSelection&&c.display.input.showSelection(e.preparedSelection),e.updatedDisplay&&Oc(c,e.barMeasure),(e.updatedDisplay||e.startHeight!=c.doc.height)&&
77
+ Na(c,e.barMeasure),e.selectionChanged&&Yc(c),c.state.focused&&e.updateInput&&c.display.input.reset(e.typing),e.focus&&e.focus==fa()&&Ud(e.cm);for(b=0;b<a.length;b++){e=a[b];c=e.cm;d=c.display;f=c.doc;e.updatedDisplay&&Md(c,e.update);null==d.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(d.wheelStartX=d.wheelStartY=null);null==e.scrollTop||d.scroller.scrollTop==e.scrollTop&&!e.forceScroll||(f.scrollTop=Math.max(0,Math.min(d.scroller.scrollHeight-d.scroller.clientHeight,e.scrollTop)),
78
+ d.scrollbars.setScrollTop(f.scrollTop),d.scroller.scrollTop=f.scrollTop);null==e.scrollLeft||d.scroller.scrollLeft==e.scrollLeft&&!e.forceScroll||(f.scrollLeft=Math.max(0,Math.min(d.scroller.scrollWidth-pa(c),e.scrollLeft)),d.scrollbars.setScrollLeft(f.scrollLeft),d.scroller.scrollLeft=f.scrollLeft,Bc(c));if(e.scrollToPos){var g=void 0,h=w(f,e.scrollToPos.from),g=w(f,e.scrollToPos.to),k=e.scrollToPos.margin;null==k&&(k=0);for(var l=0;5>l;l++){var m=!1,p=ma(c,h),n=g&&g!=h?ma(c,g):p,n=cc(c,Math.min(p.left,
79
+ n.left),Math.min(p.top,n.top)-k,Math.max(p.left,n.left),Math.max(p.bottom,n.bottom)+k),q=c.doc.scrollTop,r=c.doc.scrollLeft;null!=n.scrollTop&&(lb(c,n.scrollTop),1<Math.abs(c.doc.scrollTop-q)&&(m=!0));null!=n.scrollLeft&&(Ma(c,n.scrollLeft),1<Math.abs(c.doc.scrollLeft-r)&&(m=!0));if(!m)break}g=p;e.scrollToPos.isCursor&&c.state.focused&&(ja(c,"scrollCursorIntoView")||(k=c.display,l=k.sizer.getBoundingClientRect(),h=null,0>g.top+l.top?h=!0:g.bottom+l.top>(window.innerHeight||document.documentElement.clientHeight)&&
80
+ (h=!1),null==h||Gf||(g=t("div","\u200b",null,"position: absolute; top: "+(g.top-k.viewOffset-c.display.lineSpace.offsetTop)+"px; height: "+(g.bottom-g.top+da(c)+k.barHeight)+"px; left: "+g.left+"px; width: 2px;"),c.display.lineSpace.appendChild(g),g.scrollIntoView(h),c.display.lineSpace.removeChild(g))))}h=e.maybeHiddenMarkers;g=e.maybeUnhiddenMarkers;if(h)for(k=0;k<h.length;++k)h[k].lines.length||K(h[k],"hide");if(g)for(k=0;k<g.length;++k)g[k].lines.length&&K(g[k],"unhide");d.wrapper.offsetHeight&&
81
+ (f.scrollTop=c.display.scroller.scrollTop);e.changeObjs&&K(c,"changes",c,e.changeObjs);e.update&&e.update.finish()}}}function T(a,b){if(a.curOp)return b();Ja(a);try{return b()}finally{La(a)}}function G(a,b){return function(){if(a.curOp)return b.apply(a,arguments);Ja(a);try{return b.apply(a,arguments)}finally{La(a)}}}function M(a){return function(){if(this.curOp)return a.apply(this,arguments);Ja(this);try{return a.apply(this,arguments)}finally{La(this)}}}function N(a){return function(){var b=this.cm;
82
+ if(!b||b.curOp)return a.apply(this,arguments);Ja(b);try{return a.apply(this,arguments)}finally{La(b)}}}function ke(a,b,c){for(var d=this.line=b,e;d=Aa(d,!1);)d=d.find(1,!0).line,(e||(e=[])).push(d);this.size=(this.rest=e)?F(A(this.rest))-c+1:1;this.node=this.text=null;this.hidden=ya(a,b)}function Nb(a,b,c){var d=[],e;for(e=b;e<c;)b=new ke(a.doc,u(a.doc,e),e),e+=b.size,d.push(b);return d}function Q(a,b,c,d){null==b&&(b=a.doc.first);null==c&&(c=a.doc.first+a.doc.size);d||(d=0);var e=a.display;d&&c<
83
+ e.viewTo&&(null==e.updateLineNumbers||e.updateLineNumbers>b)&&(e.updateLineNumbers=b);a.curOp.viewChanged=!0;if(b>=e.viewTo)ra&&Mc(a.doc,b)<e.viewTo&&qa(a);else if(c<=e.viewFrom)ra&&Ld(a.doc,c+d)>e.viewFrom?qa(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)qa(a);else if(b<=e.viewFrom){var f=dc(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):qa(a)}else if(c>=e.viewTo)(f=dc(a,b,b,-1))?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):qa(a);else{var f=dc(a,
84
+ b,b,-1),g=dc(a,c,c+d,1);f&&g?(e.view=e.view.slice(0,f.index).concat(Nb(a,f.lineN,g.lineN)).concat(e.view.slice(g.index)),e.viewTo+=d):qa(a)}if(a=e.externalMeasured)c<a.lineN?a.lineN+=d:b<a.lineN+a.size&&(e.externalMeasured=null)}function na(a,b,c){a.curOp.viewChanged=!0;var d=a.display,e=a.display.externalMeasured;e&&b>=e.lineN&&b<e.lineN+e.size&&(d.externalMeasured=null);b<d.viewFrom||b>=d.viewTo||(a=d.view[Ca(a,b)],null!=a.node&&(a=a.changes||(a.changes=[]),-1==D(a,c)&&a.push(c)))}function qa(a){a.display.viewFrom=
85
+ a.display.viewTo=a.doc.first;a.display.view=[];a.display.viewOffset=0}function Ca(a,b){if(b>=a.display.viewTo)return null;b-=a.display.viewFrom;if(0>b)return null;for(var c=a.display.view,d=0;d<c.length;d++)if(b-=c[d].size,0>b)return d}function dc(a,b,c,d){var e=Ca(a,b),f=a.display.view;if(!ra||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var g=0,h=a.display.viewFrom;g<e;g++)h+=f[g].size;if(h!=b){if(0<d){if(e==f.length-1)return null;b=h+f[e].size-b;e++}else b=h-b;c+=b}for(;Mc(a.doc,c)!=c;){if(e==
86
+ (0>d?0:f.length-1))return null;c+=d*f[e-(0>d?1:0)].size;e+=d}return{index:e,lineN:c}}function Kd(a){a=a.display.view;for(var b=0,c=0;c<a.length;c++){var d=a[c];d.hidden||d.node&&!d.changes||++b}return b}function sf(a){function b(){d.activeTouch&&(e=setTimeout(function(){d.activeTouch=null},1E3),f=d.activeTouch,f.end=+new Date)}function c(a,b){if(null==b.left)return!0;var c=b.left-a.left,d=b.top-a.top;return 400<c*c+d*d}var d=a.display;v(d.scroller,"mousedown",G(a,pe));B&&11>C?v(d.scroller,"dblclick",
87
+ G(a,function(b){if(!ja(a,b)){var c=Ua(a,b);!c||hd(a,b,"gutterClick",!0,L)||oa(a.display,b)||(O(b),b=a.findWordAt(c),Ub(a.doc,b.anchor,b.head))}})):v(d.scroller,"dblclick",function(b){ja(a,b)||O(b)});id||v(d.scroller,"contextmenu",function(b){qe(a,b)});var e,f={end:0};v(d.scroller,"touchstart",function(a){var b;1!=a.touches.length?b=!1:(b=a.touches[0],b=1>=b.radiusX&&1>=b.radiusY);b||(clearTimeout(e),b=+new Date,d.activeTouch={start:b,moved:!1,prev:300>=b-f.end?f:null},1==a.touches.length&&(d.activeTouch.left=
88
+ a.touches[0].pageX,d.activeTouch.top=a.touches[0].pageY))});v(d.scroller,"touchmove",function(){d.activeTouch&&(d.activeTouch.moved=!0)});v(d.scroller,"touchend",function(e){var f=d.activeTouch;if(f&&!oa(d,e)&&null!=f.left&&!f.moved&&300>new Date-f.start){var g=a.coordsChar(d.activeTouch,"page"),f=!f.prev||c(f,f.prev)?new z(g,g):!f.prev.prev||c(f,f.prev.prev)?a.findWordAt(g):new z(r(g.line,0),w(a.doc,r(g.line+1,0)));a.setSelection(f.anchor,f.head);a.focus();O(e)}b()});v(d.scroller,"touchcancel",b);
89
+ v(d.scroller,"scroll",function(){d.scroller.clientHeight&&(lb(a,d.scroller.scrollTop),Ma(a,d.scroller.scrollLeft,!0),K(a,"scroll",a))});v(d.scroller,"mousewheel",function(b){re(a,b)});v(d.scroller,"DOMMouseScroll",function(b){re(a,b)});v(d.wrapper,"scroll",function(){d.wrapper.scrollTop=d.wrapper.scrollLeft=0});d.dragFunctions={simple:function(b){ja(a,b)||jd(b)},start:function(b){if(B&&(!a.state.draggingText||100>+new Date-se))jd(b);else if(!ja(a,b)&&!oa(a.display,b)&&(b.dataTransfer.setData("Text",
90
+ a.getSelection()),b.dataTransfer.setDragImage&&!te)){var c=t("img",null,null,"position: fixed; left: 0; top: 0;");c.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";ba&&(c.width=c.height=1,a.display.wrapper.appendChild(c),c._top=c.offsetTop);b.dataTransfer.setDragImage(c,0,0);ba&&c.parentNode.removeChild(c)}},drop:G(a,Hf)};var g=d.input.getField();v(g,"keyup",function(b){ue.call(a,b)});v(g,"keydown",G(a,ve));v(g,"keypress",G(a,we));v(g,"focus",cb(xc,a));v(g,"blur",
91
+ cb(db,a))}function If(a){var b=a.display;if(b.lastWrapHeight!=b.wrapper.clientHeight||b.lastWrapWidth!=b.wrapper.clientWidth)b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize()}function oa(a,b){for(var c=b.target||b.srcElement;c!=a.wrapper;c=c.parentNode)if(!c||1==c.nodeType&&"true"==c.getAttribute("cm-ignore-events")||c.parentNode==a.sizer&&c!=a.mover)return!0}function Ua(a,b,c,d){var e=a.display;if(!c&&"true"==(b.target||b.srcElement).getAttribute("cm-not-content"))return null;
92
+ var f,g;c=e.lineSpace.getBoundingClientRect();try{f=b.clientX-c.left,g=b.clientY-c.top}catch(h){return null}b=fd(a,f,g);var k;d&&1==b.xRel&&(k=u(a.doc,b.line).text).length==b.ch&&(d=aa(k,k.length,a.options.tabSize)-k.length,b=r(b.line,Math.max(0,Math.round((f-ie(a.display).left)/gb(a.display))-d)));return b}function pe(a){var b=this.display;if(!(b.activeTouch&&b.input.supportsTouch()||ja(this,a)))if(b.shift=a.shiftKey,oa(b,a))J||(b.scroller.draggable=!1,setTimeout(function(){b.scroller.draggable=
93
+ !0},100));else if(!hd(this,a,"gutterClick",!0,L)){var c=Ua(this,a);window.focus();switch(xe(a)){case 1:c?Jf(this,a,c):(a.target||a.srcElement)==b.scroller&&O(a);break;case 2:J&&(this.state.lastMiddleDown=+new Date);c&&Ub(this.doc,c);setTimeout(function(){b.input.focus()},20);O(a);break;case 3:id?qe(this,a):Kf(this)}}}function Jf(a,b,c){B?setTimeout(cb(Ud,a),0):a.curOp.focus=fa();var d=+new Date,e;ec&&ec.time>d-400&&0==y(ec.pos,c)?e="triple":fc&&fc.time>d-400&&0==y(fc.pos,c)?(e="double",ec={time:d,
94
+ pos:c}):(e="single",fc={time:d,pos:c});var d=a.doc.sel,f=W?b.metaKey:b.ctrlKey,g;a.options.dragDrop&&Lf&&!Rb(a)&&"single"==e&&-1<(g=d.contains(c))&&!d.ranges[g].empty()?Mf(a,b,c,f):Nf(a,b,c,e,f)}function Mf(a,b,c,d){var e=a.display,f=+new Date,g=G(a,function(h){J&&(e.scroller.draggable=!1);a.state.draggingText=!1;ka(document,"mouseup",g);ka(e.scroller,"drop",g);10>Math.abs(b.clientX-h.clientX)+Math.abs(b.clientY-h.clientY)&&(O(h),!d&&+new Date-200<f&&Ub(a.doc,c),J||B&&9==C?setTimeout(function(){document.body.focus();
95
+ e.input.focus()},20):e.input.focus())});J&&(e.scroller.draggable=!0);a.state.draggingText=g;e.scroller.dragDrop&&e.scroller.dragDrop();v(document,"mouseup",g);v(e.scroller,"drop",g)}function Nf(a,b,c,d,e){function f(b){if(0!=y(x,b))if(x=b,"rect"==d){for(var e=[],f=a.options.tabSize,g=aa(u(l,c.line).text,c.ch,f),h=aa(u(l,b.line).text,b.ch,f),k=Math.min(g,h),g=Math.max(g,h),h=Math.min(c.line,b.line),q=Math.min(a.lastLine(),Math.max(c.line,b.line));h<=q;h++){var E=u(l,h).text,t=ye(E,k,f);k==g?e.push(new z(r(h,
96
+ t),r(h,t))):E.length>t&&e.push(new z(r(h,t),r(h,ye(E,g,f))))}e.length||e.push(new z(c,c));H(l,Z(n.ranges.slice(0,p).concat(e),p),{origin:"*mouse",scroll:!1});a.scrollIntoView(b)}else e=m,f=e.anchor,k=b,"single"!=d&&(b="double"==d?a.findWordAt(b):new z(r(b.line,0),w(l,r(b.line+1,0))),0<y(b.anchor,f)?(k=b.head,f=Qb(e.from(),b.anchor)):(k=b.anchor,f=Pb(e.to(),b.head))),e=n.ranges.slice(0),e[p]=new z(w(l,f),k),H(l,Z(e,p),kd)}function g(b){var c=++A,e=Ua(a,b,!0,"rect"==d);if(e)if(0!=y(e,x)){a.curOp.focus=
97
+ fa();f(e);var h=Hc(k,l);(e.line>=h.to||e.line<h.from)&&setTimeout(G(a,function(){A==c&&g(b)}),150)}else{var m=b.clientY<B.top?-20:b.clientY>B.bottom?20:0;m&&setTimeout(G(a,function(){A==c&&(k.scroller.scrollTop+=m,g(b))}),50)}}function h(a){A=Infinity;O(a);k.input.focus();ka(document,"mousemove",F);ka(document,"mouseup",C);l.history.lastSelOrigin=null}var k=a.display,l=a.doc;O(b);var m,p,n=l.sel,q=n.ranges;e&&!b.shiftKey?(p=l.sel.contains(c),m=-1<p?q[p]:new z(c,c)):(m=l.sel.primary(),p=l.sel.primIndex);
98
+ if(b.altKey)d="rect",e||(m=new z(c,c)),c=Ua(a,b,!0,!0),p=-1;else if("double"==d){var t=a.findWordAt(c);m=a.display.shift||l.extend?rb(l,m,t.anchor,t.head):t}else"triple"==d?(t=new z(r(c.line,0),w(l,r(c.line+1,0))),m=a.display.shift||l.extend?rb(l,m,t.anchor,t.head):t):m=rb(l,m,c);e?-1==p?(p=q.length,H(l,Z(q.concat([m]),p),{scroll:!1,origin:"*mouse"})):1<q.length&&q[p].empty()&&"single"==d&&!b.shiftKey?(H(l,Z(q.slice(0,p).concat(q.slice(p+1)),0)),n=l.sel):Xc(l,p,m,kd):(p=0,H(l,new la([m],0),kd),n=
99
+ l.sel);var x=c,B=k.wrapper.getBoundingClientRect(),A=0,F=G(a,function(a){xe(a)?g(a):h(a)}),C=G(a,h);v(document,"mousemove",F);v(document,"mouseup",C)}function hd(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(h){return!1}if(f>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&O(b);d=a.display;var k=d.lineDiv.getBoundingClientRect();if(g>k.bottom||!S(a,c))return ld(b);g-=k.top-d.viewOffset;for(k=0;k<a.options.gutters.length;++k){var l=d.gutters.childNodes[k];if(l&&l.getBoundingClientRect().right>=
100
+ f)return f=Ba(a.doc,g),e(a,c,a,f,a.options.gutters[k],b),ld(b)}}function Hf(a){var b=this;if(!ja(b,a)&&!oa(b.display,a)){O(a);B&&(se=+new Date);var c=Ua(b,a,!0),d=a.dataTransfer.files;if(c&&!Rb(b))if(d&&d.length&&window.FileReader&&window.File){var e=d.length,f=Array(e),g=0;a=function(a,d){var h=new FileReader;h.onload=G(b,function(){f[d]=h.result;if(++g==e){c=w(b.doc,c);var a={from:c,to:c,text:sa(f.join("\n")),origin:"paste"};Oa(b.doc,a);be(b.doc,ga(c,ta(a)))}});h.readAsText(a)};for(var h=0;h<e;++h)a(d[h],
101
+ h)}else if(b.state.draggingText&&-1<b.doc.sel.contains(c))b.state.draggingText(a),setTimeout(function(){b.display.input.focus()},20);else try{if(f=a.dataTransfer.getData("Text")){if(b.state.draggingText&&(W?!a.altKey:!a.ctrlKey))var k=b.listSelections();Vb(b.doc,ga(c,c));if(k)for(h=0;h<k.length;++h)wb(b.doc,"",k[h].anchor,k[h].head,"drag");b.replaceSelection(f,"around","paste");b.display.input.focus()}}catch(l){}}}function lb(a,b){2>Math.abs(a.doc.scrollTop-b)||(a.doc.scrollTop=b,wa||Pc(a,{top:b}),
102
+ a.display.scroller.scrollTop!=b&&(a.display.scroller.scrollTop=b),a.display.scrollbars.setScrollTop(b),wa&&Pc(a),fb(a,100))}function Ma(a,b,c){(c?b==a.doc.scrollLeft:2>Math.abs(a.doc.scrollLeft-b))||(b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.doc.scrollLeft=b,Bc(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbars.setScrollLeft(b))}function re(a,b){var c=ze(b),d=c.x,c=c.y,e=a.display,f=e.scroller;if(d&&f.scrollWidth>f.clientWidth||
103
+ c&&f.scrollHeight>f.clientHeight){if(c&&W&&J){var g=b.target,h=e.view;a:for(;g!=f;g=g.parentNode)for(var k=0;k<h.length;k++)if(h[k].node==g){a.display.currentWheelTarget=g;break a}}!d||wa||ba||null==R?(c&&null!=R&&(g=c*R,h=a.doc.scrollTop,k=h+e.wrapper.clientHeight,0>g?h=Math.max(0,h+g-50):k=Math.min(a.doc.height,k+g+50),Pc(a,{top:h,bottom:k})),20>gc&&(null==e.wheelStartX?(e.wheelStartX=f.scrollLeft,e.wheelStartY=f.scrollTop,e.wheelDX=d,e.wheelDY=c,setTimeout(function(){if(null!=e.wheelStartX){var a=
104
+ f.scrollLeft-e.wheelStartX,b=f.scrollTop-e.wheelStartY,a=b&&e.wheelDY&&b/e.wheelDY||a&&e.wheelDX&&a/e.wheelDX;e.wheelStartX=e.wheelStartY=null;a&&(R=(R*gc+a)/(gc+1),++gc)}},200)):(e.wheelDX+=d,e.wheelDY+=c))):(c&&lb(a,Math.max(0,Math.min(f.scrollTop+c*R,f.scrollHeight-f.clientHeight))),Ma(a,Math.max(0,Math.min(f.scrollLeft+d*R,f.scrollWidth-f.clientWidth))),O(b),e.wheelStartX=null)}}function hc(a,b,c){if("string"==typeof b&&(b=ic[b],!b))return!1;a.display.input.ensurePolled();var d=a.display.shift,
105
+ e=!1;try{Rb(a)&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=Ae}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Of(a,b,c){for(var d=0;d<a.state.keyMaps.length;d++){var e=xb(b,a.state.keyMaps[d],c,a);if(e)return e}return a.options.extraKeys&&xb(b,a.options.extraKeys,c,a)||xb(b,a.options.keyMap,c,a)}function jc(a,b,c,d){var e=a.state.keySeq;if(e){if(Pf(b))return"handled";Qf.set(50,function(){a.state.keySeq==e&&(a.state.keySeq=null,a.display.input.reset())});b=e+" "+
106
+ b}d=Of(a,b,d);"multi"==d&&(a.state.keySeq=b);"handled"==d&&L(a,"keyHandled",a,b,c);if("handled"==d||"multi"==d)O(c),Yc(a);return e&&!d&&/\'$/.test(b)?(O(c),!0):!!d}function Be(a,b){var c=Rf(b,!0);return c?b.shiftKey&&!a.state.keySeq?jc(a,"Shift-"+c,b,function(b){return hc(a,b,!0)})||jc(a,c,b,function(b){if("string"==typeof b?/^go[A-Z]/.test(b):b.motion)return hc(a,b)}):jc(a,c,b,function(b){return hc(a,b)}):!1}function Sf(a,b,c){return jc(a,"'"+c+"'",b,function(b){return hc(a,b,!0)})}function ve(a){this.curOp.focus=
107
+ fa();if(!ja(this,a)){B&&11>C&&27==a.keyCode&&(a.returnValue=!1);var b=a.keyCode;this.display.shift=16==b||a.shiftKey;var c=Be(this,a);ba&&(md=c?b:null,!c&&88==b&&!Ce&&(W?a.metaKey:a.ctrlKey)&&this.replaceSelection("",null,"cut"));18!=b||/\bCodeMirror-crosshair\b/.test(this.display.lineDiv.className)||Tf(this)}}function Tf(a){function b(a){18!=a.keyCode&&a.altKey||(kb(c,"CodeMirror-crosshair"),ka(document,"keyup",b),ka(document,"mouseover",b))}var c=a.display.lineDiv;mb(c,"CodeMirror-crosshair");v(document,
108
+ "keyup",b);v(document,"mouseover",b)}function ue(a){16==a.keyCode&&(this.doc.sel.shift=!1);ja(this,a)}function we(a){if(!(oa(this.display,a)||ja(this,a)||a.ctrlKey&&!a.altKey||W&&a.metaKey)){var b=a.keyCode,c=a.charCode;if(ba&&b==md)md=null,O(a);else if(!ba||a.which&&!(10>a.which)||!Be(this,a))if(b=String.fromCharCode(null==c?b:c),!Sf(this,a,b))this.display.input.onKeyPress(a)}}function Kf(a){a.state.delayingBlurEvent=!0;setTimeout(function(){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=
109
+ !1,db(a))},100)}function xc(a){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1);"nocursor"!=a.options.readOnly&&(a.state.focused||(K(a,"focus",a),a.state.focused=!0,mb(a.display.wrapper,"CodeMirror-focused"),a.curOp||a.display.selForContextMenu==a.doc.sel||(a.display.input.reset(),J&&setTimeout(function(){a.display.input.reset(!0)},20)),a.display.input.receivedFocus()),Yc(a))}function db(a){a.state.delayingBlurEvent||(a.state.focused&&(K(a,"blur",a),a.state.focused=!1,kb(a.display.wrapper,
110
+ "CodeMirror-focused")),clearInterval(a.display.blinker),setTimeout(function(){a.state.focused||(a.display.shift=!1)},150))}function qe(a,b){var c;(c=oa(a.display,b))||(c=S(a,"gutterContextMenu")?hd(a,b,"gutterContextMenu",!1,K):!1);if(!c)a.display.input.onContextMenu(b)}function De(a,b){if(0>y(a,b.from))return a;if(0>=y(a,b.to))return ta(b);var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;a.line==b.to.line&&(d+=ta(b).ch-b.to.ch);return r(c,d)}function nd(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=
111
+ a.sel.ranges[d];c.push(new z(De(e.anchor,b),De(e.head,b)))}return Z(c,a.sel.primIndex)}function Ee(a,b,c){return a.line==b.line?r(c.line,a.ch-b.ch+c.ch):r(c.line+(a.line-b.line),a.ch)}function Fe(a,b,c){b={canceled:!1,from:b.from,to:b.to,text:b.text,origin:b.origin,cancel:function(){this.canceled=!0}};c&&(b.update=function(b,c,f,g){b&&(this.from=w(a,b));c&&(this.to=w(a,c));f&&(this.text=f);void 0!==g&&(this.origin=g)});K(a,"beforeChange",a,b);a.cm&&K(a.cm,"beforeChange",a.cm,b);return b.canceled?
112
+ null:{from:b.from,to:b.to,text:b.text,origin:b.origin}}function Oa(a,b,c){if(a.cm){if(!a.cm.curOp)return G(a.cm,Oa)(a,b,c);if(a.cm.state.suppressEdits)return}if(S(a,"beforeChange")||a.cm&&S(a.cm,"beforeChange"))if(b=Fe(a,b,!0),!b)return;if(c=Ge&&!c&&Uf(a,b.from,b.to))for(var d=c.length-1;0<=d;--d)He(a,{from:c[d].from,to:c[d].to,text:d?[""]:b.text});else He(a,b)}function He(a,b){if(1!=b.text.length||""!=b.text[0]||0!=y(b.from,b.to)){var c=nd(a,b);Ie(a,b,c,a.cm?a.cm.curOp.id:NaN);yb(a,b,c,od(a,b));
113
+ var d=[];Ga(a,function(a,c){c||-1!=D(d,a.history)||(Je(a.history,b),d.push(a.history));yb(a,b,null,od(a,b))})}}function kc(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var d=a.history,e,f=a.sel,g="undo"==b?d.done:d.undone,h="undo"==b?d.undone:d.done,k=0;k<g.length&&(e=g[k],c?!e.ranges||e.equals(a.sel):e.ranges);k++);if(k!=g.length){for(d.lastOrigin=d.lastSelOrigin=null;;)if(e=g.pop(),e.ranges){Wb(e,h);if(c&&!e.equals(a.sel)){H(a,e,{clearRedo:!1});return}f=e}else break;c=[];Wb(f,h);h.push({changes:c,
114
+ generation:d.generation});d.generation=e.generation||++d.maxGeneration;d=S(a,"beforeChange")||a.cm&&S(a.cm,"beforeChange");for(k=e.changes.length-1;0<=k;--k){var l=e.changes[k];l.origin=b;if(d&&!Fe(a,l,!1)){g.length=0;break}c.push(pd(a,l));f=k?nd(a,l):A(g);yb(a,l,f,Ke(a,l));!k&&a.cm&&a.cm.scrollIntoView({from:l.from,to:ta(l)});var m=[];Ga(a,function(a,b){b||-1!=D(m,a.history)||(Je(a.history,l),m.push(a.history));yb(a,l,null,Ke(a,l))})}}}}function Le(a,b){if(0!=b&&(a.first+=b,a.sel=new la(ob(a.sel.ranges,
115
+ function(a){return new z(r(a.anchor.line+b,a.anchor.ch),r(a.head.line+b,a.head.ch))}),a.sel.primIndex),a.cm)){Q(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;d<c.viewTo;d++)na(a.cm,d,"gutter")}}function yb(a,b,c,d){if(a.cm&&!a.cm.curOp)return G(a.cm,yb)(a,b,c,d);if(b.to.line<a.first)Le(a,b.text.length-1-(b.to.line-b.from.line));else if(!(b.from.line>a.lastLine())){if(b.from.line<a.first){var e=b.text.length-1-(a.first-b.from.line);Le(a,e);b={from:r(a.first,0),to:r(b.to.line+e,b.to.ch),
116
+ text:[A(b.text)],origin:b.origin}}e=a.lastLine();b.to.line>e&&(b={from:b.from,to:r(e,u(a,e).text.length),text:[b.text[0]],origin:b.origin});b.removed=Da(a,b.from,b.to);c||(c=nd(a,b));a.cm?Vf(a.cm,b,d):qd(a,b,d);Vb(a,c,ha)}}function Vf(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,k=f.line;a.options.lineWrapping||(k=F(ia(u(d,f.line))),d.iter(k,g.line+1,function(a){if(a==e.maxLine)return h=!0}));-1<d.sel.contains(b.from,b.to)&&fe(a);qd(d,b,c,Id(a));a.options.lineWrapping||(d.iter(k,f.line+b.text.length,
117
+ function(a){var b=Kb(a);b>e.maxLineLength&&(e.maxLine=a,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)}),h&&(a.curOp.updateMaxLine=!0));d.frontier=Math.min(d.frontier,f.line);fb(a,400);c=b.text.length-(g.line-f.line)-1;b.full?Q(a):f.line!=g.line||1!=b.text.length||Me(a.doc,b)?Q(a,f.line,g.line+1,c):na(a,f.line,"text");c=S(a,"changes");if((d=S(a,"change"))||c)b={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin},d&&L(a,"change",a,b),c&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(b);a.display.selForContextMenu=
118
+ null}function wb(a,b,c,d,e){d||(d=c);if(0>y(d,c)){var f=d;d=c;c=f}"string"==typeof b&&(b=sa(b));Oa(a,{from:c,to:d,text:b,origin:e})}function cc(a,b,c,d,e){var f=a.display,g=xa(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,k=Nc(a),l={};e-c>k&&(e=c+k);var m=a.doc.height+Ec(f),p=c<g,g=e>m-g;c<h?l.scrollTop=p?0:c:e>h+k&&(c=Math.min(c,(g?m:e)-k),c!=h&&(l.scrollTop=c));h=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft;a=pa(a)-
119
+ (a.options.fixedGutter?f.gutters.offsetWidth:0);(f=d-b>a)&&(d=b+a);10>b?l.scrollLeft=0:b<h?l.scrollLeft=Math.max(0,b-(f?0:10)):d>a+h-3&&(l.scrollLeft=d+(f?0:10)-a);return l}function lc(a,b,c){null==b&&null==c||mc(a);null!=b&&(a.curOp.scrollLeft=(null==a.curOp.scrollLeft?a.doc.scrollLeft:a.curOp.scrollLeft)+b);null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function Pa(a){mc(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?r(b.line,b.ch-1):b,
120
+ d=r(b.line,b.ch+1));a.curOp.scrollToPos={from:c,to:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function mc(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=oe(a,b.from),d=oe(a,b.to),b=cc(a,Math.min(c.left,d.left),Math.min(c.top,d.top)-b.margin,Math.max(c.right,d.right),Math.max(c.bottom,d.bottom)+b.margin);a.scrollTo(b.scrollLeft,b.scrollTop)}}function pb(a,b,c,d){var e=a.doc,f;null==c&&(c="add");"smart"==c&&(e.mode.indent?f=sb(a,b):c="prev");var g=a.options.tabSize,h=u(e,
121
+ b),k=aa(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var l=h.text.match(/^\s*/)[0],m;if(!d&&!/\S/.test(h.text))m=0,c="not";else if("smart"==c&&(m=e.mode.indent(f,h.text.slice(l.length),h.text),m==Ae||150<m)){if(!d)return;c="prev"}"prev"==c?m=b>e.first?aa(u(e,b-1).text,null,g):0:"add"==c?m=k+a.options.indentUnit:"subtract"==c?m=k-a.options.indentUnit:"number"==typeof c&&(m=k+c);m=Math.max(0,m);c="";d=0;if(a.options.indentWithTabs)for(a=Math.floor(m/g);a;--a)d+=g,c+="\t";d<m&&(c+=Ne(m-d));if(c!=
122
+ l)return wb(e,c,r(b,0),r(b,l.length),"+input"),h.stateAfter=null,!0;for(a=0;a<e.sel.ranges.length;a++)if(g=e.sel.ranges[a],g.head.line==b&&g.head.ch<l.length){d=r(b,l.length);Xc(e,a,new z(d,d));break}}function nc(a,b,c,d){var e=b,f=b;"number"==typeof b?f=u(a,Math.max(a.first,Math.min(b,a.first+a.size-1))):e=F(b);if(null==e)return null;d(f,e)&&a.cm&&na(a.cm,e,c);return f}function Va(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for(var f=b(c[e]);d.length&&0>=y(f.from,A(d).to);){var g=d.pop();
123
+ if(0>y(g.from,f.from)){f.from=g.from;break}}d.push(f)}T(a,function(){for(var b=d.length-1;0<=b;b--)wb(a.doc,"",d[b].from,d[b].to,"+delete");Pa(a)})}function rd(a,b,c,d,e){function f(b){var d=(e?gd:Oe)(l,h,c,!0);if(null==d){if(b=!b)b=g+c,b<a.first||b>=a.first+a.size?b=m=!1:(g=b,b=l=u(a,b));if(b)h=e?(0>c?bc:ac)(l):0>c?l.text.length:0;else return m=!1}else h=d;return!0}var g=b.line,h=b.ch,k=c,l=u(a,g),m=!0;if("char"==d)f();else if("column"==d)f(!0);else if("word"==d||"group"==d){var p=null;d="group"==
124
+ d;b=a.cm&&a.cm.getHelper(b,"wordChars");for(var n=!0;!(0>c)||f(!n);n=!1){var q=l.text.charAt(h)||"\n",q=oc(q,b)?"w":d&&"\n"==q?"n":!d||/\s/.test(q)?null:"p";!d||n||q||(q="s");if(p&&p!=q){0>c&&(c=1,f());break}q&&(p=q);if(0<c&&!f(!n))break}}k=Xb(a,r(g,h),k,!0);m||(k.hitSide=!0);return k}function Pe(a,b,c,d){var e=a.doc,f=b.left,g;"page"==d?(g=Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),g=b.top+c*(g-(0>c?1.5:.5)*xa(a.display))):"line"==d&&(g=0<c?
125
+ b.bottom+3:b.top-3);for(;;){b=fd(a,f,g);if(!b.outside)break;if(0>c?0>=g:g>=e.height){b.hitSide=!0;break}g+=5*c}return b}function x(a,b,c,d){q.defaults[a]=b;c&&(Ka[a]=d?function(a,b,d){d!=Fd&&c(a,b,d)}:c)}function Wf(a){var b=a.split(/-(?!$)/);a=b[b.length-1];for(var c,d,e,f,g=0;g<b.length-1;g++){var h=b[g];if(/^(cmd|meta|m)$/i.test(h))f=!0;else if(/^a(lt)?$/i.test(h))c=!0;else if(/^(c|ctrl|control)$/i.test(h))d=!0;else if(/^s(hift)$/i.test(h))e=!0;else throw Error("Unrecognized modifier name: "+h);
126
+ }c&&(a="Alt-"+a);d&&(a="Ctrl-"+a);f&&(a="Cmd-"+a);e&&(a="Shift-"+a);return a}function pc(a){return"string"==typeof a?ua[a]:a}function Wa(a,b,c,d,e){if(d&&d.shared)return Xf(a,b,c,d,e);if(a.cm&&!a.cm.curOp)return G(a.cm,Wa)(a,b,c,d,e);var f=new Ha(a,e);e=y(b,c);d&&V(d,f,!1);if(0<e||0==e&&!1!==f.clearWhenEmpty)return f;f.replacedWith&&(f.collapsed=!0,f.widgetNode=t("span",[f.replacedWith],"CodeMirror-widget"),d.handleMouseEvents||f.widgetNode.setAttribute("cm-ignore-events","true"),d.insertLeft&&(f.widgetNode.insertLeft=
127
+ !0));if(f.collapsed){if(Qe(a,b.line,b,c,f)||b.line!=c.line&&Qe(a,c.line,b,c,f))throw Error("Inserting collapsed marker partially overlapping an existing one");ra=!0}f.addToHistory&&Ie(a,{from:b,to:c,origin:"markText"},a.sel,NaN);var g=b.line,h=a.cm,k;a.iter(g,c.line+1,function(a){h&&f.collapsed&&!h.options.lineWrapping&&ia(a)==h.display.maxLine&&(k=!0);f.collapsed&&g!=b.line&&ca(a,0);var d=new qc(f,g==b.line?b.ch:null,g==c.line?c.ch:null);a.markedSpans=a.markedSpans?a.markedSpans.concat([d]):[d];
128
+ d.marker.attachLine(a);++g});f.collapsed&&a.iter(b.line,c.line+1,function(b){ya(a,b)&&ca(b,0)});f.clearOnEnter&&v(f,"beforeCursorEnter",function(){f.clear()});f.readOnly&&(Ge=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory());f.collapsed&&(f.id=++sd,f.atomic=!0);if(h){k&&(h.curOp.updateMaxLine=!0);if(f.collapsed)Q(h,b.line,c.line+1);else if(f.className||f.title||f.startStyle||f.endStyle||f.css)for(d=b.line;d<=c.line;d++)na(h,d,"text");f.atomic&&ge(h.doc);L(h,"markerAdded",h,f)}return f}
129
+ function Xf(a,b,c,d,e){d=V(d);d.shared=!1;var f=[Wa(a,b,c,d,e)],g=f[0],h=d.widgetNode;Ga(a,function(a){h&&(d.widgetNode=h.cloneNode(!0));f.push(Wa(a,w(a,b),w(a,c),d,e));for(var l=0;l<a.linked.length;++l)if(a.linked[l].isParent)return;g=A(f)});return new rc(f,g)}function Re(a){return a.findMarks(r(a.first,0),a.clipPos(r(a.lastLine())),function(a){return a.parent})}function Yf(a){for(var b=0;b<a.length;b++){var c=a[b],d=[c.primary.doc];Ga(c.primary.doc,function(a){d.push(a)});for(var e=0;e<c.markers.length;e++){var f=
130
+ c.markers[e];-1==D(d,f.doc)&&(f.parent=null,c.markers.splice(e--,1))}}}function qc(a,b,c){this.marker=a;this.from=b;this.to=c}function zb(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker==b)return d}}function od(a,b){if(b.full)return null;var c=qb(a,b.from.line)&&u(a,b.from.line).markedSpans,d=qb(a,b.to.line)&&u(a,b.to.line).markedSpans;if(!c&&!d)return null;var e=b.from.ch,f=b.to.ch,g=0==y(b.from,b.to);if(c)for(var h=0,k;h<c.length;++h){var l=c[h],m=l.marker;if(null==l.from||(m.inclusiveLeft?
131
+ l.from<=e:l.from<e)||!(l.from!=e||"bookmark"!=m.type||g&&l.marker.insertLeft)){var p=null==l.to||(m.inclusiveRight?l.to>=e:l.to>e);(k||(k=[])).push(new qc(m,l.from,p?null:l.to))}}c=k;if(d)for(var h=0,n;h<d.length;++h)if(k=d[h],l=k.marker,null==k.to||(l.inclusiveRight?k.to>=f:k.to>f)||k.from==f&&"bookmark"==l.type&&(!g||k.marker.insertLeft))m=null==k.from||(l.inclusiveLeft?k.from<=f:k.from<f),(n||(n=[])).push(new qc(l,m?null:k.from-f,null==k.to?null:k.to-f));d=n;g=1==b.text.length;n=A(b.text).length+
132
+ (g?e:0);if(c)for(f=0;f<c.length;++f)if(h=c[f],null==h.to)(k=zb(d,h.marker),k)?g&&(h.to=null==k.to?null:k.to+n):h.to=e;if(d)for(f=0;f<d.length;++f)h=d[f],null!=h.to&&(h.to+=n),null==h.from?(k=zb(c,h.marker),k||(h.from=n,g&&(c||(c=[])).push(h))):(h.from+=n,g&&(c||(c=[])).push(h));c&&(c=Se(c));d&&d!=c&&(d=Se(d));e=[c];if(!g){var g=b.text.length-2,q;if(0<g&&c)for(f=0;f<c.length;++f)null==c[f].to&&(q||(q=[])).push(new qc(c[f].marker,null,null));for(f=0;f<g;++f)e.push(q);e.push(d)}return e}function Se(a){for(var b=
133
+ 0;b<a.length;++b){var c=a[b];null!=c.from&&c.from==c.to&&!1!==c.marker.clearWhenEmpty&&a.splice(b--,1)}return a.length?a:null}function Ke(a,b){var c;if(c=b["spans_"+a.id]){for(var d=0,e=[];d<b.text.length;++d)e.push(Zf(c[d]));c=e}else c=null;d=od(a,b);if(!c)return d;if(!d)return c;for(e=0;e<c.length;++e){var f=c[e],g=d[e];if(f&&g){var h=0;a:for(;h<g.length;++h){for(var k=g[h],l=0;l<f.length;++l)if(f[l].marker==k.marker)continue a;f.push(k)}}else g&&(c[e]=g)}return c}function Uf(a,b,c){var d=null;
134
+ a.iter(b.line,c.line+1,function(a){if(a.markedSpans)for(var b=0;b<a.markedSpans.length;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=D(d,c)||(d||(d=[])).push(c)}});if(!d)return null;a=[{from:b,to:c}];for(b=0;b<d.length;++b){c=d[b];for(var e=c.find(0),f=0;f<a.length;++f){var g=a[f];if(!(0>y(g.to,e.from)||0<y(g.from,e.to))){var h=[f,1],k=y(g.from,e.from),l=y(g.to,e.to);(0>k||!c.inclusiveLeft&&!k)&&h.push({from:g.from,to:e.from});(0<l||!c.inclusiveRight&&!l)&&h.push({from:e.to,to:g.to});a.splice.apply(a,
135
+ h);f+=h.length-1}}}return a}function Te(a){var b=a.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c].marker.detachLine(a);a.markedSpans=null}}function Ue(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine(a);a.markedSpans=b}}function Ve(a,b){var c=a.lines.length-b.lines.length;if(0!=c)return c;var c=a.find(),d=b.find(),e=y(c.from,d.from)||(a.inclusiveLeft?-1:0)-(b.inclusiveLeft?-1:0);return e?-e:(c=y(c.to,d.to)||(a.inclusiveRight?1:0)-(b.inclusiveRight?1:0))?c:b.id-a.id}function Aa(a,b){var c=
136
+ ra&&a.markedSpans,d;if(c)for(var e,f=0;f<c.length;++f)e=c[f],e.marker.collapsed&&null==(b?e.from:e.to)&&(!d||0>Ve(d,e.marker))&&(d=e.marker);return d}function Qe(a,b,c,d,e){a=u(a,b);if(a=ra&&a.markedSpans)for(b=0;b<a.length;++b){var f=a[b];if(f.marker.collapsed){var g=f.marker.find(0),h=y(g.from,c)||(f.marker.inclusiveLeft?-1:0)-(e.inclusiveLeft?-1:0),k=y(g.to,d)||(f.marker.inclusiveRight?1:0)-(e.inclusiveRight?1:0);if(!(0<=h&&0>=k||0>=h&&0<=k)&&(0>=h&&(0<y(g.to,c)||f.marker.inclusiveRight&&e.inclusiveLeft)||
137
+ 0<=h&&(0>y(g.from,d)||f.marker.inclusiveLeft&&e.inclusiveRight)))return!0}}}function ia(a){for(var b;b=Aa(a,!0);)a=b.find(-1,!0).line;return a}function Mc(a,b){var c=u(a,b),d=ia(c);return c==d?b:F(d)}function Ld(a,b){if(b>a.lastLine())return b;var c=u(a,b),d;if(!ya(a,c))return b;for(;d=Aa(c,!1);)c=d.find(1,!0).line;return F(c)+1}function ya(a,b){var c=ra&&b.markedSpans;if(c)for(var d,e=0;e<c.length;++e)if(d=c[e],d.marker.collapsed&&(null==d.from||!d.marker.widgetNode&&0==d.from&&d.marker.inclusiveLeft&&
138
+ td(a,b,d)))return!0}function td(a,b,c){if(null==c.to)return b=c.marker.find(1,!0),td(a,b.line,zb(b.line.markedSpans,c.marker));if(c.marker.inclusiveRight&&c.to==b.text.length)return!0;for(var d,e=0;e<b.markedSpans.length;++e)if(d=b.markedSpans[e],d.marker.collapsed&&!d.marker.widgetNode&&d.from==c.to&&(null==d.to||d.to!=c.from)&&(d.marker.inclusiveLeft||c.marker.inclusiveRight)&&td(a,b,d))return!0}function ub(a){if(null!=a.height)return a.height;var b=a.doc.cm;if(!b)return 0;if(!Wc(document.body,
139
+ a.node)){var c="position: relative;";a.coverGutter&&(c+="margin-left: -"+b.display.gutters.offsetWidth+"px;");a.noHScroll&&(c+="width: "+b.display.wrapper.clientWidth+"px;");U(b.display.measure,t("div",[a.node],null,c))}return a.height=a.node.offsetHeight}function $f(a,b,c,d){var e=new sc(a,c,d),f=a.cm;f&&e.noHScroll&&(f.display.alignWidgets=!0);nc(a,b,"widget",function(b){var c=b.widgets||(b.widgets=[]);null==e.insertAt?c.push(e):c.splice(Math.min(c.length-1,Math.max(0,e.insertAt)),0,e);e.line=b;
140
+ f&&!ya(a,b)&&(c=ea(b)<a.scrollTop,ca(b,b.height+ub(e)),c&&lc(f,null,e.height),f.curOp.forceUpdate=!0);return!0});return e}function We(a,b){if(a)for(;;){var c=a.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!c)break;a=a.slice(0,c.index)+a.slice(c.index+c[0].length);var d=c[1]?"bgClass":"textClass";null==b[d]?b[d]=c[2]:(new RegExp("(?:^|s)"+c[2]+"(?:$|s)")).test(b[d])||(b[d]+=" "+c[2])}return a}function Xe(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode){var c=q.innerMode(a,b);if(c.mode.blankLine)return c.mode.blankLine(c.state)}}
141
+ function ud(a,b,c,d){for(var e=0;10>e;e++){d&&(d[0]=q.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw Error("Mode "+a.name+" failed to advance stream.");}function Ye(a,b,c,d){function e(a){return{start:m.start,end:m.pos,string:m.current(),type:h||null,state:a?Sa(f.mode,l):l}}var f=a.doc,g=f.mode,h;b=w(f,b);var k=u(f,b.line),l=sb(a,b.line,c),m=new tc(k.text,a.options.tabSize),p;for(d&&(p=[]);(d||m.pos<b.ch)&&!m.eol();)m.start=m.pos,h=ud(g,m,l),d&&p.push(e(!0));return d?p:e()}
142
+ function Ze(a,b,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.flattenSpans);var k=0,l=null,m=new tc(b,a.options.tabSize),p,n=a.options.addModeClass&&[null];for(""==b&&We(Xe(c,d),f);!m.eol();){m.pos>a.options.maxHighlightLength?(h=!1,g&&Zc(a,b,d,m.pos),m.pos=b.length,p=null):p=We(ud(c,m,d,n),f);if(n){var q=n[0].name;q&&(p="m-"+(p?q+" "+p:q))}if(!h||l!=p){for(;k<m.start;)k=Math.min(m.start,k+5E4),e(k,l);l=p}m.start=m.pos}for(;k<m.pos;)a=Math.min(m.pos,k+5E4),e(a,l),k=a}function je(a,b,c,d){var e=
143
+ [a.state.modeGen],f={};Ze(a,b.text,a.doc.mode,c,function(a,b){e.push(a,b)},f,d);for(c=0;c<a.state.overlays.length;++c){var g=a.state.overlays[c],h=1,k=0;Ze(a,b.text,g.mode,!0,function(a,b){for(var c=h;k<a;){var d=e[h];d>a&&e.splice(h,1,a,e[h+1],d);h+=2;k=Math.min(a,d)}if(b)if(g.opaque)e.splice(c,h-c,a,"cm-overlay "+b),h=c+2;else for(;c<h;c+=2)d=e[c+1],e[c+1]=(d?d+" ":"")+"cm-overlay "+b},f)}return{styles:e,classes:f.bgClass||f.textClass?f:null}}function $e(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=
144
+ je(a,b,b.stateAfter=sb(a,F(b)));b.styles=d.styles;d.classes?b.styleClasses=d.classes:b.styleClasses&&(b.styleClasses=null);c===a.doc.frontier&&a.doc.frontier++}return b.styles}function Zc(a,b,c,d){var e=a.doc.mode,f=new tc(b,a.options.tabSize);f.start=f.pos=d||0;for(""==b&&Xe(e,c);!f.eol()&&f.pos<=a.options.maxHighlightLength;)ud(e,f,c),f.start=f.pos}function af(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass?ag:bg;return c[a]||(c[a]=a.replace(/\S+/g,"cm-$&"))}function Sd(a,b){var c=
145
+ t("span",null,null,J?"padding-right: .1px":null),c={pre:t("pre",[c]),content:c,col:0,pos:0,cm:a,splitSpaces:(B||J)&&a.getOption("lineWrapping")};b.measure={};for(var d=0;d<=(b.rest?b.rest.length:0);d++){var e=d?b.rest[d-1]:b.line,f;c.pos=0;c.addToken=cg;var g;if(null!=vd)g=vd;else{g=U(a.display.measure,document.createTextNode("A\u062eA"));var h=Ea(g,0,1).getBoundingClientRect();g=h&&h.left!=h.right?vd=3>Ea(g,1,2).getBoundingClientRect().right-h.right:!1}g&&(f=Y(e))&&(c.addToken=dg(c.addToken,f));
146
+ c.map=[];h=b!=a.display.externalMeasured&&F(e);a:{g=c;var h=$e(a,e,h),k=e.markedSpans,l=e.text,m=0;if(k)for(var p=l.length,n=0,q=1,r="",u=void 0,v=void 0,w=0,x=void 0,y=void 0,A=void 0,C=void 0,z=void 0;;){if(w==n){for(var x=y=A=C=v="",z=null,w=Infinity,G=[],H=0;H<k.length;++H){var I=k[H],D=I.marker;"bookmark"==D.type&&I.from==n&&D.widgetNode?G.push(D):I.from<=n&&(null==I.to||I.to>n||D.collapsed&&I.to==n&&I.from==n)?(null!=I.to&&I.to!=n&&w>I.to&&(w=I.to,y=""),D.className&&(x+=" "+D.className),D.css&&
147
+ (v=D.css),D.startStyle&&I.from==n&&(A+=" "+D.startStyle),D.endStyle&&I.to==w&&(y+=" "+D.endStyle),D.title&&!C&&(C=D.title),D.collapsed&&(!z||0>Ve(z.marker,D))&&(z=I)):I.from>n&&w>I.from&&(w=I.from)}if(z&&(z.from||0)==n){bf(g,(null==z.to?p+1:z.to)-n,z.marker,null==z.from);if(null==z.to)break a;z.to==n&&(z=!1)}if(!z&&G.length)for(H=0;H<G.length;++H)bf(g,0,G[H])}if(n>=p)break;for(G=Math.min(p,w);;){if(r){H=n+r.length;z||(I=H>G?r.slice(0,G-n):r,g.addToken(g,I,u?u+x:x,A,n+I.length==w?y:"",C,v));if(H>=
148
+ G){r=r.slice(G-n);n=G;break}n=H;A=""}r=l.slice(m,m=h[q++]);u=af(h[q++],g.cm.options)}}else for(var q=1;q<h.length;q+=2)g.addToken(g,l.slice(m,m=h[q]),af(h[q+1],g.cm.options))}e.styleClasses&&(e.styleClasses.bgClass&&(c.bgClass=wd(e.styleClasses.bgClass,c.bgClass||"")),e.styleClasses.textClass&&(c.textClass=wd(e.styleClasses.textClass,c.textClass||"")));0==c.map.length&&c.map.push(0,0,c.content.appendChild(eg(a.display.measure)));0==d?(b.measure.map=c.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=
149
+ [])).push(c.map),(b.measure.caches||(b.measure.caches=[])).push({}))}J&&/\bcm-tab\b/.test(c.content.lastChild.className)&&(c.content.className="cm-tab-wrap-hack");K(a,"renderLine",a,b.line,c.pre);c.pre.className&&(c.textClass=wd(c.pre.className,c.textClass||""));return c}function cg(a,b,c,d,e,f,g){if(b){var h=a.splitSpaces?b.replace(/ {3,}/g,fg):b,k=a.cm.state.specialChars,l=!1;if(k.test(b))for(var m=document.createDocumentFragment(),p=0;;){k.lastIndex=p;var n=k.exec(b),q=n?n.index-p:b.length-p;if(q){var r=
150
+ document.createTextNode(h.slice(p,p+q));B&&9>C?m.appendChild(t("span",[r])):m.appendChild(r);a.map.push(a.pos,a.pos+q,r);a.col+=q;a.pos+=q}if(!n)break;p+=q+1;"\t"==n[0]?(r=a.cm.options.tabSize,n=r-a.col%r,r=m.appendChild(t("span",Ne(n),"cm-tab")),r.setAttribute("role","presentation"),r.setAttribute("cm-text","\t"),a.col+=n):(r=a.cm.options.specialCharPlaceholder(n[0]),r.setAttribute("cm-text",n[0]),B&&9>C?m.appendChild(t("span",[r])):m.appendChild(r),a.col+=1);a.map.push(a.pos,a.pos+1,r);a.pos++}else{a.col+=
151
+ b.length;var m=document.createTextNode(h);a.map.push(a.pos,a.pos+b.length,m);B&&9>C&&(l=!0);a.pos+=b.length}if(c||d||e||l||g)return b=c||"",d&&(b+=d),e&&(b+=e),d=t("span",[m],b,g),f&&(d.title=f),a.content.appendChild(d);a.content.appendChild(m)}}function fg(a){for(var b=" ",c=0;c<a.length-2;++c)b+=c%2?" ":"\u00a0";return b+" "}function dg(a,b){return function(c,d,e,f,g,h,k){e=e?e+" cm-force-border":"cm-force-border";for(var l=c.pos,m=l+d.length;;){for(var p=0;p<b.length;p++){var n=b[p];if(n.to>l&&
152
+ n.from<=l)break}if(n.to>=m)return a(c,d,e,f,g,h,k);a(c,d.slice(0,n.to-l),e,f,null,h,k);f=null;d=d.slice(n.to-l);l=n.to}}}function bf(a,b,c,d){var e=!d&&c.widgetNode;e&&a.map.push(a.pos,a.pos+b,e);!d&&a.cm.display.input.needsContentAttribute&&(e||(e=a.content.appendChild(document.createElement("span"))),e.setAttribute("cm-marker",c.id));e&&(a.cm.display.input.setUneditable(e),a.content.appendChild(e));a.pos+=b}function Me(a,b){return 0==b.from.ch&&0==b.to.ch&&""==A(b.text)&&(!a.cm||a.cm.options.wholeLineUpdateBefore)}
153
+ function qd(a,b,c,d){function e(a,c,e){a.text=c;a.stateAfter&&(a.stateAfter=null);a.styles&&(a.styles=null);null!=a.order&&(a.order=null);Te(a);Ue(a,e);c=d?d(a):1;c!=a.height&&ca(a,c);L(a,"change",a,b)}function f(a,b){for(var e=a,f=[];e<b;++e)f.push(new Ab(k[e],c?c[e]:null,d));return f}var g=b.from,h=b.to,k=b.text,l=u(a,g.line),m=u(a,h.line),p=A(k),n=c?c[k.length-1]:null,q=h.line-g.line;if(b.full)a.insert(0,f(0,k.length)),a.remove(k.length,a.size-k.length);else if(Me(a,b)){var r=f(0,k.length-1);e(m,
154
+ m.text,n);q&&a.remove(g.line,q);r.length&&a.insert(g.line,r)}else l==m?1==k.length?e(l,l.text.slice(0,g.ch)+p+l.text.slice(h.ch),n):(r=f(1,k.length-1),r.push(new Ab(p+l.text.slice(h.ch),n,d)),e(l,l.text.slice(0,g.ch)+k[0],c?c[0]:null),a.insert(g.line+1,r)):1==k.length?(e(l,l.text.slice(0,g.ch)+k[0]+m.text.slice(h.ch),c?c[0]:null),a.remove(g.line+1,q)):(e(l,l.text.slice(0,g.ch)+k[0],c?c[0]:null),e(m,p+m.text.slice(h.ch),n),r=f(1,k.length-1),1<q&&a.remove(g.line+1,q-1),a.insert(g.line+1,r));L(a,"change",
155
+ a,b)}function Bb(a){this.lines=a;this.parent=null;for(var b=0,c=0;b<a.length;++b)a[b].parent=this,c+=a[b].height;this.height=c}function Cb(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e=a[d],b=b+e.chunkSize(),c=c+e.height;e.parent=this}this.size=b;this.height=c;this.parent=null}function Ga(a,b,c){function d(a,f,g){if(a.linked)for(var h=0;h<a.linked.length;++h){var k=a.linked[h];if(k.doc!=f){var l=g&&k.sharedHist;if(!c||l)b(k.doc,l),d(k.doc,a,l)}}}d(a,null,!0)}function Ed(a,b){if(b.cm)throw Error("This document is already in use.");
156
+ a.doc=b;b.cm=a;Ac(a);zc(a);a.options.lineWrapping||Dc(a);a.options.mode=b.modeOption;Q(a)}function u(a,b){b-=a.first;if(0>b||b>=a.size)throw Error("There is no line "+(b+a.first)+" in the document.");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(b<f){c=e;break}b-=f}return c.lines[b]}function Da(a,b,c){var d=[],e=b.line;a.iter(b.line,c.line+1,function(a){a=a.text;e==c.line&&(a=a.slice(0,c.ch));e==b.line&&(a=a.slice(b.ch));d.push(a);++e});return d}function xd(a,b,c){var d=
157
+ [];a.iter(b,c,function(a){d.push(a.text)});return d}function ca(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height+=c}function F(a){if(null==a.parent)return null;var b=a.parent;a=D(b.lines,a);for(var c=b.parent;c;b=c,c=c.parent)for(var d=0;c.children[d]!=b;++d)a+=c.children[d].chunkSize();return a+b.first}function Ba(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d){var e=a.children[d],f=e.height;if(b<f){a=e;continue a}b-=f;c+=e.chunkSize()}return c}while(!a.lines);for(d=0;d<
158
+ a.lines.length;++d){e=a.lines[d].height;if(b<e)break;b-=e}return c+d}function ea(a){a=ia(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){var e=c.lines[d];if(e==a)break;else b+=e.height}for(a=c.parent;a;c=a,a=c.parent)for(d=0;d<a.children.length&&(e=a.children[d],e!=c);++d)b+=e.height;return b}function Y(a){var b=a.order;null==b&&(b=a.order=gg(a.text));return b}function uc(a){this.done=[];this.undone=[];this.undoDepth=Infinity;this.lastModTime=this.lastSelTime=0;this.lastOrigin=this.lastSelOrigin=
159
+ this.lastOp=this.lastSelOp=null;this.generation=this.maxGeneration=a||1}function pd(a,b){var c={from:Rc(b.from),to:ta(b),text:Da(a,b.from,b.to)};cf(a,c,b.from.line,b.to.line+1);Ga(a,function(a){cf(a,c,b.from.line,b.to.line+1)},!0);return c}function ce(a){for(;a.length;)if(A(a).ranges)a.pop();else break}function Ie(a,b,c,d){var e=a.history;e.undone.length=0;var f=+new Date,g,h;if(h=e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&("+"==b.origin.charAt(0)&&a.cm&&e.lastModTime>f-a.cm.options.historyEventDelay||
160
+ "*"==b.origin.charAt(0)))e.lastOp==d?(ce(e.done),g=A(e.done)):e.done.length&&!A(e.done).ranges?g=A(e.done):1<e.done.length&&!e.done[e.done.length-2].ranges?(e.done.pop(),g=A(e.done)):g=void 0,h=g;if(h){var k=A(g.changes);0==y(b.from,b.to)&&0==y(b.from,k.to)?k.to=ta(b):g.changes.push(pd(a,b))}else for((g=A(e.done))&&g.ranges||Wb(a.sel,e.done),g={changes:[pd(a,b)],generation:e.generation},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift();e.done.push(c);e.generation=
161
+ ++e.maxGeneration;e.lastModTime=e.lastSelTime=f;e.lastOp=e.lastSelOp=d;e.lastOrigin=e.lastSelOrigin=b.origin;k||K(a,"historyAdded")}function Wb(a,b){var c=A(b);c&&c.ranges&&c.equals(a)||b.push(a)}function cf(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),function(c){c.markedSpans&&((e||(e=b["spans_"+a.id]={}))[f]=c.markedSpans);++f})}function Zf(a){if(!a)return null;for(var b=0,c;b<a.length;++b)a[b].marker.explicitlyCleared?c||(c=a.slice(0,b)):c&&c.push(a[b]);
162
+ return c?c.length?c:null:a}function Xa(a,b,c){for(var d=0,e=[];d<a.length;++d){var f=a[d];if(f.ranges)e.push(c?la.prototype.deepCopy.call(f):f);else{var f=f.changes,g=[];e.push({changes:g});for(var h=0;h<f.length;++h){var k=f[h],l;g.push({from:k.from,to:k.to,text:k.text});if(b)for(var m in k)(l=m.match(/^spans_(\d+)$/))&&-1<D(b,Number(l[1]))&&(A(g)[m]=k[m],delete k[m])}}}return e}function df(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}function ef(a,b,c,d){for(var e=0;e<a.length;++e){var f=
163
+ a[e],g=!0;if(f.ranges){f.copied||(f=a[e]=f.deepCopy(),f.copied=!0);for(var h=0;h<f.ranges.length;h++)df(f.ranges[h].anchor,b,c,d),df(f.ranges[h].head,b,c,d)}else{for(h=0;h<f.changes.length;++h){var k=f.changes[h];if(c<k.from.line)k.from=r(k.from.line+d,k.from.ch),k.to=r(k.to.line+d,k.to.ch);else if(b<=k.to.line){g=!1;break}}g||(a.splice(0,e+1),e=0)}}}function Je(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;ef(a.done,c,d,e);ef(a.undone,c,d,e)}function ld(a){return null!=a.defaultPrevented?
164
+ a.defaultPrevented:0==a.returnValue}function xe(a){var b=a.which;null==b&&(a.button&1?b=1:a.button&2?b=3:a.button&4&&(b=2));W&&a.ctrlKey&&1==b&&(b=3);return b}function L(a,b){function c(a){return function(){a.apply(null,e)}}var d=a._handlers&&a._handlers[b];if(d){var e=Array.prototype.slice.call(arguments,2),f;Ta?f=Ta.delayedCallbacks:Db?f=Db:(f=Db=[],setTimeout(hg,0));for(var g=0;g<d.length;++g)f.push(c(d[g]))}}function hg(){var a=Db;Db=null;for(var b=0;b<a.length;++b)a[b]()}function ja(a,b,c){"string"==
165
+ typeof b&&(b={type:b,preventDefault:function(){this.defaultPrevented=!0}});K(a,c||b.type,a,b);return ld(b)||b.codemirrorIgnore}function fe(a){var b=a._handlers&&a._handlers.cursorActivity;if(b){a=a.curOp.cursorActivityHandlers||(a.curOp.cursorActivityHandlers=[]);for(var c=0;c<b.length;++c)-1==D(a,b[c])&&a.push(b[c])}}function S(a,b){var c=a._handlers&&a._handlers[b];return c&&0<c.length}function Ya(a){a.prototype.on=function(a,c){v(this,a,c)};a.prototype.off=function(a,c){ka(this,a,c)}}function bb(){this.id=
166
+ null}function ye(a,b,c){for(var d=0,e=0;;){var f=a.indexOf("\t",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);e+=f-d;e+=c-e%c;d=f+1;if(e>=b)return d}}function Ne(a){for(;vc.length<=a;)vc.push(A(vc)+" ");return vc[a]}function A(a){return a[a.length-1]}function D(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}function ob(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}function Eb(){}function ff(a,b){var c;Object.create?c=Object.create(a):
167
+ (Eb.prototype=a,c=new Eb);b&&V(b,c);return c}function V(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||!1===c&&b.hasOwnProperty(d)||(b[d]=a[d]);return b}function cb(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function oc(a,b){return b?-1<b.source.indexOf("\\w")&&gf(a)?!0:b.test(a):gf(a)}function hf(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;return!0}function tb(a){return 768<=a.charCodeAt(0)&&ig.test(a)}function t(a,b,c,d){a=document.createElement(a);
168
+ c&&(a.className=c);d&&(a.style.cssText=d);if("string"==typeof b)a.appendChild(document.createTextNode(b));else if(b)for(c=0;c<b.length;++c)a.appendChild(b[c]);return a}function za(a){for(var b=a.childNodes.length;0<b;--b)a.removeChild(a.firstChild);return a}function U(a,b){return za(a).appendChild(b)}function fa(){return document.activeElement}function Fb(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}function wd(a,b){for(var c=a.split(" "),d=0;d<c.length;d++)c[d]&&!Fb(c[d]).test(b)&&(b+=" "+c[d]);
169
+ return b}function jf(a){if(document.body.getElementsByClassName)for(var b=document.body.getElementsByClassName("CodeMirror"),c=0;c<b.length;c++){var d=b[c].CodeMirror;d&&a(d)}}function tf(){var a;v(window,"resize",function(){null==a&&(a=setTimeout(function(){a=null;jf(If)},100))});v(window,"blur",function(){jf(db)})}function eg(a){if(null==yd){var b=t("span","\u200b");U(a,t("span",[b,document.createTextNode("x")]));0!=a.firstChild.offsetHeight&&(yd=1>=b.offsetWidth&&2<b.offsetHeight&&!(B&&8>C))}a=
170
+ yd?t("span","\u200b"):t("span","\u00a0",null,"display: inline-block; width: 1px; margin-right: -1px");a.setAttribute("cm-text","");return a}function Af(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;f<a.length;++f){var g=a[f];if(g.from<c&&g.to>b||b==c&&g.to==b)d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?"rtl":"ltr"),e=!0}e||d(b,c,"ltr")}function dd(a){return a.level%2?a.to:a.from}function ed(a){return a.level%2?a.from:a.to}function ac(a){return(a=Y(a))?dd(a[0]):0}function bc(a){var b=Y(a);
171
+ return b?ed(A(b)):a.text.length}function kf(a,b){var c=u(a.doc,b),d=ia(c);d!=c&&(b=F(d));d=(c=Y(d))?c[0].level%2?bc(d):ac(d):0;return r(b,d)}function lf(a,b){var c=kf(a,b.line),d=u(a.doc,c.line),e=Y(d);return e&&0!=e[0].level?c:(d=Math.max(0,d.text.search(/\S/)),r(c.line,b.line==c.line&&b.ch<=d&&b.ch?0:d))}function Sb(a,b){vb=null;for(var c=0,d;c<a.length;++c){var e=a[c];if(e.from<b&&e.to>b)return c;if(e.from==b||e.to==b)if(null==d)d=c;else{var f;f=e.level;var g=a[d].level,h=a[0].level;f=f==h?!0:
172
+ g==h?!1:f<g;if(f)return e.from!=e.to&&(vb=d),c;e.from!=e.to&&(vb=c);break}}return d}function zd(a,b,c,d){if(!d)return b+c;do b+=c;while(0<b&&tb(a.text.charAt(b)));return b}function gd(a,b,c,d){var e=Y(a);if(!e)return Oe(a,b,c,d);var f=Sb(e,b),g=e[f];for(b=zd(a,b,g.level%2?-c:c,d);;){if(b>g.from&&b<g.to)return b;if(b==g.from||b==g.to){if(Sb(e,b)==f)return b;g=e[f+c];return 0<c==g.level%2?g.to:g.from}g=e[f+=c];if(!g)return null;b=0<c==g.level%2?zd(a,g.to,-1,d):zd(a,g.from,1,d)}}function Oe(a,b,c,d){b+=
173
+ c;if(d)for(;0<b&&tb(a.text.charAt(b));)b+=c;return 0>b||b>a.text.length?null:b}var wa=/gecko\/\d/i.test(navigator.userAgent),mf=/MSIE \d/.test(navigator.userAgent),nf=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),B=mf||nf,C=B&&(mf?document.documentMode||6:nf[1]),J=/WebKit\//.test(navigator.userAgent),jg=J&&/Qt\/\d+\.\d+/.test(navigator.userAgent),kg=/Chrome\//.test(navigator.userAgent),ba=/Opera\//.test(navigator.userAgent),te=/Apple Computer/.test(navigator.vendor),lg=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),
174
+ Gf=/PhantomJS/.test(navigator.userAgent),Qa=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),ab=Qa||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),W=Qa||/Mac/.test(navigator.platform),mg=/win/i.test(navigator.platform),Ia=ba&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);Ia&&(Ia=Number(Ia[1]));Ia&&15<=Ia&&(ba=!1,J=!0);var of=W&&(jg||ba&&(null==Ia||12.11>Ia)),id=wa||B&&9<=C,Ge=!1,ra=!1;Fc.prototype=V({update:function(a){var b=
175
+ a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;c?(this.vert.style.display="block",this.vert.style.bottom=b?d+"px":"0",this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+(a.viewHeight-(b?d:0)))+"px"):(this.vert.style.display="",this.vert.firstChild.style.height="0");b?(this.horiz.style.display="block",this.horiz.style.right=c?d+"px":"0",this.horiz.style.left=a.barLeft+"px",this.horiz.firstChild.style.width=a.scrollWidth-a.clientWidth+(a.viewWidth-
176
+ a.barLeft-(c?d:0))+"px"):(this.horiz.style.display="",this.horiz.firstChild.style.width="0");!this.checkedOverlay&&0<a.clientHeight&&(0==d&&this.overlayHack(),this.checkedOverlay=!0);return{right:c?d:0,bottom:b?d:0}},setScrollLeft:function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a)},setScrollTop:function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a)},overlayHack:function(){this.horiz.style.minHeight=this.vert.style.minWidth=W&&!lg?"12px":"18px";var a=this,b=function(b){(b.target||
177
+ b.srcElement)!=a.vert&&(b.target||b.srcElement)!=a.horiz&&G(a.cm,pe)(b)};v(this.vert,"mousedown",b);v(this.horiz,"mousedown",b)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz);a.removeChild(this.vert)}},Fc.prototype);Gc.prototype=V({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},Gc.prototype);q.scrollbarModel={"native":Fc,"null":Gc};Mb.prototype.signal=function(a,b){S(a,b)&&this.events.push(arguments)};Mb.prototype.finish=
178
+ function(){for(var a=0;a<this.events.length;a++)K.apply(null,this.events[a])};var r=q.Pos=function(a,b){if(!(this instanceof r))return new r(a,b);this.line=a;this.ch=b},y=q.cmpPos=function(a,b){return a.line-b.line||a.ch-b.ch},X=null;Tc.prototype=V({init:function(a){function b(a){if(d.somethingSelected())X=d.getSelections(),c.inaccurateSelection&&(c.prevInput="",c.inaccurateSelection=!1,f.value=X.join("\n"),Za(f));else if(d.options.lineWiseCopyCut){var b=Vd(d);X=b.text;"cut"==a.type?d.setSelections(b.ranges,
179
+ null,ha):(c.prevInput="",f.value=b.text.join("\n"),Za(f))}else return;"cut"==a.type&&(d.state.cutIncoming=!0)}var c=this,d=this.cm,e=this.wrapper=Xd(),f=this.textarea=e.firstChild;a.wrapper.insertBefore(e,a.wrapper.firstChild);Qa&&(f.style.width="0px");v(f,"input",function(){B&&9<=C&&c.hasSelection&&(c.hasSelection=null);c.poll()});v(f,"paste",function(){if(J&&!d.state.fakedLastChar&&!(200>new Date-d.state.lastMiddleDown)){var a=f.selectionStart,b=f.selectionEnd;f.value+="$";f.selectionEnd=b;f.selectionStart=
180
+ a;d.state.fakedLastChar=!0}d.state.pasteIncoming=!0;c.fastPoll()});v(f,"cut",b);v(f,"copy",b);v(a.scroller,"paste",function(b){oa(a,b)||(d.state.pasteIncoming=!0,c.focus())});v(a.lineSpace,"selectstart",function(b){oa(a,b)||O(b)});v(f,"compositionstart",function(){var a=d.getCursor("from");c.composing={start:a,range:d.markText(a,d.getCursor("to"),{className:"CodeMirror-composing"})}});v(f,"compositionend",function(){c.composing&&(c.poll(),c.composing.range.clear(),c.composing=null)})},prepareSelection:function(){var a=
181
+ this.cm,b=a.display,c=a.doc,d=he(a);if(a.options.moveInputWithCursor){var a=ma(a,c.sel.primary().head,"div"),c=b.wrapper.getBoundingClientRect(),e=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,a.top+e.top-c.top));d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,a.left+e.left-c.left))}return d},showSelection:function(a){var b=this.cm.display;U(b.cursorDiv,a.cursors);U(b.selectionDiv,a.selection);null!=a.teTop&&(this.wrapper.style.top=a.teTop+"px",this.wrapper.style.left=
182
+ a.teLeft+"px")},reset:function(a){if(!this.contextMenuPending){var b,c,d=this.cm,e=d.doc;d.somethingSelected()?(this.prevInput="",b=e.sel.primary(),c=(b=Ce&&(100<b.to().line-b.from().line||1E3<(c=d.getSelection()).length))?"-":c||d.getSelection(),this.textarea.value=c,d.state.focused&&Za(this.textarea),B&&9<=C&&(this.hasSelection=c)):a||(this.prevInput=this.textarea.value="",B&&9<=C&&(this.hasSelection=null));this.inaccurateSelection=b}},getField:function(){return this.textarea},supportsTouch:function(){return!1},
183
+ focus:function(){if("nocursor"!=this.cm.options.readOnly&&(!ab||fa()!=this.textarea))try{this.textarea.focus()}catch(a){}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var a=this;a.pollingFast||a.polling.set(this.cm.options.pollInterval,function(){a.poll();a.cm.state.focused&&a.slowPoll()})},fastPoll:function(){function a(){c.poll()||b?(c.pollingFast=!1,c.slowPoll()):(b=
184
+ !0,c.polling.set(60,a))}var b=!1,c=this;c.pollingFast=!0;c.polling.set(20,a)},poll:function(){var a=this.cm,b=this.textarea,c=this.prevInput;if(!a.state.focused||ng(b)&&!c||Rb(a)||a.options.disableInput||a.state.keySeq)return!1;a.state.pasteIncoming&&a.state.fakedLastChar&&(b.value=b.value.substring(0,b.value.length-1),a.state.fakedLastChar=!1);var d=b.value;if(d==c&&!a.somethingSelected())return!1;if(B&&9<=C&&this.hasSelection===d||W&&/[\uf700-\uf7ff]/.test(d))return a.display.input.reset(),!1;if(a.doc.sel==
185
+ a.display.selForContextMenu){var e=d.charCodeAt(0);8203!=e||c||(c="\u200b");if(8666==e)return this.reset(),this.cm.execCommand("undo")}for(var f=0,e=Math.min(c.length,d.length);f<e&&c.charCodeAt(f)==d.charCodeAt(f);)++f;var g=this;T(a,function(){Sc(a,d.slice(f),c.length-f,null,g.composing?"*compose":null);1E3<d.length||-1<d.indexOf("\n")?b.value=g.prevInput="":g.prevInput=d;g.composing&&(g.composing.range.clear(),g.composing.range=a.markText(g.composing.start,a.getCursor("to"),{className:"CodeMirror-composing"}))});
186
+ return!0},ensurePolled:function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},onKeyPress:function(){B&&9<=C&&(this.hasSelection=null);this.fastPoll()},onContextMenu:function(a){function b(){if(null!=g.selectionStart){var a=e.somethingSelected(),b="\u200b"+(a?g.value:"");g.value="\u21da";g.value=b;d.prevInput=a?"":"\u200b";g.selectionStart=1;g.selectionEnd=b.length;f.selForContextMenu=e.doc.sel}}function c(){d.contextMenuPending=!1;d.wrapper.style.position="relative";g.style.cssText=l;B&&
187
+ 9>C&&f.scrollbars.setScrollTop(f.scroller.scrollTop=k);if(null!=g.selectionStart){(!B||B&&9>C)&&b();var a=0,c=function(){f.selForContextMenu==e.doc.sel&&0==g.selectionStart&&0<g.selectionEnd&&"\u200b"==d.prevInput?G(e,ic.selectAll)(e):10>a++?f.detectingSelectAll=setTimeout(c,500):f.input.reset()};f.detectingSelectAll=setTimeout(c,200)}}var d=this,e=d.cm,f=e.display,g=d.textarea,h=Ua(e,a),k=f.scroller.scrollTop;if(h&&!ba){e.options.resetSelectionOnContextMenu&&-1==e.doc.sel.contains(h)&&G(e,H)(e.doc,
188
+ ga(h),ha);var l=g.style.cssText;d.wrapper.style.position="absolute";g.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(a.clientY-5)+"px; left: "+(a.clientX-5)+"px; z-index: 1000; background: "+(B?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";if(J)var m=window.scrollY;f.input.focus();J&&window.scrollTo(null,m);f.input.reset();e.somethingSelected()||(g.value=d.prevInput=" ");d.contextMenuPending=
189
+ !0;f.selForContextMenu=e.doc.sel;clearTimeout(f.detectingSelectAll);B&&9<=C&&b();if(id){jd(a);var p=function(){ka(window,"mouseup",p);setTimeout(c,20)};v(window,"mouseup",p)}else setTimeout(c,50)}},setUneditable:Eb,needsContentAttribute:!1},Tc.prototype);Uc.prototype=V({init:function(a){function b(a){if(d.somethingSelected())X=d.getSelections(),"cut"==a.type&&d.replaceSelection("",null,"cut");else if(d.options.lineWiseCopyCut){var b=Vd(d);X=b.text;"cut"==a.type&&d.operation(function(){d.setSelections(b.ranges,
190
+ 0,ha);d.replaceSelection("",null,"cut")})}else return;if(a.clipboardData&&!Qa)a.preventDefault(),a.clipboardData.clearData(),a.clipboardData.setData("text/plain",X.join("\n"));else{var c=Xd();a=c.firstChild;d.display.lineSpace.insertBefore(c,d.display.lineSpace.firstChild);a.value=X.join("\n");var h=document.activeElement;Za(a);setTimeout(function(){d.display.lineSpace.removeChild(c);h.focus()},50)}}var c=this,d=c.cm;a=c.div=a.lineDiv;a.contentEditable="true";Wd(a);v(a,"paste",function(a){var b=a.clipboardData&&
191
+ a.clipboardData.getData("text/plain");b&&(a.preventDefault(),d.replaceSelection(b,null,"paste"))});v(a,"compositionstart",function(a){a=a.data;c.composing={sel:d.doc.sel,data:a,startData:a};if(a){var b=d.doc.sel.primary(),g=d.getLine(b.head.line).indexOf(a,Math.max(0,b.head.ch-a.length));-1<g&&g<=b.head.ch&&(c.composing.sel=ga(r(b.head.line,g),r(b.head.line,g+a.length)))}});v(a,"compositionupdate",function(a){c.composing.data=a.data});v(a,"compositionend",function(a){var b=c.composing;b&&(a.data==
192
+ b.startData||/\u200b/.test(a.data)||(b.data=a.data),setTimeout(function(){b.handled||c.applyComposition(b);c.composing==b&&(c.composing=null)},50))});v(a,"touchstart",function(){c.forceCompositionEnd()});v(a,"input",function(){c.composing||c.pollContent()||T(c.cm,function(){Q(d)})});v(a,"copy",b);v(a,"cut",b)},prepareSelection:function(){var a=he(this.cm,!1);a.focus=this.cm.state.focused;return a},showSelection:function(a){a&&this.cm.display.view.length&&(a.focus&&this.showPrimarySelection(),this.showMultipleSelections(a))},
193
+ showPrimarySelection:function(){var a=window.getSelection(),b=this.cm.doc.sel.primary(),c=Tb(this.cm,a.anchorNode,a.anchorOffset),d=Tb(this.cm,a.focusNode,a.focusOffset);if(!c||c.bad||!d||d.bad||0!=y(Qb(c,d),b.from())||0!=y(Pb(c,d),b.to()))if(c=Yd(this.cm,b.from()),d=Yd(this.cm,b.to()),c||d){var e=this.cm.display.view,b=a.rangeCount&&a.getRangeAt(0);c?d||(d=e[e.length-1].measure,d=d.maps?d.maps[d.maps.length-1]:d.map,d={node:d[d.length-1],offset:d[d.length-2]-d[d.length-3]}):c={node:e[0].measure.map[2],
194
+ offset:0};try{var f=Ea(c.node,c.offset,d.offset,d.node)}catch(g){}f&&(a.removeAllRanges(),a.addRange(f),b&&null==a.anchorNode?a.addRange(b):wa&&this.startGracePeriod());this.rememberSelection()}},startGracePeriod:function(){var a=this;clearTimeout(this.gracePeriod);this.gracePeriod=setTimeout(function(){a.gracePeriod=!1;a.selectionChanged()&&a.cm.operation(function(){a.cm.curOp.selectionChanged=!0})},20)},showMultipleSelections:function(a){U(this.cm.display.cursorDiv,a.cursors);U(this.cm.display.selectionDiv,
195
+ a.selection)},rememberSelection:function(){var a=window.getSelection();this.lastAnchorNode=a.anchorNode;this.lastAnchorOffset=a.anchorOffset;this.lastFocusNode=a.focusNode;this.lastFocusOffset=a.focusOffset},selectionInEditor:function(){var a=window.getSelection();if(!a.rangeCount)return!1;a=a.getRangeAt(0).commonAncestorContainer;return Wc(this.div,a)},focus:function(){"nocursor"!=this.cm.options.readOnly&&this.div.focus()},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return!0},
196
+ receivedFocus:function(){function a(){b.cm.state.focused&&(b.pollSelection(),b.polling.set(b.cm.options.pollInterval,a))}var b=this;this.selectionInEditor()?this.pollSelection():T(this.cm,function(){b.cm.curOp.selectionChanged=!0});this.polling.set(this.cm.options.pollInterval,a)},selectionChanged:function(){var a=window.getSelection();return a.anchorNode!=this.lastAnchorNode||a.anchorOffset!=this.lastAnchorOffset||a.focusNode!=this.lastFocusNode||a.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&
197
+ !this.gracePeriod&&this.selectionChanged()){var a=window.getSelection(),b=this.cm;this.rememberSelection();var c=Tb(b,a.anchorNode,a.anchorOffset),d=Tb(b,a.focusNode,a.focusOffset);c&&d&&T(b,function(){H(b.doc,ga(c,d),ha);if(c.bad||d.bad)b.curOp.selectionChanged=!0})}},pollContent:function(){var a=this.cm,b=a.display,c=a.doc.sel.primary(),d=c.from(),c=c.to();if(d.line<b.viewFrom||c.line>b.viewTo-1)return!1;var e;d.line==b.viewFrom||0==(e=Ca(a,d.line))?(d=F(b.view[0].line),e=b.view[0].node):(d=F(b.view[e].line),
198
+ e=b.view[e-1].node.nextSibling);var f=Ca(a,c.line);f==b.view.length-1?(c=b.viewTo-1,b=b.view[f].node):(c=F(b.view[f+1].line)-1,b=b.view[f+1].node.previousSibling);b=sa(xf(a,e,b,d,c));for(e=Da(a.doc,r(d,0),r(c,u(a.doc,c).text.length));1<b.length&&1<e.length;)if(A(b)==A(e))b.pop(),e.pop(),c--;else if(b[0]==e[0])b.shift(),e.shift(),d++;else break;for(var g=0,f=0,h=b[0],k=e[0],l=Math.min(h.length,k.length);g<l&&h.charCodeAt(g)==k.charCodeAt(g);)++g;h=A(b);k=A(e);for(l=Math.min(h.length-(1==b.length?g:
199
+ 0),k.length-(1==e.length?g:0));f<l&&h.charCodeAt(h.length-f-1)==k.charCodeAt(k.length-f-1);)++f;b[b.length-1]=h.slice(0,h.length-f);b[0]=b[0].slice(g);d=r(d,g);c=r(c,e.length?A(e).length-f:0);if(1<b.length||b[0]||y(d,c))return wb(a.doc,b,d,c,"+input"),!0},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){this.composing&&!this.composing.handled&&(this.applyComposition(this.composing),this.composing.handled=!0,this.div.blur(),
200
+ this.div.focus())},applyComposition:function(a){a.data&&a.data!=a.startData&&G(this.cm,Sc)(this.cm,a.data,0,a.sel)},setUneditable:function(a){a.setAttribute("contenteditable","false")},onKeyPress:function(a){a.preventDefault();G(this.cm,Sc)(this.cm,String.fromCharCode(null==a.charCode?a.keyCode:a.charCode),0)},onContextMenu:Eb,resetPosition:Eb,needsContentAttribute:!0},Uc.prototype);q.inputStyles={textarea:Tc,contenteditable:Uc};la.prototype={primary:function(){return this.ranges[this.primIndex]},
201
+ equals:function(a){if(a==this)return!0;if(a.primIndex!=this.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b<this.ranges.length;b++){var c=this.ranges[b],d=a.ranges[b];if(0!=y(c.anchor,d.anchor)||0!=y(c.head,d.head))return!1}return!0},deepCopy:function(){for(var a=[],b=0;b<this.ranges.length;b++)a[b]=new z(Rc(this.ranges[b].anchor),Rc(this.ranges[b].head));return new la(a,this.primIndex)},somethingSelected:function(){for(var a=0;a<this.ranges.length;a++)if(!this.ranges[a].empty())return!0;
202
+ return!1},contains:function(a,b){b||(b=a);for(var c=0;c<this.ranges.length;c++){var d=this.ranges[c];if(0<=y(b,d.from())&&0>=y(a,d.to()))return c}return-1}};z.prototype={from:function(){return Qb(this.anchor,this.head)},to:function(){return Pb(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var ad={left:0,right:0,top:0,bottom:0},Fa,Ta=null,Ff=0,fc,ec,se=0,gc=0,R=null;B?R=-.53:wa?R=15:kg?R=-.7:te&&(R=-1/3);var ze=function(a){var b=a.wheelDeltaX,
203
+ c=a.wheelDeltaY;null==b&&a.detail&&a.axis==a.HORIZONTAL_AXIS&&(b=a.detail);null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta);return{x:b,y:c}};q.wheelEventPixels=function(a){a=ze(a);a.x*=R;a.y*=R;return a};var Qf=new bb,md=null,ta=q.changeEnd=function(a){return a.text?r(a.from.line+a.text.length-1,A(a.text).length+(1==a.text.length?a.from.ch:0)):a.to};q.prototype={constructor:q,focus:function(){window.focus();this.display.input.focus()},setOption:function(a,b){var c=this.options,
204
+ d=c[a];if(c[a]!=b||"mode"==a)c[a]=b,Ka.hasOwnProperty(a)&&G(this,Ka[a])(this,b,d)},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?"push":"unshift"](pc(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;c<b.length;++c)if(b[c]==a||b[c].name==a)return b.splice(c,1),!0},addOverlay:M(function(a,b){var c=a.token?a:q.getMode(this.options,a);if(c.startState)throw Error("Overlays may not be stateful.");this.state.overlays.push({mode:c,
205
+ modeSpec:a,opaque:b&&b.opaque});this.state.modeGen++;Q(this)}),removeOverlay:M(function(a){for(var b=this.state.overlays,c=0;c<b.length;++c){var d=b[c].modeSpec;if(d==a||"string"==typeof a&&d.name==a){b.splice(c,1);this.state.modeGen++;Q(this);break}}}),indentLine:M(function(a,b,c){"string"!=typeof b&&"number"!=typeof b&&(b=null==b?this.options.smartIndent?"smart":"prev":b?"add":"subtract");qb(this.doc,a)&&pb(this,a,b,c)}),indentSelection:M(function(a){for(var b=this.doc.sel.ranges,c=-1,d=0;d<b.length;d++){var e=
206
+ b[d];if(e.empty())e.head.line>c&&(pb(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&Pa(this));else{for(var f=e.from(),e=e.to(),g=Math.max(c,f.line),c=Math.min(this.lastLine(),e.line-(e.ch?0:1))+1,e=g;e<c;++e)pb(this,e,a);e=this.doc.sel.ranges;0==f.ch&&b.length==e.length&&0<e[d].from().ch&&Xc(this.doc,d,new z(f,e[d].to()),ha)}}}),getTokenAt:function(a,b){return Ye(this,a,b)},getLineTokens:function(a,b){return Ye(this,r(a),b,!0)},getTokenTypeAt:function(a){a=w(this.doc,a);var b=$e(this,
207
+ u(this.doc,a.line)),c=0,d=(b.length-1)/2;a=a.ch;if(0==a)b=b[2];else for(;;){var e=c+d>>1;if((e?b[2*e-1]:0)>=a)d=e;else if(b[2*e+1]<a)c=e+1;else{b=b[2*e+2];break}}c=b?b.indexOf("cm-overlay "):-1;return 0>c?b:0==c?null:b.slice(0,c-1)},getModeAt:function(a){var b=this.doc.mode;return b.innerMode?q.innerMode(b,this.getTokenAt(a).state).mode:b},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var c=[];if(!$a.hasOwnProperty(b))return c;var d=$a[b],e=this.getModeAt(a);if("string"==
208
+ typeof e[b])d[e[b]]&&c.push(d[e[b]]);else if(e[b])for(var f=0;f<e[b].length;f++){var g=d[e[b][f]];g&&c.push(g)}else e.helperType&&d[e.helperType]?c.push(d[e.helperType]):d[e.name]&&c.push(d[e.name]);for(f=0;f<d._global.length;f++)g=d._global[f],g.pred(e,this)&&-1==D(c,g.val)&&c.push(g.val);return c},getStateAfter:function(a,b){var c=this.doc;a=Math.max(c.first,Math.min(null==a?c.first+c.size-1:a,c.first+c.size-1));return sb(this,a+1,b)},cursorCoords:function(a,b){var c;c=this.doc.sel.primary();c=
209
+ null==a?c.head:"object"==typeof a?w(this.doc,a):a?c.from():c.to();return ma(this,c,b||"page")},charCoords:function(a,b){return Yb(this,w(this.doc,a),b||"page")},coordsChar:function(a,b){a=ne(this,a,b||"page");return fd(this,a.left,a.top)},lineAtHeight:function(a,b){a=ne(this,{top:a,left:0},b||"page").top;return Ba(this.doc,a+this.display.viewOffset)},heightAtLine:function(a,b){var c=!1,d;"number"==typeof a?(d=this.doc.first+this.doc.size-1,a<this.doc.first?a=this.doc.first:a>d&&(a=d,c=!0),d=u(this.doc,
210
+ a)):d=a;return cd(this,d,{top:0,left:0},b||"page").top+(c?this.doc.height-ea(d):0)},defaultTextHeight:function(){return xa(this.display)},defaultCharWidth:function(){return gb(this.display)},setGutterMarker:M(function(a,b,c){return nc(this.doc,a,"gutter",function(a){var e=a.gutterMarkers||(a.gutterMarkers={});e[b]=c;!c&&hf(e)&&(a.gutterMarkers=null);return!0})}),clearGutter:M(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,
211
+ na(b,d,"gutter"),hf(c.gutterMarkers)&&(c.gutterMarkers=null));++d})}),lineInfo:function(a){if("number"==typeof a){if(!qb(this.doc,a))return null;var b=a;a=u(this.doc,a);if(!a)return null}else if(b=F(a),null==b)return null;return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=
212
+ ma(this,w(this.doc,a));var g=a.bottom,h=a.left;b.style.position="absolute";b.setAttribute("cm-ignore-events","true");this.display.input.setUneditable(b);f.sizer.appendChild(b);if("over"==d)g=a.top;else if("above"==d||"near"==d){var k=Math.max(f.wrapper.clientHeight,this.doc.height),l=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);("above"==d||a.bottom+b.offsetHeight>k)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=k&&(g=a.bottom);h+b.offsetWidth>l&&(h=l-b.offsetWidth)}b.style.top=
213
+ g+"px";b.style.left=b.style.right="";"right"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right="0px"):("left"==e?h=0:"middle"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+"px");c&&(a=cc(this,h,g,h+b.offsetWidth,g+b.offsetHeight),null!=a.scrollTop&&lb(this,a.scrollTop),null!=a.scrollLeft&&Ma(this,a.scrollLeft))},triggerOnKeyDown:M(ve),triggerOnKeyPress:M(we),triggerOnKeyUp:ue,execCommand:function(a){if(ic.hasOwnProperty(a))return ic[a](this)},findPosH:function(a,b,c,d){var e=1;
214
+ 0>b&&(e=-1,b=-b);var f=0;for(a=w(this.doc,a);f<b&&(a=rd(this.doc,a,e,c,d),!a.hitSide);++f);return a},moveH:M(function(a,b){var c=this;c.extendSelectionsBy(function(d){return c.display.shift||c.doc.extend||d.empty()?rd(c.doc,d.head,a,b,c.options.rtlMoveVisually):0>a?d.from():d.to()},Gb)}),deleteH:M(function(a,b){var c=this.doc;this.doc.sel.somethingSelected()?c.replaceSelection("",null,"+delete"):Va(this,function(d){var e=rd(c,d.head,a,b,!1);return 0>a?{from:e,to:d.head}:{from:d.head,to:e}})}),findPosV:function(a,
215
+ b,c,d){var e=1;0>b&&(e=-1,b=-b);var f=0;for(a=w(this.doc,a);f<b&&(a=ma(this,a,"div"),null==d?d=a.left:a.left=d,a=Pe(this,a,e,c),!a.hitSide);++f);return a},moveV:M(function(a,b){var c=this,d=this.doc,e=[],f=!c.display.shift&&!d.extend&&d.sel.somethingSelected();d.extendSelectionsBy(function(g){if(f)return 0>a?g.from():g.to();var k=ma(c,g.head,"div");null!=g.goalColumn&&(k.left=g.goalColumn);e.push(k.left);var l=Pe(c,k,a,b);"page"==b&&g==d.sel.primary()&&lc(c,null,Yb(c,l,"div").top-k.top);return l},
216
+ Gb);if(e.length)for(var g=0;g<d.sel.ranges.length;g++)d.sel.ranges[g].goalColumn=e[g]}),findWordAt:function(a){var b=u(this.doc,a.line).text,c=a.ch,d=a.ch;if(b){var e=this.getHelper(a,"wordChars");(0>a.xRel||d==b.length)&&c?--c:++d;for(var f=b.charAt(c),f=oc(f,e)?function(a){return oc(a,e)}:/\s/.test(f)?function(a){return/\s/.test(a)}:function(a){return!/\s/.test(a)&&!oc(a)};0<c&&f(b.charAt(c-1));)--c;for(;d<b.length&&f(b.charAt(d));)++d}return new z(r(a.line,c),r(a.line,d))},toggleOverwrite:function(a){if(null==
217
+ a||a!=this.state.overwrite)(this.state.overwrite=!this.state.overwrite)?mb(this.display.cursorDiv,"CodeMirror-overwrite"):kb(this.display.cursorDiv,"CodeMirror-overwrite"),K(this,"overwriteToggle",this,this.state.overwrite)},hasFocus:function(){return this.display.input.getField()==fa()},scrollTo:M(function(a,b){null==a&&null==b||mc(this);null!=a&&(this.curOp.scrollLeft=a);null!=b&&(this.curOp.scrollTop=b)}),getScrollInfo:function(){var a=this.display.scroller;return{left:a.scrollLeft,top:a.scrollTop,
218
+ height:a.scrollHeight-da(this)-this.display.barHeight,width:a.scrollWidth-da(this)-this.display.barWidth,clientHeight:Nc(this),clientWidth:pa(this)}},scrollIntoView:M(function(a,b){null==a?(a={from:this.doc.sel.primary().head,to:null},null==b&&(b=this.options.cursorScrollMargin)):"number"==typeof a?a={from:r(a,0),to:null}:null==a.from&&(a={from:a,to:null});a.to||(a.to=a.from);a.margin=b||0;if(null!=a.from.line)mc(this),this.curOp.scrollToPos=a;else{var c=cc(this,Math.min(a.from.left,a.to.left),Math.min(a.from.top,
219
+ a.to.top)-a.margin,Math.max(a.from.right,a.to.right),Math.max(a.from.bottom,a.to.bottom)+a.margin);this.scrollTo(c.scrollLeft,c.scrollTop)}}),setSize:M(function(a,b){function c(a){return"number"==typeof a||/^\d+$/.test(String(a))?a+"px":a}var d=this;null!=a&&(d.display.wrapper.style.width=c(a));null!=b&&(d.display.wrapper.style.height=c(b));d.options.lineWrapping&&me(this);var e=d.display.viewFrom;d.doc.iter(e,d.display.viewTo,function(a){if(a.widgets)for(var b=0;b<a.widgets.length;b++)if(a.widgets[b].noHScroll){na(d,
220
+ e,"widget");break}++e});d.curOp.forceUpdate=!0;K(d,"refresh",this)}),operation:function(a){return T(this,a)},refresh:M(function(){var a=this.display.cachedTextHeight;Q(this);this.curOp.forceUpdate=!0;hb(this);this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop);Cc(this);(null==a||.5<Math.abs(a-xa(this.display)))&&Ac(this);K(this,"refresh",this)}),swapDoc:M(function(a){var b=this.doc;b.cm=null;Ed(this,a);hb(this);this.display.input.reset();this.scrollTo(a.scrollLeft,a.scrollTop);this.curOp.forceScroll=
221
+ !0;L(this,"swapDoc",this,b);return b}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}};Ya(q);var qf=q.defaults={},Ka=q.optionHandlers={},Fd=q.Init={toString:function(){return"CodeMirror.Init"}};x("value","",function(a,b){a.setValue(b)},!0);x("mode",null,function(a,b){a.doc.modeOption=b;zc(a)},!0);x("indentUnit",
222
+ 2,zc,!0);x("indentWithTabs",!1);x("smartIndent",!0);x("tabSize",4,function(a){eb(a);hb(a);Q(a)},!0);x("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(a,b,c){a.state.specialChars=new RegExp(b.source+(b.test("\t")?"":"|\t"),"g");c!=q.Init&&a.refresh()});x("specialCharPlaceholder",function(a){var b=t("span","\u2022","cm-invalidchar");b.title="\\u"+a.charCodeAt(0).toString(16);b.setAttribute("aria-label",b.title);return b},function(a){a.refresh()},!0);x("electricChars",
223
+ !0);x("inputStyle",ab?"contenteditable":"textarea",function(){throw Error("inputStyle can not (yet) be changed in a running editor");},!0);x("rtlMoveVisually",!mg);x("wholeLineUpdateBefore",!0);x("theme","default",function(a){Bd(a);ib(a)},!0);x("keyMap","default",function(a,b,c){b=pc(b);(c=c!=q.Init&&pc(c))&&c.detach&&c.detach(a,b);b.attach&&b.attach(a,c||null)});x("extraKeys",null);x("lineWrapping",!1,function(a){a.options.lineWrapping?(mb(a.display.wrapper,"CodeMirror-wrap"),a.display.sizer.style.minWidth=
224
+ "",a.display.sizerWidth=null):(kb(a.display.wrapper,"CodeMirror-wrap"),Dc(a));Ac(a);Q(a);hb(a);setTimeout(function(){Na(a)},100)},!0);x("gutters",[],function(a){wc(a.options);ib(a)},!0);x("fixedGutter",!0,function(a,b){a.display.gutters.style.left=b?Ic(a.display)+"px":"0";a.refresh()},!0);x("coverGutterNextToScrollbar",!1,function(a){Na(a)},!0);x("scrollbarStyle","native",function(a){Cd(a);Na(a);a.display.scrollbars.setScrollTop(a.doc.scrollTop);a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},
225
+ !0);x("lineNumbers",!1,function(a){wc(a.options);ib(a)},!0);x("firstLineNumber",1,ib,!0);x("lineNumberFormatter",function(a){return a},ib,!0);x("showCursorWhenSelecting",!1,nb,!0);x("resetSelectionOnContextMenu",!0);x("lineWiseCopyCut",!0);x("readOnly",!1,function(a,b){"nocursor"==b?(db(a),a.display.input.blur(),a.display.disabled=!0):(a.display.disabled=!1,b||a.display.input.reset())});x("disableInput",!1,function(a,b){b||a.display.input.reset()},!0);x("dragDrop",!0,function(a,b,c){!b!=!(c&&c!=q.Init)&&
226
+ (c=a.display.dragFunctions,b=b?v:ka,b(a.display.scroller,"dragstart",c.start),b(a.display.scroller,"dragenter",c.simple),b(a.display.scroller,"dragover",c.simple),b(a.display.scroller,"drop",c.drop))});x("cursorBlinkRate",530);x("cursorScrollMargin",0);x("cursorHeight",1,nb,!0);x("singleCursorHeightPerLine",!0,nb,!0);x("workTime",100);x("workDelay",100);x("flattenSpans",!0,eb,!0);x("addModeClass",!1,eb,!0);x("pollInterval",100);x("undoDepth",200,function(a,b){a.doc.history.undoDepth=b});x("historyEventDelay",
227
+ 1250);x("viewportMargin",10,function(a){a.refresh()},!0);x("maxHighlightLength",1E4,eb,!0);x("moveInputWithCursor",!0,function(a,b){b||a.display.input.resetPosition()});x("tabindex",null,function(a,b){a.display.input.getField().tabIndex=b||""});x("autofocus",null);var pf=q.modes={},Hb=q.mimeModes={};q.defineMode=function(a,b){q.defaults.mode||"null"==a||(q.defaults.mode=a);2<arguments.length&&(b.dependencies=Array.prototype.slice.call(arguments,2));pf[a]=b};q.defineMIME=function(a,b){Hb[a]=b};q.resolveMode=
228
+ function(a){if("string"==typeof a&&Hb.hasOwnProperty(a))a=Hb[a];else if(a&&"string"==typeof a.name&&Hb.hasOwnProperty(a.name)){var b=Hb[a.name];"string"==typeof b&&(b={name:b});a=ff(b,a);a.name=b.name}else if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return q.resolveMode("application/xml");return"string"==typeof a?{name:a}:a||{name:"null"}};q.getMode=function(a,b){b=q.resolveMode(b);var c=pf[b.name];if(!c)return q.getMode(a,"text/plain");c=c(a,b);if(Ib.hasOwnProperty(b.name)){var d=Ib[b.name],
229
+ e;for(e in d)d.hasOwnProperty(e)&&(c.hasOwnProperty(e)&&(c["_"+e]=c[e]),c[e]=d[e])}c.name=b.name;b.helperType&&(c.helperType=b.helperType);if(b.modeProps)for(e in b.modeProps)c[e]=b.modeProps[e];return c};q.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}});q.defineMIME("text/plain","null");var Ib=q.modeExtensions={};q.extendMode=function(a,b){var c=Ib.hasOwnProperty(a)?Ib[a]:Ib[a]={};V(b,c)};q.defineExtension=function(a,b){q.prototype[a]=b};q.defineDocExtension=function(a,b){P.prototype[a]=
230
+ b};q.defineOption=x;var yc=[];q.defineInitHook=function(a){yc.push(a)};var $a=q.helpers={};q.registerHelper=function(a,b,c){$a.hasOwnProperty(a)||($a[a]=q[a]={_global:[]});$a[a][b]=c};q.registerGlobalHelper=function(a,b,c,d){q.registerHelper(a,b,d);$a[a]._global.push({pred:c,val:d})};var Sa=q.copyState=function(a,b){if(!0===b)return b;if(a.copyState)return a.copyState(b);var c={},d;for(d in b){var e=b[d];e instanceof Array&&(e=e.concat([]));c[d]=e}return c},Df=q.startState=function(a,b,c){return a.startState?
231
+ a.startState(b,c):!0};q.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);if(!c||c.mode==a)break;b=c.state;a=c.mode}return c||{mode:a,state:b}};var ic=q.commands={selectAll:function(a){a.setSelection(r(a.firstLine(),0),r(a.lastLine()),ha)},singleSelection:function(a){a.setSelection(a.getCursor("anchor"),a.getCursor("head"),ha)},killLine:function(a){Va(a,function(b){if(b.empty()){var c=u(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line<a.lastLine()?{from:b.head,to:r(b.head.line+
232
+ 1,0)}:{from:b.head,to:r(b.head.line,c)}}return{from:b.from(),to:b.to()}})},deleteLine:function(a){Va(a,function(b){return{from:r(b.from().line,0),to:w(a.doc,r(b.to().line+1,0))}})},delLineLeft:function(a){Va(a,function(a){return{from:r(a.from().line,0),to:a.from()}})},delWrappedLineLeft:function(a){Va(a,function(b){var c=a.charCoords(b.head,"div").top+5;return{from:a.coordsChar({left:0,top:c},"div"),to:b.from()}})},delWrappedLineRight:function(a){Va(a,function(b){var c=a.charCoords(b.head,"div").top+
233
+ 5,c=a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div");return{from:b.from(),to:c}})},undo:function(a){a.undo()},redo:function(a){a.redo()},undoSelection:function(a){a.undoSelection()},redoSelection:function(a){a.redoSelection()},goDocStart:function(a){a.extendSelection(r(a.firstLine(),0))},goDocEnd:function(a){a.extendSelection(r(a.lastLine()))},goLineStart:function(a){a.extendSelectionsBy(function(b){return kf(a,b.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(a){a.extendSelectionsBy(function(b){return lf(a,
234
+ b.head)},{origin:"+move",bias:1})},goLineEnd:function(a){a.extendSelectionsBy(function(b){b=b.head.line;for(var c,d=u(a.doc,b);c=Aa(d,!1);)d=c.find(1,!0).line,b=null;c=(c=Y(d))?c[0].level%2?ac(d):bc(d):d.text.length;return r(null==b?F(d):b,c)},{origin:"+move",bias:-1})},goLineRight:function(a){a.extendSelectionsBy(function(b){b=a.charCoords(b.head,"div").top+5;return a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:b},"div")},Gb)},goLineLeft:function(a){a.extendSelectionsBy(function(b){b=
235
+ a.charCoords(b.head,"div").top+5;return a.coordsChar({left:0,top:b},"div")},Gb)},goLineLeftSmart:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5,c=a.coordsChar({left:0,top:c},"div");return c.ch<a.getLine(c.line).search(/\S/)?lf(a,b.head):c},Gb)},goLineUp:function(a){a.moveV(-1,"line")},goLineDown:function(a){a.moveV(1,"line")},goPageUp:function(a){a.moveV(-1,"page")},goPageDown:function(a){a.moveV(1,"page")},goCharLeft:function(a){a.moveH(-1,"char")},goCharRight:function(a){a.moveH(1,
236
+ "char")},goColumnLeft:function(a){a.moveH(-1,"column")},goColumnRight:function(a){a.moveH(1,"column")},goWordLeft:function(a){a.moveH(-1,"word")},goGroupRight:function(a){a.moveH(1,"group")},goGroupLeft:function(a){a.moveH(-1,"group")},goWordRight:function(a){a.moveH(1,"word")},delCharBefore:function(a){a.deleteH(-1,"char")},delCharAfter:function(a){a.deleteH(1,"char")},delWordBefore:function(a){a.deleteH(-1,"word")},delWordAfter:function(a){a.deleteH(1,"word")},delGroupBefore:function(a){a.deleteH(-1,
237
+ "group")},delGroupAfter:function(a){a.deleteH(1,"group")},indentAuto:function(a){a.indentSelection("smart")},indentMore:function(a){a.indentSelection("add")},indentLess:function(a){a.indentSelection("subtract")},insertTab:function(a){a.replaceSelection("\t")},insertSoftTab:function(a){for(var b=[],c=a.listSelections(),d=a.options.tabSize,e=0;e<c.length;e++){var f=c[e].from(),f=aa(a.getLine(f.line),f.ch,d);b.push(Array(d-f%d+1).join(" "))}a.replaceSelections(b)},defaultTab:function(a){a.somethingSelected()?
238
+ a.indentSelection("add"):a.execCommand("insertTab")},transposeChars:function(a){T(a,function(){for(var b=a.listSelections(),c=[],d=0;d<b.length;d++){var e=b[d].head,f=u(a.doc,e.line).text;if(f)if(e.ch==f.length&&(e=new r(e.line,e.ch-1)),0<e.ch)e=new r(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),r(e.line,e.ch-2),e,"+transpose");else if(e.line>a.doc.first){var g=u(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+"\n"+g.charAt(g.length-1),r(e.line-1,g.length-1),r(e.line,1),"+transpose")}c.push(new z(e,
239
+ e))}a.setSelections(c)})},newlineAndIndent:function(a){T(a,function(){for(var b=a.listSelections().length,c=0;c<b;c++){var d=a.listSelections()[c];a.replaceRange("\n",d.anchor,d.head,"+input");a.indentLine(d.from().line+1,null,!0);Pa(a)}})},toggleOverwrite:function(a){a.toggleOverwrite()}},ua=q.keyMap={};ua.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore",
240
+ "Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"};ua.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter",
241
+ "Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"};ua.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp",
242
+ "Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"};ua.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter",
243
+ "Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]};ua["default"]=W?ua.macDefault:ua.pcDefault;q.normalizeKeyMap=function(a){var b={},c;for(c in a)if(a.hasOwnProperty(c)){var d=
244
+ a[c];if(!/^(name|fallthrough|(de|at)tach)$/.test(c)){if("..."!=d)for(var e=ob(c.split(" "),Wf),f=0;f<e.length;f++){var g,h;f==e.length-1?(h=c,g=d):(h=e.slice(0,f+1).join(" "),g="...");var k=b[h];if(!k)b[h]=g;else if(k!=g)throw Error("Inconsistent bindings for "+h);}delete a[c]}}for(var l in b)a[l]=b[l];return a};var xb=q.lookupKey=function(a,b,c,d){b=pc(b);var e=b.call?b.call(a,d):b[a];if(!1===e)return"nothing";if("..."===e)return"multi";if(null!=e&&c(e))return"handled";if(b.fallthrough){if("[object Array]"!=
245
+ Object.prototype.toString.call(b.fallthrough))return xb(a,b.fallthrough,c,d);for(e=0;e<b.fallthrough.length;e++){var f=xb(a,b.fallthrough[e],c,d);if(f)return f}}},Pf=q.isModifierKey=function(a){a="string"==typeof a?a:va[a.keyCode];return"Ctrl"==a||"Alt"==a||"Shift"==a||"Mod"==a},Rf=q.keyName=function(a,b){if(ba&&34==a.keyCode&&a["char"])return!1;var c=va[a.keyCode],d=c;if(null==d||a.altGraphKey)return!1;a.altKey&&"Alt"!=c&&(d="Alt-"+d);(of?a.metaKey:a.ctrlKey)&&"Ctrl"!=c&&(d="Ctrl-"+d);(of?a.ctrlKey:
246
+ a.metaKey)&&"Cmd"!=c&&(d="Cmd-"+d);!b&&a.shiftKey&&"Shift"!=c&&(d="Shift-"+d);return d};q.fromTextArea=function(a,b){function c(){a.value=k.getValue()}b=b?V(b):{};b.value=a.value;!b.tabindex&&a.tabIndex&&(b.tabindex=a.tabIndex);!b.placeholder&&a.placeholder&&(b.placeholder=a.placeholder);if(null==b.autofocus){var d=fa();b.autofocus=d==a||null!=a.getAttribute("autofocus")&&d==document.body}if(a.form&&(v(a.form,"submit",c),!b.leaveSubmitMethodAlone)){var e=a.form,f=e.submit;try{var g=e.submit=function(){c();
247
+ e.submit=f;e.submit();e.submit=g}}catch(h){}}b.finishInit=function(b){b.save=c;b.getTextArea=function(){return a};b.toTextArea=function(){b.toTextArea=isNaN;c();a.parentNode.removeChild(b.getWrapperElement());a.style.display="";a.form&&(ka(a.form,"submit",c),"function"==typeof a.form.submit&&(a.form.submit=f))}};a.style.display="none";var k=q(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);return k};var tc=q.StringStream=function(a,b){this.pos=this.start=0;this.string=a;this.tabSize=b||
248
+ 8;this.lineStart=this.lastColumnPos=this.lastColumnValue=0};tc.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(a){var b=this.string.charAt(this.pos);if("string"==typeof a?b==a:b&&(a.test?a.test(b):a(b)))return++this.pos,b},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>
249
+ b},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){a=this.string.indexOf(a,this.pos);if(-1<a)return this.pos=a,!0},backUp:function(a){this.pos-=a},column:function(){this.lastColumnPos<this.start&&(this.lastColumnValue=aa(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start);return this.lastColumnValue-(this.lineStart?
250
+ aa(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return aa(this.string,null,this.tabSize)-(this.lineStart?aa(this.string,this.lineStart,this.tabSize):0)},match:function(a,b,c){if("string"==typeof a){var d=function(a){return c?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);if(d(e)==d(a))return!1!==b&&(this.pos+=a.length),!0}else{if((a=this.string.slice(this.pos).match(a))&&0<a.index)return null;a&&!1!==b&&(this.pos+=a[0].length);return a}},current:function(){return this.string.slice(this.start,
251
+ this.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};var sd=0,Ha=q.TextMarker=function(a,b){this.lines=[];this.type=b;this.doc=a;this.id=++sd};Ya(Ha);Ha.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;b&&Ja(a);if(S(this,"clear")){var c=this.find();c&&L(this,"clear",c.from,c.to)}for(var d=c=null,e=0;e<this.lines.length;++e){var f=this.lines[e],g=zb(f.markedSpans,this);a&&!this.collapsed?na(a,F(f),"text"):a&&(null!=
252
+ g.to&&(d=F(f)),null!=g.from&&(c=F(f)));for(var h=f,k=f.markedSpans,l=g,m=void 0,p=0;p<k.length;++p)k[p]!=l&&(m||(m=[])).push(k[p]);h.markedSpans=m;null==g.from&&this.collapsed&&!ya(this.doc,f)&&a&&ca(f,xa(a.display))}if(a&&this.collapsed&&!a.options.lineWrapping)for(e=0;e<this.lines.length;++e)f=ia(this.lines[e]),g=Kb(f),g>a.display.maxLineLength&&(a.display.maxLine=f,a.display.maxLineLength=g,a.display.maxLineChanged=!0);null!=c&&a&&this.collapsed&&Q(a,c,d+1);this.lines.length=0;this.explicitlyCleared=
253
+ !0;this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&ge(a.doc));a&&L(a,"markerCleared",a,this);b&&La(a);this.parent&&this.parent.clear()}};Ha.prototype.find=function(a,b){null==a&&"bookmark"==this.type&&(a=1);for(var c,d,e=0;e<this.lines.length;++e){var f=this.lines[e],g=zb(f.markedSpans,this);if(null!=g.from&&(c=r(b?f:F(f),g.from),-1==a))return c;if(null!=g.to&&(d=r(b?f:F(f),g.to),1==a))return d}return c&&{from:c,to:d}};Ha.prototype.changed=function(){var a=this.find(-1,!0),b=this,c=this.doc.cm;
254
+ a&&c&&T(c,function(){var d=a.line,e=F(a.line);if(e=Vc(c,e))le(e),c.curOp.selectionChanged=c.curOp.forceUpdate=!0;c.curOp.updateMaxLine=!0;ya(b.doc,d)||null==b.height||(e=b.height,b.height=null,(e=ub(b)-e)&&ca(d,d.height+e))})};Ha.prototype.attachLine=function(a){if(!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;b.maybeHiddenMarkers&&-1!=D(b.maybeHiddenMarkers,this)||(b.maybeUnhiddenMarkers||(b.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(a)};Ha.prototype.detachLine=function(a){this.lines.splice(D(this.lines,
255
+ a),1);!this.lines.length&&this.doc.cm&&(a=this.doc.cm.curOp,(a.maybeHiddenMarkers||(a.maybeHiddenMarkers=[])).push(this))};var sd=0,rc=q.SharedTextMarker=function(a,b){this.markers=a;this.primary=b;for(var c=0;c<a.length;++c)a[c].parent=this};Ya(rc);rc.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var a=0;a<this.markers.length;++a)this.markers[a].clear();L(this,"clear")}};rc.prototype.find=function(a,b){return this.primary.find(a,b)};var sc=q.LineWidget=function(a,
256
+ b,c){if(c)for(var d in c)c.hasOwnProperty(d)&&(this[d]=c[d]);this.doc=a;this.node=b};Ya(sc);sc.prototype.clear=function(){var a=this.doc.cm,b=this.line.widgets,c=this.line,d=F(c);if(null!=d&&b){for(var e=0;e<b.length;++e)b[e]==this&&b.splice(e--,1);b.length||(c.widgets=null);var f=ub(this);ca(c,Math.max(0,c.height-f));a&&T(a,function(){var b=-f;ea(c)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&lc(a,null,b);na(a,d,"widget")})}};sc.prototype.changed=function(){var a=this.height,b=this.doc.cm,c=this.line;
257
+ this.height=null;var d=ub(this)-a;d&&(ca(c,c.height+d),b&&T(b,function(){b.curOp.forceUpdate=!0;ea(c)<(b.curOp&&b.curOp.scrollTop||b.doc.scrollTop)&&lc(b,null,d)}))};var Ab=q.Line=function(a,b,c){this.text=a;Ue(this,b);this.height=c?c(this):1};Ya(Ab);Ab.prototype.lineNo=function(){return F(this)};var bg={},ag={};Bb.prototype={chunkSize:function(){return this.lines.length},removeInner:function(a,b){for(var c=a,d=a+b;c<d;++c){var e=this.lines[c];this.height-=e.height;var f=e;f.parent=null;Te(f);L(e,
258
+ "delete")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c;this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(a=0;a<b.length;++a)b[a].parent=this},iterN:function(a,b,c){for(b=a+b;a<b;++a)if(c(this.lines[a]))return!0}};Cb.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;c<this.children.length;++c){var d=this.children[c],e=d.chunkSize();if(a<e){var f=Math.min(b,
259
+ e-a),g=d.height;d.removeInner(a,f);this.height-=g-d.height;e==f&&(this.children.splice(c--,1),d.parent=null);if(0==(b-=f))break;a=0}else a-=e}25>this.size-b&&(1<this.children.length||!(this.children[0]instanceof Bb))&&(c=[],this.collapse(c),this.children=[new Bb(c)],this.children[0].parent=this)},collapse:function(a){for(var b=0;b<this.children.length;++b)this.children[b].collapse(a)},insertInner:function(a,b,c){this.size+=b.length;this.height+=c;for(var d=0;d<this.children.length;++d){var e=this.children[d],
260
+ f=e.chunkSize();if(a<=f){e.insertInner(a,b,c);if(e.lines&&50<e.lines.length){for(;50<e.lines.length;)a=e.lines.splice(e.lines.length-25,25),a=new Bb(a),e.height-=a.height,this.children.splice(d+1,0,a),a.parent=this;this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(10>=this.children.length)){var a=this;do{var b=a.children.splice(a.children.length-5,5),b=new Cb(b);if(a.parent){a.size-=b.size;a.height-=b.height;var c=D(a.parent.children,a);a.parent.children.splice(c+1,0,b)}else c=new Cb(a.children),
261
+ c.parent=a,a.children=[c,b],a=c;b.parent=a.parent}while(10<a.children.length);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(a<f){f=Math.min(b,f-a);if(e.iterN(a,f,c))return!0;if(0==(b-=f))break;a=0}else a-=f}}};var og=0,P=q.Doc=function(a,b,c){if(!(this instanceof P))return new P(a,b,c);null==c&&(c=0);Cb.call(this,[new Bb([new Ab("",null)])]);this.first=c;this.scrollTop=this.scrollLeft=0;this.cantEdit=!1;this.cleanGeneration=
262
+ 1;this.frontier=c;c=r(c,0);this.sel=ga(c);this.history=new uc(null);this.id=++og;this.modeOption=b;"string"==typeof a&&(a=sa(a));qd(this,{from:c,to:c,text:a});H(this,ga(c),ha)};P.prototype=ff(Cb.prototype,{constructor:P,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,a)},insert:function(a,b){for(var c=0,d=0;d<b.length;++d)c+=b[d].height;this.insertInner(a-this.first,b,c)},remove:function(a,b){this.removeInner(a-this.first,b)},getValue:function(a){var b=
263
+ xd(this,this.first,this.first+this.size);return!1===a?b:b.join(a||"\n")},setValue:N(function(a){var b=r(this.first,0),c=this.first+this.size-1;Oa(this,{from:b,to:r(c,u(this,c).text.length),text:sa(a),origin:"setValue",full:!0},!0);H(this,ga(b))}),replaceRange:function(a,b,c,d){b=w(this,b);c=c?w(this,c):b;wb(this,a,b,c,d)},getRange:function(a,b,c){a=Da(this,w(this,a),w(this,b));return!1===c?a:a.join(c||"\n")},getLine:function(a){return(a=this.getLineHandle(a))&&a.text},getLineHandle:function(a){if(qb(this,
264
+ a))return u(this,a)},getLineNumber:function(a){return F(a)},getLineHandleVisualStart:function(a){"number"==typeof a&&(a=u(this,a));return ia(a)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(a){return w(this,a)},getCursor:function(a){var b=this.sel.primary();return null==a||"head"==a?b.head:"anchor"==a?b.anchor:"end"==a||"to"==a||!1===a?b.to():b.from()},listSelections:function(){return this.sel.ranges},
265
+ somethingSelected:function(){return this.sel.somethingSelected()},setCursor:N(function(a,b,c){a=w(this,"number"==typeof a?r(a,b||0):a);H(this,ga(a,null),c)}),setSelection:N(function(a,b,c){var d=w(this,a);a=w(this,b||a);H(this,ga(d,a),c)}),extendSelection:N(function(a,b,c){Ub(this,w(this,a),b&&w(this,b),c)}),extendSelections:N(function(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=w(this,a[d]);ae(this,c)}),extendSelectionsBy:N(function(a,b){ae(this,ob(this.sel.ranges,a),b)}),setSelections:N(function(a,
266
+ b,c){if(a.length){for(var d=0,e=[];d<a.length;d++)e[d]=new z(w(this,a[d].anchor),w(this,a[d].head));null==b&&(b=Math.min(a.length-1,this.sel.primIndex));H(this,Z(e,b),c)}}),addSelection:N(function(a,b,c){var d=this.sel.ranges.slice(0);d.push(new z(w(this,a),w(this,b||a)));H(this,Z(d,d.length-1),c)}),getSelection:function(a){for(var b=this.sel.ranges,c,d=0;d<b.length;d++){var e=Da(this,b[d].from(),b[d].to());c=c?c.concat(e):e}return!1===a?c:c.join(a||"\n")},getSelections:function(a){for(var b=[],c=
267
+ this.sel.ranges,d=0;d<c.length;d++){var e=Da(this,c[d].from(),c[d].to());!1!==a&&(e=e.join(a||"\n"));b[d]=e}return b},replaceSelection:function(a,b,c){for(var d=[],e=0;e<this.sel.ranges.length;e++)d[e]=a;this.replaceSelections(d,b,c||"+input")},replaceSelections:N(function(a,b,c){for(var d=[],e=this.sel,f=0;f<e.ranges.length;f++){var g=e.ranges[f];d[f]={from:g.from(),to:g.to(),text:sa(a[f]),origin:c}}if(f=b&&"end"!=b){f=[];c=a=r(this.first,0);for(e=0;e<d.length;e++){var h=d[e],g=Ee(h.from,a,c),k=
268
+ Ee(ta(h),a,c);a=h.to;c=k;"around"==b?(h=this.sel.ranges[e],h=0>y(h.head,h.anchor),f[e]=new z(h?k:g,h?g:k)):f[e]=new z(g,g)}f=new la(f,this.sel.primIndex)}b=f;for(f=d.length-1;0<=f;f--)Oa(this,d[f]);b?be(this,b):this.cm&&Pa(this.cm)}),undo:N(function(){kc(this,"undo")}),redo:N(function(){kc(this,"redo")}),undoSelection:N(function(){kc(this,"undo",!0)}),redoSelection:N(function(){kc(this,"redo",!0)}),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=
269
+ this.history,b=0,c=0,d=0;d<a.done.length;d++)a.done[d].ranges||++b;for(d=0;d<a.undone.length;d++)a.undone[d].ranges||++c;return{undo:b,redo:c}},clearHistory:function(){this.history=new uc(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(a){a&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null);return this.history.generation},isClean:function(a){return this.history.generation==(a||this.cleanGeneration)},
270
+ getHistory:function(){return{done:Xa(this.history.done),undone:Xa(this.history.undone)}},setHistory:function(a){var b=this.history=new uc(this.history.maxGeneration);b.done=Xa(a.done.slice(0),null,!0);b.undone=Xa(a.undone.slice(0),null,!0)},addLineClass:N(function(a,b,c){return nc(this,a,"gutter"==b?"gutter":"class",function(a){var e="text"==b?"textClass":"background"==b?"bgClass":"gutter"==b?"gutterClass":"wrapClass";if(a[e]){if(Fb(c).test(a[e]))return!1;a[e]+=" "+c}else a[e]=c;return!0})}),removeLineClass:N(function(a,
271
+ b,c){return nc(this,a,"gutter"==b?"gutter":"class",function(a){var e="text"==b?"textClass":"background"==b?"bgClass":"gutter"==b?"gutterClass":"wrapClass",f=a[e];if(f)if(null==c)a[e]=null;else{var g=f.match(Fb(c));if(!g)return!1;var h=g.index+g[0].length;a[e]=f.slice(0,g.index)+(g.index&&h!=f.length?" ":"")+f.slice(h)||null}else return!1;return!0})}),addLineWidget:N(function(a,b,c){return $f(this,a,b,c)}),removeLineWidget:function(a){a.clear()},markText:function(a,b,c){return Wa(this,w(this,a),w(this,
272
+ b),c,"range")},setBookmark:function(a,b){var c={replacedWith:b&&(null==b.nodeType?b.widget:b),insertLeft:b&&b.insertLeft,clearWhenEmpty:!1,shared:b&&b.shared,handleMouseEvents:b&&b.handleMouseEvents};a=w(this,a);return Wa(this,a,a,c,"bookmark")},findMarksAt:function(a){a=w(this,a);var b=[],c=u(this,a.line).markedSpans;if(c)for(var d=0;d<c.length;++d){var e=c[d];(null==e.from||e.from<=a.ch)&&(null==e.to||e.to>=a.ch)&&b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){a=w(this,a);
273
+ b=w(this,b);var d=[],e=a.line;this.iter(a.line,b.line+1,function(f){if(f=f.markedSpans)for(var g=0;g<f.length;g++){var h=f[g];e==a.line&&a.ch>h.to||null==h.from&&e!=a.line||e==b.line&&h.from>b.ch||c&&!c(h.marker)||d.push(h.marker.parent||h.marker)}++e});return d},getAllMarks:function(){var a=[];this.iter(function(b){if(b=b.markedSpans)for(var c=0;c<b.length;++c)null!=b[c].from&&a.push(b[c].marker)});return a},posFromIndex:function(a){var b,c=this.first;this.iter(function(d){d=d.text.length+1;if(d>
274
+ a)return b=a,!0;a-=d;++c});return w(this,r(c,b))},indexFromPos:function(a){a=w(this,a);var b=a.ch;if(a.line<this.first||0>a.ch)return 0;this.iter(this.first,a.line,function(a){b+=a.text.length+1});return b},copy:function(a){var b=new P(xd(this,this.first,this.first+this.size),this.modeOption,this.first);b.scrollTop=this.scrollTop;b.scrollLeft=this.scrollLeft;b.sel=this.sel;b.extend=!1;a&&(b.history.undoDepth=this.history.undoDepth,b.setHistory(this.getHistory()));return b},linkedDoc:function(a){a||
275
+ (a={});var b=this.first,c=this.first+this.size;null!=a.from&&a.from>b&&(b=a.from);null!=a.to&&a.to<c&&(c=a.to);b=new P(xd(this,b,c),a.mode||this.modeOption,b);a.sharedHist&&(b.history=this.history);(this.linked||(this.linked=[])).push({doc:b,sharedHist:a.sharedHist});b.linked=[{doc:this,isParent:!0,sharedHist:a.sharedHist}];a=Re(this);for(c=0;c<a.length;c++){var d=a[c],e=d.find(),f=b.clipPos(e.from),e=b.clipPos(e.to);y(f,e)&&(f=Wa(b,f,e,d.primary,d.primary.type),d.markers.push(f),f.parent=d)}return b},
276
+ unlinkDoc:function(a){a instanceof q&&(a=a.doc);if(this.linked)for(var b=0;b<this.linked.length;++b)if(this.linked[b].doc==a){this.linked.splice(b,1);a.unlinkDoc(this);Yf(Re(this));break}if(a.history==this.history){var c=[a.id];Ga(a,function(a){c.push(a.id)},!0);a.history=new uc(null);a.history.done=Xa(this.history.done,c);a.history.undone=Xa(this.history.undone,c)}},iterLinkedDocs:function(a){Ga(this,a)},getMode:function(){return this.mode},getEditor:function(){return this.cm}});P.prototype.eachLine=
277
+ P.prototype.iter;var pg=["iter","insert","remove","copy","getEditor"],Jb;for(Jb in P.prototype)P.prototype.hasOwnProperty(Jb)&&0>D(pg,Jb)&&(q.prototype[Jb]=function(a){return function(){return a.apply(this.doc,arguments)}}(P.prototype[Jb]));Ya(P);var O=q.e_preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},qg=q.e_stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},jd=q.e_stop=function(a){O(a);qg(a)},v=q.on=function(a,b,c){a.addEventListener?
278
+ a.addEventListener(b,c,!1):a.attachEvent?a.attachEvent("on"+b,c):(a=a._handlers||(a._handlers={}),(a[b]||(a[b]=[])).push(c))},ka=q.off=function(a,b,c){if(a.removeEventListener)a.removeEventListener(b,c,!1);else if(a.detachEvent)a.detachEvent("on"+b,c);else if(a=a._handlers&&a._handlers[b])for(b=0;b<a.length;++b)if(a[b]==c){a.splice(b,1);break}},K=q.signal=function(a,b){var c=a._handlers&&a._handlers[b];if(c)for(var d=Array.prototype.slice.call(arguments,2),e=0;e<c.length;++e)c[e].apply(null,d)},Db=
279
+ null,Hd=30,Ae=q.Pass={toString:function(){return"CodeMirror.Pass"}},ha={scroll:!1},kd={origin:"*mouse"},Gb={origin:"+move"};bb.prototype.set=function(a,b){clearTimeout(this.id);this.id=setTimeout(b,a)};var aa=q.countColumn=function(a,b,c,d,e){null==b&&(b=a.search(/[^\s\u00a0]/),-1==b&&(b=a.length));d=d||0;for(e=e||0;;){var f=a.indexOf("\t",d);if(0>f||f>=b)return e+(b-d);e+=f-d;e+=c-e%c;d=f+1}},vc=[""],Za=function(a){a.select()};Qa?Za=function(a){a.selectionStart=0;a.selectionEnd=a.value.length}:B&&
280
+ (Za=function(a){try{a.select()}catch(b){}});var rg=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,gf=q.isWordChar=function(a){return/\w/.test(a)||"\u0080"<a&&(a.toUpperCase()!=a.toLowerCase()||rg.test(a))},ig=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/,
281
+ Ea;Ea=document.createRange?function(a,b,c,d){var e=document.createRange();e.setEnd(d||a,c);e.setStart(a,b);return e}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(e){return d}d.collapse(!0);d.moveEnd("character",c);d.moveStart("character",b);return d};var Wc=q.contains=function(a,b){3==b.nodeType&&(b=b.parentNode);if(a.contains)return a.contains(b);do if(11==b.nodeType&&(b=b.host),b==a)return!0;while(b=b.parentNode)};B&&11>C&&(fa=function(){try{return document.activeElement}catch(a){return document.body}});
282
+ var kb=q.rmClass=function(a,b){var c=a.className,d=Fb(b).exec(c);if(d){var e=c.slice(d.index+d[0].length);a.className=c.slice(0,d.index)+(e?d[1]+e:"")}},mb=q.addClass=function(a,b){var c=a.className;Fb(b).test(c)||(a.className+=(c?" ":"")+b)},Dd=!1,Lf=function(){if(B&&9>C)return!1;var a=t("div");return"draggable"in a||"dragDrop"in a}(),yd,vd,sa=q.splitLines=3!="\n\nb".split(/\n/).length?function(a){for(var b=0,c=[],d=a.length;b<=d;){var e=a.indexOf("\n",b);-1==e&&(e=a.length);var f=a.slice(b,"\r"==
283
+ a.charAt(e-1)?e-1:e),g=f.indexOf("\r");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\r\n?|\n/)},ng=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return!1}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return b&&b.parentElement()==a?0!=b.compareEndPoints("StartToEnd",b):!1},Ce=function(){var a=t("div");if("oncopy"in a)return!0;a.setAttribute("oncopy","return;");return"function"==typeof a.oncopy}(),
284
+ bd=null,va={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",
285
+ 63276:"PageUp",63277:"PageDown",63302:"Insert"};q.keyNames=va;(function(){for(var a=0;10>a;a++)va[a+48]=va[a+96]=String(a);for(a=65;90>=a;a++)va[a]=String.fromCharCode(a);for(a=1;12>=a;a++)va[a+111]=va[a+63235]="F"+a})();var vb,gg=function(){function a(a){return 247>=a?"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN".charAt(a):
286
+ 1424<=a&&1524>=a?"R":1536<=a&&1773>=a?"rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm".charAt(a-1536):1774<=a&&2220>=a?"r":8192<=a&&8203>=a?"w":8204==a?"b":"L"}function b(a,b,c){this.level=a;this.from=b;this.to=c}var c=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,d=/[stwN]/,e=/[LRr]/,f=/[Lb1n]/,g=/[1n]/;return function(h){if(!c.test(h))return!1;
287
+ for(var k=h.length,l=[],m=0,p;m<k;++m)l.push(a(h.charCodeAt(m)));for(var m=0,n="L";m<k;++m)p=l[m],"m"==p?l[m]=n:n=p;m=0;for(n="L";m<k;++m)p=l[m],"1"==p&&"r"==n?l[m]="n":e.test(p)&&(n=p,"r"==p&&(l[m]="R"));m=1;for(n=l[0];m<k-1;++m)p=l[m],"+"==p&&"1"==n&&"1"==l[m+1]?l[m]="1":","!=p||n!=l[m+1]||"1"!=n&&"n"!=n||(l[m]=n),n=p;for(m=0;m<k;++m)if(p=l[m],","==p)l[m]="N";else if("%"==p){for(n=m+1;n<k&&"%"==l[n];++n);var q=m&&"!"==l[m-1]||n<k&&"1"==l[n]?"1":"N";for(p=m;p<n;++p)l[p]=q;m=n-1}m=0;for(n="L";m<k;++m)p=
288
+ l[m],"L"==n&&"1"==p?l[m]="L":e.test(p)&&(n=p);for(m=0;m<k;++m)if(d.test(l[m])){for(n=m+1;n<k&&d.test(l[n]);++n);p="L"==(n<k?l[n]:"L");q="L"==(m?l[m-1]:"L")||p?"L":"R";for(p=m;p<n;++p)l[p]=q;m=n-1}for(var n=[],r,m=0;m<k;)if(f.test(l[m])){p=m;for(++m;m<k&&f.test(l[m]);++m);n.push(new b(0,p,m))}else{var t=m,q=n.length;for(++m;m<k&&"L"!=l[m];++m);for(p=t;p<m;)if(g.test(l[p])){t<p&&n.splice(q,0,new b(1,t,p));t=p;for(++p;p<m&&g.test(l[p]);++p);n.splice(q,0,new b(2,t,p));t=p}else++p;t<m&&n.splice(q,0,new b(1,
289
+ t,m))}1==n[0].level&&(r=h.match(/^\s+/))&&(n[0].from=r[0].length,n.unshift(new b(0,0,r[0].length)));1==A(n).level&&(r=h.match(/\s+$/))&&(A(n).to-=r[0].length,n.push(new b(0,k-r[0].length,k)));2==n[0].level&&n.unshift(new b(1,n[0].to,n[0].to));n[0].level!=A(n).level&&n.push(new b(n[0].level,k,k));return n}}();q.version="5.2.0";return q});
290
+
291
+ // CodeMirror CSS mode version 5.2.0
292
+ (function(m){"object"==typeof exports&&"object"==typeof module?m(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],m):m(CodeMirror)})(function(m){function h(g){for(var d={},f=0;f<g.length;++f)d[g[f]]=!0;return d}function x(g,d){for(var f=!1,h;null!=(h=g.next());){if(f&&"/"==h){d.tokenize=null;break}f="*"==h}return["comment","comment"]}function r(g,d){g.skipTo("--\x3e")?(g.match("--\x3e"),d.tokenize=null):g.skipToEnd();return["comment","comment"]}
293
+ m.defineMode("css",function(g,d){function f(a,c){B=c;return a}function h(a,c){var b=a.next();if(w[b]){var d=w[b](a,c);if(!1!==d)return d}if("@"==b)return a.eatWhile(/[\w\\\-]/),f("def",a.current());if("="==b||("~"==b||"|"==b)&&a.eat("="))return f(null,"compare");if('"'==b||"'"==b)return c.tokenize=p(b),c.tokenize(a,c);if("#"==b)return a.eatWhile(/[\w\\\-]/),f("atom","hash");if("!"==b)return a.match(/^\s*\w*/),f("keyword","important");if(/\d/.test(b)||"."==b&&a.eat(/\d/))return a.eatWhile(/[\w.%]/),
294
+ f("number","unit");if("-"===b){if(/[\d.]/.test(a.peek()))return a.eatWhile(/[\w.%]/),f("number","unit");if(a.match(/^-[\w\\\-]+/))return a.eatWhile(/[\w\\\-]/),a.match(/^\s*:/,!1)?f("variable-2","variable-definition"):f("variable-2","variable");if(a.match(/^\w+-/))return f("meta","meta")}else return/[,+>*\/]/.test(b)?f(null,"select-op"):"."==b&&a.match(/^-?[_a-z][_a-z0-9-]*/i)?f("qualifier","qualifier"):/[:;{}\[\]\(\)]/.test(b)?f(null,b):"u"==b&&a.match(/rl(-prefix)?\(/)||"d"==b&&a.match("omain(")||
295
+ "r"==b&&a.match("egexp(")?(a.backUp(1),c.tokenize=x,f("property","word")):/[\w\\\-]/.test(b)?(a.eatWhile(/[\w\\\-]/),f("property","word")):f(null,null)}function p(a){return function(c,b){for(var d=!1,e;null!=(e=c.next());){if(e==a&&!d){")"==a&&c.backUp(1);break}d=!d&&"\\"==e}if(e==a||!d&&")"!=a)b.tokenize=null;return f("string","string")}}function x(a,c){a.next();a.match(/\s*[\"\')]/,!1)?c.tokenize=null:c.tokenize=p(")");return f(null,"(")}function r(a,c,b){this.type=a;this.indent=c;this.prev=b}function k(a,
296
+ c,b){a.context=new r(b,c.indentation()+v,a.context);return b}function l(a){a.context=a.context.prev;return a.context.type}function q(a,c,b,d){for(d=d||1;0<d;d--)b.context=b.context.prev;return n[b.context.type](a,c,b)}function u(a){a=a.current().toLowerCase();e=F.hasOwnProperty(a)?"atom":E.hasOwnProperty(a)?"keyword":"variable"}d.propertyKeywords||(d=m.resolveMode("text/css"));var v=g.indentUnit,w=d.tokenHooks,y=d.documentTypes||{},z=d.mediaTypes||{},A=d.mediaFeatures||{},G=d.propertyKeywords||{},
297
+ H=d.nonStandardPropertyKeywords||{},C=d.fontProperties||{},D=d.counterDescriptors||{},E=d.colorKeywords||{},F=d.valueKeywords||{},t=d.allowNested,B,e,n={top:function(a,c,b){if("{"==a)return k(b,c,"block");if("}"==a&&b.context.prev)return l(b);if(/@(media|supports|(-moz-)?document)/.test(a))return k(b,c,"atBlock");if(/@(font-face|counter-style)/.test(a))return b.stateArg=a,"restricted_atBlock_before";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(a))return"keyframes";if(a&&"@"==a.charAt(0))return k(b,
298
+ c,"at");if("hash"==a)e="builtin";else if("word"==a)e="tag";else{if("variable-definition"==a)return"maybeprop";if("interpolation"==a)return k(b,c,"interpolation");if(":"==a)return"pseudo";if(t&&"("==a)return k(b,c,"parens")}return b.context.type},block:function(a,c,b){if("word"==a){a=c.current().toLowerCase();if(G.hasOwnProperty(a))return e="property","maybeprop";if(H.hasOwnProperty(a))return e="string-2","maybeprop";if(t)return e=c.match(/^\s*:(?:\s|$)/,!1)?"property":"tag","block";e+=" error";return"maybeprop"}if("meta"==
299
+ a)return"block";if(t||"hash"!=a&&"qualifier"!=a)return n.top(a,c,b);e="error";return"block"},maybeprop:function(a,c,b){return":"==a?k(b,c,"prop"):n[b.context.type](a,c,b)},prop:function(a,c,b){if(";"==a)return l(b);if("{"==a&&t)return k(b,c,"propBlock");if("}"==a||"{"==a)return q(a,c,b);if("("==a)return k(b,c,"parens");if("hash"==a&&!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(c.current()))e+=" error";else if("word"==a)u(c);else if("interpolation"==a)return k(b,c,"interpolation");return"prop"},propBlock:function(a,
300
+ c,b){return"}"==a?l(b):"word"==a?(e="property","maybeprop"):b.context.type},parens:function(a,c,b){if("{"==a||"}"==a)return q(a,c,b);if(")"==a)return l(b);if("("==a)return k(b,c,"parens");if("interpolation"==a)return k(b,c,"interpolation");"word"==a&&u(c);return"parens"},pseudo:function(a,c,b){return"word"==a?(e="variable-3",b.context.type):n[b.context.type](a,c,b)},atBlock:function(a,c,b){if("("==a)return k(b,c,"atBlock_parens");if("}"==a)return q(a,c,b);if("{"==a)return l(b)&&k(b,c,t?"block":"top");
301
+ "word"==a&&(a=c.current().toLowerCase(),e="only"==a||"not"==a||"and"==a||"or"==a?"keyword":y.hasOwnProperty(a)?"tag":z.hasOwnProperty(a)?"attribute":A.hasOwnProperty(a)?"property":G.hasOwnProperty(a)?"property":H.hasOwnProperty(a)?"string-2":F.hasOwnProperty(a)?"atom":"error");return b.context.type},atBlock_parens:function(a,c,b){return")"==a?l(b):"{"==a||"}"==a?q(a,c,b,2):n.atBlock(a,c,b)},restricted_atBlock_before:function(a,c,b){return"{"==a?k(b,c,"restricted_atBlock"):"word"==a&&"@counter-style"==
302
+ b.stateArg?(e="variable","restricted_atBlock_before"):n[b.context.type](a,c,b)},restricted_atBlock:function(a,c,b){return"}"==a?(b.stateArg=null,l(b)):"word"==a?(e="@font-face"==b.stateArg&&!C.hasOwnProperty(c.current().toLowerCase())||"@counter-style"==b.stateArg&&!D.hasOwnProperty(c.current().toLowerCase())?"error":"property","maybeprop"):"restricted_atBlock"},keyframes:function(a,c,b){return"word"==a?(e="variable","keyframes"):"{"==a?k(b,c,"top"):n[b.context.type](a,c,b)},at:function(a,c,b){if(";"==
303
+ a)return l(b);if("{"==a||"}"==a)return q(a,c,b);"word"==a?e="tag":"hash"==a&&(e="builtin");return"at"},interpolation:function(a,c,b){if("}"==a)return l(b);if("{"==a||";"==a)return q(a,c,b);"word"==a?e="variable":"variable"!=a&&(e="error");return"interpolation"}};return{startState:function(a){return{tokenize:null,state:"top",stateArg:null,context:new r("top",a||0,null)}},token:function(a,c){if(!c.tokenize&&a.eatSpace())return null;var b=(c.tokenize||h)(a,c);b&&"object"==typeof b&&(B=b[1],b=b[0]);e=
304
+ b;c.state=n[c.state](B,a,c);return e},indent:function(a,c){var b=a.context,d=c&&c.charAt(0),e=b.indent;"prop"!=b.type||"}"!=d&&")"!=d||(b=b.prev);!b.prev||("}"!=d||"block"!=b.type&&"top"!=b.type&&"interpolation"!=b.type&&"restricted_atBlock"!=b.type)&&(")"!=d||"parens"!=b.type&&"atBlock_parens"!=b.type)&&("{"!=d||"at"!=b.type&&"atBlock"!=b.type)||(e=b.indent-v);return e},electricChars:"}",blockCommentStart:"/*",blockCommentEnd:"*/",fold:"brace"}});var p=["domain","regexp","url","url-prefix"],C=h(p),
305
+ u="all aural braille handheld print projection screen tty tv embossed".split(" "),D=h(u),v="width min-width max-width height min-height max-height device-width min-device-width max-device-width device-height min-device-height max-device-height aspect-ratio min-aspect-ratio max-aspect-ratio device-aspect-ratio min-device-aspect-ratio max-device-aspect-ratio color min-color max-color color-index min-color-index max-color-index monochrome min-monochrome max-monochrome resolution min-resolution max-resolution scan grid".split(" "),
306
+ E=h(v),w="align-content align-items align-self alignment-adjust alignment-baseline anchor-point animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function appearance azimuth backface-visibility background background-attachment background-clip background-color background-image background-origin background-position background-repeat background-size baseline-shift binding bleed bookmark-label bookmark-level bookmark-state bookmark-target border border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip color color-profile column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width columns content counter-increment counter-reset crop cue cue-after cue-before cursor direction display dominant-baseline drop-initial-after-adjust drop-initial-after-align drop-initial-before-adjust drop-initial-before-align drop-initial-size drop-initial-value elevation empty-cells fit fit-position flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float float-offset flow-from flow-into font font-feature-settings font-family font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-synthesis font-variant font-variant-alternates font-variant-caps font-variant-east-asian font-variant-ligatures font-variant-numeric font-variant-position font-weight grid grid-area grid-auto-columns grid-auto-flow grid-auto-position grid-auto-rows grid-column grid-column-end grid-column-start grid-row grid-row-end grid-row-start grid-template grid-template-areas grid-template-columns grid-template-rows hanging-punctuation height hyphens icon image-orientation image-rendering image-resolution inline-box-align justify-content left letter-spacing line-break line-height line-stacking line-stacking-ruby line-stacking-shift line-stacking-strategy list-style list-style-image list-style-position list-style-type margin margin-bottom margin-left margin-right margin-top marker-offset marks marquee-direction marquee-loop marquee-play-count marquee-speed marquee-style max-height max-width min-height min-width move-to nav-down nav-index nav-left nav-right nav-up object-fit object-position opacity order orphans outline outline-color outline-offset outline-style outline-width overflow overflow-style overflow-wrap overflow-x overflow-y padding padding-bottom padding-left padding-right padding-top page page-break-after page-break-before page-break-inside page-policy pause pause-after pause-before perspective perspective-origin pitch pitch-range play-during position presentation-level punctuation-trim quotes region-break-after region-break-before region-break-inside region-fragment rendering-intent resize rest rest-after rest-before richness right rotation rotation-point ruby-align ruby-overhang ruby-position ruby-span shape-image-threshold shape-inside shape-margin shape-outside size speak speak-as speak-header speak-numeral speak-punctuation speech-rate stress string-set tab-size table-layout target target-name target-new target-position text-align text-align-last text-decoration text-decoration-color text-decoration-line text-decoration-skip text-decoration-style text-emphasis text-emphasis-color text-emphasis-position text-emphasis-style text-height text-indent text-justify text-outline text-overflow text-shadow text-size-adjust text-space-collapse text-transform text-underline-position text-wrap top transform transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi vertical-align visibility voice-balance voice-duration voice-family voice-pitch voice-range voice-rate voice-stress voice-volume volume white-space widows width word-break word-spacing word-wrap z-index clip-path clip-rule mask enable-background filter flood-color flood-opacity lighting-color stop-color stop-opacity pointer-events color-interpolation color-interpolation-filters color-rendering fill fill-opacity fill-rule image-rendering marker marker-end marker-mid marker-start shape-rendering stroke stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-rendering baseline-shift dominant-baseline glyph-orientation-horizontal glyph-orientation-vertical text-anchor writing-mode".split(" "),
307
+ I=h(w),y="scrollbar-arrow-color scrollbar-base-color scrollbar-dark-shadow-color scrollbar-face-color scrollbar-highlight-color scrollbar-shadow-color scrollbar-3d-light-color scrollbar-track-color shape-inside searchfield-cancel-button searchfield-decoration searchfield-results-button searchfield-results-decoration zoom".split(" "),J=h(y),K=h("font-family src unicode-range font-variant font-feature-settings font-stretch font-weight font-style".split(" ")),L=h("additive-symbols fallback negative pad prefix range speak-as suffix symbols system".split(" ")),
308
+ z="aliceblue antiquewhite aqua aquamarine azure beige bisque black blanchedalmond blue blueviolet brown burlywood cadetblue chartreuse chocolate coral cornflowerblue cornsilk crimson cyan darkblue darkcyan darkgoldenrod darkgray darkgreen darkkhaki darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen darkslateblue darkslategray darkturquoise darkviolet deeppink deepskyblue dimgray dodgerblue firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite gold goldenrod gray grey green greenyellow honeydew hotpink indianred indigo ivory khaki lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan lightgoldenrodyellow lightgray lightgreen lightpink lightsalmon lightseagreen lightskyblue lightslategray lightsteelblue lightyellow lime limegreen linen magenta maroon mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen mediumslateblue mediumspringgreen mediumturquoise mediumvioletred midnightblue mintcream mistyrose moccasin navajowhite navy oldlace olive olivedrab orange orangered orchid palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru pink plum powderblue purple rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown seagreen seashell sienna silver skyblue slateblue slategray snow springgreen steelblue tan teal thistle tomato turquoise violet wheat white whitesmoke yellow yellowgreen".split(" "),
309
+ M=h(z),A="above absolute activeborder additive activecaption afar after-white-space ahead alias all all-scroll alphabetic alternate always amharic amharic-abegede antialiased appworkspace arabic-indic armenian asterisks attr auto avoid avoid-column avoid-page avoid-region background backwards baseline below bidi-override binary bengali blink block block-axis bold bolder border border-box both bottom break break-all break-word bullets button button-bevel buttonface buttonhighlight buttonshadow buttontext calc cambodian capitalize caps-lock-indicator caption captiontext caret cell center checkbox circle cjk-decimal cjk-earthly-branch cjk-heavenly-stem cjk-ideographic clear clip close-quote col-resize collapse column compact condensed contain content content-box context-menu continuous copy counter counters cover crop cross crosshair currentcolor cursive cyclic dashed decimal decimal-leading-zero default default-button destination-atop destination-in destination-out destination-over devanagari disc discard disclosure-closed disclosure-open document dot-dash dot-dot-dash dotted double down e-resize ease ease-in ease-in-out ease-out element ellipse ellipsis embed end ethiopic ethiopic-abegede ethiopic-abegede-am-et ethiopic-abegede-gez ethiopic-abegede-ti-er ethiopic-abegede-ti-et ethiopic-halehame-aa-er ethiopic-halehame-aa-et ethiopic-halehame-am-et ethiopic-halehame-gez ethiopic-halehame-om-et ethiopic-halehame-sid-et ethiopic-halehame-so-et ethiopic-halehame-ti-er ethiopic-halehame-ti-et ethiopic-halehame-tig ethiopic-numeric ew-resize expanded extends extra-condensed extra-expanded fantasy fast fill fixed flat flex footnotes forwards from geometricPrecision georgian graytext groove gujarati gurmukhi hand hangul hangul-consonant hebrew help hidden hide higher highlight highlighttext hiragana hiragana-iroha horizontal hsl hsla icon ignore inactiveborder inactivecaption inactivecaptiontext infinite infobackground infotext inherit initial inline inline-axis inline-block inline-flex inline-table inset inside intrinsic invert italic japanese-formal japanese-informal justify kannada katakana katakana-iroha keep-all khmer korean-hangul-formal korean-hanja-formal korean-hanja-informal landscape lao large larger left level lighter line-through linear linear-gradient lines list-item listbox listitem local logical loud lower lower-alpha lower-armenian lower-greek lower-hexadecimal lower-latin lower-norwegian lower-roman lowercase ltr malayalam match matrix matrix3d media-controls-background media-current-time-display media-fullscreen-button media-mute-button media-play-button media-return-to-realtime-button media-rewind-button media-seek-back-button media-seek-forward-button media-slider media-sliderthumb media-time-remaining-display media-volume-slider media-volume-slider-container media-volume-sliderthumb medium menu menulist menulist-button menulist-text menulist-textfield menutext message-box middle min-intrinsic mix mongolian monospace move multiple myanmar n-resize narrower ne-resize nesw-resize no-close-quote no-drop no-open-quote no-repeat none normal not-allowed nowrap ns-resize numbers numeric nw-resize nwse-resize oblique octal open-quote optimizeLegibility optimizeSpeed oriya oromo outset outside outside-shape overlay overline padding padding-box painted page paused persian perspective plus-darker plus-lighter pointer polygon portrait pre pre-line pre-wrap preserve-3d progress push-button radial-gradient radio read-only read-write read-write-plaintext-only rectangle region relative repeat repeating-linear-gradient repeating-radial-gradient repeat-x repeat-y reset reverse rgb rgba ridge right rotate rotate3d rotateX rotateY rotateZ round row-resize rtl run-in running s-resize sans-serif scale scale3d scaleX scaleY scaleZ scroll scrollbar se-resize searchfield searchfield-cancel-button searchfield-decoration searchfield-results-button searchfield-results-decoration semi-condensed semi-expanded separate serif show sidama simp-chinese-formal simp-chinese-informal single skew skewX skewY skip-white-space slide slider-horizontal slider-vertical sliderthumb-horizontal sliderthumb-vertical slow small small-caps small-caption smaller solid somali source-atop source-in source-out source-over space spell-out square square-button start static status-bar stretch stroke sub subpixel-antialiased super sw-resize symbolic symbols table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group tamil telugu text text-bottom text-top textarea textfield thai thick thin threeddarkshadow threedface threedhighlight threedlightshadow threedshadow tibetan tigre tigrinya-er tigrinya-er-abegede tigrinya-et tigrinya-et-abegede to top trad-chinese-formal trad-chinese-informal translate translate3d translateX translateY translateZ transparent ultra-condensed ultra-expanded underline up upper-alpha upper-armenian upper-greek upper-hexadecimal upper-latin upper-norwegian upper-roman uppercase urdu url var vertical vertical-text visible visibleFill visiblePainted visibleStroke visual w-resize wait wave wider window windowframe windowtext words x-large x-small xor xx-large xx-small".split(" "),
310
+ N=h(A),p=p.concat(u).concat(v).concat(w).concat(y).concat(z).concat(A);m.registerHelper("hintWords","css",p);m.defineMIME("text/css",{documentTypes:C,mediaTypes:D,mediaFeatures:E,propertyKeywords:I,nonStandardPropertyKeywords:J,fontProperties:K,counterDescriptors:L,colorKeywords:M,valueKeywords:N,tokenHooks:{"<":function(g,d){if(!g.match("!--"))return!1;d.tokenize=r;return r(g,d)},"/":function(g,d){if(!g.eat("*"))return!1;d.tokenize=x;return x(g,d)}},name:"css"})});
admin/js/common.js ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for all TablePress admin screens
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* global confirm, tp, postboxes, pagenow, tp, tablepress_common */
11
+
12
+ // Ensure the global `tp` object exists.
13
+ window.tp = window.tp || {};
14
+
15
+ jQuery( document ).ready( function( $ ) {
16
+
17
+ 'use strict';
18
+
19
+ /**
20
+ * Enable toggle/order functionality for post meta boxes
21
+ * For TablePress, pagenow has the form "tablepress_{$action}"
22
+ *
23
+ * @since 1.0.0
24
+ */
25
+ postboxes.add_postbox_toggles( pagenow );
26
+
27
+ /**
28
+ * Remove/add title to value on focus/blur of text fields "Table Name" and "Table Description" on "Add new Table" screen
29
+ *
30
+ * @since 1.0.0
31
+ */
32
+ $( '#tablepress-page' )
33
+ .on( 'focus', '.placeholder', function() {
34
+ if ( this.value === this.defaultValue ) {
35
+ this.value = '';
36
+ $(this).removeClass( 'placeholder-active' );
37
+ }
38
+ } )
39
+ .on( 'blur', '.placeholder', function() {
40
+ if ( '' === this.value ) {
41
+ this.value = this.defaultValue;
42
+ $(this).addClass( 'placeholder-active' );
43
+ }
44
+ } );
45
+
46
+ /**
47
+ * Check that numerical fields (e.g. column/row number fields) only contain numbers
48
+ *
49
+ * Provides this functionality for browsers that don't yet support <input type="number" />.
50
+ *
51
+ * @since 1.0.0
52
+ */
53
+ $( '#tablepress-page' ).on( 'blur', '.numbers-only, .form-field-numbers-only input', function( /* event */ ) {
54
+ var $input = $(this);
55
+ $input.val( $input.val().replace( /[^0-9]/g, '' ) );
56
+ } );
57
+
58
+ /**
59
+ * Show a AYS warning when a "Delete" link is clicked
60
+ *
61
+ * @since 1.0.0
62
+ */
63
+ $( '#tablepress-page' ).on( 'click', '.delete-link', function() {
64
+ if ( ! confirm( tablepress_common.ays_delete_single_table ) ) {
65
+ return false;
66
+ }
67
+
68
+ // Prevent onunload warning.
69
+ tp.made_changes = false;
70
+ } );
71
+
72
+ /**
73
+ * Select all text in the Shortcode (readonly) text fields, when clicked
74
+ *
75
+ * @since 1.0.0
76
+ */
77
+ $( '#tablepress-page' ).on( 'click', '.table-shortcode', function() {
78
+ $(this).focus().select();
79
+ } );
80
+
81
+ } );
admin/js/common.min.js ADDED
@@ -0,0 +1 @@
 
1
+ window.tp=window.tp||{},jQuery(document).ready(function(a){"use strict";postboxes.add_postbox_toggles(pagenow),a("#tablepress-page").on("focus",".placeholder",function(){this.value===this.defaultValue&&(this.value="",a(this).removeClass("placeholder-active"))}).on("blur",".placeholder",function(){""===this.value&&(this.value=this.defaultValue,a(this).addClass("placeholder-active"))}),a("#tablepress-page").on("blur",".numbers-only, .form-field-numbers-only input",function(){var b=a(this);b.val(b.val().replace(/[^0-9]/g,""))}),a("#tablepress-page").on("click",".delete-link",function(){return confirm(tablepress_common.ays_delete_single_table)?void(tp.made_changes=!1):!1}),a("#tablepress-page").on("click",".table-shortcode",function(){a(this).focus().select()})});
admin/js/edit.js ADDED
@@ -0,0 +1,1264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for the "Edit" screen
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* global alert, confirm, tp, tablepress_strings, tablepress_options, ajaxurl, wpLink, tb_show, wp, JSON */
11
+
12
+ // Ensure the global `tp` object exists.
13
+ window.tp = window.tp || {};
14
+
15
+ jQuery( document ).ready( function( $ ) {
16
+
17
+ 'use strict';
18
+
19
+ /* Wrapper to find elements in the page faster with JS-native functions */
20
+ var $id = function( element_id ) {
21
+ return $( document.getElementById( element_id ) );
22
+ };
23
+
24
+ /**
25
+ * TablePress object, mostly with functionality for the "Edit" screen
26
+ *
27
+ * @since 1.0.0
28
+ */
29
+ tp.made_changes = false;
30
+
31
+ tp.table = {
32
+ id: $id( 'table-id' ).val(),
33
+ new_id: $id( 'table-new-id' ).val(),
34
+ rows: parseInt( $id( 'number-rows' ).val(), 10 ),
35
+ columns: parseInt( $id( 'number-columns' ).val(), 10 ),
36
+ head: $id( 'option-table-head' ).prop( 'checked' ),
37
+ foot: $id( 'option-table-foot' ).prop( 'checked' ),
38
+ no_data_columns_pre: 2,
39
+ no_data_columns_post: 1,
40
+ body_cells_pre: '<tr><td><span class="move-handle"></span></td><td><input type="checkbox" /><input type="hidden" class="visibility" name="table[visibility][rows][]" value="1" /></td>',
41
+ body_cells_post: '<td><span class="move-handle"></span></td></tr>',
42
+ body_cell: '<td><textarea rows="1"></textarea></td>',
43
+ head_cell: '<th class="head"><span class="sort-control sort-desc" title="' + tablepress_strings.sort_desc + '"><span class="sorting-indicator"></span></span><span class="sort-control sort-asc" title="' + tablepress_strings.sort_asc + '"><span class="sorting-indicator"></span></span><span class="move-handle"></span></th>',
44
+ foot_cell: '<th><input type="checkbox" /><input type="hidden" class="visibility" name="table[visibility][columns][]" value="1" /></th>',
45
+ set_table_changed: function() {
46
+ tp.made_changes = true;
47
+ },
48
+ unset_table_changed: function() {
49
+ tp.made_changes = false;
50
+ $id( 'edit-form-body' ).one( 'change', 'textarea', tp.table.set_table_changed );
51
+ // @TODO: maybe use .tablepress-postbox-table here and further below
52
+ $( '#tablepress_edit-table-information, #tablepress_edit-table-options, #tablepress_edit-datatables-features' ).one( 'change', 'input, textarea, select', tp.table.set_table_changed );
53
+ },
54
+ change_id: function( /* event */ ) {
55
+ // empty table IDs are not allowed
56
+ if ( '' === $.trim( $id( 'table-new-id' ).val() ) ) {
57
+ alert( tablepress_strings.table_id_not_empty );
58
+ $id( 'table-new-id' ).val( tp.table.new_id ).focus().select();
59
+ return;
60
+ }
61
+ // the '0' table ID is not allowed
62
+ if ( '0' === $.trim( $id( 'table-new-id' ).val() ) ) {
63
+ alert( tablepress_strings.table_id_not_zero );
64
+ $id( 'table-new-id' ).val( tp.table.new_id ).focus().select();
65
+ return;
66
+ }
67
+
68
+ if ( this.value === tp.table.new_id ) {
69
+ return;
70
+ }
71
+
72
+ if ( confirm( tablepress_strings.ays_change_table_id ) ) {
73
+ tp.table.new_id = this.value;
74
+ $( '.table-shortcode' ).val( '[' + tablepress_options.shortcode + ' id=' + tp.table.new_id + ' /]' ).click(); // click() to focus and select
75
+ tp.table.set_table_changed();
76
+ } else {
77
+ $(this).val( tp.table.new_id );
78
+ }
79
+ },
80
+ change_table_head: function( /* event */ ) {
81
+ tp.table.head = $(this).prop( 'checked' );
82
+ $id( 'option-use-datatables' ).prop( 'disabled', ! tp.table.head ).change();
83
+ $id( 'notice-datatables-head-row' ).toggle( ! tp.table.head );
84
+ tp.rows.stripe();
85
+ },
86
+ change_table_foot: function( /* event */ ) {
87
+ tp.table.foot = $(this).prop( 'checked' );
88
+ tp.rows.stripe();
89
+ },
90
+ change_print_name_description: function( /* event */ ) {
91
+ $id( this.id + '-position' ).prop( 'disabled', ! $(this).prop( 'checked' ) );
92
+ },
93
+ change_datatables: function() {
94
+ var $datatables_checkbox = $id( 'option-use-datatables' ),
95
+ checkboxes_disabled = ! ( $datatables_checkbox.prop( 'checked' ) && ! $datatables_checkbox.prop( 'disabled' ) );
96
+ $datatables_checkbox.closest( 'tbody' ).find( 'input' ).not( $datatables_checkbox ).prop( 'disabled', checkboxes_disabled );
97
+ tp.table.change_datatables_pagination();
98
+ },
99
+ change_datatables_pagination: function() {
100
+ var $pagination_checkbox = $id( 'option-datatables-paginate' ),
101
+ pagination_enabled = ( $pagination_checkbox.prop( 'checked' ) && ! $pagination_checkbox.prop( 'disabled' ) );
102
+ $id( 'option-datatables-lengthchange' ).prop( 'disabled', ! pagination_enabled );
103
+ $id( 'option-datatables-paginate_entries' ).prop( 'disabled', ! pagination_enabled );
104
+ },
105
+ prepare_ajax_request: function( wp_action, wp_nonce ) {
106
+ var $table_body = $id( 'edit-form-body' ),
107
+ table_data = [],
108
+ table_options,
109
+ table_number = { rows: tp.table.rows, columns: tp.table.columns, hidden_rows: 0, hidden_columns: 0 },
110
+ table_visibility = { rows: [], columns: [] };
111
+
112
+ $table_body.children().each( function( idx, row ) {
113
+ table_data[ idx ] = $( row ).find( 'textarea' )
114
+ .map( function() {
115
+ return $(this).val();
116
+ } )
117
+ .get();
118
+ } );
119
+ table_data = JSON.stringify( table_data );
120
+
121
+ // @TODO: maybe for options saving: http://stackoverflow.com/questions/1184624/serialize-form-to-json-with-jquery
122
+ // or each()-loop through all checkboxes/textfields/selects
123
+ table_options = {
124
+ // Table Options
125
+ table_head: tp.table.head,
126
+ table_foot: tp.table.foot,
127
+ alternating_row_colors: $id( 'option-alternating-row-colors' ).prop( 'checked' ),
128
+ row_hover: $id( 'option-row-hover' ).prop( 'checked' ),
129
+ print_name: $id( 'option-print-name' ).prop( 'checked' ),
130
+ print_description: $id( 'option-print-description' ).prop( 'checked' ),
131
+ print_name_position: $id( 'option-print-name-position' ).val(),
132
+ print_description_position: $id( 'option-print-description-position' ).val(),
133
+ extra_css_classes: $id( 'option-extra-css-classes' ).val(),
134
+ // DataTables JS features
135
+ use_datatables: $id( 'option-use-datatables' ).prop( 'checked' ),
136
+ datatables_sort: $id( 'option-datatables-sort' ).prop( 'checked' ),
137
+ datatables_filter: $id( 'option-datatables-filter' ).prop( 'checked' ),
138
+ datatables_paginate: $id( 'option-datatables-paginate' ).prop( 'checked' ),
139
+ datatables_lengthchange: $id( 'option-datatables-lengthchange' ).prop( 'checked' ),
140
+ datatables_paginate_entries: $id( 'option-datatables-paginate_entries' ).val(),
141
+ datatables_info: $id( 'option-datatables-info' ).prop( 'checked' ),
142
+ datatables_scrollx: $id( 'option-datatables-scrollx' ).prop( 'checked' ),
143
+ datatables_custom_commands: $id( 'option-datatables-custom-commands' ).val()
144
+ };
145
+ table_options = JSON.stringify( table_options );
146
+
147
+ table_visibility.rows = $table_body.find( 'input[type="hidden"]' )
148
+ .map( function() {
149
+ if ( '1' === $(this).val() ) {
150
+ return 1;
151
+ }
152
+ table_number.hidden_rows += 1;
153
+ return 0;
154
+ } )
155
+ .get();
156
+ table_visibility.columns = $id( 'edit-form-foot' ).find( 'input[type="hidden"]' )
157
+ .map( function() {
158
+ if ( '1' === $(this).val() ) {
159
+ return 1;
160
+ }
161
+ table_number.hidden_columns += 1;
162
+ return 0;
163
+ } )
164
+ .get();
165
+ table_visibility = JSON.stringify( table_visibility );
166
+
167
+ // request_data =
168
+ return {
169
+ action: wp_action,
170
+ _ajax_nonce : $( wp_nonce ).val(),
171
+ tablepress: {
172
+ id: tp.table.id,
173
+ new_id: tp.table.new_id,
174
+ name: $id( 'table-name' ).val(),
175
+ description: $id( 'table-description' ).val(),
176
+ number: table_number,
177
+ data: table_data,
178
+ options: table_options,
179
+ visibility: table_visibility
180
+ }
181
+ };
182
+ },
183
+ preview: {
184
+ trigger: function( /* event */ ) {
185
+ if ( ! tp.made_changes ) {
186
+ tp.table.preview.show( $(this).attr( 'href' ) + '&TB_iframe=true' );
187
+ return false;
188
+ }
189
+
190
+ // validation checks
191
+ if ( $id( 'option-datatables-paginate' ).prop( 'checked' ) && ! ( /^[1-9][0-9]{0,4}$/ ).test( $id( 'option-datatables-paginate_entries' ).val() ) ) {
192
+ alert( tablepress_strings.num_pagination_entries_invalid );
193
+ $id( 'option-datatables-paginate_entries' ).focus().select();
194
+ return;
195
+ }
196
+ if ( ( /[^A-Za-z0-9- _]/ ).test( $id( 'option-extra-css-classes' ).val() ) ) {
197
+ alert( tablepress_strings.extra_css_classes_invalid );
198
+ $id( 'option-extra-css-classes' ).focus().select();
199
+ return;
200
+ }
201
+
202
+ $(this).closest( 'p' ).append( '<span class="animation-preview spinner is-active" title="' + tablepress_strings.preparing_preview + '"/>' );
203
+ $( 'body' ).addClass( 'wait' );
204
+ $id( 'table-preview' ).empty(); // clear preview
205
+
206
+ $.ajax({
207
+ 'type': 'POST',
208
+ 'url': ajaxurl,
209
+ 'data': tp.table.prepare_ajax_request( 'tablepress_preview_table', '#nonce-preview-table' ),
210
+ 'success': tp.table.preview.ajax_success,
211
+ 'error': tp.table.preview.ajax_error,
212
+ 'dataType': 'json'
213
+ } );
214
+
215
+ return false;
216
+ },
217
+ ajax_success: function( data, status /*, jqXHR */ ) {
218
+ if ( ( 'undefined' === typeof status ) || ( 'success' !== status ) ) {
219
+ tp.table.preview.error( 'AJAX call successful, but unclear status.' );
220
+ } else if ( ( 'undefined' === typeof data ) || ( null === data ) || ( '-1' === data ) || ( 'undefined' === typeof data.success ) || ( true !== data.success ) ) {
221
+ tp.table.preview.error( 'AJAX call successful, but unclear data.' );
222
+ } else {
223
+ tp.table.preview.success( data );
224
+ }
225
+ },
226
+ ajax_error: function( jqXHR, status, error_thrown ) {
227
+ tp.table.preview.error( 'AJAX call failed: ' + status + ' - ' + error_thrown );
228
+ },
229
+ success: function( data ) {
230
+ $id( 'table-preview' ).empty();
231
+ $( '<iframe id="table-preview-iframe" />' ).load( function() {
232
+ var $iframe = $(this).contents();
233
+ $iframe.find( 'head' ).append( data.head_html );
234
+ $iframe.find( 'body' ).append( data.body_html );
235
+ } ).appendTo( '#table-preview' );
236
+ $( '.animation-preview' ).remove();
237
+ $( 'body' ).removeClass( 'wait' );
238
+ tp.table.preview.show( '#TB_inline?inlineId=preview-container' );
239
+ },
240
+ error: function( message ) {
241
+ $( '.animation-preview' ).closest( 'p' )
242
+ .after( '<div class="ajax-alert preview-error error"><p>' + tablepress_strings.preview_error + ': ' + message + '</p></div>' );
243
+ $( '.animation-preview' ).remove();
244
+ $( '.preview-error' ).delay( 6000 ).fadeOut( 2000, function() { $(this).remove(); } );
245
+ $( 'body' ).removeClass( 'wait' );
246
+ },
247
+ show: function( url ) {
248
+ var width = $( window ).width() - 120,
249
+ height = $( window ).height() - 120;
250
+ if ( $( '#wpadminbar' ).length ) {
251
+ height -= parseInt( $( '#wpadminbar' ).css( 'height' ), 10 );
252
+ }
253
+ tb_show( $( '.show-preview-button' ).first().text(), url + '&height=' + height + '&width=' + width, false );
254
+ }
255
+ }
256
+ };
257
+
258
+ tp.rows = {
259
+ create: function( num_rows ) {
260
+ var i, j,
261
+ column_idxs,
262
+ new_rows = '';
263
+
264
+ for ( i = 0; i < num_rows; i++ ) {
265
+ new_rows += tp.table.body_cells_pre;
266
+ for ( j = 0; j < tp.table.columns; j++ ) {
267
+ new_rows += tp.table.body_cell;
268
+ }
269
+ new_rows += tp.table.body_cells_post;
270
+ }
271
+
272
+ column_idxs = $id( 'edit-form-foot' ).find( '.column-hidden' )
273
+ .map( function() { return $(this).index(); } ).get();
274
+ return $( new_rows ).each( function( row_idx, row ) {
275
+ $( row ).children()
276
+ .filter( function( idx ) { return ( -1 !== $.inArray( idx, column_idxs ) ); } )
277
+ .addClass( 'column-hidden' );
278
+ } );
279
+ },
280
+ append: function( /* event */ ) {
281
+ var num_rows = $id( 'rows-append-number' ).val();
282
+
283
+ if ( ! ( /^[1-9][0-9]{0,4}$/ ).test( num_rows ) ) {
284
+ alert( tablepress_strings.append_num_rows_invalid );
285
+ $id( 'rows-append-number' ).focus().select();
286
+ return;
287
+ }
288
+
289
+ $id( 'edit-form-body' ).append( tp.rows.create( num_rows ) );
290
+
291
+ tp.rows.stripe();
292
+ tp.reindex();
293
+ },
294
+ insert: function( event ) {
295
+ var $selected_rows = $id( 'edit-form-body' ).find( 'input:checked' )
296
+ .prop( 'checked', event.shiftKey ).closest( 'tr' );
297
+
298
+ if ( 0 === $selected_rows.length ) {
299
+ alert( tablepress_strings.no_rows_selected );
300
+ return;
301
+ }
302
+
303
+ $selected_rows.before( tp.rows.create( 1 ) );
304
+
305
+ tp.rows.stripe();
306
+ tp.reindex();
307
+ },
308
+ duplicate: function( event ) {
309
+ var $selected_rows = $id( 'edit-form-body' ).find( 'input:checked' )
310
+ .prop( 'checked', event.shiftKey ).closest( 'tr' );
311
+
312
+ if ( 0 === $selected_rows.length ) {
313
+ alert( tablepress_strings.no_rows_selected );
314
+ return;
315
+ }
316
+
317
+ $selected_rows.each( function( idx, row ) {
318
+ var $row = $( row ),
319
+ $textareas = $row.find( 'textarea' ),
320
+ $duplicated_row = $row.clone();
321
+ $duplicated_row.find( 'textarea' ).removeAttr( 'id' ).each( function( idx, cell ) {
322
+ $( cell ).val( $textareas.eq( idx ).val() ); // setting val() is necessary, as clone() doesn't copy the current value, see jQuery bugs 5524, 2285, 3016
323
+ } );
324
+ $row.after( $duplicated_row );
325
+ } );
326
+
327
+ tp.rows.stripe();
328
+ tp.reindex();
329
+ },
330
+ hide: function( event ) {
331
+ var $selected_rows = $id( 'edit-form-body' ).find( 'input:checked' )
332
+ .prop( 'checked', event.shiftKey ).closest( 'tr' );
333
+
334
+ if ( 0 === $selected_rows.length ) {
335
+ alert( tablepress_strings.no_rows_selected );
336
+ return;
337
+ }
338
+
339
+ $selected_rows.addClass( 'row-hidden' ).find( '.visibility' ).val( '0' );
340
+
341
+ tp.rows.stripe();
342
+ tp.table.set_table_changed();
343
+ },
344
+ unhide: function( event ) {
345
+ var $selected_rows = $id( 'edit-form-body' ).find( 'input:checked' )
346
+ .prop( 'checked', event.shiftKey ).closest( 'tr' );
347
+
348
+ if ( 0 === $selected_rows.length ) {
349
+ alert( tablepress_strings.no_rows_selected );
350
+ return;
351
+ }
352
+
353
+ $selected_rows.removeClass( 'row-hidden' ).find( '.visibility' ).val( '1' );
354
+
355
+ tp.rows.stripe();
356
+ tp.table.set_table_changed();
357
+ },
358
+ remove: function( /* event */ ) {
359
+ var confirm_message,
360
+ $selected_rows = $id( 'edit-form-body' ).find( 'input:checked' ).closest( 'tr' );
361
+
362
+ if ( 0 === $selected_rows.length ) {
363
+ alert( tablepress_strings.no_rows_selected );
364
+ return;
365
+ }
366
+
367
+ if ( tp.table.rows === $selected_rows.length ) {
368
+ alert( tablepress_strings.no_remove_all_rows );
369
+ return;
370
+ }
371
+
372
+ if ( 1 === $selected_rows.length ) {
373
+ confirm_message = tablepress_strings.ays_remove_rows_singular;
374
+ } else {
375
+ confirm_message = tablepress_strings.ays_remove_rows_plural;
376
+ }
377
+ if ( ! confirm( confirm_message ) ) {
378
+ return;
379
+ }
380
+
381
+ $selected_rows.remove();
382
+
383
+ tp.rows.stripe();
384
+ tp.reindex();
385
+ },
386
+ move: {
387
+ start: function( event, ui ) {
388
+ $( ui.placeholder ).removeClass( 'row-hidden' ).css( 'visibility', 'visible' )
389
+ .html( '<td colspan="' + ( tp.table.columns + tp.table.no_data_columns_pre + tp.table.no_data_columns_post ) + '"><div/></td>' );
390
+ $( ui.helper ).removeClass( 'odd head-row foot-row' );
391
+ },
392
+ change: function( event, ui ) {
393
+ tp.rows.stripe( ui.helper );
394
+ },
395
+ stop: function( /* event, ui */ ) {
396
+ tp.rows.stripe();
397
+ }
398
+ },
399
+ sort: function() {
400
+ var column_idx = $(this).parent().index(),
401
+ direction = ( $(this).hasClass( 'sort-asc' ) ) ? 1 : -1,
402
+ $table_body = $('#edit-form-body'),
403
+ $head_rows = $table_body.find( '.head-row' ).prevAll().addBack(),
404
+ $foot_rows = $table_body.find( '.foot-row' ).nextAll().addBack(),
405
+ rows = $table_body.children().not( $head_rows ).not( $foot_rows ).get(),
406
+ /*
407
+ * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
408
+ * Author: Jim Palmer (based on chunking idea from Dave Koelle)
409
+ * See: https://github.com/overset/javascript-natural-sort and http://www.overset.com/2008/09/01/javascript-natural-sort-algorithm-with-unicode-support/
410
+ */
411
+ natural_sort = function( a, b ) {
412
+ var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
413
+ sre = /(^[ ]*|[ ]*$)/g,
414
+ dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
415
+ hre = /^0x[0-9a-f]+$/i,
416
+ ore = /^0/,
417
+ // strip whitespace
418
+ x = a.replace(sre, '') || '',
419
+ y = b.replace(sre, '') || '',
420
+ // chunk/tokenize
421
+ xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
422
+ yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
423
+ // numeric, hex or date detection
424
+ xD = parseInt(x.match(hre), 10) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),
425
+ yD = parseInt(y.match(hre), 10) || xD && y.match(dre) && Date.parse(y) || null,
426
+ oFxNcL, oFyNcL, cLoc, numS;
427
+ // first try and sort Hex codes or Dates
428
+ if (yD) {
429
+ if ( xD < yD ) { return -1; }
430
+ else if ( xD > yD ) { return 1; }
431
+ }
432
+ // natural sorting through split numeric strings and default strings
433
+ for(cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
434
+ // find floats not starting with '0', string or 0 if not defined (Clint Priest)
435
+ oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
436
+ oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
437
+ // handle numeric vs string comparison - number < string - (Kyle Adams)
438
+ if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; }
439
+ // rely on string comparison if different types - i.e. '02' < 2 !== '02' < '2'
440
+ else if (typeof oFxNcL !== typeof oFyNcL) {
441
+ oFxNcL += '';
442
+ oFyNcL += '';
443
+ }
444
+ if (oFxNcL < oFyNcL) { return -1; }
445
+ if (oFxNcL > oFyNcL) { return 1; }
446
+ }
447
+ return 0;
448
+ };
449
+
450
+ $.each( rows, function( row_idx, row ) {
451
+ row.sort_key = ( '' + $( row ).children().eq( column_idx ).find( 'textarea' ).val() ).toLowerCase(); // convert to string, and lower case for case insensitive sorting
452
+ } );
453
+
454
+ rows.sort( function( a, b ) {
455
+ return direction * natural_sort( a.sort_key, b.sort_key );
456
+ } );
457
+
458
+ // might not be necessary:
459
+ $.each( rows, function( row_idx, row ) {
460
+ row.sort_key = null;
461
+ } );
462
+
463
+ $table_body.append( $head_rows );
464
+ $table_body.append( rows );
465
+ $table_body.append( $foot_rows );
466
+
467
+ tp.rows.stripe();
468
+ tp.reindex();
469
+ },
470
+ stripe: function( helper ) {
471
+ if ( 'undefined' === typeof helper ) {
472
+ helper = null;
473
+ }
474
+ helper = $( helper );
475
+ var $rows = $id( 'edit-form-body' ).children().removeClass( 'odd head-row foot-row' ).not( helper );
476
+ $rows.filter( ':even' ).addClass( 'odd' );
477
+ $rows = $rows.not( '.row-hidden' );
478
+ if ( helper.hasClass( 'row-hidden' ) ) {
479
+ $rows = $rows.not( '.ui-sortable-placeholder' );
480
+ }
481
+ if ( tp.table.head ) {
482
+ $rows.first().addClass( 'head-row' );
483
+ }
484
+ if ( tp.table.foot ) {
485
+ $rows.last().addClass( 'foot-row' );
486
+ }
487
+ }
488
+ };
489
+
490
+ tp.columns = {
491
+ append: function( /* event */ ) {
492
+ var i,
493
+ num_columns = $id( 'columns-append-number' ).val(),
494
+ new_head_cells = '', new_body_cells = '', new_foot_cells = '';
495
+
496
+ if ( ! ( /^[1-9][0-9]{0,4}$/ ).test( num_columns ) ) {
497
+ alert( tablepress_strings.append_num_columns_invalid );
498
+ $id( 'columns-append-number' ).focus().select();
499
+ return;
500
+ }
501
+
502
+ for ( i = 0; i < num_columns; i++ ) {
503
+ new_body_cells += tp.table.body_cell;
504
+ new_head_cells += tp.table.head_cell;
505
+ new_foot_cells += tp.table.foot_cell;
506
+ }
507
+
508
+ $id( 'edit-form-body' ).children().each( function( row_idx, row ) {
509
+ $( row ).children().slice( - tp.table.no_data_columns_post )
510
+ .before( new_body_cells );
511
+ } );
512
+ $id( 'edit-form-head' ).children().slice( - tp.table.no_data_columns_post )
513
+ .before( new_head_cells );
514
+ $id( 'edit-form-foot' ).children().slice( - tp.table.no_data_columns_post )
515
+ .before( new_foot_cells );
516
+
517
+ tp.reindex();
518
+ },
519
+ insert: function( event ) {
520
+ var column_idxs,
521
+ $selected_columns = $id( 'edit-form-foot' ).find( 'input:checked' )
522
+ .prop( 'checked', event.shiftKey ).closest( 'th' );
523
+
524
+ if ( 0 === $selected_columns.length ) {
525
+ alert( tablepress_strings.no_columns_selected );
526
+ return;
527
+ }
528
+
529
+ column_idxs = $selected_columns.map( function() { return $(this).index(); } ).get();
530
+ $id( 'edit-form-body' ).children().each( function( row_idx, row ) {
531
+ $( row ).children()
532
+ .filter( function( idx ) { return ( -1 !== $.inArray( idx, column_idxs ) ); } )
533
+ .before( tp.table.body_cell );
534
+ } );
535
+ $id( 'edit-form-head' ).children()
536
+ .filter( function( idx ) { return ( -1 !== $.inArray( idx, column_idxs ) ); } )
537
+ .before( tp.table.head_cell );
538
+ $selected_columns.before( tp.table.foot_cell );
539
+
540
+ tp.reindex();
541
+ },
542
+ duplicate: function( event ) {
543
+ var column_idxs,
544
+ $selected_columns = $id( 'edit-form-foot' ).find( 'input:checked' )
545
+ .prop( 'checked', event.shiftKey ).closest( 'th' );
546
+
547
+ if ( 0 === $selected_columns.length ) {
548
+ alert( tablepress_strings.no_columns_selected );
549
+ return;
550
+ }
551
+
552
+ column_idxs = $selected_columns.map( function() { return $(this).index(); } ).get();
553
+ $id( 'edit-form' ).find( 'tr' ).each( function( row_idx, row ) {
554
+ $( row ).children().each( function( idx, cell ) {
555
+ if ( -1 !== $.inArray( idx, column_idxs ) ) {
556
+ var $cell = $( cell ),
557
+ $duplicated_cell = $cell.clone();
558
+ $duplicated_cell.find( 'textarea' ).removeAttr( 'id' ).val( $cell.find( 'textarea' ).val() ); // setting val() is necessary, as clone() doesn't copy the current value, see jQuery bugs 5524, 2285, 3016
559
+ $cell.after( $duplicated_cell );
560
+ }
561
+ } );
562
+ } );
563
+
564
+ tp.reindex();
565
+ },
566
+ hide: function( event ) {
567
+ var column_idxs,
568
+ $selected_columns = $id( 'edit-form-foot' ).find( 'input:checked' )
569
+ .prop( 'checked', event.shiftKey ).closest( 'th' );
570
+
571
+ if ( 0 === $selected_columns.length ) {
572
+ alert( tablepress_strings.no_columns_selected );
573
+ return;
574
+ }
575
+
576
+ column_idxs = $selected_columns.map( function() { return $(this).index(); } ).get();
577
+ $id( 'edit-form-body' ).children().add( '#edit-form-head' ).each( function( row_idx, row ) {
578
+ $( row ).children()
579
+ .filter( function( idx ) { return ( -1 !== $.inArray( idx, column_idxs ) ); } )
580
+ .addClass( 'column-hidden' );
581
+ } );
582
+ $selected_columns.addClass( 'column-hidden' ).find( '.visibility' ).val( '0' );
583
+
584
+ tp.table.set_table_changed();
585
+ },
586
+ unhide: function( event ) {
587
+ var column_idxs,
588
+ $selected_columns = $id( 'edit-form-foot' ).find( 'input:checked' )
589
+ .prop( 'checked', event.shiftKey ).closest( 'th' );
590
+
591
+ if ( 0 === $selected_columns.length ) {
592
+ alert( tablepress_strings.no_columns_selected );
593
+ return;
594
+ }
595
+
596
+ column_idxs = $selected_columns.map( function() { return $(this).index(); } ).get();
597
+ $id( 'edit-form-body' ).children().add( '#edit-form-head' ).each( function( row_idx, row ) {
598
+ $( row ).children()
599
+ .filter( function( idx ) { return ( -1 !== $.inArray( idx, column_idxs ) ); } )
600
+ .removeClass( 'column-hidden' );
601
+ } );
602
+ $selected_columns.removeClass( 'column-hidden' ).find( '.visibility' ).val( '1' );
603
+
604
+ tp.table.set_table_changed();
605
+ },
606
+ remove: function( /* event */ ) {
607
+ var column_idxs,
608
+ confirm_message,
609
+ $selected_columns = $id( 'edit-form-foot' ).find( 'input:checked' ).closest( 'th' );
610
+
611
+ if ( 0 === $selected_columns.length ) {
612
+ alert( tablepress_strings.no_columns_selected );
613
+ return;
614
+ }
615
+
616
+ if ( tp.table.columns === $selected_columns.length ) {
617
+ alert( tablepress_strings.no_remove_all_columns );
618
+ return;
619
+ }
620
+
621
+ if ( 1 === $selected_columns.length ) {
622
+ confirm_message = tablepress_strings.ays_remove_columns_singular;
623
+ } else {
624
+ confirm_message = tablepress_strings.ays_remove_columns_plural;
625
+ }
626
+ if ( ! confirm( confirm_message ) ) {
627
+ return;
628
+ }
629
+
630
+ column_idxs = $selected_columns.map( function() { return $(this).index(); } ).get();
631
+ $id( 'edit-form-body' ).children().add( '#edit-form-head' ).each( function( row_idx, row ) {
632
+ $( row ).children()
633
+ .filter( function( idx ) { return ( -1 !== $.inArray( idx, column_idxs ) ); } )
634
+ .remove();
635
+ } );
636
+ $selected_columns.remove();
637
+
638
+ tp.reindex();
639
+ },
640
+ move: {
641
+ source_idx: -1,
642
+ target_idx: -1,
643
+ $rows: null,
644
+ $row_children: null,
645
+ $cell: null,
646
+ $cells: null,
647
+ $placeholder: null,
648
+ $helper: null,
649
+ start: function( event, ui ) {
650
+ var $item = $( ui.item ),
651
+ column_width;
652
+
653
+ tp.columns.move.source_idx = $item.index();
654
+
655
+ tp.columns.move.$rows = $id( 'edit-form-body' ).children().add( '#edit-form-foot' );
656
+
657
+ tp.columns.move.$cells = tp.columns.move.$rows
658
+ .find( ':nth-child(' + ( tp.columns.move.source_idx + 1 ) + ')' )
659
+ .each( function() {
660
+ tp.columns.move.$cell = $(this);
661
+ $( '<td class="move-placeholder"><div/></td>' ).insertBefore( tp.columns.move.$cell );
662
+ tp.columns.move.$cell.insertAfter( tp.columns.move.$cell.nextAll().last() )
663
+ .clone().addClass( 'move-hover' ).insertAfter( tp.columns.move.$cell )
664
+ .find( 'textarea' ).val( tp.columns.move.$cell.find( 'textarea' ).val() );
665
+ // last line works around problem with clone() of textareas, see jQuery bugs 5524, 2285, 3016
666
+ } )
667
+ .hide();
668
+
669
+ tp.columns.move.$helper = tp.columns.move.$rows.find( '.move-hover' );
670
+ /* // seems not to be working for rows, so disable it for columns
671
+ .each( function() {
672
+ tp.columns.move.$cell = $(this);
673
+ tp.columns.move.$cell.css( 'top', ( tp.columns.move.$cell.position().top - 3 ) + 'px' );
674
+ } );
675
+ */
676
+
677
+ column_width = tp.columns.move.$helper.eq(1).width(); // eq(0) is table foot
678
+ tp.columns.move.$helper.eq(0).width( column_width );
679
+ tp.columns.move.$placeholder = tp.columns.move.$rows.find( '.move-placeholder' );
680
+ tp.columns.move.$placeholder.find( 'div' ).width( column_width );
681
+ },
682
+ change: function( event, ui ) {
683
+ tp.columns.move.target_idx = $( ui.placeholder ).index();
684
+
685
+ if ( ( tp.columns.move.target_idx - tp.columns.move.source_idx ) === 1 ) {
686
+ tp.columns.move.target_idx += 1;
687
+ } else {
688
+ if ( tp.columns.move.target_idx === tp.columns.move.source_idx ) {
689
+ tp.columns.move.target_idx -= 1;
690
+ }
691
+ }
692
+
693
+ tp.columns.move.$placeholder.each( function() {
694
+ tp.columns.move.$cell = $(this);
695
+ tp.columns.move.$cell.insertBefore( tp.columns.move.$cell.parent().children().eq( tp.columns.move.target_idx ) );
696
+ } );
697
+
698
+ if ( tp.columns.move.target_idx > tp.columns.move.source_idx ) {
699
+ tp.columns.move.target_idx -= 1;
700
+ }
701
+
702
+ tp.columns.move.source_idx = tp.columns.move.target_idx;
703
+ },
704
+ sort: function( event, ui ) {
705
+ tp.columns.move.$helper.css( 'left', ui.position.left );
706
+ },
707
+ stop: function( /* event, ui */ ) {
708
+ tp.columns.move.$helper.remove();
709
+ tp.columns.move.$cells
710
+ .each( function() {
711
+ tp.columns.move.$cell = $(this);
712
+ tp.columns.move.$cell.insertBefore( tp.columns.move.$cell.parent().find( '.move-placeholder' ) );
713
+ } )
714
+ .show();
715
+ tp.columns.move.$placeholder.remove();
716
+
717
+ tp.columns.move.source_idx = tp.columns.move.target_idx = -1;
718
+ tp.columns.move.$rows = tp.columns.move.$row_children = tp.columns.move.$cell = tp.columns.move.$cells = tp.columns.move.$placeholder = tp.columns.move.$helper = null;
719
+
720
+ tp.reindex();
721
+ }
722
+ },
723
+ number_to_letter: function( number ) {
724
+ var column = '';
725
+ while ( number > 0 ) {
726
+ column = String.fromCharCode( 65 + ( ( number-1) % 26 ) ) + column;
727
+ number = Math.floor( (number-1) / 26 );
728
+ }
729
+ return column;
730
+ }/*,
731
+ letter_to_number: function( column ) {
732
+ column = column.toUpperCase();
733
+ var count = column.length,
734
+ number = 0,
735
+ i;
736
+ for ( i = 0; i < count; i++ ) {
737
+ number += ( column.charCodeAt( count-1-i ) - 64 ) * Math.pow( 26, i );
738
+ }
739
+ return number;
740
+ }*/
741
+ };
742
+
743
+ tp.cells = {
744
+ $focus: $( null ),
745
+ $textarea: null,
746
+ autogrow: function( /* event */ ) {
747
+ tp.cells.$focus.removeClass( 'focus' );
748
+ tp.cells.$focus = $(this).closest( 'tr' ).addClass( 'focus' );
749
+ },
750
+ advanced_editor: {
751
+ prompt_shown: false,
752
+ keyopen: function( event ) {
753
+ if ( ! event.shiftKey ) {
754
+ return;
755
+ }
756
+
757
+ var $advanced_editor = $id( 'advanced-editor-content' );
758
+ tp.cells.$textarea = $(this).blur();
759
+ $advanced_editor.val( tp.cells.$textarea.val() );
760
+ $id( 'advanced-editor' ).wpdialog( 'open' );
761
+ $advanced_editor.get(0).selectionStart = $advanced_editor.get(0).selectionEnd = $advanced_editor.val().length;
762
+ $advanced_editor.focus();
763
+ },
764
+ buttonopen: function() {
765
+ if ( ! tp.cells.advanced_editor.prompt_shown ) {
766
+ if ( ! confirm( tablepress_strings.advanced_editor_open ) ) {
767
+ return;
768
+ }
769
+ }
770
+
771
+ tp.cells.advanced_editor.prompt_shown = true;
772
+ $id( 'edit-form-body' ).one( 'click', 'textarea', function() {
773
+ var $advanced_editor = $id( 'advanced-editor-content' );
774
+ tp.cells.$textarea = $(this).blur();
775
+ $advanced_editor.val( tp.cells.$textarea.val() );
776
+ $id( 'advanced-editor' ).wpdialog( 'open' );
777
+ $advanced_editor.get(0).selectionStart = $advanced_editor.get(0).selectionEnd = $advanced_editor.val().length;
778
+ $advanced_editor.focus();
779
+ } );
780
+ },
781
+ save: function() {
782
+ var $ve_content = $id( 'advanced-editor-content' ).blur().val();
783
+ if ( tp.cells.$textarea.val() !== $ve_content ) {
784
+ tp.cells.$textarea.val( $ve_content );
785
+ // position cursor at the end
786
+ tp.cells.$textarea.get(0).selectionStart = tp.cells.$textarea.get(0).selectionEnd = tp.cells.$textarea.val().length;
787
+ tp.table.set_table_changed();
788
+ }
789
+ tp.cells.$textarea.focus();
790
+ tp.cells.advanced_editor.close();
791
+ },
792
+ close: function() {
793
+ $id( 'advanced-editor' ).wpdialog( 'close' );
794
+ return false;
795
+ }
796
+ },
797
+ checkboxes: {
798
+ last_clicked: { '#edit-form-body' : false, '#edit-form-foot' : false },
799
+ multi_select: function ( event ) {
800
+ if ( 'undefined' === event.shiftKey ) {
801
+ return true;
802
+ }
803
+
804
+ if ( event.shiftKey ) {
805
+ if ( ! tp.cells.checkboxes.last_clicked[ event.data.parent ] ) {
806
+ return true;
807
+ }
808
+
809
+ var $checkboxes = $( event.data.parent ).find( ':checkbox' ),
810
+ first_cb = $checkboxes.index( tp.cells.checkboxes.last_clicked[ event.data.parent ] ),
811
+ last_cb = $checkboxes.index( this );
812
+ if ( first_cb !== last_cb ) {
813
+ $checkboxes.slice( Math.min( first_cb, last_cb ), Math.max( first_cb, last_cb ) ).prop( 'checked', $(this).prop( 'checked' ) );
814
+ }
815
+ }
816
+ tp.cells.checkboxes.last_clicked[ event.data.parent ] = this;
817
+ return true;
818
+ }
819
+ }
820
+ };
821
+
822
+ tp.content = {
823
+ link: {
824
+ prompt_shown: false,
825
+ add: function( /* event */ ) {
826
+ if ( ! tp.content.link.prompt_shown ) {
827
+ if ( ! confirm( tablepress_strings.link_add ) ) {
828
+ return;
829
+ }
830
+ }
831
+
832
+ tp.content.link.prompt_shown = true;
833
+ // mousedown instead of click to allow selection of text
834
+ // mousedown will set the desired target textarea, and mouseup anywhere will show the link box
835
+ // other approaches can lead to the wrong textarea being selected
836
+ $id( 'edit-form-body' ).one( 'mousedown', 'textarea', function() {
837
+ var editor_id = this.id;
838
+ $( document ).one( 'mouseup', function() {
839
+ if ( typeof wpLink !== 'undefined' ) {
840
+ wpLink.open( editor_id );
841
+ tp.table.set_table_changed();
842
+ }
843
+ } );
844
+ } );
845
+ }
846
+ },
847
+ image: {
848
+ prompt_shown: false,
849
+ add: function( /* event */ ) {
850
+ if ( ! tp.content.image.prompt_shown ) {
851
+ if ( ! confirm( tablepress_strings.image_add ) ) {
852
+ return;
853
+ }
854
+ }
855
+
856
+ tp.content.image.prompt_shown = true;
857
+ $id( 'edit-form-body' ).one( 'click', 'textarea', function() {
858
+ var editor = this.id,
859
+ options = {
860
+ frame: 'post',
861
+ state: 'insert',
862
+ title: wp.media.view.l10n.addMedia,
863
+ multiple: true
864
+ };
865
+
866
+ // Move caret to the end, to prevent inserting right between existing text, as that's ugly in small cells (though possible in the Advanced Editor and Insert Link dialog).
867
+ this.selectionStart = this.selectionEnd = this.value.length;
868
+
869
+ // Remove focus from the textarea to prevent Opera from showing the outline of the textarea above the modal.
870
+ // See: WP Core #22445
871
+ $(this).blur();
872
+
873
+ wp.media.editor.open( editor, options );
874
+ tp.table.set_table_changed();
875
+ } );
876
+ }
877
+ },
878
+ span: {
879
+ prompt_shown: false,
880
+ add: function( span ) {
881
+ var span_add_msg = ( '#rowspan#' === span ) ? tablepress_strings.rowspan_add : tablepress_strings.colspan_add;
882
+
883
+ // init object, due to string keys
884
+ if ( false === tp.content.span.prompt_shown ) {
885
+ tp.content.span.prompt_shown = {};
886
+ tp.content.span.prompt_shown['#rowspan#'] = tp.content.span.prompt_shown['#colspan#'] = false;
887
+ }
888
+
889
+ // Automatically deactivate DataTables, if cells are combined
890
+ if ( $id( 'option-use-datatables' ).prop( 'checked' ) ) {
891
+ if ( confirm( tablepress_strings.span_add_datatables_warning ) ) {
892
+ $id( 'option-use-datatables' ).prop( 'checked', false ).change();
893
+ } else {
894
+ return;
895
+ }
896
+ }
897
+
898
+ if ( ! tp.content.span.prompt_shown[ span ] ) {
899
+ if ( ! confirm( span_add_msg ) ) {
900
+ return;
901
+ }
902
+ }
903
+
904
+ tp.content.span.prompt_shown[ span ] = true;
905
+ $id( 'edit-form-body' ).one( 'click', 'textarea', function() {
906
+ var $textarea = $(this),
907
+ col_idx = $textarea.parent().index(),
908
+ row_idx = $textarea.closest( 'tr' ).index();
909
+ if ( '#rowspan#' === span ) {
910
+ if ( 0 === row_idx ) {
911
+ alert( tablepress_strings.no_rowspan_first_row );
912
+ return;
913
+ }
914
+ if ( tp.table.head && 1 === row_idx ) {
915
+ alert( tablepress_strings.no_rowspan_table_head );
916
+ return;
917
+ }
918
+ if ( tp.table.foot && ( tp.table.rows - 1 ) === row_idx ) {
919
+ alert( tablepress_strings.no_rowspan_table_foot );
920
+ return;
921
+ }
922
+ } else if ( ( '#colspan#' === span ) && ( tp.table.no_data_columns_pre === col_idx ) ) {
923
+ alert( tablepress_strings.no_colspan_first_col );
924
+ return;
925
+ }
926
+ $textarea.val( span );
927
+ tp.table.set_table_changed();
928
+ } );
929
+ }
930
+ }
931
+ };
932
+
933
+ tp.check = {
934
+ table_id: function( event ) {
935
+ if ( ( 37 === event.which ) || ( 39 === event.which ) ) {
936
+ return;
937
+ }
938
+ var $input = $(this);
939
+ $input.val( $input.val().replace( /[^0-9a-zA-Z-_]/g, '' ) );
940
+ },
941
+ changes_saved: function() {
942
+ if ( tp.made_changes ) {
943
+ return tablepress_strings.unsaved_changes_unload;
944
+ }
945
+ }
946
+ };
947
+
948
+ tp.reindex = function() {
949
+ var $row,
950
+ $rows = $id( 'edit-form-body' ).children(),
951
+ $cell, known_references = {};
952
+
953
+ tp.table.rows = $rows.length;
954
+ if ( tp.table.rows > 0 ) {
955
+ tp.table.columns = $rows.first().children().length - tp.table.no_data_columns_pre - tp.table.no_data_columns_post;
956
+ } else {
957
+ tp.table.columns = 0;
958
+ }
959
+
960
+ $rows
961
+ .each( function( row_idx, row ) {
962
+ $row = $( row );
963
+ $row.find( 'textarea' )
964
+ .val( function( column_idx, value ) {
965
+ // If the cell is not a formula, there's nothing to do here
966
+ if ( ( '' === value ) || ( '=' !== value.charAt(0) ) ) {
967
+ return value;
968
+ }
969
+
970
+ return value.replace( /([A-Z]+[0-9]+)(?::([A-Z]+[0-9]+))?/g, function( full_match, first_cell, second_cell ) {
971
+ // first_cell must always exist, while second_cell only exists in ranges like A4:B7
972
+ // we will use full_match as our result variable, so that we don't need an extra one
973
+
974
+ if ( ! known_references.hasOwnProperty( first_cell ) ) {
975
+ $cell = $id( 'cell-' + first_cell );
976
+ if ( $cell.length ) {
977
+ known_references[ first_cell ] = tp.columns.number_to_letter( $cell.parent().index() - tp.table.no_data_columns_pre + 1 ) + ( $cell.closest( 'tr' ).index() + 1 );
978
+ } else {
979
+ known_references[ first_cell ] = first_cell;
980
+ }
981
+ }
982
+ full_match = known_references[ first_cell ];
983
+
984
+ if ( ( 'undefined' !== typeof second_cell ) && ( '' !== second_cell ) ) { // Chrome and IE pass an undefined variable, while Firefox passes an empty string
985
+ if ( ! known_references.hasOwnProperty( second_cell ) ) {
986
+ $cell = $id( 'cell-' + second_cell );
987
+ if ( $cell.length ) {
988
+ known_references[ second_cell ] = tp.columns.number_to_letter( $cell.parent().index() - tp.table.no_data_columns_pre + 1 ) + ( $cell.closest( 'tr' ).index() + 1 );
989
+ } else {
990
+ known_references[ second_cell ] = second_cell;
991
+ }
992
+ }
993
+ full_match += ':' + known_references[ second_cell ];
994
+ }
995
+
996
+ return full_match;
997
+ } );
998
+ } )
999
+ .attr( 'name', function( column_idx /*, old_name */ ) {
1000
+ return 'table[data][' + row_idx + '][' + column_idx + ']';
1001
+ } );
1002
+
1003
+ $row.find( '.move-handle' ).html( row_idx + 1 );
1004
+ } )
1005
+ .each( function( row_idx, row ) { // need a second loop here to not break logic in previous loop, that queries textareas by their old ID
1006
+ $( row ).find( 'textarea' ).attr( 'id', function( column_idx /*, old_id */ ) {
1007
+ return 'cell-' + tp.columns.number_to_letter( column_idx + 1 ) + ( row_idx + 1 );
1008
+ } );
1009
+ });
1010
+ $id( 'edit-form-head' ).find( '.move-handle' )
1011
+ .html( function( idx ) { return tp.columns.number_to_letter( idx + 1 ); } );
1012
+
1013
+ $id( 'number-rows' ).val( tp.table.rows );
1014
+ $id( 'number-columns' ).val( tp.table.columns );
1015
+
1016
+ tp.table.set_table_changed();
1017
+ };
1018
+
1019
+ tp.save_changes = {
1020
+ trigger: function( event ) {
1021
+ // validation checks
1022
+ if ( $id( 'option-datatables-paginate' ).prop( 'checked' ) && ! ( /^[1-9][0-9]{0,4}$/ ).test( $id( 'option-datatables-paginate_entries' ).val() ) ) {
1023
+ alert( tablepress_strings.num_pagination_entries_invalid );
1024
+ $id( 'option-datatables-paginate_entries' ).focus().select();
1025
+ return;
1026
+ }
1027
+ if ( ( /[^A-Za-z0-9- _]/ ).test( $id( 'option-extra-css-classes' ).val() ) ) {
1028
+ alert( tablepress_strings.extra_css_classes_invalid );
1029
+ $id( 'option-extra-css-classes' ).focus().select();
1030
+ return;
1031
+ }
1032
+
1033
+ if ( event.shiftKey ) {
1034
+ tp.made_changes = false; // to prevent onunload warning
1035
+ $id( 'tablepress-page' ).find( 'form' ).submit();
1036
+ return;
1037
+ }
1038
+
1039
+ $(this).closest( 'p' ).append( '<span class="animation-saving spinner is-active" title="' + tablepress_strings.saving_changes + '"/>' );
1040
+ $( '.save-changes-button' ).prop( 'disabled', true );
1041
+ $( 'body' ).addClass( 'wait' );
1042
+
1043
+ $.ajax({
1044
+ 'type': 'POST',
1045
+ 'url': ajaxurl,
1046
+ 'data': tp.table.prepare_ajax_request( 'tablepress_save_table', '#nonce-edit-table' ),
1047
+ 'success': tp.save_changes.ajax_success,
1048
+ 'error': tp.save_changes.ajax_error,
1049
+ 'dataType': 'json'
1050
+ } );
1051
+ },
1052
+ ajax_success: function( data, status /*, jqXHR */ ) {
1053
+ if ( ( 'undefined' === typeof status ) || ( 'success' !== status ) ) {
1054
+ tp.save_changes.error( 'AJAX call successful, but unclear status. Try again while holding down the &#8220;Shift&#8221; key.' );
1055
+ } else if ( ( 'undefined' === typeof data ) || ( null === data ) || ( '-1' === data ) || ( 'undefined' === typeof data.success ) ) {
1056
+ tp.save_changes.error( 'AJAX call successful, but unclear data. Try again while holding down the &#8220;Shift&#8221; key.' );
1057
+ } else if ( true !== data.success ) {
1058
+ var debug_html = '';
1059
+ // Print debug information, if we are in debug mode
1060
+ if ( ( 'undefined' !== typeof data.error_details ) && ( tablepress_options.print_debug_output ) ) {
1061
+ debug_html = '</p><p>These errors were encountered:</p><pre>' + data.error_details + '</pre><p>'; // Some HTML magic because this is wrapped in <p> when printed
1062
+ }
1063
+ tp.save_changes.error( 'AJAX call successful, internal saving process failed. Try again while holding down the &#8220;Shift&#8221; key.' + debug_html );
1064
+ } else {
1065
+ tp.save_changes.success( data );
1066
+ }
1067
+ },
1068
+ ajax_error: function( jqXHR, status, error_thrown ) {
1069
+ tp.save_changes.error( 'AJAX call failed: ' + status + ' - ' + error_thrown + '. Try again while holding down the &#8220;Shift&#8221; key.' );
1070
+ },
1071
+ success: function( data ) {
1072
+ // saving was successful, so the original ID has changed to the (maybe) new ID -> we need to adjust all occurrences
1073
+ if ( tp.table.id !== data.table_id ) {
1074
+ // update URL (for HTML5 browsers only), but only if ID really changed, to not get dummy entries in the browser history
1075
+ if ( ( 'pushState' in window.history ) && null !== window.history.pushState ) {
1076
+ window.history.pushState( '', '', window.location.href.replace( /table_id=[0-9a-zA-Z-_]+/gi, 'table_id=' + data.table_id ) );
1077
+ }
1078
+ }
1079
+ // update CSS class for data field form
1080
+ $id( 'edit-form' ).removeClass( 'tablepress-edit-screen-id-' + tp.table.id ).addClass( 'tablepress-edit-screen-id-' + data.table_id );
1081
+ // update table ID in input fields (type text and hidden)
1082
+ tp.table.id = tp.table.new_id = data.table_id;
1083
+ $id( 'table-id' ).val( tp.table.id );
1084
+ $id( 'table-new-id' ).val( tp.table.new_id );
1085
+ // update the Shortcode text field
1086
+ $( '.table-shortcode' ).val( '[' + tablepress_options.shortcode + ' id=' + tp.table.new_id + ' /]' );
1087
+ // update the nonces
1088
+ $id( 'nonce-edit-table' ).val( data.new_edit_nonce );
1089
+ $id( 'nonce-preview-table' ).val( data.new_preview_nonce );
1090
+ // update URLs in Preview links
1091
+ var $show_preview_buttons = $( '.show-preview-button' );
1092
+ if ( $show_preview_buttons.length ) { // check necessary, because Preview button might not be visible
1093
+ $show_preview_buttons.attr( 'href',
1094
+ $show_preview_buttons.first().attr( 'href' )
1095
+ .replace( /item=[a-zA-Z0-9_-]+/g, 'item=' + data.table_id )
1096
+ .replace( /&_wpnonce=[a-z0-9]+/ig, '&_wpnonce=' + data.new_preview_nonce )
1097
+ );
1098
+ }
1099
+ // update last modified date and user nickname
1100
+ $id( 'last-modified' ).text( data.last_modified );
1101
+ $id( 'last-editor' ).text( data.last_editor );
1102
+ tp.table.unset_table_changed();
1103
+ tp.save_changes.after_saving_dialog( 'success', tablepress_strings[ data.message ] );
1104
+ },
1105
+ error: function( message ) {
1106
+ tp.save_changes.after_saving_dialog( 'error', message );
1107
+ },
1108
+ after_saving_dialog: function( type, message ) {
1109
+ if ( 'undefined' === typeof message ) {
1110
+ message = '';
1111
+ } else {
1112
+ message = ': ' + message;
1113
+ }
1114
+ var delay,
1115
+ div_class = 'save-changes-' + type;
1116
+ if ( 'success' === type ) {
1117
+ div_class += ' notice notice-success';
1118
+ delay = 3000;
1119
+ } else {
1120
+ div_class += ' notice notice-error';
1121
+ delay = 6000;
1122
+ }
1123
+ $( '.animation-saving' ).closest( 'p' )
1124
+ .after( '<div class="ajax-alert ' + div_class + '"><p>' + tablepress_strings['save_changes_' + type] + message + '</p></div>' );
1125
+ $( '.animation-saving' ).remove();
1126
+ $( '.save-changes-' + type ).delay( delay ).fadeOut( 2000, function() { $(this).remove(); } );
1127
+ $( '.save-changes-button' ).prop( 'disabled', false );
1128
+ $( 'body' ).removeClass( 'wait' );
1129
+ }
1130
+ };
1131
+
1132
+ tp.init = function() {
1133
+ var callbacks = {
1134
+ 'click': {
1135
+ '#rows-insert': tp.rows.insert,
1136
+ '#columns-insert': tp.columns.insert,
1137
+ '#rows-duplicate': tp.rows.duplicate,
1138
+ '#columns-duplicate': tp.columns.duplicate,
1139
+ '#rows-remove': tp.rows.remove,
1140
+ '#columns-remove': tp.columns.remove,
1141
+ '#rows-hide': tp.rows.hide,
1142
+ '#columns-hide': tp.columns.hide,
1143
+ '#rows-unhide': tp.rows.unhide,
1144
+ '#columns-unhide': tp.columns.unhide,
1145
+ '#rows-append': tp.rows.append,
1146
+ '#columns-append': tp.columns.append,
1147
+ '#link-add': tp.content.link.add,
1148
+ '#image-add': tp.content.image.add,
1149
+ '#span-add-rowspan': function() { tp.content.span.add( '#rowspan#' ); },
1150
+ '#span-add-colspan': function() { tp.content.span.add( '#colspan#' ); },
1151
+ '.show-preview-button': tp.table.preview.trigger,
1152
+ '.save-changes-button': tp.save_changes.trigger,
1153
+ '.show-help-box': function() {
1154
+ $(this).next().wpdialog( {
1155
+ title: $(this).attr( 'title' ),
1156
+ height: 420,
1157
+ width: 320,
1158
+ modal: true,
1159
+ dialogClass: 'wp-dialog',
1160
+ resizable: false
1161
+ } );
1162
+ }
1163
+ },
1164
+ 'keyup': {
1165
+ '#table-new-id': tp.check.table_id
1166
+ },
1167
+ 'change': {
1168
+ '#option-table-head': tp.table.change_table_head,
1169
+ '#option-table-foot': tp.table.change_table_foot,
1170
+ '#option-use-datatables': tp.table.change_datatables,
1171
+ '#option-datatables-paginate': tp.table.change_datatables_pagination
1172
+ },
1173
+ 'blur': {
1174
+ '#table-new-id': tp.table.change_id // onchange would not recognize changed values from tp.check.table_id
1175
+ }
1176
+ },
1177
+ $table = $id( 'edit-form-body' );
1178
+
1179
+ $.each( callbacks, function( event, event_callbacks ) {
1180
+ $.each( event_callbacks, function( selector, callback ) {
1181
+ $( selector ).on( event, callback );
1182
+ } );
1183
+ } );
1184
+
1185
+ $( window ).on( 'beforeunload', tp.check.changes_saved );
1186
+
1187
+ // do this before the next lines, to not trigger set_table_changed()
1188
+ $id( 'option-table-head' ).change(); // init changed/disabled states of DataTables JS features checkboxes
1189
+ $id( 'option-print-name' ).change( tp.table.change_print_name_description ).change(); // init dropdowns for name and description position
1190
+ $id( 'option-print-description' ).change( tp.table.change_print_name_description ).change();
1191
+
1192
+ // just once is enough, will be reset after saving
1193
+ $table.one( 'change', 'textarea', tp.table.set_table_changed );
1194
+ $( '#tablepress_edit-table-information, #tablepress_edit-table-options, #tablepress_edit-datatables-features' ).one( 'change', 'input, textarea, select', tp.table.set_table_changed );
1195
+
1196
+ if ( tablepress_options.cells_advanced_editor ) {
1197
+ $table.on( 'click', 'textarea', tp.cells.advanced_editor.keyopen );
1198
+ $id( 'advanced-editor-open' ).on( 'click', tp.cells.advanced_editor.buttonopen );
1199
+ $id( 'advanced-editor-confirm' ).on( 'click', tp.cells.advanced_editor.save );
1200
+ $id( 'advanced-editor-cancel' ).on( 'click', tp.cells.advanced_editor.close );
1201
+ $id( 'advanced-editor' ).wpdialog( {
1202
+ autoOpen: false,
1203
+ title: $id( 'advanced-editor-open' ).val(),
1204
+ width: 600,
1205
+ modal: true,
1206
+ dialogClass: 'wp-dialog',
1207
+ resizable: false
1208
+ } );
1209
+ // Fix issue with input fields not being usable (they are immediately losing focus without this) in the wpLink dialog when called through the "Advanced Editor"
1210
+ $id( 'wp-link' ).on( 'focus', 'input', function( event ) {
1211
+ event.stopPropagation();
1212
+ } );
1213
+ } else {
1214
+ $id( 'advanced-editor-open' ).hide();
1215
+ }
1216
+
1217
+ // Fix issue with input fields not being usable (they are immediately losing focus without this) in the sidebar of the new Media Manager
1218
+ $( 'body' ).on( 'focus', '.media-modal .media-frame-content input, .media-modal .media-frame-content textarea', function( event ) {
1219
+ event.stopPropagation();
1220
+ } );
1221
+
1222
+ if ( tablepress_options.cells_auto_grow ) {
1223
+ $table.on( 'focus', 'textarea', tp.cells.autogrow );
1224
+ }
1225
+
1226
+ $id( 'edit-form-body' ).on( 'click', 'input:checkbox', { parent: '#edit-form-body' }, tp.cells.checkboxes.multi_select );
1227
+ $id( 'edit-form-foot' ).on( 'click', 'input:checkbox', { parent: '#edit-form-foot' }, tp.cells.checkboxes.multi_select );
1228
+
1229
+ $id( 'edit-form-head' ).on( 'click', '.sort-control', tp.rows.sort );
1230
+
1231
+ // on form submit: Enable disabled fields, so that they are transmitted in the POST request
1232
+ $id( 'tablepress-page' ).find( 'form' ).on( 'submit', function() {
1233
+ $(this).find( '.tablepress-postbox-table' ).find( 'input, select' ).prop( 'disabled', false );
1234
+ } );
1235
+
1236
+ $table.sortable( {
1237
+ axis: 'y',
1238
+ containment: $id( 'edit-form' ), // to get better behavior when dragging before/after the first/last row
1239
+ forceHelperSize: true, // necessary?
1240
+ handle: '.move-handle',
1241
+ start: tp.rows.move.start,
1242
+ change: tp.rows.move.change,
1243
+ stop: tp.rows.move.stop,
1244
+ update: tp.reindex
1245
+ } ); // disableSelection() prohibits selection of text in textareas via keyboard
1246
+
1247
+ $id( 'edit-form-head' ).sortable( {
1248
+ axis: 'x',
1249
+ items: '.head',
1250
+ containment: 'parent',
1251
+ forceHelperSize: true, // necessary?
1252
+ helper: 'clone',
1253
+ handle: '.move-handle',
1254
+ start: tp.columns.move.start,
1255
+ stop: tp.columns.move.stop,
1256
+ change: tp.columns.move.change,
1257
+ sort: tp.columns.move.sort
1258
+ } ).disableSelection();
1259
+ };
1260
+
1261
+ // Run TablePress initialization.
1262
+ tp.init();
1263
+
1264
+ } );
admin/js/edit.min.js ADDED
@@ -0,0 +1 @@
 
1
+ window.tp=window.tp||{},jQuery(document).ready(function(a){"use strict";var b=function(b){return a(document.getElementById(b))};tp.made_changes=!1,tp.table={id:b("table-id").val(),new_id:b("table-new-id").val(),rows:parseInt(b("number-rows").val(),10),columns:parseInt(b("number-columns").val(),10),head:b("option-table-head").prop("checked"),foot:b("option-table-foot").prop("checked"),no_data_columns_pre:2,no_data_columns_post:1,body_cells_pre:'<tr><td><span class="move-handle"></span></td><td><input type="checkbox" /><input type="hidden" class="visibility" name="table[visibility][rows][]" value="1" /></td>',body_cells_post:'<td><span class="move-handle"></span></td></tr>',body_cell:'<td><textarea rows="1"></textarea></td>',head_cell:'<th class="head"><span class="sort-control sort-desc" title="'+tablepress_strings.sort_desc+'"><span class="sorting-indicator"></span></span><span class="sort-control sort-asc" title="'+tablepress_strings.sort_asc+'"><span class="sorting-indicator"></span></span><span class="move-handle"></span></th>',foot_cell:'<th><input type="checkbox" /><input type="hidden" class="visibility" name="table[visibility][columns][]" value="1" /></th>',set_table_changed:function(){tp.made_changes=!0},unset_table_changed:function(){tp.made_changes=!1,b("edit-form-body").one("change","textarea",tp.table.set_table_changed),a("#tablepress_edit-table-information, #tablepress_edit-table-options, #tablepress_edit-datatables-features").one("change","input, textarea, select",tp.table.set_table_changed)},change_id:function(){return""===a.trim(b("table-new-id").val())?(alert(tablepress_strings.table_id_not_empty),void b("table-new-id").val(tp.table.new_id).focus().select()):"0"===a.trim(b("table-new-id").val())?(alert(tablepress_strings.table_id_not_zero),void b("table-new-id").val(tp.table.new_id).focus().select()):void(this.value!==tp.table.new_id&&(confirm(tablepress_strings.ays_change_table_id)?(tp.table.new_id=this.value,a(".table-shortcode").val("["+tablepress_options.shortcode+" id="+tp.table.new_id+" /]").click(),tp.table.set_table_changed()):a(this).val(tp.table.new_id)))},change_table_head:function(){tp.table.head=a(this).prop("checked"),b("option-use-datatables").prop("disabled",!tp.table.head).change(),b("notice-datatables-head-row").toggle(!tp.table.head),tp.rows.stripe()},change_table_foot:function(){tp.table.foot=a(this).prop("checked"),tp.rows.stripe()},change_print_name_description:function(){b(this.id+"-position").prop("disabled",!a(this).prop("checked"))},change_datatables:function(){var a=b("option-use-datatables"),c=!(a.prop("checked")&&!a.prop("disabled"));a.closest("tbody").find("input").not(a).prop("disabled",c),tp.table.change_datatables_pagination()},change_datatables_pagination:function(){var a=b("option-datatables-paginate"),c=a.prop("checked")&&!a.prop("disabled");b("option-datatables-lengthchange").prop("disabled",!c),b("option-datatables-paginate_entries").prop("disabled",!c)},prepare_ajax_request:function(c,d){var e,f=b("edit-form-body"),g=[],h={rows:tp.table.rows,columns:tp.table.columns,hidden_rows:0,hidden_columns:0},i={rows:[],columns:[]};return f.children().each(function(b,c){g[b]=a(c).find("textarea").map(function(){return a(this).val()}).get()}),g=JSON.stringify(g),e={table_head:tp.table.head,table_foot:tp.table.foot,alternating_row_colors:b("option-alternating-row-colors").prop("checked"),row_hover:b("option-row-hover").prop("checked"),print_name:b("option-print-name").prop("checked"),print_description:b("option-print-description").prop("checked"),print_name_position:b("option-print-name-position").val(),print_description_position:b("option-print-description-position").val(),extra_css_classes:b("option-extra-css-classes").val(),use_datatables:b("option-use-datatables").prop("checked"),datatables_sort:b("option-datatables-sort").prop("checked"),datatables_filter:b("option-datatables-filter").prop("checked"),datatables_paginate:b("option-datatables-paginate").prop("checked"),datatables_lengthchange:b("option-datatables-lengthchange").prop("checked"),datatables_paginate_entries:b("option-datatables-paginate_entries").val(),datatables_info:b("option-datatables-info").prop("checked"),datatables_scrollx:b("option-datatables-scrollx").prop("checked"),datatables_custom_commands:b("option-datatables-custom-commands").val()},e=JSON.stringify(e),i.rows=f.find('input[type="hidden"]').map(function(){return"1"===a(this).val()?1:(h.hidden_rows+=1,0)}).get(),i.columns=b("edit-form-foot").find('input[type="hidden"]').map(function(){return"1"===a(this).val()?1:(h.hidden_columns+=1,0)}).get(),i=JSON.stringify(i),{action:c,_ajax_nonce:a(d).val(),tablepress:{id:tp.table.id,new_id:tp.table.new_id,name:b("table-name").val(),description:b("table-description").val(),number:h,data:g,options:e,visibility:i}}},preview:{trigger:function(){return tp.made_changes?b("option-datatables-paginate").prop("checked")&&!/^[1-9][0-9]{0,4}$/.test(b("option-datatables-paginate_entries").val())?(alert(tablepress_strings.num_pagination_entries_invalid),void b("option-datatables-paginate_entries").focus().select()):/[^A-Za-z0-9- _]/.test(b("option-extra-css-classes").val())?(alert(tablepress_strings.extra_css_classes_invalid),void b("option-extra-css-classes").focus().select()):(a(this).closest("p").append('<span class="animation-preview spinner is-active" title="'+tablepress_strings.preparing_preview+'"/>'),a("body").addClass("wait"),b("table-preview").empty(),a.ajax({type:"POST",url:ajaxurl,data:tp.table.prepare_ajax_request("tablepress_preview_table","#nonce-preview-table"),success:tp.table.preview.ajax_success,error:tp.table.preview.ajax_error,dataType:"json"}),!1):(tp.table.preview.show(a(this).attr("href")+"&TB_iframe=true"),!1)},ajax_success:function(a,b){"undefined"==typeof b||"success"!==b?tp.table.preview.error("AJAX call successful, but unclear status."):"undefined"==typeof a||null===a||"-1"===a||"undefined"==typeof a.success||!0!==a.success?tp.table.preview.error("AJAX call successful, but unclear data."):tp.table.preview.success(a)},ajax_error:function(a,b,c){tp.table.preview.error("AJAX call failed: "+b+" - "+c)},success:function(c){b("table-preview").empty(),a('<iframe id="table-preview-iframe" />').load(function(){var b=a(this).contents();b.find("head").append(c.head_html),b.find("body").append(c.body_html)}).appendTo("#table-preview"),a(".animation-preview").remove(),a("body").removeClass("wait"),tp.table.preview.show("#TB_inline?inlineId=preview-container")},error:function(b){a(".animation-preview").closest("p").after('<div class="ajax-alert preview-error error"><p>'+tablepress_strings.preview_error+": "+b+"</p></div>"),a(".animation-preview").remove(),a(".preview-error").delay(6e3).fadeOut(2e3,function(){a(this).remove()}),a("body").removeClass("wait")},show:function(b){var c=a(window).width()-120,d=a(window).height()-120;a("#wpadminbar").length&&(d-=parseInt(a("#wpadminbar").css("height"),10)),tb_show(a(".show-preview-button").first().text(),b+"&height="+d+"&width="+c,!1)}}},tp.rows={create:function(c){var d,e,f,g="";for(d=0;c>d;d++){for(g+=tp.table.body_cells_pre,e=0;e<tp.table.columns;e++)g+=tp.table.body_cell;g+=tp.table.body_cells_post}return f=b("edit-form-foot").find(".column-hidden").map(function(){return a(this).index()}).get(),a(g).each(function(b,c){a(c).children().filter(function(b){return-1!==a.inArray(b,f)}).addClass("column-hidden")})},append:function(){var a=b("rows-append-number").val();return/^[1-9][0-9]{0,4}$/.test(a)?(b("edit-form-body").append(tp.rows.create(a)),tp.rows.stripe(),void tp.reindex()):(alert(tablepress_strings.append_num_rows_invalid),void b("rows-append-number").focus().select())},insert:function(a){var c=b("edit-form-body").find("input:checked").prop("checked",a.shiftKey).closest("tr");return 0===c.length?void alert(tablepress_strings.no_rows_selected):(c.before(tp.rows.create(1)),tp.rows.stripe(),void tp.reindex())},duplicate:function(c){var d=b("edit-form-body").find("input:checked").prop("checked",c.shiftKey).closest("tr");return 0===d.length?void alert(tablepress_strings.no_rows_selected):(d.each(function(b,c){var d=a(c),e=d.find("textarea"),f=d.clone();f.find("textarea").removeAttr("id").each(function(b,c){a(c).val(e.eq(b).val())}),d.after(f)}),tp.rows.stripe(),void tp.reindex())},hide:function(a){var c=b("edit-form-body").find("input:checked").prop("checked",a.shiftKey).closest("tr");return 0===c.length?void alert(tablepress_strings.no_rows_selected):(c.addClass("row-hidden").find(".visibility").val("0"),tp.rows.stripe(),void tp.table.set_table_changed())},unhide:function(a){var c=b("edit-form-body").find("input:checked").prop("checked",a.shiftKey).closest("tr");return 0===c.length?void alert(tablepress_strings.no_rows_selected):(c.removeClass("row-hidden").find(".visibility").val("1"),tp.rows.stripe(),void tp.table.set_table_changed())},remove:function(){var a,c=b("edit-form-body").find("input:checked").closest("tr");return 0===c.length?void alert(tablepress_strings.no_rows_selected):tp.table.rows===c.length?void alert(tablepress_strings.no_remove_all_rows):(a=1===c.length?tablepress_strings.ays_remove_rows_singular:tablepress_strings.ays_remove_rows_plural,void(confirm(a)&&(c.remove(),tp.rows.stripe(),tp.reindex())))},move:{start:function(b,c){a(c.placeholder).removeClass("row-hidden").css("visibility","visible").html('<td colspan="'+(tp.table.columns+tp.table.no_data_columns_pre+tp.table.no_data_columns_post)+'"><div/></td>'),a(c.helper).removeClass("odd head-row foot-row")},change:function(a,b){tp.rows.stripe(b.helper)},stop:function(){tp.rows.stripe()}},sort:function(){var b=a(this).parent().index(),c=a(this).hasClass("sort-asc")?1:-1,d=a("#edit-form-body"),e=d.find(".head-row").prevAll().addBack(),f=d.find(".foot-row").nextAll().addBack(),g=d.children().not(e).not(f).get(),h=function(a,b){var c,d,e,f,g=/(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,h=/(^[ ]*|[ ]*$)/g,i=/(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,j=/^0x[0-9a-f]+$/i,k=/^0/,l=a.replace(h,"")||"",m=b.replace(h,"")||"",n=l.replace(g,"\x00$1\x00").replace(/\0$/,"").replace(/^\0/,"").split("\x00"),o=m.replace(g,"\x00$1\x00").replace(/\0$/,"").replace(/^\0/,"").split("\x00"),p=parseInt(l.match(j),10)||1!==n.length&&l.match(i)&&Date.parse(l),q=parseInt(m.match(j),10)||p&&m.match(i)&&Date.parse(m)||null;if(q){if(q>p)return-1;if(p>q)return 1}for(e=0,f=Math.max(n.length,o.length);f>e;e++){if(c=!(n[e]||"").match(k)&&parseFloat(n[e])||n[e]||0,d=!(o[e]||"").match(k)&&parseFloat(o[e])||o[e]||0,isNaN(c)!==isNaN(d))return isNaN(c)?1:-1;if(typeof c!=typeof d&&(c+="",d+=""),d>c)return-1;if(c>d)return 1}return 0};a.each(g,function(c,d){d.sort_key=(""+a(d).children().eq(b).find("textarea").val()).toLowerCase()}),g.sort(function(a,b){return c*h(a.sort_key,b.sort_key)}),a.each(g,function(a,b){b.sort_key=null}),d.append(e),d.append(g),d.append(f),tp.rows.stripe(),tp.reindex()},stripe:function(c){"undefined"==typeof c&&(c=null),c=a(c);var d=b("edit-form-body").children().removeClass("odd head-row foot-row").not(c);d.filter(":even").addClass("odd"),d=d.not(".row-hidden"),c.hasClass("row-hidden")&&(d=d.not(".ui-sortable-placeholder")),tp.table.head&&d.first().addClass("head-row"),tp.table.foot&&d.last().addClass("foot-row")}},tp.columns={append:function(){var c,d=b("columns-append-number").val(),e="",f="",g="";if(!/^[1-9][0-9]{0,4}$/.test(d))return alert(tablepress_strings.append_num_columns_invalid),void b("columns-append-number").focus().select();for(c=0;d>c;c++)f+=tp.table.body_cell,e+=tp.table.head_cell,g+=tp.table.foot_cell;b("edit-form-body").children().each(function(b,c){a(c).children().slice(-tp.table.no_data_columns_post).before(f)}),b("edit-form-head").children().slice(-tp.table.no_data_columns_post).before(e),b("edit-form-foot").children().slice(-tp.table.no_data_columns_post).before(g),tp.reindex()},insert:function(c){var d,e=b("edit-form-foot").find("input:checked").prop("checked",c.shiftKey).closest("th");return 0===e.length?void alert(tablepress_strings.no_columns_selected):(d=e.map(function(){return a(this).index()}).get(),b("edit-form-body").children().each(function(b,c){a(c).children().filter(function(b){return-1!==a.inArray(b,d)}).before(tp.table.body_cell)}),b("edit-form-head").children().filter(function(b){return-1!==a.inArray(b,d)}).before(tp.table.head_cell),e.before(tp.table.foot_cell),void tp.reindex())},duplicate:function(c){var d,e=b("edit-form-foot").find("input:checked").prop("checked",c.shiftKey).closest("th");return 0===e.length?void alert(tablepress_strings.no_columns_selected):(d=e.map(function(){return a(this).index()}).get(),b("edit-form").find("tr").each(function(b,c){a(c).children().each(function(b,c){if(-1!==a.inArray(b,d)){var e=a(c),f=e.clone();f.find("textarea").removeAttr("id").val(e.find("textarea").val()),e.after(f)}})}),void tp.reindex())},hide:function(c){var d,e=b("edit-form-foot").find("input:checked").prop("checked",c.shiftKey).closest("th");return 0===e.length?void alert(tablepress_strings.no_columns_selected):(d=e.map(function(){return a(this).index()}).get(),b("edit-form-body").children().add("#edit-form-head").each(function(b,c){a(c).children().filter(function(b){return-1!==a.inArray(b,d)}).addClass("column-hidden")}),e.addClass("column-hidden").find(".visibility").val("0"),void tp.table.set_table_changed())},unhide:function(c){var d,e=b("edit-form-foot").find("input:checked").prop("checked",c.shiftKey).closest("th");return 0===e.length?void alert(tablepress_strings.no_columns_selected):(d=e.map(function(){return a(this).index()}).get(),b("edit-form-body").children().add("#edit-form-head").each(function(b,c){a(c).children().filter(function(b){return-1!==a.inArray(b,d)}).removeClass("column-hidden")}),e.removeClass("column-hidden").find(".visibility").val("1"),void tp.table.set_table_changed())},remove:function(){var c,d,e=b("edit-form-foot").find("input:checked").closest("th");return 0===e.length?void alert(tablepress_strings.no_columns_selected):tp.table.columns===e.length?void alert(tablepress_strings.no_remove_all_columns):(d=1===e.length?tablepress_strings.ays_remove_columns_singular:tablepress_strings.ays_remove_columns_plural,void(confirm(d)&&(c=e.map(function(){return a(this).index()}).get(),b("edit-form-body").children().add("#edit-form-head").each(function(b,d){a(d).children().filter(function(b){return-1!==a.inArray(b,c)}).remove()}),e.remove(),tp.reindex())))},move:{source_idx:-1,target_idx:-1,$rows:null,$row_children:null,$cell:null,$cells:null,$placeholder:null,$helper:null,start:function(c,d){var e,f=a(d.item);tp.columns.move.source_idx=f.index(),tp.columns.move.$rows=b("edit-form-body").children().add("#edit-form-foot"),tp.columns.move.$cells=tp.columns.move.$rows.find(":nth-child("+(tp.columns.move.source_idx+1)+")").each(function(){tp.columns.move.$cell=a(this),a('<td class="move-placeholder"><div/></td>').insertBefore(tp.columns.move.$cell),tp.columns.move.$cell.insertAfter(tp.columns.move.$cell.nextAll().last()).clone().addClass("move-hover").insertAfter(tp.columns.move.$cell).find("textarea").val(tp.columns.move.$cell.find("textarea").val())}).hide(),tp.columns.move.$helper=tp.columns.move.$rows.find(".move-hover"),e=tp.columns.move.$helper.eq(1).width(),tp.columns.move.$helper.eq(0).width(e),tp.columns.move.$placeholder=tp.columns.move.$rows.find(".move-placeholder"),tp.columns.move.$placeholder.find("div").width(e)},change:function(b,c){tp.columns.move.target_idx=a(c.placeholder).index(),tp.columns.move.target_idx-tp.columns.move.source_idx===1?tp.columns.move.target_idx+=1:tp.columns.move.target_idx===tp.columns.move.source_idx&&(tp.columns.move.target_idx-=1),tp.columns.move.$placeholder.each(function(){tp.columns.move.$cell=a(this),tp.columns.move.$cell.insertBefore(tp.columns.move.$cell.parent().children().eq(tp.columns.move.target_idx))}),tp.columns.move.target_idx>tp.columns.move.source_idx&&(tp.columns.move.target_idx-=1),tp.columns.move.source_idx=tp.columns.move.target_idx},sort:function(a,b){tp.columns.move.$helper.css("left",b.position.left)},stop:function(){tp.columns.move.$helper.remove(),tp.columns.move.$cells.each(function(){tp.columns.move.$cell=a(this),tp.columns.move.$cell.insertBefore(tp.columns.move.$cell.parent().find(".move-placeholder"))}).show(),tp.columns.move.$placeholder.remove(),tp.columns.move.source_idx=tp.columns.move.target_idx=-1,tp.columns.move.$rows=tp.columns.move.$row_children=tp.columns.move.$cell=tp.columns.move.$cells=tp.columns.move.$placeholder=tp.columns.move.$helper=null,tp.reindex()}},number_to_letter:function(a){for(var b="";a>0;)b=String.fromCharCode(65+(a-1)%26)+b,a=Math.floor((a-1)/26);return b}},tp.cells={$focus:a(null),$textarea:null,autogrow:function(){tp.cells.$focus.removeClass("focus"),tp.cells.$focus=a(this).closest("tr").addClass("focus")},advanced_editor:{prompt_shown:!1,keyopen:function(c){if(c.shiftKey){var d=b("advanced-editor-content");tp.cells.$textarea=a(this).blur(),d.val(tp.cells.$textarea.val()),b("advanced-editor").wpdialog("open"),d.get(0).selectionStart=d.get(0).selectionEnd=d.val().length,d.focus()}},buttonopen:function(){(tp.cells.advanced_editor.prompt_shown||confirm(tablepress_strings.advanced_editor_open))&&(tp.cells.advanced_editor.prompt_shown=!0,b("edit-form-body").one("click","textarea",function(){var c=b("advanced-editor-content");tp.cells.$textarea=a(this).blur(),c.val(tp.cells.$textarea.val()),b("advanced-editor").wpdialog("open"),c.get(0).selectionStart=c.get(0).selectionEnd=c.val().length,c.focus()}))},save:function(){var a=b("advanced-editor-content").blur().val();tp.cells.$textarea.val()!==a&&(tp.cells.$textarea.val(a),tp.cells.$textarea.get(0).selectionStart=tp.cells.$textarea.get(0).selectionEnd=tp.cells.$textarea.val().length,tp.table.set_table_changed()),tp.cells.$textarea.focus(),tp.cells.advanced_editor.close()},close:function(){return b("advanced-editor").wpdialog("close"),!1}},checkboxes:{last_clicked:{"#edit-form-body":!1,"#edit-form-foot":!1},multi_select:function(b){if("undefined"===b.shiftKey)return!0;if(b.shiftKey){if(!tp.cells.checkboxes.last_clicked[b.data.parent])return!0;var c=a(b.data.parent).find(":checkbox"),d=c.index(tp.cells.checkboxes.last_clicked[b.data.parent]),e=c.index(this);d!==e&&c.slice(Math.min(d,e),Math.max(d,e)).prop("checked",a(this).prop("checked"))}return tp.cells.checkboxes.last_clicked[b.data.parent]=this,!0}}},tp.content={link:{prompt_shown:!1,add:function(){(tp.content.link.prompt_shown||confirm(tablepress_strings.link_add))&&(tp.content.link.prompt_shown=!0,b("edit-form-body").one("mousedown","textarea",function(){var b=this.id;a(document).one("mouseup",function(){"undefined"!=typeof wpLink&&(wpLink.open(b),tp.table.set_table_changed())})}))}},image:{prompt_shown:!1,add:function(){(tp.content.image.prompt_shown||confirm(tablepress_strings.image_add))&&(tp.content.image.prompt_shown=!0,b("edit-form-body").one("click","textarea",function(){var b=this.id,c={frame:"post",state:"insert",title:wp.media.view.l10n.addMedia,multiple:!0};this.selectionStart=this.selectionEnd=this.value.length,a(this).blur(),wp.media.editor.open(b,c),tp.table.set_table_changed()}))}},span:{prompt_shown:!1,add:function(c){var d="#rowspan#"===c?tablepress_strings.rowspan_add:tablepress_strings.colspan_add;if(!1===tp.content.span.prompt_shown&&(tp.content.span.prompt_shown={},tp.content.span.prompt_shown["#rowspan#"]=tp.content.span.prompt_shown["#colspan#"]=!1),b("option-use-datatables").prop("checked")){if(!confirm(tablepress_strings.span_add_datatables_warning))return;b("option-use-datatables").prop("checked",!1).change()}(tp.content.span.prompt_shown[c]||confirm(d))&&(tp.content.span.prompt_shown[c]=!0,b("edit-form-body").one("click","textarea",function(){var b=a(this),d=b.parent().index(),e=b.closest("tr").index();if("#rowspan#"===c){if(0===e)return void alert(tablepress_strings.no_rowspan_first_row);if(tp.table.head&&1===e)return void alert(tablepress_strings.no_rowspan_table_head);if(tp.table.foot&&tp.table.rows-1===e)return void alert(tablepress_strings.no_rowspan_table_foot)}else if("#colspan#"===c&&tp.table.no_data_columns_pre===d)return void alert(tablepress_strings.no_colspan_first_col);b.val(c),tp.table.set_table_changed()}))}}},tp.check={table_id:function(b){if(37!==b.which&&39!==b.which){var c=a(this);c.val(c.val().replace(/[^0-9a-zA-Z-_]/g,""))}},changes_saved:function(){return tp.made_changes?tablepress_strings.unsaved_changes_unload:void 0}},tp.reindex=function(){var c,d,e=b("edit-form-body").children(),f={};tp.table.rows=e.length,tp.table.rows>0?tp.table.columns=e.first().children().length-tp.table.no_data_columns_pre-tp.table.no_data_columns_post:tp.table.columns=0,e.each(function(e,g){c=a(g),c.find("textarea").val(function(a,c){return""===c||"="!==c.charAt(0)?c:c.replace(/([A-Z]+[0-9]+)(?::([A-Z]+[0-9]+))?/g,function(a,c,e){return f.hasOwnProperty(c)||(d=b("cell-"+c),d.length?f[c]=tp.columns.number_to_letter(d.parent().index()-tp.table.no_data_columns_pre+1)+(d.closest("tr").index()+1):f[c]=c),a=f[c],"undefined"!=typeof e&&""!==e&&(f.hasOwnProperty(e)||(d=b("cell-"+e),d.length?f[e]=tp.columns.number_to_letter(d.parent().index()-tp.table.no_data_columns_pre+1)+(d.closest("tr").index()+1):f[e]=e),a+=":"+f[e]),a})}).attr("name",function(a){return"table[data]["+e+"]["+a+"]"}),c.find(".move-handle").html(e+1)}).each(function(b,c){a(c).find("textarea").attr("id",function(a){return"cell-"+tp.columns.number_to_letter(a+1)+(b+1)})}),b("edit-form-head").find(".move-handle").html(function(a){return tp.columns.number_to_letter(a+1)}),b("number-rows").val(tp.table.rows),b("number-columns").val(tp.table.columns),tp.table.set_table_changed()},tp.save_changes={trigger:function(c){return b("option-datatables-paginate").prop("checked")&&!/^[1-9][0-9]{0,4}$/.test(b("option-datatables-paginate_entries").val())?(alert(tablepress_strings.num_pagination_entries_invalid),void b("option-datatables-paginate_entries").focus().select()):/[^A-Za-z0-9- _]/.test(b("option-extra-css-classes").val())?(alert(tablepress_strings.extra_css_classes_invalid),void b("option-extra-css-classes").focus().select()):c.shiftKey?(tp.made_changes=!1,void b("tablepress-page").find("form").submit()):(a(this).closest("p").append('<span class="animation-saving spinner is-active" title="'+tablepress_strings.saving_changes+'"/>'),a(".save-changes-button").prop("disabled",!0),a("body").addClass("wait"),void a.ajax({type:"POST",url:ajaxurl,data:tp.table.prepare_ajax_request("tablepress_save_table","#nonce-edit-table"),success:tp.save_changes.ajax_success,error:tp.save_changes.ajax_error,dataType:"json"}))},ajax_success:function(a,b){if("undefined"==typeof b||"success"!==b)tp.save_changes.error("AJAX call successful, but unclear status. Try again while holding down the &#8220;Shift&#8221; key.");else if("undefined"==typeof a||null===a||"-1"===a||"undefined"==typeof a.success)tp.save_changes.error("AJAX call successful, but unclear data. Try again while holding down the &#8220;Shift&#8221; key.");else if(!0!==a.success){var c="";"undefined"!=typeof a.error_details&&tablepress_options.print_debug_output&&(c="</p><p>These errors were encountered:</p><pre>"+a.error_details+"</pre><p>"),tp.save_changes.error("AJAX call successful, internal saving process failed. Try again while holding down the &#8220;Shift&#8221; key."+c)}else tp.save_changes.success(a)},ajax_error:function(a,b,c){tp.save_changes.error("AJAX call failed: "+b+" - "+c+". Try again while holding down the &#8220;Shift&#8221; key.")},success:function(c){tp.table.id!==c.table_id&&"pushState"in window.history&&null!==window.history.pushState&&window.history.pushState("","",window.location.href.replace(/table_id=[0-9a-zA-Z-_]+/gi,"table_id="+c.table_id)),b("edit-form").removeClass("tablepress-edit-screen-id-"+tp.table.id).addClass("tablepress-edit-screen-id-"+c.table_id),tp.table.id=tp.table.new_id=c.table_id,b("table-id").val(tp.table.id),b("table-new-id").val(tp.table.new_id),a(".table-shortcode").val("["+tablepress_options.shortcode+" id="+tp.table.new_id+" /]"),b("nonce-edit-table").val(c.new_edit_nonce),b("nonce-preview-table").val(c.new_preview_nonce);var d=a(".show-preview-button");d.length&&d.attr("href",d.first().attr("href").replace(/item=[a-zA-Z0-9_-]+/g,"item="+c.table_id).replace(/&_wpnonce=[a-z0-9]+/gi,"&_wpnonce="+c.new_preview_nonce)),b("last-modified").text(c.last_modified),b("last-editor").text(c.last_editor),tp.table.unset_table_changed(),tp.save_changes.after_saving_dialog("success",tablepress_strings[c.message])},error:function(a){tp.save_changes.after_saving_dialog("error",a)},after_saving_dialog:function(b,c){c="undefined"==typeof c?"":": "+c;var d,e="save-changes-"+b;"success"===b?(e+=" notice notice-success",d=3e3):(e+=" notice notice-error",d=6e3),a(".animation-saving").closest("p").after('<div class="ajax-alert '+e+'"><p>'+tablepress_strings["save_changes_"+b]+c+"</p></div>"),a(".animation-saving").remove(),a(".save-changes-"+b).delay(d).fadeOut(2e3,function(){a(this).remove()}),a(".save-changes-button").prop("disabled",!1),a("body").removeClass("wait")}},tp.init=function(){var c={click:{"#rows-insert":tp.rows.insert,"#columns-insert":tp.columns.insert,"#rows-duplicate":tp.rows.duplicate,"#columns-duplicate":tp.columns.duplicate,"#rows-remove":tp.rows.remove,"#columns-remove":tp.columns.remove,"#rows-hide":tp.rows.hide,"#columns-hide":tp.columns.hide,"#rows-unhide":tp.rows.unhide,"#columns-unhide":tp.columns.unhide,"#rows-append":tp.rows.append,"#columns-append":tp.columns.append,"#link-add":tp.content.link.add,"#image-add":tp.content.image.add,"#span-add-rowspan":function(){tp.content.span.add("#rowspan#")},"#span-add-colspan":function(){tp.content.span.add("#colspan#")},".show-preview-button":tp.table.preview.trigger,".save-changes-button":tp.save_changes.trigger,".show-help-box":function(){a(this).next().wpdialog({title:a(this).attr("title"),height:420,width:320,modal:!0,dialogClass:"wp-dialog",resizable:!1})}},keyup:{"#table-new-id":tp.check.table_id},change:{"#option-table-head":tp.table.change_table_head,"#option-table-foot":tp.table.change_table_foot,"#option-use-datatables":tp.table.change_datatables,"#option-datatables-paginate":tp.table.change_datatables_pagination},blur:{"#table-new-id":tp.table.change_id}},d=b("edit-form-body");a.each(c,function(b,c){a.each(c,function(c,d){a(c).on(b,d)})}),a(window).on("beforeunload",tp.check.changes_saved),b("option-table-head").change(),b("option-print-name").change(tp.table.change_print_name_description).change(),b("option-print-description").change(tp.table.change_print_name_description).change(),d.one("change","textarea",tp.table.set_table_changed),a("#tablepress_edit-table-information, #tablepress_edit-table-options, #tablepress_edit-datatables-features").one("change","input, textarea, select",tp.table.set_table_changed),tablepress_options.cells_advanced_editor?(d.on("click","textarea",tp.cells.advanced_editor.keyopen),b("advanced-editor-open").on("click",tp.cells.advanced_editor.buttonopen),b("advanced-editor-confirm").on("click",tp.cells.advanced_editor.save),b("advanced-editor-cancel").on("click",tp.cells.advanced_editor.close),b("advanced-editor").wpdialog({autoOpen:!1,title:b("advanced-editor-open").val(),width:600,modal:!0,dialogClass:"wp-dialog",resizable:!1}),b("wp-link").on("focus","input",function(a){a.stopPropagation()})):b("advanced-editor-open").hide(),a("body").on("focus",".media-modal .media-frame-content input, .media-modal .media-frame-content textarea",function(a){a.stopPropagation()}),tablepress_options.cells_auto_grow&&d.on("focus","textarea",tp.cells.autogrow),b("edit-form-body").on("click","input:checkbox",{parent:"#edit-form-body"},tp.cells.checkboxes.multi_select),b("edit-form-foot").on("click","input:checkbox",{parent:"#edit-form-foot"},tp.cells.checkboxes.multi_select),b("edit-form-head").on("click",".sort-control",tp.rows.sort),b("tablepress-page").find("form").on("submit",function(){a(this).find(".tablepress-postbox-table").find("input, select").prop("disabled",!1)}),d.sortable({axis:"y",containment:b("edit-form"),forceHelperSize:!0,handle:".move-handle",start:tp.rows.move.start,change:tp.rows.move.change,stop:tp.rows.move.stop,update:tp.reindex}),b("edit-form-head").sortable({axis:"x",items:".head",containment:"parent",forceHelperSize:!0,helper:"clone",handle:".move-handle",start:tp.columns.move.start,stop:tp.columns.move.stop,change:tp.columns.move.change,sort:tp.columns.move.sort}).disableSelection()},tp.init()});
admin/js/export.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for the "Export" screen
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ jQuery( document ).ready( function( $ ) {
11
+
12
+ 'use strict';
13
+
14
+ /**
15
+ * Check, whether inputs are valid
16
+ *
17
+ * @since 1.0.0
18
+ */
19
+ $( '#tablepress-page' ).find( 'form' ).on( 'submit', function( /* event */ ) {
20
+ var selected_tables = $( '#tables-export' ).val(),
21
+ num_selected = ( selected_tables ) ? selected_tables.length : 0;
22
+
23
+ // only submit form, if at least one table was selected
24
+ if ( 0 === num_selected ) {
25
+ return false;
26
+ }
27
+
28
+ // at this point, the form is valid and will be submitted
29
+
30
+ // add selected tables as a list to a hidden field
31
+ $( '#tables-export-list' ).val( selected_tables.join( ',' ) );
32
+
33
+ // on form submit: Enable disabled fields, so that they are transmitted in the POST request
34
+ $( '#tables-export-zip-file' ).prop( 'disabled', false );
35
+ } );
36
+
37
+ /**
38
+ * Show export delimiter dropdown box only if export format is CSV
39
+ *
40
+ * @since 1.0.0
41
+ */
42
+ $( '#tables-export-format' ).on( 'change', function() {
43
+ var non_csv_selected = ( 'csv' !== $(this).val() );
44
+ $( '#tables-export-csv-delimiter' ).prop( 'disabled', non_csv_selected );
45
+ $( '#tables-export-csv-delimiter-description' ).toggle( non_csv_selected );
46
+ } )
47
+ .change();
48
+
49
+ /**
50
+ * Automatically check and disable the "ZIP file" checkbox whenever more than one table is selected
51
+ *
52
+ * @since 1.0.0
53
+ */
54
+ var zip_file_manually_checked = false;
55
+ $( '#tables-export-zip-file' ).on( 'change', function() {
56
+ zip_file_manually_checked = $(this).prop( 'checked' );
57
+ } );
58
+ $( '#tables-export' ).on( 'change', function() {
59
+ var selected_tables = $(this).val(),
60
+ num_selected = ( selected_tables ) ? selected_tables.length : 0,
61
+ zip_file_required = ( num_selected > 1 );
62
+ $( '#tables-export-zip-file' )
63
+ .prop( 'disabled', zip_file_required )
64
+ .prop( 'checked', zip_file_required || zip_file_manually_checked );
65
+ $( '#tables-export-zip-file-description' ).toggle( zip_file_required );
66
+ // set state of "Select all" checkbox
67
+ $( '#tables-export-select-all' ).prop( 'checked', 0 === $(this).find( 'option' ).not( ':selected' ).length );
68
+ } )
69
+ .change();
70
+
71
+ /**
72
+ * Select all entries from the multiple-select dropdown on checkbox change
73
+ *
74
+ * @since 1.0.0
75
+ */
76
+ $( '#tables-export-select-all' ).on( 'change', function() {
77
+ var $tables = $( '#tables-export' );
78
+ $tables.find( 'option' ).prop( 'selected', $(this).prop( 'checked' ) );
79
+ $tables.change(); // to update ZIP file checkbox
80
+ } );
81
+
82
+ /**
83
+ * Automatically focus the tables dropdown
84
+ *
85
+ * @since 1.0.0
86
+ */
87
+ $( '#tables-export' ).focus();
88
+
89
+ } );
admin/js/export.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){"use strict";a("#tablepress-page").find("form").on("submit",function(){var b=a("#tables-export").val(),c=b?b.length:0;return 0===c?!1:(a("#tables-export-list").val(b.join(",")),void a("#tables-export-zip-file").prop("disabled",!1))}),a("#tables-export-format").on("change",function(){var b="csv"!==a(this).val();a("#tables-export-csv-delimiter").prop("disabled",b),a("#tables-export-csv-delimiter-description").toggle(b)}).change();var b=!1;a("#tables-export-zip-file").on("change",function(){b=a(this).prop("checked")}),a("#tables-export").on("change",function(){var c=a(this).val(),d=c?c.length:0,e=d>1;a("#tables-export-zip-file").prop("disabled",e).prop("checked",e||b),a("#tables-export-zip-file-description").toggle(e),a("#tables-export-select-all").prop("checked",0===a(this).find("option").not(":selected").length)}).change(),a("#tables-export-select-all").on("change",function(){var b=a("#tables-export");b.find("option").prop("selected",a(this).prop("checked")),b.change()}),a("#tables-export").focus()});
admin/js/import.js ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for the "Import" screen
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* global alert, tablepress_import */
11
+
12
+ jQuery( document ).ready( function( $ ) {
13
+
14
+ 'use strict';
15
+
16
+ /**
17
+ * Show select box for table to replace only if needed
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ $( '#row-import-type' ).on( 'change', 'input', function() {
22
+ $( '#tables-import-existing-table' ).prop( 'disabled', ( 'replace' !== $(this).val() && 'append' !== $(this).val() ) );
23
+ } )
24
+ .find( 'input:checked' ).change();
25
+
26
+ /**
27
+ * Show only the import source field that was selected with the radio button
28
+ *
29
+ * @since 1.0.0
30
+ */
31
+ $( '#row-import-source' ).on( 'change', 'input', function() {
32
+ $( '#row-import-source-file-upload, #row-import-source-url, #row-import-source-server, #row-import-source-form-field' ).hide();
33
+ $( '#row-import-source-' + $(this).val() ).show();
34
+ } )
35
+ .find( 'input:checked' ).change();
36
+
37
+ /**
38
+ * Show only the WP-Table Reloaded import source field that was selected with the radio button
39
+ *
40
+ * @since 1.0.0
41
+ */
42
+ $( '#row-import-wp-table-reloaded-source' ).on( 'change', 'input', function() {
43
+ $( '#row-import-wp-table-reloaded-source-dump-file, #row-import-wp-table-reloaded-source-db' ).hide();
44
+ $( '#row-import-wp-table-reloaded-source-' + $(this).val() ).show();
45
+ } )
46
+ .find( 'input:checked' ).change();
47
+
48
+ /**
49
+ * Select correct value in import format dropdown on file select
50
+ *
51
+ * @since 1.0.0
52
+ */
53
+ $( '#tables-import-file-upload, #tables-import-url, #tables-import-server' ).on( 'change', function( event ) {
54
+ var path = $(this).val(),
55
+ filename_start,
56
+ extension_start,
57
+ filename = path,
58
+ extension = 'csv';
59
+
60
+ // default extension: CSV for file upload and server, HTML for URL
61
+ if ( 'tables-import-url' === event.target.id ) {
62
+ extension = 'html';
63
+ }
64
+ // determine filename from full path
65
+ filename_start = path.lastIndexOf( '\\' );
66
+ if ( -1 !== filename_start ) { // Windows-based path
67
+ filename = path.substr( filename_start + 1 );
68
+ } else {
69
+ filename_start = path.lastIndexOf( '/' );
70
+ if ( -1 !== filename_start ) { // Windows-based path
71
+ filename = path.substr( filename_start + 1 );
72
+ }
73
+ }
74
+ // determine extension from filename
75
+ extension_start = filename.lastIndexOf( '.' );
76
+ if ( -1 !== extension_start ) {
77
+ extension = filename.substr( extension_start + 1 ).toLowerCase();
78
+ }
79
+
80
+ // allow .htm for HTML as well
81
+ if ( 'htm' === extension ) {
82
+ extension = 'html';
83
+ }
84
+
85
+ // Don't change the format for ZIP archives
86
+ if ( 'zip' === extension ) {
87
+ return;
88
+ }
89
+
90
+ $( '#tables-import-format' ).val( extension );
91
+ } );
92
+
93
+ /**
94
+ * Check, whether inputs are valid
95
+ *
96
+ * @since 1.0.0
97
+ */
98
+ $( '#tablepress-page' ).find( 'form' ).on( 'submit.tablepress', function( /* event */ ) {
99
+ var import_source = $( '#row-import-source' ).find( 'input:checked' ).val(),
100
+ selected_import_source_field = $( '#tables-import-' + import_source ).get(0),
101
+ valid_form = true,
102
+ import_type = $( '#row-import-type' ).find( 'input:checked' ).val();
103
+
104
+ /* the value of the selected import source field must be set/changed from the default */
105
+ if ( selected_import_source_field.defaultValue === selected_import_source_field.value ) {
106
+ $( selected_import_source_field )
107
+ .addClass( 'invalid' )
108
+ .one( 'change', function() { $(this).removeClass( 'invalid' ); } )
109
+ .focus().select();
110
+ valid_form = false;
111
+ }
112
+
113
+ /* if replace or append is selected, a table must be selected */
114
+ if ( 'replace' === import_type || 'append' === import_type ) {
115
+ if ( '' === $( '#tables-import-existing-table' ).val() ) {
116
+ $( '#row-import-type' )
117
+ .one( 'change', 'input', function() { $( '#tables-import-existing-table' ).removeClass( 'invalid' ); } );
118
+ $( '#tables-import-existing-table' )
119
+ .addClass( 'invalid' )
120
+ .one( 'change', function() { $(this).removeClass( 'invalid' ); } )
121
+ .focus().select();
122
+ valid_form = false;
123
+ }
124
+ }
125
+
126
+ if ( ! valid_form ) {
127
+ return false;
128
+ }
129
+ // at this point, the form is valid and will be submitted
130
+ } );
131
+
132
+ /**
133
+ * Remove form validation check if "Import from WP-Table Reloaded" button is clicked
134
+ *
135
+ * @since 1.0.0
136
+ */
137
+ $( '#tablepress-page' ).find( '#submit_wp_table_reloaded_import' ).on( 'click', function() {
138
+ $( '#tablepress-page' ).find( 'form' ).off( 'submit.tablepress' );
139
+
140
+ /* File upload must have a file, if Dump File is selected as the source */
141
+ if ( $( '#import-wp-table-reloaded-source-dump-file' ).prop( 'checked' ) && '' === $( '#tables-import-wp-table-reloaded-dump-file' ).val() ) {
142
+ $( '#tables-import-wp-table-reloaded-dump-file' )
143
+ .addClass( 'invalid' )
144
+ .one( 'change', function() { $(this).removeClass( 'invalid' ); } )
145
+ .focus().select();
146
+ return false;
147
+ }
148
+
149
+ /* At least one checkbox must be check, to have something imported */
150
+ if ( ! $( '#import-wp-table-reloaded-tables' ).prop( 'checked' ) && ! $( '#import-wp-table-reloaded-css' ).prop( 'checked' ) ) {
151
+ alert( tablepress_import.error_wp_table_reloaded_nothing_selected );
152
+ return false;
153
+ }
154
+
155
+ } );
156
+
157
+ } );
admin/js/import.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){"use strict";a("#row-import-type").on("change","input",function(){a("#tables-import-existing-table").prop("disabled","replace"!==a(this).val()&&"append"!==a(this).val())}).find("input:checked").change(),a("#row-import-source").on("change","input",function(){a("#row-import-source-file-upload, #row-import-source-url, #row-import-source-server, #row-import-source-form-field").hide(),a("#row-import-source-"+a(this).val()).show()}).find("input:checked").change(),a("#row-import-wp-table-reloaded-source").on("change","input",function(){a("#row-import-wp-table-reloaded-source-dump-file, #row-import-wp-table-reloaded-source-db").hide(),a("#row-import-wp-table-reloaded-source-"+a(this).val()).show()}).find("input:checked").change(),a("#tables-import-file-upload, #tables-import-url, #tables-import-server").on("change",function(b){var c,d,e=a(this).val(),f=e,g="csv";"tables-import-url"===b.target.id&&(g="html"),c=e.lastIndexOf("\\"),-1!==c?f=e.substr(c+1):(c=e.lastIndexOf("/"),-1!==c&&(f=e.substr(c+1))),d=f.lastIndexOf("."),-1!==d&&(g=f.substr(d+1).toLowerCase()),"htm"===g&&(g="html"),"zip"!==g&&a("#tables-import-format").val(g)}),a("#tablepress-page").find("form").on("submit.tablepress",function(){var b=a("#row-import-source").find("input:checked").val(),c=a("#tables-import-"+b).get(0),d=!0,e=a("#row-import-type").find("input:checked").val();return c.defaultValue===c.value&&(a(c).addClass("invalid").one("change",function(){a(this).removeClass("invalid")}).focus().select(),d=!1),("replace"===e||"append"===e)&&""===a("#tables-import-existing-table").val()&&(a("#row-import-type").one("change","input",function(){a("#tables-import-existing-table").removeClass("invalid")}),a("#tables-import-existing-table").addClass("invalid").one("change",function(){a(this).removeClass("invalid")}).focus().select(),d=!1),d?void 0:!1}),a("#tablepress-page").find("#submit_wp_table_reloaded_import").on("click",function(){return a("#tablepress-page").find("form").off("submit.tablepress"),a("#import-wp-table-reloaded-source-dump-file").prop("checked")&&""===a("#tables-import-wp-table-reloaded-dump-file").val()?(a("#tables-import-wp-table-reloaded-dump-file").addClass("invalid").one("change",function(){a(this).removeClass("invalid")}).focus().select(),!1):a("#import-wp-table-reloaded-tables").prop("checked")||a("#import-wp-table-reloaded-css").prop("checked")?void 0:(alert(tablepress_import.error_wp_table_reloaded_nothing_selected),!1)})});
admin/js/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
admin/js/list.js ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for the "List Tables" screen
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* global prompt, confirm, tablepress_common, tablepress_list, tb_show, ajaxurl */
11
+
12
+ jQuery( document ).ready( function( $ ) {
13
+
14
+ 'use strict';
15
+
16
+ /**
17
+ * Show a popup box with the table's Shortcode
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ $( '.tablepress-all-tables' ).on( 'click', '.shortcode a', function( /* event */ ) {
22
+ prompt( tablepress_list.shortcode_popup, $(this).attr( 'title' ) );
23
+ return false;
24
+ } );
25
+
26
+ /**
27
+ * Load a Thickbox with a table preview
28
+ *
29
+ * @since 1.0.0
30
+ */
31
+ $( '.tablepress-all-tables' ).on( 'click', '.table-preview a', function( /* event */ ) {
32
+ var width = $( window ).width() - 120,
33
+ height = $( window ).height() - 120,
34
+ $this = $(this);
35
+ if ( $( '#wpadminbar' ).length ) {
36
+ height -= parseInt( $( '#wpadminbar' ).css( 'height' ), 10 );
37
+ }
38
+ tb_show( $this.text(), $this.attr( 'href' ) + 'TB_iframe=true&height=' + height + '&width=' + width, false );
39
+ return false;
40
+ } );
41
+
42
+ /**
43
+ * Process links with a class "ajax-link" with AJAX
44
+ *
45
+ * @since 1.0.0
46
+ */
47
+ $( '#tablepress-page' ).on( 'click', '.ajax-link', function( /* event */ ) {
48
+ var $link = $(this),
49
+ action = $link.data( 'action' ),
50
+ item = $link.data( 'item' ),
51
+ target = $link.data( 'target' );
52
+ $.get(
53
+ ajaxurl,
54
+ this.href.split('?')['1'], /* query string of the link */
55
+ function( result ) {
56
+ if ( '1' !== result ) {
57
+ return;
58
+ }
59
+
60
+ switch ( action ) {
61
+ case 'hide_message':
62
+ /* Donation message links show new message */
63
+ if ( 'donation_nag' === item && '' !== target ) {
64
+ $link.closest( 'div' ).after( '<div class="donation-message-after-click-message notice notice-success"><p><strong>' + tablepress_list['donation-message-' + target] + '</strong></p></div>' );
65
+ $( '.donation-message-after-click-message' ).delay( 10000 ).fadeOut( 2000, function() { $(this).remove(); } );
66
+ }
67
+
68
+ /* Remove original message */
69
+ $link.closest( 'div' ).remove();
70
+ break;
71
+ }
72
+ }
73
+ );
74
+ return false;
75
+ } );
76
+
77
+ /**
78
+ * Submit Bulk Actions only if an action was selected an a table's checkbox was checked
79
+ *
80
+ * @since 1.0.0
81
+ */
82
+ $( '#doaction, #doaction2' ).on( 'click', function() {
83
+ var bulk_action,
84
+ confirm_message,
85
+ num_selected = $( '.tablepress-all-tables' ).find( 'tbody' ).find( 'input:checked' ).length;
86
+
87
+ // determine location of clicked bulk action controls
88
+ if ( 'doaction' === this.id ) {
89
+ bulk_action = 'top';
90
+ } else {
91
+ bulk_action = 'bottom';
92
+ }
93
+
94
+ // check whether an action was selected, and whether tables were selected
95
+ if ( '-1' === $( '#bulk-action-' + bulk_action ).val() ) {
96
+ return false;
97
+ }
98
+ if ( 0 === num_selected ) {
99
+ return false;
100
+ }
101
+
102
+ // Show AYS prompt for deletion
103
+ if ( 'delete' === $( '#bulk-action-' + bulk_action ).val() ) {
104
+ if ( 1 === num_selected ) {
105
+ confirm_message = tablepress_common.ays_delete_single_table;
106
+ } else {
107
+ confirm_message = tablepress_common.ays_delete_multiple_tables;
108
+ }
109
+
110
+ if ( ! confirm( confirm_message ) ) {
111
+ return false;
112
+ }
113
+ }
114
+ } );
115
+
116
+ } );
admin/js/list.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){"use strict";a(".tablepress-all-tables").on("click",".shortcode a",function(){return prompt(tablepress_list.shortcode_popup,a(this).attr("title")),!1}),a(".tablepress-all-tables").on("click",".table-preview a",function(){var b=a(window).width()-120,c=a(window).height()-120,d=a(this);return a("#wpadminbar").length&&(c-=parseInt(a("#wpadminbar").css("height"),10)),tb_show(d.text(),d.attr("href")+"TB_iframe=true&height="+c+"&width="+b,!1),!1}),a("#tablepress-page").on("click",".ajax-link",function(){var b=a(this),c=b.data("action"),d=b.data("item"),e=b.data("target");return a.get(ajaxurl,this.href.split("?")[1],function(f){if("1"===f)switch(c){case"hide_message":"donation_nag"===d&&""!==e&&(b.closest("div").after('<div class="donation-message-after-click-message notice notice-success"><p><strong>'+tablepress_list["donation-message-"+e]+"</strong></p></div>"),a(".donation-message-after-click-message").delay(1e4).fadeOut(2e3,function(){a(this).remove()})),b.closest("div").remove()}}),!1}),a("#doaction, #doaction2").on("click",function(){var b,c,d=a(".tablepress-all-tables").find("tbody").find("input:checked").length;return b="doaction"===this.id?"top":"bottom","-1"===a("#bulk-action-"+b).val()?!1:0===d?!1:"delete"!==a("#bulk-action-"+b).val()||(c=1===d?tablepress_common.ays_delete_single_table:tablepress_common.ays_delete_multiple_tables,confirm(c))?void 0:!1})});
admin/js/options.js ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for the "Options" screen
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* global confirm, CodeMirror, tablepress_strings */
11
+
12
+ jQuery( document ).ready( function( $ ) {
13
+
14
+ 'use strict';
15
+
16
+ /**
17
+ * Invoke CodeMirror on the "Custom CSS" textarea
18
+ *
19
+ * @since 1.0.0
20
+ */
21
+ var CM_custom_css = CodeMirror.fromTextArea( document.getElementById( 'option-custom-css' ), {
22
+ mode: 'css',
23
+ indentUnit: 2,
24
+ tabSize: 2,
25
+ indentWithTabs: true
26
+ } );
27
+
28
+ /**
29
+ * "Custom CSS" textarea grows on focus, if it is not disabled, but only once
30
+ *
31
+ * @since 1.0.0
32
+ */
33
+ $( '#tablepress-page' ).find( '.CodeMirror' ).on( 'mousedown.codemirror', function() {
34
+ var $this = $(this);
35
+ if ( ! $this.hasClass( 'disabled' ) ) {
36
+ $this.addClass( 'large' );
37
+ CM_custom_css.refresh();
38
+ $this.off( 'mousedown.codemirror' );
39
+ }
40
+ } );
41
+
42
+ /**
43
+ * Enable/disable "Custom CSS" textarea and "Load from file" checkbox according to state of "Use Custom CSS" checkbox
44
+ *
45
+ * @since 1.0.0
46
+ */
47
+ $( '#option-use-custom-css' ).on( 'change', function() {
48
+ var use_custom_css = $(this).prop( 'checked' );
49
+ CM_custom_css.setOption( 'readOnly', ! use_custom_css );
50
+ $( '#tablepress-page' ).find( '.CodeMirror' ).toggleClass( 'disabled', ! use_custom_css );
51
+ } ).change();
52
+
53
+ /**
54
+ * On form submit: Enable disabled fields, so that they are transmitted in the POST request
55
+ *
56
+ * @since 1.0.0
57
+ */
58
+ $( '#tablepress-page' ).on( 'submit', 'form', function() {
59
+ $(this).find( 'input, select, textarea' ).prop( 'disabled', false );
60
+ } );
61
+
62
+ /**
63
+ * Require double confirmation when wanting to uninstall TablePress
64
+ *
65
+ * @since 1.0.0
66
+ */
67
+ $( '#uninstall-tablepress' ).on( 'click', function() {
68
+ if ( confirm( tablepress_strings.uninstall_warning_1 ) ) {
69
+ return confirm( tablepress_strings.uninstall_warning_2 );
70
+ } else {
71
+ return false;
72
+ }
73
+ } );
74
+
75
+ } );
admin/js/options.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){"use strict";var b=CodeMirror.fromTextArea(document.getElementById("option-custom-css"),{mode:"css",indentUnit:2,tabSize:2,indentWithTabs:!0});a("#tablepress-page").find(".CodeMirror").on("mousedown.codemirror",function(){var c=a(this);c.hasClass("disabled")||(c.addClass("large"),b.refresh(),c.off("mousedown.codemirror"))}),a("#option-use-custom-css").on("change",function(){var c=a(this).prop("checked");b.setOption("readOnly",!c),a("#tablepress-page").find(".CodeMirror").toggleClass("disabled",!c)}).change(),a("#tablepress-page").on("submit","form",function(){a(this).find("input, select, textarea").prop("disabled",!1)}),a("#uninstall-tablepress").on("click",function(){return confirm(tablepress_strings.uninstall_warning_1)?confirm(tablepress_strings.uninstall_warning_2):!1})});
admin/js/quicktags-button.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for the "Table" button in the QuickTags editor toolbar
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* global tablepress_editor_button, QTags, tb_show */
11
+
12
+ jQuery( document ).ready( function( $ ) {
13
+
14
+ 'use strict';
15
+
16
+ /**
17
+ * Open a Thickbox with the List of tables, for adding a Shortcode to the editor
18
+ * used by both the TinyMCE editor button and the Quicktags toolbar button
19
+ *
20
+ * @since 1.0.0
21
+ */
22
+ window.tablepress_open_shortcode_thickbox = function() {
23
+ var width = $( window ).width(),
24
+ W = ( 720 < width ) ? 720 : width,
25
+ H = $( window ).height();
26
+ if ( $( '#wpadminbar' ).length ) {
27
+ H -= parseInt( jQuery( '#wpadminbar' ).css( 'height' ), 10 );
28
+ }
29
+
30
+ tb_show( tablepress_editor_button.thickbox_title, tablepress_editor_button.thickbox_url + '&TB_iframe=true&height=' + ( H - 85 ) + '&width=' + ( W - 80 ), false );
31
+ };
32
+
33
+ // only do this if QuickTags is available
34
+ if ( 'undefined' === typeof( QTags ) ) {
35
+ return;
36
+ }
37
+
38
+ /**
39
+ * Register a button for the Quicktags (aka HTML editor) toolbar
40
+ *
41
+ * @since 1.0.0
42
+ */
43
+ QTags.addButton(
44
+ 'tablepress_quicktags_button', // ID
45
+ tablepress_editor_button.caption, // button caption
46
+ window.tablepress_open_shortcode_thickbox, // click callback
47
+ false, // unused
48
+ false, // access key
49
+ tablepress_editor_button.title, // button title
50
+ 115 // button position (here: between code and more)
51
+ );
52
+
53
+ } );
admin/js/quicktags-button.min.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function(a){"use strict";window.tablepress_open_shortcode_thickbox=function(){var b=a(window).width(),c=b>720?720:b,d=a(window).height();a("#wpadminbar").length&&(d-=parseInt(jQuery("#wpadminbar").css("height"),10)),tb_show(tablepress_editor_button.thickbox_title,tablepress_editor_button.thickbox_url+"&TB_iframe=true&height="+(d-85)+"&width="+(c-80),!1)},"undefined"!=typeof QTags&&QTags.addButton("tablepress_quicktags_button",tablepress_editor_button.caption,window.tablepress_open_shortcode_thickbox,!1,!1,tablepress_editor_button.title,115)});
admin/js/tinymce-button.js ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * JavaScript code for the "Table" button in the TinyMCE editor toolbar
3
+ *
4
+ * @package TablePress
5
+ * @subpackage Views JavaScript
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ /* global tinymce , tablepress_editor_button*/
11
+
12
+ ( function() {
13
+
14
+ 'use strict';
15
+
16
+ // only do this if TinyMCE is available
17
+ if ( 'undefined' === typeof( tinymce ) ) {
18
+ return;
19
+ }
20
+
21
+ /**
22
+ * Register a button for the TinyMCE (aka Visual Editor) toolbar
23
+ *
24
+ * @since 1.0.0
25
+ */
26
+ tinymce.create( 'tinymce.plugins.TablePressPlugin', {
27
+ init: function( ed, url ) {
28
+ ed.addCommand( 'TablePress_insert_table', window.tablepress_open_shortcode_thickbox );
29
+
30
+ ed.addButton( 'tablepress_insert_table', {
31
+ title: tablepress_editor_button.title,
32
+ cmd: 'TablePress_insert_table',
33
+ image: url.slice( 0, url.length - 2 ) + 'img/tablepress-editor-button.png'
34
+ } );
35
+ }
36
+ /* // no real need for getInfo(), as it is not displayed/used anywhere
37
+ ,
38
+ getInfo: function() {
39
+ return {
40
+ longname: 'TablePress',
41
+ author: 'Tobias Bäthge',
42
+ authorurl: 'https://tobias.baethge.com/',
43
+ infourl: 'https://tablepress.org/',
44
+ version: '1.0.0'
45
+ };
46
+ }
47
+ */
48
+ } );
49
+ tinymce.PluginManager.add( 'tablepress_tinymce', tinymce.plugins.TablePressPlugin );
50
+
51
+ } )();
admin/js/tinymce-button.min.js ADDED
@@ -0,0 +1 @@
 
1
+ !function(){"use strict";"undefined"!=typeof tinymce&&(tinymce.create("tinymce.plugins.TablePressPlugin",{init:function(a,b){a.addCommand("TablePress_insert_table",window.tablepress_open_shortcode_thickbox),a.addButton("tablepress_insert_table",{title:tablepress_editor_button.title,cmd:"TablePress_insert_table",image:b.slice(0,b.length-2)+"img/tablepress-editor-button.png"})}}),tinymce.PluginManager.add("tablepress_tinymce",tinymce.plugins.TablePressPlugin))}();
classes/class-admin-page-helper.php ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin Page Helper Class for TablePress with functions needed in the admin area
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Views
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * Admin Page class
16
+ * @package TablePress
17
+ * @subpackage Views
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ class TablePress_Admin_Page {
22
+
23
+ /**
24
+ * Enqueue a CSS file.
25
+ *
26
+ * @since 1.0.0
27
+ *
28
+ * @param string $name Name of the CSS file, without extension.
29
+ * @param array $dependencies Optional. List of names of CSS stylesheets that this stylesheet depends on, and which need to be included before this one.
30
+ */
31
+ public function enqueue_style( $name, array $dependencies = array() ) {
32
+ $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
33
+ $css_file = "admin/css/{$name}{$suffix}.css";
34
+ $css_url = plugins_url( $css_file, TABLEPRESS__FILE__ );
35
+ wp_enqueue_style( "tablepress-{$name}", $css_url, $dependencies, TablePress::version );
36
+ }
37
+
38
+ /**
39
+ * Enqueue a JavaScript file, possibly with dependencies and extra information.
40
+ *
41
+ * @since 1.0.0
42
+ *
43
+ * @param string $name Name of the JS file, without extension.
44
+ * @param array $dependencies Optional. List of names of JS scripts that this script depends on, and which need to be included before this one.
45
+ * @param array $localize_script Optional. An array with strings that gets transformed into a JS object and is added to the page before the script is included.
46
+ * @param bool $force_minified Optional. Always load the minified version, regardless of SCRIPT_DEBUG constant value.
47
+ */
48
+ public function enqueue_script( $name, array $dependencies = array(), array $localize_script = array(), $force_minified = false ) {
49
+ $suffix = ( ! $force_minified && defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
50
+ $js_file = "admin/js/{$name}{$suffix}.js";
51
+ $js_url = plugins_url( $js_file, TABLEPRESS__FILE__ );
52
+ wp_enqueue_script( "tablepress-{$name}", $js_url, $dependencies, TablePress::version, true );
53
+ if ( ! empty( $localize_script ) ) {
54
+ foreach ( $localize_script as $var_name => $var_data ) {
55
+ wp_localize_script( "tablepress-{$name}", "tablepress_{$var_name}", $var_data );
56
+ }
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Register a filter hook on the admin footer.
62
+ *
63
+ * @since 1.0.0
64
+ */
65
+ public function add_admin_footer_text() {
66
+ // Show admin footer message (only on TablePress admin screens).
67
+ add_filter( 'admin_footer_text', array( $this, '_admin_footer_text' ) );
68
+ }
69
+
70
+ /**
71
+ * Add a TablePress "Thank You" message to the admin footer content.
72
+ *
73
+ * @since 1.0.0
74
+ *
75
+ * @param string $content Current admin footer content.
76
+ * @return string New admin footer content.
77
+ */
78
+ public function _admin_footer_text( $content ) {
79
+ $content .= ' &bull; ' . __( 'Thank you for using <a href="https://tablepress.org/">TablePress</a>.', 'tablepress' );
80
+ $content .= ' ' . sprintf( __( 'Support the plugin with your <a href="%s">donation</a>!', 'tablepress' ), 'https://tablepress.org/donate/' );
81
+ return $content;
82
+ }
83
+
84
+ /**
85
+ * Print the JavaScript code for a WP feature pointer.
86
+ *
87
+ * @since 1.0.0
88
+ *
89
+ * @param string $pointer_id The pointer ID.
90
+ * @param string $selector The HTML elements, on which the pointer should be attached.
91
+ * @param array $args Arguments to be passed to the pointer JS (see wp-pointer.js).
92
+ */
93
+ public function print_wp_pointer_js( $pointer_id, $selector, array $args ) {
94
+ if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) ) {
95
+ return;
96
+ }
97
+ ?>
98
+ <script type="text/javascript">
99
+ ( function( $ ) {
100
+ var options = <?php echo json_encode( $args ); ?>, setup;
101
+
102
+ if ( ! options ) {
103
+ return;
104
+ }
105
+
106
+ options = $.extend( options, {
107
+ close: function() {
108
+ $.post( ajaxurl, {
109
+ pointer: '<?php echo $pointer_id; ?>',
110
+ action: 'dismiss-wp-pointer'
111
+ } );
112
+ }
113
+ } );
114
+
115
+ setup = function() {
116
+ $( '<?php echo $selector; ?>' ).pointer( options ).pointer( 'open' );
117
+ };
118
+
119
+ if ( options.position && options.position.defer_loading ) {
120
+ $( window ).bind( 'load.wp-pointers', setup );
121
+ } else {
122
+ $( document ).ready( setup );
123
+ }
124
+ } )( jQuery );
125
+ </script>
126
+ <?php
127
+ }
128
+
129
+ } // class TablePress_Admin_Page
classes/class-controller.php ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress Base Controller with members and methods for all controllers
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Controllers
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * Base Controller class
16
+ * @package TablePress
17
+ * @subpackage Controllers
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ abstract class TablePress_Controller {
22
+
23
+ /**
24
+ * Instance of the Options Model.
25
+ *
26
+ * @since 1.0.0
27
+ * @var TablePress_Options_Model
28
+ */
29
+ public $model_options;
30
+
31
+ /**
32
+ * Instance of the Table Model.
33
+ *
34
+ * @since 1.0.0
35
+ * @var TablePress_Table_Model
36
+ */
37
+ public $model_table;
38
+
39
+ /**
40
+ * File name of the admin screens' parent page in the admin menu.
41
+ *
42
+ * @since 1.0.0
43
+ * @var string
44
+ */
45
+ public $parent_page = 'middle';
46
+
47
+ /**
48
+ * Whether TablePress admin screens are a top-level menu item in the admin menu.
49
+ *
50
+ * @since 1.0.0
51
+ * @var bool
52
+ */
53
+ public $is_top_level_page = false;
54
+
55
+ /**
56
+ * Initialize all controllers, by loading Plugin and User Options, and by performing an update check.
57
+ *
58
+ * @since 1.0.0
59
+ */
60
+ public function __construct() {
61
+ /*
62
+ * References to the TablePress models (only for backwards compatibility in TablePress Extensions!).
63
+ * Using `TablePress::$model_options` and `TablePress::$model_table` is recommended!
64
+ */
65
+ $this->model_options = TablePress::$model_options;
66
+ $this->model_table = TablePress::$model_table;
67
+
68
+ // Update check, in all controllers (frontend and admin), to make sure we always have up-to-date options, should be done very early.
69
+ $this->plugin_update_check();
70
+
71
+ /**
72
+ * Filter the admin menu parent page, which is needed for the construction of plugin URLs.
73
+ *
74
+ * @since 1.0.0
75
+ *
76
+ * @param string $parent_page Current admin menu parent page.
77
+ */
78
+ $this->parent_page = apply_filters( 'tablepress_admin_menu_parent_page', TablePress::$model_options->get( 'admin_menu_parent_page' ) );
79
+ $this->is_top_level_page = in_array( $this->parent_page, array( 'top', 'middle', 'bottom' ), true );
80
+ }
81
+
82
+ /**
83
+ * Check if the plugin was updated and perform necessary actions, like updating the options.
84
+ *
85
+ * @since 1.0.0
86
+ */
87
+ protected function plugin_update_check() {
88
+ // First activation or plugin update.
89
+ $current_plugin_options_db_version = TablePress::$model_options->get( 'plugin_options_db_version' );
90
+ if ( $current_plugin_options_db_version < TablePress::db_version ) {
91
+ // Allow more PHP execution time for update process.
92
+ @set_time_limit( 300 );
93
+
94
+ // Add TablePress capabilities to the WP_Roles objects, for new installations and all versions below 12.
95
+ if ( $current_plugin_options_db_version < 12 ) {
96
+ TablePress::$model_options->add_access_capabilities();
97
+ }
98
+
99
+ if ( 0 === TablePress::$model_options->get( 'first_activation' ) ) {
100
+ // Save initial set of plugin options, and time of first activation of the plugin, on first activation.
101
+ TablePress::$model_options->update( array(
102
+ 'first_activation' => current_time( 'timestamp' ),
103
+ 'plugin_options_db_version' => TablePress::db_version,
104
+ ) );
105
+ } else {
106
+ // Update Plugin Options Options, if necessary.
107
+ TablePress::$model_options->merge_plugin_options_defaults();
108
+ $updated_options = array(
109
+ 'plugin_options_db_version' => TablePress::db_version,
110
+ 'prev_tablepress_version' => TablePress::$model_options->get( 'tablepress_version' ),
111
+ 'tablepress_version' => TablePress::version,
112
+ 'message_plugin_update' => true,
113
+ );
114
+
115
+ // Only write files, if "Custom CSS" is to be used, and if there is "Custom CSS".
116
+ if ( TablePress::$model_options->get( 'use_custom_css' ) && '' !== TablePress::$model_options->get( 'custom_css' ) ) {
117
+ // Re-save "Custom CSS" to re-create all files (as TablePress Default CSS might have changed).
118
+ /**
119
+ * Load WP file functions to provide filesystem access functions early.
120
+ */
121
+ require_once ABSPATH . 'wp-admin/includes/file.php';
122
+ /**
123
+ * Load WP admin template functions to provide `submit_button()` which is necessary for `request_filesystem_credentials()`.
124
+ */
125
+ require_once ABSPATH . 'wp-admin/includes/template.php';
126
+ $tablepress_css = TablePress::load_class( 'TablePress_CSS', 'class-css.php', 'classes' );
127
+ $result = $tablepress_css->save_custom_css_to_file( TablePress::$model_options->get( 'custom_css' ), TablePress::$model_options->get( 'custom_css_minified' ) );
128
+ // If saving was successful, use "Custom CSS" file.
129
+ $updated_options['use_custom_css_file'] = $result;
130
+ // Increase the "Custom CSS" version number for cache busting.
131
+ if ( $result ) {
132
+ $updated_options['custom_css_version'] = TablePress::$model_options->get( 'custom_css_version' ) + 1;
133
+ }
134
+ }
135
+
136
+ TablePress::$model_options->update( $updated_options );
137
+
138
+ // Clear table caches.
139
+ if ( $current_plugin_options_db_version < 16 ) {
140
+ // For pre-0.9-RC, where the arrays are serialized and not JSON encoded.
141
+ TablePress::$model_table->invalidate_table_output_caches_tp09();
142
+ } else {
143
+ // For 0.9-RC and onwards.
144
+ TablePress::$model_table->invalidate_table_output_caches();
145
+ }
146
+
147
+ // Add mime type field to existing posts with the TablePress Custom Post Type, so that other plugins know that they are not dealing with plain text.
148
+ if ( $current_plugin_options_db_version < 25 ) {
149
+ TablePress::$model_table->add_mime_type_to_posts();
150
+ }
151
+
152
+ // Convert old parameter names to new ones in DataTables "Custom Commands".
153
+ if ( $current_plugin_options_db_version < 26 ) {
154
+ TablePress::$model_table->convert_datatables_parameter_names_tp15();
155
+ }
156
+ }
157
+ }
158
+
159
+ // Maybe update the table scheme in each existing table, independently from updating the plugin options.
160
+ if ( TablePress::$model_options->get( 'table_scheme_db_version' ) < TablePress::table_scheme_version ) {
161
+ // Convert parameter "datatables_scrollX" to "datatables_scrollx", has to be done before merge_table_options_defaults() is called!
162
+ if ( TablePress::$model_options->get( 'table_scheme_db_version' ) < 3 ) {
163
+ TablePress::$model_table->merge_table_options_tp08();
164
+ }
165
+
166
+ TablePress::$model_table->merge_table_options_defaults();
167
+
168
+ // Merge print_name/print_description changes made for 0.6-beta.
169
+ if ( TablePress::$model_options->get( 'table_scheme_db_version' ) < 2 ) {
170
+ TablePress::$model_table->merge_table_options_tp06();
171
+ }
172
+
173
+ TablePress::$model_options->update( array(
174
+ 'table_scheme_db_version' => TablePress::table_scheme_version,
175
+ ) );
176
+ }
177
+
178
+ /*
179
+ * Update User Options, if necessary.
180
+ * User Options are not saved in DB until first change occurs.
181
+ */
182
+ if ( is_user_logged_in() && ( TablePress::$model_options->get( 'user_options_db_version' ) < TablePress::db_version ) ) {
183
+ TablePress::$model_options->merge_user_options_defaults();
184
+ TablePress::$model_options->update( array(
185
+ 'user_options_db_version' => TablePress::db_version,
186
+ ) );
187
+ }
188
+ }
189
+
190
+ } // class TablePress_Controller
classes/class-css.php ADDED
@@ -0,0 +1,442 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress CSS Class
4
+ *
5
+ * @package TablePress
6
+ * @subpackage CSS
7
+ * @author Tobias Bäthge
8
+ * @since 1.1.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * TablePress CSS Class
16
+ * @package TablePress
17
+ * @subpackage CSS
18
+ * @author Tobias Bäthge
19
+ * @since 1.1.0
20
+ */
21
+ class TablePress_CSS {
22
+
23
+ /**
24
+ * Sanitize and tidy a string of CSS.
25
+ *
26
+ * @since 1.1.0
27
+ *
28
+ * @param string $css CSS code.
29
+ * @return string Sanitized and tidied CSS code.
30
+ */
31
+ public function sanitize_css( $css ) {
32
+ $csstidy = TablePress::load_class( 'CSSTidy', 'class.csstidy.php', 'libraries/csstidy' );
33
+
34
+ // Sanitization and not just tidying for users without enough privileges.
35
+ if ( ! current_user_can( 'unfiltered_html' ) ) {
36
+ $csstidy->optimise = new CSSTidy_custom_sanitize( $csstidy );
37
+
38
+ // Let "arrows" survive, otherwise this might be recognized as the beginning of an HTML tag and removed with other stuff behind it.
39
+ $css = str_replace( '<=', '&lt;=', $css );
40
+ // Remove all HTML tags.
41
+ $css = wp_kses( $css, 'strip' );
42
+ // KSES replaces single ">" with "&gt;", but ">" is valid in CSS selectors.
43
+ $css = str_replace( '&gt;', '>', $css );
44
+ // strip_tags again, because of the just added ">" (KSES for a second time would again bring the ">" problem).
45
+ $css = strip_tags( $css );
46
+ }
47
+
48
+ $csstidy->set_cfg( 'remove_bslash', false );
49
+ $csstidy->set_cfg( 'compress_colors', false );
50
+ $csstidy->set_cfg( 'compress_font-weight', false );
51
+ $csstidy->set_cfg( 'lowercase_s', false );
52
+ $csstidy->set_cfg( 'optimise_shorthands', false );
53
+ $csstidy->set_cfg( 'remove_last_;', false );
54
+ $csstidy->set_cfg( 'case_properties', false );
55
+ $csstidy->set_cfg( 'sort_properties', false );
56
+ $csstidy->set_cfg( 'sort_selectors', false );
57
+ $csstidy->set_cfg( 'discard_invalid_selectors', false );
58
+ $csstidy->set_cfg( 'discard_invalid_properties', true );
59
+ $csstidy->set_cfg( 'merge_selectors', false );
60
+ $csstidy->set_cfg( 'css_level', 'CSS3.0' );
61
+ $csstidy->set_cfg( 'preserve_css', true );
62
+ $csstidy->set_cfg( 'timestamp', false );
63
+ $csstidy->set_cfg( 'template', dirname( TABLEPRESS__FILE__ ) . '/libraries/csstidy/tablepress-standard.tpl' );
64
+
65
+ $csstidy->parse( $css );
66
+ return $csstidy->print->plain();
67
+ }
68
+
69
+ /**
70
+ * Minify a string of CSS code, that should have been sanitized/tidied before.
71
+ *
72
+ * @since 1.1.0
73
+ *
74
+ * @param string $css CSS code.
75
+ * @return string Minified CSS code.
76
+ */
77
+ public function minify_css( $css ) {
78
+ $csstidy = TablePress::load_class( 'CSSTidy', 'class.csstidy.php', 'libraries/csstidy' );
79
+ $csstidy->optimise = new CSSTidy_custom_sanitize( $csstidy );
80
+ $csstidy->set_cfg( 'remove_bslash', false );
81
+ $csstidy->set_cfg( 'compress_colors', true );
82
+ $csstidy->set_cfg( 'compress_font-weight', true );
83
+ $csstidy->set_cfg( 'lowercase_s', false );
84
+ $csstidy->set_cfg( 'optimise_shorthands', 1 );
85
+ $csstidy->set_cfg( 'remove_last_;', true );
86
+ $csstidy->set_cfg( 'case_properties', false );
87
+ $csstidy->set_cfg( 'sort_properties', false );
88
+ $csstidy->set_cfg( 'sort_selectors', false );
89
+ $csstidy->set_cfg( 'discard_invalid_selectors', false );
90
+ $csstidy->set_cfg( 'discard_invalid_properties', true );
91
+ $csstidy->set_cfg( 'merge_selectors', false );
92
+ $csstidy->set_cfg( 'css_level', 'CSS3.0' );
93
+ $csstidy->set_cfg( 'preserve_css', false );
94
+ $csstidy->set_cfg( 'timestamp', false );
95
+ $csstidy->set_cfg( 'template', 'highest' );
96
+
97
+ $csstidy->parse( $css );
98
+ return $csstidy->print->plain();
99
+ }
100
+
101
+ /**
102
+ * Get the location (file path or URL) of the "Custom CSS" file, depending on whether it's a Multisite install or not.
103
+ *
104
+ * @since 1.0.0
105
+ *
106
+ * @param string $type "normal" version, "minified" version, or "combined" (with TablePress Default CSS) version.
107
+ * @param string $location "path" or "url", for file path or URL.
108
+ * @return string Full file path or full URL for the "Custom CSS" file.
109
+ */
110
+ public function get_custom_css_location( $type, $location ) {
111
+ switch ( $type ) {
112
+ case 'combined':
113
+ $file = 'tablepress-combined.min.css';
114
+ break;
115
+ case 'minified':
116
+ $file = 'tablepress-custom.min.css';
117
+ break;
118
+ case 'normal':
119
+ default:
120
+ $file = 'tablepress-custom.css';
121
+ break;
122
+ }
123
+
124
+ if ( is_multisite() ) {
125
+ // Multisite installation: /wp-content/uploads/sites/<ID>/
126
+ $upload_location = wp_upload_dir();
127
+ } else {
128
+ // Singlesite installation: /wp-content/
129
+ $upload_location = array(
130
+ 'basedir' => WP_CONTENT_DIR,
131
+ 'baseurl' => content_url(),
132
+ );
133
+ }
134
+
135
+ switch ( $location ) {
136
+ case 'url':
137
+ $url = set_url_scheme( $upload_location['baseurl'] . '/' . $file );
138
+ /**
139
+ * Filter the URL from which the "Custom CSS" file is loaded.
140
+ *
141
+ * @since 1.0.0
142
+ *
143
+ * @param string $url URL of the "Custom CSS" file.
144
+ * @param string $file File name of the "Custom CSS" file.
145
+ * @param string $type Type of the "Custom CSS" file ("normal", "minified", or "combined").
146
+ */
147
+ $url = apply_filters( 'tablepress_custom_css_url', $url, $file, $type );
148
+ return $url;
149
+ // break; // unreachable
150
+ case 'path':
151
+ $path = $upload_location['basedir'] . '/' . $file;
152
+ /**
153
+ * Filter the file path on the server from which the "Custom CSS" file is loaded.
154
+ *
155
+ * @since 1.0.0
156
+ *
157
+ * @param string $path File path of the "Custom CSS" file.
158
+ * @param string $file File name of the "Custom CSS" file.
159
+ * @param string $type Type of the "Custom CSS" file ("normal", "minified", or "combined").
160
+ */
161
+ $path = apply_filters( 'tablepress_custom_css_file_name', $path, $file, $type );
162
+ return $path;
163
+ // break; // unreachable
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Load the contents of the file with the "Custom CSS".
169
+ *
170
+ * @since 1.0.0
171
+ *
172
+ * @param string $type Optional. Whether to load "normal" version or "minified" version. Default "normal".
173
+ * @return string|bool Custom CSS on success, false on error.
174
+ */
175
+ public function load_custom_css_from_file( $type = 'normal' ) {
176
+ $filename = $this->get_custom_css_location( $type, 'path' );
177
+ // Check if file name is valid (0 means yes).
178
+ if ( 0 !== validate_file( $filename ) ) {
179
+ return false;
180
+ }
181
+ if ( ! @is_file( $filename ) ) {
182
+ return false;
183
+ }
184
+ if ( ! @is_readable( $filename ) ) {
185
+ return false;
186
+ }
187
+ return file_get_contents( $filename );
188
+ }
189
+
190
+ /**
191
+ * Load the contents of the file with the TablePress Default CSS.
192
+ *
193
+ * @since 1.1.0
194
+ *
195
+ * @return string|bool TablePress Default CSS on success, false on error.
196
+ */
197
+ public function load_default_css_from_file() {
198
+ $filename = TABLEPRESS_ABSPATH . 'css/default.min.css';
199
+ // Check if file name is valid (0 means yes).
200
+ if ( 0 !== validate_file( $filename ) ) {
201
+ return false;
202
+ }
203
+ if ( ! @is_file( $filename ) ) {
204
+ return false;
205
+ }
206
+ if ( ! @is_readable( $filename ) ) {
207
+ return false;
208
+ }
209
+ return file_get_contents( $filename );
210
+ }
211
+
212
+ /**
213
+ * Try to save "Custom CSS" to a file (requires "direct" method in WP_Filesystem, or stored FTP credentials).
214
+ *
215
+ * @since 1.1.0
216
+ *
217
+ * @param string $custom_css_normal Custom CSS code to be saved.
218
+ * @param string $custom_css_minified Minified CSS code to be saved.
219
+ * @return bool True on success, false on failure.
220
+ */
221
+ public function save_custom_css_to_file( $custom_css_normal, $custom_css_minified ) {
222
+ /**
223
+ * Filter whether the "Custom CSS" code shall be saved to a file on the server.
224
+ *
225
+ * @since 1.1.0
226
+ *
227
+ * @param bool $save Whether to save the "Custom CSS" to a file. Default true.
228
+ */
229
+ if ( ! apply_filters( 'tablepress_save_custom_css_to_file', true ) ) {
230
+ return false;
231
+ }
232
+
233
+ // Start capturing the output, to later prevent it.
234
+ ob_start();
235
+ $credentials = request_filesystem_credentials( '', '', false, false, null );
236
+ /*
237
+ * Do we have credentials already? (Otherwise the form will have been rendered, which is not supported here.)
238
+ * Or, if we have credentials, are they valid?
239
+ */
240
+ if ( false === $credentials || ! WP_Filesystem( $credentials ) ) {
241
+ ob_end_clean();
242
+ return false;
243
+ }
244
+
245
+ // We have valid access to the filesystem now -> try to save the files.
246
+ return $this->_custom_css_save_helper( $custom_css_normal, $custom_css_minified );
247
+ }
248
+
249
+ /**
250
+ * Save "Custom CSS" to files, delete "Custom CSS" files, or return HTML for the credentials form.
251
+ *
252
+ * Only used from "Plugin Options" screen, save_custom_css_to_file() is used in cases where no form output/redirection is possible (plugin updates, WP-Table Reloaded Import).
253
+ *
254
+ * @since 1.0.0
255
+ *
256
+ * @param string $custom_css_normal Custom CSS code to be saved. If empty, files will be deleted.
257
+ * @param string $custom_css_minified Minified CSS code to be saved.
258
+ * @return bool|string True on success, false on failure, or string of HTML for the credentials form for the WP_Filesystem API, if necessary.
259
+ */
260
+ public function save_custom_css_to_file_plugin_options( $custom_css_normal, $custom_css_minified ) {
261
+ /** This filter is documented in classes/class-css.php */
262
+ if ( ! apply_filters( 'tablepress_save_custom_css_to_file', true ) ) {
263
+ return false;
264
+ }
265
+
266
+ // Start capturing the output, to get HTML of the credentials form (if needed).
267
+ ob_start();
268
+ $credentials = request_filesystem_credentials( '', '', false, false, null );
269
+ // Do we have credentials already? (Otherwise the form will have been rendered already.)
270
+ if ( false === $credentials ) {
271
+ $form_data = ob_get_clean();
272
+ $form_data = str_replace( 'name="upgrade" id="upgrade" class="button"', 'name="upgrade" id="upgrade" class="button button-primary button-large"', $form_data );
273
+ return $form_data;
274
+ }
275
+
276
+ // We have received credentials, but don't know if they are valid yet.
277
+ if ( ! WP_Filesystem( $credentials ) ) {
278
+ // Credentials failed, so ask again (with $error flag true).
279
+ request_filesystem_credentials( '', '', true, false, null );
280
+ $form_data = ob_get_clean();
281
+ $form_data = str_replace( 'name="upgrade" id="upgrade" class="button"', 'name="upgrade" id="upgrade" class="button button-primary button-large"', $form_data );
282
+ return $form_data;
283
+ }
284
+
285
+ // We have valid access to the filesystem now -> try to save the files, or delete them if the "Custom CSS" is empty.
286
+ if ( '' !== $custom_css_normal ) {
287
+ return $this->_custom_css_save_helper( $custom_css_normal, $custom_css_minified );
288
+ } else {
289
+ return $this->_custom_css_delete_helper();
290
+ }
291
+ }
292
+
293
+ /**
294
+ * Save "Custom CSS" to files, if validated access to the WP_Filesystem exists.
295
+ *
296
+ * Helper function to prevent code duplication.
297
+ *
298
+ * @since 1.1.0
299
+ *
300
+ * @global WP_Filesystem_* $wp_filesystem WordPress file system abstraction object.
301
+ * @see save_custom_css_to_file()
302
+ * @see save_custom_css_to_file_plugin_options()
303
+ *
304
+ * @param string $custom_css_normal Custom CSS code to be saved.
305
+ * @param string $custom_css_minified Minified CSS code to be saved.
306
+ * @return bool True on success, false on failure.
307
+ */
308
+ protected function _custom_css_save_helper( $custom_css_normal, $custom_css_minified ) {
309
+ global $wp_filesystem;
310
+
311
+ /*
312
+ * WP_CONTENT_DIR and (FTP-)Content-Dir can be different (e.g. if FTP working dir is /).
313
+ * We need to account for that by replacing the path difference in the filename.
314
+ */
315
+ $path_difference = str_replace( $wp_filesystem->wp_content_dir(), '', trailingslashit( WP_CONTENT_DIR ) );
316
+
317
+ $css_types = array( 'normal', 'minified', 'combined' );
318
+
319
+ $default_css = $this->load_default_css_from_file();
320
+ if ( false === $default_css ) {
321
+ $default_css = '';
322
+ } else {
323
+ // Change relative URLs to web font files to absolute URLs, as combining the CSS files and saving to another directory breaks the relative URLs.
324
+ $absolute_path = plugins_url( 'css/tablepress.', TABLEPRESS__FILE__ );
325
+ // Make the absolute URL protocol-relative to prevent mixed content warnings.
326
+ $absolute_path = str_replace( array( 'http:', 'https:' ), '', $absolute_path );
327
+ $default_css = str_replace( 'url(tablepress.', 'url(' . $absolute_path, $default_css );
328
+ }
329
+ $file_content = array(
330
+ 'normal' => $custom_css_normal,
331
+ 'minified' => $custom_css_minified,
332
+ 'combined' => $default_css . "\n" . $custom_css_minified,
333
+ );
334
+
335
+ $total_result = true; // whether all files were saved successfully
336
+ foreach ( $css_types as $css_type ) {
337
+ $filename = $this->get_custom_css_location( $css_type, 'path' );
338
+ // Check if filename is valid (0 means yes).
339
+ if ( 0 !== validate_file( $filename ) ) {
340
+ $total_result = false;
341
+ continue;
342
+ }
343
+ if ( '' !== $path_difference ) {
344
+ $filename = str_replace( $path_difference, '', $filename );
345
+ }
346
+ $result = $wp_filesystem->put_contents( $filename, $file_content[ $css_type ], FS_CHMOD_FILE );
347
+ $total_result = ( $total_result && $result );
348
+ }
349
+
350
+ $this->_flush_caching_plugins_css_minify_caches();
351
+
352
+ return $total_result;
353
+ }
354
+
355
+ /**
356
+ * Delete the "Custom CSS" files, if possible.
357
+ *
358
+ * @since 1.0.0
359
+ *
360
+ * @return bool True on success, false on failure.
361
+ */
362
+ public function delete_custom_css_files() {
363
+ // Start capturing the output, to later prevent it.
364
+ ob_start();
365
+ $credentials = request_filesystem_credentials( '', '', false, false, null );
366
+ /*
367
+ * Do we have credentials already? (Otherwise the form will have been rendered, which is not supported here.)
368
+ * Or, if we have credentials, are they valid?
369
+ */
370
+ if ( false === $credentials || ! WP_Filesystem( $credentials ) ) {
371
+ ob_end_clean();
372
+ return false;
373
+ }
374
+
375
+ // We have valid access to the filesystem now -> try to delete the files.
376
+ return $this->_custom_css_delete_helper();
377
+ }
378
+
379
+ /**
380
+ * Delete "Custom CSS" files, if validated access to the WP_Filesystem exists.
381
+ *
382
+ * Helper function to prevent code duplication
383
+ *
384
+ * @since 1.1.0
385
+ *
386
+ * @global WP_Filesystem_* $wp_filesystem WordPress file system abstraction object.
387
+ * @see delete_custom_css_files()
388
+ * @see save_custom_css_to_file_plugin_options()
389
+ *
390
+ * @return bool True on success, false on failure.
391
+ */
392
+ protected function _custom_css_delete_helper() {
393
+ global $wp_filesystem;
394
+
395
+ /*
396
+ * WP_CONTENT_DIR and (FTP-)Content-Dir can be different (e.g. if FTP working dir is /).
397
+ * We need to account for that by replacing the path difference in the filename.
398
+ */
399
+ $path_difference = str_replace( $wp_filesystem->wp_content_dir(), '', trailingslashit( WP_CONTENT_DIR ) );
400
+
401
+ $css_types = array( 'normal', 'minified', 'combined' );
402
+ $total_result = true; // whether all files were deleted successfully
403
+ foreach ( $css_types as $css_type ) {
404
+ $filename = $this->get_custom_css_location( $css_type, 'path' );
405
+ // Check if filename is valid (0 means yes).
406
+ if ( 0 !== validate_file( $filename ) ) {
407
+ $total_result = false;
408
+ continue;
409
+ }
410
+ if ( '' !== $path_difference ) {
411
+ $filename = str_replace( $path_difference, '', $filename );
412
+ }
413
+ // We have valid access to the filesystem now -> try to delete the file.
414
+ if ( $wp_filesystem->exists( $filename ) ) {
415
+ $result = $wp_filesystem->delete( $filename );
416
+ $total_result = ( $total_result && $result );
417
+ }
418
+ }
419
+
420
+ $this->_flush_caching_plugins_css_minify_caches();
421
+
422
+ return $total_result;
423
+ }
424
+
425
+ /**
426
+ * Flush the CSS minification cache of W3 Total Cache.
427
+ *
428
+ * @since 1.4.0
429
+ */
430
+ protected function _flush_caching_plugins_css_minify_caches() {
431
+ /** This filter is documented in models/model-table.php */
432
+ if ( ! apply_filters( 'tablepress_flush_caching_plugins_caches', true ) ) {
433
+ return;
434
+ }
435
+
436
+ // W3 Total Cache
437
+ if ( function_exists( 'w3tc_minify_flush' ) ) {
438
+ w3tc_minify_flush();
439
+ }
440
+ }
441
+
442
+ } // class TablePress_CSS
classes/class-evaluate.php ADDED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress Formula Evaluation Class
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Formulas
7
+ * @author Tobias Bäthge
8
+ * @since 1.5.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * TablePress Formula Evaluation Class
16
+ *
17
+ * Before TablePress 1.5, this was part of the TablePress_Render class.
18
+ *
19
+ * @package TablePress
20
+ * @subpackage Formulas
21
+ * @author Tobias Bäthge
22
+ * @since 1.5.0
23
+ */
24
+ class TablePress_Evaluate {
25
+
26
+ /**
27
+ * Instance of the EvalMath class.
28
+ *
29
+ * @since 1.0.0
30
+ * @var EvalMath
31
+ */
32
+ protected $evalmath;
33
+
34
+ /**
35
+ * Table data in which formulas shall be evaluated.
36
+ *
37
+ * @since 1.5.0
38
+ * @var array
39
+ */
40
+ protected $table_data;
41
+
42
+ /**
43
+ * Storage for cell ranges that have been replaced in formulas.
44
+ *
45
+ * @since 1.0.0
46
+ * @var array
47
+ */
48
+ protected $known_ranges = array();
49
+
50
+ /**
51
+ * Initialize the Formula Evaluation class, include the EvalMath class.
52
+ *
53
+ * @since 1.0.0
54
+ */
55
+ public function __construct() {
56
+ $this->evalmath = TablePress::load_class( 'EvalMath', 'evalmath.class.php', 'libraries' );
57
+ // Don't raise PHP warnings.
58
+ $this->evalmath->suppress_errors = true;
59
+ }
60
+
61
+ /**
62
+ * Evaluate formulas in the passed table.
63
+ *
64
+ * @since 1.0.0
65
+ *
66
+ * @param array $table_data Table data in which formulas shall be evaluated.
67
+ * @return array Table data with evaluated formulas.
68
+ */
69
+ public function evaluate_table_data( array $table_data ) {
70
+ $this->table_data = $table_data;
71
+
72
+ $rows = count( $this->table_data );
73
+ $columns = count( $this->table_data[0] );
74
+ // Use two for-loops instead of foreach here to be sure to always work on the "live" table data and not some in-memory copy.
75
+ for ( $row_idx = 0; $row_idx < $rows; $row_idx++ ) {
76
+ for ( $col_idx = 0; $col_idx < $columns; $col_idx++ ) {
77
+ $this->table_data[ $row_idx ][ $col_idx ] = $this->_evaluate_cell( $this->table_data[ $row_idx ][ $col_idx ] );
78
+ }
79
+ }
80
+
81
+ return $this->table_data;
82
+ }
83
+
84
+ /**
85
+ * Parse and evaluate the content of a cell.
86
+ *
87
+ * @since 1.0.0
88
+ *
89
+ * @param string $content Content of a cell.
90
+ * @param array $parents Optional. List of cells that depend on this cell (to prevent circle references).
91
+ * @return string Result of the parsing/evaluation.
92
+ */
93
+ protected function _evaluate_cell( $content, array $parents = array() ) {
94
+ if ( '' === $content || '=' === $content || '=' !== $content[0] ) {
95
+ return $content;
96
+ }
97
+
98
+ // Cut off the leading =.
99
+ $content = substr( $content, 1 );
100
+
101
+ // Support putting formulas in strings, like =Total: {A3+A4}.
102
+ $expressions = array();
103
+ if ( preg_match_all( '#{(.+?)}#', $content, $expressions, PREG_SET_ORDER ) ) {
104
+ $formula_in_string = true;
105
+ } else {
106
+ $formula_in_string = false;
107
+ // Fill array so that it has the same structure as if it came from preg_match_all().
108
+ $expressions[] = array( $content, $content );
109
+ }
110
+
111
+ foreach ( $expressions as $expression ) {
112
+ $orig_expression = $expression[0];
113
+ $expression = $expression[1];
114
+
115
+ $replaced_references = $replaced_ranges = array();
116
+
117
+ // Remove all whitespace characters.
118
+ $expression = str_replace( array( "\n", "\r", "\t", ' ' ), '', $expression );
119
+
120
+ // Expand cell ranges (like A3:A6) to a list of single cells (like A3,A4,A5,A6).
121
+ if ( preg_match_all( '#([A-Z]+)([0-9]+):([A-Z]+)([0-9]+)#', $expression, $referenced_cell_ranges, PREG_SET_ORDER ) ) {
122
+ foreach ( $referenced_cell_ranges as $cell_range ) {
123
+ if ( in_array( $cell_range[0], $replaced_ranges, true ) ) {
124
+ continue;
125
+ }
126
+
127
+ $replaced_ranges[] = $cell_range[0];
128
+
129
+ if ( isset( $this->known_ranges[ $cell_range[0] ] ) ) {
130
+ $expression = preg_replace( '#(?<![A-Z])' . preg_quote( $cell_range[0], '#' ) . '(?![0-9])#', $this->known_ranges[ $cell_range[0] ], $expression );
131
+ continue;
132
+ }
133
+
134
+ // No -1 necessary for this transformation, as we don't actually access the table.
135
+ $first_col = TablePress::letter_to_number( $cell_range[1] );
136
+ $first_row = $cell_range[2];
137
+ $last_col = TablePress::letter_to_number( $cell_range[3] );
138
+ $last_row = $cell_range[4];
139
+
140
+ $col_start = min( $first_col, $last_col );
141
+ $col_end = max( $first_col, $last_col ) + 1; // +1 for loop below
142
+ $row_start = min( $first_row, $last_row );
143
+ $row_end = max( $first_row, $last_row ) + 1; // +1 for loop below
144
+
145
+ $cell_list = array();
146
+ for ( $col = $col_start; $col < $col_end; $col++ ) {
147
+ for ( $row = $row_start; $row < $row_end; $row++ ) {
148
+ $column = TablePress::number_to_letter( $col );
149
+ $cell_list[] = "{$column}{$row}";
150
+ }
151
+ }
152
+ $cell_list = implode( ',', $cell_list );
153
+
154
+ $expression = preg_replace( '#(?<![A-Z])' . preg_quote( $cell_range[0], '#' ) . '(?![0-9])#', $cell_list, $expression );
155
+ $this->known_ranges[ $cell_range[0] ] = $cell_list;
156
+ }
157
+ }
158
+
159
+ // Parse and evaluate single cell references (like A3 or XY312), while prohibiting circle references.
160
+ if ( preg_match_all( '#([A-Z]+)([0-9]+)#', $expression, $referenced_cells, PREG_SET_ORDER ) ) {
161
+ foreach ( $referenced_cells as $cell_reference ) {
162
+ if ( in_array( $cell_reference[0], $parents, true ) ) {
163
+ return '!ERROR! Circle Reference';
164
+ }
165
+
166
+ if ( in_array( $cell_reference[0], $replaced_references, true ) ) {
167
+ continue;
168
+ }
169
+
170
+ $replaced_references[] = $cell_reference[0];
171
+
172
+ $ref_col = TablePress::letter_to_number( $cell_reference[1] ) - 1;
173
+ $ref_row = $cell_reference[2] - 1;
174
+
175
+ if ( ! isset( $this->table_data[ $ref_row ] ) || ! isset( $this->table_data[ $ref_row ][ $ref_col ] ) ) {
176
+ return "!ERROR! Cell {$cell_reference[0]} does not exist";
177
+ }
178
+
179
+ $ref_parents = $parents;
180
+ $ref_parents[] = $cell_reference[0];
181
+
182
+ $result = $this->table_data[ $ref_row ][ $ref_col ] = $this->_evaluate_cell( $this->table_data[ $ref_row ][ $ref_col ], $ref_parents );
183
+ // Bail if there was an error already.
184
+ if ( false !== strpos( $result, '!ERROR!' ) ) {
185
+ return $result;
186
+ }
187
+ // Remove all whitespace characters.
188
+ $result = str_replace( array( "\n", "\r", "\t", ' ' ), '', $result );
189
+ // Treat empty cells as 0.
190
+ if ( '' === $result ) {
191
+ $result = 0;
192
+ }
193
+ // Bail if the cell does not result in a number (meaning it was a number or expression before being evaluated).
194
+ if ( ! is_numeric( $result ) ) {
195
+ return "!ERROR! {$cell_reference[0]} does not contain a number or expression";
196
+ }
197
+
198
+ $expression = preg_replace( '#(?<![A-Z])' . $cell_reference[0] . '(?![0-9])#', $result, $expression );
199
+ }
200
+ }
201
+
202
+ $result = $this->_evaluate_math_expression( $expression );
203
+ // Support putting formulas in strings, like =Total: {A3+A4}.
204
+ if ( $formula_in_string ) {
205
+ $content = str_replace( $orig_expression, $result, $content );
206
+ } else {
207
+ $content = $result;
208
+ }
209
+ }
210
+
211
+ return $content;
212
+ }
213
+
214
+ /**
215
+ * Evaluate a math expression.
216
+ *
217
+ * @since 1.0.0
218
+ *
219
+ * @param string $expression without leading = sign.
220
+ * @return string Result of the evaluation.
221
+ */
222
+ protected function _evaluate_math_expression( $expression ) {
223
+ // Straight up evaluation, without parsing of variable or function assignments (which is why we only need one instance of the object).
224
+ $result = $this->evalmath->evaluate( $expression );
225
+ if ( false === $result ) {
226
+ return '!ERROR! ' . $this->evalmath->last_error;
227
+ } else {
228
+ return (string) $result;
229
+ }
230
+ }
231
+
232
+ } // class TablePress_Evaluate
classes/class-export.php ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress Table Export Class
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Export/Import
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * TablePress Table Export Class
16
+ * @package TablePress
17
+ * @subpackage Export/Import
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ class TablePress_Export {
22
+
23
+ /**
24
+ * File/Data Formats that are available for the export.
25
+ *
26
+ * @since 1.0.0
27
+ * @var array
28
+ */
29
+ public $export_formats = array();
30
+
31
+ /**
32
+ * Delimiters for the CSV export.
33
+ *
34
+ * @since 1.0.0
35
+ * @var array
36
+ */
37
+ public $csv_delimiters = array();
38
+
39
+ /**
40
+ * Whether ZIP archive support is available in the PHP installation on the server.
41
+ *
42
+ * @since 1.0.0
43
+ * @var bool
44
+ */
45
+ public $zip_support_available = false;
46
+
47
+ /**
48
+ * Initialize the Export class.
49
+ *
50
+ * @since 1.0.0
51
+ */
52
+ public function __construct() {
53
+ // Initiate here, because function call not possible outside a class method.
54
+ $this->export_formats = array(
55
+ 'csv' => __( 'CSV - Character-Separated Values', 'tablepress' ),
56
+ 'html' => __( 'HTML - Hypertext Markup Language', 'tablepress' ),
57
+ 'json' => __( 'JSON - JavaScript Object Notation', 'tablepress' ),
58
+ );
59
+ $this->csv_delimiters = array(
60
+ ';' => __( '; (semicolon)', 'tablepress' ),
61
+ ',' => __( ', (comma)', 'tablepress' ),
62
+ 'tab' => __( '\t (tabulator)', 'tablepress' ),
63
+ );
64
+
65
+ /** This filter is documented in the WordPress function unzip_file() in wp-admin/includes/file.php */
66
+ if ( class_exists( 'ZipArchive' ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) {
67
+ $this->zip_support_available = true;
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Export a table.
73
+ *
74
+ * @since 1.0.0
75
+ *
76
+ * @param array $table Table to be exported.
77
+ * @param string $export_format Format for the export ('csv', 'html', 'json').
78
+ * @param string $csv_delimiter Delimiter for CSV export.
79
+ * @return string Exported table (only data for CSV and HTML, full tables (including options) for JSON).
80
+ */
81
+ public function export_table( array $table, $export_format, $csv_delimiter ) {
82
+ switch ( $export_format ) {
83
+ case 'csv':
84
+ $output = '';
85
+ if ( 'tab' === $csv_delimiter ) {
86
+ $csv_delimiter = "\t";
87
+ }
88
+ foreach ( $table['data'] as $row_idx => $row ) {
89
+ $csv_row = array();
90
+ foreach ( $row as $column_idx => $cell_content ) {
91
+ $csv_row[] = $this->csv_wrap_and_escape( $cell_content, $csv_delimiter );
92
+ }
93
+ $output .= implode( $csv_delimiter, $csv_row );
94
+ $output .= "\n";
95
+ }
96
+ break;
97
+ case 'html':
98
+ $num_rows = count( $table['data'] );
99
+ $last_row_idx = $num_rows - 1;
100
+ $thead = '';
101
+ $tfoot = '';
102
+ $tbody = array();
103
+
104
+ foreach ( $table['data'] as $row_idx => $row ) {
105
+ // First row, need to check for head (but only if at least two rows).
106
+ if ( 0 === $row_idx && $table['options']['table_head'] && $num_rows > 1 ) {
107
+ $thead = $this->html_render_row( $row, 'th' );
108
+ continue;
109
+ }
110
+ // Last row, need to check for footer (but only if at least two rows).
111
+ if ( $last_row_idx === $row_idx && $table['options']['table_foot'] && $num_rows > 1 ) {
112
+ $tfoot = $this->html_render_row( $row, 'th' );
113
+ continue;
114
+ }
115
+ // Neither first nor last row (with respective head/foot enabled), so render as body row.
116
+ $tbody[] = $this->html_render_row( $row, 'td' );
117
+ }
118
+
119
+ // <thead>, <tfoot>, and <tbody> tags.
120
+ if ( ! empty( $thead ) ) {
121
+ $thead = "\t<thead>\n{$thead}\t</thead>\n";
122
+ }
123
+ if ( ! empty( $tfoot ) ) {
124
+ $tfoot = "\t<tfoot>\n{$tfoot}\t</tfoot>\n";
125
+ }
126
+ $tbody = "\t<tbody>\n" . implode( '', $tbody ) . "\t</tbody>\n";
127
+
128
+ $output = "<table>\n" . $thead . $tfoot . $tbody . "</table>\n";
129
+ break;
130
+ case 'json':
131
+ $output = json_encode( $table );
132
+ break;
133
+ default:
134
+ $output = '';
135
+ }
136
+
137
+ return $output;
138
+ }
139
+
140
+ /**
141
+ * Wrap and escape a cell for CSV export.
142
+ *
143
+ * @since 1.0.0
144
+ *
145
+ * @param string $string Content of a cell.
146
+ * @param string $delimiter CSV delimiter character.
147
+ * @return string Wrapped string for CSV export
148
+ */
149
+ protected function csv_wrap_and_escape( $string, $delimiter ) {
150
+ // Escape CSV delimiter for RegExp (e.g. '|').
151
+ $delimiter = preg_quote( $delimiter, '#' );
152
+ if ( 1 === preg_match( '#' . $delimiter . '|"|\n|\r#i', $string ) || ' ' === substr( $string, 0, 1 ) || ' ' === substr( $string, -1 ) ) {
153
+ // Escape single " as double "".
154
+ $string = str_replace( '"', '""', $string );
155
+ // Wrap string in "".
156
+ $string = '"' . $string . '"';
157
+ }
158
+ return $string;
159
+ }
160
+
161
+ /**
162
+ * Generate the HTML of a row.
163
+ *
164
+ * @since 1.0.0
165
+ *
166
+ * @param array $row Cells of the row to be rendered.
167
+ * @param string $tag HTML tag to use for the cells (td or th).
168
+ * @return string HTML code for the row.
169
+ */
170
+ protected function html_render_row( array $row, $tag ) {
171
+ $output = "\t\t<tr>\n";
172
+ array_walk( $row, array( $this, 'html_wrap_and_escape' ), $tag );
173
+ $output .= implode( '', $row );
174
+ $output .= "\t\t</tr>\n";
175
+ return $output;
176
+ }
177
+
178
+ /**
179
+ * Wrap and escape a cell for HTML export.
180
+ *
181
+ * @since 1.0.0
182
+ *
183
+ * @param string $cell_content Content of a cell.
184
+ * @param int|null $column_idx Column index, or null if omitted. Unused, but defined to be able to use function as callback in array_walk().
185
+ * @param string $html_tag HTML tag that shall be used for the cell.
186
+ */
187
+ protected function html_wrap_and_escape( &$cell_content, $column_idx, $html_tag ) {
188
+ /*
189
+ * Replace any & with &amp; that is not already an encoded entity (from function htmlentities2 in WP 2.8).
190
+ * A complete htmlentities2() or htmlspecialchars() would encode <HTML> tags, which we don't want.
191
+ */
192
+ $cell_content = preg_replace( '/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,4};)/', '&amp;', $cell_content );
193
+ $cell_content = "\t\t\t<{$html_tag}>{$cell_content}</{$html_tag}>\n";
194
+ }
195
+
196
+ } // class TablePress_Export
classes/class-import.php ADDED
@@ -0,0 +1,491 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress Table Import Class
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Export/Import
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * TablePress Table Import Class
16
+ * @package TablePress
17
+ * @subpackage Export/Import
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ class TablePress_Import {
22
+
23
+ /**
24
+ * File/Data Formats that are available for import.
25
+ *
26
+ * @since 1.0.0
27
+ * @var array
28
+ */
29
+ public $import_formats = array();
30
+
31
+ /**
32
+ * Whether ZIP archive support is available in the PHP installation on the server.
33
+ *
34
+ * @since 1.0.0
35
+ * @var bool
36
+ */
37
+ public $zip_support_available = false;
38
+
39
+ /**
40
+ * Whether HTML import support is available in the PHP installation on the server.
41
+ *
42
+ * @since 1.0.0
43
+ * @var bool
44
+ */
45
+ public $html_import_support_available = false;
46
+
47
+ /**
48
+ * Data to be imported.
49
+ *
50
+ * @since 1.0.0
51
+ * @var string
52
+ */
53
+ protected $import_data;
54
+
55
+ /**
56
+ * Imported table.
57
+ *
58
+ * @since 1.0.0
59
+ * @var array
60
+ */
61
+ protected $imported_table = false;
62
+
63
+ /**
64
+ * Initialize the Import class.
65
+ *
66
+ * @since 1.0.0
67
+ */
68
+ public function __construct() {
69
+ /** This filter is documented in the WordPress function unzip_file() in wp-admin/includes/file.php */
70
+ if ( class_exists( 'ZipArchive' ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) {
71
+ $this->zip_support_available = true;
72
+ }
73
+
74
+ if ( class_exists( 'DOMDocument' ) && function_exists( 'simplexml_import_dom' ) && function_exists( 'libxml_use_internal_errors' ) ) {
75
+ $this->html_import_support_available = true;
76
+ }
77
+
78
+ // Initiate here, because function call not possible outside a class method.
79
+ $this->import_formats = array();
80
+ $this->import_formats['csv'] = __( 'CSV - Character-Separated Values', 'tablepress' );
81
+ if ( $this->html_import_support_available ) {
82
+ $this->import_formats['html'] = __( 'HTML - Hypertext Markup Language', 'tablepress' );
83
+ }
84
+ $this->import_formats['json'] = __( 'JSON - JavaScript Object Notation', 'tablepress' );
85
+ $this->import_formats['xls'] = __( 'XLS - Microsoft Excel 97-2003 (experimental)', 'tablepress' );
86
+ $this->import_formats['xlsx'] = __( 'XLSX - Microsoft Excel 2007-2013 (experimental)', 'tablepress' );
87
+ }
88
+
89
+ /**
90
+ * Import a table.
91
+ *
92
+ * @since 1.0.0
93
+ *
94
+ * @param string $format Import format.
95
+ * @param string $data Data to import.
96
+ * @return bool|array False on error, table array on success.
97
+ */
98
+ public function import_table( $format, $data ) {
99
+ $this->import_data = $data;
100
+
101
+ if ( ! in_array( $format, array( 'xlsx', 'xls' ) ) ) {
102
+ $this->fix_table_encoding();
103
+ }
104
+
105
+ switch ( $format ) {
106
+ case 'csv':
107
+ $this->import_csv();
108
+ break;
109
+ case 'html':
110
+ $this->import_html();
111
+ break;
112
+ case 'json':
113
+ $this->import_json();
114
+ break;
115
+ case 'xlsx':
116
+ $this->import_xlsx();
117
+ break;
118
+ case 'xls':
119
+ $this->import_xls();
120
+ break;
121
+ default:
122
+ return false;
123
+ }
124
+
125
+ return $this->imported_table;
126
+ }
127
+
128
+ /**
129
+ * Import CSV data.
130
+ *
131
+ * @since 1.0.0
132
+ */
133
+ protected function import_csv() {
134
+ $csv_parser = TablePress::load_class( 'CSV_Parser', 'csv-parser.class.php', 'libraries' );
135
+ $csv_parser->load_data( $this->import_data );
136
+ $delimiter = $csv_parser->find_delimiter();
137
+ $data = $csv_parser->parse( $delimiter );
138
+ $this->imported_table = array( 'data' => $this->pad_array_to_max_cols( $data ) );
139
+ }
140
+
141
+ /**
142
+ * Import HTML data.
143
+ *
144
+ * @since 1.0.0
145
+ */
146
+ protected function import_html() {
147
+ if ( ! $this->html_import_support_available ) {
148
+ return false;
149
+ }
150
+
151
+ /* Extract table from HTML, pattern: <table> (with eventually class, id, ...
152
+ * . means any charactery (except newline),
153
+ * * means in any count,
154
+ * ? means non-gready (shortest possible),
155
+ * is at the end: i: case-insensitive, s: include newline (in .)
156
+ */
157
+ if ( 1 === preg_match( '#<table.*?>.*?</table>#is', $this->import_data, $matches ) ) {
158
+ $temp_data = $matches[0]; // if found, take match as table to import
159
+ } else {
160
+ $this->imported_table = false;
161
+ return;
162
+ }
163
+
164
+ // Prepend XML declaration, for better encoding support.
165
+ $temp_data = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . $temp_data;
166
+ if ( function_exists( 'libxml_disable_entity_loader' ) ) {
167
+ // Don't expand external entities (see http://websec.io/2012/08/27/Preventing-XXE-in-PHP.html).
168
+ libxml_disable_entity_loader( true );
169
+ }
170
+ // No warnings/errors raised, but stored internally.
171
+ libxml_use_internal_errors( true );
172
+ $dom = new DOMDocument( '1.0', 'UTF-8' );
173
+ // No strict checking for invalid HTML.
174
+ $dom->strictErrorChecking = false;
175
+ $dom->loadHTML( $temp_data );
176
+ if ( false === $dom ) {
177
+ $this->imported_table = false;
178
+ return;
179
+ }
180
+ $table_html = simplexml_import_dom( $dom );
181
+ if ( false === $table_html ) {
182
+ $this->imported_table = false;
183
+ return;
184
+ }
185
+
186
+ $errors = libxml_get_errors();
187
+ libxml_clear_errors();
188
+ if ( ! empty( $errors ) ) {
189
+ $output = '<strong>' . __( 'The imported file contains errors:', 'tablepress' ) . '</strong><br /><br />';
190
+ foreach ( $errors as $error ) {
191
+ switch ( $error->level ) {
192
+ case LIBXML_ERR_WARNING:
193
+ $output .= "Warning {$error->code}: {$error->message} in line {$error->line}, column {$error->column}<br />";
194
+ break;
195
+ case LIBXML_ERR_ERROR:
196
+ $output .= "Error {$error->code}: {$error->message} in line {$error->line}, column {$error->column}<br />";
197
+ break;
198
+ case LIBXML_ERR_FATAL:
199
+ $output .= "Fatal Error {$error->code}: {$error->message} in line {$error->line}, column {$error->column}<br />";
200
+ break;
201
+ }
202
+ }
203
+ wp_die( $output, 'Import Error', array( 'response' => 200, 'back_link' => true ) );
204
+ }
205
+
206
+ $table = $table_html->body->table;
207
+
208
+ $html_table = array(
209
+ 'data' => array(),
210
+ 'options' => array(),
211
+ );
212
+ if ( isset( $table->thead ) ) {
213
+ $html_table['data'] = array_merge( $html_table['data'], $this->_import_html_rows( $table->thead[0]->tr ) );
214
+ $html_table['options']['table_head'] = true;
215
+ }
216
+ if ( isset( $table->tbody ) ) {
217
+ $html_table['data'] = array_merge( $html_table['data'], $this->_import_html_rows( $table->tbody[0]->tr ) );
218
+ }
219
+ if ( isset( $table->tr ) ) {
220
+ $html_table['data'] = array_merge( $html_table['data'], $this->_import_html_rows( $table->tr ) );
221
+ }
222
+ if ( isset( $table->tfoot ) ) {
223
+ $html_table['data'] = array_merge( $html_table['data'], $this->_import_html_rows( $table->tfoot[0]->tr ) );
224
+ $html_table['options']['table_foot'] = true;
225
+ }
226
+
227
+ $html_table['data'] = $this->pad_array_to_max_cols( $html_table['data'] );
228
+ $this->imported_table = $html_table;
229
+ }
230
+
231
+ /**
232
+ * Helper for HTML import.
233
+ *
234
+ * @since 1.0.0
235
+ *
236
+ * @param SimpleXMLElement $element XMLElement.
237
+ * @return array SimpleXMLElement exported to an array.
238
+ */
239
+ protected function _import_html_rows( $element ) {
240
+ $rows = array();
241
+ foreach ( $element as $row ) {
242
+ $new_row = array();
243
+ foreach ( $row as $cell ) {
244
+ // Get text between <td>...</td>, or <th>...</th>, possibly with attributes.
245
+ if ( 1 === preg_match( '#<t(?:d|h).*?>(.*)</t(?:d|h)>#is', $cell->asXML(), $matches ) ) {
246
+ /*
247
+ * Decode HTML entities again, as there might be some left especially in attributes of HTML tags in the cells,
248
+ * see http://php.net/manual/en/simplexmlelement.asxml.php#107137 .
249
+ */
250
+ $matches[1] = html_entity_decode( $matches[1], ENT_NOQUOTES, 'UTF-8' );
251
+ $new_row[] = $matches[1];
252
+ } else {
253
+ $new_row[] = '';
254
+ }
255
+ }
256
+ $rows[] = $new_row;
257
+ }
258
+ return $rows;
259
+ }
260
+
261
+ /**
262
+ * Import JSON data.
263
+ *
264
+ * @since 1.0.0
265
+ */
266
+ protected function import_json() {
267
+ $json_table = json_decode( $this->import_data, true );
268
+
269
+ // Check if JSON could be decoded.
270
+ if ( is_null( $json_table ) ) {
271
+ if ( function_exists( 'json_last_error' ) ) {
272
+ // Constant JSON_ERROR_UTF8 is only available as of PHP 5.3.3.
273
+ if ( ! defined( 'JSON_ERROR_UTF8' ) ) {
274
+ define( 'JSON_ERROR_UTF8', 5 );
275
+ }
276
+
277
+ switch ( json_last_error() ) {
278
+ case JSON_ERROR_NONE:
279
+ // Should never happen here, as this is only called in case of an error.
280
+ $json_error = 'JSON_ERROR_NONE';
281
+ break;
282
+ case JSON_ERROR_DEPTH:
283
+ $json_error = 'JSON_ERROR_DEPTH';
284
+ break;
285
+ case JSON_ERROR_STATE_MISMATCH:
286
+ $json_error = 'JSON_ERROR_STATE_MISMATCH';
287
+ break;
288
+ case JSON_ERROR_CTRL_CHAR:
289
+ $json_error = 'JSON_ERROR_CTRL_CHAR';
290
+ break;
291
+ case JSON_ERROR_SYNTAX:
292
+ $json_error = 'JSON_ERROR_SYNTAX';
293
+ break;
294
+ case JSON_ERROR_UTF8:
295
+ $json_error = 'JSON_ERROR_UTF8';
296
+ break;
297
+ default:
298
+ $json_error = 'UNKNOWN ERROR';
299
+ break;
300
+ }
301
+ $output = '<strong>' . __( 'The imported file contains errors:', 'tablepress' ) . "</strong><br /><br />{$json_error}<br />";
302
+ wp_die( $output, 'Import Error', array( 'response' => 200, 'back_link' => true ) );
303
+ } else {
304
+ // No JSON error detection available.
305
+ $this->imported_table = false;
306
+ return;
307
+ }
308
+ } else {
309
+ // Specifically cast to an array again.
310
+ $json_table = (array) $json_table;
311
+ }
312
+
313
+ if ( isset( $json_table['data'] ) ) {
314
+ // JSON data contained a full export.
315
+ $table = $json_table;
316
+ } else {
317
+ // JSON data contained only the data of a table, but no options.
318
+ $table = array( 'data' => array() );
319
+ foreach ( $json_table as $row ) {
320
+ $table['data'][] = array_values( (array) $row );
321
+ }
322
+ }
323
+
324
+ $table['data'] = $this->pad_array_to_max_cols( $table['data'] );
325
+ $this->imported_table = $table;
326
+ }
327
+
328
+ /**
329
+ * Import Microsoft Excel 97-2003 data.
330
+ *
331
+ * @since 1.1.0
332
+ */
333
+ protected function import_xls() {
334
+ $excel_reader = TablePress::load_class( 'Spreadsheet_Excel_Reader', 'excel-reader.class.php', 'libraries', $this->import_data );
335
+
336
+ // Loop through Excel file and retrieve value and colspan/rowspan properties for each cell.
337
+ $sheet = 0; // 0 means first sheet of the Workbook
338
+ $table = array();
339
+ for ( $row = 1; $row <= $excel_reader->rowcount( $sheet ); $row++ ) {
340
+ $table_row = array();
341
+ for ( $col = 1; $col <= $excel_reader->colcount( $sheet ); $col++ ) {
342
+ $cell = array();
343
+ $cell['rowspan'] = $excel_reader->rowspan( $row, $col, $sheet );
344
+ $cell['colspan'] = $excel_reader->colspan( $row, $col, $sheet );
345
+ $cell['val'] = $excel_reader->val( $row, $col, $sheet );
346
+ $table_row[] = $cell;
347
+ }
348
+ $table[] = $table_row;
349
+ }
350
+
351
+ // Transform colspan/rowspan properties to TablePress equivalent (cell content).
352
+ foreach ( $table as $row_idx => $row ) {
353
+ foreach ( $row as $col_idx => $cell ) {
354
+ if ( 1 === $cell['rowspan'] && 1 === $cell['colspan'] ) {
355
+ continue;
356
+ }
357
+
358
+ if ( 1 < $cell['colspan'] ) {
359
+ for ( $i = 1; $i < $cell['colspan']; $i++ ) {
360
+ $table[ $row_idx ][ $col_idx + $i ]['val'] = '#colspan#';
361
+ }
362
+ }
363
+ if ( 1 < $cell['rowspan'] ) {
364
+ for ( $i = 1; $i < $cell['rowspan']; $i++ ) {
365
+ $table[ $row_idx + $i ][ $col_idx ]['val'] = '#rowspan#';
366
+ }
367
+ }
368
+
369
+ if ( 1 < $cell['rowspan'] && 1 < $cell['colspan'] ) {
370
+ for ( $i = 1; $i < $cell['rowspan']; $i++ ) {
371
+ for ( $j = 1; $j < $cell['colspan']; $j++ ) {
372
+ $table[ $row_idx + $i ][ $col_idx + $j ]['val'] = '#span#';
373
+ }
374
+ }
375
+ }
376
+ }
377
+ }
378
+
379
+ // Flatten value property to two-dimensional array.
380
+ $result_table = array();
381
+ foreach ( $table as $row_idx => $row ) {
382
+ $table_row = array();
383
+ foreach ( $row as $col_idx => $cell ) {
384
+ $table_row[] = (string) $cell['val'];
385
+ }
386
+ $result_table[] = $table_row;
387
+ }
388
+
389
+ $this->imported_table = array( 'data' => $this->pad_array_to_max_cols( $result_table ) );
390
+ }
391
+
392
+ /**
393
+ * Import Microsoft Excel 2007-2013 data.
394
+ *
395
+ * @since 1.1.0
396
+ */
397
+ protected function import_xlsx() {
398
+ TablePress::load_file( 'simplexlsx.class.php', 'libraries' );
399
+ $simplexlsx = new SimpleXLSX( $this->import_data, true );
400
+
401
+ if ( $simplexlsx->success() && 0 < $simplexlsx->sheetsCount() ) {
402
+ // Get Worksheet ID of the first Worksheet (not necessarily "1", which is the default in SimpleXLSX).
403
+ $sheet_ids = array_keys( $simplexlsx->sheetNames() );
404
+ $worksheet_id = $sheet_ids[0];
405
+ $this->imported_table = array( 'data' => $this->pad_array_to_max_cols( $simplexlsx->rows( $worksheet_id ) ) );
406
+ } else {
407
+ $output = '<strong>' . __( 'The imported file contains errors:', 'tablepress' ) . '</strong><br /><br />' . $simplexlsx->error() . '<br />';
408
+ wp_die( $output, 'Import Error', array( 'response' => 200, 'back_link' => true ) );
409
+ }
410
+ }
411
+
412
+ /**
413
+ * Make sure array is rectangular with $max_cols columns in every row.
414
+ *
415
+ * @since 1.0.0
416
+ *
417
+ * @param array $array Two-dimensional array to be padded.
418
+ * @return array Padded array.
419
+ */
420
+ public function pad_array_to_max_cols( array $array ) {
421
+ $rows = count( $array );
422
+ $rows = ( $rows > 0 ) ? $rows : 1;
423
+ $max_columns = $this->count_max_columns( $array );
424
+ $max_columns = ( $max_columns > 0 ) ? $max_columns : 1;
425
+ // array_map wants arrays as additional parameters, so we create one with the max_columns to pad to and one with the value to use (empty string).
426
+ $max_columns_array = array_fill( 1, $rows, $max_columns );
427
+ $pad_values_array = array_fill( 1, $rows, '' );
428
+ return array_map( 'array_pad', $array, $max_columns_array, $pad_values_array );
429
+ }
430
+
431
+ /**
432
+ * Get the highest number of columns in the rows.
433
+ *
434
+ * @since 1.0.0
435
+ *
436
+ * @param array $array Two-dimensional array.
437
+ * @return int Highest number of columns in the rows of the array.
438
+ */
439
+ protected function count_max_columns( array $array ) {
440
+ $max_columns = 0;
441
+ foreach ( $array as $row_idx => $row ) {
442
+ $num_columns = count( $row );
443
+ $max_columns = max( $num_columns, $max_columns );
444
+ }
445
+ return $max_columns;
446
+ }
447
+
448
+ /**
449
+ * Fixes the encoding to UTF-8 for the entire string that is to be imported.
450
+ *
451
+ * @since 1.0.0
452
+ *
453
+ * @link http://stevephillips.me/blog/dealing-php-and-character-encoding
454
+ */
455
+ protected function fix_table_encoding() {
456
+ // Check and remove possible UTF-8 Byte-Order Mark (BOM).
457
+ $bom = pack( 'CCC', 0xef, 0xbb, 0xbf );
458
+ if ( 0 === strncmp( $this->import_data, $bom, 3 ) ) {
459
+ $this->import_data = substr( $this->import_data, 3 );
460
+ // If data has a BOM, it's UTF-8, so further checks unnecessary.
461
+ return;
462
+ }
463
+
464
+ // Require the iconv() function for the following checks.
465
+ if ( ! function_exists( 'iconv' ) ) {
466
+ return;
467
+ }
468
+
469
+ // Check for possible UTF-16 BOMs ("little endian" and "big endian") and try to convert the data to UTF-8.
470
+ if ( "\xFF\xFE" === substr( $this->import_data, 0, 2 ) || "\xFE\xFF" === substr( $this->import_data, 0, 2 ) ) {
471
+ $data = @iconv( 'UTF-16', 'UTF-8', $this->import_data );
472
+ if ( false !== $data ) {
473
+ $this->import_data = $data;
474
+ return;
475
+ }
476
+ }
477
+
478
+ // Detect the character encoding and convert to UTF-8, if it's different.
479
+ if ( function_exists( 'mb_detect_encoding' ) ) {
480
+ $current_encoding = mb_detect_encoding( $this->import_data, 'ASCII, UTF-8, ISO-8859-1' );
481
+ if ( 'UTF-8' !== $current_encoding ) {
482
+ $data = @iconv( $current_encoding, 'UTF-8', $this->import_data );
483
+ if ( false !== $data ) {
484
+ $this->import_data = $data;
485
+ return;
486
+ }
487
+ }
488
+ }
489
+ }
490
+
491
+ } // class TablePress_Import
classes/class-model.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress Base Model with members and methods for all models
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Models
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * TablePress Base Model class
16
+ * @package TablePress
17
+ * @subpackage Models
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ abstract class TablePress_Model {
22
+
23
+ /**
24
+ * Initialize all models.
25
+ *
26
+ * @since 1.0.0
27
+ */
28
+ public function __construct() {
29
+ // Intentionally left blank.
30
+ }
31
+
32
+ } // class TablePress_Model
classes/class-render.php ADDED
@@ -0,0 +1,909 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress Rendering Class
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Rendering
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * TablePress Rendering Class
16
+ * @package TablePress
17
+ * @subpackage Rendering
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ class TablePress_Render {
22
+
23
+ /**
24
+ * Table data that is rendered.
25
+ *
26
+ * @since 1.0.0
27
+ * @var array
28
+ */
29
+ protected $table = array();
30
+
31
+ /**
32
+ * Table options that influence the output result.
33
+ *
34
+ * @since 1.0.0
35
+ * @var array
36
+ */
37
+ protected $render_options = array();
38
+
39
+ /**
40
+ * Rendered HTML of the table.
41
+ *
42
+ * @since 1.0.0
43
+ * @var string
44
+ */
45
+ protected $output;
46
+
47
+ /**
48
+ * Trigger words for colspan, rowspan, or the combination of both.
49
+ *
50
+ * @since 1.0.0
51
+ * @var array
52
+ */
53
+ protected $span_trigger = array(
54
+ 'colspan' => '#colspan#',
55
+ 'rowspan' => '#rowspan#',
56
+ 'span' => '#span#',
57
+ );
58
+
59
+ /**
60
+ * Buffer to store the counts of rowspan per column, initialized in _render_table().
61
+ *
62
+ * @since 1.0.0
63
+ * @var array
64
+ */
65
+ protected $rowspan = array();
66
+
67
+ /**
68
+ * Buffer to store the counts of colspan per row, initialized in _render_table().
69
+ *
70
+ * @since 1.0.0
71
+ * @var array
72
+ */
73
+ protected $colspan = array();
74
+
75
+ /**
76
+ * Index of the last row of the visible data in the table, set in _render_table().
77
+ *
78
+ * @since 1.0.0
79
+ * @var int
80
+ */
81
+ protected $last_row_idx;
82
+
83
+ /**
84
+ * Index of the last column of the visible data in the table, set in _render_table().
85
+ *
86
+ * @since 1.0.0
87
+ * @var int
88
+ */
89
+ protected $last_column_idx;
90
+
91
+ /**
92
+ * Class constructor.
93
+ *
94
+ * @since 1.0.0
95
+ */
96
+ public function __construct() {
97
+ // Unused.
98
+ }
99
+
100
+ /**
101
+ * Set the table (data, options, visibility, ...) that is to be rendered.
102
+ *
103
+ * @since 1.0.0
104
+ *
105
+ * @param array $table Table to be rendered.
106
+ * @param array $render_options Options for rendering, from both "Edit" screen and Shortcode.
107
+ */
108
+ public function set_input( array $table, array $render_options ) {
109
+ $this->table = $table;
110
+ $this->render_options = $render_options;
111
+ /**
112
+ * Filter the table before the render process.
113
+ *
114
+ * @since 1.0.0
115
+ *
116
+ * @param array $table The table.
117
+ * @param array $render_options The render options for the table.
118
+ */
119
+ $this->table = apply_filters( 'tablepress_table_raw_render_data', $this->table, $this->render_options );
120
+ }
121
+
122
+ /**
123
+ * Process the table rendering and return the HTML output.
124
+ *
125
+ * @since 1.0.0
126
+ *
127
+ * @return string HTML of the rendered table (or an error message).
128
+ */
129
+ public function get_output() {
130
+ // Evaluate math expressions/formulas.
131
+ $this->_evaluate_table_data();
132
+ // Remove hidden rows and columns.
133
+ $this->_prepare_render_data();
134
+ // Generate HTML output.
135
+ $this->_render_table();
136
+ return $this->output;
137
+ }
138
+
139
+ /**
140
+ * Loop through the table to evaluate math expressions/formulas.
141
+ *
142
+ * @since 1.0.0
143
+ */
144
+ protected function _evaluate_table_data() {
145
+ $orig_table = $this->table;
146
+
147
+ $formula_evaluator = TablePress::load_class( 'TablePress_Evaluate', 'class-evaluate.php', 'classes' );
148
+ $this->table['data'] = $formula_evaluator->evaluate_table_data( $this->table['data'] );
149
+ /**
150
+ * Filter the table after evaluating formulas in the table.
151
+ *
152
+ * @since 1.0.0
153
+ *
154
+ * @param array $table The table with evaluated formulas.
155
+ * @param array $orig_table The table with unevaluated formulas.
156
+ * @param array $render_options The render options for the table.
157
+ */
158
+ $this->table = apply_filters( 'tablepress_table_evaluate_data', $this->table, $orig_table, $this->render_options );
159
+ }
160
+
161
+ /**
162
+ * Remove all cells from the data set that shall not be rendered, because they are hidden.
163
+ *
164
+ * @since 1.0.0
165
+ */
166
+ protected function _prepare_render_data() {
167
+ $orig_table = $this->table;
168
+
169
+ $num_rows = count( $this->table['data'] );
170
+ $num_columns = ( $num_rows > 0 ) ? count( $this->table['data'][0] ) : 0;
171
+
172
+ // Evaluate show/hide_rows/columns parameters.
173
+ $actions = array( 'show', 'hide' );
174
+ $elements = array( 'rows', 'columns' );
175
+ foreach ( $actions as $action ) {
176
+ foreach ( $elements as $element ) {
177
+ if ( empty( $this->render_options["{$action}_{$element}"] ) ) {
178
+ $this->render_options["{$action}_{$element}"] = array();
179
+ continue;
180
+ }
181
+
182
+ // Add all rows/columns to array if "all" value set for one of the four parameters.
183
+ if ( 'all' === $this->render_options["{$action}_{$element}"] ) {
184
+ $this->render_options["{$action}_{$element}"] = range( 0, ${'num_' . $element} - 1 );
185
+ continue;
186
+ }
187
+
188
+ // We have a list of rows/columns (possibly with ranges in it).
189
+ $this->render_options["{$action}_{$element}"] = explode( ',', $this->render_options["{$action}_{$element}"] );
190
+ // Support for ranges like 3-6 or A-BA.
191
+ $range_cells = array();
192
+ foreach ( $this->render_options["{$action}_{$element}"] as $key => $value ) {
193
+ $range_dash = strpos( $value, '-' );
194
+ if ( false !== $range_dash ) {
195
+ unset( $this->render_options["{$action}_{$element}"][ $key ] );
196
+ $start = substr( $value, 0, $range_dash );
197
+ if ( ! is_numeric( $start ) ) {
198
+ $start = TablePress::letter_to_number( $start );
199
+ }
200
+ $end = substr( $value, $range_dash + 1 );
201
+ if ( ! is_numeric( $end ) ) {
202
+ $end = TablePress::letter_to_number( $end );
203
+ }
204
+ $current_range = range( $start, $end );
205
+ $range_cells = array_merge( $range_cells, $current_range );
206
+ }
207
+ }
208
+ $this->render_options["{$action}_{$element}"] = array_merge( $this->render_options["{$action}_{$element}"], $range_cells );
209
+ /*
210
+ * Parse single letters and change from regular numbering to zero-based numbering,
211
+ * as rows/columns are indexed from 0 internally, but from 1 externally
212
+ */
213
+ foreach ( $this->render_options["{$action}_{$element}"] as $key => $value ) {
214
+ if ( ! is_numeric( $value ) ) {
215
+ $value = TablePress::letter_to_number( $value );
216
+ }
217
+ $this->render_options["{$action}_{$element}"][ $key ] = (int) $value - 1;
218
+ }
219
+
220
+ // Remove duplicate entries and sort the array.
221
+ $this->render_options["{$action}_{$element}"] = array_unique( $this->render_options["{$action}_{$element}"] );
222
+ sort( $this->render_options["{$action}_{$element}"], SORT_NUMERIC );
223
+ }
224
+ }
225
+
226
+ // Load information about hidden rows and columns.
227
+ // Get indexes of hidden rows (array value of 0).
228
+ $hidden_rows = array_keys( $this->table['visibility']['rows'], 0 );
229
+ $hidden_rows = array_merge( $hidden_rows, $this->render_options['hide_rows'] );
230
+ $hidden_rows = array_diff( $hidden_rows, $this->render_options['show_rows'] );
231
+ // Get indexes of hidden columns (array value of 0).
232
+ $hidden_columns = array_keys( $this->table['visibility']['columns'], 0 );
233
+ $hidden_columns = array_merge( $hidden_columns, $this->render_options['hide_columns'] );
234
+ $hidden_columns = array_merge( array_diff( $hidden_columns, $this->render_options['show_columns'] ) );
235
+
236
+ // Remove hidden rows and re-index.
237
+ foreach ( $hidden_rows as $row_idx ) {
238
+ unset( $this->table['data'][ $row_idx ] );
239
+ }
240
+ $this->table['data'] = array_merge( $this->table['data'] );
241
+ // Remove hidden columns and re-index.
242
+ foreach ( $this->table['data'] as $row_idx => $row ) {
243
+ foreach ( $hidden_columns as $col_idx ) {
244
+ unset( $row[ $col_idx ] );
245
+ }
246
+ $this->table['data'][ $row_idx ] = array_merge( $row );
247
+ }
248
+
249
+ /**
250
+ * Filter the table after processing the table visibility information.
251
+ *
252
+ * @since 1.0.0
253
+ *
254
+ * @param array $table The processed table.
255
+ * @param array $orig_table The unprocessed table.
256
+ * @param array $render_options The render options for the table.
257
+ */
258
+ $this->table = apply_filters( 'tablepress_table_render_data', $this->table, $orig_table, $this->render_options );
259
+ }
260
+
261
+ /**
262
+ * Generate the HTML output of the table.
263
+ *
264
+ * @since 1.0.0
265
+ */
266
+ protected function _render_table() {
267
+ $num_rows = count( $this->table['data'] );
268
+ $num_columns = ( $num_rows > 0 ) ? count( $this->table['data'][0] ) : 0;
269
+
270
+ // Check if there are rows and columns in the table (might not be the case after removing hidden rows/columns!).
271
+ if ( 0 === $num_rows || 0 === $num_columns ) {
272
+ $this->output = sprintf( __( '<!-- The table with the ID %s is empty! -->', 'tablepress' ), $this->table['id'] );
273
+ return;
274
+ }
275
+
276
+ // Counters for spans of rows and columns, init to 1 for each row and column (as that means no span).
277
+ $this->rowspan = array_fill( 0, $num_columns, 1 );
278
+ $this->colspan = array_fill( 0, $num_rows, 1 );
279
+
280
+ /**
281
+ * Filter the trigger keywords for "colspan" and "rowspan"
282
+ *
283
+ * @since 1.0.0
284
+ *
285
+ * @param array $span_trigger The trigger keywords for combining table cells.
286
+ * @param string $table_id The current table ID.
287
+ */
288
+ $this->span_trigger = apply_filters( 'tablepress_span_trigger_keywords', $this->span_trigger, $this->table['id'] );
289
+
290
+ // Explode from string to array.
291
+ $this->render_options['column_widths'] = ( ! empty( $this->render_options['column_widths'] ) ) ? explode( '|', $this->render_options['column_widths'] ) : array();
292
+ // Make array $this->render_options['column_widths'] have $columns entries.
293
+ $this->render_options['column_widths'] = array_pad( $this->render_options['column_widths'], $num_columns, '' );
294
+
295
+ $output = '';
296
+
297
+ if ( $this->render_options['print_name'] ) {
298
+ /**
299
+ * Filter the HTML tag that wraps the printed table name.
300
+ *
301
+ * @since 1.0.0
302
+ *
303
+ * @param string $tag The HTML tag around the table name. Default h2.
304
+ * @param string $table_id The current table ID.
305
+ */
306
+ $print_name_html_tag = apply_filters( 'tablepress_print_name_html_tag', 'h2', $this->table['id'] );
307
+ /**
308
+ * Filter the class attribute for the printed table name.
309
+ *
310
+ * @since 1.0.0
311
+ *
312
+ * @param string $class The class attribute for the table name that can be used in CSS code.
313
+ * @param string $table_id The current table ID.
314
+ */
315
+ $print_name_css_class = apply_filters( 'tablepress_print_name_css_class', "tablepress-table-name tablepress-table-name-id-{$this->table['id']}", $this->table['id'] );
316
+ $print_name_html = "<{$print_name_html_tag} class=\"{$print_name_css_class}\">" . $this->safe_output( $this->table['name'] ) . "</{$print_name_html_tag}>\n";
317
+ }
318
+ if ( $this->render_options['print_description'] ) {
319
+ /**
320
+ * Filter the HTML tag that wraps the printed table description.
321
+ *
322
+ * @since 1.0.0
323
+ *
324
+ * @param string $tag The HTML tag around the table description. Default span.
325
+ * @param string $table_id The current table ID.
326
+ */
327
+ $print_description_html_tag = apply_filters( 'tablepress_print_description_html_tag', 'span', $this->table['id'] );
328
+ /**
329
+ * Filter the class attribute for the printed table description.
330
+ *
331
+ * @since 1.0.0
332
+ *
333
+ * @param string $class The class attribute for the table description that can be used in CSS code.
334
+ * @param string $table_id The current table ID.
335
+ */
336
+ $print_description_css_class = apply_filters( 'tablepress_print_description_css_class', "tablepress-table-description tablepress-table-description-id-{$this->table['id']}", $this->table['id'] );
337
+ $print_description_html = "<{$print_description_html_tag} class=\"{$print_description_css_class}\">" . $this->safe_output( $this->table['description'] ) . "</{$print_description_html_tag}>\n";
338
+ }
339
+
340
+ if ( $this->render_options['print_name'] && 'above' === $this->render_options['print_name_position'] ) {
341
+ $output .= $print_name_html;
342
+ }
343
+ if ( $this->render_options['print_description'] && 'above' === $this->render_options['print_description_position'] ) {
344
+ $output .= $print_description_html;
345
+ }
346
+
347
+ // Deactivate nl2br() for this render process, if "convert_line_breaks" Shortcode parameter is set to false.
348
+ if ( ! $this->render_options['convert_line_breaks'] ) {
349
+ add_filter( 'tablepress_apply_nl2br', '__return_false', 9 ); // Priority 9, so that this filter can easily be overwritten at the default priority.
350
+ }
351
+
352
+ $thead = '';
353
+ $tfoot = '';
354
+ $tbody = array();
355
+
356
+ $this->last_row_idx = $num_rows - 1;
357
+ $this->last_column_idx = $num_columns - 1;
358
+ // Loop through rows in reversed order, to search for rowspan trigger keyword.
359
+ for ( $row_idx = $this->last_row_idx; $row_idx >= 0; $row_idx-- ) {
360
+ // Last row, need to check for footer (but only if at least two rows).
361
+ if ( $this->last_row_idx === $row_idx && $this->render_options['table_foot'] && $num_rows > 1 ) {
362
+ $tfoot = $this->_render_row( $row_idx, 'th' );
363
+ continue;
364
+ }
365
+ // First row, need to check for head (but only if at least two rows).
366
+ if ( 0 === $row_idx && $this->render_options['table_head'] && $num_rows > 1 ) {
367
+ $thead = $this->_render_row( $row_idx, 'th' );
368
+ continue;
369
+ }
370
+ // Neither first nor last row (with respective head/foot enabled), so render as body row.
371
+ $tbody[] = $this->_render_row( $row_idx, 'td' );
372
+ }
373
+
374
+ // Re-instate nl2br() behavior after this render process, if "convert_line_breaks" Shortcode parameter is set to false.
375
+ if ( ! $this->render_options['convert_line_breaks'] ) {
376
+ remove_filter( 'tablepress_apply_nl2br', '__return_false', 9 ); // Priority 9, so that this filter can easily be overwritten at the default priority.
377
+ }
378
+
379
+ // <caption> tag.
380
+ /**
381
+ * Filter the content for the HTML caption element of the table.
382
+ *
383
+ * If the "Edit" link for a table is shown, it is also added to the caption element.
384
+ *
385
+ * @since 1.0.0
386
+ *
387
+ * @param string $caption The content for the HTML caption element of the table. Default empty.
388
+ * @param array $table The current table.
389
+ */
390
+ $caption = apply_filters( 'tablepress_print_caption_text', '', $this->table );
391
+ $caption_style = $caption_class = '';
392
+ if ( ! empty( $caption ) ) {
393
+ /**
394
+ * Filter the class attribute for the HTML caption element of the table.
395
+ *
396
+ * @since 1.0.0
397
+ *
398
+ * @param string $class The class attribute for the HTML caption element of the table.
399
+ * @param string $table_id The current table ID.
400
+ */
401
+ $caption_class = apply_filters( 'tablepress_print_caption_class', "tablepress-table-caption tablepress-table-caption-id-{$this->table['id']}", $this->table['id'] );
402
+ $caption_class = ' class="' . $caption_class . '"';
403
+ }
404
+ if ( ! empty( $this->render_options['edit_table_url'] ) ) {
405
+ if ( empty( $caption ) ) {
406
+ $caption_style = ' style="caption-side:bottom;text-align:left;border:none;background:none;margin:0;padding:0;"';
407
+ } else {
408
+ $caption .= '<br />';
409
+ }
410
+ $caption .= "<a href=\"{$this->render_options['edit_table_url']}\">" . __( 'Edit', 'default' ) . '</a>';
411
+ }
412
+ if ( ! empty( $caption ) ) {
413
+ $caption = "<caption{$caption_class}{$caption_style}>{$caption}</caption>\n";
414
+ }
415
+
416
+ // <colgroup> tag.
417
+ $colgroup = '';
418
+ /**
419
+ * Filter whether the HTML colgroup tag shall be added to the table output.
420
+ *
421
+ * @since 1.0.0
422
+ *
423
+ * @param bool $print Whether the colgroup element shall be printed.
424
+ * @param string $table_id The current table ID.
425
+ */
426
+ if ( apply_filters( 'tablepress_print_colgroup_tag', false, $this->table['id'] ) ) {
427
+ for ( $col_idx = 0; $col_idx < $num_columns; $col_idx++ ) {
428
+ $attributes = ' class="colgroup-column-' . ( $col_idx + 1 ) . ' "';
429
+ /**
430
+ * Filter the attributes of the HTML col tags in the HTML colgroup tag.
431
+ *
432
+ * @since 1.0.0
433
+ *
434
+ * @param string $attributes The attributes in the col element.
435
+ * @param string $table_id The current table ID.
436
+ * @param int $col_idx The number of the column.
437
+ */
438
+ $attributes = apply_filters( 'tablepress_colgroup_tag_attributes', $attributes, $this->table['id'], $col_idx + 1 );
439
+ $colgroup .= "\t<col{$attributes}/>\n";
440
+ }
441
+ }
442
+ if ( ! empty( $colgroup ) ) {
443
+ $colgroup = "<colgroup>\n{$colgroup}</colgroup>\n";
444
+ }
445
+
446
+ // <thead>, <tfoot>, and <tbody> tags.
447
+ if ( ! empty( $thead ) ) {
448
+ $thead = "<thead>\n{$thead}</thead>\n";
449
+ }
450
+ if ( ! empty( $tfoot ) ) {
451
+ $tfoot = "<tfoot>\n{$tfoot}</tfoot>\n";
452
+ }
453
+ $tbody_class = ( $this->render_options['row_hover'] ) ? ' class="row-hover"' : '';
454
+ // Reverse rows because we looped through the rows in reverse order.
455
+ $tbody = array_reverse( $tbody );
456
+ $tbody = "<tbody{$tbody_class}>\n" . implode( '', $tbody ) . "</tbody>\n";
457
+
458
+ // Attributes for the table (HTML table element).
459
+ $table_attributes = array();
460
+
461
+ // "id" attribute.
462
+ if ( ! empty( $this->render_options['html_id'] ) ) {
463
+ $table_attributes['id'] = $this->render_options['html_id'];
464
+ }
465
+
466
+ // "class" attribute.
467
+ $css_classes = array( 'tablepress', "tablepress-id-{$this->table['id']}", $this->render_options['extra_css_classes'] );
468
+ /**
469
+ * Filter the CSS classes that are given to the HTML table element.
470
+ *
471
+ * @since 1.0.0
472
+ *
473
+ * @param array $css_classes The CSS classes for the table element.
474
+ * @param string $table_id The current table ID.
475
+ */
476
+ $css_classes = apply_filters( 'tablepress_table_css_classes', $css_classes, $this->table['id'] );
477
+ // $css_classes might contain several classes in one array entry.
478
+ $css_classes = explode( ' ', implode( ' ', $css_classes ) );
479
+ $css_classes = array_map( 'sanitize_html_class', $css_classes );
480
+ $css_classes = array_unique( $css_classes );
481
+ $css_classes = trim( implode( ' ', $css_classes ) );
482
+ if ( ! empty( $css_classes ) ) {
483
+ $table_attributes['class'] = $css_classes;
484
+ }
485
+
486
+ // "summary" attribute.
487
+ $summary = '';
488
+ /**
489
+ * Filter the content for the summary attribute of the HTML table element.
490
+ *
491
+ * The attribute is only added if it is not empty.
492
+ *
493
+ * @since 1.0.0
494
+ *
495
+ * @param string $summary The content for the summary attribute of the table. Default empty.
496
+ * @param array $table The current table.
497
+ */
498
+ $summary = apply_filters( 'tablepress_print_summary_attr', $summary, $this->table );
499
+ if ( ! empty( $summary ) ) {
500
+ $table_attributes['summary'] = esc_attr( $summary );
501
+ }
502
+
503
+ // Legacy support for attributes that are not encouraged in HTML5.
504
+ foreach ( array( 'cellspacing', 'cellpadding', 'border' ) as $attribute ) {
505
+ if ( false !== $this->render_options[ $attribute ] ) {
506
+ $table_attributes[ $attribute ] = intval( $this->render_options[ $attribute ] );
507
+ }
508
+ }
509
+
510
+ /**
511
+ * Filter the attributes for the table (HTML table element).
512
+ *
513
+ * @since 1.4.0
514
+ *
515
+ * @param array $table_attributes The attributes for the table element.
516
+ * @param array $table The current table.
517
+ * @param array $render_options The render options for the table.
518
+ */
519
+ $table_attributes = apply_filters( 'tablepress_table_tag_attributes', $table_attributes, $this->table, $this->render_options );
520
+ $table_attributes = $this->_attributes_array_to_string( $table_attributes );
521
+
522
+ $output .= "\n<table{$table_attributes}>\n";
523
+ $output .= $caption . $colgroup . $thead . $tfoot . $tbody;
524
+ $output .= "</table>\n";
525
+
526
+ // name/description below table (HTML already generated above).
527
+ if ( $this->render_options['print_name'] && 'below' === $this->render_options['print_name_position'] ) {
528
+ $output .= $print_name_html;
529
+ }
530
+ if ( $this->render_options['print_description'] && 'below' === $this->render_options['print_description_position'] ) {
531
+ $output .= $print_description_html;
532
+ }
533
+
534
+ /**
535
+ * Filter the generated HTML code for table.
536
+ *
537
+ * @since 1.0.0
538
+ *
539
+ * @param string $output The generated HTML for the table.
540
+ * @param array $table The current table.
541
+ * @param array $render_options The render options for the table.
542
+ */
543
+ $this->output = apply_filters( 'tablepress_table_output', $output, $this->table, $this->render_options );
544
+ }
545
+
546
+ /**
547
+ * Generate the HTML of a row.
548
+ *
549
+ * @since 1.0.0
550
+ *
551
+ * @param int $row_idx Index of the row to be rendered.
552
+ * @param string $tag HTML tag to use for the cells (td or th).
553
+ * @return string HTML for the row.
554
+ */
555
+ protected function _render_row( $row_idx, $tag ) {
556
+ $row_cells = array();
557
+ // Loop through cells in reversed order, to search for colspan or rowspan trigger words.
558
+ for ( $col_idx = $this->last_column_idx; $col_idx >= 0; $col_idx-- ) {
559
+ $cell_content = $this->table['data'][ $row_idx ][ $col_idx ];
560
+
561
+ // Print formulas that are escaped with '= (like in Excel) as text.
562
+ if ( "'=" === substr( $cell_content, 0, 2 ) ) {
563
+ $cell_content = substr( $cell_content, 1 );
564
+ }
565
+ $cell_content = do_shortcode( $this->safe_output( $cell_content ) );
566
+ /**
567
+ * Filter the content of a single cell.
568
+ *
569
+ * Filter the content of a single cell, after formulas have been evaluated, the output has been sanitized, and Shortcodes have been evaluated.
570
+ *
571
+ * @since 1.0.0
572
+ *
573
+ * @param string $cell_content The cell content.
574
+ * @param string $table_id The current table ID.
575
+ * @param int $row_idx The row number of the cell.
576
+ * @param int $col_idx The column number of the cell.
577
+ */
578
+ $cell_content = apply_filters( 'tablepress_cell_content', $cell_content, $this->table['id'], $row_idx + 1, $col_idx + 1 );
579
+
580
+ if ( $this->span_trigger['rowspan'] === $cell_content ) { // There will be a rowspan.
581
+ // Check for #rowspan# in first row, which doesn't make sense.
582
+ if ( ( $row_idx > 1 && $row_idx < $this->last_row_idx )
583
+ || ( 1 === $row_idx && ! $this->render_options['table_head'] ) // No rowspan into table head.
584
+ || ( $this->last_row_idx === $row_idx && ! $this->render_options['table_foot'] ) ) { // No rowspan out of table foot.
585
+ // Increase counter for rowspan in this column.
586
+ $this->rowspan[ $col_idx ]++;
587
+ // Reset counter for colspan in this row, combined col- and rowspan might be happening.
588
+ $this->colspan[ $row_idx ] = 1;
589
+ continue;
590
+ }
591
+ // Invalid rowspan, so we set cell content from #rowspan# to empty.
592
+ $cell_content = '';
593
+ } elseif ( $this->span_trigger['colspan'] === $cell_content ) { // There will be a colspan.
594
+ // Check for #colspan# in first column, which doesn't make sense.
595
+ if ( $col_idx > 1
596
+ || ( 1 === $col_idx && ! $this->render_options['first_column_th'] ) ) { // No colspan into first column head.
597
+ // Increase counter for colspan in this row.
598
+ $this->colspan[ $row_idx ]++;
599
+ // Reset counter for rowspan in this column, combined col- and rowspan might be happening.
600
+ $this->rowspan[ $col_idx ] = 1;
601
+ continue;
602
+ }
603
+ // Invalid colspan, so we set cell content from #colspan# to empty.
604
+ $cell_content = '';
605
+ } elseif ( $this->span_trigger['span'] === $cell_content ) { // There will be a combined col- and rowspan.
606
+ // Check for #span# in first column or first or last row, which is not always possible.
607
+ if ( ( $row_idx > 1 && $row_idx < $this->last_row_idx && $col_idx > 1 )
608
+ // We are in first, second, or last row or in the first or second column, so more checks are necessary.
609
+ || ( ( 1 === $row_idx && ! $this->render_options['table_head'] ) // No rowspan into table head.
610
+ && ( $col_idx > 1 || ( 1 === $col_idx && ! $this->render_options['first_column_th'] ) ) ) // And no colspan into first column head.
611
+ || ( ( $this->last_row_idx === $row_idx && ! $this->render_options['table_foot'] ) // No rowspan out of table foot.
612
+ && ( $col_idx > 1 || ( 1 === $col_idx && ! $this->render_options['first_column_th'] ) ) ) ) { // And no colspan into first column head.
613
+ continue;
614
+ }
615
+ // Invalid span, so we set cell content from #span# to empty.
616
+ $cell_content = '';
617
+ } elseif ( '' === $cell_content && 0 === $row_idx && $this->render_options['table_head'] ) {
618
+ // Make empty cells have a space in the table head, to give sorting arrows the correct position in IE9.
619
+ $cell_content = '&nbsp;';
620
+ }
621
+
622
+ // Attributes for the table cell (HTML td or th element).
623
+ $tag_attributes = array();
624
+
625
+ // "colspan" and "rowspan" attributes.
626
+ if ( $this->colspan[ $row_idx ] > 1 ) { // We have colspaned cells.
627
+ $tag_attributes['colspan'] = $this->colspan[ $row_idx ];
628
+ }
629
+ if ( $this->rowspan[ $col_idx ] > 1 ) { // We have rowspaned cells.
630
+ $tag_attributes['rowspan'] = $this->rowspan[ $col_idx ];
631
+ }
632
+
633
+ // "class" attribute.
634
+ $cell_class = 'column-' . ( $col_idx + 1 );
635
+ /**
636
+ * Filter the CSS classes that are given to a single cell (HTML td element) of a table.
637
+ *
638
+ * @since 1.0.0
639
+ *
640
+ * @param string $cell_class The CSS classes for the cell.
641
+ * @param string $table_id The current table ID.
642
+ * @param string $cell_content The cell content.
643
+ * @param int $row_idx The row number of the cell.
644
+ * @param int $col_idx The column number of the cell.
645
+ * @param int $colspan_row The number of combined columns for this cell.
646
+ * @param int $rowspan_col The number of combined rows for this cell.
647
+ */
648
+ $cell_class = apply_filters( 'tablepress_cell_css_class', $cell_class, $this->table['id'], $cell_content, $row_idx + 1, $col_idx + 1, $this->colspan[ $row_idx ], $this->rowspan[ $col_idx ] );
649
+ if ( ! empty( $cell_class ) ) {
650
+ $tag_attributes['class'] = $cell_class;
651
+ }
652
+
653
+ // "style" attribute.
654
+ if ( ( 0 === $row_idx ) && ! empty( $this->render_options['column_widths'][ $col_idx ] ) ) {
655
+ $tag_attributes['style'] = 'width:' . preg_replace( '#[^0-9a-z.%]#', '', $this->render_options['column_widths'][ $col_idx ] ) . ';';
656
+ }
657
+
658
+ /**
659
+ * Filter the attributes for the table cell (HTML td or th element).
660
+ *
661
+ * @since 1.4.0
662
+ *
663
+ * @param array $tag_attributes The attributes for the td or th element.
664
+ * @param string $table_id The current table ID.
665
+ * @param string $cell_content The cell content.
666
+ * @param int $row_idx The row number of the cell.
667
+ * @param int $col_idx The column number of the cell.
668
+ * @param int $colspan_row The number of combined columns for this cell.
669
+ * @param int $rowspan_col The number of combined rows for this cell.
670
+ */
671
+ $tag_attributes = apply_filters( 'tablepress_cell_tag_attributes', $tag_attributes, $this->table['id'], $cell_content, $row_idx + 1, $col_idx + 1, $this->colspan[ $row_idx ], $this->rowspan[ $col_idx ] );
672
+ $tag_attributes = $this->_attributes_array_to_string( $tag_attributes );
673
+
674
+ if ( $this->render_options['first_column_th'] && 0 === $col_idx ) {
675
+ $tag = 'th';
676
+ }
677
+
678
+ $row_cells[] = "<{$tag}{$tag_attributes}>{$cell_content}</{$tag}>";
679
+ $this->colspan[ $row_idx ] = 1; // Reset.
680
+ $this->rowspan[ $col_idx ] = 1; // Reset.
681
+ }
682
+
683
+ // Attributes for the table row (HTML tr element).
684
+ $tr_attributes = array();
685
+
686
+ // "class" attribute.
687
+ $row_classes = 'row-' . ( $row_idx + 1 ) ;
688
+ if ( $this->render_options['alternating_row_colors'] ) {
689
+ $row_classes .= ( 1 === ( $row_idx % 2 ) ) ? ' even' : ' odd';
690
+ }
691
+ /**
692
+ * Filter the CSS classes that are given to a row (HTML tr element) of a table.
693
+ *
694
+ * @since 1.0.0
695
+ *
696
+ * @param string $row_classes The CSS classes for the row.
697
+ * @param string $table_id The current table ID.
698
+ * @param array $row_cells The HTML code for the cells of the row.
699
+ * @param int $row_idx The row number.
700
+ * @param array $row_data The content of the cells of the row.
701
+ */
702
+ $row_classes = apply_filters( 'tablepress_row_css_class', $row_classes, $this->table['id'], $row_cells, $row_idx + 1, $this->table['data'][ $row_idx ] );
703
+ if ( ! empty( $row_classes ) ) {
704
+ $tr_attributes['class'] = $row_classes;
705
+ }
706
+
707
+ /**
708
+ * Filter the attributes for the table row (HTML tr element).
709
+ *
710
+ * @since 1.4.0
711
+ *
712
+ * @param array $tr_attributes The attributes for the tr element.
713
+ * @param string $table_id The current table ID.
714
+ * @param int $row_idx The row number.
715
+ * @param array $row_data The content of the cells of the row.
716
+ */
717
+ $tr_attributes = apply_filters( 'tablepress_row_tag_attributes', $tr_attributes, $this->table['id'], $row_idx + 1, $this->table['data'][ $row_idx ] );
718
+ $tr_attributes = $this->_attributes_array_to_string( $tr_attributes );
719
+
720
+ // Reverse rows because we looped through the cells in reverse order.
721
+ $row_cells = array_reverse( $row_cells );
722
+ return "<tr{$tr_attributes}>\n\t" . implode( '', $row_cells ) . "\n</tr>\n";
723
+ }
724
+
725
+ /**
726
+ * Convert an array of HTML tag attributes to a string.
727
+ *
728
+ * @since 1.4.0
729
+ *
730
+ * @param array $attributes Attributes for the HTML tag in the array keys, and their values in the array values.
731
+ * @return string The attributes as a string for usage in a HTML element.
732
+ */
733
+ protected function _attributes_array_to_string( array $attributes ) {
734
+ $attributes_string = '';
735
+ foreach ( $attributes as $attribute => $value ) {
736
+ $attributes_string .= " {$attribute}=\"{$value}\"";
737
+ }
738
+ return $attributes_string;
739
+ }
740
+
741
+ /**
742
+ * Possibly replace certain HTML entities and replace line breaks with HTML.
743
+ *
744
+ * @TODO: Find a better solution than this function, e.g. something like wpautop().
745
+ *
746
+ * @since 1.0.0
747
+ *
748
+ * @param string $string The string to process.
749
+ * @return string Processed string for output.
750
+ */
751
+ protected function safe_output( $string ) {
752
+ /*
753
+ * Replace any & with &amp; that is not already an encoded entity (from function htmlentities2 in WP 2.8).
754
+ * A complete htmlentities2() or htmlspecialchars() would encode <HTML> tags, which we don't want.
755
+ */
756
+ $string = preg_replace( '/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,4};)/', '&amp;', $string );
757
+ /**
758
+ * Filter whether line breaks in the cell content shall be replaced with HTML br tags.
759
+ *
760
+ * @since 1.0.0
761
+ *
762
+ * @param bool $replace Whether to replace line breaks with HTML br tags. Default true.
763
+ * @param string $table_id The current table ID.
764
+ */
765
+ if ( apply_filters( 'tablepress_apply_nl2br', true, $this->table['id'] ) ) {
766
+ $string = nl2br( $string );
767
+ }
768
+ return $string;
769
+ }
770
+
771
+ /**
772
+ * Get the default render options, null means: Use option from "Edit" screen.
773
+ *
774
+ * @since 1.0.0
775
+ *
776
+ * @return array Default render options.
777
+ */
778
+ public function get_default_render_options() {
779
+ // Attention: Array keys have to be lowercase, otherwise they won't match the Shortcode attributes, which will be passed in lowercase by WP.
780
+ return array(
781
+ 'id' => '',
782
+ 'column_widths' => '',
783
+ 'alternating_row_colors' => null,
784
+ 'row_hover' => null,
785
+ 'table_head' => null,
786
+ 'table_foot' => null,
787
+ 'first_column_th' => false,
788
+ 'print_name' => null,
789
+ 'print_name_position' => null,
790
+ 'print_description' => null,
791
+ 'print_description_position' => null,
792
+ 'cache_table_output' => true,
793
+ 'convert_line_breaks' => true,
794
+ 'extra_css_classes' => null,
795
+ 'use_datatables' => null,
796
+ 'datatables_sort' => null,
797
+ 'datatables_paginate' => null,
798
+ 'datatables_paginate_entries' => null,
799
+ 'datatables_lengthchange' => null,
800
+ 'datatables_filter' => null,
801
+ 'datatables_info' => null,
802
+ 'datatables_scrollx' => null,
803
+ 'datatables_scrolly' => false,
804
+ 'datatables_custom_commands' => null,
805
+ 'datatables_locale' => get_locale(),
806
+ 'show_rows' => '',
807
+ 'show_columns' => '',
808
+ 'hide_rows' => '',
809
+ 'hide_columns' => '',
810
+ 'cellspacing' => false,
811
+ 'cellpadding' => false,
812
+ 'border' => false,
813
+ 'shortcode_debug' => false,
814
+ );
815
+ }
816
+
817
+ /**
818
+ * Get the CSS code for the Preview iframe.
819
+ *
820
+ * @since 1.0.0
821
+ *
822
+ * @return string CSS for the Preview iframe.
823
+ */
824
+ public function get_preview_css() {
825
+ if ( is_rtl() ) {
826
+ $rtl = "\ndirection: rtl;";
827
+ $rtl_align = 'right';
828
+ } else {
829
+ $rtl = '';
830
+ $rtl_align = 'left';
831
+ }
832
+ return <<<CSS
833
+ <style type="text/css">
834
+ /* iframe */
835
+ body {
836
+ margin: 10px;
837
+ font-family: sans-serif;{$rtl}
838
+ }
839
+ /* Inline Shortcodes, in texts */
840
+ .table-shortcode-inline {
841
+ background: transparent;
842
+ border: none;
843
+ color: #333333;
844
+ width: 110px;
845
+ margin: 0;
846
+ padding: 0;
847
+ -webkit-box-shadow: none;
848
+ box-shadow: none;
849
+ text-align: center;
850
+ font-weight: bold;
851
+ font-size: 100%;
852
+ }
853
+ .table-shortcode {
854
+ cursor: text;
855
+ }
856
+ /* Default table styling */
857
+ .tablepress {
858
+ border-collapse: collapse;
859
+ border-spacing: 0;
860
+ width: 100%;
861
+ margin-bottom: 1em;
862
+ border: none;
863
+ }
864
+ .tablepress td,
865
+ .tablepress th {
866
+ padding: 8px;
867
+ border: none;
868
+ background: none;
869
+ text-align: {$rtl_align};
870
+ }
871
+ .tablepress tbody td {
872
+ vertical-align: top;
873
+ }
874
+ .tablepress tbody tr td,
875
+ .tablepress tfoot tr th {
876
+ border-top: 1px solid #dddddd;
877
+ }
878
+ .tablepress tbody tr:first-child td {
879
+ border-top: 0;
880
+ }
881
+ .tablepress thead tr th {
882
+ border-bottom: 1px solid #dddddd;
883
+ }
884
+ .tablepress thead th,
885
+ .tablepress tfoot th {
886
+ background-color: #d9edf7;
887
+ font-weight: bold;
888
+ vertical-align: middle;
889
+ }
890
+ .tablepress tbody tr.odd td {
891
+ background-color: #f9f9f9;
892
+ }
893
+ .tablepress tbody tr.even td {
894
+ background-color: #ffffff;
895
+ }
896
+ .tablepress .row-hover tr:hover td {
897
+ background-color: #f3f3f3;
898
+ }
899
+ .tablepress img {
900
+ margin: 0;
901
+ padding: 0;
902
+ border: none;
903
+ max-width: none;
904
+ }
905
+ </style>
906
+ CSS;
907
+ }
908
+
909
+ } // class TablePress_Render
classes/class-tablepress.php ADDED
@@ -0,0 +1,452 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress Class
4
+ *
5
+ * @package TablePress
6
+ * @author Tobias Bäthge
7
+ * @since 1.0.0
8
+ */
9
+
10
+ // Prohibit direct script loading.
11
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
12
+
13
+ /**
14
+ * TablePress class
15
+ * @package TablePress
16
+ * @author Tobias Bäthge
17
+ * @since 1.0.0
18
+ */
19
+ abstract class TablePress {
20
+
21
+ /**
22
+ * TablePress version.
23
+ *
24
+ * Increases whenever a new plugin version is released.
25
+ *
26
+ * @since 1.0.0
27
+ * @const string
28
+ */
29
+ const version = '1.6.1';
30
+
31
+ /**
32
+ * TablePress internal plugin version ("options scheme" version).
33
+ *
34
+ * Increases whenever the scheme for the plugin options changes, or on a plugin update.
35
+ *
36
+ * @since 1.0.0
37
+ * @const int
38
+ */
39
+ const db_version = 31;
40
+
41
+ /**
42
+ * TablePress "table scheme" (data format structure) version.
43
+ *
44
+ * Increases whenever the scheme for a $table changes,
45
+ * used to be able to update plugin options and table scheme independently.
46
+ *
47
+ * @since 1.0.0
48
+ * @const int
49
+ */
50
+ const table_scheme_version = 3;
51
+
52
+ /**
53
+ * Instance of the Options Model.
54
+ *
55
+ * @since 1.3.0
56
+ * @var TablePress_Options_Model
57
+ */
58
+ public static $model_options;
59
+
60
+ /**
61
+ * Instance of the Table Model.
62
+ *
63
+ * @since 1.3.0
64
+ * @var TablePress_Table_Model
65
+ */
66
+ public static $model_table;
67
+
68
+ /**
69
+ * Instance of the controller.
70
+ *
71
+ * @since 1.0.0
72
+ * @var TablePress_*_Controller
73
+ */
74
+ public static $controller;
75
+
76
+ /**
77
+ * Name of the Shortcode to show a TablePress table.
78
+ *
79
+ * Should only be modified through the filter hook 'tablepress_table_shortcode'.
80
+ *
81
+ * @since 1.0.0
82
+ * @var string
83
+ */
84
+ public static $shortcode = 'table';
85
+
86
+ /**
87
+ * Name of the Shortcode to show extra information of a TablePress table.
88
+ *
89
+ * Should only be modified through the filter hook 'tablepress_table_info_shortcode'.
90
+ *
91
+ * @since 1.0.0
92
+ * @var string
93
+ */
94
+ public static $shortcode_info = 'table-info';
95
+
96
+ /**
97
+ * Start-up TablePress (run on WordPress "init") and load the controller for the current state.
98
+ *
99
+ * @since 1.0.0
100
+ */
101
+ public static function run() {
102
+ /**
103
+ * Fires when TablePress is loaded.
104
+ *
105
+ * @since 1.0.0
106
+ */
107
+ do_action( 'tablepress_run' );
108
+
109
+ // Exit early if TablePress doesn't have to be loaded.
110
+ if ( ( 'wp-login.php' === basename( $_SERVER['SCRIPT_FILENAME'] ) ) // Login screen
111
+ || ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST )
112
+ || ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
113
+ return;
114
+ }
115
+
116
+ // Check if minimum requirements are fulfilled, currently WordPress 4.2.
117
+ include( ABSPATH . WPINC . '/version.php' ); // Include an unmodified $wp_version.
118
+ if ( version_compare( str_replace( '-src', '', $wp_version ), '4.2', '<' ) ) {
119
+ // Show error notice to admins, if WP is not installed in the minimum required version, in which case TablePress will not work.
120
+ if ( current_user_can( 'update_plugins' ) ) {
121
+ add_action( 'admin_notices', array( 'TablePress', 'show_minimum_requirements_error_notice' ) );
122
+ }
123
+ // And exit TablePress.
124
+ return;
125
+ }
126
+
127
+ /**
128
+ * Filter the string that is used as the [table] Shortcode.
129
+ *
130
+ * @since 1.0.0
131
+ *
132
+ * @param string $shortcode The [table] Shortcode string.
133
+ */
134
+ self::$shortcode = apply_filters( 'tablepress_table_shortcode', self::$shortcode );
135
+ /**
136
+ * Filter the string that is used as the [table-info] Shortcode.
137
+ *
138
+ * @since 1.0.0
139
+ *
140
+ * @param string $shortcode_info The [table-info] Shortcode string.
141
+ */
142
+ self::$shortcode_info = apply_filters( 'tablepress_table_info_shortcode', self::$shortcode_info );
143
+
144
+ // Load modals for table and options, to be accessible from everywhere via `TablePress::$model_options` and `TablePress::$model_table`.
145
+ self::$model_options = self::load_model( 'options' );
146
+ self::$model_table = self::load_model( 'table' );
147
+
148
+ if ( is_admin() ) {
149
+ $controller = 'admin';
150
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
151
+ $controller .= '_ajax';
152
+ }
153
+ } else {
154
+ $controller = 'frontend';
155
+ }
156
+ self::$controller = self::load_controller( $controller );
157
+ }
158
+
159
+ /**
160
+ * Load a file with require_once(), after running it through a filter.
161
+ *
162
+ * @since 1.0.0
163
+ *
164
+ * @param string $file Name of the PHP file with the class.
165
+ * @param string $folder Name of the folder with $class's $file.
166
+ */
167
+ public static function load_file( $file, $folder ) {
168
+ $full_path = TABLEPRESS_ABSPATH . $folder . '/' . $file;
169
+ /**
170
+ * Filter the full path of a file that shall be loaded.
171
+ *
172
+ * @since 1.0.0
173
+ *
174
+ * @param string $full_path Full path of the file that shall be loaded.
175
+ * @param string $file File name of the file that shall be loaded.
176
+ * @param string $folder Folder name of the file that shall be loaded.
177
+ */
178
+ $full_path = apply_filters( 'tablepress_load_file_full_path', $full_path, $file, $folder );
179
+ if ( $full_path ) {
180
+ require_once $full_path;
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Create a new instance of the $class, which is stored in $file in the $folder subfolder
186
+ * of the plugin's directory.
187
+ *
188
+ * @since 1.0.0
189
+ *
190
+ * @param string $class Name of the class.
191
+ * @param string $file Name of the PHP file with the class.
192
+ * @param string $folder Name of the folder with $class's $file.
193
+ * @param mixed $params Optional. Parameters that are passed to the constructor of $class.
194
+ * @return object Initialized instance of the class.
195
+ */
196
+ public static function load_class( $class, $file, $folder, $params = null ) {
197
+ /**
198
+ * Filter name of the class that shall be loaded.
199
+ *
200
+ * @since 1.0.0
201
+ *
202
+ * @param string $class Name of the class that shall be loaded.
203
+ */
204
+ $class = apply_filters( 'tablepress_load_class_name', $class );
205
+ if ( ! class_exists( $class ) ) {
206
+ self::load_file( $file, $folder );
207
+ }
208
+ $the_class = new $class( $params );
209
+ return $the_class;
210
+ }
211
+
212
+ /**
213
+ * Create a new instance of the $model, which is stored in the "models" subfolder.
214
+ *
215
+ * @since 1.0.0
216
+ *
217
+ * @param string $model Name of the model.
218
+ * @return object Instance of the initialized model.
219
+ */
220
+ public static function load_model( $model ) {
221
+ // Model Base Class.
222
+ self::load_file( 'class-model.php', 'classes' );
223
+ // Make first letter uppercase for a better looking naming pattern.
224
+ $ucmodel = ucfirst( $model );
225
+ $the_model = self::load_class( "TablePress_{$ucmodel}_Model", "model-{$model}.php", 'models' );
226
+ return $the_model;
227
+ }
228
+
229
+ /**
230
+ * Create a new instance of the $view, which is stored in the "views" subfolder, and set it up with $data.
231
+ *
232
+ * @since 1.0.0
233
+ *
234
+ * @param string $view Name of the view to load.
235
+ * @param array $data Optional. Parameters/PHP variables that shall be available to the view.
236
+ * @return object Instance of the initialized view, already set up, just needs to be rendered.
237
+ */
238
+ public static function load_view( $view, array $data = array() ) {
239
+ // View Base Class.
240
+ self::load_file( 'class-view.php', 'classes' );
241
+ // Make first letter uppercase for a better looking naming pattern.
242
+ $ucview = ucfirst( $view );
243
+ $the_view = self::load_class( "TablePress_{$ucview}_View", "view-{$view}.php", 'views' );
244
+ $the_view->setup( $view, $data );
245
+ return $the_view;
246
+ }
247
+
248
+ /**
249
+ * Create a new instance of the $controller, which is stored in the "controllers" subfolder.
250
+ *
251
+ * @since 1.0.0
252
+ *
253
+ * @param string $controller Name of the controller.
254
+ * @return object Instance of the initialized controller.
255
+ */
256
+ public static function load_controller( $controller ) {
257
+ // Controller Base Class.
258
+ self::load_file( 'class-controller.php', 'classes' );
259
+ // Make first letter uppercase for a better looking naming pattern.
260
+ $uccontroller = ucfirst( $controller );
261
+ $the_controller = self::load_class( "TablePress_{$uccontroller}_Controller", "controller-{$controller}.php", 'controllers' );
262
+ return $the_controller;
263
+ }
264
+
265
+ /**
266
+ * Generate the complete nonce string, from the nonce base, the action and an item, e.g. tablepress_delete_table_3.
267
+ *
268
+ * @since 1.0.0
269
+ *
270
+ * @param string $action Action for which the nonce is needed.
271
+ * @param string|bool $item Optional. Item for which the action will be performed, like "table".
272
+ * @return string The resulting nonce string.
273
+ */
274
+ public static function nonce( $action, $item = false ) {
275
+ $nonce = "tablepress_{$action}";
276
+ if ( $item ) {
277
+ $nonce .= "_{$item}";
278
+ }
279
+ return $nonce;
280
+ }
281
+
282
+ /**
283
+ * Check whether a nonce string is valid.
284
+ *
285
+ * @since 1.0.0
286
+ *
287
+ * @param string $action Action for which the nonce should be checked.
288
+ * @param string|bool $item Optional. Item for which the action should be performed, like "table".
289
+ * @param string $query_arg Optional. Name of the nonce query string argument in $_POST.
290
+ * @param bool $ajax Whether the nonce comes from an AJAX request.
291
+ */
292
+ public static function check_nonce( $action, $item = false, $query_arg = '_wpnonce', $ajax = false ) {
293
+ $nonce_action = self::nonce( $action, $item );
294
+ if ( $ajax ) {
295
+ check_ajax_referer( $nonce_action, $query_arg );
296
+ } else {
297
+ check_admin_referer( $nonce_action, $query_arg );
298
+ }
299
+ }
300
+
301
+ /**
302
+ * Calculate the column index (number) of a column header string (example: A is 1, AA is 27, ...).
303
+ *
304
+ * For the opposite, @see number_to_letter().
305
+ *
306
+ * @since 1.0.0
307
+ *
308
+ * @param string $column Column string.
309
+ * @return int $number Column number, 1-based.
310
+ */
311
+ public static function letter_to_number( $column ) {
312
+ $column = strtoupper( $column );
313
+ $count = strlen( $column );
314
+ $number = 0;
315
+ for ( $i = 0; $i < $count; $i++ ) {
316
+ $number += ( ord( $column[ $count - 1 - $i ] ) - 64 ) * pow( 26, $i );
317
+ }
318
+ return $number;
319
+ }
320
+
321
+ /**
322
+ * "Calculate" the column header string of a column index (example: 2 is B, AB is 28, ...).
323
+ *
324
+ * For the opposite, @see letter_to_number().
325
+ *
326
+ * @since 1.0.0
327
+ *
328
+ * @param int $number Column number, 1-based.
329
+ * @return string $column Column string.
330
+ */
331
+ public static function number_to_letter( $number ) {
332
+ $column = '';
333
+ while ( $number > 0 ) {
334
+ $column = chr( 65 + ( ( $number - 1 ) % 26 ) ) . $column;
335
+ $number = floor( ( $number - 1 ) / 26 );
336
+ }
337
+ return $column;
338
+ }
339
+
340
+ /**
341
+ * Get a nice looking date and time string from the mySQL format of datetime strings for output.
342
+ *
343
+ * @param string $datetime DateTime string in mySQL format or a Unix timestamp.
344
+ * @param string $type Optional. Type of $datetime, 'mysql' or 'timestamp'.
345
+ * @param string $separator Optional. Separator between date and time.
346
+ * @return string Nice looking string with the date and time.
347
+ */
348
+ public static function format_datetime( $datetime, $type = 'mysql', $separator = ' ' ) {
349
+ if ( 'mysql' === $type ) {
350
+ return mysql2date( get_option( 'date_format' ), $datetime ) . $separator . mysql2date( get_option( 'time_format' ), $datetime );
351
+ } else {
352
+ return date_i18n( get_option( 'date_format' ), $datetime ) . $separator . date_i18n( get_option( 'time_format' ), $datetime );
353
+ }
354
+ }
355
+
356
+ /**
357
+ * Get the name from a WP user ID (used to store information on last editor of a table).
358
+ *
359
+ * @param int $user_id WP user ID.
360
+ * @return string Nickname of the WP user with the $user_id.
361
+ */
362
+ public static function get_user_display_name( $user_id ) {
363
+ $user = get_userdata( $user_id );
364
+ return ( $user && isset( $user->display_name ) ) ? $user->display_name : __( '<em>unknown</em>', 'tablepress' );
365
+ }
366
+
367
+ /**
368
+ * Generate the action URL, to be used as a link within the plugin (e.g. in the submenu navigation or List of Tables).
369
+ *
370
+ * @since 1.0.0
371
+ *
372
+ * @param array $params Optional. Parameters to form the query string of the URL.
373
+ * @param bool $add_nonce Optional. Whether the URL shall be nonced by WordPress.
374
+ * @param string $target Optional. Target File, e.g. "admin-post.php" for POST requests.
375
+ * @return string The URL for the given parameters (already run through esc_url() with $add_nonce === true!).
376
+ */
377
+ public static function url( array $params = array(), $add_nonce = false, $target = '' ) {
378
+
379
+ // Default action is "list", if no action given.
380
+ if ( ! isset( $params['action'] ) ) {
381
+ $params['action'] = 'list';
382
+ }
383
+ $nonce_action = $params['action'];
384
+
385
+ if ( $target ) {
386
+ $params['action'] = "tablepress_{$params['action']}";
387
+ } else {
388
+ $params['page'] = 'tablepress';
389
+ // Top-level parent page needs special treatment for better action strings.
390
+ if ( self::$controller->is_top_level_page ) {
391
+ $target = 'admin.php';
392
+ if ( ! in_array( $params['action'], array( 'list', 'edit' ), true ) ) {
393
+ $params['page'] = "tablepress_{$params['action']}";
394
+ }
395
+ if ( ! in_array( $params['action'], array( 'edit' ), true ) ) {
396
+ $params['action'] = false;
397
+ }
398
+ } else {
399
+ $target = self::$controller->parent_page;
400
+ }
401
+ }
402
+
403
+ // $default_params also determines the order of the values in the query string.
404
+ $default_params = array(
405
+ 'page' => false,
406
+ 'action' => false,
407
+ 'item' => false,
408
+ );
409
+ $params = array_merge( $default_params, $params );
410
+
411
+ $url = add_query_arg( $params, admin_url( $target ) );
412
+ if ( $add_nonce ) {
413
+ $url = wp_nonce_url( $url, self::nonce( $nonce_action, $params['item'] ) ); // wp_nonce_url() does esc_html()
414
+ }
415
+ return $url;
416
+ }
417
+
418
+ /**
419
+ * Create a redirect URL from the $target_parameters and redirect the user.
420
+ *
421
+ * @since 1.0.0
422
+ *
423
+ * @param array $params Optional. Parameters from which the target URL is constructed.
424
+ * @param bool $add_nonce Optional. Whether the URL shall be nonced by WordPress.
425
+ */
426
+ public static function redirect( array $params = array(), $add_nonce = false ) {
427
+ $redirect = self::url( $params );
428
+ if ( $add_nonce ) {
429
+ if ( ! isset( $params['item'] ) ) {
430
+ $params['item'] = false;
431
+ }
432
+ // Don't use wp_nonce_url(), as that uses esc_html().
433
+ $redirect = add_query_arg( '_wpnonce', wp_create_nonce( self::nonce( $params['action'], $params['item'] ) ), $redirect );
434
+ }
435
+ wp_redirect( $redirect );
436
+ exit;
437
+ }
438
+
439
+ /**
440
+ * Show an error notice to admins, if TablePress's minimum requirements are not reached.
441
+ *
442
+ * @since 1.0.0
443
+ */
444
+ public static function show_minimum_requirements_error_notice() {
445
+ // Message is not translated as it is shown on every admin screen, for which we don't want to load translations.
446
+ echo '<div class="notice notice-error form-invalid"><p>' .
447
+ '<strong>Attention:</strong> ' .
448
+ 'The installed version of WordPress is too old for the TablePress plugin! TablePress requires an up-to-date version! <strong>Please <a href="' . esc_url( admin_url( 'update-core.php' ) ) . '">update your WordPress installation</a></strong>!' .
449
+ "</p></div>\n";
450
+ }
451
+
452
+ } // class TablePress
classes/class-view.php ADDED
@@ -0,0 +1,462 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress Base View with members and methods for all views
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Views
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * TablePress Base View class
16
+ * @package TablePress
17
+ * @subpackage Views
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ abstract class TablePress_View {
22
+
23
+ /**
24
+ * Data for the view.
25
+ *
26
+ * @since 1.0.0
27
+ * @var array
28
+ */
29
+ protected $data = array();
30
+
31
+ /**
32
+ * Number of screen columns for post boxes.
33
+ *
34
+ * @since 1.0.0
35
+ * @var int
36
+ */
37
+ protected $screen_columns = 0;
38
+
39
+ /**
40
+ * User action for this screen.
41
+ *
42
+ * @since 1.0.0
43
+ * @var string
44
+ */
45
+ protected $action = '';
46
+
47
+ /**
48
+ * Instance of the Admin Page Helper Class, with necessary functions.
49
+ *
50
+ * @since 1.0.0
51
+ * @var TablePress_Admin_Page
52
+ */
53
+ protected $admin_page;
54
+
55
+ /**
56
+ * List of text boxes (similar to post boxes, but just with text and without extra functionality).
57
+ *
58
+ * @since 1.0.0
59
+ * @var array
60
+ */
61
+ protected $textboxes = array();
62
+
63
+ /**
64
+ * List of messages that are to be displayed as boxes below the page title.
65
+ *
66
+ * @since 1.0.0
67
+ * @var array
68
+ */
69
+ protected $header_messages = array();
70
+
71
+ /**
72
+ * Whether there are post boxes registered for this screen,
73
+ * is automatically set to true, when a meta box is added.
74
+ *
75
+ * @since 1.0.0
76
+ * @var bool
77
+ */
78
+ protected $has_meta_boxes = false;
79
+
80
+ /**
81
+ * List of WP feature pointers for this view.
82
+ *
83
+ * @since 1.0.0
84
+ * @var array
85
+ */
86
+ protected $wp_pointers = array();
87
+
88
+ /**
89
+ * Initialize the View class, by setting the correct screen columns and adding help texts.
90
+ *
91
+ * @since 1.0.0
92
+ */
93
+ public function __construct() {
94
+ $screen = get_current_screen();
95
+ if ( 0 !== $this->screen_columns ) {
96
+ $screen->add_option( 'layout_columns', array( 'max' => $this->screen_columns ) );
97
+ }
98
+ // Enable two column layout.
99
+ add_filter( "get_user_option_screen_layout_{$screen->id}", array( $this, 'set_current_screen_layout_columns' ) );
100
+
101
+ $screen->add_help_tab( array(
102
+ 'id' => 'tablepress-help', // This should be unique for the screen.
103
+ 'title' => __( 'TablePress Help', 'tablepress' ),
104
+ 'content' => '<p>' . $this->help_tab_content() . '</p>'
105
+ . '<p>' . sprintf( __( 'More information about TablePress can be found on the <a href="%1$s">plugin&#8217;s website</a> or on its page in the <a href="%s">WordPress Plugin Directory</a>.', 'tablepress' ), 'https://tablepress.org/', 'https://wordpress.org/plugins/tablepress/' ) . ' '
106
+ . sprintf( __( 'For technical information, please see the <a href="%s">documentation</a>.', 'tablepress' ), 'https://tablepress.org/documentation/' ) . ' '
107
+ . sprintf( __( '<a href="%1$s">Support</a> is provided through the <a href="%2$s">WordPress Support Forums</a>.', 'tablepress' ), 'https://tablepress.org/support/', 'https://wordpress.org/tags/tablepress' ) . ' '
108
+ . sprintf( __( 'Before asking for support, please carefully read the <a href="%s">Frequently Asked Questions</a>, where you will find answers to the most common questions, and search through the forums.', 'tablepress' ), 'https://tablepress.org/faq/' ) . '<br />'
109
+ . sprintf( __( 'If you like the plugin, <a href="%1$s"><strong>a donation</strong></a> is recommended.', 'tablepress' ), 'https://tablepress.org/donate/' ) . '</p>',
110
+ ) );
111
+ // "sidebar" in the help tab.
112
+ $screen->set_help_sidebar( '<p><strong>' . __( 'For more information:', 'tablepress' ) . '</strong></p><p><a href="https://tablepress.org/" target="_blank">TablePress Website</a></p><p><a href="https://tablepress.org/faq/" target="_blank">TablePress FAQ</a></p><p><a href="https://tablepress.org/documentation/" target="_blank">TablePress Documentation</a></p><p><a href="https://tablepress.org/support/" target="_blank">TablePress Support</a></p>' );
113
+ }
114
+
115
+ /**
116
+ * Change the value of the user option "screen_layout_{$screen->id}" through a filter.
117
+ *
118
+ * @since 1.0.0
119
+ *
120
+ * @param int|bool Current value of the user option.
121
+ * @return int New value for the user option.
122
+ */
123
+ public function set_current_screen_layout_columns( $result ) {
124
+ if ( false === $result ) {
125
+ // The user option does not yet exist.
126
+ $result = $this->screen_columns;
127
+ } elseif ( $result > $this->screen_columns ) {
128
+ // The value of the user option is bigger than what is possible on this screen (e.g. because the number of columns was reduced in an update).
129
+ $result = $this->screen_columns;
130
+ }
131
+ return $result;
132
+ }
133
+
134
+ /**
135
+ * Set up the view with data and do things that are necessary for all views.
136
+ *
137
+ * @since 1.0.0
138
+ *
139
+ * @param string $action Action for this view.
140
+ * @param array $data Data for this view.
141
+ */
142
+ public function setup( $action, array $data ) {
143
+ $this->action = $action;
144
+ $this->data = $data;
145
+
146
+ // Set page title.
147
+ $GLOBALS['title'] = sprintf( __( '%1$s &lsaquo; %2$s', 'tablepress' ), $this->data['view_actions'][ $this->action ]['page_title'], 'TablePress' );
148
+
149
+ // Admin page helpers, like script/style loading, could be moved to view.
150
+ $this->admin_page = TablePress::load_class( 'TablePress_Admin_Page', 'class-admin-page-helper.php', 'classes' );
151
+ $this->admin_page->enqueue_style( 'common' );
152
+ // RTL styles for the admin interface.
153
+ if ( is_rtl() ) {
154
+ $this->admin_page->enqueue_style( 'common-rtl', array( 'tablepress-common' ) );
155
+ }
156
+ $this->admin_page->enqueue_script( 'common', array( 'jquery', 'postbox' ), array(
157
+ 'common' => array(
158
+ 'ays_delete_single_table' => _n( 'Do you really want to delete this table?', 'Do you really want to delete these tables?', 1, 'tablepress' ),
159
+ 'ays_delete_multiple_tables' => _n( 'Do you really want to delete this table?', 'Do you really want to delete these tables?', 2, 'tablepress' ),
160
+ )
161
+ ) );
162
+
163
+ $this->admin_page->add_admin_footer_text();
164
+
165
+ // Initialize WP feature pointers for TablePress.
166
+ $this->_init_wp_pointers();
167
+
168
+ // Necessary fields for all views.
169
+ $this->add_text_box( 'default_nonce_fields', array( $this, 'default_nonce_fields' ), 'header', false );
170
+ $this->add_text_box( 'action_nonce_field', array( $this, 'action_nonce_field' ), 'header', false );
171
+ $this->add_text_box( 'action_field', array( $this, 'action_field' ), 'header', false );
172
+ }
173
+
174
+ /**
175
+ * Register a header message for the view.
176
+ *
177
+ * @since 1.0.0
178
+ *
179
+ * @param string $text Text for the header message.
180
+ * @param string $class Optional. Additional CSS class for the header message.
181
+ */
182
+ protected function add_header_message( $text, $class = 'notice-success' ) {
183
+ if ( ! stripos( $class, 'not-dismissible' ) ) {
184
+ $class .= ' is-dismissible';
185
+ }
186
+ $this->header_messages[] = "<div class=\"notice {$class}\"><p>{$text}</p></div>\n";
187
+ }
188
+
189
+ /**
190
+ * Process header action messages, i.e. check if a message should be added to the page.
191
+ *
192
+ * @since 1.0.0
193
+ *
194
+ * @param array $action_messages Action messages for the screen.
195
+ */
196
+ protected function process_action_messages( array $action_messages ) {
197
+ if ( $this->data['message'] && isset( $action_messages[ $this->data['message'] ] ) ) {
198
+ $class = ( 'error' === substr( $this->data['message'], 0, 5 ) ) ? 'notice-error' : 'notice-success';
199
+ $this->add_header_message( "<strong>{$action_messages[ $this->data['message'] ]}</strong>", $class );
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Register a text box for the view.
205
+ *
206
+ * @since 1.0.0
207
+ *
208
+ * @param string $id Unique HTML ID for the text box container (only visible with $wrap = true).
209
+ * @param callback $callback Callback that prints the contents of the text box.
210
+ * @param string $context Optional. Context/position of the text box (normal, side, additional, header, submit).
211
+ * @param bool $ wrap Whether the content of the text box shall be wrapped in a <div> container.
212
+ */
213
+ protected function add_text_box( $id, $callback, $context = 'normal', $wrap = false ) {
214
+ if ( ! isset( $this->textboxes[ $context ] ) ) {
215
+ $this->textboxes[ $context ] = array();
216
+ }
217
+
218
+ $long_id = "tablepress_{$this->action}-{$id}";
219
+ $this->textboxes[ $context ][ $id ] = array(
220
+ 'id' => $long_id,
221
+ 'callback' => $callback,
222
+ 'context' => $context,
223
+ 'wrap' => $wrap,
224
+ );
225
+ }
226
+
227
+ /**
228
+ * Register a post meta box for the view, that is drag/droppable with WordPress functionality.
229
+ *
230
+ * @since 1.0.0
231
+ *
232
+ * @param string $id Unique ID for the meta box.
233
+ * @param string $title Title for the meta box.
234
+ * @param callback $callback Callback that prints the contents of the post meta box.
235
+ * @param string $context Optional. Context/position of the post meta box (normal, side, additional).
236
+ * @param string $priority Optional. Order of the post meta box for the $context position (high, default, low).
237
+ * @param bool $callback_args Optional. Additional data for the callback function (e.g. useful when in different class).
238
+ */
239
+ protected function add_meta_box( $id, $title, $callback, $context = 'normal', $priority = 'default', $callback_args = null ) {
240
+ $this->has_meta_boxes = true;
241
+ add_meta_box( "tablepress_{$this->action}-{$id}", $title, $callback, null, $context, $priority, $callback_args );
242
+ }
243
+
244
+ /**
245
+ * Render all text boxes for the given context.
246
+ *
247
+ * @since 1.0.0
248
+ *
249
+ * @param string $context Context (normal, side, additional, header, submit) for which registered text boxes shall be rendered.
250
+ */
251
+ protected function do_text_boxes( $context ) {
252
+ if ( empty( $this->textboxes[ $context ] ) ) {
253
+ return;
254
+ }
255
+
256
+ foreach ( $this->textboxes[ $context ] as $box ) {
257
+ if ( $box['wrap'] ) {
258
+ echo "<div id=\"{$box['id']}\" class=\"textbox\">\n";
259
+ }
260
+ call_user_func( $box['callback'], $this->data, $box );
261
+ if ( $box['wrap'] ) {
262
+ echo "</div>\n";
263
+ }
264
+ }
265
+ }
266
+
267
+ /**
268
+ * Render all post meta boxes for the given context, if there are post meta boxes.
269
+ *
270
+ * @since 1.0.0
271
+ *
272
+ * @param string $context Context (normal, side, additional) for which registered post meta boxes shall be rendered.
273
+ */
274
+ protected function do_meta_boxes( $context ) {
275
+ if ( ! $this->has_meta_boxes ) {
276
+ return;
277
+ }
278
+ do_meta_boxes( null, $context, $this->data );
279
+ }
280
+
281
+ /**
282
+ * Print hidden fields with nonces for post meta box AJAX handling, if there are post meta boxes on the screen.
283
+ *
284
+ * The check is possible as this function is executed after post meta boxes have to be registered.
285
+ *
286
+ * @since 1.0.0
287
+ *
288
+ * @param array $data Data for this screen.
289
+ * @param array $box Information about the text box.
290
+ */
291
+ protected function default_nonce_fields( array $data, array $box ) {
292
+ if ( ! $this->has_meta_boxes ) {
293
+ return;
294
+ }
295
+ wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false ); echo "\n";
296
+ wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false ); echo "\n";
297
+ }
298
+
299
+ /**
300
+ * Print hidden field with a nonce for the screen's action, to be transmitted in HTTP requests.
301
+ *
302
+ * @since 1.0.0
303
+ *
304
+ * @param array $data Data for this screen.
305
+ * @param array $box Information about the text box.
306
+ */
307
+ protected function action_nonce_field( array $data, array $box ) {
308
+ wp_nonce_field( TablePress::nonce( $this->action ) ); echo "\n";
309
+ }
310
+
311
+ /**
312
+ * Print hidden field with the screen action.
313
+ *
314
+ * @since 1.0.0
315
+ *
316
+ * @param array $data Data for this screen.
317
+ * @param array $box Information about the text box.
318
+ */
319
+ protected function action_field( array $data, array $box ) {
320
+ echo "<input type=\"hidden\" name=\"action\" value=\"tablepress_{$this->action}\" />\n";
321
+ }
322
+
323
+ /**
324
+ * Render the current view.
325
+ *
326
+ * @since 1.0.0
327
+ */
328
+ public function render() {
329
+ ?>
330
+ <div id="tablepress-page" class="wrap">
331
+ <?php
332
+ $this->print_nav_tab_menu();
333
+ // Print all header messages.
334
+ foreach ( $this->header_messages as $message ) {
335
+ echo $message;
336
+ }
337
+ // "Import" screen has file upload.
338
+ $enctype = ( 'import' === $this->action ) ? ' enctype="multipart/form-data"' : '';
339
+ ?>
340
+ <form action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post"<?php echo $enctype; ?>>
341
+ <?php
342
+ $this->do_text_boxes( 'header' );
343
+ ?>
344
+ <div id="poststuff">
345
+ <div id="post-body" class="metabox-holder columns-<?php echo ( isset( $GLOBALS['screen_layout_columns'] ) && ( 2 === $GLOBALS['screen_layout_columns'] ) ) ? '2' : '1'; ?>">
346
+ <div id="postbox-container-2" class="postbox-container">
347
+ <?php
348
+ $this->do_text_boxes( 'normal' );
349
+ $this->do_meta_boxes( 'normal' );
350
+
351
+ $this->do_text_boxes( 'additional' );
352
+ $this->do_meta_boxes( 'additional' );
353
+
354
+ // Print all submit buttons.
355
+ $this->do_text_boxes( 'submit' );
356
+ ?>
357
+ </div>
358
+ <div id="postbox-container-1" class="postbox-container">
359
+ <?php
360
+ // Print all boxes in the sidebar.
361
+ $this->do_text_boxes( 'side' );
362
+ $this->do_meta_boxes( 'side' );
363
+ ?>
364
+ </div>
365
+ </div>
366
+ <br class="clear" />
367
+ </div>
368
+ </form>
369
+ </div>
370
+ <?php
371
+ }
372
+
373
+ /**
374
+ * Render the navigation menu with links to the possible actions, highlighting the current one.
375
+ *
376
+ * @since 1.0.0
377
+ */
378
+ protected function print_nav_tab_menu() {
379
+ ?>
380
+ <h2 id="tablepress-nav" class="nav-tab-wrapper">
381
+ <?php
382
+ echo __( 'TablePress', 'tablepress' ) . '<span class="separator"></span>';
383
+ foreach ( $this->data['view_actions'] as $action => $entry ) {
384
+ // Special case: Add a separator before the group that starts with "Plugin Options", for some spacing.
385
+ if ( 'options' === $action ) {
386
+ echo '<span class="separator"></span><span class="separator"></span>';
387
+ }
388
+
389
+ if ( '' === $entry['nav_tab_title'] ) {
390
+ continue;
391
+ }
392
+ if ( ! current_user_can( $entry['required_cap'] ) ) {
393
+ continue;
394
+ }
395
+
396
+ $url = esc_url( TablePress::url( array( 'action' => $action ) ) );
397
+ $active = ( $action === $this->action ) ? ' nav-tab-active' : '';
398
+ echo "<a class=\"nav-tab{$active}\" href=\"{$url}\">{$entry['nav_tab_title']}</a>";
399
+ }
400
+ ?>
401
+ </h2>
402
+ <?php
403
+ }
404
+
405
+ /**
406
+ * Print a submit button (only done when function is used as a callback for a text box).
407
+ *
408
+ * @since 1.0.0
409
+ *
410
+ * @param array $data Data for this screen.
411
+ * @param array $box Information about the text box.
412
+ */
413
+ protected function textbox_submit_button( array $data, array $box ) {
414
+ $caption = isset( $data['submit_button_caption'] ) ? $data['submit_button_caption'] : __( 'Save Changes', 'tablepress' );
415
+ ?>
416
+ <p class="submit"><input type="submit" value="<?php echo esc_attr( $caption ); ?>" class="button button-primary button-large" name="submit" /></p>
417
+ <?php
418
+ }
419
+
420
+ /**
421
+ * Return the content for the help tab for this screen.
422
+ *
423
+ * Has to be implemented for every view that is visible in the WP Dashboard!
424
+ *
425
+ * @since 1.0.0
426
+ */
427
+ protected function help_tab_content() {
428
+ // Has to be implemented for every view that is visible in the WP Dashboard!
429
+ return '';
430
+ }
431
+
432
+ /**
433
+ * Initialize the WP feature pointers for TablePress.
434
+ *
435
+ * @since 1.0.0
436
+ */
437
+ protected function _init_wp_pointers() {
438
+ // Check if there are WP pointers for this view.
439
+ if ( empty( $this->wp_pointers ) ) {
440
+ return;
441
+ }
442
+
443
+ // Get dismissed pointers.
444
+ $dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
445
+
446
+ $got_pointers = false;
447
+ foreach ( array_diff( $this->wp_pointers, $dismissed ) as $pointer ) {
448
+ // Bind pointer print function.
449
+ add_action( "admin_footer-{$GLOBALS['hook_suffix']}", array( $this, 'wp_pointer_' . $pointer ) );
450
+ $got_pointers = true;
451
+ }
452
+
453
+ if ( ! $got_pointers ) {
454
+ return;
455
+ }
456
+
457
+ // Add pointers script and style to queue.
458
+ wp_enqueue_style( 'wp-pointer' );
459
+ wp_enqueue_script( 'wp-pointer' );
460
+ }
461
+
462
+ } // class TablePress_View
classes/class-wp_option.php ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress WP Option Wrapper class for WordPress Options
4
+ *
5
+ * Wraps the WordPress Options API, so that (especially) arrays are stored as JSON, instead of being serialized by PHP.
6
+ *
7
+ * @package TablePress
8
+ * @subpackage Classes
9
+ * @author Tobias Bäthge
10
+ * @since 1.0.0
11
+ */
12
+
13
+ // Prohibit direct script loading.
14
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
15
+
16
+ /**
17
+ * TablePress WP Option Wrapper class
18
+ * @package TablePress
19
+ * @subpackage Classes
20
+ * @author Tobias Bäthge
21
+ * @since 1.0.0
22
+ */
23
+ class TablePress_WP_Option {
24
+
25
+ /**
26
+ * Name/Key of the Option (in its location in the database).
27
+ *
28
+ * @since 1.0.0
29
+ * @var string
30
+ */
31
+ protected $option_name;
32
+
33
+ /**
34
+ * Current value of the option.
35
+ *
36
+ * @since 1.0.0
37
+ * @var array
38
+ */
39
+ protected $option_value;
40
+
41
+ /**
42
+ * Initialize with Option Name.
43
+ *
44
+ * @since 1.0.0
45
+ *
46
+ * @param array $params {
47
+ * @type string $option_name Name of the Option.
48
+ * @type array $default_value Default values for the Option.
49
+ * }
50
+ */
51
+ public function __construct( array $params ) {
52
+ $this->option_name = $params['option_name'];
53
+
54
+ $option_value = $this->_get_option( $this->option_name, null );
55
+ if ( ! is_null( $option_value ) ) {
56
+ $this->option_value = (array) json_decode( $option_value, true );
57
+ } else {
58
+ $this->option_value = $params['default_value'];
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Check if Option is set.
64
+ *
65
+ * @since 1.0.0
66
+ *
67
+ * @param string $name Name of the option to check.
68
+ * @return bool Whether the option is set.
69
+ */
70
+ public function is_set( $name ) {
71
+ return isset( $this->option_value[ $name ] );
72
+ }
73
+
74
+ /**
75
+ * Get a single Option, or get all Options.
76
+ *
77
+ * @since 1.0.0
78
+ *
79
+ * @param string|bool $name Optional. Name of a single option to get, or false for all options.
80
+ * @param mixed $default_value Optional. Default value to return, if a single option $name does not exist.
81
+ * @return mixed|array Value of the retrieved option $name or $default_value if it does not exist, or all options.
82
+ */
83
+ public function get( $name = false, $default_value = null ) {
84
+ if ( false === $name ) {
85
+ return $this->option_value;
86
+ }
87
+
88
+ // Single Option wanted.
89
+ if ( isset( $this->option_value[ $name ] ) ) {
90
+ return $this->option_value[ $name ];
91
+ } else {
92
+ return $default_value;
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Update Option.
98
+ *
99
+ * @since 1.0.0
100
+ *
101
+ * @param array $new_options New options (name => value).
102
+ * @return bool True on success, false on failure.
103
+ */
104
+ public function update( array $new_options ) {
105
+ $this->option_value = $new_options;
106
+ return $this->_update_option( $this->option_name, json_encode( $this->option_value ) );
107
+ }
108
+
109
+ /**
110
+ * Delete Option.
111
+ *
112
+ * @since 1.0.0
113
+ *
114
+ * @return bool True on success, false on failure.
115
+ */
116
+ public function delete() {
117
+ return $this->_delete_option( $this->option_name );
118
+ }
119
+
120
+ /**
121
+ * Internal functions mapping - This needs to be re-defined by child classes.
122
+ */
123
+
124
+ /**
125
+ * Get the value of a WP Option with the WP Options API.
126
+ *
127
+ * @since 1.0.0
128
+ *
129
+ * @param string $option_name Name of the WP Option.
130
+ * @param mixed $default_value Default value of the WP Option.
131
+ * @return mixed Current value of the WP Option, or $default_value if it does not exist.
132
+ */
133
+ protected function _get_option( $option_name, $default_value ) {
134
+ return get_option( $option_name, $default_value );
135
+ }
136
+
137
+ /**
138
+ * Update the value of a WP Option with the WP Options API.
139
+ *
140
+ * @since 1.0.0
141
+ *
142
+ * @param string $option_name Name of the WP Option.
143
+ * @param string $new_value New value of the WP Option.
144
+ * @return bool True on success, false on failure.
145
+ */
146
+ protected function _update_option( $option_name, $new_value ) {
147
+ return update_option( $option_name, $new_value );
148
+ }
149
+
150
+ /**
151
+ * Delete a WP Option with the WP Options API.
152
+ *
153
+ * @since 1.0.0
154
+ *
155
+ * @param string $option_name Name of the WP Option.
156
+ * @return bool True on success, false on failure.
157
+ */
158
+ protected function _delete_option( $option_name ) {
159
+ return delete_option( $option_name );
160
+ }
161
+
162
+ } // class TablePress_WP_Option
classes/class-wp_user_option.php ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * TablePress WP User Option Wrapper class for WordPress Options
4
+ *
5
+ * Wraps the WordPress Options API, so that (especially) arrays are stored as JSON, instead of being serialized by PHP.
6
+ *
7
+ * @package TablePress
8
+ * @subpackage Classes
9
+ * @author Tobias Bäthge
10
+ * @since 1.0.0
11
+ */
12
+
13
+ // Prohibit direct script loading.
14
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
15
+
16
+ // Load parent class.
17
+ TablePress::load_file( 'class-wp_option.php', 'classes' );
18
+
19
+ /**
20
+ * TablePress WP User Option Wrapper class
21
+ * @package TablePress
22
+ * @subpackage Classes
23
+ * @author Tobias Bäthge
24
+ * @since 1.0.0
25
+ */
26
+ class TablePress_WP_User_Option extends TablePress_WP_Option {
27
+
28
+ /**
29
+ * Get the value of a WP User Option with the WP User Options API.
30
+ *
31
+ * @since 1.0.0
32
+ *
33
+ * @param string $option_name Name of the WP User Option.
34
+ * @param mixed $default_value Default value of the WP User Option.
35
+ * @return mixed Current value of the WP User Option, or $default_value if it does not exist.
36
+ */
37
+ protected function _get_option( $option_name, $default_value ) {
38
+ // Non-logged-in user can never have a saved option value.
39
+ if ( ! is_user_logged_in() ) {
40
+ return $default_value;
41
+ }
42
+
43
+ $option_value = get_user_option( $option_name );
44
+ // get_user_option() only knows false as the default value, so we have to wrap that.
45
+ if ( false === $option_value ) {
46
+ $option_value = $default_value;
47
+ }
48
+ return $option_value;
49
+ }
50
+
51
+ /**
52
+ * Update the value of a WP User Option with the WP User Options API.
53
+ *
54
+ * @since 1.0.0
55
+ *
56
+ * @param string $option_name Name of the WP User Option.
57
+ * @param string $new_value New value of the WP User Option (not slashed).
58
+ * @return bool True on success, false on failure.
59
+ */
60
+ protected function _update_option( $option_name, $new_value ) {
61
+ // Non-logged-in user can never have a saved option value to be updated.
62
+ if ( ! is_user_logged_in() ) {
63
+ return false;
64
+ }
65
+
66
+ // WP expects a slashed value.
67
+ $new_value = wp_slash( $new_value );
68
+ return update_user_option( get_current_user_id(), $option_name, $new_value, false );
69
+ }
70
+
71
+ /**
72
+ * Delete a WP User Option with the WP User Options API.
73
+ *
74
+ * @since 1.0.0
75
+ *
76
+ * @param string $option_name Name of the WP User Option.
77
+ * @return bool True on success, false on failure.
78
+ */
79
+ protected function _delete_option( $option_name ) {
80
+ // Non-logged-in user can never have a saved option value to be deleted.
81
+ if ( ! is_user_logged_in() ) {
82
+ return false;
83
+ }
84
+
85
+ return delete_user_option( get_current_user_id(), $option_name, false );
86
+ }
87
+
88
+ /**
89
+ * Delete a WP User Option with the WP User Options API, for all users of the site.
90
+ *
91
+ * @since 1.0.0
92
+ */
93
+ public function delete_for_all_users() {
94
+ $users = get_users();
95
+ foreach ( $users as $user ) {
96
+ delete_user_option( $user->ID, $this->option_name, false );
97
+ // @TODO: Add other user options for different actions as well.
98
+ }
99
+ }
100
+
101
+ } // class TablePress_WP_User_Option
classes/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
controllers/controller-admin.php ADDED
@@ -0,0 +1,2092 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin Controller for TablePress with the functionality for the non-AJAX backend
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Controllers
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * Admin Controller class, extends Base Controller Class
16
+ * @package TablePress
17
+ * @subpackage Controllers
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ class TablePress_Admin_Controller extends TablePress_Controller {
22
+
23
+ /**
24
+ * Page hooks (i.e. names) WordPress uses for the TablePress admin screens,
25
+ * populated in add_admin_menu_entry().
26
+ *
27
+ * @since 1.0.0
28
+ * @var array
29
+ */
30
+ protected $page_hooks = array();
31
+
32
+ /**
33
+ * Actions that have a view and admin menu or nav tab menu entry.
34
+ *
35
+ * @since 1.0.0
36
+ * @var array
37
+ */
38
+ protected $view_actions = array();
39
+
40
+ /**
41
+ * Boolean to record whether language support has been loaded (to prevent to do it twice).
42
+ *
43
+ * @since 1.0.0
44
+ * @var bool
45
+ */
46
+ protected $i18n_support_loaded = false;
47
+
48
+ /**
49
+ * Instance of the TablePress Admin View that is rendered.
50
+ *
51
+ * @since 1.0.0
52
+ * @var TablePress_View
53
+ */
54
+ protected $view;
55
+
56
+ /**
57
+ * Instance of the TablePress Importer.
58
+ *
59
+ * @since 1.0.0
60
+ * @var TablePress_Import
61
+ */
62
+ protected $importer;
63
+
64
+ /**
65
+ * Initialize the Admin Controller, determine location the admin menu, set up actions.
66
+ *
67
+ * @since 1.0.0
68
+ */
69
+ public function __construct() {
70
+ parent::__construct();
71
+
72
+ // Handler for changing the number of shown tables in the list of tables (via WP List Table class).
73
+ add_filter( 'set-screen-option', array( $this, 'save_list_tables_screen_option' ), 10, 3 );
74
+
75
+ add_action( 'admin_menu', array( $this, 'add_admin_menu_entry' ) );
76
+ add_action( 'admin_init', array( $this, 'add_admin_actions' ) );
77
+ }
78
+
79
+ /**
80
+ * Handler for changing the number of shown tables in the list of tables (via WP List Table class).
81
+ *
82
+ * @since 1.0.0
83
+ *
84
+ * @param bool $false Current value of the filter (probably bool false).
85
+ * @param string $option Option in which the setting is stored.
86
+ * @param int $value Current value of the setting.
87
+ * @return bool|int False to not save the changed setting, or the int value to be saved.
88
+ */
89
+ public function save_list_tables_screen_option( $false, $option, $value ) {
90
+ if ( 'tablepress_list_per_page' === $option ) {
91
+ return $value;
92
+ } else {
93
+ return $false;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Add admin screens to the correct place in the admin menu.
99
+ *
100
+ * @since 1.0.0
101
+ */
102
+ public function add_admin_menu_entry() {
103
+ // Callback for all menu entries.
104
+ $callback = array( $this, 'show_admin_page' );
105
+ /**
106
+ * Filter the TablePress admin menu entry name.
107
+ *
108
+ * @since 1.0.0
109
+ *
110
+ * @param string $entry_name The admin menu entry name. Default "TablePress".
111
+ */
112
+ $admin_menu_entry_name = apply_filters( 'tablepress_admin_menu_entry_name', 'TablePress' );
113
+
114
+ if ( $this->is_top_level_page ) {
115
+ // Init i18n support here as translated strings for admin menu are needed already.
116
+ $this->init_i18n_support();
117
+ $this->init_view_actions(); // after init_i18n_support(), as it requires translation
118
+ $min_access_cap = $this->view_actions['list']['required_cap'];
119
+
120
+ $icon_url = 'dashicons-list-view';
121
+ switch ( $this->parent_page ) {
122
+ case 'top':
123
+ $position = 3; // position of Dashboard + 1
124
+ break;
125
+ case 'bottom':
126
+ $position = ( ++$GLOBALS['_wp_last_utility_menu'] );
127
+ break;
128
+ case 'middle':
129
+ default:
130
+ $position = ( ++$GLOBALS['_wp_last_object_menu'] );
131
+ break;
132
+ }
133
+ add_menu_page( 'TablePress', $admin_menu_entry_name, $min_access_cap, 'tablepress', $callback, $icon_url, $position );
134
+ foreach ( $this->view_actions as $action => $entry ) {
135
+ if ( ! $entry['show_entry'] ) {
136
+ continue;
137
+ }
138
+ $slug = 'tablepress';
139
+ if ( 'list' !== $action ) {
140
+ $slug .= '_' . $action;
141
+ }
142
+ $this->page_hooks[] = add_submenu_page( 'tablepress', sprintf( __( '%1$s &lsaquo; %2$s', 'tablepress' ), $entry['page_title'], 'TablePress' ), $entry['admin_menu_title'], $entry['required_cap'], $slug, $callback );
143
+ }
144
+ } else {
145
+ $this->init_view_actions(); // no translation necessary here
146
+ $min_access_cap = $this->view_actions['list']['required_cap'];
147
+ $this->page_hooks[] = add_submenu_page( $this->parent_page, 'TablePress', $admin_menu_entry_name, $min_access_cap, 'tablepress', $callback );
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Set up handlers for user actions in the backend that exceed plain viewing.
153
+ *
154
+ * @since 1.0.0
155
+ */
156
+ public function add_admin_actions() {
157
+ // Register the callbacks for processing action requests.
158
+ $post_actions = array( 'list', 'add', 'edit', 'options', 'export', 'import' );
159
+ $get_actions = array( 'hide_message', 'delete_table', 'copy_table', 'preview_table', 'editor_button_thickbox', 'uninstall_tablepress' );
160
+ foreach ( $post_actions as $action ) {
161
+ add_action( "admin_post_tablepress_{$action}", array( $this, "handle_post_action_{$action}" ) );
162
+ }
163
+ foreach ( $get_actions as $action ) {
164
+ add_action( "admin_post_tablepress_{$action}", array( $this, "handle_get_action_{$action}" ) );
165
+ }
166
+
167
+ // Register callbacks to trigger load behavior for admin pages.
168
+ foreach ( $this->page_hooks as $page_hook ) {
169
+ add_action( "load-{$page_hook}", array( $this, 'load_admin_page' ) );
170
+ }
171
+
172
+ $pages_with_editor_button = array( 'post.php', 'post-new.php' );
173
+ foreach ( $pages_with_editor_button as $editor_page ) {
174
+ add_action( "load-{$editor_page}", array( $this, 'add_editor_buttons' ) );
175
+ }
176
+
177
+ if ( ! is_network_admin() && ! is_user_admin() ) {
178
+ add_action( 'admin_bar_menu', array( $this, 'add_wp_admin_bar_new_content_menu_entry' ), 71 );
179
+ }
180
+
181
+ add_action( 'load-plugins.php', array( $this, 'plugins_page' ) );
182
+ add_action( 'admin_print_styles-media-upload-popup', array( $this, 'add_media_upload_thickbox_css' ) );
183
+
184
+ // Add filters and actions for the integration into the WP WXR exporter and importer.
185
+ add_action( 'wp_import_insert_post', array( TablePress::$model_table, 'add_table_id_on_wp_import' ), 10, 4 );
186
+ add_filter( 'wp_import_post_meta', array( TablePress::$model_table, 'prevent_table_id_post_meta_import_on_wp_import' ), 10, 3 );
187
+ add_filter( 'wxr_export_skip_postmeta', array( TablePress::$model_table, 'add_table_id_to_wp_export' ), 10, 3 );
188
+ }
189
+
190
+ /**
191
+ * Register actions to add "Table" button to "HTML editor" and "Visual editor" toolbars.
192
+ *
193
+ * @since 1.0.0
194
+ */
195
+ public function add_editor_buttons() {
196
+ if ( ! current_user_can( 'tablepress_list_tables' ) ) {
197
+ return;
198
+ }
199
+
200
+ $this->init_i18n_support();
201
+ add_thickbox(); // usually already loaded by media upload functions
202
+ $admin_page = TablePress::load_class( 'TablePress_Admin_Page', 'class-admin-page-helper.php', 'classes' );
203
+ $admin_page->enqueue_script( 'quicktags-button', array( 'quicktags', 'media-upload' ), array(
204
+ 'editor_button' => array(
205
+ 'caption' => __( 'Table', 'tablepress' ),
206
+ 'title' => __( 'Insert a Table from TablePress', 'tablepress' ),
207
+ 'thickbox_title' => __( 'Insert a Table from TablePress', 'tablepress' ),
208
+ 'thickbox_url' => TablePress::url( array( 'action' => 'editor_button_thickbox' ), true, 'admin-post.php' ),
209
+ ),
210
+ ) );
211
+
212
+ // TinyMCE integration.
213
+ if ( user_can_richedit() ) {
214
+ add_filter( 'mce_external_plugins', array( $this, 'add_tinymce_plugin' ) );
215
+ add_filter( 'mce_buttons', array( $this, 'add_tinymce_button' ) );
216
+ add_action( 'admin_print_styles', array( $this, 'add_tablepress_hidpi_css' ), 21 );
217
+ }
218
+ }
219
+
220
+ /**
221
+ * Add "Table" button and separator to the TinyMCE toolbar.
222
+ *
223
+ * @since 1.0.0
224
+ *
225
+ * @param array $buttons Current set of buttons in the TinyMCE toolbar.
226
+ * @return array Current set of buttons in the TinyMCE toolbar, including "Table" button.
227
+ */
228
+ public function add_tinymce_button( array $buttons ) {
229
+ $buttons[] = 'tablepress_insert_table';
230
+ return $buttons;
231
+ }
232
+
233
+ /**
234
+ * Register "Table" button plugin to TinyMCE.
235
+ *
236
+ * @since 1.0.0
237
+ *
238
+ * @param array $plugins Current set of registered TinyMCE plugins.
239
+ * @return array Current set of registered TinyMCE plugins, including "Table" button plugin.
240
+ */
241
+ public function add_tinymce_plugin( array $plugins ) {
242
+ $suffix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
243
+ $js_file = "admin/js/tinymce-button{$suffix}.js";
244
+ $plugins['tablepress_tinymce'] = plugins_url( $js_file, TABLEPRESS__FILE__ );
245
+ return $plugins;
246
+ }
247
+
248
+ /**
249
+ * Print TablePress HiDPI CSS to the <head> for TinyMCE button.
250
+ *
251
+ * @since 1.0.0
252
+ */
253
+ public function add_tablepress_hidpi_css() {
254
+ echo '<style type="text/css">@media print,(-o-min-device-pixel-ratio:5/4),(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){';
255
+ echo '#content_tablepress_insert_table span{background:url(' . plugins_url( 'admin/img/tablepress-editor-button-2x.png', TABLEPRESS__FILE__ ) . ') no-repeat 0 0;background-size:20px 20px}';
256
+ echo '#content_tablepress_insert_table img{display:none}';
257
+ echo '}</style>' . "\n";
258
+ }
259
+
260
+ /**
261
+ * Print some CSS in the Media Upload Thickbox to fix some positioning issues.
262
+ *
263
+ * These will most likely not be fixed in core, as the old media uploader is deprecated.
264
+ * They will be removed in TablePress, once the new media uploader is used.
265
+ *
266
+ * @since 1.4.0
267
+ */
268
+ public function add_media_upload_thickbox_css() {
269
+ echo '<style type="text/css">#media-items,#media-upload #filter{width:auto!important}.media-item .describe input[type="text"],.media-item .describe textarea{width:100%!important}.media-item .image-editor input[type="text"]{width:3em!important}</style>' . "\n";
270
+ }
271
+
272
+ /**
273
+ * Add "TablePress Table" entry to "New" dropdown menu in the WP Admin Bar.
274
+ *
275
+ * @since 1.0.0
276
+ *
277
+ * @param WP_Admin_Bar $wp_admin_bar The current WP Admin Bar object.
278
+ */
279
+ public function add_wp_admin_bar_new_content_menu_entry( $wp_admin_bar ) {
280
+ if ( ! current_user_can( 'tablepress_add_tables' ) ) {
281
+ return;
282
+ }
283
+ // @TODO: Translation might not work, as textdomain might not yet be loaded here (for submenu entries).
284
+ // Might need $this->init_i18n_support(); here.
285
+ $wp_admin_bar->add_menu( array(
286
+ 'parent' => 'new-content',
287
+ 'id' => 'new-tablepress-table',
288
+ 'title' => __( 'TablePress Table', 'tablepress' ),
289
+ 'href' => TablePress::url( array( 'action' => 'add' ) ),
290
+ ) );
291
+ }
292
+
293
+ /**
294
+ * Handle actions for loading of Plugins page.
295
+ *
296
+ * @since 1.0.0
297
+ */
298
+ public function plugins_page() {
299
+ $this->init_i18n_support();
300
+ // Add additional links on Plugins page.
301
+ add_filter( 'plugin_action_links_' . TABLEPRESS_BASENAME, array( $this, 'add_plugin_action_links' ) );
302
+ add_filter( 'plugin_row_meta', array( $this, 'add_plugin_row_meta' ), 10, 2 );
303
+ }
304
+
305
+ /**
306
+ * Add links to the TablePress entry in the "Plugin" column on the Plugins page.
307
+ *
308
+ * @since 1.0.0
309
+ *
310
+ * @param array $links List of links to print in the "Plugin" column on the Plugins page.
311
+ * @return array Extended list of links to print in the "Plugin" column on the Plugins page.
312
+ */
313
+ public function add_plugin_action_links( array $links ) {
314
+ if ( current_user_can( 'tablepress_list_tables' ) ) {
315
+ $links[] = '<a href="' . TablePress::url() . '">' . __( 'Plugin page', 'tablepress' ) . '</a>';
316
+ }
317
+ return $links;
318
+ }
319
+ /**
320
+ * Add links to the TablePress entry in the "Description" column on the Plugins page.
321
+ *
322
+ * @since 1.0.0
323
+ *
324
+ * @param array $links List of links to print in the "Description" column on the Plugins page.
325
+ * @param string $file Name of the plugin.
326
+ * @return array Extended list of links to print in the "Description" column on the Plugins page.
327
+ */
328
+ public function add_plugin_row_meta( array $links, $file ) {
329
+ if ( TABLEPRESS_BASENAME === $file ) {
330
+ $links[] = '<a href="https://tablepress.org/faq/" title="' . esc_attr__( 'Frequently Asked Questions', 'tablepress' ) . '">' . __( 'FAQ', 'tablepress' ) . '</a>';
331
+ $links[] = '<a href="https://tablepress.org/documentation/">' . __( 'Documentation', 'tablepress' ) . '</a>';
332
+ $links[] = '<a href="https://tablepress.org/support/">' . __( 'Support', 'tablepress' ) . '</a>';
333
+ $links[] = '<a href="https://tablepress.org/donate/" title="' . esc_attr__( 'Support TablePress with your donation!', 'tablepress' ) . '"><strong>' . __( 'Donate', 'tablepress' ) . '</strong></a>';
334
+ }
335
+ return $links;
336
+ }
337
+
338
+ /**
339
+ * Prepare the rendering of an admin screen, by determining the current action, loading necessary data and initializing the view.
340
+ *
341
+ * @since 1.0.0
342
+ */
343
+ public function load_admin_page() {
344
+ // Determine the action from either the GET parameter (for sub-menu entries, and the main admin menu entry).
345
+ $action = ( ! empty( $_GET['action'] ) ) ? $_GET['action'] : 'list'; // default action is list
346
+ if ( $this->is_top_level_page ) {
347
+ // Or, for sub-menu entry of an admin menu "TablePress" entry, get it from the "page" GET parameter.
348
+ if ( 'tablepress' !== $_GET['page'] ) {
349
+ // Actions that are top-level entries, but don't have an action GET parameter (action is after last _ in string).
350
+ $action = substr( $_GET['page'], 11 ); // $_GET['page'] has the format 'tablepress_{$action}'
351
+ }
352
+ } else {
353
+ // Do this here in the else-part, instead of adding another if ( ! $this->is_top_level_page ) check.
354
+ $this->init_i18n_support(); // done here, as for sub menu admin pages this is the first time translated strings are needed.
355
+ $this->init_view_actions(); // for top-level menu entries, this has been done above, just like init_i18n_support().
356
+ }
357
+
358
+ // Check if action is a supported action, and whether the user is allowed to access this screen.
359
+ if ( ! isset( $this->view_actions[ $action ] ) || ! current_user_can( $this->view_actions[ $action ]['required_cap'] ) ) {
360
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
361
+ }
362
+
363
+ // Changes current screen ID and pagenow variable in JS, to enable automatic meta box JS handling.
364
+ set_current_screen( "tablepress_{$action}" );
365
+ // Set the $typenow global to the current CPT ourselves, as WP_Screen::get() does not determine the CPT correctly.
366
+ // This is necessary as the WP Admin Menu can otherwise highlight wrong entries, see https://github.com/TobiasBg/TablePress/issues/24.
367
+ if ( isset( $_GET['post_type'] ) && post_type_exists( $_GET['post_type'] ) ) {
368
+ $GLOBALS['typenow'] = $_GET['post_type'];
369
+ }
370
+
371
+ // Pre-define some view data.
372
+ $data = array(
373
+ 'view_actions' => $this->view_actions,
374
+ 'message' => ( ! empty( $_GET['message'] ) ) ? $_GET['message'] : false,
375
+ );
376
+
377
+ // Depending on the action, load more necessary data for the corresponding view.
378
+ switch ( $action ) {
379
+ case 'list':
380
+ $data['table_id'] = ( ! empty( $_GET['table_id'] ) ) ? $_GET['table_id'] : false;
381
+ // Prime the post meta cache for cached loading of last_editor.
382
+ $data['table_ids'] = TablePress::$model_table->load_all( true );
383
+ $data['messages']['first_visit'] = TablePress::$model_options->get( 'message_first_visit' );
384
+ if ( current_user_can( 'tablepress_import_tables_wptr' ) ) {
385
+ // Check if WP-Table Reloaded is activated.
386
+ $data['messages']['wp_table_reloaded_warning'] = is_plugin_active( 'wp-table-reloaded/wp-table-reloaded.php' );
387
+ } else {
388
+ $data['messages']['wp_table_reloaded_warning'] = false;
389
+ }
390
+ $data['messages']['plugin_update_message'] = TablePress::$model_options->get( 'message_plugin_update' );
391
+ $data['messages']['donation_message'] = $this->maybe_show_donation_message();
392
+ $data['table_count'] = count( $data['table_ids'] );
393
+ break;
394
+ case 'about':
395
+ $data['plugin_languages'] = $this->get_plugin_languages();
396
+ $data['first_activation'] = TablePress::$model_options->get( 'first_activation' );
397
+ $exporter = TablePress::load_class( 'TablePress_Export', 'class-export.php', 'classes' );
398
+ $data['zip_support_available'] = $exporter->zip_support_available;
399
+ break;
400
+ case 'options':
401
+ // Maybe try saving "Custom CSS" to a file:
402
+ // (called here, as the credentials form posts to this handler again, due to how request_filesystem_credentials() works)
403
+ if ( isset( $_GET['item'] ) && 'save_custom_css' === $_GET['item'] ) {
404
+ TablePress::check_nonce( 'options', $_GET['item'] ); // Nonce check here, as we don't have an explicit handler, and even viewing the screen needs to be checked.
405
+ $action = 'options_custom_css'; // to load a different view
406
+ // Try saving "Custom CSS" to a file, otherwise this gets the HTML for the credentials form.
407
+ $tablepress_css = TablePress::load_class( 'TablePress_CSS', 'class-css.php', 'classes' );
408
+ $result = $tablepress_css->save_custom_css_to_file_plugin_options( TablePress::$model_options->get( 'custom_css' ), TablePress::$model_options->get( 'custom_css_minified' ) );
409
+ if ( is_string( $result ) ) {
410
+ $data['credentials_form'] = $result; // This will only be called if the save function doesn't do a redirect.
411
+ } elseif ( true === $result ) {
412
+ /*
413
+ * At this point, saving was successful, so enable usage of CSS in files again,
414
+ * and also increase the "Custom CSS" version number (for cache busting).
415
+ */
416
+ TablePress::$model_options->update( array(
417
+ 'use_custom_css_file' => true,
418
+ 'custom_css_version' => TablePress::$model_options->get( 'custom_css_version' ) + 1,
419
+ ) );
420
+ TablePress::redirect( array( 'action' => 'options', 'message' => 'success_save' ) );
421
+ } else { // leaves only $result = false
422
+ TablePress::redirect( array( 'action' => 'options', 'message' => 'success_save_error_custom_css' ) );
423
+ }
424
+ break;
425
+ }
426
+ $data['frontend_options']['use_custom_css'] = TablePress::$model_options->get( 'use_custom_css' );
427
+ $data['frontend_options']['custom_css'] = TablePress::$model_options->get( 'custom_css' );
428
+ $data['user_options']['parent_page'] = $this->parent_page;
429
+ $data['user_options']['plugin_language'] = TablePress::$model_options->get( 'plugin_language' );
430
+ $data['user_options']['plugin_languages'] = $this->get_plugin_languages();
431
+ break;
432
+ case 'edit':
433
+ if ( ! empty( $_GET['table_id'] ) ) {
434
+ // Load table, with table data, options, and visibility settings.
435
+ $data['table'] = TablePress::$model_table->load( $_GET['table_id'], true, true );
436
+ if ( is_wp_error( $data['table'] ) ) {
437
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'error_load_table' ) );
438
+ }
439
+ if ( ! current_user_can( 'tablepress_edit_table', $_GET['table_id'] ) ) {
440
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
441
+ }
442
+ } else {
443
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'error_no_table' ) );
444
+ }
445
+ break;
446
+ case 'export':
447
+ // Load all table IDs without priming the post meta cache, as table options/visibility are not needed.
448
+ $data['table_ids'] = TablePress::$model_table->load_all( false );
449
+ $data['tables_count'] = TablePress::$model_table->count_tables();
450
+ if ( ! empty( $_GET['table_id'] ) ) {
451
+ $data['export_ids'] = explode( ',', $_GET['table_id'] );
452
+ } else {
453
+ // Just show empty export form.
454
+ $data['export_ids'] = array();
455
+ }
456
+ $exporter = TablePress::load_class( 'TablePress_Export', 'class-export.php', 'classes' );
457
+ $data['zip_support_available'] = $exporter->zip_support_available;
458
+ $data['export_formats'] = $exporter->export_formats;
459
+ $data['csv_delimiters'] = $exporter->csv_delimiters;
460
+ $data['export_format'] = ( ! empty( $_GET['export_format'] ) ) ? $_GET['export_format'] : false;
461
+ $data['csv_delimiter'] = ( ! empty( $_GET['csv_delimiter'] ) ) ? $_GET['csv_delimiter'] : _x( ',', 'Default CSV delimiter in the translated language (";", ",", or "tab")', 'tablepress' );
462
+ break;
463
+ case 'import':
464
+ // Load all table IDs without priming the post meta cache, as table options/visibility are not needed.
465
+ $data['table_ids'] = TablePress::$model_table->load_all( false );
466
+ $data['tables_count'] = TablePress::$model_table->count_tables();
467
+ $importer = TablePress::load_class( 'TablePress_Import', 'class-import.php', 'classes' );
468
+ $data['zip_support_available'] = $importer->zip_support_available;
469
+ $data['html_import_support_available'] = $importer->html_import_support_available;
470
+ $data['import_formats'] = $importer->import_formats;
471
+ $data['import_format'] = ( ! empty( $_GET['import_format'] ) ) ? $_GET['import_format'] : false;
472
+ $data['import_type'] = ( ! empty( $_GET['import_type'] ) ) ? $_GET['import_type'] : 'add';
473
+ $data['import_existing_table'] = ( ! empty( $_GET['import_existing_table'] ) ) ? $_GET['import_existing_table'] : false;
474
+ $data['import_source'] = ( ! empty( $_GET['import_source'] ) ) ? $_GET['import_source'] : 'file-upload';
475
+ $data['import_url'] = ( ! empty( $_GET['import_url'] ) ) ? wp_unslash( $_GET['import_url'] ) : 'http://';
476
+ $data['import_server'] = ( ! empty( $_GET['import_server'] ) ) ? wp_unslash( $_GET['import_server'] ) : ABSPATH;
477
+ $data['import_form_field'] = ( ! empty( $_GET['import_form_field'] ) ) ? wp_unslash( $_GET['import_form_field'] ) : '';
478
+ $data['wp_table_reloaded_installed'] = ( false !== get_option( 'wp_table_reloaded_options', false ) && false !== get_option( 'wp_table_reloaded_tables', false ) );
479
+ $data['import_wp_table_reloaded_source'] = ( ! empty( $_GET['import_wp_table_reloaded_source'] ) ) ? $_GET['import_wp_table_reloaded_source'] : ( $data['wp_table_reloaded_installed'] ? 'db' : 'dump-file' );
480
+ break;
481
+ }
482
+
483
+ /**
484
+ * Filter the data that is passed to the current TablePress View.
485
+ *
486
+ * @since 1.0.0
487
+ *
488
+ * @param array $data Data for the view.
489
+ * @param string $action The current action for the view.
490
+ */
491
+ $data = apply_filters( 'tablepress_view_data', $data, $action );
492
+
493
+ // Prepare and initialize the view.
494
+ $this->view = TablePress::load_view( $action, $data );
495
+ }
496
+
497
+ /**
498
+ * Render the view that has been initialized in load_admin_page() (called by WordPress when the actual page content is needed).
499
+ *
500
+ * @since 1.0.0
501
+ */
502
+ public function show_admin_page() {
503
+ $this->view->render();
504
+ }
505
+
506
+ /**
507
+ * Initialize i18n support, load plugin's textdomain, to retrieve correct translations.
508
+ *
509
+ * @since 1.0.0
510
+ */
511
+ protected function init_i18n_support() {
512
+ if ( $this->i18n_support_loaded ) {
513
+ return;
514
+ }
515
+ // Allow changing the plugin language.
516
+ add_filter( 'plugin_locale', array( $this, 'change_plugin_locale' ), 10, 2 );
517
+ $language_directory = dirname( TABLEPRESS_BASENAME ) . '/i18n';
518
+ load_plugin_textdomain( 'tablepress', false, $language_directory );
519
+ remove_filter( 'plugin_locale', array( $this, 'change_plugin_locale' ), 10, 2 );
520
+ $this->i18n_support_loaded = true;
521
+ }
522
+
523
+ /**
524
+ * Get a list of available plugin languages and information on the translator.
525
+ *
526
+ * @since 1.0.0
527
+ *
528
+ * @return array List of languages.
529
+ */
530
+ protected function get_plugin_languages() {
531
+ $languages = array(
532
+ 'cs_CZ' => array(
533
+ 'name' => __( 'Czech', 'tablepress' ),
534
+ 'translator_name' => 'Jiří Janda',
535
+ 'translator_url' => 'http://gadjukin.net/',
536
+ ),
537
+ 'de_DE' => array(
538
+ 'name' => __( 'German', 'tablepress' ),
539
+ 'translator_name' => 'Tobias Bäthge',
540
+ 'translator_url' => 'https://tobias.baethge.com/',
541
+ ),
542
+ 'en_US' => array(
543
+ 'name' => __( 'English', 'tablepress' ),
544
+ 'translator_name' => 'Tobias Bäthge',
545
+ 'translator_url' => 'https://tobias.baethge.com/',
546
+ ),
547
+ 'es_ES' => array(
548
+ 'name' => __( 'Spanish', 'tablepress' ),
549
+ 'translator_name' => 'Darío Hereñú',
550
+ 'translator_url' => '',
551
+ ),
552
+ 'fi' => array(
553
+ 'name' => __( 'Finnish', 'tablepress' ),
554
+ 'translator_name' => 'Joel Kosola',
555
+ 'translator_url' => '',
556
+ ),
557
+ 'fr_FR' => array(
558
+ 'name' => __( 'French', 'tablepress' ),
559
+ 'translator_name' => 'Loïc Herry',
560
+ 'translator_url' => 'http://www.lherry.fr/',
561
+ ),
562
+ 'he_IL' => array(
563
+ 'name' => __( 'Hebrew', 'tablepress' ),
564
+ 'translator_name' => 'Mulli Bahr',
565
+ 'translator_url' => 'http://www.site2goal.co.il/',
566
+ ),
567
+ 'it_IT' => array(
568
+ 'name' => __( 'Italian', 'tablepress' ),
569
+ 'translator_name' => 'Stefano Cotterli',
570
+ 'translator_url' => 'http://faina09.it/',
571
+ ),
572
+ 'is_IS' => array(
573
+ 'name' => __( 'Icelandic', 'tablepress' ),
574
+ 'translator_name' => 'Davíð Sævarsson',
575
+ 'translator_url' => '',
576
+ ),
577
+ 'ja' => array(
578
+ 'name' => __( 'Japanese', 'tablepress' ),
579
+ 'translator_name' => 'Naoko Azuma',
580
+ 'translator_url' => 'http://www.goju-on.com/profile_en/',
581
+ ),
582
+ 'ko_KR' => array(
583
+ 'name' => __( 'Korean', 'tablepress' ),
584
+ 'translator_name' => 'Josh Kim',
585
+ 'translator_url' => '',
586
+ ),
587
+ 'lv' => array(
588
+ 'name' => __( 'Latvian', 'tablepress' ),
589
+ 'translator_name' => 'Johannes Rau',
590
+ 'translator_url' => 'http://www.yamago.de/',
591
+ ),
592
+ 'nl_NL' => array(
593
+ 'name' => __( 'Dutch', 'tablepress' ),
594
+ 'translator_name' => 'Erik Vorstenbosch',
595
+ 'translator_url' => '',
596
+ ),
597
+ 'pl_PL' => array(
598
+ 'name' => __( 'Polish', 'tablepress' ),
599
+ 'translator_name' => 'Kuba Mikita',
600
+ 'translator_url' => 'http://www.wpart.pl/',
601
+ ),
602
+ 'pt_BR' => array(
603
+ 'name' => __( 'Brazilian Portuguese', 'tablepress' ),
604
+ 'translator_name' => 'Renato Rodrigues',
605
+ 'translator_url' => 'http://www.rlsrodrigues.com.br/',
606
+ ),
607
+ 'ru_RU' => array(
608
+ 'name' => __( 'Russian', 'tablepress' ),
609
+ 'translator_name' => 'Tomasina, Сергей Лапин',
610
+ 'translator_url' => '',
611
+ ),
612
+ 'sk_SK' => array(
613
+ 'name' => __( 'Slovak', 'tablepress' ),
614
+ 'translator_name' => 'sle',
615
+ 'translator_url' => 'http://fooddrink.sk/',
616
+ ),
617
+ 'sr_RS' => array(
618
+ 'name' => __( 'Serbian', 'tablepress' ),
619
+ 'translator_name' => 'Borisa Djuraskovic',
620
+ 'translator_url' => 'http://www.webhostinghub.com/',
621
+ ),
622
+ 'tr_TR' => array(
623
+ 'name' => __( 'Turkish', 'tablepress' ),
624
+ 'translator_name' => 'Hakan Er',
625
+ 'translator_url' => 'http://hakanertr.wordpress.com/',
626
+ ),
627
+ 'uk' => array(
628
+ 'name' => __( 'Ukrainian', 'tablepress' ),
629
+ 'translator_name' => 'Ostap Kutsyy',
630
+ 'translator_url' => '',
631
+ ),
632
+ 'zh_CN' => array(
633
+ 'name' => __( 'Chinese (Simplified)', 'tablepress' ),
634
+ 'translator_name' => 'Haoxian Zeng',
635
+ 'translator_url' => 'http://cnzhx.net/',
636
+ ),
637
+ 'zh_TW' => array(
638
+ 'name' => __( 'Chinese (Taiwan)', 'tablepress' ),
639
+ 'translator_name' => 'Lu Yu Xin',
640
+ 'translator_url' => 'http://www.hdlulu.com/',
641
+ ),
642
+ );
643
+ // Sort the language names after they have been translated.
644
+ uasort( $languages, array( $this, '_get_plugin_languages_sort_cb' ) );
645
+ return $languages;
646
+ }
647
+
648
+ /**
649
+ * Callback for sorting the language array in @see get_plugin_languages().
650
+ *
651
+ * @since 1.0.0
652
+ *
653
+ * @see get_plugin_languages()
654
+ *
655
+ * @param array $a First language to sort.
656
+ * @param array $b Second language to sort.
657
+ * @return int -1, 0, 1, depending on sort.
658
+ */
659
+ protected function _get_plugin_languages_sort_cb( array $a, array $b ) {
660
+ return strnatcasecmp( $a['name'], $b['name'] );
661
+ }
662
+
663
+ /**
664
+ * Decide whether a donate message shall be shown on the "All Tables" screen, depending on passed days since installation and whether it was shown before.
665
+ *
666
+ * @since 1.0.0
667
+ *
668
+ * @return bool Whether the donate message shall be shown on the "All Tables" screen.
669
+ */
670
+ protected function maybe_show_donation_message() {
671
+ // Only show the message to plugin admins.
672
+ if ( ! current_user_can( 'tablepress_edit_options' ) ) {
673
+ return false;
674
+ }
675
+
676
+ if ( ! TablePress::$model_options->get( 'message_donation_nag' ) ) {
677
+ return false;
678
+ }
679
+
680
+ // Determine, how long has the plugin been installed.
681
+ $seconds_installed = time() - TablePress::$model_options->get( 'first_activation' );
682
+ return ( $seconds_installed > 30 * DAY_IN_SECONDS );
683
+ }
684
+
685
+ /**
686
+ * Init list of actions that have a view with their titles/names/caps.
687
+ *
688
+ * @since 1.0.0
689
+ */
690
+ protected function init_view_actions() {
691
+ $this->view_actions = array(
692
+ 'list' => array(
693
+ 'show_entry' => true,
694
+ 'page_title' => __( 'All Tables', 'tablepress' ),
695
+ 'admin_menu_title' => __( 'All Tables', 'tablepress' ),
696
+ 'nav_tab_title' => __( 'All Tables', 'tablepress' ),
697
+ 'required_cap' => 'tablepress_list_tables',
698
+ ),
699
+ 'add' => array(
700
+ 'show_entry' => true,
701
+ 'page_title' => __( 'Add New Table', 'tablepress' ),
702
+ 'admin_menu_title' => __( 'Add New Table', 'tablepress' ),
703
+ 'nav_tab_title' => __( 'Add New', 'tablepress' ),
704
+ 'required_cap' => 'tablepress_add_tables',
705
+ ),
706
+ 'edit' => array(
707
+ 'show_entry' => false,
708
+ 'page_title' => __( 'Edit Table', 'tablepress' ),
709
+ 'admin_menu_title' => '',
710
+ 'nav_tab_title' => '',
711
+ 'required_cap' => 'tablepress_edit_tables',
712
+ ),
713
+ 'import' => array(
714
+ 'show_entry' => true,
715
+ 'page_title' => __( 'Import a Table', 'tablepress' ),
716
+ 'admin_menu_title' => __( 'Import a Table', 'tablepress' ),
717
+ 'nav_tab_title' => _x( 'Import', 'navigation bar', 'tablepress' ),
718
+ 'required_cap' => 'tablepress_import_tables',
719
+ ),
720
+ 'export' => array(
721
+ 'show_entry' => true,
722
+ 'page_title' => __( 'Export a Table', 'tablepress' ),
723
+ 'admin_menu_title' => __( 'Export a Table', 'tablepress' ),
724
+ 'nav_tab_title' => _x( 'Export', 'navigation bar', 'tablepress' ),
725
+ 'required_cap' => 'tablepress_export_tables',
726
+ ),
727
+ 'options' => array(
728
+ 'show_entry' => true,
729
+ 'page_title' => __( 'Plugin Options', 'tablepress' ),
730
+ 'admin_menu_title' => __( 'Plugin Options', 'tablepress' ),
731
+ 'nav_tab_title' => __( 'Plugin Options', 'tablepress' ),
732
+ 'required_cap' => 'tablepress_access_options_screen',
733
+ ),
734
+ 'about' => array(
735
+ 'show_entry' => true,
736
+ 'page_title' => __( 'About', 'tablepress' ),
737
+ 'admin_menu_title' => __( 'About TablePress', 'tablepress' ),
738
+ 'nav_tab_title' => __( 'About', 'tablepress' ),
739
+ 'required_cap' => 'tablepress_access_about_screen',
740
+ ),
741
+ );
742
+
743
+ /**
744
+ * Filter the available TablePres Views/Actions and their parameters.
745
+ *
746
+ * @since 1.0.0
747
+ *
748
+ * @param array $view_actions The available Views/Actions and their parameters.
749
+ */
750
+ $this->view_actions = apply_filters( 'tablepress_admin_view_actions', $this->view_actions );
751
+ }
752
+
753
+ /**
754
+ * Change the WordPress locale to the desired plugin locale, applied as a filter in get_locale(), while loading the plugin textdomain.
755
+ *
756
+ * @since 1.0.0
757
+ *
758
+ * @param string $locale Current WordPress locale.
759
+ * @param string $textdomain Text domain of the currently filtered plugin.
760
+ * @return string TablePress locale.
761
+ */
762
+ public function change_plugin_locale( $locale, $textdomain ) {
763
+ if ( 'tablepress' !== $textdomain ) {
764
+ return $locale;
765
+ }
766
+ $new_locale = TablePress::$model_options->get( 'plugin_language' );
767
+ $locale = ( ! empty( $new_locale ) && 'auto' !== $new_locale ) ? $new_locale : $locale;
768
+ return $locale;
769
+ }
770
+
771
+ /*
772
+ * HTTP POST actions.
773
+ */
774
+
775
+ /**
776
+ * Handle Bulk Actions (Copy, Export, Delete) on "All Tables" list screen.
777
+ *
778
+ * @since 1.0.0
779
+ */
780
+ public function handle_post_action_list() {
781
+ TablePress::check_nonce( 'list' );
782
+
783
+ if ( isset( $_POST['bulk-action-top'] ) && '-1' !== $_POST['bulk-action-top'] ) {
784
+ $bulk_action = $_POST['bulk-action-top'];
785
+ } elseif ( isset( $_POST['bulk-action-bottom'] ) && '-1' !== $_POST['bulk-action-bottom'] ) {
786
+ $bulk_action = $_POST['bulk-action-bottom'];
787
+ } else {
788
+ $bulk_action = false;
789
+ }
790
+
791
+ if ( ! in_array( $bulk_action, array( 'copy', 'export', 'delete' ), true ) ) {
792
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'error_bulk_action_invalid' ) );
793
+ }
794
+
795
+ if ( empty( $_POST['table'] ) || ! is_array( $_POST['table'] ) ) {
796
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'error_no_selection' ) );
797
+ } else {
798
+ $tables = wp_unslash( $_POST['table'] );
799
+ }
800
+
801
+ $no_success = array(); // to store table IDs that failed
802
+
803
+ switch ( $bulk_action ) {
804
+ case 'copy':
805
+ $this->init_i18n_support(); // for the translation of "Copy of"
806
+ foreach ( $tables as $table_id ) {
807
+ if ( current_user_can( 'tablepress_copy_table', $table_id ) ) {
808
+ $copy_table_id = TablePress::$model_table->copy( $table_id );
809
+ if ( is_wp_error( $copy_table_id ) ) {
810
+ $no_success[] = $table_id;
811
+ }
812
+ } else {
813
+ $no_success[] = $table_id;
814
+ }
815
+ }
816
+ break;
817
+ case 'export':
818
+ /*
819
+ * Cap check is done on redirect target page.
820
+ * To export, redirect to "Export" screen, with selected table IDs.
821
+ */
822
+ $table_ids = implode( ',', $tables );
823
+ TablePress::redirect( array( 'action' => 'export', 'table_id' => $table_ids ) );
824
+ break;
825
+ case 'delete':
826
+ foreach ( $tables as $table_id ) {
827
+ if ( current_user_can( 'tablepress_delete_table', $table_id ) ) {
828
+ $deleted = TablePress::$model_table->delete( $table_id );
829
+ if ( is_wp_error( $deleted ) ) {
830
+ $no_success[] = $table_id;
831
+ }
832
+ } else {
833
+ $no_success[] = $table_id;
834
+ }
835
+ }
836
+ break;
837
+ }
838
+
839
+ if ( 0 !== count( $no_success ) ) { // @TODO: maybe pass this information to the view?
840
+ $message = "error_{$bulk_action}_not_all_tables";
841
+ } else {
842
+ $plural = ( count( $tables ) > 1 ) ? '_plural' : '';
843
+ $message = "success_{$bulk_action}{$plural}";
844
+ }
845
+
846
+ /*
847
+ * Slightly more complex redirect method, to account for sort, search, and pagination in the WP_List_Table on the List View,
848
+ * but only if this action succeeds, to have everything fresh in the event of an error.
849
+ */
850
+ $sendback = wp_get_referer();
851
+ if ( ! $sendback ) {
852
+ $sendback = TablePress::url( array( 'action' => 'list', 'message' => $message ) );
853
+ } else {
854
+ $sendback = remove_query_arg( array( 'action', 'message', 'table_id' ), $sendback );
855
+ $sendback = add_query_arg( array( 'action' => 'list', 'message' => $message ), $sendback );
856
+ }
857
+ wp_redirect( $sendback );
858
+ exit;
859
+ }
860
+
861
+ /**
862
+ * Save a table after the "Edit" screen was submitted.
863
+ *
864
+ * @since 1.0.0
865
+ */
866
+ public function handle_post_action_edit() {
867
+ if ( empty( $_POST['table'] ) || empty( $_POST['table']['id'] ) ) {
868
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'error_save' ) );
869
+ } else {
870
+ $edit_table = wp_unslash( $_POST['table'] );
871
+ }
872
+
873
+ TablePress::check_nonce( 'edit', $edit_table['id'], 'nonce-edit-table' );
874
+
875
+ if ( ! current_user_can( 'tablepress_edit_table', $edit_table['id'] ) ) {
876
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
877
+ }
878
+
879
+ // Options array must exist, so that checkboxes can be evaluated.
880
+ if ( empty( $edit_table['options'] ) ) {
881
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $edit_table['id'], 'message' => 'error_save' ) );
882
+ }
883
+
884
+ // Evaluate options that have a checkbox (only necessary in Admin Controller, where they might not be set (if unchecked)).
885
+ $checkbox_options = array(
886
+ // Table Options.
887
+ 'table_head', 'table_foot', 'alternating_row_colors', 'row_hover', 'print_name', 'print_description',
888
+ // DataTables JS Features.
889
+ 'use_datatables', 'datatables_sort', 'datatables_filter', 'datatables_paginate', 'datatables_lengthchange', 'datatables_info', 'datatables_scrollx',
890
+ );
891
+ foreach ( $checkbox_options as $option ) {
892
+ $edit_table['options'][ $option ] = ( isset( $edit_table['options'][ $option ] ) && 'true' === $edit_table['options'][ $option ] );
893
+ }
894
+
895
+ // Load table, without table data, but with options and visibility settings.
896
+ $existing_table = TablePress::$model_table->load( $edit_table['id'], false, true );
897
+ if ( is_wp_error( $existing_table ) ) { // @TODO: Maybe somehow load a new table here? (TablePress::$model_table->get_table_template())?
898
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $edit_table['id'], 'message' => 'error_save' ) );
899
+ }
900
+
901
+ // Check consistency of new table, and then merge with existing table.
902
+ $table = TablePress::$model_table->prepare_table( $existing_table, $edit_table );
903
+ if ( is_wp_error( $table ) ) {
904
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $edit_table['id'], 'message' => 'error_save' ) );
905
+ }
906
+
907
+ // DataTables Custom Commands can only be edit by trusted users.
908
+ if ( ! current_user_can( 'unfiltered_html' ) ) {
909
+ $table['options']['datatables_custom_commands'] = $existing_table['options']['datatables_custom_commands'];
910
+ }
911
+
912
+ // Save updated table.
913
+ $saved = TablePress::$model_table->save( $table );
914
+ if ( is_wp_error( $saved ) ) {
915
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $table['id'], 'message' => 'error_save' ) );
916
+ }
917
+
918
+ // Check if ID change is desired.
919
+ if ( $table['id'] === $table['new_id'] ) { // if not, we are done
920
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $table['id'], 'message' => 'success_save' ) );
921
+ }
922
+
923
+ // Change table ID.
924
+ if ( current_user_can( 'tablepress_edit_table_id', $table['id'] ) ) {
925
+ $id_changed = TablePress::$model_table->change_table_id( $table['id'], $table['new_id'] );
926
+ if ( ! is_wp_error( $id_changed ) ) {
927
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $table['new_id'], 'message' => 'success_save_success_id_change' ) );
928
+ } else {
929
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $table['id'], 'message' => 'success_save_error_id_change' ) );
930
+ }
931
+ } else {
932
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $table['id'], 'message' => 'success_save_error_id_change' ) );
933
+ }
934
+ }
935
+
936
+ /**
937
+ * Add a table, according to the parameters on the "Add new Table" screen.
938
+ *
939
+ * @since 1.0.0
940
+ */
941
+ public function handle_post_action_add() {
942
+ TablePress::check_nonce( 'add' );
943
+
944
+ if ( ! current_user_can( 'tablepress_add_tables' ) ) {
945
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
946
+ }
947
+
948
+ if ( empty( $_POST['table'] ) || ! is_array( $_POST['table'] ) ) {
949
+ TablePress::redirect( array( 'action' => 'add', 'message' => 'error_add' ) );
950
+ } else {
951
+ $add_table = wp_unslash( $_POST['table'] );
952
+ }
953
+
954
+ // Perform sanity checks of posted data.
955
+ $name = ( isset( $add_table['name'] ) ) ? $add_table['name'] : '';
956
+ $description = ( isset( $add_table['description'] ) ) ? $add_table['description'] : '';
957
+ if ( ! isset( $add_table['rows'] ) || ! isset( $add_table['columns'] ) ) {
958
+ TablePress::redirect( array( 'action' => 'add', 'message' => 'error_add' ) );
959
+ }
960
+
961
+ $num_rows = absint( $add_table['rows'] );
962
+ $num_columns = absint( $add_table['columns'] );
963
+ if ( 0 === $num_rows || 0 === $num_columns ) {
964
+ TablePress::redirect( array( 'action' => 'add', 'message' => 'error_add' ) );
965
+ }
966
+
967
+ // Create a new table array with information from the posted data.
968
+ $new_table = array(
969
+ 'name' => $name,
970
+ 'description' => $description,
971
+ 'data' => array_fill( 0, $num_rows, array_fill( 0, $num_columns, '' ) ),
972
+ 'visibility' => array(
973
+ 'rows' => array_fill( 0, $num_rows, 1 ),
974
+ 'columns' => array_fill( 0, $num_columns, 1 ),
975
+ ),
976
+ );
977
+ // Merge this data into an empty table template.
978
+ $table = TablePress::$model_table->prepare_table( TablePress::$model_table->get_table_template(), $new_table, false );
979
+ if ( is_wp_error( $table ) ) {
980
+ TablePress::redirect( array( 'action' => 'add', 'message' => 'error_add' ) );
981
+ }
982
+
983
+ // Add the new table (and get its first ID).
984
+ $table_id = TablePress::$model_table->add( $table );
985
+ if ( is_wp_error( $table_id ) ) {
986
+ TablePress::redirect( array( 'action' => 'add', 'message' => 'error_add' ) );
987
+ }
988
+
989
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $table_id, 'message' => 'success_add' ) );
990
+ }
991
+
992
+ /**
993
+ * Save changed "Plugin Options".
994
+ *
995
+ * @since 1.0.0
996
+ */
997
+ public function handle_post_action_options() {
998
+ TablePress::check_nonce( 'options' );
999
+
1000
+ if ( ! current_user_can( 'tablepress_access_options_screen' ) ) {
1001
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1002
+ }
1003
+
1004
+ if ( empty( $_POST['options'] ) || ! is_array( $_POST['options'] ) ) {
1005
+ TablePress::redirect( array( 'action' => 'options', 'message' => 'error_save' ) );
1006
+ } else {
1007
+ $posted_options = wp_unslash( $_POST['options'] );
1008
+ }
1009
+
1010
+ // Valid new options that will be merged into existing ones.
1011
+ $new_options = array();
1012
+
1013
+ // Check each posted option value, and (maybe) add it to the new options.
1014
+ if ( ! empty( $posted_options['admin_menu_parent_page'] ) && '-' !== $posted_options['admin_menu_parent_page'] ) {
1015
+ $new_options['admin_menu_parent_page'] = $posted_options['admin_menu_parent_page'];
1016
+ // Re-init parent information, as TablePress::redirect() URL might be wrong otherwise.
1017
+ /** This filter is documented in classes/class-controller.php */
1018
+ $this->parent_page = apply_filters( 'tablepress_admin_menu_parent_page', $posted_options['admin_menu_parent_page'] );
1019
+ $this->is_top_level_page = in_array( $this->parent_page, array( 'top', 'middle', 'bottom' ), true );
1020
+ }
1021
+ if ( ! empty( $posted_options['plugin_language'] ) && '-' !== $posted_options['plugin_language'] ) {
1022
+ // Only allow "auto" language and all values that have a translation.
1023
+ if ( 'auto' === $posted_options['plugin_language'] || array_key_exists( $posted_options['plugin_language'], $this->get_plugin_languages() ) ) {
1024
+ $new_options['plugin_language'] = $posted_options['plugin_language'];
1025
+ }
1026
+ }
1027
+
1028
+ // Custom CSS can only be saved if the user is allowed to do so.
1029
+ $update_custom_css_files = false;
1030
+ if ( current_user_can( 'tablepress_edit_options' ) ) {
1031
+ // Checkbox
1032
+ $new_options['use_custom_css'] = ( isset( $posted_options['use_custom_css'] ) && 'true' === $posted_options['use_custom_css'] );
1033
+
1034
+ if ( isset( $posted_options['custom_css'] ) ) {
1035
+ $new_options['custom_css'] = $posted_options['custom_css'];
1036
+
1037
+ $tablepress_css = TablePress::load_class( 'TablePress_CSS', 'class-css.php', 'classes' );
1038
+ // Sanitize and tidy up Custom CSS.
1039
+ $new_options['custom_css'] = $tablepress_css->sanitize_css( $new_options['custom_css'] );
1040
+ // Minify Custom CSS
1041
+ $new_options['custom_css_minified'] = $tablepress_css->minify_css( $new_options['custom_css'] );
1042
+
1043
+ // Maybe update CSS files as well.
1044
+ $custom_css_file_contents = $tablepress_css->load_custom_css_from_file( 'normal' );
1045
+ if ( false === $custom_css_file_contents ) {
1046
+ $custom_css_file_contents = '';
1047
+ }
1048
+ // Don't write to file if it already has the desired content.
1049
+ if ( $new_options['custom_css'] !== $custom_css_file_contents ) {
1050
+ $update_custom_css_files = true;
1051
+ // Set to false again. As it was set here, it will be set true again, if file saving succeeds.
1052
+ $new_options['use_custom_css_file'] = false;
1053
+ }
1054
+ }
1055
+ }
1056
+
1057
+ // Save gathered new options (will be merged into existing ones), and flush caches of caching plugins, to make sure that the new Custom CSS is used.
1058
+ if ( ! empty( $new_options ) ) {
1059
+ TablePress::$model_options->update( $new_options );
1060
+ TablePress::$model_table->_flush_caching_plugins_caches();
1061
+ }
1062
+
1063
+ if ( $update_custom_css_files ) { // Capability check is performed above.
1064
+ TablePress::redirect( array( 'action' => 'options', 'item' => 'save_custom_css' ), true );
1065
+ }
1066
+
1067
+ TablePress::redirect( array( 'action' => 'options', 'message' => 'success_save' ) );
1068
+ }
1069
+
1070
+ /**
1071
+ * Export selected tables.
1072
+ *
1073
+ * @since 1.0.0
1074
+ */
1075
+ public function handle_post_action_export() {
1076
+ TablePress::check_nonce( 'export' );
1077
+
1078
+ if ( ! current_user_can( 'tablepress_export_tables' ) ) {
1079
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1080
+ }
1081
+
1082
+ if ( empty( $_POST['export'] ) || ! is_array( $_POST['export'] ) ) {
1083
+ TablePress::redirect( array( 'action' => 'export', 'message' => 'error_export' ) );
1084
+ } else {
1085
+ $export = wp_unslash( $_POST['export'] );
1086
+ }
1087
+
1088
+ $exporter = TablePress::load_class( 'TablePress_Export', 'class-export.php', 'classes' );
1089
+
1090
+ if ( empty( $export['tables'] ) ) {
1091
+ TablePress::redirect( array( 'action' => 'export', 'message' => 'error_export' ) );
1092
+ }
1093
+ if ( empty( $export['format'] ) || ! isset( $exporter->export_formats[ $export['format'] ] ) ) {
1094
+ TablePress::redirect( array( 'action' => 'export', 'message' => 'error_export' ) );
1095
+ }
1096
+ if ( empty( $export['csv_delimiter'] ) ) {
1097
+ // Set a value, so that the variable exists.
1098
+ $export['csv_delimiter'] = '';
1099
+ }
1100
+ if ( 'csv' === $export['format'] && ! isset( $exporter->csv_delimiters[ $export['csv_delimiter'] ] ) ) {
1101
+ TablePress::redirect( array( 'action' => 'export', 'message' => 'error_export' ) );
1102
+ }
1103
+
1104
+ // Use list of tables from concatenated field if available (as that's hopefully not truncated by Suhosin, which is possible for $export['tables']).
1105
+ $tables = ( ! empty( $export['tables_list'] ) ) ? explode( ',', $export['tables_list'] ) : $export['tables'];
1106
+
1107
+ // Determine if ZIP file support is available.
1108
+ if ( $exporter->zip_support_available
1109
+ && ( ( isset( $export['zip_file'] ) && 'true' === $export['zip_file'] ) || count( $tables ) > 1 ) ) {
1110
+ // Export to ZIP only if ZIP is desired or if more than one table were selected (mandatory then).
1111
+ $export_to_zip = true;
1112
+ } else {
1113
+ $export_to_zip = false;
1114
+ }
1115
+
1116
+ if ( ! $export_to_zip ) {
1117
+ // This is only possible for one table, so take the first one.
1118
+ if ( ! current_user_can( 'tablepress_export_table', $tables[0] ) ) {
1119
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1120
+ }
1121
+ // Load table, with table data, options, and visibility settings.
1122
+ $table = TablePress::$model_table->load( $tables[0], true, true );
1123
+ if ( is_wp_error( $table ) ) {
1124
+ TablePress::redirect( array( 'action' => 'export', 'message' => 'error_load_table', 'export_format' => $export['format'], 'csv_delimiter' => $export['csv_delimiter'] ) );
1125
+ }
1126
+ if ( isset( $table['is_corrupted'] ) && $table['is_corrupted'] ) {
1127
+ TablePress::redirect( array( 'action' => 'export', 'message' => 'error_table_corrupted', 'export_format' => $export['format'], 'csv_delimiter' => $export['csv_delimiter'] ) );
1128
+ }
1129
+ $download_filename = sprintf( '%1$s-%2$s-%3$s.%4$s', $table['id'], $table['name'], date( 'Y-m-d' ), $export['format'] );
1130
+ $download_filename = sanitize_file_name( $download_filename );
1131
+ // Export the table.
1132
+ $export_data = $exporter->export_table( $table, $export['format'], $export['csv_delimiter'] );
1133
+ /**
1134
+ * Filter the exported table data.
1135
+ *
1136
+ * @since 1.6.0
1137
+ *
1138
+ * @param string $export_data The exported table data.
1139
+ * @param array $table Table to be exported.
1140
+ * @param string $export_format Format for the export ('csv', 'html', 'json').
1141
+ * @param string $csv_delimiter Delimiter for CSV export.
1142
+ */
1143
+ $export_data = apply_filters( 'tablepress_export_data', $export_data, $table, $export['format'], $export['csv_delimiter'] );
1144
+ $download_data = $export_data;
1145
+ } else {
1146
+ // Zipping can use a lot of memory and execution time, but not this much hopefully.
1147
+ /** This filter is documented in the WordPress file wp-admin/admin.php */
1148
+ @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );
1149
+ @set_time_limit( 300 );
1150
+
1151
+ $zip_file = new ZipArchive();
1152
+ $download_filename = sprintf( 'tablepress-export-%1$s-%2$s.zip', date_i18n( 'Y-m-d-H-i-s' ), $export['format'] );
1153
+ $download_filename = sanitize_file_name( $download_filename );
1154
+ $full_filename = wp_tempnam( $download_filename );
1155
+ if ( true !== $zip_file->open( $full_filename, ZIPARCHIVE::OVERWRITE ) ) {
1156
+ @unlink( $full_filename );
1157
+ TablePress::redirect( array( 'action' => 'export', 'message' => 'error_create_zip_file', 'export_format' => $export['format'], 'csv_delimiter' => $export['csv_delimiter'] ) );
1158
+ }
1159
+
1160
+ foreach ( $tables as $table_id ) {
1161
+ // Don't export tables for which the user doesn't have the necessary export rights.
1162
+ if ( ! current_user_can( 'tablepress_export_table', $table_id ) ) {
1163
+ continue;
1164
+ }
1165
+ // Load table, with table data, options, and visibility settings.
1166
+ $table = TablePress::$model_table->load( $table_id, true, true );
1167
+ // Don't export if the table could not be loaded.
1168
+ if ( is_wp_error( $table ) ) {
1169
+ continue;
1170
+ }
1171
+ // Don't export if the table is corrupted.
1172
+ if ( isset( $table['is_corrupted'] ) && $table['is_corrupted'] ) {
1173
+ continue;
1174
+ }
1175
+ $export_data = $exporter->export_table( $table, $export['format'], $export['csv_delimiter'] );
1176
+ /** This filter is documented in controllers/controller-admin.php */
1177
+ $export_data = apply_filters( 'tablepress_export_data', $export_data, $table, $export['format'], $export['csv_delimiter'] );
1178
+ $export_filename = sprintf( '%1$s-%2$s-%3$s.%4$s', $table['id'], $table['name'], date( 'Y-m-d' ), $export['format'] );
1179
+ $export_filename = sanitize_file_name( $export_filename );
1180
+ $zip_file->addFromString( $export_filename, $export_data );
1181
+ }
1182
+
1183
+ // If something went wrong, or no files were added to the ZIP file, bail out.
1184
+ if ( ! ZIPARCHIVE::ER_OK === $zip_file->status || 0 === $zip_file->numFiles ) {
1185
+ $zip_file->close();
1186
+ @unlink( $full_filename );
1187
+ TablePress::redirect( array( 'action' => 'export', 'message' => 'error_create_zip_file', 'export_format' => $export['format'], 'csv_delimiter' => $export['csv_delimiter'] ) );
1188
+ }
1189
+ $zip_file->close();
1190
+
1191
+ // Load contents of the ZIP file, to send it as a download.
1192
+ $download_data = file_get_contents( $full_filename );
1193
+ @unlink( $full_filename );
1194
+ }
1195
+
1196
+ // Send download headers for export file.
1197
+ header( 'Content-Description: File Transfer' );
1198
+ header( 'Content-Type: application/octet-stream' );
1199
+ header( "Content-Disposition: attachment; filename=\"{$download_filename}\"" );
1200
+ header( 'Content-Transfer-Encoding: binary' );
1201
+ header( 'Expires: 0' );
1202
+ header( 'Cache-Control: must-revalidate' );
1203
+ header( 'Pragma: public' );
1204
+ header( 'Content-Length: ' . strlen( $download_data ) );
1205
+ // $filetype = text/csv, text/html, application/json
1206
+ // header( 'Content-Type: ' . $filetype. '; charset=' . get_option( 'blog_charset' ) );
1207
+ @ob_end_clean();
1208
+ flush();
1209
+ echo $download_data;
1210
+ exit;
1211
+ }
1212
+
1213
+ /**
1214
+ * Import data from either an existing source or WP-Table Reloaded.
1215
+ *
1216
+ * @since 1.0.0
1217
+ */
1218
+ public function handle_post_action_import() {
1219
+ TablePress::check_nonce( 'import' );
1220
+
1221
+ if ( ! current_user_can( 'tablepress_import_tables' ) ) {
1222
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1223
+ }
1224
+
1225
+ if ( empty( $_POST['import'] ) || ! is_array( $_POST['import'] ) ) {
1226
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import' ) );
1227
+ } else {
1228
+ $import = wp_unslash( $_POST['import'] );
1229
+ }
1230
+
1231
+ // Determine if this is a regular import or an import from WP-Table Reloaded.
1232
+ if ( isset( $_POST['submit_wp_table_reloaded_import'] ) && isset( $import['wp_table_reloaded'] ) && isset( $import['wp_table_reloaded']['source'] ) ) {
1233
+ if ( ! current_user_can( 'tablepress_import_tables_wptr' ) ) {
1234
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1235
+ }
1236
+
1237
+ // Handle checkbox selections.
1238
+ $import_tables = ( isset( $import['wp_table_reloaded']['tables'] ) && 'true' === $import['wp_table_reloaded']['tables'] );
1239
+ $import_css = ( isset( $import['wp_table_reloaded']['css'] ) && 'true' === $import['wp_table_reloaded']['css'] );
1240
+ if ( ! $import_tables && ! $import_css ) {
1241
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_wp_table_reloaded_nothing_selected' ) );
1242
+ }
1243
+
1244
+ if ( 'db' === $import['wp_table_reloaded']['source'] ) {
1245
+ $this->_import_from_wp_table_reloaded_db( $import_tables, $import_css );
1246
+ } else {
1247
+ $this->_import_from_wp_table_reloaded_dump_file( $import_tables, $import_css );
1248
+ }
1249
+ } else {
1250
+ $this->_import_tablepress_regular( $import );
1251
+ }
1252
+ }
1253
+
1254
+ /**
1255
+ * Import data from existing source (Upload, URL, Server, Direct input).
1256
+ *
1257
+ * @since 1.0.0
1258
+ *
1259
+ * @param array $import Submitted form data.
1260
+ */
1261
+ protected function _import_tablepress_regular( array $import ) {
1262
+ if ( ! isset( $import['type'] ) ) {
1263
+ $import['type'] = 'add';
1264
+ }
1265
+ if ( ! isset( $import['existing_table'] ) ) {
1266
+ $import['existing_table'] = '';
1267
+ }
1268
+ if ( ! isset( $import['source'] ) ) {
1269
+ $import['source'] = '';
1270
+ }
1271
+
1272
+ // Check if a table to replace or append to was selected.
1273
+ if ( in_array( $import['type'], array( 'replace', 'append' ), true ) && empty( $import['existing_table'] ) ) {
1274
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import_no_existing_id', 'import_format' => $import['format'], 'import_type' => $import['type'], 'import_source' => $import['source'] ) );
1275
+ }
1276
+
1277
+ $import_error = true;
1278
+ $unlink_file = false;
1279
+ $import_data = array();
1280
+ switch ( $import['source'] ) {
1281
+ case 'file-upload':
1282
+ if ( ! empty( $_FILES['import_file_upload'] ) && UPLOAD_ERR_OK === $_FILES['import_file_upload']['error'] ) {
1283
+ $import_data['file_location'] = $_FILES['import_file_upload']['tmp_name'];
1284
+ $import_data['file_name'] = $_FILES['import_file_upload']['name'];
1285
+ // $_FILES['import_file_upload']['type'];
1286
+ // $_FILES['import_file_upload']['size']
1287
+ $import_error = false;
1288
+ $unlink_file = true;
1289
+ }
1290
+ break;
1291
+ case 'url':
1292
+ if ( ! empty( $import['url'] ) && 'http://' !== $import['url'] ) {
1293
+ // download URL to local file.
1294
+ $import_data['file_location'] = download_url( $import['url'] );
1295
+ $import_data['file_name'] = $import['url'];
1296
+ if ( ! is_wp_error( $import_data['file_location'] ) ) {
1297
+ $import_error = false;
1298
+ }
1299
+ $unlink_file = true;
1300
+ }
1301
+ break;
1302
+ case 'server':
1303
+ if ( ! empty( $import['server'] ) && ABSPATH !== $import['server'] ) {
1304
+ $import_data['file_location'] = $import['server'];
1305
+ $import_data['file_name'] = pathinfo( $import['server'], PATHINFO_BASENAME );
1306
+ if ( is_readable( $import['server'] ) ) {
1307
+ $import_error = false;
1308
+ }
1309
+ }
1310
+ break;
1311
+ case 'form-field':
1312
+ if ( ! empty( $import['form_field'] ) ) {
1313
+ $import_data['file_location'] = '';
1314
+ $import_data['file_name'] = __( 'Imported from Manual Input', 'tablepress' ); // Description of the table.
1315
+ $import_data['data'] = $import['form_field'];
1316
+ $import_error = false;
1317
+ }
1318
+ break;
1319
+ }
1320
+
1321
+ if ( $import_error ) {
1322
+ if ( $unlink_file ) {
1323
+ @unlink( $import_data['file_location'] );
1324
+ }
1325
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import_source_invalid', 'import_format' => $import['format'], 'import_type' => $import['type'], 'import_existing_table' => $import['existing_table'], 'import_source' => $import['source'] ) );
1326
+ }
1327
+
1328
+ $this->importer = TablePress::load_class( 'TablePress_Import', 'class-import.php', 'classes' );
1329
+
1330
+ if ( 'zip' === pathinfo( $import_data['file_name'], PATHINFO_EXTENSION ) ) {
1331
+ // Determine if ZIP file support is available.
1332
+ if ( ! $this->importer->zip_support_available ) {
1333
+ if ( $unlink_file ) {
1334
+ @unlink( $import_data['file_location'] );
1335
+ }
1336
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_no_zip_import', 'import_format' => $import['format'], 'import_type' => $import['type'], 'import_existing_table' => $import['existing_table'], 'import_source' => $import['source'] ) );
1337
+ }
1338
+ $import_zip = true;
1339
+ } else {
1340
+ $import_zip = false;
1341
+ }
1342
+
1343
+ if ( ! $import_zip ) {
1344
+ if ( ! isset( $import_data['data'] ) ) {
1345
+ $import_data['data'] = file_get_contents( $import_data['file_location'] );
1346
+ }
1347
+ if ( false === $import_data['data'] ) {
1348
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import' ) );
1349
+ }
1350
+
1351
+ $name = $import_data['file_name'];
1352
+ $description = $import_data['file_name'];
1353
+ $existing_table_id = ( in_array( $import['type'], array( 'replace', 'append' ), true ) && ! empty( $import['existing_table'] ) ) ? $import['existing_table'] : false;
1354
+ $table_id = $this->_import_tablepress_table( $import['format'], $import_data['data'], $name, $description, $existing_table_id, $import['type'] );
1355
+
1356
+ if ( $unlink_file ) {
1357
+ @unlink( $import_data['file_location'] );
1358
+ }
1359
+
1360
+ if ( is_wp_error( $table_id ) ) {
1361
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import_data' ) );
1362
+ } else {
1363
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $table_id, 'message' => 'success_import' ) );
1364
+ }
1365
+ } else {
1366
+ // Zipping can use a lot of memory and execution time, but not this much hopefully.
1367
+ /** This filter is documented in the WordPress file wp-admin/admin.php */
1368
+ @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );
1369
+ @set_time_limit( 300 );
1370
+
1371
+ $zip = new ZipArchive();
1372
+ if ( true !== $zip->open( $import_data['file_location'], ZIPARCHIVE::CHECKCONS ) ) {
1373
+ if ( $unlink_file ) {
1374
+ @unlink( $import_data['file_location'] );
1375
+ }
1376
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import_zip_open' ) );
1377
+ }
1378
+
1379
+ $imported_files = array();
1380
+ for ( $file_idx = 0; $file_idx < $zip->numFiles; $file_idx++ ) {
1381
+ $file_name = $zip->getNameIndex( $file_idx );
1382
+ // Skip directories.
1383
+ if ( '/' === substr( $file_name, -1 ) ) {
1384
+ continue;
1385
+ }
1386
+ // Skip the __MACOSX directory that Mac OSX adds to archives.
1387
+ if ( '__MACOSX/' === substr( $file_name, 0, 9 ) ) {
1388
+ continue;
1389
+ }
1390
+ $data = $zip->getFromIndex( $file_idx );
1391
+ if ( false === $data ) {
1392
+ continue;
1393
+ }
1394
+
1395
+ $name = $file_name;
1396
+ $description = $file_name;
1397
+ $existing_table_id = ( in_array( $import['type'], array( 'replace', 'append' ), true ) ) ? false : false; // @TODO: Find a way to extract the replace/append ID from the filename, maybe?
1398
+ $table_id = $this->_import_tablepress_table( $import['format'], $data, $name, $description, $existing_table_id, 'add' );
1399
+ if ( is_wp_error( $table_id ) ) {
1400
+ continue;
1401
+ } else {
1402
+ $imported_files[] = $table_id;
1403
+ }
1404
+ };
1405
+ $zip->close();
1406
+
1407
+ if ( $unlink_file ) {
1408
+ @unlink( $import_data['file_location'] );
1409
+ }
1410
+
1411
+ if ( count( $imported_files ) > 1 ) {
1412
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'success_import' ) );
1413
+ } elseif ( 1 === count( $imported_files ) ) {
1414
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $imported_files[0], 'message' => 'success_import' ) );
1415
+ } else {
1416
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import_zip_content' ) );
1417
+ }
1418
+ }
1419
+
1420
+ }
1421
+
1422
+ /**
1423
+ * Import a table by either replacing an existing table or adding it as a new table.
1424
+ *
1425
+ * @since 1.0.0
1426
+ *
1427
+ * @param string $format Import format.
1428
+ * @param string $data Data to import.
1429
+ * @param string $name Name of the table.
1430
+ * @param string $description Description of the table.
1431
+ * @param bool|string $existing_table_id False if table shall be added new, ID of the table to be replaced or appended to otherwise.
1432
+ * @param string $import_type What to do with the imported data: "add", "replace", "append".
1433
+ * @return string|WP_Error WP_Error on error, table ID on success.
1434
+ */
1435
+ protected function _import_tablepress_table( $format, $data, $name, $description, $existing_table_id, $import_type ) {
1436
+ $imported_table = $this->importer->import_table( $format, $data );
1437
+ if ( false === $imported_table ) {
1438
+ return new WP_Error( 'table_import_import_failed' );
1439
+ }
1440
+
1441
+ if ( false === $existing_table_id ) {
1442
+ $import_type = 'add';
1443
+ }
1444
+
1445
+ // To be able to replace or append to a table, editing that table must be allowed.
1446
+ if ( in_array( $import_type, array( 'replace', 'append' ), true ) && ! current_user_can( 'tablepress_edit_table', $existing_table_id ) ) {
1447
+ return new WP_Error( 'table_import_replace_append_capability_check_failed' );
1448
+ }
1449
+
1450
+ // Full JSON format table can contain a table ID, try to keep that.
1451
+ $table_id_in_import = false;
1452
+
1453
+ switch ( $import_type ) {
1454
+ case 'add':
1455
+ $existing_table = TablePress::$model_table->get_table_template();
1456
+ // If name and description are imported from a new table, use those.
1457
+ if ( isset( $imported_table['id'] ) ) {
1458
+ $table_id_in_import = $imported_table['id'];
1459
+ }
1460
+ if ( ! isset( $imported_table['name'] ) ) {
1461
+ $imported_table['name'] = $name;
1462
+ }
1463
+ if ( ! isset( $imported_table['description'] ) ) {
1464
+ $imported_table['description'] = $description;
1465
+ }
1466
+ if ( isset( $imported_table['visibility'] ) && isset( $imported_table['visibility']['rows'] ) && isset( $imported_table['visibility']['columns'] ) ) {
1467
+ $existing_table['visibility']['rows'] = $imported_table['visibility']['rows'];
1468
+ $existing_table['visibility']['columns'] = $imported_table['visibility']['columns'];
1469
+ }
1470
+ break;
1471
+ case 'replace':
1472
+ // Load table, without table data, but with options and visibility settings.
1473
+ $existing_table = TablePress::$model_table->load( $existing_table_id, false, true );
1474
+ if ( is_wp_error( $existing_table ) ) {
1475
+ // Add an error code to the existing WP_Error.
1476
+ $existing_table->add( 'table_import_replace_table_load', '', $existing_table_id );
1477
+ return $existing_table;
1478
+ }
1479
+ // Don't change name and description when a table is replaced.
1480
+ $imported_table['name'] = $existing_table['name'];
1481
+ $imported_table['description'] = $existing_table['description'];
1482
+ if ( isset( $imported_table['visibility'] ) && isset( $imported_table['visibility']['rows'] ) && isset( $imported_table['visibility']['columns'] ) ) {
1483
+ $existing_table['visibility']['rows'] = $imported_table['visibility']['rows'];
1484
+ $existing_table['visibility']['columns'] = $imported_table['visibility']['columns'];
1485
+ }
1486
+ break;
1487
+ case 'append':
1488
+ // Load table, with table data, options, and visibility settings.
1489
+ $existing_table = TablePress::$model_table->load( $existing_table_id, true, true );
1490
+ if ( is_wp_error( $existing_table ) ) {
1491
+ // Add an error code to the existing WP_Error.
1492
+ $existing_table->add( 'table_import_append_table_load', '', $existing_table_id );
1493
+ return $existing_table;
1494
+ }
1495
+ if ( isset( $existing_table['is_corrupted'] ) && $existing_table['is_corrupted'] ) {
1496
+ return new WP_Error( 'table_import_append_table_load_corrupted', '', $existing_table_id );
1497
+ }
1498
+ // Don't change name and description when a table is appended to.
1499
+ $imported_table['name'] = $existing_table['name'];
1500
+ $imported_table['description'] = $existing_table['description'];
1501
+ // Actual appending:
1502
+ $imported_table['data'] = array_merge( $existing_table['data'], $imported_table['data'] );
1503
+ $imported_table['data'] = $this->importer->pad_array_to_max_cols( $imported_table['data'] );
1504
+ // Append visibility information for rows.
1505
+ if ( isset( $imported_table['visibility'] ) && isset( $imported_table['visibility']['rows'] ) ) {
1506
+ $existing_table['visibility']['rows'] = array_merge( $existing_table['visibility']['rows'], $imported_table['visibility']['rows'] );
1507
+ }
1508
+ // When appending, do not overwrite options.
1509
+ if ( isset( $imported_table['options'] ) ) {
1510
+ unset( $imported_table['options'] );
1511
+ }
1512
+ break;
1513
+ default:
1514
+ return new WP_Error( 'table_import_import_type_invalid', '', $import_type );
1515
+ }
1516
+
1517
+ // Merge new or existing table with information from the imported table.
1518
+ $imported_table['id'] = $existing_table['id']; // will be false for new table or the existing table ID
1519
+ // Cut visibility array (if the imported table is smaller), and pad correctly if imported table is bigger than existing table (or new template).
1520
+ $num_rows = count( $imported_table['data'] );
1521
+ $num_columns = count( $imported_table['data'][0] );
1522
+ $imported_table['visibility'] = array(
1523
+ 'rows' => array_pad( array_slice( $existing_table['visibility']['rows'], 0, $num_rows ), $num_rows, 1 ),
1524
+ 'columns' => array_pad( array_slice( $existing_table['visibility']['columns'], 0, $num_columns ), $num_columns, 1 ),
1525
+ );
1526
+
1527
+ // Check if new data is ok.
1528
+ $table = TablePress::$model_table->prepare_table( $existing_table, $imported_table, false );
1529
+ if ( is_wp_error( $table ) ) {
1530
+ // Add an error code to the existing WP_Error.
1531
+ $table->add( 'table_import_table_prepare', '' );
1532
+ return $table;
1533
+ }
1534
+
1535
+ // DataTables Custom Commands can only be edit by trusted users.
1536
+ if ( ! current_user_can( 'unfiltered_html' ) ) {
1537
+ $table['options']['datatables_custom_commands'] = $existing_table['options']['datatables_custom_commands'];
1538
+ }
1539
+
1540
+ // Replace existing table or add new table.
1541
+ if ( in_array( $import_type, array( 'replace', 'append' ), true ) ) {
1542
+ // Replace existing table with imported/appended table.
1543
+ $table_id = TablePress::$model_table->save( $table );
1544
+ } else {
1545
+ // Add the imported table (and get its first ID).
1546
+ $table_id = TablePress::$model_table->add( $table );
1547
+ }
1548
+
1549
+ if ( is_wp_error( $table_id ) ) {
1550
+ // Add an error code to the existing WP_Error.
1551
+ $table_id->add( 'table_import_table_save_or_add', '' );
1552
+ return $table_id;
1553
+ }
1554
+
1555
+ // Try to use ID from imported file (e.g. in full JSON format table).
1556
+ if ( false !== $table_id_in_import && $table_id !== $table_id_in_import && current_user_can( 'tablepress_edit_table_id', $table_id ) ) {
1557
+ $id_changed = TablePress::$model_table->change_table_id( $table_id, $table_id_in_import );
1558
+ if ( ! is_wp_error( $id_changed ) ) {
1559
+ $table_id = $table_id_in_import;
1560
+ }
1561
+ }
1562
+
1563
+ return $table_id;
1564
+ }
1565
+
1566
+ /**
1567
+ * Import data from WP-Table Reloaded from the WordPress database.
1568
+ *
1569
+ * @since 1.0.0
1570
+ *
1571
+ * @param bool $import_tables Whether tables shall be imported.
1572
+ * @param bool $import_css Whether Plugin Options (only CSS related right now) shall be imported.
1573
+ */
1574
+ protected function _import_from_wp_table_reloaded_db( $import_tables, $import_css ) {
1575
+ if ( false === get_option( 'wp_table_reloaded_options', false ) || false === get_option( 'wp_table_reloaded_tables', false ) ) {
1576
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_wp_table_reloaded_not_installed' ) );
1577
+ }
1578
+
1579
+ $wp_table_reloaded_options = get_option( 'wp_table_reloaded_options', false );
1580
+ if ( empty( $wp_table_reloaded_options ) ) {
1581
+ $wp_table_reloaded_options = array();
1582
+ }
1583
+
1584
+ // Import WP-Table Reloaded tables.
1585
+ $not_imported_tables = $imported_tables = $imported_other_id_tables = array();
1586
+ if ( $import_tables ) {
1587
+ $wp_table_reloaded_tables_list = get_option( 'wp_table_reloaded_tables', array() );
1588
+ foreach ( $wp_table_reloaded_tables_list as $wptr_table_id => $table_option_name ) {
1589
+ $wptr_table = get_option( $table_option_name, array() );
1590
+ $import_status = $this->_import_wp_table_reloaded_table( $wptr_table, $wp_table_reloaded_options );
1591
+ switch ( $import_status ) {
1592
+ case 0:
1593
+ $not_imported_tables[] = $wptr_table_id;
1594
+ break;
1595
+ case 1:
1596
+ $imported_tables[] = $wptr_table_id;
1597
+ break;
1598
+ case 2:
1599
+ $imported_other_id_tables[] = $wptr_table_id;
1600
+ break;
1601
+ }
1602
+ }
1603
+ }
1604
+
1605
+ // Import WP-Table Reloaded Plugin Options (currently only CSS related options).
1606
+ $imported_css = false;
1607
+ if ( $import_css ) {
1608
+ $imported_css = $this->_import_wp_table_reloaded_plugin_options( $wp_table_reloaded_options );
1609
+ }
1610
+
1611
+ // @TODO: Better handling of the different cases of imported/imported-without-ID-change/not-imported tables.
1612
+ if ( count( $imported_tables ) > 1 ) {
1613
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'success_import_wp_table_reloaded' ) );
1614
+ } elseif ( 1 === count( $imported_tables ) ) {
1615
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $imported_tables[0], 'message' => 'success_import_wp_table_reloaded' ) );
1616
+ }
1617
+ if ( count( $imported_other_id_tables ) > 0 ) {
1618
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'success_import_wp_table_reloaded' ) );
1619
+ } elseif ( $imported_css ) {
1620
+ TablePress::redirect( array( 'action' => 'options', 'message' => 'success_import_wp_table_reloaded' ) );
1621
+ } else {
1622
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import_wp_table_reloaded' ) );
1623
+ }
1624
+ }
1625
+
1626
+ /**
1627
+ * Import data from WP-Table Reloaded from a WP-Table Reloaded Dump File.
1628
+ *
1629
+ * @since 1.0.0
1630
+ *
1631
+ * @param bool $import_tables Whether tables shall be imported.
1632
+ * @param bool $import_css Whether Plugin Options (only CSS related right now) shall be imported.
1633
+ */
1634
+ protected function _import_from_wp_table_reloaded_dump_file( $import_tables, $import_css ) {
1635
+ if ( empty( $_FILES['import_wp_table_reloaded_file_upload'] ) || empty( $_FILES['import_wp_table_reloaded_file_upload']['tmp_name'] ) || UPLOAD_ERR_OK !== $_FILES['import_wp_table_reloaded_file_upload']['error'] ) {
1636
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_wp_table_reloaded_dump_file' ) );
1637
+ }
1638
+
1639
+ $dump_file = file_get_contents( $_FILES['import_wp_table_reloaded_file_upload']['tmp_name'] );
1640
+ $dump_file = unserialize( $dump_file );
1641
+ if ( empty( $dump_file ) ) {
1642
+ @unlink( $_FILES['import_wp_table_reloaded_file_upload']['tmp_name'] );
1643
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_wp_table_reloaded_dump_file' ) );
1644
+ }
1645
+ if ( empty( $dump_file['options'] ) || ! is_array( $dump_file['options'] ) ) {
1646
+ $dump_file['options'] = array();
1647
+ }
1648
+
1649
+ // Import WP-Table Reloaded tables.
1650
+ $not_imported_tables = $imported_tables = $imported_other_id_tables = array();
1651
+ if ( $import_tables && ! empty( $dump_file['tables'] ) ) {
1652
+ foreach ( $dump_file['tables'] as $wptr_table_id => $wptr_table ) {
1653
+ $import_status = $this->_import_wp_table_reloaded_table( $wptr_table, $dump_file['options'] );
1654
+ switch ( $import_status ) {
1655
+ case 0:
1656
+ $not_imported_tables[] = $wptr_table_id;
1657
+ break;
1658
+ case 1:
1659
+ $imported_tables[] = $wptr_table_id;
1660
+ break;
1661
+ case 2:
1662
+ $imported_other_id_tables[] = $wptr_table_id;
1663
+ break;
1664
+ }
1665
+ }
1666
+ }
1667
+
1668
+ // Import WP-Table Reloaded Plugin Options (currently only CSS related options).
1669
+ $imported_css = false;
1670
+ if ( $import_css ) {
1671
+ $imported_css = $this->_import_wp_table_reloaded_plugin_options( $dump_file['options'] );
1672
+ }
1673
+
1674
+ @unlink( $_FILES['import_wp_table_reloaded_file_upload']['tmp_name'] );
1675
+ // @TODO: Better handling of the different cases of imported/imported-without-ID-change/not-imported tables.
1676
+ if ( count( $imported_tables ) > 1 ) {
1677
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'success_import_wp_table_reloaded' ) );
1678
+ } elseif ( 1 === count( $imported_tables ) ) {
1679
+ TablePress::redirect( array( 'action' => 'edit', 'table_id' => $imported_tables[0], 'message' => 'success_import_wp_table_reloaded' ) );
1680
+ }
1681
+ if ( count( $imported_other_id_tables ) > 0 ) {
1682
+ TablePress::redirect( array( 'action' => 'list', 'message' => 'success_import_wp_table_reloaded' ) );
1683
+ } elseif ( $imported_css ) {
1684
+ TablePress::redirect( array( 'action' => 'options', 'message' => 'success_import_wp_table_reloaded' ) );
1685
+ } else {
1686
+ TablePress::redirect( array( 'action' => 'import', 'message' => 'error_import_wp_table_reloaded' ) );
1687
+ }
1688
+ }
1689
+
1690
+ /**
1691
+ * Import a WP-Table Reloaded table.
1692
+ *
1693
+ * @since 1.0.0
1694
+ *
1695
+ * @param array $wptr_table WP-Table Reloaded table.
1696
+ * @param array $wp_table_reloaded_options WP-Table Reloaded Plugin Options.
1697
+ * @return int Import status: 0=Import failed; 1=Imported with ID change; 2=Imported without ID change.
1698
+ */
1699
+ protected function _import_wp_table_reloaded_table( array $wptr_table, array $wp_table_reloaded_options ) {
1700
+ if ( empty( $wptr_table ) ) {
1701
+ return 0; // 0 means Import failed.
1702
+ }
1703
+
1704
+ // Perform sanity checks of imported table.
1705
+ if ( ! isset( $wptr_table['name'] )
1706
+ || ! isset( $wptr_table['description'] )
1707
+ || empty( $wptr_table['data'] )
1708
+ || empty( $wptr_table['options'] ) ) {
1709
+ return 0; // 0 means Import failed.
1710
+ }
1711
+
1712
+ // Data is slashed in WP-Table Reloaded.
1713
+ $wptr_table = wp_unslash( $wptr_table );
1714
+
1715
+ // Table was loaded, import the data, table options, and visibility.
1716
+ //
1717
+ // Create a new table array with information from the imported table.
1718
+ $new_table = array(
1719
+ 'name' => $wptr_table['name'],
1720
+ 'description' => $wptr_table['description'],
1721
+ 'data' => $wptr_table['data'],
1722
+ 'options' => array(),
1723
+ 'visibility' => array(
1724
+ 'rows' => array_fill( 0, count( $wptr_table['data'] ), 1 ),
1725
+ 'columns' => array_fill( 0, count( $wptr_table['data'][0] ), 1 ),
1726
+ ),
1727
+ );
1728
+ if ( isset( $wptr_table['last_modified'] ) ) {
1729
+ $new_table['last_modified'] = $wptr_table['last_modified'];
1730
+ }
1731
+ if ( isset( $wptr_table['last_editor_id'] ) ) {
1732
+ $new_table['author'] = $wptr_table['last_editor_id'];
1733
+ }
1734
+ if ( isset( $wptr_table['options']['last_editor_id'] ) ) {
1735
+ $new_table['options']['last_editor'] = $wptr_table['last_editor_id'];
1736
+ }
1737
+ if ( isset( $wptr_table['options']['first_row_th'] ) ) {
1738
+ $new_table['options']['table_head'] = $wptr_table['options']['first_row_th'];
1739
+ }
1740
+ if ( isset( $wptr_table['options']['table_footer'] ) ) {
1741
+ $new_table['options']['table_foot'] = $wptr_table['options']['table_footer'];
1742
+ }
1743
+ if ( isset( $wptr_table['options']['custom_css_class'] ) ) {
1744
+ $new_table['options']['extra_css_classes'] = $wptr_table['options']['custom_css_class'];
1745
+ }
1746
+ if ( isset( $wptr_table['options']['use_tablesorter'] ) && isset( $wp_table_reloaded_options['enable_tablesorter'] ) ) {
1747
+ if ( $wp_table_reloaded_options['enable_tablesorter'] ) {
1748
+ $new_table['options']['use_datatables'] = $wptr_table['options']['use_tablesorter'];
1749
+ } else {
1750
+ $new_table['options']['use_datatables'] = false;
1751
+ }
1752
+ }
1753
+ // Array key is the same in both plugins for the following options.
1754
+ foreach ( array( 'alternating_row_colors', 'row_hover',
1755
+ 'print_name', 'print_name_position', 'print_description', 'print_description_position',
1756
+ 'datatables_sort', 'datatables_filter', 'datatables_paginate',
1757
+ 'datatables_lengthchange', 'datatables_paginate_entries', 'datatables_info'
1758
+ ) as $_option ) {
1759
+ if ( isset( $wptr_table['options'][ $_option ] ) ) {
1760
+ $new_table['options'][ $_option ] = $wptr_table['options'][ $_option ];
1761
+ }
1762
+ }
1763
+ if ( isset( $wptr_table['options']['datatables_customcommands'] ) && current_user_can( 'unfiltered_html' ) ) {
1764
+ $new_table['options']['datatables_custom_commands'] = $wptr_table['options']['datatables_customcommands'];
1765
+ }
1766
+ // Not imported: $wptr_table['options']['cache_table_output'].
1767
+ // Not imported: $wptr_table['custom_fields'].
1768
+
1769
+ // Fix visibility: WP-Table Reloaded uses 0 and 1 the other way around.
1770
+ foreach ( array_keys( $wptr_table['visibility']['rows'], true ) as $row_idx ) {
1771
+ $new_table['visibility']['rows'][ $row_idx ] = 0;
1772
+ }
1773
+ foreach ( array_keys( $wptr_table['visibility']['columns'], true ) as $column_idx ) {
1774
+ $new_table['visibility']['columns'][ $column_idx ] = 0;
1775
+ }
1776
+
1777
+ // Merge this data into an empty table template.
1778
+ $table = TablePress::$model_table->prepare_table( TablePress::$model_table->get_table_template(), $new_table, false );
1779
+ if ( is_wp_error( $table ) ) {
1780
+ return 0; // 0 means Import failed.
1781
+ }
1782
+
1783
+ // Add the new table (and get its first ID).
1784
+ $tp_table_id = TablePress::$model_table->add( $table );
1785
+ if ( is_wp_error( $tp_table_id ) ) {
1786
+ return 0; // 0 means Import failed.
1787
+ }
1788
+
1789
+ // Change table ID to the ID the table had in WP-Table Reloaded (except if that ID is already taken).
1790
+ $id_changed = TablePress::$model_table->change_table_id( $tp_table_id, $wptr_table['id'] );
1791
+ if ( is_wp_error( $id_changed ) ) {
1792
+ return 2; // 2 means Imported without ID change.
1793
+ }
1794
+
1795
+ return 1; // 1 means Imported with ID change.
1796
+ }
1797
+
1798
+ /**
1799
+ * Import WP-Table Reloaded Plugin Options (currently just CSS related options).
1800
+ *
1801
+ * @since 1.0.0
1802
+ *
1803
+ * @param array $wp_table_reloaded_options Plugin Options of WP-Table Reloaded that shall be imported.
1804
+ * @return bool Whether the import was successful or not (on at least on option).
1805
+ */
1806
+ protected function _import_wp_table_reloaded_plugin_options( array $wp_table_reloaded_options ) {
1807
+ if ( ! current_user_can( 'tablepress_edit_options' ) ) {
1808
+ return false;
1809
+ }
1810
+
1811
+ $imported_options = array();
1812
+ $imported_options['use_custom_css'] = ( isset( $wp_table_reloaded_options['use_custom_css'] ) ) ? (bool) $wp_table_reloaded_options['use_custom_css'] : false;
1813
+ if ( isset( $wp_table_reloaded_options['custom_css'] ) ) {
1814
+ // Automatically convert WP-Table Reloaded Custom CSS to TablePress Custom CSS by search/replacing classes and IDs.
1815
+ $imported_options['custom_css'] = wp_unslash( $wp_table_reloaded_options['custom_css'] ); // Be careful when removing this, as it might break CSS comments from old Dump Files.
1816
+ $imported_options['custom_css'] = str_replace( '#wp-table-reloaded-id-', '#tablepress-', $imported_options['custom_css'] );
1817
+ $imported_options['custom_css'] = str_replace( '-no-1', '', $imported_options['custom_css'] );
1818
+ $imported_options['custom_css'] = str_replace( '.wp-table-reloaded-id-', '.tablepress-id-', $imported_options['custom_css'] );
1819
+ $imported_options['custom_css'] = str_replace( '.wp-table-reloaded', '.tablepress', $imported_options['custom_css'] );
1820
+
1821
+ $tablepress_css = TablePress::load_class( 'TablePress_CSS', 'class-css.php', 'classes' );
1822
+ // Sanitize and tidy up Custom CSS.
1823
+ $imported_options['custom_css'] = $tablepress_css->sanitize_css( $imported_options['custom_css'] );
1824
+ // Minify Custom CSS.
1825
+ $imported_options['custom_css_minified'] = $tablepress_css->minify_css( $imported_options['custom_css'] );
1826
+
1827
+ // Maybe update CSS files as well.
1828
+ //
1829
+ // Only write files, if "Custom CSS" is to be used, and if there is "Custom CSS"
1830
+ if ( $imported_options['use_custom_css'] && '' !== $imported_options['custom_css'] ) {
1831
+ $result = $tablepress_css->save_custom_css_to_file( $imported_options['custom_css'], $imported_options['custom_css_minified'] );
1832
+ // If saving was successful, use "Custom CSS" file.
1833
+ $imported_options['use_custom_css_file'] = $result;
1834
+ // If saving was successful, increase the "Custom CSS" version number for cache busting.
1835
+ if ( $result ) {
1836
+ $imported_options['custom_css_version'] = TablePress::$model_options->get( 'custom_css_version' ) + 1;
1837
+ }
1838
+ }
1839
+ }
1840
+
1841
+ // Save gathered imported options.
1842
+ if ( empty( $imported_options ) ) {
1843
+ return false;
1844
+ }
1845
+
1846
+ TablePress::$model_options->update( $imported_options );
1847
+
1848
+ return true;
1849
+ }
1850
+
1851
+ /*
1852
+ * Save GET actions.
1853
+ */
1854
+
1855
+ /**
1856
+ * Hide a header message on an admin screen.
1857
+ *
1858
+ * @since 1.0.0
1859
+ */
1860
+ public function handle_get_action_hide_message() {
1861
+ $message_item = ! empty( $_GET['item'] ) ? $_GET['item'] : '';
1862
+ TablePress::check_nonce( 'hide_message', $message_item );
1863
+
1864
+ if ( ! current_user_can( 'tablepress_list_tables' ) ) {
1865
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1866
+ }
1867
+
1868
+ TablePress::$model_options->update( "message_{$message_item}", false );
1869
+
1870
+ $return = ! empty( $_GET['return'] ) ? $_GET['return'] : 'list';
1871
+ TablePress::redirect( array( 'action' => $return ) );
1872
+ }
1873
+
1874
+ /**
1875
+ * Delete a table.
1876
+ *
1877
+ * @since 1.0.0
1878
+ */
1879
+ public function handle_get_action_delete_table() {
1880
+ $table_id = ( ! empty( $_GET['item'] ) ) ? $_GET['item'] : false;
1881
+ TablePress::check_nonce( 'delete_table', $table_id );
1882
+
1883
+ $return = ! empty( $_GET['return'] ) ? $_GET['return'] : 'list';
1884
+ $return_item = ! empty( $_GET['return_item'] ) ? $_GET['return_item'] : false;
1885
+
1886
+ // Nonce check should actually catch this already.
1887
+ if ( false === $table_id ) {
1888
+ TablePress::redirect( array( 'action' => $return, 'message' => 'error_delete', 'table_id' => $return_item ) );
1889
+ }
1890
+
1891
+ if ( ! current_user_can( 'tablepress_delete_table', $table_id ) ) {
1892
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1893
+ }
1894
+
1895
+ $deleted = TablePress::$model_table->delete( $table_id );
1896
+ if ( is_wp_error( $deleted ) ) {
1897
+ TablePress::redirect( array( 'action' => $return, 'message' => 'error_delete', 'table_id' => $return_item ) );
1898
+ }
1899
+
1900
+ /*
1901
+ * Slightly more complex redirect method, to account for sort, search, and pagination in the WP_List_Table on the List View,
1902
+ * but only if this action succeeds, to have everything fresh in the event of an error.
1903
+ */
1904
+ $sendback = wp_get_referer();
1905
+ if ( ! $sendback ) {
1906
+ $sendback = TablePress::url( array( 'action' => 'list', 'message' => 'success_delete', 'table_id' => $return_item ) );
1907
+ } else {
1908
+ $sendback = remove_query_arg( array( 'action', 'message', 'table_id' ), $sendback );
1909
+ $sendback = add_query_arg( array( 'action' => 'list', 'message' => 'success_delete', 'table_id' => $return_item ), $sendback );
1910
+ }
1911
+ wp_redirect( $sendback );
1912
+ exit;
1913
+ }
1914
+
1915
+ /**
1916
+ * Copy a table.
1917
+ *
1918
+ * @since 1.0.0
1919
+ */
1920
+ public function handle_get_action_copy_table() {
1921
+ $table_id = ( ! empty( $_GET['item'] ) ) ? $_GET['item'] : false;
1922
+ TablePress::check_nonce( 'copy_table', $table_id );
1923
+
1924
+ $return = ! empty( $_GET['return'] ) ? $_GET['return'] : 'list';
1925
+ $return_item = ! empty( $_GET['return_item'] ) ? $_GET['return_item'] : false;
1926
+
1927
+ // Nonce check should actually catch this already.
1928
+ if ( false === $table_id ) {
1929
+ TablePress::redirect( array( 'action' => $return, 'message' => 'error_copy', 'table_id' => $return_item ) );
1930
+ }
1931
+
1932
+ if ( ! current_user_can( 'tablepress_copy_table', $table_id ) ) {
1933
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1934
+ }
1935
+
1936
+ $this->init_i18n_support(); // for the translation of "Copy of".
1937
+
1938
+ $copy_table_id = TablePress::$model_table->copy( $table_id );
1939
+ if ( is_wp_error( $copy_table_id ) ) {
1940
+ TablePress::redirect( array( 'action' => $return, 'message' => 'error_copy', 'table_id' => $return_item ) );
1941
+ } else {
1942
+ $return_item = $copy_table_id;
1943
+ }
1944
+
1945
+ /*
1946
+ * Slightly more complex redirect method, to account for sort, search, and pagination in the WP_List_Table on the List View,
1947
+ * but only if this action succeeds, to have everything fresh in the event of an error.
1948
+ */
1949
+ $sendback = wp_get_referer();
1950
+ if ( ! $sendback ) {
1951
+ $sendback = TablePress::url( array( 'action' => $return, 'message' => 'success_copy', 'table_id' => $return_item ) );
1952
+ } else {
1953
+ $sendback = remove_query_arg( array( 'action', 'message', 'table_id' ), $sendback );
1954
+ $sendback = add_query_arg( array( 'action' => $return, 'message' => 'success_copy', 'table_id' => $return_item ), $sendback );
1955
+ }
1956
+ wp_redirect( $sendback );
1957
+ exit;
1958
+ }
1959
+
1960
+ /**
1961
+ * Preview a table.
1962
+ *
1963
+ * @since 1.0.0
1964
+ */
1965
+ public function handle_get_action_preview_table() {
1966
+ $table_id = ( ! empty( $_GET['item'] ) ) ? $_GET['item'] : false;
1967
+ TablePress::check_nonce( 'preview_table', $table_id );
1968
+
1969
+ $this->init_i18n_support();
1970
+
1971
+ // Nonce check should actually catch this already.
1972
+ if ( false === $table_id ) {
1973
+ wp_die( __( 'The preview could not be loaded.', 'tablepress' ), __( 'Preview', 'tablepress' ) );
1974
+ }
1975
+
1976
+ if ( ! current_user_can( 'tablepress_preview_table', $table_id ) ) {
1977
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
1978
+ }
1979
+
1980
+ // Load table, with table data, options, and visibility settings.
1981
+ $table = TablePress::$model_table->load( $table_id, true, true );
1982
+ if ( is_wp_error( $table ) ) {
1983
+ wp_die( __( 'The table could not be loaded.', 'tablepress' ), __( 'Preview', 'tablepress' ) );
1984
+ }
1985
+
1986
+ // Create a render class instance.
1987
+ $_render = TablePress::load_class( 'TablePress_Render', 'class-render.php', 'classes' );
1988
+ // Merge desired options with default render options (see TablePress_Controller_Frontend::shortcode_table()).
1989
+ $default_render_options = $_render->get_default_render_options();
1990
+ /** This filter is documented in controllers/controller-frontend.php */
1991
+ $default_render_options = apply_filters( 'tablepress_shortcode_table_default_shortcode_atts', $default_render_options );
1992
+ $render_options = shortcode_atts( $default_render_options, $table['options'] );
1993
+ /** This filter is documented in controllers/controller-frontend.php */
1994
+ $render_options = apply_filters( 'tablepress_shortcode_table_shortcode_atts', $render_options );
1995
+ $_render->set_input( $table, $render_options );
1996
+ $view_data = array(
1997
+ 'table_id' => $table_id,
1998
+ 'head_html' => $_render->get_preview_css(),
1999
+ 'body_html' => $_render->get_output(),
2000
+ );
2001
+
2002
+ $custom_css = TablePress::$model_options->get( 'custom_css' );
2003
+ if ( ! empty( $custom_css ) ) {
2004
+ $view_data['head_html'] .= "<style type=\"text/css\">\n{$custom_css}\n</style>\n";
2005
+ }
2006
+
2007
+ // Prepare, initialize, and render the view.
2008
+ $this->view = TablePress::load_view( 'preview_table', $view_data );
2009
+ $this->view->render();
2010
+ }
2011
+
2012
+ /**
2013
+ * Show a list of tables in the Editor toolbar Thickbox (opened by TinyMCE or Quicktags button).
2014
+ *
2015
+ * @since 1.0.0
2016
+ */
2017
+ public function handle_get_action_editor_button_thickbox() {
2018
+ TablePress::check_nonce( 'editor_button_thickbox' );
2019
+
2020
+ if ( ! current_user_can( 'tablepress_list_tables' ) ) {
2021
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
2022
+ }
2023
+
2024
+ $this->init_i18n_support();
2025
+
2026
+ $view_data = array(
2027
+ // Load all table IDs without priming the post meta cache, as table options/visibility are not needed.
2028
+ 'table_ids' => TablePress::$model_table->load_all( false ),
2029
+ );
2030
+
2031
+ set_current_screen( 'tablepress_editor_button_thickbox' );
2032
+
2033
+ // Prepare, initialize, and render the view.
2034
+ $this->view = TablePress::load_view( 'editor_button_thickbox', $view_data );
2035
+ $this->view->render();
2036
+ }
2037
+
2038
+ /**
2039
+ * Uninstall TablePress, and delete all tables and options.
2040
+ *
2041
+ * @since 1.0.0
2042
+ */
2043
+ public function handle_get_action_uninstall_tablepress() {
2044
+ TablePress::check_nonce( 'uninstall_tablepress' );
2045
+
2046
+ $plugin = TABLEPRESS_BASENAME;
2047
+
2048
+ if ( ! current_user_can( 'activate_plugins' ) || ! current_user_can( 'tablepress_edit_options' ) || ! current_user_can( 'tablepress_delete_tables' ) || is_plugin_active_for_network( $plugin ) ) {
2049
+ wp_die( __( 'You do not have sufficient permissions to access this page.', 'default' ), 403 );
2050
+ }
2051
+
2052
+ // Deactivate TablePress for the site (but not for the network).
2053
+ deactivate_plugins( $plugin, false, false );
2054
+ update_option( 'recently_activated', array( $plugin => time() ) + (array) get_option( 'recently_activated', array() ) );
2055
+
2056
+ // Delete all tables, "Custom CSS" files, and options.
2057
+ TablePress::$model_table->delete_all();
2058
+ $tablepress_css = TablePress::load_class( 'TablePress_CSS', 'class-css.php', 'classes' );
2059
+ $css_files_deleted = $tablepress_css->delete_custom_css_files();
2060
+ TablePress::$model_options->remove_access_capabilities();
2061
+
2062
+ TablePress::$model_table->destroy();
2063
+ TablePress::$model_options->destroy();
2064
+
2065
+ $this->init_i18n_support();
2066
+
2067
+ $output = '<strong>' . __( 'TablePress was uninstalled successfully.', 'tablepress' ) . '</strong><br /><br />';
2068
+ $output .= __( 'All tables, data, and options were deleted.', 'tablepress' );
2069
+ if ( is_multisite() ) {
2070
+ $output .= ' ' . __( 'You may now ask the network admin to delete the plugin&#8217;s folder <code>tablepress</code> from the server, if no other site in the network uses it.', 'tablepress' );
2071
+ } else {
2072
+ $output .= ' ' . __( 'You may now manually delete the plugin&#8217;s folder <code>tablepress</code> from the <code>plugins</code> directory on your server or use the &#8220;Delete&#8221; link for TablePress on the WordPress &#8220;Plugins&#8221; page.', 'tablepress' );
2073
+ }
2074
+ if ( $css_files_deleted ) {
2075
+ $output .= ' ' . __( 'Your TablePress &#8220;Custom CSS&#8221; files have been deleted automatically.', 'tablepress' );
2076
+ } else {
2077
+ if ( is_multisite() ) {
2078
+ $output .= ' ' . __( 'Please also ask him to delete your TablePress &#8220;Custom CSS&#8221; files from the server.', 'tablepress' );
2079
+ } else {
2080
+ $output .= ' ' . __( 'You may now also delete your TablePress &#8220;Custom CSS&#8221; files in the <code>wp-content</code> folder.', 'tablepress' );
2081
+ }
2082
+ }
2083
+ $output .= "</p>\n<p>";
2084
+ if ( ! is_multisite() || is_super_admin() ) {
2085
+ $output .= '<a class="button" href="' . esc_url( admin_url( 'plugins.php' ) ) . '">' . __( 'Go to &#8220;Plugins&#8221; page', 'tablepress' ) . '</a> ';
2086
+ }
2087
+ $output .= '<a class="button" href="' . esc_url( admin_url( 'index.php' ) ) . '">' . __( 'Go to Dashboard', 'tablepress' ) . '</a>';
2088
+
2089
+ wp_die( $output, __( 'Uninstall TablePress', 'tablepress' ), array( 'response' => 200, 'back_link' => false ) );
2090
+ }
2091
+
2092
+ } // class TablePress_Admin_Controller
controllers/controller-admin_ajax.php ADDED
@@ -0,0 +1,319 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Admin AJAX Controller for TablePress with functionality for the AJAX backend
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Controllers
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * Admin AJAX Controller class, extends Base Controller Class
16
+ * @package TablePress
17
+ * @subpackage Controllers
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ class TablePress_Admin_AJAX_Controller extends TablePress_Controller {
22
+
23
+ /**
24
+ * Initiate Admin AJAX functionality.
25
+ *
26
+ * @since 1.0.0
27
+ */
28
+ public function __construct() {
29
+ // Buffer all outputs, to prevent errors/warnings being printed that make the JSON invalid.
30
+ ob_start();
31
+
32
+ parent::__construct();
33
+
34
+ $ajax_actions = array( 'hide_message', 'save_table', 'preview_table' );
35
+ foreach ( $ajax_actions as $action ) {
36
+ add_action( "wp_ajax_tablepress_{$action}", array( $this, "ajax_action_{$action}" ) );
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Hide a header message on an admin screen.
42
+ *
43
+ * @since 1.0.0
44
+ */
45
+ public function ajax_action_hide_message() {
46
+ if ( empty( $_GET['item'] ) ) {
47
+ wp_die( '0' );
48
+ } else {
49
+ $message_item = $_GET['item'];
50
+ }
51
+
52
+ TablePress::check_nonce( 'hide_message', $message_item, '_wpnonce', true );
53
+
54
+ if ( ! current_user_can( 'tablepress_list_tables' ) ) {
55
+ wp_die( '-1' );
56
+ }
57
+
58
+ TablePress::$model_options->update( "message_{$message_item}", false );
59
+
60
+ wp_die( '1' );
61
+ }
62
+
63
+ /**
64
+ * Save the table after the "Save Changes" button on the "Edit" screen has been clicked.
65
+ *
66
+ * @since 1.0.0
67
+ */
68
+ public function ajax_action_save_table() {
69
+ if ( empty( $_POST['tablepress'] ) || empty( $_POST['tablepress']['id'] ) ) {
70
+ wp_die( '-1' );
71
+ } else {
72
+ $edit_table = wp_unslash( $_POST['tablepress'] );
73
+ }
74
+
75
+ // Check if the submitted nonce matches the generated nonce we created earlier, dies -1 on failure.
76
+ TablePress::check_nonce( 'edit', $edit_table['id'], '_ajax_nonce', true );
77
+
78
+ // Ignore the request if the current user doesn't have sufficient permissions.
79
+ if ( ! current_user_can( 'tablepress_edit_table', $edit_table['id'] ) ) {
80
+ wp_die( '-1' );
81
+ }
82
+
83
+ // Default response data.
84
+ $success = false;
85
+ $message = 'error_save';
86
+ $error_details = '';
87
+ do { // to be able to "break;" (allows for better readable code)
88
+ // Load table, without table data, but with options and visibility settings.
89
+ $existing_table = TablePress::$model_table->load( $edit_table['id'], false, true );
90
+ if ( is_wp_error( $existing_table ) ) { // maybe somehow load a new table here? (TablePress::$model_table->get_table_template())?
91
+ // Add an error code to the existing WP_Error.
92
+ $existing_table->add( 'ajax_save_table_load', '', $edit_table['id'] );
93
+ $error_details = $this->get_wp_error_string( $existing_table );
94
+ break;
95
+ }
96
+
97
+ // Check and convert data that was transmitted as JSON.
98
+ if ( empty( $edit_table['data'] )
99
+ || empty( $edit_table['options'] )
100
+ || empty( $edit_table['visibility'] ) ) {
101
+ // Create a new WP_Error.
102
+ $empty_data_error = new WP_Error( 'ajax_save_table_data_empty', '', $edit_table['id'] );
103
+ $error_details = $this->get_wp_error_string( $empty_data_error );
104
+ break;
105
+ }
106
+ $edit_table['data'] = (array) json_decode( $edit_table['data'], true );
107
+ $edit_table['options'] = (array) json_decode( $edit_table['options'], true );
108
+ $edit_table['visibility'] = (array) json_decode( $edit_table['visibility'], true );
109
+
110
+ // Check consistency of new table, and then merge with existing table.
111
+ $table = TablePress::$model_table->prepare_table( $existing_table, $edit_table, true, true );
112
+ if ( is_wp_error( $table ) ) {
113
+ // Add an error code to the existing WP_Error.
114
+ $table->add( 'ajax_save_table_prepare', '', $edit_table['id'] );
115
+ $error_details = $this->get_wp_error_string( $table );
116
+ break;
117
+ }
118
+
119
+ // DataTables Custom Commands can only be edit by trusted users.
120
+ if ( ! current_user_can( 'unfiltered_html' ) ) {
121
+ $table['options']['datatables_custom_commands'] = $existing_table['options']['datatables_custom_commands'];
122
+ }
123
+
124
+ // Save updated table.
125
+ $saved = TablePress::$model_table->save( $table );
126
+ if ( is_wp_error( $saved ) ) {
127
+ // Add an error code to the existing WP_Error.
128
+ $saved->add( 'ajax_save_table_save', '', $table['id'] );
129
+ $error_details = $this->get_wp_error_string( $saved );
130
+ break;
131
+ }
132
+
133
+ // At this point, the table was saved successfully, possible ID change remains.
134
+ $success = true;
135
+ $message = 'success_save';
136
+
137
+ // Check if ID change is desired.
138
+ if ( $table['id'] === $table['new_id'] ) {
139
+ // If not, we are done.
140
+ break;
141
+ }
142
+
143
+ // Change table ID.
144
+ if ( current_user_can( 'tablepress_edit_table_id', $table['id'] ) ) {
145
+ $id_changed = TablePress::$model_table->change_table_id( $table['id'], $table['new_id'] );
146
+ if ( ! is_wp_error( $id_changed ) ) {
147
+ $message = 'success_save_success_id_change';
148
+ $table['id'] = $table['new_id'];
149
+ } else {
150
+ $message = 'success_save_error_id_change';
151
+ // Add an error code to the existing WP_Error.
152
+ $id_changed->add( 'ajax_save_table_id_change', '', $table['new_id'] );
153
+ $error_details = $this->get_wp_error_string( $id_changed );
154
+ }
155
+ } else {
156
+ $message = 'success_save_error_id_change';
157
+ $error_details = 'table_id_could_not_be_changed: capability_check_failed';
158
+ }
159
+ } while ( false ); // Do-while-loop through this exactly once, to be able to "break;" early.
160
+
161
+ // Generate the response.
162
+
163
+ // Common data for all responses.
164
+ $response = array(
165
+ 'success' => $success,
166
+ 'message' => $message,
167
+ );
168
+ if ( $success ) {
169
+ $response['table_id'] = $table['id'];
170
+ $response['new_edit_nonce'] = wp_create_nonce( TablePress::nonce( 'edit', $table['id'] ) );
171
+ $response['new_preview_nonce'] = wp_create_nonce( TablePress::nonce( 'preview_table', $table['id'] ) );
172
+ $response['last_modified'] = TablePress::format_datetime( $table['last_modified'] );
173
+ $response['last_editor'] = TablePress::get_user_display_name( $table['options']['last_editor'] );
174
+ }
175
+ if ( ! empty( $error_details ) ) {
176
+ $response['error_details'] = esc_html( $error_details );
177
+ }
178
+ // Buffer all outputs, to prevent errors/warnings being printed that make the JSON invalid.
179
+ $output_buffer = ob_get_clean();
180
+ if ( ! empty( $output_buffer ) ) {
181
+ $response['output_buffer'] = $output_buffer;
182
+ }
183
+
184
+ // Send the response.
185
+ wp_send_json( $response );
186
+ }
187
+
188
+ /**
189
+ * Return the live preview data of table that has non-saved changes.
190
+ *
191
+ * @since 1.0.0
192
+ */
193
+ public function ajax_action_preview_table() {
194
+ if ( empty( $_POST['tablepress'] ) || empty( $_POST['tablepress']['id'] ) ) {
195
+ wp_die( '-1' );
196
+ } else {
197
+ $preview_table = wp_unslash( $_POST['tablepress'] );
198
+ }
199
+
200
+ // Check if the submitted nonce matches the generated nonce we created earlier, dies -1 on failure.
201
+ TablePress::check_nonce( 'preview_table', $preview_table['id'], '_ajax_nonce', true );
202
+
203
+ // Ignore the request if the current user doesn't have sufficient permissions.
204
+ if ( ! current_user_can( 'tablepress_preview_table', $preview_table['id'] ) ) {
205
+ wp_die( '-1' );
206
+ }
207
+
208
+ // Default response data.
209
+ $success = false;
210
+ do { // to be able to "break;" (allows for better readable code)
211
+ // Load table, without table data, but with options and visibility settings.
212
+ $existing_table = TablePress::$model_table->load( $preview_table['id'], false, true );
213
+ if ( is_wp_error( $existing_table ) ) { // maybe somehow load a new table here? (TablePress::$model_table->get_table_template())?
214
+ break;
215
+ }
216
+
217
+ // Check and convert data that was transmitted as JSON.
218
+ if ( empty( $preview_table['data'] )
219
+ || empty( $preview_table['options'] )
220
+ || empty( $preview_table['visibility'] ) ) {
221
+ break;
222
+ }
223
+ $preview_table['data'] = (array) json_decode( $preview_table['data'], true );
224
+ $preview_table['options'] = (array) json_decode( $preview_table['options'], true );
225
+ $preview_table['visibility'] = (array) json_decode( $preview_table['visibility'], true );
226
+
227
+ // Check consistency of new table, and then merge with existing table.
228
+ $table = TablePress::$model_table->prepare_table( $existing_table, $preview_table, true, true );
229
+ if ( is_wp_error( $table ) ) {
230
+ break;
231
+ }
232
+
233
+ // DataTables Custom Commands can only be edit by trusted users.
234
+ if ( ! current_user_can( 'unfiltered_html' ) ) {
235
+ $table['options']['datatables_custom_commands'] = $existing_table['options']['datatables_custom_commands'];
236
+ }
237
+
238
+ // If the ID has changed, and the new ID is valid, render with the new ID (important e.g. for CSS classes/HTML ID).
239
+ if ( $table['id'] !== $table['new_id'] && 0 === preg_match( '/[^a-zA-Z0-9_-]/', $table['new_id'] ) ) {
240
+ $table['id'] = $table['new_id'];
241
+ }
242
+
243
+ // At this point, the table data is valid and can be rendered.
244
+ $success = true;
245
+ } while ( false ); // Do-while-loop through this exactly once, to be able to "break;" early.
246
+
247
+ if ( $success ) {
248
+ // Create a render class instance.
249
+ $_render = TablePress::load_class( 'TablePress_Render', 'class-render.php', 'classes' );
250
+ // Merge desired options with default render options (see TablePress_Controller_Frontend::shortcode_table()).
251
+ $default_render_options = $_render->get_default_render_options();
252
+ /** This filter is documented in controllers/controller-frontend.php */
253
+ $default_render_options = apply_filters( 'tablepress_shortcode_table_default_shortcode_atts', $default_render_options );
254
+ $render_options = shortcode_atts( $default_render_options, $table['options'] );
255
+ /** This filter is documented in controllers/controller-frontend.php */
256
+ $render_options = apply_filters( 'tablepress_shortcode_table_shortcode_atts', $render_options );
257
+ $_render->set_input( $table, $render_options );
258
+ $head_html = $_render->get_preview_css();
259
+ $custom_css = TablePress::$model_options->get( 'custom_css' );
260
+ if ( ! empty( $custom_css ) ) {
261
+ $head_html .= "<style type=\"text/css\">\n{$custom_css}\n</style>\n";
262
+ }
263
+
264
+ $body_html = '<div id="tablepress-page"><p>'
265
+ . __( 'This is a preview of your table.', 'tablepress' ) . ' '
266
+ . __( 'Because of CSS styling in your theme, the table might look different on your page!', 'tablepress' ) . ' '
267
+ . __( 'The features of the DataTables JavaScript library are also not available or visible in this preview!', 'tablepress' ) . '<br />'
268
+ . sprintf( __( 'To insert the table into a page, post, or text widget, copy the Shortcode %s and paste it into the editor.', 'tablepress' ), '<input type="text" class="table-shortcode table-shortcode-inline" value="' . esc_attr( '[' . TablePress::$shortcode . " id={$table['id']} /]" ) . '" readonly="readonly" />' )
269
+ . '</p>' . $_render->get_output() . '</div>';
270
+ } else {
271
+ $head_html = '';
272
+ $body_html = __( 'The preview could not be loaded.', 'tablepress' );
273
+ }
274
+
275
+ // Generate the response.
276
+ $response = array(
277
+ 'success' => $success,
278
+ 'head_html' => $head_html,
279
+ 'body_html' => $body_html,
280
+ );
281
+ // Buffer all outputs, to prevent errors/warnings being printed that make the JSON invalid.
282
+ $output_buffer = ob_get_clean();
283
+ if ( ! empty( $output_buffer ) ) {
284
+ $response['output_buffer'] = $output_buffer;
285
+ }
286
+
287
+ // Send the response.
288
+ wp_send_json( $response );
289
+ }
290
+
291
+ /**
292
+ * Retrieve all information of a WP_Error object as a string.
293
+ *
294
+ * @since 1.4.0
295
+ *
296
+ * @param WP_Error $wp_error A WP_Error object.
297
+ * @return string All error codes, messages, and data of the WP_Error.
298
+ */
299
+ protected function get_wp_error_string( $wp_error ) {
300
+ $error_strings = array();
301
+ $error_codes = $wp_error->get_error_codes();
302
+ // Reverse order to get latest errors first.
303
+ $error_codes = array_reverse( $error_codes );
304
+ foreach ( $error_codes as $error_code ) {
305
+ $error_strings[ $error_code ] = $error_code;
306
+ $error_messages = $wp_error->get_error_messages( $error_code );
307
+ $error_messages = implode( ', ', $error_messages );
308
+ if ( ! empty( $error_messages ) ) {
309
+ $error_strings[ $error_code ] .= " ({$error_messages})";
310
+ }
311
+ $error_data = $wp_error->get_error_data( $error_code );
312
+ if ( ! is_null( $error_data ) ) {
313
+ $error_strings[ $error_code ] .= " [{$error_data}]";
314
+ }
315
+ }
316
+ return implode( ";\n", $error_strings );
317
+ }
318
+
319
+ } // class TablePress_Admin_AJAX_Controller
controllers/controller-frontend.php ADDED
@@ -0,0 +1,913 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Frontend Controller for TablePress with functionality for the frontend
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Controllers
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ // Prohibit direct script loading.
12
+ defined( 'ABSPATH' ) || die( 'No direct script access allowed!' );
13
+
14
+ /**
15
+ * Frontend Controller class, extends Base Controller Class
16
+ * @package TablePress
17
+ * @subpackage Controllers
18
+ * @author Tobias Bäthge
19
+ * @since 1.0.0
20
+ */
21
+ class TablePress_Frontend_Controller extends TablePress_Controller {
22
+
23
+ /**
24
+ * List of tables that are shown for the current request.
25
+ *
26
+ * @since 1.0.0
27
+ * @var array
28
+ */
29
+ protected $shown_tables = array();
30
+
31
+ /**
32
+ * Initiate Frontend functionality.
33
+ *
34
+ * @since 1.0.0
35
+ */
36
+ public function __construct() {
37
+ parent::__construct();
38
+
39
+ /**
40
+ * Filter whether the TablePress Default CSS code shall be loaded.
41
+ *
42
+ * @since 1.0.0
43
+ *
44
+ * @param bool $use Whether the Default CSS shall be loaded. Default true.
45
+ */
46
+ if ( apply_filters( 'tablepress_use_default_css', true ) || TablePress::$model_options->get( 'use_custom_css' ) ) {
47
+ add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_css' ) );
48
+ }
49
+
50
+ // Add DataTables invocation calls.
51
+ add_action( 'wp_print_footer_scripts', array( $this, 'add_datatables_calls' ), 11 ); // after inclusion of files
52
+
53
+ // Remove WP-Table Reloaded Shortcodes and CSS, and add TablePress Shortcodes.
54
+ add_action( 'init', array( $this, 'init_shortcodes' ), 20 ); // run on priority 20 as WP-Table Reloaded Shortcodes are registered at priority 10
55
+
56
+ // Make TablePress Shortcodes work in text widgets.
57
+ add_filter( 'widget_text', array( $this, 'widget_text_filter' ) );
58
+
59
+ /**
60
+ * Filter whether the WordPress search shall also search TablePress tables.
61
+ *
62
+ * @since 1.0.0
63
+ *
64
+ * @param bool $search Whether the TablePress tables shall be searched. Default true.
65
+ */
66
+ if ( apply_filters( 'tablepress_wp_search_integration', true ) ) {
67
+ // Extend WordPress Search to also find posts/pages that have a table with the one of the search terms in title (if shown), description (if shown), or content.
68
+ add_filter( 'posts_search', array( $this, 'posts_search_filter' ) );
69
+ }
70
+
71
+ /**
72
+ * Load TablePress Template Tag functions.
73
+ */
74
+ require_once TABLEPRESS_ABSPATH . 'controllers/template-tag-functions.php';
75
+ }
76
+
77
+ /**
78
+ * Register TablePress Shortcodes, after removing WP-Table Reloaded Shortcodes.
79
+ *
80
+ * @since 1.0.0
81
+ */
82
+ public function init_shortcodes() {
83
+ // Remove previously registered [table /] Shortcodes (e.g. from WP-Table Reloaded), as these would otherwise be used instead of TablePress's Shortcodes.
84
+ remove_shortcode( TablePress::$shortcode );
85
+ remove_shortcode( TablePress::$shortcode_info );
86
+ // Dequeue WP-Table Relaoded Default CSS, as it can influence TablePress table styling.
87
+ if ( isset( $GLOBALS['WP_Table_Reloaded_Frontend'] ) ) {
88
+ remove_action( 'wp_head', array( $GLOBALS['WP_Table_Reloaded_Frontend'], 'add_frontend_css' ) );
89
+ }
90
+
91
+ add_shortcode( TablePress::$shortcode, array( $this, 'shortcode_table' ) );
92
+ add_shortcode( TablePress::$shortcode_info, array( $this, 'shortcode_table_info' ) );
93
+ }
94
+
95
+ /**
96
+ * Enqueue CSS files for default CSS and "Custom CSS" (if desired).
97
+ *
98
+ * @since 1.0.0
99
+ */
100
+ public function enqueue_css() {
101
+ /** This filter is documented in controllers/controller-frontend.php */
102
+ $use_default_css = apply_filters( 'tablepress_use_default_css', true );
103
+ $custom_css = TablePress::$model_options->get( 'custom_css' );
104
+ $use_custom_css = ( TablePress::$model_options->get( 'use_custom_css' ) && '' !== $custom_css );
105
+ $use_custom_css_file = ( $use_custom_css && TablePress::$model_options->get( 'use_custom_css_file' ) );
106
+ /**
107
+ * Filter the "Custom CSS" version number that is appended to the enqueued CSS files
108
+ *
109
+ * @since 1.0.0
110
+ *
111
+ * @param int $version The "Custom CSS" version.
112
+ */
113
+ $custom_css_version = apply_filters( 'tablepress_custom_css_version', TablePress::$model_options->get( 'custom_css_version' ) );
114
+ $use_minified_css = ( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG );
115
+
116
+ $tablepress_css = TablePress::load_class( 'TablePress_CSS', 'class-css.php', 'classes' );
117
+
118
+ // Determine Default CSS URL.
119
+ $rtl = ( is_rtl() ) ? '-rtl' : '';
120
+ $suffix = ( $use_minified_css ) ? '.min' : '';
121
+ $unfiltered_default_css_url = plugins_url( "css/default{$rtl}{$suffix}.css", TABLEPRESS__FILE__ );
122
+ /**
123
+ * Filter the URL from which the TablePress Default CSS file is loaded.
124
+ *
125
+ * @since 1.0.0
126
+ *
127
+ * @param string $unfiltered_default_css_url URL of the TablePress Default CSS file.
128
+ */
129
+ $default_css_url = apply_filters( 'tablepress_default_css_url', $unfiltered_default_css_url );
130
+
131
+ $use_custom_css_combined_file = ( $use_default_css && $use_custom_css_file && $use_minified_css && ! is_rtl() && $unfiltered_default_css_url === $default_css_url && $tablepress_css->load_custom_css_from_file( 'combined' ) );
132
+
133
+ if ( $use_custom_css_combined_file ) {
134
+ $custom_css_combined_url = $tablepress_css->get_custom_css_location( 'combined', 'url' );
135
+ // Need to use 'tablepress-default' instead of 'tablepress-combined' to not break existing TablePress Extensions.
136
+ wp_enqueue_style( 'tablepress-default', $custom_css_combined_url, array(), $custom_css_version );
137
+ } else {
138
+ $custom_css_dependencies = array();
139
+ if ( $use_default_css ) {
140
+ wp_enqueue_style( 'tablepress-default', $default_css_url, array(), TablePress::version );
141
+ // Add dependency to make sure that Custom CSS is printed after Default CSS.
142
+ $custom_css_dependencies[] = 'tablepress-default';
143
+ }
144
+
145
+ $use_custom_css_minified_file = ( $use_custom_css_file && $use_minified_css && $tablepress_css->load_custom_css_from_file( 'minified' ) );
146
+ if ( $use_custom_css_minified_file ) {
147
+ $custom_css_minified_url = $tablepress_css->get_custom_css_location( 'minified', 'url' );
148
+ wp_enqueue_style( 'tablepress-custom', $custom_css_minified_url, $custom_css_dependencies, $custom_css_version );
149
+ return;
150
+ }
151
+
152
+ $use_custom_css_normal_file = ( $use_custom_css_file && $tablepress_css->load_custom_css_from_file( 'normal' ) );
153
+ if ( $use_custom_css_normal_file ) {
154
+ $custom_css_normal_url = $tablepress_css->get_custom_css_location( 'normal', 'url' );
155
+ wp_enqueue_style( 'tablepress-custom', $custom_css_normal_url, $custom_css_dependencies, $custom_css_version );
156
+ return;
157
+ }
158
+
159
+ if ( $use_custom_css ) {
160
+ // Get "Custom CSS" from options, try minified Custom CSS first,
161
+ $custom_css_minified = TablePress::$model_options->get( 'custom_css_minified' );
162
+ if ( ! empty( $custom_css_minified ) ) {
163
+ $custom_css = $custom_css_minified;
164
+ }
165
+ /**
166
+ * Filter the "Custom CSS" code that is to be loaded as inline CSS.
167
+ *
168
+ * @since 1.0.0
169
+ *
170
+ * @param string $custom_css The "Custom CSS" code.
171
+ */
172
+ $custom_css = apply_filters( 'tablepress_custom_css', $custom_css );
173
+ if ( ! empty( $custom_css ) ) {
174
+ // wp_add_inline_style() requires a loaded CSS file, so we have to work around that if "Default CSS" is disabled,
175
+ if ( $use_default_css ) {
176
+ // Handle of the file to which the <style> shall be appended.
177
+ wp_add_inline_style( 'tablepress-default', $custom_css );
178
+ } else {
179
+ add_action( 'wp_head', array( $this, '_print_custom_css' ), 8 ); // priority 8 to hook in right after WP_Styles has been processed
180
+ }
181
+ }
182
+ }
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Print "Custom CSS" to "wp_head" inline.
188
+ *
189
+ * This is necessary if "Default CSS" is off, and saving "Custom CSS" to a file is not possible.
190
+ *
191
+ * @since 1.0.0
192
+ */
193
+ public function _print_custom_css() {
194
+ // Get "Custom CSS" from options, try minified Custom CSS first.
195
+ $custom_css = TablePress::$model_options->get( 'custom_css_minified' );
196
+ if ( empty( $custom_css ) ) {
197
+ $custom_css = TablePress::$model_options->get( 'custom_css' );
198
+ }
199
+ /** This filter is documented in controllers/controller-frontend.php */
200
+ $custom_css = apply_filters( 'tablepress_custom_css', $custom_css );
201
+ echo "<style type='text/css'>\n{$custom_css}\n</style>\n";
202
+ }
203
+
204
+ /**
205
+ * Enqueue the DataTables JavaScript library and its dependencies.
206
+ *
207
+ * @since 1.0.0
208
+ */
209
+ protected function _enqueue_datatables() {
210
+ $js_file = 'js/jquery.datatables.min.js';
211
+ $js_url = plugins_url( $js_file, TABLEPRESS__FILE__ );
212
+ /**
213
+ * Filter the URL from which the DataTables JavaScript library file is loaded.
214
+ *
215
+ * @since 1.0.0
216
+ *
217
+ * @param string $js_url URL of the DataTables JS library file.
218
+ * @param string $js_file Path and file name of the DataTables JS library file.
219
+ */
220
+ $js_url = apply_filters( 'tablepress_datatables_js_url', $js_url, $js_file );
221
+ wp_enqueue_script( 'jquery' );
222
+ wp_enqueue_script( 'tablepress-datatables', $js_url, array( 'jquery' ), TablePress::version, true );
223
+ }
224
+
225
+ /**
226
+ * Add JS code for invocation of DataTables JS library.
227
+ *
228
+ * @since 1.0.0
229
+ */
230
+ public function add_datatables_calls() {
231
+ if ( empty( $this->shown_tables ) ) {
232
+ // There are no tables with activated DataTables on the page that is currently rendered.
233
+ return;
234
+ }
235
+
236
+ // Storage for the DataTables languages.
237
+ $datatables_languages = array();
238
+ // Generate the specific JS commands, depending on chosen features on the "Edit" screen and the Shortcode parameters.
239
+ $commands = array();
240
+
241
+ foreach ( $this->shown_tables as $table_id => $table_store ) {
242
+ if ( empty( $table_store['instances'] ) ) {
243
+ continue;
244
+ }
245
+ foreach ( $table_store['instances'] as $html_id => $js_options ) {
246
+ $parameters = array();
247
+
248
+ // Settle dependencies/conflicts between certain features.
249
+ if ( false !== $js_options['datatables_scrolly'] ) { // not necessarily a boolean!
250
+ // Vertical scrolling and pagination don't work together.
251
+ $js_options['datatables_paginate'] = false;
252
+ }
253
+ // Sanitize, as it may come from a Shortcode attribute.
254
+ $js_options['datatables_paginate_entries'] = intval( $js_options['datatables_paginate_entries'] );
255
+
256
+ // DataTables language/translation handling.
257
+ /**
258
+ * Filter the locale/language for the DataTables JavaScript library.
259
+ *
260
+ * @since 1.0.0
261
+ *
262
+ * @param string $locale The DataTables JS library locale.
263
+ * @param string $table_id The current table ID.
264
+ */
265
+ $datatables_locale = apply_filters( 'tablepress_datatables_locale', $js_options['datatables_locale'], $table_id );
266
+ // Only do the expensive language file checks if they haven't been done yet.
267
+ if ( ! isset( $datatables_languages[ $datatables_locale ] ) ) {
268
+ $orig_language_file = TABLEPRESS_ABSPATH . "i18n/datatables/lang-{$datatables_locale}.json";
269
+ /**
270
+ * Filter the language file for the DataTables JavaScript library.
271
+ *
272
+ * @since 1.0.0
273
+ *
274
+ * @param string $orig_language_file Language file for the DataTables JS library.
275
+ * @param string $datatables_locale Current locale/language for the DataTables JS library.
276
+ * @param string $path Path of the language file.
277
+ */
278
+ $language_file = apply_filters( 'tablepress_datatables_language_file', $orig_language_file, $datatables_locale, TABLEPRESS_ABSPATH ); // Make sure to check file_exists( $new_file ) when using this filter!
279
+ // Load translation if it's not "en_US" (included as the default in DataTables) and the language file exists, or if the filter was used to change the language file.
280
+ if ( ( 'en_US' !== $datatables_locale && file_exists( $language_file ) )
281
+ || ( $orig_language_file !== $language_file ) ) {
282
+ $datatables_languages[ $datatables_locale ] = $language_file;
283
+ }
284
+ }
285
+ // If translation is registered to have its strings added to the JS, add corresponding parameter to DataTables call.
286
+ if ( isset( $datatables_languages[ $datatables_locale ] ) ) {
287
+ $parameters['language'] = '"language":DataTables_language["' . $datatables_locale . '"]';
288
+ }
289
+ // These parameters need to be added for performance gain or to overwrite unwanted default behavior.
290
+ if ( $js_options['datatables_sort'] ) {
291
+ // No initial sort.
292
+ $parameters['order'] = '"order":[]';
293
+ // Don't add additional classes, to speed up sorting.
294
+ $parameters['orderClasses'] = '"orderClasses":false';
295
+ }
296
+ // Alternating row colors is default, so remove them if not wanted with [].
297
+ $parameters['stripeClasses'] = '"stripeClasses":' . ( ( $js_options['alternating_row_colors'] ) ? "['even','odd']" : '[]' );
298
+ // The following options are activated by default, so we only need to "false" them if we don't want them, but don't need to "true" them if we do.
299
+ if ( ! $js_options['datatables_sort'] ) {
300
+ $parameters['ordering'] = '"ordering":false';
301
+ }
302
+ if ( $js_options['datatables_paginate'] ) {
303
+ $parameters['pagingType'] = '"pagingType":"simple"';
304
+ if ( $js_options['datatables_lengthchange'] ) {
305
+ $length_menu = array( 10, 25, 50, 100 );
306
+ if ( ! in_array( $js_options['datatables_paginate_entries'], $length_menu, true ) ) {
307
+ $length_menu[] = $js_options['datatables_paginate_entries'];
308
+ sort( $length_menu, SORT_NUMERIC );
309
+ $parameters['lengthMenu'] = '"lengthMenu":[' . implode( ',', $length_menu ) . ']';
310
+ }
311
+ } else {
312
+ $parameters['lengthChange'] = '"lengthChange":false';
313
+ }
314
+ if ( 10 !== $js_options['datatables_paginate_entries'] ) {
315
+ $parameters['pageLength'] = '"pageLength":'. $js_options['datatables_paginate_entries'];
316
+ }
317
+ } else {
318
+ $parameters['paging'] = '"paging":false';
319
+ }
320
+ if ( ! $js_options['datatables_filter'] ) {
321
+ $parameters['searching'] = '"searching":false';
322
+ }
323
+ if ( ! $js_options['datatables_info'] ) {
324
+ $parameters['info'] = '"info":false';
325
+ }
326
+ if ( $js_options['datatables_scrollx'] ) {
327
+ $parameters['scrollX'] = '"scrollX":true';
328
+ }
329
+ if ( false !== $js_options['datatables_scrolly'] ) {
330
+ $parameters['scrollY'] = '"scrollY":"' . preg_replace( '#[^0-9a-z.%]#', '', $js_options['datatables_scrolly'] ) . '"';
331
+ $parameters['scrollCollapse'] = '"scrollCollapse":true';
332
+ }
333
+ if ( ! empty( $js_options['datatables_custom_commands'] ) ) {
334
+ $parameters['custom_commands'] = $js_options['datatables_custom_commands'];
335
+ }
336
+
337
+ /**
338
+ * Filter the parameters that are passed to the DataTables JavaScript library.
339
+ *
340
+ * @since 1.0.0
341
+ *
342
+ * @param array $parameters The parameters for the DataTables JS library.
343
+ * @param string $table_id The current table ID.
344
+ * @param string $html_id The ID of the table HTML element.
345
+ * @param array $js_options The options for the JS library.
346
+ */
347
+ $parameters = apply_filters( 'tablepress_datatables_parameters', $parameters, $table_id, $html_id, $js_options );
348
+
349
+ // If an existing parameter (in the from `"parameter":`) is set in the "Custom Commands", remove its default value.
350
+ if ( isset( $parameters['custom_commands'] ) ) {
351
+ foreach ( array_keys( $parameters ) as $maybe_overwritten_parameter ) {
352
+ if ( false !== strpos( $parameters['custom_commands'], "\"{$maybe_overwritten_parameter}\":" ) ) {
353
+ unset( $parameters[ $maybe_overwritten_parameter ] );
354
+ }
355
+ }
356
+ }
357
+
358
+ $parameters = implode( ',', $parameters );
359
+ $parameters = ( ! empty( $parameters ) ) ? '{' . $parameters . '}' : '';
360
+
361
+ $command = "$('#{$html_id}').dataTable({$parameters});";
362
+ /**
363
+ * Filter the JavaScript command that invokes the DataTables JavaScript library on one table.
364
+ *
365
+ * @since 1.0.0
366
+ *
367
+ * @param string $command The JS command for the DataTables JS library.
368
+ * @param string $html_id The ID of the table HTML element.
369
+ * @param array $parameters The parameters for the DataTables JS library.
370
+ * @param string $table_id The current table ID.
371
+ * @param array $js_options The options for the JS library.
372
+ */
373
+ $command = apply_filters( 'tablepress_datatables_command', $command, $html_id, $parameters, $table_id, $js_options );
374
+ if ( ! empty( $command ) ) {
375
+ $commands[] = $command;
376
+ }
377
+ }
378
+ }
379
+
380
+ $commands = implode( "\n", $commands );
381
+ /**
382
+ * Filter the JavaScript commands that invoke the DataTables JavaScript library on all tables on the page.
383
+ *
384
+ * @since 1.0.0
385
+ *
386
+ * @param array $commands The JS commands for the DataTables JS library.
387
+ */
388
+ $commands = apply_filters( 'tablepress_all_datatables_commands', $commands );
389
+ if ( empty( $commands ) ) {
390
+ return;
391
+ }
392
+
393
+ // DataTables language/translation handling.
394
+ $datatables_strings = '';
395
+ foreach ( $datatables_languages as $locale => $language_file ) {
396
+ $strings = file_get_contents( $language_file );
397
+ // Remove unnecessary white space.
398
+ $strings = str_replace( array( "\n", "\r", "\t" ), '', $strings );
399
+ $datatables_strings .= "DataTables_language[\"{$locale}\"]={$strings};\n";
400
+ }
401
+ if ( ! empty( $datatables_strings ) ) {
402
+ $datatables_strings = "var DataTables_language={};\n" . $datatables_strings;
403
+ }
404
+
405
+ // Echo DataTables strings and JS calls.
406
+ echo <<<JS
407
+ <script type="text/javascript">
408
+ jQuery(document).ready(function($){
409
+ {$datatables_strings}{$commands}
410
+ });
411
+ </script>
412
+ JS;
413
+ }
414
+
415
+ /**
416
+ * Handle Shortcode [table id=<ID> /] in `the_content()`.
417
+ *
418
+ * @since 1.0.0
419
+ *
420
+ * @param array $shortcode_atts List of attributes that where included in the Shortcode.
421
+ * @return string Resulting HTML code for the table with the ID <ID>.
422
+ */
423
+ public function shortcode_table( $shortcode_atts ) {
424
+ // For empty Shortcodes like [table] or [table /], an empty string is passed, see WP Core #26927.
425
+ $shortcode_atts = (array) $shortcode_atts;
426
+
427
+ $_render = TablePress::load_class( 'TablePress_Render', 'class-render.php', 'classes' );
428
+
429
+ $default_shortcode_atts = $_render->get_default_render_options();
430
+ /**
431
+ * Filter the available/default attributes for the [table] Shortcode.
432
+ *
433
+ * @since 1.0.0
434
+ *
435
+ * @param array $default_shortcode_atts The [table] Shortcode default attributes.
436
+ */
437
+ $default_shortcode_atts = apply_filters( 'tablepress_shortcode_table_default_shortcode_atts', $default_shortcode_atts );
438
+ // Parse Shortcode attributes, only allow those that are specified.
439
+ $shortcode_atts = shortcode_atts( $default_shortcode_atts, $shortcode_atts ); // Optional third argument left out on purpose. Use filter in the next line instead.
440
+ /**
441
+ * Filter the attributes that were passed to the [table] Shortcode.
442
+ *
443
+ * @since 1.0.0
444
+ *
445
+ * @param array $shortcode_atts The attributes passed to the [table] Shortcode.
446
+ */
447
+ $shortcode_atts = apply_filters( 'tablepress_shortcode_table_shortcode_atts', $shortcode_atts );
448
+
449
+ // Check, if a table with the given ID exists.
450
+ $table_id = preg_replace( '/[^a-zA-Z0-9_-]/', '', $shortcode_atts['id'] );
451
+ if ( ! TablePress::$model_table->table_exists( $table_id ) ) {
452
+ $message = "[table &#8220;{$table_id}&#8221; not found /]<br />\n";
453
+ /**
454
+ * Filter the "Table not found" message.
455
+ *
456
+ * @since 1.0.0
457
+ *
458
+ * @param string $message The "Table not found" message.
459
+ * @param string $table_id The current table ID.
460
+ */
461
+ $message = apply_filters( 'tablepress_table_not_found_message', $message, $table_id );
462
+ return $message;
463
+ }
464
+
465
+ // Load table, with table data, options, and visibility settings.
466
+ $table = TablePress::$model_table->load( $table_id, true, true );
467
+ if ( is_wp_error( $table ) ) {
468
+ $message = "[table &#8220;{$table_id}&#8221; could not be loaded /]<br />\n";
469
+ /**
470
+ * Filter the "Table could not be loaded" message.
471
+ *
472
+ * @since 1.0.0
473
+ *
474
+ * @param string $message The "Table could not be loaded" message.
475
+ * @param string $table_id The current table ID.
476
+ * @param WP_Error $table The error object for the table.
477
+ */
478
+ $message = apply_filters( 'tablepress_table_load_error_message', $message, $table_id, $table );
479
+ return $message;
480
+ }
481
+ if ( isset( $table['is_corrupted'] ) && $table['is_corrupted'] ) {
482
+ $message = "<div>Attention: The internal data of table &#8220;{$table_id}&#8221; is corrupted!</div>";
483
+ /**
484
+ * Filter the "Table data is corrupted" message.
485
+ *
486
+ * @since 1.0.0
487
+ *
488
+ * @param string $message The "Table data is corrupted" message.
489
+ * @param string $table_id The current table ID.
490
+ * @param string $json_error The JSON error with information about the corrupted table.
491
+ */
492
+ $message = apply_filters( 'tablepress_table_corrupted_message', $message, $table_id, $table['json_error'] );
493
+ return $message;
494
+ }
495
+
496
+ /**
497
+ * Filter whether the "datatables_custom_commands" Shortcode parameter is disabled.
498
+ *
499
+ * By default, the "datatables_custom_commands" Shortcode parameter is disabled for security reasons.
500
+ *
501
+ * @since 1.0.0
502
+ *
503
+ * @param bool $disable Whether to disable the "datatables_custom_commands" Shortcode parameter. Default true.
504
+ */
505
+ if ( ! is_null( $shortcode_atts['datatables_custom_commands'] ) && apply_filters( 'tablepress_disable_custom_commands_shortcode_parameter', true ) ) {
506
+ $shortcode_atts['datatables_custom_commands'] = null;
507
+ }
508
+
509
+ // Determine options to use (if set in Shortcode, use those, otherwise use stored options, from the "Edit" screen).
510
+ $render_options = array();
511
+ foreach ( $shortcode_atts as $key => $value ) {
512
+ // We have to check this, because strings 'true' or 'false' are not recognized as boolean!
513
+ if ( is_string( $value ) && 'true' === strtolower( $value ) ) {
514
+ $render_options[ $key ] = true;
515
+ } elseif ( is_string( $value ) && 'false' === strtolower( $value ) ) {
516
+ $render_options[ $key ] = false;
517
+ } elseif ( is_null( $value ) && isset( $table['options'][ $key ] ) ) {
518
+ $render_options[ $key ] = $table['options'][ $key ];
519
+ } else {
520
+ $render_options[ $key ] = $value;
521
+ }
522
+ }
523
+
524
+ // Generate unique HTML ID, depending on how often this table has already been shown on this page.
525
+ if ( ! isset( $this->shown_tables[ $table_id ] ) ) {
526
+ $this->shown_tables[ $table_id ] = array(
527
+ 'count' => 0,
528
+ 'instances' => array(),
529
+ );
530
+ }
531
+ $this->shown_tables[ $table_id ]['count']++;
532
+ $count = $this->shown_tables[ $table_id ]['count'];
533
+ $render_options['html_id'] = "tablepress-{$table_id}";
534
+ if ( $count > 1 ) {
535
+ $render_options['html_id'] .= "-no-{$count}";
536
+ }
537
+ /**
538
+ * Filter the ID of the table HTML element.
539
+ *
540
+ * @since 1.0.0
541
+ *
542
+ * @param string $html_id The ID of the table HTML element.
543
+ * @param string $table_id The current table ID.
544
+ * @param string $count Number of copies of the table with this table ID on the page.
545
+ */
546
+ $render_options['html_id'] = apply_filters( 'tablepress_html_id', $render_options['html_id'], $table_id, $count );
547
+
548
+ // Generate the "Edit Table" link.
549
+ $render_options['edit_table_url'] = '';
550
+ /**
551
+ * Filter whether the "Edit" link below the table shall be shown.
552
+ *
553
+ * The "Edit" link is only shown to logged-in users who possess the necessary capability to edit the table.
554
+ *
555
+ * @since 1.0.0
556
+ *
557
+ * @param bool $show Whether to show the "Edit" link below the table. Default true.
558
+ * @param string $table_id The current table ID.
559
+ */
560
+ if ( is_user_logged_in() && apply_filters( 'tablepress_edit_link_below_table', true, $table['id'] ) && current_user_can( 'tablepress_edit_table', $table['id'] ) ) {
561
+ $render_options['edit_table_url'] = TablePress::url( array( 'action' => 'edit', 'table_id' => $table['id'] ) );
562
+ }
563
+
564
+ /**
565
+ * Filter the render options for the table.
566
+ *
567
+ * The render options are determined from the settings on a table's "Edit" screen and the Shortcode parameters.
568
+ *
569
+ * @since 1.0.0
570
+ *
571
+ * @param array $render_options The render options for the table.
572
+ * @param array $table The current table.
573
+ */
574
+ $render_options = apply_filters( 'tablepress_table_render_options', $render_options, $table );
575
+
576
+ // Eventually add this table to list of tables which have a JS library enabled and thus are to be included in the script's call in the footer.
577
+ if ( $render_options['use_datatables'] && $render_options['table_head'] && count( $table['data'] ) > 1 ) {
578
+ // Get options for the DataTables JavaScript library from the table's render options.
579
+ $js_options = array();
580
+ foreach ( array( 'alternating_row_colors', 'datatables_sort', 'datatables_paginate',
581
+ 'datatables_paginate', 'datatables_paginate_entries', 'datatables_lengthchange',
582
+ 'datatables_filter', 'datatables_info', 'datatables_scrollx', 'datatables_scrolly',
583
+ 'datatables_locale', 'datatables_custom_commands' ) as $option ) {
584
+ $js_options[ $option ] = $render_options[ $option ];
585
+ }
586
+ /**
587
+ * Filter the JavaScript options for the table.
588
+ *
589
+ * The JavaScript options are determined from the settings on a table's "Edit" screen and the Shortcode parameters.
590
+ * They are part of the render options and can be overwritten with Shortcode parameters.
591
+ *
592
+ * @since 1.0.0
593
+ *
594
+ * @param array $js_options The JavaScript options for the table.
595
+ * @param string $table_id The current table ID.
596
+ * @param array $render_options The render options for the table.
597
+ */
598
+ $js_options = apply_filters( 'tablepress_table_js_options', $js_options, $table_id, $render_options );
599
+ $this->shown_tables[ $table_id ]['instances'][ $render_options['html_id'] ] = $js_options;
600
+ $this->_enqueue_datatables();
601
+ }
602
+
603
+ // Check if table output shall and can be loaded from the transient cache, otherwise generate the output.
604
+ if ( $render_options['cache_table_output'] && ! is_user_logged_in() ) {
605
+ // Hash the Render Options array to get a unique cache identifier.
606
+ $table_hash = md5( json_encode( $render_options ) );
607
+ $transient_name = 'tablepress_' . $table_hash; // Attention: This string must not be longer than 45 characters!
608
+ $output = get_transient( $transient_name );
609
+ if ( false === $output || '' === $output ) {
610
+ // Render/generate the table HTML, as it was not found in the cache.
611
+ $_render->set_input( $table, $render_options );
612
+ $output = $_render->get_output();
613
+ // Save render output in a transient, set cache timeout to 24 hours.
614
+ set_transient( $transient_name, $output, DAY_IN_SECONDS );
615
+ // Update output caches list transient (necessary for cache invalidation upon table saving).
616
+ $caches_list_transient_name = 'tablepress_c_' . md5( $table_id );
617
+ $caches_list = get_transient( $caches_list_transient_name );
618
+ if ( false === $caches_list ) {
619
+ $caches_list = array();
620
+ } else {
621
+ $caches_list = (array) json_decode( $caches_list, true );
622
+ }
623
+ if ( ! in_array( $transient_name, $caches_list, true ) ) {
624
+ $caches_list[] = $transient_name;
625
+ }
626
+ set_transient( $caches_list_transient_name, json_encode( $caches_list ), 2 * DAY_IN_SECONDS );
627
+ } else {
628
+ /**
629
+ * Filter the cache hit comment message.
630
+ *
631
+ * @since 1.0.0
632
+ *
633
+ * @param string $comment The cache hit comment message.
634
+ */
635
+ $output .= apply_filters( 'tablepress_cache_hit_comment', "<!-- #{$render_options['html_id']} from cache -->" );
636
+ }
637
+ } else {
638
+ // Render/generate the table HTML, as no cache is to be used.
639
+ $_render->set_input( $table, $render_options );
640
+ $output = $_render->get_output();
641
+ }
642
+
643
+ // Maybe print a list of used render options.
644
+ if ( $render_options['shortcode_debug'] && is_user_logged_in() ) {
645
+ $output .= '<pre>' . var_export( $render_options, true ) . '</pre>';
646
+ }
647
+
648
+ return $output;
649
+ }
650
+
651
+ /**
652
+ * Handle Shortcode [table-info id=<ID> field=<name> /] in the_content().
653
+ *
654
+ * @since 1.0.0
655
+ *
656
+ * @param array $shortcode_atts List of attributes that where included in the Shortcode.
657
+ * @return string Text that replaces the Shortcode (error message or asked-for information).
658
+ */
659
+ public function shortcode_table_info( $shortcode_atts ) {
660
+ // For empty Shortcodes like [table-info] or [table-info /], an empty string is passed, see Core #26927.
661
+ $shortcode_atts = (array) $shortcode_atts;
662
+
663
+ // Parse Shortcode attributes, only allow those that are specified.
664
+ $default_shortcode_atts = array(
665
+ 'id' => '',
666
+ 'field' => '',
667
+ 'format' => '',
668
+ );
669
+ /**
670
+ * Filter the available/default attributes for the [table-info] Shortcode.
671
+ *
672
+ * @since 1.0.0
673
+ *
674
+ * @param array $default_shortcode_atts The [table-info] Shortcode default attributes.
675
+ */
676
+ $default_shortcode_atts = apply_filters( 'tablepress_shortcode_table_info_default_shortcode_atts', $default_shortcode_atts );
677
+ $shortcode_atts = shortcode_atts( $default_shortcode_atts, $shortcode_atts ); // Optional third argument left out on purpose. Use filter in the next line instead.
678
+ /**
679
+ * Filter the attributes that were passed to the [table-info] Shortcode.
680
+ *
681
+ * @since 1.0.0
682
+ *
683
+ * @param array $shortcode_atts The attributes passed to the [table-info] Shortcode.
684
+ */
685
+ $shortcode_atts = apply_filters( 'tablepress_shortcode_table_info_shortcode_atts', $shortcode_atts );
686
+
687
+ /**
688
+ * Filter whether the output of the [table-info] Shortcode is overwritten/short-circuited.
689
+ *
690
+ * @since 1.0.0
691
+ *
692
+ * @param bool|string $overwrite Whether the [table-info] output is overwritten. Return false for the regular content, and a string to overwrite the output.
693
+ * @param array $shortcode_atts The attributes passed to the [table-info] Shortcode.
694
+ */
695
+ $overwrite = apply_filters( 'tablepress_shortcode_table_info_overwrite', false, $shortcode_atts );
696
+ if ( $overwrite ) {
697
+ return $overwrite;
698
+ }
699
+
700
+ // Check, if a table with the given ID exists.
701
+ $table_id = preg_replace( '/[^a-zA-Z0-9_-]/', '', $shortcode_atts['id'] );
702
+ if ( ! TablePress::$model_table->table_exists( $table_id ) ) {
703
+ $message = "[table &#8220;{$table_id}&#8221; not found /]<br />\n";
704
+ /** This filter is documented in controllers/controller-frontend.php */
705
+ $message = apply_filters( 'tablepress_table_not_found_message', $message, $table_id );
706
+ return $message;
707
+ }
708
+
709
+ // Load table, with table data, options, and visibility settings.
710
+ $table = TablePress::$model_table->load( $table_id, true, true );
711
+ if ( is_wp_error( $table ) ) {
712
+ $message = "[table &#8220;{$table_id}&#8221; could not be loaded /]<br />\n";
713
+ /** This filter is documented in controllers/controller-frontend.php */
714
+ $message = apply_filters( 'tablepress_table_load_error_message', $message, $table_id, $table );
715
+ return $message;
716
+ }
717
+
718
+ $field = preg_replace( '/[^a-z_]/', '', strtolower( $shortcode_atts['field'] ) );
719
+ $format = preg_replace( '/[^a-z]/', '', strtolower( $shortcode_atts['format'] ) );
720
+
721
+ // Generate output, depending on what information (field) was asked for.
722
+ switch ( $field ) {
723
+ case 'name':
724
+ case 'description':
725
+ $output = $table[ $field ];
726
+ break;
727
+ case 'last_modified':
728
+ switch ( $format ) {
729
+ case 'raw':
730
+ $output = $table['last_modified'];
731
+ break;
732
+ case 'human':
733
+ $modified_timestamp = strtotime( $table['last_modified'] );
734
+ $current_timestamp = current_time( 'timestamp' );
735
+ $time_diff = $current_timestamp - $modified_timestamp;
736
+ // Time difference is only shown up to one day.
737
+ if ( $time_diff >= 0 && $time_diff < DAY_IN_SECONDS ) {
738
+ $output = sprintf( __( '%s ago', 'tablepress' ), human_time_diff( $modified_timestamp, $current_timestamp ) );
739
+ } else {
740
+ $output = TablePress::format_datetime( $table['last_modified'], 'mysql', '<br />' );
741
+ }
742
+ break;
743
+ case 'mysql':
744
+ default:
745
+ $output = TablePress::format_datetime( $table['last_modified'], 'mysql', ' ' );
746
+ break;
747
+ }
748
+ break;
749
+ case 'last_editor':
750
+ $output = TablePress::get_user_display_name( $table['options']['last_editor'] );
751
+ break;
752
+ case 'author':
753
+ $output = TablePress::get_user_display_name( $table['author'] );
754
+ break;
755
+ case 'number_rows':
756
+ $output = count( $table['data'] );
757
+ if ( 'raw' !== $format ) {
758
+ if ( $table['options']['table_head'] ) {
759
+ $output = $output - 1;
760
+ }
761
+ if ( $table['options']['table_foot'] ) {
762
+ $output = $output - 1;
763
+ }
764
+ }
765
+ break;
766
+ case 'number_columns':
767
+ $output = count( $table['data'][0] );
768
+ break;
769
+ default:
770
+ $output = "[table-info field &#8220;{$field}&#8221; not found in table &#8220;{$table_id}&#8221; /]<br />\n";
771
+ /**
772
+ * Filter the "table info field not found" message.
773
+ *
774
+ * @since 1.0.0
775
+ *
776
+ * @param string $output The "table info field not found" message.
777
+ * @param array $table The current table ID.
778
+ * @param string $field The field that was not found.
779
+ * @param string $format The return format for the field.
780
+ */
781
+ $output = apply_filters( 'tablepress_table_info_not_found_message', $output, $table, $field, $format );
782
+ }
783
+
784
+ /**
785
+ * Filter the output of the [table-info] Shortcode.
786
+ *
787
+ * @since 1.0.0
788
+ *
789
+ * @param string $output The output of the [table-info] Shortcode.
790
+ * @param array $table The current table.
791
+ * @param array $shortcode_atts The attributes passed to the [table-info] Shortcode.
792
+ */
793
+ $output = apply_filters( 'tablepress_shortcode_table_info_output', $output, $table, $shortcode_atts );
794
+ return $output;
795
+ }
796
+
797
+ /**
798
+ * Handle Shortcodes in text widgets, by temporarily removing all Shortcodes, registering only the plugin's two,
799
+ * running WP's Shortcode routines, and then restoring old behavior/Shortcodes.
800
+ *
801
+ * @since 1.0.0
802
+ *
803
+ * @global array $shortcode_tags WordPress container for storing Shortcode definitions.
804
+ *
805
+ * @param string $content Text content of the text widget, will be searched for one of TablePress's Shortcodes.
806
+ * @return string Text of the text widget, with eventually found Shortcodes having been replaced by corresponding output.
807
+ */
808
+ public function widget_text_filter( $content ) {
809
+ global $shortcode_tags;
810
+ // Backup the currently registered Shortcodes and clear the global array.
811
+ $orig_shortcode_tags = $shortcode_tags;
812
+ $shortcode_tags = array();
813
+ // Register TablePress's Shortcodes (which are then the only ones registered).
814
+ add_shortcode( TablePress::$shortcode_info, array( $this, 'shortcode_table_info' ) );
815
+ add_shortcode( TablePress::$shortcode, array( $this, 'shortcode_table' ) );
816
+ // Run the WP Shortcode routines on the widget text (i.e. search for TablePress's Shortcodes).
817
+ $content = do_shortcode( $content );
818
+ // Restore the original Shortcodes (which includes TablePress's Shortcodes, for use in posts and pages).
819
+ $shortcode_tags = $orig_shortcode_tags;
820
+ return $content;
821
+ }
822
+
823
+ /**
824
+ * Expand WP Search to also find posts and pages that have a search term in a table that is shown in them.
825
+ *
826
+ * This is done by looping through all search terms and TablePress tables and searching there for the search term,
827
+ * saving all tables's IDs that have a search term and then expanding the WP query to search for posts or pages that have the
828
+ * Shortcode for one of these tables in their content.
829
+ *
830
+ * @since 1.0.0
831
+ *
832
+ * @global wpdb $wpdb WordPress database abstraction object.
833
+ *
834
+ * @param string $search_sql Current part of the "WHERE" clause of the SQL statement used to get posts/pages from the WP database that is related to searching.
835
+ * @return string Eventually extended SQL "WHERE" clause, to also find posts/pages with Shortcodes in them.
836
+ */
837
+ public function posts_search_filter( $search_sql ) {
838
+ global $wpdb;
839
+
840
+ if ( ! is_search() || ! is_main_query() ) {
841
+ return $search_sql;
842
+ }
843
+
844
+ // Get variable that contains all search terms, parsed from $_GET['s'] by WP.
845
+ $search_terms = get_query_var( 'search_terms' );
846
+ if ( empty( $search_terms ) || ! is_array( $search_terms ) ) {
847
+ return $search_sql;
848
+ }
849
+
850
+ // Load all table IDs and prime post meta cache for cached access to options and visibility settings of the tables, don't run filter hook.
851
+ $table_ids = TablePress::$model_table->load_all( true, false );
852
+ // Array of all search words that were found, and the table IDs where they were found.
853
+ $query_result = array();
854
+
855
+ foreach ( $table_ids as $table_id ) {
856
+ // Load table, with table data, options, and visibility settings.
857
+ $table = TablePress::$model_table->load( $table_id, true, true );
858
+
859
+ if ( isset( $table['is_corrupted'] ) && $table['is_corrupted'] ) {
860
+ // Do not search in corrupted tables.
861
+ continue;
862
+ }
863
+
864
+ foreach ( $search_terms as $search_term ) {
865
+ if ( ( $table['options']['print_name'] && false !== stripos( $table['name'], $search_term ) )
866
+ || ( $table['options']['print_description'] && false !== stripos( $table['description'], $search_term ) ) ) {
867
+ // Found the search term in the name or description (and they are shown).
868
+ $query_result[ $search_term ][] = $table_id; // Add table ID to result list.
869
+ // No need to continue searching this search term in this table.
870
+ continue;
871
+ }
872
+
873
+ // Search search term in visible table cells (without taking Shortcode parameters into account!).
874
+ foreach ( $table['data'] as $row_idx => $table_row ) {
875
+ if ( 0 === $table['visibility']['rows'][ $row_idx ] ) {
876
+ // Row is hidden, so don't search in it.
877
+ continue;
878
+ }
879
+ foreach ( $table_row as $col_idx => $table_cell ) {
880
+ if ( 0 === $table['visibility']['columns'][ $col_idx ] ) {
881
+ // Column is hidden, so don't search in it.
882
+ continue;
883
+ }
884
+ // @TODO: Cells are not evaluated here, so math formulas are searched.
885
+ if ( false !== stripos( $table_cell, $search_term ) ) {
886
+ // Found the search term in the cell content.
887
+ $query_result[ $search_term ][] = $table_id; // Add table ID to result list
888
+ // No need to continue searching this search term in this table.
889
+ continue 3;
890
+ }
891
+ }
892
+ }
893
+ }
894
+ }
895
+
896
+ // For all found table IDs for each search term, add additional OR statement to the SQL "WHERE" clause.
897
+
898
+ // If $_GET['exact'] is set, WordPress doesn't use % in SQL LIKE clauses.
899
+ $exact = get_query_var( 'exact' );
900
+ $n = ( empty( $exact ) ) ? '%' : '';
901
+ foreach ( $query_result as $search_term => $table_ids ) {
902
+ $search_term = esc_sql( $wpdb->esc_like( $search_term ) );
903
+ $old_or = "OR ({$wpdb->posts}.post_content LIKE '{$n}{$search_term}{$n}')";
904
+ $table_ids = implode( '|', $table_ids );
905
+ $regexp = '\\\\[' . TablePress::$shortcode . ' id=(["\\\']?)(' . $table_ids . ')([\]"\\\' /])'; // ' needs to be single escaped, [ double escaped (with \\) in mySQL
906
+ $new_or = $old_or . " OR ({$wpdb->posts}.post_content REGEXP '{$regexp}')";
907
+ $search_sql = str_replace( $old_or, $new_or, $search_sql );
908
+ }
909
+
910
+ return $search_sql;
911
+ }
912
+
913
+ } // class TablePress_Frontend_Controller
controllers/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
controllers/template-tag-functions.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Frontend Template Tag functions, only available when the Frontend Controller is loaded
4
+ *
5
+ * @package TablePress
6
+ * @subpackage Frontend Template Tag functions
7
+ * @author Tobias Bäthge
8
+ * @since 1.0.0
9
+ */
10
+
11
+ /**
12
+ * Add template tag function for "table" Shortcode to be used anywhere in the template, returns the table HTML.
13
+ *
14
+ * This function provides a possibility to show a table anywhere in a WordPress template,
15
+ * which is needed for any region of a theme that can not use Shortcodes.
16
+ *
17
+ * @since 1.0.0
18
+ *
19
+ * @param string|array $table_query Query string like list or array of parameters for Shortcode "table" rendering.
20
+ * @return string HTML of the rendered table.
21
+ */
22
+ function tablepress_get_table( $table_query ) {
23
+ if ( is_array( $table_query ) ) {
24
+ $atts = $table_query;
25
+ } else {
26
+ parse_str( (string) $table_query, $atts );
27
+ }
28
+ return TablePress::$controller->shortcode_table( $atts );
29
+ }
30
+
31
+ /**
32
+ * Add template tag function for "table" Shortcode to be used anywhere in the template, echoes the table HTML.
33
+ *
34
+ * This function provides a possibility to show a table anywhere in a WordPress template,
35
+ * which is needed for any region of a theme that can not use Shortcodes.
36
+ *
37
+ * @since 1.0.0
38
+ *
39
+ * @see tablepress_get_table()
40
+ *
41
+ * @param string|array $table_query Query string like list or array of parameters for Shortcode "table" rendering.
42
+ */
43
+ function tablepress_print_table( $table_query ) {
44
+ echo tablepress_get_table( $table_query );
45
+ }
46
+
47
+ /**
48
+ * Add template tag function for "table-info" Shortcode to be used anywhere in the template, returns the info.
49
+ *
50
+ * @since 1.0.0
51
+ *
52
+ * @param string|array $table_query Query string like list or array of parameters for Shortcode "table-info" rendering.
53
+ * @return string Desired table information.
54
+ */
55
+ function tablepress_get_table_info( $table_query ) {
56
+ if ( is_array( $table_query ) ) {
57
+ $atts = $table_query;
58
+ } else {
59
+ parse_str( (string) $table_query, $atts );
60
+ }
61
+ return TablePress::$controller->shortcode_table_info( $atts );
62
+ }
63
+
64
+ /**
65
+ * Add template tag function for "table-info" Shortcode to be used anywhere in the template, echoes the info.
66
+ *
67
+ * This function provides a possibility to show table info data anywhere in a WordPress template,
68
+ * which is needed for any region of a theme that can not use Shortcodes.
69
+ *
70
+ * @since 1.0.0
71
+ *
72
+ * @see tablepress_get_table_info()
73
+ *
74
+ * @param string|array $table_query Query string like list or array of parameters for Shortcode "table-info" rendering.
75
+ */
76
+ function tablepress_print_table_info( $table_query ) {
77
+ echo tablepress_get_table_info( $table_query );
78
+ }
css/default-rtl.css ADDED
@@ -0,0 +1,266 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * TablePress Default CSS for RTL languages
3
+ *
4
+ * Attention: Do not modify this file directly, but use the "Custom CSS" textarea
5
+ * on the "Plugin Options" screen of TablePress.
6
+ *
7
+ * @package TablePress
8
+ * @subpackage Frontend CSS
9
+ * @author Tobias Bäthge, Allan Jardine
10
+ * @since 1.0.0
11
+ */
12
+
13
+ @font-face {
14
+ font-family: 'TablePress';
15
+ src: url(tablepress.eot);
16
+ src: url(tablepress.eot?#ie) format('embedded-opentype'),
17
+ url(data:application/x-font-woff;base64,d09GRgABAAAAAAXYAAwAAAAACXwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABHAAAABwAAAAcZInHOk9TLzIAAAE4AAAAPgAAAGB7NXPDY21hcAAAAXgAAABMAAABUvD45QVnYXNwAAABxAAAAAgAAAAIAAAAEGdseWYAAAHMAAABKQAAAgjYVHFyaGVhZAAAAvgAAAAvAAAANv2jaBNoaGVhAAADKAAAAB0AAAAkCk0F6GhtdHgAAANIAAAAIAAAACgoAADqbG9jYQAAA2gAAAAWAAAAFgJWAbxtYXhwAAADgAAAAB0AAAAgAE4AH25hbWUAAAOgAAAB3AAAA43ZugaUcG9zdAAABXwAAABZAAAAgeNVfAkAAAABAAAAAMwXcmMAAAAAy1XFoAAAAADNHI82eJxjYGbexjiBgZWBhaWHxZiBgaENQjMVM0SB+ThBQWVRMYPDh+APd9gY/gP5bAyMykCKEUmJAgMjAC56Ct8AAHicY2BgYGaAYBkGRgYQ8AHyGMF8FgYDIM0BhEwMDB9CPtz6cOf/fyAr+MN1EIt/A78evy5UFxgwsjHAuYxAPSB9KICRYdgDAL67D8kAAQAB//8AD3icXU/NTsJAEJ5ZFggxxmCbkiwHAzLTowlu4ejeyxPwCOBR7r3rE/geeubuG3i3TyGts12MtT18ndnd7w8QsvpdX/Q/IAboI9s1rpY3mMTDkcAVDuaqPD0RqRfaU05UGSxJhj2p5wDNUplqyjsZQT6EQ/2mc9GcyBIPReQOObPrkccHMZhgonMS3R1tiLCsDNFm8bgQF3W06ekgqqnN5Aa//D9nlrOgDeg09Aq4lK3RTiX16n621BBVLrIe2PQK09s2c4THyPIvF4TrAndwO5uHvhPUwOa7MNw8FsCtZfZDJBKB66BQhW58cRwHW09OVMEtI+3aOhEHX+E63crM2dh6X+WazMFLvf6F57OvAqiPGvo+87Tb+LrT4X9/7lT6bKXs9vsByDlkyAAAAHicY2BkYGAA4mO9Sxji+W2+MnCzM4DAWZl+bwT9fyuLN+tpIJeDgQkkCgAbqgoOAHicY2BkYGBj+HeXgYGdAQRYvBkYGVABFwA+hgJEAAAAeJxjZ4AAdiBmaWAwBeJSFhAbiJkaGByAGMwGADa+AxEAAAAAAAAAAAAqAFgAdgCUALIA0AEEAAB4nGNgZGBg4GKQYWBiAAEQycgAEnMA8xkABjEAbgAAAHicjZJBaxNBFMf/u0mbJoig5KC3QcRblt2tFCm9lEp701iKIHiZJLPJ0mSnzE5S8h38BB79Nn4ab94E/zN9JVB7MCEzv/3Pm/f+720ADPEbCe4/qXCCAV4Kp+jhrXAHGb4Ld/Ecv4T38Cx5I7yPQfJBuIdPyR/hAzxJa+E+Buk3Zku6fal8xwn9dIRTPMVr4Q6+4kS4S/Wn8B5eJanwPobJO+EefiRfhA/wIv0o3Mcw3YRyV9CYYAmDMRzXll9c6cnSjJ1pyZcU51gzRDMAl2a+XmrCOSwa+Lg7RhgolJxKzv2Yv8cSqwfZ7iILHGHEdcT7OfdDJreNP7dublSZ5epY7QwpMUCxOBoVozIvDh/v4mEx/JsE+MwQx+A6dhO8hA7y2EvwUjLEuLa2jSqyPFcsV/7H0MbxUFMOYwkhVSykODAb10U8OePTDbY8qel0QV3FO1PSvaUqDnh3p5LBB8WxxozqKnZ4TU1T9THfhJ3vsjTcw9M02s1ocWl0a5QzlXHKW+UXRp3Zm62r5wuvWjP1oenKunhS8YUo7/TMrLS7Vtp7V0/WMaSxvp6aNoP8FYKzU9zGOpbOTHidzqvTW9PaFZ/e0+QmtnJBatjAlqLeGHWhm9kWfwGPR6C4eJxjYGIAg/9VDFEM2AAXEDMyMDEyMTIzsjCyMrIxsjNy8CRnpJYV5efF56SmlfDCOEWZ6RklXMmJRakl8Sn55XkcEGZpAVQMpJgbwgQrZSnOLyoBACnGHqgAAAA=) format('woff'),
18
+ url(tablepress.ttf) format('truetype'),
19
+ url(tablepress.svg#TablePress) format('svg');
20
+ font-weight: normal;
21
+ font-style: normal;
22
+ }
23
+
24
+ /* Table description */
25
+ .tablepress-table-description {
26
+ clear: both;
27
+ display: block;
28
+ }
29
+
30
+ .tablepress {
31
+ border-collapse: collapse;
32
+ border-spacing: 0;
33
+ width: 100%;
34
+ margin-bottom: 1em;
35
+ border: none;
36
+ }
37
+
38
+ .tablepress th,
39
+ .tablepress td {
40
+ padding: 8px;
41
+ border: none;
42
+ background: none;
43
+ text-align: right;
44
+ float: none !important;
45
+ }
46
+ .tablepress tbody td {
47
+ vertical-align: top;
48
+ }
49
+
50
+ /* Horizontal borders */
51
+ .tablepress tbody td,
52
+ .tablepress tfoot th {
53
+ border-top: 1px solid #dddddd;
54
+ }
55
+ .tablepress tbody tr:first-child td {
56
+ border-top: 0;
57
+ }
58
+ .tablepress thead th {
59
+ border-bottom: 1px solid #dddddd;
60
+ }
61
+
62
+ /* Row background colors */
63
+ .tablepress thead th,
64
+ .tablepress tfoot th {
65
+ background-color: #d9edf7;
66
+ font-weight: bold;
67
+ vertical-align: middle;
68
+ }
69
+ .tablepress .odd td {
70
+ background-color: #f9f9f9;
71
+ }
72
+ .tablepress .even td {
73
+ background-color: #ffffff;
74
+ }
75
+ .tablepress .row-hover tr:hover td {
76
+ background-color: #f3f3f3;
77
+ }
78
+
79
+ /* Reset image layout in tables */
80
+ .tablepress img {
81
+ margin: 0;
82
+ padding: 0;
83
+ border: none;
84
+ max-width: none;
85
+ }
86
+
87
+ /* Table wrapper */
88
+ .dataTables_wrapper {
89
+ clear: both;
90
+ margin-bottom: 1em;
91
+ }
92
+ .dataTables_wrapper .tablepress {
93
+ clear: both;
94
+ margin: 0 !important;
95
+ }
96
+
97
+ /* Length Change menu */
98
+ .dataTables_length {
99
+ float: left;
100
+ white-space: nowrap;
101
+ }
102
+
103
+ /* Filter/Search */
104
+ .dataTables_filter {
105
+ float: right;
106
+ white-space: nowrap;
107
+ }
108
+
109
+ /* Table information */
110
+ .dataTables_info {
111
+ clear: both;
112
+ float: left;
113
+ margin: 4px 0 0;
114
+ }
115
+
116
+ /* Pagination */
117
+ .dataTables_paginate {
118
+ float: right;
119
+ margin: 4px 0 0;
120
+ direction: rtl;
121
+ }
122
+ .dataTables_paginate a {
123
+ color: #111111 !important;
124
+ display: inline-block;
125
+ outline: none;
126
+ position: relative;
127
+ text-decoration: underline;
128
+ text-decoration: none\0/IE; /* Hack for IE8, IE9, and IE10pp4, as those have trouble with text-decoration in :after pseudo-elements */
129
+ margin: 0 5px;
130
+ }
131
+ .dataTables_paginate a:first-child {
132
+ margin-right: 0;
133
+ }
134
+ .dataTables_paginate a:last-child {
135
+ margin-left: 0;
136
+ }
137
+ .paginate_button:hover {
138
+ cursor: pointer;
139
+ text-decoration: none;
140
+ }
141
+ .paginate_button.disabled {
142
+ color: #999999 !important;
143
+ text-decoration: none;
144
+ cursor: default;
145
+ }
146
+ .paginate_button.current {
147
+ font-weight: bold;
148
+ text-decoration: none;
149
+ cursor: default;
150
+ }
151
+ /* Two button pagination - previous/next */
152
+ .dataTables_paginate.paging_simple {
153
+ padding: 0 15px;
154
+ }
155
+ .paging_simple .paginate_button.previous:before,
156
+ .paging_simple .paginate_button.next:after {
157
+ text-align: right;
158
+ font-family: TablePress;
159
+ font-size: 14px;
160
+ font-weight: bold;
161
+ -webkit-font-smoothing: antialiased;
162
+ content: "\f054";
163
+ text-shadow: 0.1em 0.1em #666666;
164
+ position: absolute;
165
+ top: 0;
166
+ right: -14px;
167
+ bottom: 0;
168
+ left: auto;
169
+ margin: auto;
170
+ height: 14px;
171
+ width: 14px;
172
+ line-height: 1;
173
+ }
174
+ .paging_simple .paginate_button.next:after {
175
+ text-align: left;
176
+ content: "\f053";
177
+ right: auto;
178
+ left: -14px;
179
+ }
180
+ .paginate_button:before,
181
+ .paginate_button:after {
182
+ color: #d9edf7;
183
+ }
184
+ .paginate_button:hover:before,
185
+ .paginate_button:hover:after {
186
+ color: #049cdb;
187
+ }
188
+ .paginate_button.disabled:before,
189
+ .paginate_button.disabled:after {
190
+ color: #f9f9f9;
191
+ }
192
+
193
+ /* Processing indicator */
194
+ .dataTables_processing {
195
+ display: none; /* always hidden, we don't use it */
196
+ }
197
+
198
+ /* Scrolling */
199
+ .dataTables_scroll {
200
+ clear: both;
201
+ }
202
+ .dataTables_scrollBody {
203
+ -webkit-overflow-scrolling: touch;
204
+ }
205
+
206
+ /* Sorting */
207
+ .tablepress .sorting,
208
+ .tablepress .sorting_asc,
209
+ .tablepress .sorting_desc {
210
+ position: relative;
211
+ padding-left: 20px; /* more left padding for sort arrows */
212
+ cursor: pointer;
213
+ outline: none;
214
+ }
215
+ .tablepress .sorting:before,
216
+ .tablepress .sorting_asc:before,
217
+ .tablepress .sorting_desc:before {
218
+ font-family: TablePress;
219
+ font-weight: normal;
220
+ font-size: 14px;
221
+ -webkit-font-smoothing: antialiased;
222
+ position: absolute;
223
+ top: 0;
224
+ bottom: 0;
225
+ left: 6px;
226
+ right: auto;
227
+ margin: auto;
228
+ height: 14px;
229
+ line-height: 1;
230
+ }
231
+ .tablepress .sorting:before {
232
+ content: "\f0dc";
233
+ }
234
+ .tablepress .sorting_asc:before {
235
+ content: "\f0d8";
236
+ padding: 0 0 2px;
237
+ }
238
+ .tablepress .sorting_desc:before {
239
+ content: "\f0d7";
240
+ }
241
+ .tablepress .sorting:hover,
242
+ .tablepress .sorting_asc,
243
+ .tablepress .sorting_desc {
244
+ background-color: #049cdb;
245
+ }
246
+ /* Hide the sorting arrows in the extra table that is added for scrolling */
247
+ .dataTables_scrollBody .tablepress thead th:before {
248
+ content: "";
249
+ }
250
+
251
+ /* Self clearing */
252
+ .dataTables_wrapper:after {
253
+ content: "";
254
+ display: block;
255
+ clear: both;
256
+ visibility: hidden;
257
+ line-height: 0;
258
+ height: 0;
259
+ }
260
+
261
+ .dataTables_wrapper label input,
262
+ .dataTables_wrapper label select {
263
+ display: inline;
264
+ margin: 2px;
265
+ width: auto;
266
+ }
css/default-rtl.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @font-face{font-family:TablePress;src:url(tablepress.eot);src:url(tablepress.eot?#ie)format('embedded-opentype'),url(data:application/x-font-woff;base64,d09GRgABAAAAAAXYAAwAAAAACXwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABHAAAABwAAAAcZInHOk9TLzIAAAE4AAAAPgAAAGB7NXPDY21hcAAAAXgAAABMAAABUvD45QVnYXNwAAABxAAAAAgAAAAIAAAAEGdseWYAAAHMAAABKQAAAgjYVHFyaGVhZAAAAvgAAAAvAAAANv2jaBNoaGVhAAADKAAAAB0AAAAkCk0F6GhtdHgAAANIAAAAIAAAACgoAADqbG9jYQAAA2gAAAAWAAAAFgJWAbxtYXhwAAADgAAAAB0AAAAgAE4AH25hbWUAAAOgAAAB3AAAA43ZugaUcG9zdAAABXwAAABZAAAAgeNVfAkAAAABAAAAAMwXcmMAAAAAy1XFoAAAAADNHI82eJxjYGbexjiBgZWBhaWHxZiBgaENQjMVM0SB+ThBQWVRMYPDh+APd9gY/gP5bAyMykCKEUmJAgMjAC56Ct8AAHicY2BgYGaAYBkGRgYQ8AHyGMF8FgYDIM0BhEwMDB9CPtz6cOf/fyAr+MN1EIt/A78evy5UFxgwsjHAuYxAPSB9KICRYdgDAL67D8kAAQAB//8AD3icXU/NTsJAEJ5ZFggxxmCbkiwHAzLTowlu4ejeyxPwCOBR7r3rE/geeubuG3i3TyGts12MtT18ndnd7w8QsvpdX/Q/IAboI9s1rpY3mMTDkcAVDuaqPD0RqRfaU05UGSxJhj2p5wDNUplqyjsZQT6EQ/2mc9GcyBIPReQOObPrkccHMZhgonMS3R1tiLCsDNFm8bgQF3W06ekgqqnN5Aa//D9nlrOgDeg09Aq4lK3RTiX16n621BBVLrIe2PQK09s2c4THyPIvF4TrAndwO5uHvhPUwOa7MNw8FsCtZfZDJBKB66BQhW58cRwHW09OVMEtI+3aOhEHX+E63crM2dh6X+WazMFLvf6F57OvAqiPGvo+87Tb+LrT4X9/7lT6bKXs9vsByDlkyAAAAHicY2BkYGAA4mO9Sxji+W2+MnCzM4DAWZl+bwT9fyuLN+tpIJeDgQkkCgAbqgoOAHicY2BkYGBj+HeXgYGdAQRYvBkYGVABFwA+hgJEAAAAeJxjZ4AAdiBmaWAwBeJSFhAbiJkaGByAGMwGADa+AxEAAAAAAAAAAAAqAFgAdgCUALIA0AEEAAB4nGNgZGBg4GKQYWBiAAEQycgAEnMA8xkABjEAbgAAAHicjZJBaxNBFMf/u0mbJoig5KC3QcRblt2tFCm9lEp701iKIHiZJLPJ0mSnzE5S8h38BB79Nn4ab94E/zN9JVB7MCEzv/3Pm/f+720ADPEbCe4/qXCCAV4Kp+jhrXAHGb4Ld/Ecv4T38Cx5I7yPQfJBuIdPyR/hAzxJa+E+Buk3Zku6fal8xwn9dIRTPMVr4Q6+4kS4S/Wn8B5eJanwPobJO+EefiRfhA/wIv0o3Mcw3YRyV9CYYAmDMRzXll9c6cnSjJ1pyZcU51gzRDMAl2a+XmrCOSwa+Lg7RhgolJxKzv2Yv8cSqwfZ7iILHGHEdcT7OfdDJreNP7dublSZ5epY7QwpMUCxOBoVozIvDh/v4mEx/JsE+MwQx+A6dhO8hA7y2EvwUjLEuLa2jSqyPFcsV/7H0MbxUFMOYwkhVSykODAb10U8OePTDbY8qel0QV3FO1PSvaUqDnh3p5LBB8WxxozqKnZ4TU1T9THfhJ3vsjTcw9M02s1ocWl0a5QzlXHKW+UXRp3Zm62r5wuvWjP1oenKunhS8YUo7/TMrLS7Vtp7V0/WMaSxvp6aNoP8FYKzU9zGOpbOTHidzqvTW9PaFZ/e0+QmtnJBatjAlqLeGHWhm9kWfwGPR6C4eJxjYGIAg/9VDFEM2AAXEDMyMDEyMTIzsjCyMrIxsjNy8CRnpJYV5efF56SmlfDCOEWZ6RklXMmJRakl8Sn55XkcEGZpAVQMpJgbwgQrZSnOLyoBACnGHqgAAAA=)format('woff'),url(tablepress.ttf)format('truetype'),url(tablepress.svg#TablePress)format('svg');font-weight:400;font-style:normal}.tablepress-table-description{clear:both;display:block}.tablepress{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:1em;border:none}.tablepress td,.tablepress th{padding:8px;border:none;background:0 0;text-align:right;float:none!important}.tablepress tbody td{vertical-align:top}.tablepress tbody td,.tablepress tfoot th{border-top:1px solid #ddd}.tablepress tbody tr:first-child td{border-top:0}.tablepress thead th{border-bottom:1px solid #ddd}.tablepress tfoot th,.tablepress thead th{background-color:#d9edf7;font-weight:700;vertical-align:middle}.tablepress .odd td{background-color:#f9f9f9}.tablepress .even td{background-color:#fff}.tablepress .row-hover tr:hover td{background-color:#f3f3f3}.tablepress img{margin:0;padding:0;border:none;max-width:none}.dataTables_wrapper{clear:both;margin-bottom:1em}.dataTables_wrapper .tablepress{clear:both;margin:0!important}.dataTables_length{float:left;white-space:nowrap}.dataTables_filter{float:right;white-space:nowrap}.dataTables_info{clear:both;float:left;margin:4px 0 0}.dataTables_paginate{float:right;margin:4px 0 0;direction:rtl}.dataTables_paginate a{color:#111!important;display:inline-block;outline:0;position:relative;text-decoration:underline;text-decoration:none\0/IE;margin:0 5px}.dataTables_paginate a:first-child{margin-right:0}.dataTables_paginate a:last-child{margin-left:0}.paginate_button:hover{cursor:pointer;text-decoration:none}.paginate_button.disabled{color:#999!important;text-decoration:none;cursor:default}.paginate_button.current{font-weight:700;text-decoration:none;cursor:default}.dataTables_paginate.paging_simple{padding:0 15px}.paging_simple .paginate_button.next:after,.paging_simple .paginate_button.previous:before{text-align:right;font-family:TablePress;font-size:14px;font-weight:700;-webkit-font-smoothing:antialiased;content:"\f054";text-shadow:.1em .1em #666;position:absolute;top:0;right:-14px;bottom:0;left:auto;margin:auto;height:14px;width:14px;line-height:1}.paging_simple .paginate_button.next:after{text-align:left;content:"\f053";right:auto;left:-14px}.paginate_button:after,.paginate_button:before{color:#d9edf7}.paginate_button:hover:after,.paginate_button:hover:before{color:#049cdb}.paginate_button.disabled:after,.paginate_button.disabled:before{color:#f9f9f9}.dataTables_processing{display:none}.dataTables_scroll{clear:both}.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.tablepress .sorting,.tablepress .sorting_asc,.tablepress .sorting_desc{position:relative;padding-left:20px;cursor:pointer;outline:0}.tablepress .sorting:before,.tablepress .sorting_asc:before,.tablepress .sorting_desc:before{font-family:TablePress;font-weight:400;font-size:14px;-webkit-font-smoothing:antialiased;position:absolute;top:0;bottom:0;left:6px;right:auto;margin:auto;height:14px;line-height:1}.tablepress .sorting:before{content:"\f0dc"}.tablepress .sorting_asc:before{content:"\f0d8";padding:0 0 2px}.tablepress .sorting_desc:before{content:"\f0d7"}.dataTables_scrollBody .tablepress thead th:before,.dataTables_wrapper:after{content:""}.tablepress .sorting:hover,.tablepress .sorting_asc,.tablepress .sorting_desc{background-color:#049cdb}.dataTables_wrapper:after{display:block;clear:both;visibility:hidden;line-height:0;height:0}.dataTables_wrapper label input,.dataTables_wrapper label select{display:inline;margin:2px;width:auto}
css/default.css ADDED
@@ -0,0 +1,264 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * TablePress Default CSS
3
+ *
4
+ * Attention: Do not modify this file directly, but use the "Custom CSS" textarea
5
+ * on the "Plugin Options" screen of TablePress.
6
+ *
7
+ * @package TablePress
8
+ * @subpackage Frontend CSS
9
+ * @author Tobias Bäthge, Allan Jardine
10
+ * @since 1.0.0
11
+ */
12
+
13
+ @font-face {
14
+ font-family: 'TablePress';
15
+ src: url(tablepress.eot);
16
+ src: url(tablepress.eot?#ie) format('embedded-opentype'),
17
+ url(data:application/x-font-woff;base64,d09GRgABAAAAAAXYAAwAAAAACXwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABHAAAABwAAAAcZInHOk9TLzIAAAE4AAAAPgAAAGB7NXPDY21hcAAAAXgAAABMAAABUvD45QVnYXNwAAABxAAAAAgAAAAIAAAAEGdseWYAAAHMAAABKQAAAgjYVHFyaGVhZAAAAvgAAAAvAAAANv2jaBNoaGVhAAADKAAAAB0AAAAkCk0F6GhtdHgAAANIAAAAIAAAACgoAADqbG9jYQAAA2gAAAAWAAAAFgJWAbxtYXhwAAADgAAAAB0AAAAgAE4AH25hbWUAAAOgAAAB3AAAA43ZugaUcG9zdAAABXwAAABZAAAAgeNVfAkAAAABAAAAAMwXcmMAAAAAy1XFoAAAAADNHI82eJxjYGbexjiBgZWBhaWHxZiBgaENQjMVM0SB+ThBQWVRMYPDh+APd9gY/gP5bAyMykCKEUmJAgMjAC56Ct8AAHicY2BgYGaAYBkGRgYQ8AHyGMF8FgYDIM0BhEwMDB9CPtz6cOf/fyAr+MN1EIt/A78evy5UFxgwsjHAuYxAPSB9KICRYdgDAL67D8kAAQAB//8AD3icXU/NTsJAEJ5ZFggxxmCbkiwHAzLTowlu4ejeyxPwCOBR7r3rE/geeubuG3i3TyGts12MtT18ndnd7w8QsvpdX/Q/IAboI9s1rpY3mMTDkcAVDuaqPD0RqRfaU05UGSxJhj2p5wDNUplqyjsZQT6EQ/2mc9GcyBIPReQOObPrkccHMZhgonMS3R1tiLCsDNFm8bgQF3W06ekgqqnN5Aa//D9nlrOgDeg09Aq4lK3RTiX16n621BBVLrIe2PQK09s2c4THyPIvF4TrAndwO5uHvhPUwOa7MNw8FsCtZfZDJBKB66BQhW58cRwHW09OVMEtI+3aOhEHX+E63crM2dh6X+WazMFLvf6F57OvAqiPGvo+87Tb+LrT4X9/7lT6bKXs9vsByDlkyAAAAHicY2BkYGAA4mO9Sxji+W2+MnCzM4DAWZl+bwT9fyuLN+tpIJeDgQkkCgAbqgoOAHicY2BkYGBj+HeXgYGdAQRYvBkYGVABFwA+hgJEAAAAeJxjZ4AAdiBmaWAwBeJSFhAbiJkaGByAGMwGADa+AxEAAAAAAAAAAAAqAFgAdgCUALIA0AEEAAB4nGNgZGBg4GKQYWBiAAEQycgAEnMA8xkABjEAbgAAAHicjZJBaxNBFMf/u0mbJoig5KC3QcRblt2tFCm9lEp701iKIHiZJLPJ0mSnzE5S8h38BB79Nn4ab94E/zN9JVB7MCEzv/3Pm/f+720ADPEbCe4/qXCCAV4Kp+jhrXAHGb4Ld/Ecv4T38Cx5I7yPQfJBuIdPyR/hAzxJa+E+Buk3Zku6fal8xwn9dIRTPMVr4Q6+4kS4S/Wn8B5eJanwPobJO+EefiRfhA/wIv0o3Mcw3YRyV9CYYAmDMRzXll9c6cnSjJ1pyZcU51gzRDMAl2a+XmrCOSwa+Lg7RhgolJxKzv2Yv8cSqwfZ7iILHGHEdcT7OfdDJreNP7dublSZ5epY7QwpMUCxOBoVozIvDh/v4mEx/JsE+MwQx+A6dhO8hA7y2EvwUjLEuLa2jSqyPFcsV/7H0MbxUFMOYwkhVSykODAb10U8OePTDbY8qel0QV3FO1PSvaUqDnh3p5LBB8WxxozqKnZ4TU1T9THfhJ3vsjTcw9M02s1ocWl0a5QzlXHKW+UXRp3Zm62r5wuvWjP1oenKunhS8YUo7/TMrLS7Vtp7V0/WMaSxvp6aNoP8FYKzU9zGOpbOTHidzqvTW9PaFZ/e0+QmtnJBatjAlqLeGHWhm9kWfwGPR6C4eJxjYGIAg/9VDFEM2AAXEDMyMDEyMTIzsjCyMrIxsjNy8CRnpJYV5efF56SmlfDCOEWZ6RklXMmJRakl8Sn55XkcEGZpAVQMpJgbwgQrZSnOLyoBACnGHqgAAAA=) format('woff'),
18
+ url(tablepress.ttf) format('truetype'),
19
+ url(tablepress.svg#TablePress) format('svg');
20
+ font-weight: normal;
21
+ font-style: normal;
22
+ }
23
+
24
+ /* Table description */
25
+ .tablepress-table-description {
26
+ clear: both;
27
+ display: block;
28
+ }
29
+
30
+ .tablepress {
31
+ border-collapse: collapse;
32
+ border-spacing: 0;
33
+ width: 100%;
34
+ margin-bottom: 1em;
35
+ border: none;
36
+ }
37
+
38
+ .tablepress th,
39
+ .tablepress td {
40
+ padding: 8px;
41
+ border: none;
42
+ background: none;
43
+ text-align: left;
44
+ float: none !important;
45
+ }
46
+ .tablepress tbody td {
47
+ vertical-align: top;
48
+ }
49
+
50
+ /* Horizontal borders */
51
+ .tablepress tbody td,
52
+ .tablepress tfoot th {
53
+ border-top: 1px solid #dddddd;
54
+ }
55
+ .tablepress tbody tr:first-child td {
56
+ border-top: 0;
57
+ }
58
+ .tablepress thead th {
59
+ border-bottom: 1px solid #dddddd;
60
+ }
61
+
62
+ /* Row background colors */
63
+ .tablepress thead th,
64
+ .tablepress tfoot th {
65
+ background-color: #d9edf7;
66
+ font-weight: bold;
67
+ vertical-align: middle;
68
+ }
69
+ .tablepress .odd td {
70
+ background-color: #f9f9f9;
71
+ }
72
+ .tablepress .even td {
73
+ background-color: #ffffff;
74
+ }
75
+ .tablepress .row-hover tr:hover td {
76
+ background-color: #f3f3f3;
77
+ }
78
+
79
+ /* Reset image layout in tables */
80
+ .tablepress img {
81
+ margin: 0;
82
+ padding: 0;
83
+ border: none;
84
+ max-width: none;
85
+ }
86
+
87
+ /* Table wrapper */
88
+ .dataTables_wrapper {
89
+ clear: both;
90
+ margin-bottom: 1em;
91
+ }
92
+ .dataTables_wrapper .tablepress {
93
+ clear: both;
94
+ margin: 0 !important;
95
+ }
96
+
97
+ /* Length Change menu */
98
+ .dataTables_length {
99
+ float: left;
100
+ white-space: nowrap;
101
+ }
102
+
103
+ /* Filter/Search */
104
+ .dataTables_filter {
105
+ float: right;
106
+ white-space: nowrap;
107
+ }
108
+
109
+ /* Table information */
110
+ .dataTables_info {
111
+ clear: both;
112
+ float: left;
113
+ margin: 4px 0 0;
114
+ }
115
+
116
+ /* Pagination */
117
+ .dataTables_paginate {
118
+ float: right;
119
+ margin: 4px 0 0;
120
+ }
121
+ .dataTables_paginate a {
122
+ color: #111111 !important;
123
+ display: inline-block;
124
+ outline: none;
125
+ position: relative;
126
+ text-decoration: underline;
127
+ text-decoration: none\0/IE; /* Hack for IE8, IE9, and IE10pp4, as those have trouble with text-decoration in :after pseudo-elements */
128
+ margin: 0 5px;
129
+ }
130
+ .dataTables_paginate a:first-child {
131
+ margin-left: 0;
132
+ }
133
+ .dataTables_paginate a:last-child {
134
+ margin-right: 0;
135
+ }
136
+ .paginate_button:hover {
137
+ cursor: pointer;
138
+ text-decoration: none;
139
+ }
140
+ .paginate_button.disabled {
141
+ color: #999999 !important;
142
+ text-decoration: none;
143
+ cursor: default;
144
+ }
145
+ .paginate_button.current {
146
+ font-weight: bold;
147
+ text-decoration: none;
148
+ cursor: default;
149
+ }
150
+ /* Two button pagination - previous/next */
151
+ .dataTables_paginate.paging_simple {
152
+ padding: 0 15px;
153
+ }
154
+ .paging_simple .paginate_button.previous:before,
155
+ .paging_simple .paginate_button.next:after {
156
+ text-align: left;
157
+ font-family: TablePress;
158
+ font-size: 14px;
159
+ font-weight: bold;
160
+ -webkit-font-smoothing: antialiased;
161
+ content: "\f053";
162
+ text-shadow: 0.1em 0.1em #666666;
163
+ position: absolute;
164
+ top: 0;
165
+ right: auto;
166
+ bottom: 0;
167
+ left: -14px;
168
+ margin: auto;
169
+ height: 14px;
170
+ width: 14px;
171
+ line-height: 1;
172
+ }
173
+ .paging_simple .paginate_button.next:after {
174
+ text-align: right;
175
+ content: "\f054";
176
+ left: auto;
177
+ }
178
+ .paginate_button:before,
179
+ .paginate_button:after {
180
+ color: #d9edf7;
181
+ }
182
+ .paginate_button:hover:before,
183
+ .paginate_button:hover:after {
184
+ color: #049cdb;
185
+ }
186
+ .paginate_button.disabled:before,
187
+ .paginate_button.disabled:after {
188
+ color: #f9f9f9;
189
+ }
190
+
191
+ /* Processing indicator */
192
+ .dataTables_processing {
193
+ display: none; /* always hidden, we don't use it */
194
+ }
195
+
196
+ /* Scrolling */
197
+ .dataTables_scroll {
198
+ clear: both;
199
+ }
200
+ .dataTables_scrollBody {
201
+ -webkit-overflow-scrolling: touch;
202
+ }
203
+
204
+ /* Sorting */
205
+ .tablepress .sorting,
206
+ .tablepress .sorting_asc,
207
+ .tablepress .sorting_desc {
208
+ position: relative;
209
+ padding-right: 20px; /* more right padding for sort arrows */
210
+ cursor: pointer;
211
+ outline: none;
212
+ }
213
+ .tablepress .sorting:after,
214
+ .tablepress .sorting_asc:after,
215
+ .tablepress .sorting_desc:after {
216
+ font-family: TablePress;
217
+ font-weight: normal;
218
+ font-size: 14px;
219
+ -webkit-font-smoothing: antialiased;
220
+ position: absolute;
221
+ top: 0;
222
+ bottom: 0;
223
+ left: auto;
224
+ right: 6px;
225
+ margin: auto;
226
+ height: 14px;
227
+ line-height: 1;
228
+ }
229
+ .tablepress .sorting:after {
230
+ content: "\f0dc";
231
+ }
232
+ .tablepress .sorting_asc:after {
233
+ content: "\f0d8";
234
+ padding: 0 0 2px;
235
+ }
236
+ .tablepress .sorting_desc:after {
237
+ content: "\f0d7";
238
+ }
239
+ .tablepress .sorting:hover,
240
+ .tablepress .sorting_asc,
241
+ .tablepress .sorting_desc {
242
+ background-color: #049cdb;
243
+ }
244
+ /* Hide the sorting arrows in the extra table that is added for scrolling */
245
+ .dataTables_scrollBody .tablepress thead th:after {
246
+ content: "";
247
+ }
248
+
249
+ /* Self clearing */
250
+ .dataTables_wrapper:after {
251
+ content: "";
252
+ display: block;
253
+ clear: both;
254
+ visibility: hidden;
255
+ line-height: 0;
256
+ height: 0;
257
+ }
258
+
259
+ .dataTables_wrapper label input,
260
+ .dataTables_wrapper label select {
261
+ display: inline;
262
+ margin: 2px;
263
+ width: auto;
264
+ }
css/default.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @font-face{font-family:TablePress;src:url(tablepress.eot);src:url(tablepress.eot?#ie)format('embedded-opentype'),url(data:application/x-font-woff;base64,d09GRgABAAAAAAXYAAwAAAAACXwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABHAAAABwAAAAcZInHOk9TLzIAAAE4AAAAPgAAAGB7NXPDY21hcAAAAXgAAABMAAABUvD45QVnYXNwAAABxAAAAAgAAAAIAAAAEGdseWYAAAHMAAABKQAAAgjYVHFyaGVhZAAAAvgAAAAvAAAANv2jaBNoaGVhAAADKAAAAB0AAAAkCk0F6GhtdHgAAANIAAAAIAAAACgoAADqbG9jYQAAA2gAAAAWAAAAFgJWAbxtYXhwAAADgAAAAB0AAAAgAE4AH25hbWUAAAOgAAAB3AAAA43ZugaUcG9zdAAABXwAAABZAAAAgeNVfAkAAAABAAAAAMwXcmMAAAAAy1XFoAAAAADNHI82eJxjYGbexjiBgZWBhaWHxZiBgaENQjMVM0SB+ThBQWVRMYPDh+APd9gY/gP5bAyMykCKEUmJAgMjAC56Ct8AAHicY2BgYGaAYBkGRgYQ8AHyGMF8FgYDIM0BhEwMDB9CPtz6cOf/fyAr+MN1EIt/A78evy5UFxgwsjHAuYxAPSB9KICRYdgDAL67D8kAAQAB//8AD3icXU/NTsJAEJ5ZFggxxmCbkiwHAzLTowlu4ejeyxPwCOBR7r3rE/geeubuG3i3TyGts12MtT18ndnd7w8QsvpdX/Q/IAboI9s1rpY3mMTDkcAVDuaqPD0RqRfaU05UGSxJhj2p5wDNUplqyjsZQT6EQ/2mc9GcyBIPReQOObPrkccHMZhgonMS3R1tiLCsDNFm8bgQF3W06ekgqqnN5Aa//D9nlrOgDeg09Aq4lK3RTiX16n621BBVLrIe2PQK09s2c4THyPIvF4TrAndwO5uHvhPUwOa7MNw8FsCtZfZDJBKB66BQhW58cRwHW09OVMEtI+3aOhEHX+E63crM2dh6X+WazMFLvf6F57OvAqiPGvo+87Tb+LrT4X9/7lT6bKXs9vsByDlkyAAAAHicY2BkYGAA4mO9Sxji+W2+MnCzM4DAWZl+bwT9fyuLN+tpIJeDgQkkCgAbqgoOAHicY2BkYGBj+HeXgYGdAQRYvBkYGVABFwA+hgJEAAAAeJxjZ4AAdiBmaWAwBeJSFhAbiJkaGByAGMwGADa+AxEAAAAAAAAAAAAqAFgAdgCUALIA0AEEAAB4nGNgZGBg4GKQYWBiAAEQycgAEnMA8xkABjEAbgAAAHicjZJBaxNBFMf/u0mbJoig5KC3QcRblt2tFCm9lEp701iKIHiZJLPJ0mSnzE5S8h38BB79Nn4ab94E/zN9JVB7MCEzv/3Pm/f+720ADPEbCe4/qXCCAV4Kp+jhrXAHGb4Ld/Ecv4T38Cx5I7yPQfJBuIdPyR/hAzxJa+E+Buk3Zku6fal8xwn9dIRTPMVr4Q6+4kS4S/Wn8B5eJanwPobJO+EefiRfhA/wIv0o3Mcw3YRyV9CYYAmDMRzXll9c6cnSjJ1pyZcU51gzRDMAl2a+XmrCOSwa+Lg7RhgolJxKzv2Yv8cSqwfZ7iILHGHEdcT7OfdDJreNP7dublSZ5epY7QwpMUCxOBoVozIvDh/v4mEx/JsE+MwQx+A6dhO8hA7y2EvwUjLEuLa2jSqyPFcsV/7H0MbxUFMOYwkhVSykODAb10U8OePTDbY8qel0QV3FO1PSvaUqDnh3p5LBB8WxxozqKnZ4TU1T9THfhJ3vsjTcw9M02s1ocWl0a5QzlXHKW+UXRp3Zm62r5wuvWjP1oenKunhS8YUo7/TMrLS7Vtp7V0/WMaSxvp6aNoP8FYKzU9zGOpbOTHidzqvTW9PaFZ/e0+QmtnJBatjAlqLeGHWhm9kWfwGPR6C4eJxjYGIAg/9VDFEM2AAXEDMyMDEyMTIzsjCyMrIxsjNy8CRnpJYV5efF56SmlfDCOEWZ6RklXMmJRakl8Sn55XkcEGZpAVQMpJgbwgQrZSnOLyoBACnGHqgAAAA=)format('woff'),url(tablepress.ttf)format('truetype'),url(tablepress.svg#TablePress)format('svg');font-weight:400;font-style:normal}.tablepress-table-description{clear:both;display:block}.tablepress{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:1em;border:none}.tablepress td,.tablepress th{padding:8px;border:none;background:0 0;text-align:left;float:none!important}.tablepress tbody td{vertical-align:top}.tablepress tbody td,.tablepress tfoot th{border-top:1px solid #ddd}.tablepress tbody tr:first-child td{border-top:0}.tablepress thead th{border-bottom:1px solid #ddd}.tablepress tfoot th,.tablepress thead th{background-color:#d9edf7;font-weight:700;vertical-align:middle}.tablepress .odd td{background-color:#f9f9f9}.tablepress .even td{background-color:#fff}.tablepress .row-hover tr:hover td{background-color:#f3f3f3}.tablepress img{margin:0;padding:0;border:none;max-width:none}.dataTables_wrapper{clear:both;margin-bottom:1em}.dataTables_wrapper .tablepress{clear:both;margin:0!important}.dataTables_length{float:left;white-space:nowrap}.dataTables_filter{float:right;white-space:nowrap}.dataTables_info{clear:both;float:left;margin:4px 0 0}.dataTables_paginate{float:right;margin:4px 0 0}.dataTables_paginate a{color:#111!important;display:inline-block;outline:0;position:relative;text-decoration:underline;text-decoration:none\0/IE;margin:0 5px}.dataTables_paginate a:first-child{margin-left:0}.dataTables_paginate a:last-child{margin-right:0}.paginate_button:hover{cursor:pointer;text-decoration:none}.paginate_button.disabled{color:#999!important;text-decoration:none;cursor:default}.paginate_button.current{font-weight:700;text-decoration:none;cursor:default}.dataTables_paginate.paging_simple{padding:0 15px}.paging_simple .paginate_button.next:after,.paging_simple .paginate_button.previous:before{text-align:left;font-family:TablePress;font-size:14px;font-weight:700;-webkit-font-smoothing:antialiased;content:"\f053";text-shadow:.1em .1em #666;position:absolute;top:0;right:auto;bottom:0;left:-14px;margin:auto;height:14px;width:14px;line-height:1}.paging_simple .paginate_button.next:after{text-align:right;content:"\f054";left:auto}.paginate_button:after,.paginate_button:before{color:#d9edf7}.paginate_button:hover:after,.paginate_button:hover:before{color:#049cdb}.paginate_button.disabled:after,.paginate_button.disabled:before{color:#f9f9f9}.dataTables_processing{display:none}.dataTables_scroll{clear:both}.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.tablepress .sorting,.tablepress .sorting_asc,.tablepress .sorting_desc{position:relative;padding-right:20px;cursor:pointer;outline:0}.tablepress .sorting:after,.tablepress .sorting_asc:after,.tablepress .sorting_desc:after{font-family:TablePress;font-weight:400;font-size:14px;-webkit-font-smoothing:antialiased;position:absolute;top:0;bottom:0;left:auto;right:6px;margin:auto;height:14px;line-height:1}.tablepress .sorting:after{content:"\f0dc"}.tablepress .sorting_asc:after{content:"\f0d8";padding:0 0 2px}.tablepress .sorting_desc:after{content:"\f0d7"}.dataTables_scrollBody .tablepress thead th:after,.dataTables_wrapper:after{content:""}.tablepress .sorting:hover,.tablepress .sorting_asc,.tablepress .sorting_desc{background-color:#049cdb}.dataTables_wrapper:after{display:block;clear:both;visibility:hidden;line-height:0;height:0}.dataTables_wrapper label input,.dataTables_wrapper label select{display:inline;margin:2px;width:auto}
css/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
css/tablepress.eot ADDED
Binary file
css/tablepress.svg ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg>
4
+ <metadata>
5
+ Created by FontForge 20120702 at Wed Jan 16 18:09:38 2013
6
+
7
+
8
+ </metadata>
9
+ <defs>
10
+ <font id="TablePress" horiz-adv-x="1024" >
11
+ <font-face
12
+ font-family="TablePress"
13
+ font-weight="400"
14
+ font-stretch="normal"
15
+ units-per-em="1792"
16
+ panose-1="0 0 0 0 0 0 0 0 0 0"
17
+ ascent="1536"
18
+ descent="-256"
19
+ bbox="0 -75 1099 1483"
20
+ underline-thickness="90"
21
+ underline-position="-89"
22
+ unicode-range="U+0020-F519"
23
+ />
24
+ <missing-glyph />
25
+ <glyph glyph-name="chevron_left" unicode="&#xf053;" horiz-adv-x="1152"
26
+ d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
27
+ <glyph glyph-name="chevron_right" unicode="&#xf054;" horiz-adv-x="1152"
28
+ d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
29
+ <glyph glyph-name="caret_down" unicode="&#xf0d7;"
30
+ d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
31
+ <glyph glyph-name="caret_up" unicode="&#xf0d8;"
32
+ d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
33
+ <glyph glyph-name="caret_left" unicode="&#xf0d9;" horiz-adv-x="640"
34
+ d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
35
+ <glyph glyph-name="caret_right" unicode="&#xf0da;" horiz-adv-x="640"
36
+ d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
37
+ <glyph glyph-name="sort" unicode="&#xf0dc;"
38
+ d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
39
+ </font>
40
+ </defs></svg>
css/tablepress.ttf ADDED
Binary file
css/tablepress.woff ADDED
Binary file
css/warning.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ ATTENTION:
2
+
3
+ Do not edit or modify the files in this directory, as they might be changed in future plugin versions.
4
+ This would lead to a loss of your changes!
5
+
6
+ If you want to apply custom changes to the CSS code of the plugin,
7
+ please add those to the "Custom CSS" textarea on the "Plugin Options"
8
+ screen of TablePress.
9
+
10
+ Thank you!
i18n/datatables/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
i18n/datatables/lang-ar.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "إظهار _START_ إلى _END_ من أصل _TOTAL_ مُدخل",
3
+ "infoEmpty": "يعرض 0 إلى 0 من أصل 0 سجلّ",
4
+ "infoFiltered": "(منتقاة من مجموع _MAX_ مُدخل)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "أظهر مُدخلات _MENU_",
7
+ "processing": "جاري التحميل...",
8
+ "search": "ابحث:",
9
+ "zeroRecords": "لم يُعثر على أية سجلات",
10
+ "paginate": {
11
+ "first": "الأول",
12
+ "previous": "السابق",
13
+ "next": "التالي",
14
+ "last": "الأخير"
15
+ }
16
+ }
i18n/datatables/lang-az.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Cədvəldə heç bir məlumat yoxdur",
3
+ "info": " _TOTAL_ Nəticədən _START_ - _END_ Arası Nəticələr",
4
+ "infoEmpty": "Nəticə Yoxdur",
5
+ "infoFiltered": "( _MAX_ Nəticə İçindən Tapılanlar)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Səhifədə _MENU_ Nəticə Göstər",
8
+ "loadingRecords": "Yüklənir...",
9
+ "processing": "Gözləyin...",
10
+ "search": "Axtarış:",
11
+ "zeroRecords": "Nəticə Tapılmadı.",
12
+ "paginate": {
13
+ "first": "İlk",
14
+ "previous": "Öncəki",
15
+ "next": "Sonraki",
16
+ "last": "Axırıncı"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": sütunu artma sırası üzərə aktiv etmək",
20
+ "sortDescending": ": sütunu azalma sırası üzərə aktiv etmək"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-bel.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Запісы з _START_ па _END_ з _TOTAL_ запісаў",
3
+ "infoEmpty": "Запісы з 0 па 0 з 0 запісаў",
4
+ "infoFiltered": "(адфільтравана з _MAX_ запісаў)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Паказваць _MENU_ запісаў",
7
+ "processing": "Пачакайце...",
8
+ "search": "Пошук:",
9
+ "zeroRecords": "Запісы адсутнічаюць.",
10
+ "paginate": {
11
+ "first": "Першая",
12
+ "previous": "Папярэдняя",
13
+ "next": "Наступная",
14
+ "last": "Апошняя"
15
+ },
16
+ "aria": {
17
+ "sortAscending": ": актываваць для сартавання слупка па ўзрастанні",
18
+ "sortDescending": ": актываваць для сартавання слупка па змяншэнні"
19
+ },
20
+ "decimal": ",",
21
+ "thousands": "."
22
+ }
i18n/datatables/lang-bg_BG.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Показване на резултати от _START_ до _END_ от общо _TOTAL_",
3
+ "infoEmpty": "Показване на резултати от 0 до 0 от общо 0",
4
+ "infoFiltered": "(филтрирани от общо _MAX_ резултата)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Показване на _MENU_ резултата",
7
+ "processing": "Обработка на резултатите...",
8
+ "search": "Търсене във всички колони:",
9
+ "zeroRecords": "Няма намерени резултати",
10
+ "paginate": {
11
+ "first": "Първа",
12
+ "previous": "Предишна",
13
+ "next": "Следваща",
14
+ "last": "Последна"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-cs_CZ.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Zobrazuji _START_ až _END_ z celkem _TOTAL_ záznamů",
3
+ "infoEmpty": "Zobrazuji 0 až 0 z 0 záznamů",
4
+ "infoFiltered": "(filtrováno z celkem _MAX_ záznamů)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Zobraz záznamů _MENU_",
7
+ "processing": "Provádím...",
8
+ "search": "Hledat:",
9
+ "zeroRecords": "Žádné záznamy nebyly nalezeny",
10
+ "paginate": {
11
+ "first": "První",
12
+ "previous": "Předchozí",
13
+ "next": "Další",
14
+ "last": "Poslední"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-da_DK.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Viser _START_ til _END_ af _TOTAL_ linjer",
3
+ "infoEmpty": "Viser 0 til 0 af 0 linjer",
4
+ "infoFiltered": "(filtreret fra _MAX_ linjer)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Vis _MENU_ linjer",
7
+ "processing": "Henter...",
8
+ "search": "Søg:",
9
+ "zeroRecords": "Ingen linjer matcher søgningen",
10
+ "paginate": {
11
+ "first": "Første",
12
+ "previous": "Forrige",
13
+ "next": "Næste",
14
+ "last": "Sidste"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-de_DE.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Keine Einträge vorhanden.",
3
+ "info": "_START_ bis _END_ von _TOTAL_ Einträgen",
4
+ "infoEmpty": "0 bis 0 von 0 Einträgen",
5
+ "infoFiltered": "(gefiltert von _MAX_ Einträgen)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "_MENU_ Einträge anzeigen",
8
+ "loadingRecords": "Lädt...",
9
+ "processing": "Bitte warten...",
10
+ "search": "Suchen:",
11
+ "zeroRecords": "Keine Einträge vorhanden.",
12
+ "paginate": {
13
+ "first": "Anfang",
14
+ "previous": "Zurück",
15
+ "next": "Weiter",
16
+ "last": "Ende"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": aktivieren, um Spalte aufsteigend zu sortieren",
20
+ "sortDescending": ": aktivieren, um Spalte absteigend zu sortieren"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-el.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Δείχνοντας _START_ εως _END_ από _TOTAL_ εγγραφές",
3
+ "infoEmpty": "Δείχνοντας 0 εως 0 από 0 εγγραφές",
4
+ "infoFiltered": "(φιλτραρισμένες από _MAX_ συνολικά εγγραφές)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Δείξε _MENU_ εγγραφές",
7
+ "processing": "Επεξεργασία...",
8
+ "search": "Αναζήτηση:",
9
+ "zeroRecords": "Δεν βρέθηκαν εγγραφές που να ταιριάζουν",
10
+ "paginate": {
11
+ "first": "Πρώτη",
12
+ "previous": "Προηγούμενη",
13
+ "next": "Επόμενη",
14
+ "last": "Τελευταία"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-en_US.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "No data available in table",
3
+ "info": "Showing _START_ to _END_ of _TOTAL_ entries",
4
+ "infoEmpty": "Showing 0 to 0 of 0 entries",
5
+ "infoFiltered": "(filtered from _MAX_ total entries)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Show _MENU_ entries",
8
+ "loadingRecords": "Loading...",
9
+ "processing": "Processing...",
10
+ "search": "Search:",
11
+ "zeroRecords": "No matching records found",
12
+ "paginate": {
13
+ "first": "First",
14
+ "previous": "Previous",
15
+ "next": "Next",
16
+ "last": "Last"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": activate to sort column ascending",
20
+ "sortDescending": ": activate to sort column descending"
21
+ },
22
+ "decimal": "",
23
+ "thousands": ","
24
+ }
i18n/datatables/lang-es_ES.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Ningún dato disponible en esta tabla",
3
+ "info": "Mostrando desde _START_ hasta _END_ de _TOTAL_ registros",
4
+ "infoEmpty": "Mostrando desde 0 hasta 0 de 0 registros",
5
+ "infoFiltered": "(filtrado de _MAX_ registros en total)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Mostrar _MENU_ registros",
8
+ "loadingRecords": "Cargando...",
9
+ "processing": "Procesando...",
10
+ "search": "Buscar:",
11
+ "zeroRecords": "No se encontraron resultados",
12
+ "paginate": {
13
+ "first": "Primero",
14
+ "previous": "Anterior",
15
+ "next": "Siguiente",
16
+ "last": "Último"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": Activar para ordenar la columna de manera ascendente",
20
+ "sortDescending": ": Activar para ordenar la columna de manera descendente"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-et.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Kuvatud: _TOTAL_ kirjet (_START_-_END_)",
3
+ "infoEmpty": "Otsinguvasteid ei leitud",
4
+ "infoFiltered": " - filteeritud _MAX_ kirje seast.",
5
+ "infoPostFix": "Kõik kuvatud kirjed põhinevad reaalsetel tulemustel.",
6
+ "lengthMenu": "Näita kirjeid _MENU_ kaupa",
7
+ "processing": "Palun oodake, koostan kuvamiseks nimekirja!",
8
+ "search": "Otsi kõikide tulemuste seast:",
9
+ "zeroRecords": "Otsitavat vastet ei leitud.",
10
+ "paginate": {
11
+ "first": "Algus",
12
+ "previous": "Eelmine",
13
+ "next": "Järgmine",
14
+ "last": "Viimane"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-fa_IR.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "نمایش _START_ تا _END_ از مجموع _TOTAL_ مورد",
3
+ "infoEmpty": "تهی",
4
+ "infoFiltered": "(فیلتر شده از مجموع _MAX_ مورد)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "نمایش محتویات _MENU_",
7
+ "processing": "درحال پردازش...",
8
+ "search": "جستجو:",
9
+ "zeroRecords": "موردی یافت نشد",
10
+ "paginate": {
11
+ "first": "ابتدا",
12
+ "previous": "قبلی",
13
+ "next": "بعدی",
14
+ "last": "انتها"
15
+ }
16
+ }
i18n/datatables/lang-fi.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Näytetään rivit _START_ - _END_ (yhteensä _TOTAL_ )",
3
+ "infoEmpty": "Näytetään 0 - 0 (yhteensä 0)",
4
+ "infoFiltered": "(suodatettu _MAX_ tuloksen joukosta)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Näytä kerralla _MENU_ riviä",
7
+ "processing": "Hetkinen...",
8
+ "search": "Etsi:",
9
+ "zeroRecords": "Tietoja ei löytynyt",
10
+ "paginate": {
11
+ "first": "Ensimmäinen",
12
+ "previous": "Edellinen",
13
+ "next": "Seuraava",
14
+ "last": "Viimeinen"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-fr_FR.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Aucun élément à afficher",
3
+ "info": "Affichage de l'élement _START_ à _END_ sur _TOTAL_ éléments",
4
+ "infoEmpty": "Affichage de l'élement 0 à 0 sur 0 éléments",
5
+ "infoFiltered": "(filtré de _MAX_ éléments au total)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Afficher _MENU_ éléments",
8
+ "loadingRecords": "Chargement en cours...",
9
+ "processing": "Traitement en cours...",
10
+ "search": "Rechercher:",
11
+ "zeroRecords": "Aucun élément à afficher",
12
+ "paginate": {
13
+ "first": "Premier",
14
+ "previous": "Précédent",
15
+ "next": "Suivant",
16
+ "last": "Dernier"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": activer pour trier la colonne par ordre croissant",
20
+ "sortDescending": ": activer pour trier la colonne par ordre décroissant"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-ga.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "_START_ Showing a _END_ na n-iontrálacha _TOTAL_",
3
+ "infoEmpty": "Showing 0-0 na n-iontrálacha 0",
4
+ "infoFiltered": "(scagtha ó _MAX_ iontrálacha iomlán)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Taispeáin iontrálacha _MENU_",
7
+ "processing": "Próiseáil...",
8
+ "search": "Cuardaigh:",
9
+ "zeroRecords": "Gan aon taifead meaitseáil aimsithe",
10
+ "paginate": {
11
+ "first": "An Chéad",
12
+ "previous": "Roimhe Seo",
13
+ "next": "Ar Aghaidh",
14
+ "last": "Last"
15
+ },
16
+ "decimal": "",
17
+ "thousands": ","
18
+ }
i18n/datatables/lang-he_IL.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "_START_ עד _END_ מתוך _TOTAL_ רשומות" ,
3
+ "infoEmpty": "0 עד 0 מתוך 0 רשומות",
4
+ "infoFiltered": "(מסונן מסך _MAX_ רשומות)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "הצג _MENU_ פריטים",
7
+ "processing": "מעבד...",
8
+ "search": "חפש:",
9
+ "zeroRecords": "לא נמצאו רשומות מתאימות",
10
+ "paginate": {
11
+ "first": "ראשון",
12
+ "previous": "קודם",
13
+ "next": "הבא",
14
+ "last": "אחרון"
15
+ },
16
+ "decimal": "",
17
+ "thousands": ","
18
+ }
i18n/datatables/lang-hi_IN.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "_START_ to _END_ of _TOTAL_ प्रविष्टियां दिखा रहे हैं",
3
+ "infoEmpty": "0 में से 0 से 0 प्रविष्टियां दिखा रहे हैं",
4
+ "infoFiltered": "(_MAX_ कुल प्रविष्टियों में से छठा हुआ)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": " _MENU_ प्रविष्टियां दिखाएं ",
7
+ "processing": "प्रगति पे हैं ...",
8
+ "search": "खोजें:",
9
+ "zeroRecords": "रिकॉर्ड्स का मेल नहीं मिला",
10
+ "paginate": {
11
+ "first": "प्रथम",
12
+ "previous": "पिछला",
13
+ "next": "अगला",
14
+ "last": "अंतिम"
15
+ },
16
+ "decimal": "",
17
+ "thousands": ","
18
+ }
i18n/datatables/lang-hr.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Nema podataka u tablici",
3
+ "info": "Prikazano _START_ do _END_ od _TOTAL_ rezultata",
4
+ "infoEmpty": "Prikazano 0 do 0 od 0 rezultata",
5
+ "infoFiltered": "(filtrirano iz _MAX_ ukupnih rezultata)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Prikaži _MENU_ rezultata po stranici",
8
+ "loadingRecords": "Dohvaćam...",
9
+ "processing": "Procesiram...",
10
+ "search": "Pretraži:",
11
+ "zeroRecords": "Ništa nije pronađeno",
12
+ "paginate": {
13
+ "first": "Prva",
14
+ "previous": "Nazad",
15
+ "next": "Naprijed",
16
+ "last": "Zadnja"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": aktiviraj za rastući poredak",
20
+ "sortDescending": ": aktiviraj za padajući poredak"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-hu_HU.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Nincs rendelkezésre álló adat",
3
+ "info": "Találatok: _START_ - _END_ Összesen: _TOTAL_",
4
+ "infoEmpty": "Nulla találat",
5
+ "infoFiltered": "(_MAX_ összes rekord közül szűrve)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "_MENU_ találat oldalanként",
8
+ "loadingRecords": "Betöltés...",
9
+ "processing": "Feldolgozás...",
10
+ "search": "Keresés:",
11
+ "zeroRecords": "Nincs a keresésnek megfelelő találat",
12
+ "paginate": {
13
+ "first": "Első",
14
+ "previous": "Előző",
15
+ "next": "Következő",
16
+ "last": "Utolsó"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": aktiválja a növekvő rendezéshez",
20
+ "sortDescending": ": aktiválja a csökkenő rendezéshez"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": " "
24
+ }
i18n/datatables/lang-id_ID.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Menampilkan _START_ sampai _END_ dari _TOTAL_ entri",
3
+ "infoEmpty": "Menampilkan 0 sampai 0 dari 0 entri",
4
+ "infoFiltered": "(disaring dari _MAX_ entri keseluruhan)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Tampilkan _MENU_ entri",
7
+ "processing": "Sedang memproses...",
8
+ "search": "Cari:",
9
+ "zeroRecords": "Tidak ditemukan data yang sesuai",
10
+ "paginate": {
11
+ "first": "Pertama",
12
+ "previous": "Sebelumnya",
13
+ "next": "Selanjutnya",
14
+ "last": "Terakhir"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-is_IS.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Engin gögn eru í þessari töflu",
3
+ "info": "Sýni _START_ til _END_ af _TOTAL_ færslum",
4
+ "infoEmpty": "Sýni 0 til 0 af 0 færslum",
5
+ "infoFiltered": "(síað út frá _MAX_ færslum)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Sýna _MENU_ færslur",
8
+ "loadingRecords": "Hleð...",
9
+ "processing": "Úrvinnsla...",
10
+ "search": "Leita:",
11
+ "zeroRecords": "Engar færslur fundust",
12
+ "paginate": {
13
+ "first": "Fyrsta",
14
+ "previous": "Fyrri",
15
+ "next": "Næsta",
16
+ "last": "Síðasta"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": virkja til að raða dálki í hækkandi röð",
20
+ "sortDescending": ": virkja til að raða dálki lækkandi í röð"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-it_IT.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Nessun dato presente nella tabella",
3
+ "info": "Vista da _START_ a _END_ di _TOTAL_ elementi",
4
+ "infoEmpty": "Vista da 0 a 0 di 0 elementi",
5
+ "infoFiltered": "(filtrati da _MAX_ elementi totali)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Visualizza _MENU_ elementi",
8
+ "loadingRecords": "Caricamento...",
9
+ "processing": "Caricamento...",
10
+ "search": "Cerca:",
11
+ "zeroRecords": "La ricerca non ha portato alcun risultato.",
12
+ "paginate": {
13
+ "first": "Inizio",
14
+ "previous": "Precedente",
15
+ "next": "Successivo",
16
+ "last": "Fine"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": attiva per ordinare la colonna in ordine crescente",
20
+ "sortDescending": ": attiva per ordinare la colonna in ordine decrescente"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-ja.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "_TOTAL_ 件中 _START_ から _END_ まで表示",
3
+ "infoEmpty": "0 件中 0 から 0 まで表示",
4
+ "infoFiltered": "全 _MAX_ 件より抽出)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "_MENU_ 件表示",
7
+ "processing": "処理中...",
8
+ "search": "検索:",
9
+ "zeroRecords": "データはありません。",
10
+ "paginate": {
11
+ "first": "先頭",
12
+ "previous": "前",
13
+ "next": "次",
14
+ "last": "最終"
15
+ },
16
+ "decimal": "",
17
+ "thousands": ","
18
+ }
i18n/datatables/lang-ko_KR.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "데이터가 없습니다",
3
+ "info": "_START_ - _END_ / _TOTAL_",
4
+ "infoEmpty": "0 - 0 / 0",
5
+ "infoFiltered": "(총 _MAX_ 개)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "페이지당 줄수 _MENU_",
8
+ "loadingRecords": "읽는중...",
9
+ "processing": "처리중...",
10
+ "search": "검색:",
11
+ "zeroRecords": "검색 결과가 없습니다",
12
+ "paginate": {
13
+ "first": "처음",
14
+ "previous": "이전",
15
+ "next": "다음",
16
+ "last": "마지막"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": 오름차순 정렬",
20
+ "sortDescending": ": 내림차순 정렬"
21
+ },
22
+ "decimal": "",
23
+ "thousands": ","
24
+ }
i18n/datatables/lang-lt_LT.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Rodomi įrašai nuo _START_ iki _END_ iš _TOTAL_ įrašų",
3
+ "infoEmpty": "Rodomi įrašai nuo 0 iki 0 iš 0",
4
+ "infoFiltered": "(atrinkta iš _MAX_ įrašų)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Rodyti _MENU_ įrašus",
7
+ "processing": "Apdorojama...",
8
+ "search": "Ieškoti:",
9
+ "zeroRecords": "Įrašų nerasta",
10
+ "paginate": {
11
+ "first": "Pirmas",
12
+ "previous": "Ankstesnis",
13
+ "next": "Tolimesnis",
14
+ "last": "Paskutinis"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-lv.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Parādīti _START_. līdz _END_. no _TOTAL_ ierakstiem",
3
+ "infoEmpty": "Nav ierakstu",
4
+ "infoFiltered": "(atlasīts no pavisam _MAX_ ierakstiem)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Rādīt _MENU_ ierakstus",
7
+ "processing": "Uzgaidiet...",
8
+ "search": "Meklēt:",
9
+ "zeroRecords": "Nav atrasti vaicājumam atbilstoši ieraksti",
10
+ "paginate": {
11
+ "first": "Pirmā",
12
+ "previous": "Iepriekšējā",
13
+ "next": "Nākošā",
14
+ "last": "Pēdējā"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-mk_MK.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Нема податоци во табелата",
3
+ "info": "Прикажани _START_ до _END_ од _TOTAL_ записи",
4
+ "infoEmpty": "Прикажани 0 до 0 од 0 записи",
5
+ "infoFiltered": "(филтрирано од вкупно _MAX_ записи)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Прикажи _MENU_ записи",
8
+ "loadingRecords": "Вчитување...",
9
+ "processing": "Процесирање...",
10
+ "search": "Барај",
11
+ "zeroRecords": "Не се пронајдени записи",
12
+ "paginate": {
13
+ "first": "Почетна",
14
+ "previous": "Претходна",
15
+ "next": "Следна",
16
+ "last": "Последна"
17
+ },
18
+ "decimal": ",",
19
+ "thousands": "."
20
+ }
i18n/datatables/lang-nb_NO.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Viser _START_ til _END_ av _TOTAL_ linjer",
3
+ "infoEmpty": "Viser 0 til 0 av 0 linjer",
4
+ "infoFiltered": "(filtrert fra _MAX_ totalt antall linjer)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Vis _MENU_ linjer",
7
+ "processing": "Laster...",
8
+ "search": "Søk:",
9
+ "zeroRecords": "Ingen linjer matcher søket",
10
+ "paginate": {
11
+ "first": "Første",
12
+ "previous": "Forrige",
13
+ "next": "Neste",
14
+ "last": "Siste"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-nl_NL.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Geen resultaten aanwezig in de tabel",
3
+ "info": "_START_ tot _END_ van _TOTAL_ resultaten",
4
+ "infoEmpty": "Geen resultaten om weer te geven",
5
+ "infoFiltered": "(gefilterd uit _MAX_ resultaten)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "_MENU_ resultaten weergeven",
8
+ "loadingRecords": "Een moment geduld aub - bezig met laden...",
9
+ "processing": "Bezig...",
10
+ "search": "Zoeken:",
11
+ "zeroRecords": "Geen resultaten gevonden",
12
+ "paginate": {
13
+ "first": "Eerste",
14
+ "previous": "Vorige",
15
+ "next": "Volgende",
16
+ "last": "Laatste"
17
+ },
18
+ "decimal": ",",
19
+ "thousands": "."
20
+ }
i18n/datatables/lang-nn_NO.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Viser _START_ til _END_ av _TOTAL_ linjer",
3
+ "infoEmpty": "Viser 0 til 0 av 0 linjer",
4
+ "infoFiltered": "(filtrert fra _MAX_ totalt antall linjer)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Vis _MENU_ linjer",
7
+ "processing": "Laster...",
8
+ "search": "Søk:",
9
+ "zeroRecords": "Ingen linjer matcher søket",
10
+ "paginate": {
11
+ "first": "Første",
12
+ "previous": "Forrige",
13
+ "next": "Neste",
14
+ "last": "Siste"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-pl_PL.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Brak danych",
3
+ "info": "Pozycje od _START_ do _END_ z _TOTAL_ łącznie",
4
+ "infoEmpty": "Pozycji 0 z 0 dostępnych",
5
+ "infoFiltered": "(filtrowanie spośród _MAX_ dostępnych pozycji)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Pokaż _MENU_ pozycji",
8
+ "loadingRecords": "Wczytywanie...",
9
+ "processing": "Przetwarzanie...",
10
+ "search": "Szukaj:",
11
+ "zeroRecords": "Nie znaleziono pasujących pozycji",
12
+ "paginate": {
13
+ "first": "Pierwsza",
14
+ "previous": "Poprzednia",
15
+ "next": "Następna",
16
+ "last": "Ostatnia"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": aktywuj, by posortować kolumnę rosnąco",
20
+ "sortDescending": ": aktywuj, by posortować kolumnę malejąco"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": " "
24
+ }
i18n/datatables/lang-pt_BR.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Nenhum registro encontrado",
3
+ "info": "Mostrando de _START_ até _END_ de _TOTAL_ registros",
4
+ "infoEmpty": "Mostrando 0 até 0 de 0 registros",
5
+ "infoFiltered": "(Filtrados de _MAX_ registros)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "_MENU_ resultados por página",
8
+ "loadingRecords": "Carregando...",
9
+ "processing": "Processando...",
10
+ "search": "Pesquisar",
11
+ "zeroRecords": "Nenhum registro encontrado",
12
+ "paginate": {
13
+ "first": "Primeiro",
14
+ "previous": "Anterior",
15
+ "next": "Próximo",
16
+ "last": "Último"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": Ordenar colunas de forma ascendente",
20
+ "sortDescending": ": Ordenar colunas de forma descendente"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-pt_PT.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Mostrando de _START_ até _END_ de _TOTAL_ registos",
3
+ "infoEmpty": "Mostrando de 0 até 0 de 0 registros",
4
+ "infoFiltered": "(filtrado de _MAX_ registos no total)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Mostrar _MENU_ registos",
7
+ "processing": "A processar...",
8
+ "search": "Procurar:",
9
+ "zeroRecords": "Não foram encontrados resultados",
10
+ "paginate": {
11
+ "first": "Primeiro",
12
+ "previous": "Anterior",
13
+ "next": "Seguinte",
14
+ "last": "Último"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-ro_RO.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Afisate de la _START_ la _END_ din _TOTAL_ inregistrari",
3
+ "infoEmpty": "Afisate de la 0 la 0 din 0 inregistrari",
4
+ "infoFiltered": "(filtrate dintr-un total de _MAX_ inregistrari)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Afiseaza _MENU_ inregistrari pe pagina",
7
+ "processing": "Proceseaza...",
8
+ "search": "Cauta:",
9
+ "zeroRecords": "Nu am gasit nimic - ne pare rau",
10
+ "paginate": {
11
+ "first": "Prima",
12
+ "previous": "Precedenta",
13
+ "next": "Urmatoarea",
14
+ "last": "Ultima"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-ru_RU.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Записи с _START_ до _END_ из _TOTAL_ записей",
3
+ "infoEmpty": "Записи с 0 до 0 из 0 записей",
4
+ "infoFiltered": "(отфильтровано из _MAX_ записей)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Показать _MENU_ записей",
7
+ "processing": "Подождите...",
8
+ "search": "Поиск:",
9
+ "zeroRecords": "Записи отсутствуют.",
10
+ "paginate": {
11
+ "first": "Первая",
12
+ "previous": "Предыдущая",
13
+ "next": "Следующая",
14
+ "last": "Последняя"
15
+ },
16
+ "aria": {
17
+ "sortAscending": ": активировать для сортировки столбца по возрастанию",
18
+ "sortDescending": ": активировать для сортировки столбцов по убыванию"
19
+ },
20
+ "decimal": ",",
21
+ "thousands": "."
22
+ }
i18n/datatables/lang-sk_SK.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Nie sú k dispozícii žiadne dáta",
3
+ "info": "Záznamy _START_ až _END_ z celkovo _TOTAL_",
4
+ "infoEmpty": "Záznamy 0 až 0 z celkovo 0",
5
+ "infoFiltered": "(vyfiltrované spomedzi _MAX_ záznamov)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Zobraz _MENU_ záznamov",
8
+ "loadingRecords": "Načítavam...",
9
+ "processing": "Spracúvam...",
10
+ "search": "Hľadať:",
11
+ "zeroRecords": "Nenašli sa žiadne vyhovujúce záznamy",
12
+ "paginate": {
13
+ "first": "Prvá",
14
+ "previous": "Predchádzajúca",
15
+ "next": "Nasledujúca",
16
+ "last": "Posledná"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": aktivujte na zoradenie stĺpca vzostupne",
20
+ "sortDescending": ": aktivujte na zoradenie stĺpca zostupne"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": " "
24
+ }
i18n/datatables/lang-sl_SI.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Nobenih podatkov ni na voljo",
3
+ "info": "Prikazujem _START_ do _END_ od _TOTAL_ zapisov",
4
+ "infoEmpty": "Prikazujem 0 do 0 od 0 zapisov",
5
+ "infoFiltered": "(filtrirano od _MAX_ vseh zapisov)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Prikaži _MENU_ zapisov",
8
+ "loadingRecords": "Nalagam...",
9
+ "processing": "Obdelujem...",
10
+ "search": "Išči:",
11
+ "zeroRecords": "Nobeden zapis ne ustreza",
12
+ "paginate": {
13
+ "first": "Prvi",
14
+ "previous": "Pred.",
15
+ "next": "Nasl.",
16
+ "last": "Zadnji"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": vključite za naraščujoči sort",
20
+ "sortDescending": ": vključite za padajoči sort"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-sq.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Nuk ka asnjë të dhënë në tabele",
3
+ "info": "Duke treguar _START_ deri _END_ prej _TOTAL_ reshtave",
4
+ "infoEmpty": "Duke treguar 0 deri 0 prej 0 reshtave",
5
+ "infoFiltered": "(të filtruara nga gjithësej _MAX_ reshtave)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Shiko _MENU_ reshta",
8
+ "loadingRecords": "Duke punuar...",
9
+ "processing": "Duke procesuar...",
10
+ "search": "Kërkoni:",
11
+ "zeroRecords": "Asnjë e dhënë nuk u gjet",
12
+ "paginate": {
13
+ "first": "E para",
14
+ "previous": "E Kaluara",
15
+ "next": "Tjetra",
16
+ "last": "E Fundit"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": aktivizo për të sortuar kolumnin me vlera në ngritje",
20
+ "sortDescending": ": aktivizo për të sortuar kolumnin me vlera në zbritje"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-sr_RS.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Prikaz _START_ do _END_ od ukupno _TOTAL_ elemenata",
3
+ "infoEmpty": "Prikaz 0 do 0 od ukupno 0 elemenata",
4
+ "infoFiltered": "(filtrirano od ukupno _MAX_ elemenata)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Prikaži _MENU_ elemenata",
7
+ "processing": "Procesiranje u toku...",
8
+ "search": "Pretraga:",
9
+ "zeroRecords": "Nije pronađen nijedan rezultat",
10
+ "paginate": {
11
+ "first": "Početna",
12
+ "previous": "Prethodna",
13
+ "next": "Sledeća",
14
+ "last": "Poslednja"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-sv_SE.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "Tabellen innehåller ingen data",
3
+ "info": "Visar _START_ till _END_ av totalt _TOTAL_ rader",
4
+ "infoEmpty": "Visar 0 till 0 av totalt 0 rader",
5
+ "infoFiltered": "(filtrerade från totalt _MAX_ rader)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "Visa _MENU_ rader",
8
+ "loadingRecords": "Laddar...",
9
+ "processing": "Bearbetar...",
10
+ "search": "Sök:",
11
+ "zeroRecords": "Hittade inga matchande resultat",
12
+ "paginate": {
13
+ "first": "Första",
14
+ "previous": "Föregående",
15
+ "next": "Nästa",
16
+ "last": "Sista"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": aktivera för att sortera kolumnen i stigande ordning",
20
+ "sortDescending": ": aktivera för att sortera kolumnen i fallande ordning"
21
+ },
22
+ "decimal": ",",
23
+ "thousands": "."
24
+ }
i18n/datatables/lang-th.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "แสดง _START_ ถึง _END_ จาก _TOTAL_ แถว",
3
+ "infoEmpty": "แสดง 0 ถึง 0 จาก 0 แถว",
4
+ "infoFiltered": "(กรองข้อมูล _MAX_ ทุกแถว)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "แสดง_MENU_ แถว",
7
+ "processing": "กำลังดำเนินการ...",
8
+ "search": "ค้นหา:",
9
+ "zeroRecords": "ไม่พบข้อมูล",
10
+ "paginate": {
11
+ "first": "เิริ่มต้น",
12
+ "previous": "ก่อนหน้า",
13
+ "next": "ถัดไป",
14
+ "last": "สุดท้าย"
15
+ },
16
+ "decimal": "",
17
+ "thousands": ","
18
+ }
i18n/datatables/lang-tr_TR.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "_TOTAL_ Kayıttan _START_ - _END_ Arası Kayıtlar",
3
+ "infoEmpty": "Kayıt Yok",
4
+ "infoFiltered": "(_MAX_ Kayıt İçerisinden Bulunan)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Sayfada _MENU_ Kayıt Göster",
7
+ "processing": "İşleniyor...",
8
+ "search": "Bul:",
9
+ "zeroRecords": "Eşleşen Kayıt Bulunmadı",
10
+ "paginate": {
11
+ "first": "İlk",
12
+ "previous": "Önceki",
13
+ "next": "Sonraki",
14
+ "last": "Son"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-uk.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Записи з _START_ по _END_ із _TOTAL_ записів",
3
+ "infoEmpty": "Записи з 0 по 0 із 0 записів",
4
+ "infoFiltered": "(відфільтровано з _MAX_ записів)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Показати _MENU_ записів",
7
+ "processing": "Зачекайте...",
8
+ "search": "Пошук:",
9
+ "zeroRecords": "Записи відсутні.",
10
+ "paginate": {
11
+ "first": "Перша",
12
+ "previous": "Попередня",
13
+ "next": "Наступна",
14
+ "last": "Остання"
15
+ },
16
+ "aria": {
17
+ "sortAscending": ": активувати для сортування стовпців за зростанням",
18
+ "sortDescending": ": активувати для сортування стовпців за спаданням"
19
+ },
20
+ "decimal": ",",
21
+ "thousands": "."
22
+ }
i18n/datatables/lang-vi.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "Đang xem _START_ đến _END_ trong tổng số _TOTAL_ mục",
3
+ "infoEmpty": "Đang xem 0 đến 0 trong tổng số 0 mục",
4
+ "infoFiltered": "(được lọc từ _MAX_ mục)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "Xem _MENU_ mục",
7
+ "processing": "Đang xử lý...",
8
+ "search": "Tìm:",
9
+ "zeroRecords": "Không tìm thấy dòng nào phù hợp",
10
+ "paginate": {
11
+ "first": "Đầu",
12
+ "previous": "Trước",
13
+ "next": "Tiếp",
14
+ "last": "Cuối"
15
+ },
16
+ "decimal": ",",
17
+ "thousands": "."
18
+ }
i18n/datatables/lang-zh_CN.json ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "emptyTable": "表中数据为空",
3
+ "info": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
4
+ "infoEmpty": "显示第 0 至 0 项结果,共 0 项",
5
+ "infoFiltered": "(由 _MAX_ 项结果过滤)",
6
+ "infoPostFix": "",
7
+ "lengthMenu": "显示 _MENU_ 项结果",
8
+ "loadingRecords": "载入中...",
9
+ "processing": "处理中...",
10
+ "search": "搜索:",
11
+ "zeroRecords": "没有匹配结果",
12
+ "paginate": {
13
+ "first": "首页",
14
+ "previous": "上页",
15
+ "next": "下页",
16
+ "last": "末页"
17
+ },
18
+ "aria": {
19
+ "sortAscending": ": 以升序排列此列",
20
+ "sortDescending": ": 以降序排列此列"
21
+ },
22
+ "decimal": "",
23
+ "thousands": ","
24
+ }
i18n/datatables/lang-zh_TW.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "info": "本頁為第 _START_ 項至第 _END_ 項,共有 _TOTAL_ 項",
3
+ "infoEmpty": "本頁為第 0 至第 0 項,共有 0 項",
4
+ "infoFiltered": "(來自總共 _MAX_ 項中的符合項目)",
5
+ "infoPostFix": "",
6
+ "lengthMenu": "每頁顯示 _MENU_ 個項目",
7
+ "processing": "處理中...",
8
+ "search": "快速搜尋:",
9
+ "zeroRecords": "沒有找到符合的項目",
10
+ "paginate": {
11
+ "first": "第一頁",
12
+ "previous": "上一頁",
13
+ "next": "下一頁",
14
+ "last": "最後一頁"
15
+ },
16
+ "decimal": "",
17
+ "thousands": ","
18
+ }
i18n/datatables/warning.txt ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ATTENTION:
2
+
3
+ Do not edit or modify the files in this directory, as they might be changed in future plugin versions.
4
+ This would lead to a loss of your changes!
5
+
6
+ * If you want to make changes to your language's file, please see the TablePress Extension
7
+ "Change DataTables strings" at https://tablepress.org/extensions/change-datatables-strings/
8
+ for instructions on how to do this.
9
+
10
+ * If you just want to change to a different language file, you can override the locale by using the Shortcode
11
+ parameter "datatables_locale" or with the plugin filter hook `tablepress_datatables_locale`.
12
+ This Shortcode would change the used language to German for table 123:
13
+ [table id=123 datatables_locale="de_DE" /]
14
+
15
+ * If you want to translate the language file into your own language, copy the file "lang-en_US.json", rename the copy to
16
+ "lang-XX_XX.json", where `XX_XX` is the ISO code for your language. That is the same one as in your WordPress language files (*.po, *.mo).
17
+ Then, you can translate that file. If you email the file to me, I'll gladly add it to the next release of the plugin.
18
+
19
+ Most languages in the folder are from https://www.datatables.net/plug-ins/i18n/#Translations.
20
+ You can also check that page, to see if your language has been added and tell me about it.
21
+
22
+ You can find example code for this in the FAQ at https://tablepress.org/faq/
23
+ or in the documentation at https://tablepress.org/documentation/.
24
+
25
+ Thank you!
i18n/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
i18n/tablepress-cs_CZ.mo ADDED
Binary file
i18n/tablepress-cs_CZ.po ADDED
@@ -0,0 +1,2913 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 TablePress
2
+ # This file is distributed under the same license as the TablePress package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: TablePress v1.6.1\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/tablepress\n"
7
+ "POT-Creation-Date: \n"
8
+ "PO-Revision-Date: 2013-10-18 19:04+0100\n"
9
+ "Last-Translator: \n"
10
+ "Language-Team: Miloš Berka <milosberka01@gmail.com>\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=3; plural=n%100/10==1 ? 2 : n%10==1 ? 0 : (n"
15
+ "+9)%10>3 ? 2 : 1;\n"
16
+ "X-Generator: Poedit 1.5.7\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
19
+ "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
20
+ "X-Poedit-Basepath: .\n"
21
+ "X-Textdomain-Support: yes\n"
22
+ "X-Poedit-SearchPath-0: .\n"
23
+
24
+ # @ tablepress
25
+ #: classes/class-admin-page-helper.php:79
26
+ msgid "Thank you for using <a href=\"https://tablepress.org/\">TablePress</a>."
27
+ msgstr ""
28
+ "Děkujeme za používání <a href=\"https://tablepress.org/\">TablePress</a>."
29
+
30
+ # @ tablepress
31
+ #: classes/class-admin-page-helper.php:80
32
+ #, php-format
33
+ msgid "Support the plugin with your <a href=\"%s\">donation</a>!"
34
+ msgstr "Podpořte plugin svým <a href=\"%s\">příspěvkem</a>!"
35
+
36
+ # @ tablepress
37
+ #: classes/class-export.php:58 classes/class-import.php:83
38
+ msgid "CSV - Character-Separated Values"
39
+ msgstr "CSV - Character-Separated Values"
40
+
41
+ # @ tablepress
42
+ #: classes/class-export.php:59 classes/class-import.php:85
43
+ msgid "HTML - Hypertext Markup Language"
44
+ msgstr "HTML - Hypertext Markup Language"
45
+
46
+ # @ tablepress
47
+ #: classes/class-export.php:60 classes/class-import.php:86
48
+ msgid "JSON - JavaScript Object Notation"
49
+ msgstr "JSON - JavaScript Object Notation"
50
+
51
+ # @ tablepress
52
+ #: classes/class-export.php:63
53
+ msgid "; (semicolon)"
54
+ msgstr "; (středník)"
55
+
56
+ # @ tablepress
57
+ #: classes/class-export.php:64
58
+ msgid ", (comma)"
59
+ msgstr ", (čárka)"
60
+
61
+ # @ tablepress
62
+ #: classes/class-export.php:65
63
+ msgid "\\t (tabulator)"
64
+ msgstr "\\t (tabulátor)"
65
+
66
+ # @ tablepress
67
+ #: classes/class-import.php:183 classes/class-import.php:286
68
+ #: classes/class-import.php:380
69
+ msgid "The imported file contains errors:"
70
+ msgstr "Importované soubory obsahují chyby:"
71
+
72
+ # @ tablepress
73
+ #: classes/class-render.php:400
74
+ #, php-format
75
+ msgid "<!-- The table with the ID %s is empty! -->"
76
+ msgstr "<!-- Tabulka s ID %s je prázdná! -->"
77
+
78
+ # @ default
79
+ # @ tablepress
80
+ #: classes/class-render.php:476 views/view-list.php:405
81
+ msgid "Edit"
82
+ msgstr "Upravit"
83
+
84
+ # @ tablepress
85
+ #: classes/class-view.php:110
86
+ msgid "TablePress Help"
87
+ msgstr "Nápověda Tablepress"
88
+
89
+ # @ tablepress
90
+ #: classes/class-view.php:112
91
+ #, php-format
92
+ msgid ""
93
+ "More information about TablePress can be found on the <a href=\"%1$s"
94
+ "\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress "
95
+ "Plugin Directory</a>."
96
+ msgstr ""
97
+ "Více informací najdete na stráce <a href=\"%1$s\">plugin&#8217; website</a>, "
98
+ "nebo na stránce <a href=\"%s\">WordPress Plugin Directory</a>."
99
+
100
+ # @ tablepress
101
+ #: classes/class-view.php:113 views/view-about.php:106
102
+ #, php-format
103
+ msgid ""
104
+ "For technical information, please see the <a href=\"%s\">documentation</a>."
105
+ msgstr "Technické informace najdete v <a href=\"%s\">dokumentaci</a>."
106
+
107
+ # @ tablepress
108
+ #: classes/class-view.php:114
109
+ #, php-format
110
+ msgid ""
111
+ "<a href=\"%1$s\">Support</a> is provided through the <a href=\"%2$s"
112
+ "\">WordPress Support Forums</a>."
113
+ msgstr ""
114
+ "<a href=\"%1$s\">Podpora</a> je poskytovaná prostřednictvím <a href=\"%2$s"
115
+ "\">fóra WordPressu.</a>."
116
+
117
+ # @ tablepress
118
+ #: classes/class-view.php:115 views/view-about.php:139
119
+ #, php-format
120
+ msgid ""
121
+ "Before asking for support, please carefully read the <a href=\"%s"
122
+ "\">Frequently Asked Questions</a>, where you will find answers to the most "
123
+ "common questions, and search through the forums."
124
+ msgstr ""
125
+ "Než požádáte o pomoc, přečtěte si pozorně <a href=\"%s\">Často kladené "
126
+ "otázky (FAQ)</a>, kde najdete odpovědi na nejčastěji kladené otázky, "
127
+ "případně si projděte fórum."
128
+
129
+ # @ tablepress
130
+ #: classes/class-view.php:116
131
+ #, php-format
132
+ msgid ""
133
+ "If you like the plugin, <a href=\"%1$s\"><strong>a donation</strong></a> is "
134
+ "recommended."
135
+ msgstr ""
136
+ "Jestli se vám tento plugin líbí <a href=\"%1$s\"><strong>podpořte</strong></"
137
+ "a> nás."
138
+
139
+ # @ tablepress
140
+ #: classes/class-view.php:119
141
+ msgid "For more information:"
142
+ msgstr "Pro více informací:"
143
+
144
+ # @ tablepress
145
+ #: classes/class-view.php:153 views/view-editor_button_thickbox.php:71
146
+ #: views/view-options_custom_css.php:36 views/view-preview_table.php:55
147
+ #, php-format
148
+ msgid "%1$s &lsaquo; %2$s"
149
+ msgstr "%1$s &lsaquo; %2$s"
150
+
151
+ # @ tablepress
152
+ #: classes/class-view.php:164 classes/class-view.php:165
153
+ msgid "Do you really want to delete this table?"
154
+ msgid_plural "Do you really want to delete these tables?"
155
+ msgstr[0] "Opravdu smazat?"
156
+ msgstr[1] "Opravdu smazat tyto tabulky?"
157
+ msgstr[2] "Opravdu smazat tyto tabulky?"
158
+
159
+ # @ tablepress
160
+ #. translators: plugin header field 'Name'
161
+ #: classes/class-view.php:383 tablepress.php:0
162
+ msgid "TablePress"
163
+ msgstr "TablePress"
164
+
165
+ # @ tablepress
166
+ #: classes/class-view.php:412 views/view-edit.php:400 views/view-edit.php:401
167
+ #: views/view-options.php:54
168
+ msgid "Save Changes"
169
+ msgstr "Uložit změny"
170
+
171
+ # @ tablepress
172
+ #: controllers/controller-admin.php:174 views/view-about.php:86
173
+ #: views/view-list.php:185
174
+ msgid "Table"
175
+ msgstr "Tabulka"
176
+
177
+ # @ tablepress
178
+ #: controllers/controller-admin.php:175 controllers/controller-admin.php:176
179
+ msgid "Insert a Table from TablePress"
180
+ msgstr "Vložit tabulku z Tablepress"
181
+
182
+ # @ tablepress
183
+ #: controllers/controller-admin.php:247
184
+ msgid "TablePress Table"
185
+ msgstr "Tabulka Tablepress"
186
+
187
+ # @ tablepress
188
+ #: controllers/controller-admin.php:274
189
+ msgid "Plugin page"
190
+ msgstr "Stránka pluginu"
191
+
192
+ # @ tablepress
193
+ #: controllers/controller-admin.php:288
194
+ msgid "Frequently Asked Questions"
195
+ msgstr "Často kladené otázky"
196
+
197
+ # @ tablepress
198
+ #: controllers/controller-admin.php:288
199
+ msgid "FAQ"
200
+ msgstr "FAQ"
201
+
202
+ # @ tablepress
203
+ #: controllers/controller-admin.php:289
204
+ msgid "Documentation"
205
+ msgstr "Dokumentace"
206
+
207
+ # @ tablepress
208
+ #: controllers/controller-admin.php:290
209
+ msgid "Support"
210
+ msgstr "Podpora"
211
+
212
+ # @ tablepress
213
+ #: controllers/controller-admin.php:291
214
+ msgid "Support TablePress with your donation!"
215
+ msgstr "Podpořte TablePress příspěvkem!"
216
+
217
+ # @ tablepress
218
+ #: controllers/controller-admin.php:291
219
+ msgid "Donate"
220
+ msgstr "Darovat"
221
+
222
+ # @ default
223
+ #: controllers/controller-admin.php:317 controllers/controller-admin.php:385
224
+ #: controllers/controller-admin.php:758 controllers/controller-admin.php:816
225
+ #: controllers/controller-admin.php:866 controllers/controller-admin.php:935
226
+ #: controllers/controller-admin.php:965 controllers/controller-admin.php:1038
227
+ #: controllers/controller-admin.php:1048 controllers/controller-admin.php:1579
228
+ #: controllers/controller-admin.php:1606 controllers/controller-admin.php:1641
229
+ #: controllers/controller-admin.php:1677 controllers/controller-admin.php:1716
230
+ #: controllers/controller-admin.php:1743
231
+ msgid "You do not have sufficient permissions to access this page."
232
+ msgstr "Nemáte dostatočné oprávnenie k prístupu na túto stránku."
233
+
234
+ # @ tablepress
235
+ #: controllers/controller-admin.php:473
236
+ msgid "English"
237
+ msgstr "anglicky"
238
+
239
+ # @ tablepress
240
+ #: controllers/controller-admin.php:478
241
+ msgid "Spanish"
242
+ msgstr "španělsky"
243
+
244
+ # @ tablepress
245
+ #: controllers/controller-admin.php:488
246
+ msgid "French"
247
+ msgstr "francouzsky"
248
+
249
+ # @ tablepress
250
+ #: controllers/controller-admin.php:523
251
+ msgid "Polish"
252
+ msgstr "polsky"
253
+
254
+ # @ tablepress
255
+ #: controllers/controller-admin.php:538
256
+ msgid "Slovak"
257
+ msgstr "slovensky"
258
+
259
+ # @ tablepress
260
+ #: controllers/controller-admin.php:548
261
+ msgid "Chinese (Simplified)"
262
+ msgstr "čínština (zjednodušená)"
263
+
264
+ # @ tablepress
265
+ #: controllers/controller-admin.php:600 controllers/controller-admin.php:601
266
+ #: controllers/controller-admin.php:602
267
+ msgid "All Tables"
268
+ msgstr "Všechny tabulky"
269
+
270
+ # @ tablepress
271
+ #: controllers/controller-admin.php:607 controllers/controller-admin.php:608
272
+ #: views/view-add.php:41
273
+ msgid "Add New Table"
274
+ msgstr "Nová tabulka"
275
+
276
+ # @ tablepress
277
+ #: controllers/controller-admin.php:609
278
+ msgid "Add New"
279
+ msgstr "Nová"
280
+
281
+ # @ tablepress
282
+ #: controllers/controller-admin.php:614
283
+ msgid "Edit Table"
284
+ msgstr "Upravit tabulku"
285
+
286
+ # @ tablepress
287
+ #: controllers/controller-admin.php:621 controllers/controller-admin.php:622
288
+ msgid "Import a Table"
289
+ msgstr "Importovat tabulku"
290
+
291
+ # @ tablepress
292
+ #: controllers/controller-admin.php:623
293
+ msgctxt "navigation bar"
294
+ msgid "Import"
295
+ msgstr "Import"
296
+
297
+ # @ tablepress
298
+ #: controllers/controller-admin.php:628 controllers/controller-admin.php:629
299
+ msgid "Export a Table"
300
+ msgstr "Exportovat tabulku"
301
+
302
+ # @ tablepress
303
+ #: controllers/controller-admin.php:630
304
+ msgctxt "navigation bar"
305
+ msgid "Export"
306
+ msgstr "Export"
307
+
308
+ # @ tablepress
309
+ #: controllers/controller-admin.php:635 controllers/controller-admin.php:636
310
+ #: controllers/controller-admin.php:637
311
+ msgid "Plugin Options"
312
+ msgstr "Nastavení"
313
+
314
+ # @ tablepress
315
+ #: controllers/controller-admin.php:642 controllers/controller-admin.php:644
316
+ msgid "About"
317
+ msgstr "O pluginu"
318
+
319
+ # @ tablepress
320
+ #: controllers/controller-admin.php:643
321
+ msgid "About TablePress"
322
+ msgstr "O pluginu"
323
+
324
+ # @ tablepress
325
+ #: controllers/controller-admin.php:1118
326
+ msgid "Imported from Manual Input"
327
+ msgstr "Manuálně importovaný"
328
+
329
+ # @ tablepress
330
+ #: controllers/controller-admin.php:1674
331
+ #: controllers/controller-admin_ajax.php:230
332
+ msgid "The preview could not be loaded."
333
+ msgstr "Náhled nelze načíst."
334
+
335
+ # @ tablepress
336
+ #: controllers/controller-admin.php:1674 controllers/controller-admin.php:1682
337
+ #: views/view-edit.php:398 views/view-list.php:414
338
+ #: views/view-preview_table.php:55
339
+ msgid "Preview"
340
+ msgstr "Náhled"
341
+
342
+ # @ tablepress
343
+ #: controllers/controller-admin.php:1682
344
+ msgid "The table could not be loaded."
345
+ msgstr "Tabulku nelze načíst."
346
+
347
+ # @ tablepress
348
+ #: controllers/controller-admin.php:1760
349
+ msgid "TablePress was uninstalled successfully."
350
+ msgstr "Tabulka byla úspěšně odinstalována."
351
+
352
+ # @ tablepress
353
+ #: controllers/controller-admin.php:1761
354
+ msgid "All tables, data, and options were deleted."
355
+ msgstr "Všechny tabulky,data a nastavení byly smazány."
356
+
357
+ # @ tablepress
358
+ #: controllers/controller-admin.php:1767
359
+ msgid ""
360
+ "Your TablePress &#8220;Custom CSS&#8221; files have been deleted "
361
+ "automatically."
362
+ msgstr "Potom budou vaše &#8220;Vlastní CSS&#8221;vymazány automaticky."
363
+
364
+ # @ tablepress
365
+ #: controllers/controller-admin.php:1770
366
+ msgid ""
367
+ "Please also ask him to delete your TablePress &#8220;Custom CSS&#8221; files "
368
+ "from the server."
369
+ msgstr ""
370
+ "Rovněž ho požádejte, aby smazal vaše &#8220;Vlastní CSS&#8221; soubory "
371
+ "TablePressu ze serveru."
372
+
373
+ # @ tablepress
374
+ #: controllers/controller-admin.php:1772
375
+ msgid ""
376
+ "You may now also delete your TablePress &#8220;Custom CSS&#8221; files in "
377
+ "the <code>wp-content</code> folder."
378
+ msgstr ""
379
+ "Nyní můžete také mazat svoje &#8220;Vlastní CSS&#8221; soubory TablePressu "
380
+ "ve složce <code>wp-content </code>."
381
+
382
+ # @ tablepress
383
+ #: controllers/controller-admin.php:1776
384
+ msgid "Go to &#8220;Plugins&#8221; page"
385
+ msgstr "Přejděte na stránku &#8220;Pluginy&#8221;"
386
+
387
+ # @ tablepress
388
+ #: controllers/controller-admin.php:1777
389
+ msgid "Go to Dashboard"
390
+ msgstr "Přejít na Nástěnku"
391
+
392
+ # @ tablepress
393
+ #: controllers/controller-admin.php:1779 views/view-options.php:180
394
+ #: views/view-options.php:187
395
+ msgid "Uninstall TablePress"
396
+ msgstr "Odinstalovat TablePress"
397
+
398
+ # @ tablepress
399
+ #: controllers/controller-admin_ajax.php:223 views/view-preview_table.php:66
400
+ msgid "This is a preview of your table."
401
+ msgstr "Toto je náhled vaší tabulky."
402
+
403
+ # @ tablepress
404
+ #: controllers/controller-admin_ajax.php:224
405
+ msgid "Because of CSS styling, the table might look different on your page!"
406
+ msgstr "Tabulka může na vaší stránce vypadat odlišně v důsledku CSS stylování."
407
+
408
+ # @ tablepress
409
+ #: controllers/controller-admin_ajax.php:225
410
+ msgid ""
411
+ "The features of the DataTables JavaScript library are also not visible in "
412
+ "this preview!"
413
+ msgstr ""
414
+ "Vlastnosti DataTables JavaScript knihovny v náhledu rovněž nejsou viditelné!"
415
+
416
+ # @ tablepress
417
+ #: controllers/controller-admin_ajax.php:226 views/view-preview_table.php:67
418
+ #, php-format
419
+ msgid ""
420
+ "To insert the table into a page, post, or text widget, copy the Shortcode %s "
421
+ "and paste it into the editor."
422
+ msgstr ""
423
+ "Pro vložení tabulky do stránky, príspěvku, nebo textového widgetu, "
424
+ "zkopírujte <em>zkrácený zápis</em> %s a vložte ho do editoru."
425
+
426
+ # @ tablepress
427
+ #: controllers/controller-frontend.php:470 views/view-list.php:470
428
+ #, php-format
429
+ msgid "%s ago"
430
+ msgstr "%s před"
431
+
432
+ # @ tablepress
433
+ #: models/model-table.php:353 views/view-editor_button_thickbox.php:286
434
+ #: views/view-export.php:117 views/view-import.php:190 views/view-list.php:396
435
+ msgid "(no name)"
436
+ msgstr "(bez názvu)"
437
+
438
+ # @ tablepress
439
+ #: models/model-table.php:354
440
+ #, php-format
441
+ msgid "Copy of %s"
442
+ msgstr "Kopie %s"
443
+
444
+ # @ tablepress
445
+ #: views/view-about.php:43
446
+ msgid "Plugin Purpose"
447
+ msgstr "Účel pluginu"
448
+
449
+ # @ tablepress
450
+ #: views/view-about.php:44
451
+ msgid "Usage"
452
+ msgstr "Použití"
453
+
454
+ # @ tablepress
455
+ #: views/view-about.php:45
456
+ msgid "More Information and Documentation"
457
+ msgstr "Více informací a dokumentace"
458
+
459
+ # @ tablepress
460
+ #: views/view-about.php:46
461
+ msgid "Help and Support"
462
+ msgstr "Pomoc a podpora"
463
+
464
+ # @ tablepress
465
+ #: views/view-about.php:47
466
+ msgid "Author and License"
467
+ msgstr "Autor a licence"
468
+
469
+ # @ tablepress
470
+ #: views/view-about.php:48
471
+ msgid "Credits and Thanks"
472
+ msgstr "Poděkování"
473
+
474
+ # @ tablepress
475
+ #: views/view-about.php:49
476
+ msgid "Debug and Version Information"
477
+ msgstr "Ladění a Informace o verzi"
478
+
479
+ # @ tablepress
480
+ #: views/view-about.php:60
481
+ msgid ""
482
+ "TablePress allows you to create and manage tables in the admin area of "
483
+ "WordPress."
484
+ msgstr ""
485
+ "TablePress umožňuje vytvářet a spravovat tabulky v administraci WordPressu."
486
+
487
+ # @ tablepress
488
+ #: views/view-about.php:61
489
+ msgid ""
490
+ "Tables may contain text, numbers and even HTML (e.g. to include images or "
491
+ "links)."
492
+ msgstr ""
493
+ "Tabulky mohou obsahovat text, čísla, nebo i HTML (např. obrázky, nebo "
494
+ "odkazy)."
495
+
496
+ # @ tablepress
497
+ #: views/view-about.php:62
498
+ msgid ""
499
+ "You can then show the tables in your posts, on your pages, or in text "
500
+ "widgets by using a Shortcode."
501
+ msgstr ""
502
+ "Tabulky můžete zobrazovat ve svých příspěvcích, stránkách, nebo v textových "
503
+ "widgetech pomocí <em>zkráceného zápisu</em>."
504
+
505
+ # @ tablepress
506
+ #: views/view-about.php:63
507
+ msgid ""
508
+ "If you want to show your tables anywhere else in your theme, you can use a "
509
+ "Template Tag function."
510
+ msgstr ""
511
+ "Chcete-li zobrazit svoje tabulky kdekoliv jinde v šabloně, můžete použít "
512
+ "funkci Template Tag."
513
+
514
+ # @ tablepress
515
+ #: views/view-about.php:76
516
+ msgid "At first, you should add or import a table."
517
+ msgstr "Nejprve byste měli vytvořit, nebo importovat nějakou tabulku."
518
+
519
+ # @ tablepress
520
+ #: views/view-about.php:80
521
+ msgid ""
522
+ "Then you can edit your data or change the structure of your table (e.g. by "
523
+ "inserting, deleting, moving, or swaping rows or columns or sorting them) and "
524
+ "select specific table features like alternating row colors or whether to "
525
+ "print the name or description, if you want."
526
+ msgstr ""
527
+ "Potom můžete editovat údaje, nebo měnit strukturu tabulky (např. vkládat, "
528
+ "mazat, přesouvat, prohazovat řádky, či sloupce, nebo je třídit) a volit "
529
+ "konrétní vlastnosti tabulky, např. alternativní barvy řádků, nebo zda chcete "
530
+ "zobrazovat název, nebo popis tabulky."
531
+
532
+ # @ tablepress
533
+ #: views/view-about.php:81
534
+ msgid "To easily add a link or an image to a cell, use the provided buttons."
535
+ msgstr ""
536
+ "Obrázek, či odkaz do buňky přídáte snadno použitím příslušného tlačítka."
537
+
538
+ # @ tablepress
539
+ #: views/view-about.php:82
540
+ msgid ""
541
+ "Those will ask you for the necessary information and and corresponding HTML "
542
+ "code will be added to the cell automatically."
543
+ msgstr ""
544
+ "Budete požádáni o potřebné informace a výsledný HTML kód bude do buňky "
545
+ "vložen automaticky."
546
+
547
+ # @ tablepress
548
+ #: views/view-about.php:85 views/view-list.php:183
549
+ #, php-format
550
+ msgid ""
551
+ "To insert a table into a page, post, or text widget, copy its Shortcode %s "
552
+ "and paste it at the desired place in the editor."
553
+ msgstr ""
554
+ "Pro vložení tabulky do stránky, príspěvku, nebo textového widgetu, "
555
+ "zkopírujte <em>zkrácený zápis</em> %s a vložte ho v editoru na požadované "
556
+ "místo."
557
+
558
+ # @ tablepress
559
+ #: views/view-about.php:86 views/view-list.php:185
560
+ #, php-format
561
+ msgid ""
562
+ "You can also click the &#8220;%s&#8221; button in the editor toolbar to "
563
+ "select and insert a table."
564
+ msgstr ""
565
+ "Tabulku můžete vložit i přímo kliknutím na tlačítko &#8220;%s&#8221; (Vložit "
566
+ "tabulku z TablePress) v nástrojové liště textového editoru."
567
+
568
+ # @ tablepress
569
+ #: views/view-about.php:89
570
+ msgid "Tables can be styled by changing and adding CSS commands."
571
+ msgstr "Vzhled tabulek může být určen pomocí CSS stylů."
572
+
573
+ # @ tablepress
574
+ #: views/view-about.php:90
575
+ msgid ""
576
+ "The plugin ships with default CSS stylesheets, which can be customized with "
577
+ "own code or replaced with other stylesheets."
578
+ msgstr ""
579
+ "Plugin obsahuje předvolené CSS styly, které si můžete přizpůsobit, nebo "
580
+ "nahradit vlastními styly."
581
+
582
+ # @ tablepress
583
+ #: views/view-about.php:91
584
+ msgid ""
585
+ "For this, each table is given certain CSS classes that can be used as CSS "
586
+ "selectors."
587
+ msgstr ""
588
+ "Pro tento účel má každá tabulka dané CSS třídy, které lze použít jako "
589
+ "selektory CSS."
590
+
591
+ # @ tablepress
592
+ #: views/view-about.php:92
593
+ #, php-format
594
+ msgid ""
595
+ "Please see the <a href=\"%s\">documentation</a> for a list of these "
596
+ "selectors and for styling examples."
597
+ msgstr ""
598
+ "Prohlédněte si v <a href=\"%s\">dokumentaci</a> seznam těchto selektorů a "
599
+ "příklady stylů."
600
+
601
+ # @ tablepress
602
+ #: views/view-about.php:105
603
+ #, php-format
604
+ msgid ""
605
+ "More information about TablePress can be found on the <a href=\"%s"
606
+ "\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress "
607
+ "Plugin Directory</a>."
608
+ msgstr ""
609
+ "Více informací o TablePressu můžete najít na stránce <a href=\"%s\">pluginu</"
610
+ "a>, nebo na stránce <a href=\"%s\">WordPress Plugin Directory</a>."
611
+
612
+ # @ tablepress
613
+ #: views/view-about.php:119
614
+ #, php-format
615
+ msgid ""
616
+ "This plugin was written and developed by <a href=\"%s\">Tobias Bäthge</a>."
617
+ msgstr "Tento plugin napsal a vyvinul <a href=\"%s\">Tobias Bäthge</a>."
618
+
619
+ # @ tablepress
620
+ #: views/view-about.php:120
621
+ msgid ""
622
+ "It is licensed as Free Software under GNU General Public License 2 (GPL 2)."
623
+ msgstr ""
624
+ "Je licencovaný jako svobodný software pod GNU General Public License (GPL 2)."
625
+
626
+ # @ tablepress
627
+ #: views/view-about.php:122
628
+ #, php-format
629
+ msgid ""
630
+ "If you like the plugin, <a href=\"%s\"><strong>giving a donation</strong></"
631
+ "a> is recommended."
632
+ msgstr ""
633
+ "Jestli se vám tento plugin líbí, <a href=\"%s\"><strong>podpořte</strong></"
634
+ "a> ho."
635
+
636
+ # @ tablepress
637
+ #: views/view-about.php:123
638
+ #, php-format
639
+ msgid ""
640
+ "Please rate and review the plugin in the <a href=\"%s\">WordPress Plugin "
641
+ "Directory</a>."
642
+ msgstr ""
643
+ "Prosím o hodnocení pluginu na stránce <a href=\"%s\">WordPress Plugin "
644
+ "Directory</a>."
645
+
646
+ # @ tablepress
647
+ #: views/view-about.php:125
648
+ msgid ""
649
+ "Donations and good ratings encourage me to further develop the plugin and to "
650
+ "provide countless hours of support. Any amount is appreciated! Thanks!"
651
+ msgstr ""
652
+ "Dary a dobré hodnocení mě povzbudí během mnoha hodin strávených při dalším "
653
+ "vývoji pluginu. Každá suma je vítaná! Díky!"
654
+
655
+ # @ tablepress
656
+ #: views/view-about.php:138
657
+ #, php-format
658
+ msgid ""
659
+ "<a href=\"%s\">Support</a> is provided through the <a href=\"%s\">WordPress "
660
+ "Support Forums</a>."
661
+ msgstr ""
662
+ "<a href=\"%s\">Podpora</a> je poskytovaná prostřednictvím <a href=\"%s"
663
+ "\">WordPress Support Forums</a>."
664
+
665
+ # @ tablepress
666
+ #: views/view-about.php:142
667
+ #, php-format
668
+ msgid ""
669
+ "If you do not find an answer there, please <a href=\"%s\">open a new thread</"
670
+ "a> in the WordPress Support Forums."
671
+ msgstr ""
672
+ "Pokud tam nenajdete uspokojivou odpověď, <a href=\"%s\">vytvořte nové "
673
+ "vlákno</a> v diskusním fóru WordPress."
674
+
675
+ # @ tablepress
676
+ #: views/view-about.php:155
677
+ msgid "Please provide this information in bug reports and support requests."
678
+ msgstr ""
679
+ "Uveďte, prosím, tuto informaci v hlášení o chybách a v žádosti o podporu."
680
+
681
+ # @ tablepress
682
+ #: views/view-about.php:186
683
+ msgid "Special Thanks go to:"
684
+ msgstr "Zvláštní poděkování patří:"
685
+
686
+ # @ tablepress
687
+ #: views/view-about.php:187
688
+ msgid ""
689
+ "Allan Jardine for <a href=\"http://www.datatables.net/\">DataTables</a>,"
690
+ msgstr ""
691
+ "Allan Jardine za <a href=\"http://www.datatables.net/\">DataTables</a>,"
692
+
693
+ # @ tablepress
694
+ #: views/view-about.php:190
695
+ msgid "Thanks to the translators:"
696
+ msgstr "Díky překladatelům:"
697
+
698
+ # @ tablepress
699
+ #: views/view-about.php:195
700
+ #, php-format
701
+ msgid "%s (thanks to %s)"
702
+ msgstr "%s (děkuji %s)"
703
+
704
+ # @ tablepress
705
+ #: views/view-about.php:200
706
+ msgid ""
707
+ "Thank you to all donors, contributors, supporters, reviewers and users of "
708
+ "the plugin!"
709
+ msgstr ""
710
+ "Děkuji všem dárcům, přispěvatelům, příznivcům, recenzentům a uživatelům "
711
+ "pluginu!"
712
+
713
+ # @ tablepress
714
+ #: views/view-add.php:37
715
+ msgid "Error: The table could not be added."
716
+ msgstr "Chyba: Tabulka nemohla být přidána."
717
+
718
+ # @ tablepress
719
+ #: views/view-add.php:42
720
+ msgid "Add Table"
721
+ msgstr "Přidat tabulku"
722
+
723
+ # @ tablepress
724
+ #: views/view-add.php:54
725
+ msgid ""
726
+ "To add a new table, enter its name, a description (optional), and the number "
727
+ "of rows and columns into the form below."
728
+ msgstr ""
729
+ "Chcete-li přidat novou tabulku, zadejte její název, popis (volitelné) a "
730
+ "počet řádků a sloupců do následujícího formuláře."
731
+
732
+ # @ tablepress
733
+ #: views/view-add.php:57
734
+ msgid ""
735
+ "You can always change the name, description, and size of your table later."
736
+ msgstr "Název, popis a velikost tabulky lze později změnit."
737
+
738
+ # @ tablepress
739
+ #: views/view-add.php:71 views/view-edit.php:200
740
+ #: views/view-editor_button_thickbox.php:236 views/view-list.php:310
741
+ msgid "Table Name"
742
+ msgstr "Název tabulky"
743
+
744
+ # @ tablepress
745
+ #: views/view-add.php:73
746
+ msgid "The name or title of your table."
747
+ msgstr "Jméno nebo název tabulky."
748
+
749
+ # @ tablepress
750
+ #: views/view-add.php:76 views/view-edit.php:204
751
+ #: views/view-editor_button_thickbox.php:237 views/view-list.php:311
752
+ msgid "Description"
753
+ msgstr "Popis"
754
+
755
+ # @ tablepress
756
+ #: views/view-add.php:76
757
+ msgid "(optional)"
758
+ msgstr "(volitelné)"
759
+
760
+ # @ tablepress
761
+ #: views/view-add.php:77
762
+ msgid "Enter Description here"
763
+ msgstr "Zadejte popis"
764
+
765
+ # @ tablepress
766
+ #: views/view-add.php:78
767
+ msgid "A description of the contents of your table."
768
+ msgstr "Popis obsahu tabulky."
769
+
770
+ # @ tablepress
771
+ #: views/view-add.php:81
772
+ msgid "Number of Rows"
773
+ msgstr "Počet řádků"
774
+
775
+ # @ tablepress
776
+ #: views/view-add.php:83
777
+ msgid "The number of rows in your table."
778
+ msgstr "Počet řádků v tabulce."
779
+
780
+ # @ tablepress
781
+ #: views/view-add.php:86
782
+ msgid "Number of Columns"
783
+ msgstr "Počet sloupců"
784
+
785
+ # @ tablepress
786
+ #: views/view-add.php:88
787
+ msgid "The number of columns in your table."
788
+ msgstr "Počet sloupců v tabulce."
789
+
790
+ # @ tablepress
791
+ #: views/view-edit.php:44
792
+ msgid "The table was saved successfully."
793
+ msgstr "Tabulka byla uložena."
794
+
795
+ # @ tablepress
796
+ #: views/view-edit.php:45
797
+ msgid "The table was added successfully."
798
+ msgstr "Tabulka byla přidána."
799
+
800
+ # @ tablepress
801
+ #: views/view-edit.php:47
802
+ msgid "The table was imported successfully."
803
+ msgstr "Tabulka byla úspěšně importována."
804
+
805
+ # @ tablepress
806
+ #: views/view-edit.php:48
807
+ msgid "The table was imported successfully from WP-Table Reloaded."
808
+ msgstr "Tabulka byla úspěšně importována z WP-Table Reloaded."
809
+
810
+ # @ tablepress
811
+ #: views/view-edit.php:49 views/view-list.php:98
812
+ msgid "Error: The table could not be saved."
813
+ msgstr "Chyba: Tabulka nemohla být uložena."
814
+
815
+ # @ tablepress
816
+ #: views/view-edit.php:50 views/view-list.php:97
817
+ msgid "Error: The table could not be deleted."
818
+ msgstr "Chyba: Tabulku nelze odstranit."
819
+
820
+ # @ tablepress
821
+ #: views/view-edit.php:51
822
+ msgid "The table was saved successfully, and the table ID was changed."
823
+ msgstr "Tabulka byla uložena a ID tabulky bylo změněno."
824
+
825
+ # @ tablepress
826
+ #: views/view-edit.php:52
827
+ msgid ""
828
+ "The table was saved successfully, but the table ID could not be changed!"
829
+ msgstr "Tabulka byla uložena úspěšně, ale ID tabukky nelze změnit!"
830
+
831
+ # @ tablepress
832
+ #: views/view-edit.php:73
833
+ msgctxt "Insert Link dialog"
834
+ msgid "Insert/edit link"
835
+ msgstr "Vložit / Upravit odkaz"
836
+
837
+ # @ tablepress
838
+ #: views/view-edit.php:74
839
+ msgctxt "Insert Link dialog"
840
+ msgid "Update"
841
+ msgstr "Aktualizovat"
842
+
843
+ # @ tablepress
844
+ #: views/view-edit.php:75
845
+ msgctxt "Insert Link dialog"
846
+ msgid "Add Link"
847
+ msgstr "Přidat odkaz"
848
+
849
+ # @ tablepress
850
+ #: views/view-edit.php:76
851
+ msgctxt "Insert Link dialog"
852
+ msgid "(no title)"
853
+ msgstr "(bez názvu)"
854
+
855
+ # @ tablepress
856
+ #: views/view-edit.php:77
857
+ msgctxt "Insert Link dialog"
858
+ msgid "No matches found."
859
+ msgstr "Žádné výsledky."
860
+
861
+ # @ tablepress
862
+ #: views/view-edit.php:78
863
+ msgctxt "Insert Link dialog"
864
+ msgid "Link Text"
865
+ msgstr "Text odkazu"
866
+
867
+ # @ tablepress
868
+ #: views/view-edit.php:89
869
+ msgid "You can not delete all table rows!"
870
+ msgstr "Nemůžete odstranit všechny řádky tabulky!"
871
+
872
+ # @ tablepress
873
+ #: views/view-edit.php:90
874
+ msgid "You can not delete all table columns!"
875
+ msgstr "Nemůžete odstranit všechny sloupce tabulky!"
876
+
877
+ # @ tablepress
878
+ #: views/view-edit.php:91
879
+ msgid "You did not select any rows!"
880
+ msgstr "Nevybrali jste žádné řádky!"
881
+
882
+ # @ tablepress
883
+ #: views/view-edit.php:92
884
+ msgid "You did not select any columns!"
885
+ msgstr "Nevybrali jste žádné sloupce!"
886
+
887
+ # @ tablepress
888
+ #: views/view-edit.php:93
889
+ msgid "The value for the number of rows is invalid!"
890
+ msgstr "Hodnota pro počet řádků je neplatná!"
891
+
892
+ # @ tablepress
893
+ #: views/view-edit.php:94
894
+ msgid "The value for the number of columns is invalid!"
895
+ msgstr "Hodnota pro počet sloupců je neplatná!"
896
+
897
+ # @ tablepress
898
+ #: views/view-edit.php:95 views/view-edit.php:96
899
+ msgid "Do you really want to delete the selected row?"
900
+ msgid_plural "Do you really want to delete the selected rows?"
901
+ msgstr[0] "Opravdu odstranit vybraný řádek?"
902
+ msgstr[1] "Opravdu odstranit vybrané řádky?"
903
+ msgstr[2] "Opravdu odstranit vybrané řádky?"
904
+
905
+ # @ tablepress
906
+ #: views/view-edit.php:97 views/view-edit.php:98
907
+ msgid "Do you really want to delete the selected column?"
908
+ msgid_plural "Do you really want to delete the selected columns?"
909
+ msgstr[0] "Opravdu odstranit vybraný sloupec?"
910
+ msgstr[1] "Opravdu odstranit vybrané sloupce?"
911
+ msgstr[2] "Opravdu odstranit vybrané sloupce?"
912
+
913
+ # @ tablepress
914
+ #: views/view-edit.php:99
915
+ msgid ""
916
+ "Please click into the cell that you want to edit using the &#8220;Advanced "
917
+ "Editor&#8221;."
918
+ msgstr ""
919
+ "Prosím, klikněte do buňky, kterou chcete upravit pomocí &#8220;"
920
+ "Editora&#8221;."
921
+
922
+ # @ tablepress
923
+ #: views/view-edit.php:100
924
+ msgid ""
925
+ "To combine cells within a column, click into the cell below the cell that "
926
+ "has the content the combined cells shall have."
927
+ msgstr ""
928
+ "Chcete-li sloučit buňky ve sloupci, klepněte do buňky pod buňkou s obsahem, "
929
+ "který sa má zobrazit ve sloučené buňce."
930
+
931
+ # @ tablepress
932
+ #: views/view-edit.php:101
933
+ msgid ""
934
+ "To combine cells within a row, click into the cell to the right of the cell "
935
+ "that has the content the combined cells shall have."
936
+ msgstr ""
937
+ "Chcete-li sloučit buňky v řádku, klepněte do buňky vpravo od buňky s "
938
+ "obsahem, který sa má zobrazit ve sloučené buňce."
939
+
940
+ # @ tablepress
941
+ #: views/view-edit.php:102
942
+ msgid ""
943
+ "Attention: You have enabled the usage of the DataTables JavaScript library "
944
+ "for features like sorting, search, or pagination."
945
+ msgstr ""
946
+ "Upozornění: Povolili jste použití knihovny DataTables JavaScript pro funkce, "
947
+ "jako je třídění, vyhledávání, nebo stránkování."
948
+
949
+ # @ tablepress
950
+ #: views/view-edit.php:103
951
+ msgid "Unfortunately, these can not be used in tables with combined cells."
952
+ msgstr "Bohužel, není možné je použít v tabulkách se sloučenými buňkami."
953
+
954
+ # @ tablepress
955
+ #: views/view-edit.php:104
956
+ msgid ""
957
+ "Do you want to proceed and automatically turn off the usage of DataTables "
958
+ "for this table?"
959
+ msgstr "Chcete pokračovat s automatickým vypnutím DataTables této tabulky?"
960
+
961
+ # @ tablepress
962
+ #: views/view-edit.php:105
963
+ msgid "Please click into the cell that you want to add a link to."
964
+ msgstr "Klikněte do buňky, do které chcete vložit odkaz."
965
+
966
+ # @ tablepress
967
+ #: views/view-edit.php:106
968
+ msgid ""
969
+ "You can then enter the Link URL and Text or choose an existing page or post."
970
+ msgstr ""
971
+ "Potom můžete vložit URL odkazu a text, nebo vybrat existující stránku, či "
972
+ "príspěvek."
973
+
974
+ # @ tablepress
975
+ #: views/view-edit.php:107
976
+ msgid "Please click into the cell that you want to add an image to."
977
+ msgstr "Klikněte do buňky, do které chcete vložit obrázek."
978
+
979
+ # @ tablepress
980
+ #: views/view-edit.php:108
981
+ msgid ""
982
+ "The Media Library will open, where you can select or upload the desired "
983
+ "image or enter the image URL."
984
+ msgstr ""
985
+ "Otevře se Knihovna médií, kde můžete vybrat, nebo nahrát požadovaný obrázek, "
986
+ "nebo zadat URL adresu obrázku."
987
+
988
+ # @ tablepress
989
+ #: views/view-edit.php:109
990
+ #, php-format
991
+ msgid "Click the &#8220;%s&#8221; button to insert the image."
992
+ msgstr "Klikněte na &#8220;%s&#8221; tlačítko pro vložení obrázku."
993
+
994
+ # @ default
995
+ #: views/view-edit.php:109
996
+ msgid "Insert into Post"
997
+ msgstr "Vložiť do príspevku"
998
+
999
+ # @ tablepress
1000
+ #: views/view-edit.php:110
1001
+ msgid ""
1002
+ "The changes to this table were not saved yet and will be lost if you "
1003
+ "navigate away from this page."
1004
+ msgstr "Jestliže nyní opustíte stránku, změny v této tabulce budou ztracené."
1005
+
1006
+ # @ tablepress
1007
+ #: views/view-edit.php:111
1008
+ msgid "The Table Preview is being loaded..."
1009
+ msgstr "Náhled tabulky se nahrává..."
1010
+
1011
+ # @ tablepress
1012
+ #: views/view-edit.php:112
1013
+ msgid "The Table Preview could not be loaded."
1014
+ msgstr "Náhled nemohl být načten."
1015
+
1016
+ # @ tablepress
1017
+ #: views/view-edit.php:113
1018
+ msgid "Saving successful"
1019
+ msgstr "Uloženo"
1020
+
1021
+ # @ tablepress
1022
+ #: views/view-edit.php:114
1023
+ msgid "Saving failed"
1024
+ msgstr "Neuloženo"
1025
+
1026
+ # @ tablepress
1027
+ #: views/view-edit.php:115
1028
+ msgid "Changes are being saved..."
1029
+ msgstr "Změny jsou uložené..."
1030
+
1031
+ # @ tablepress
1032
+ #: views/view-edit.php:116
1033
+ msgid "The Table ID field can not be empty. Please enter a Table ID!"
1034
+ msgstr "Pole ID tabulky nemůže být prázdné. Vložte ID tabulky!"
1035
+
1036
+ # @ tablepress
1037
+ #: views/view-edit.php:117
1038
+ msgid ""
1039
+ "The Table ID &#8220;0&#8221; is not supported. Please enter a different "
1040
+ "Table ID!"
1041
+ msgstr "ID tabulky &#8220;0&#8221; není podporované. Vložte jiné ID!"
1042
+
1043
+ # @ tablepress
1044
+ #: views/view-edit.php:118
1045
+ msgid ""
1046
+ "Do you really want to change the Table ID? All Shortcodes for this table in "
1047
+ "your pages and posts will have to be adjusted!"
1048
+ msgstr ""
1049
+ "Opravdu chcete změnit ID tabulky? Všechny <em>zkrácené zápisy</em> na vašich "
1050
+ "stránkách budou muset být upraveny!"
1051
+
1052
+ # @ tablepress
1053
+ #: views/view-edit.php:119
1054
+ msgid ""
1055
+ "The entered value in the field &#8220;Extra CSS classes&#8221; is invalid."
1056
+ msgstr "Zadaná hodnota v poli &#8220;Extra třídy CSS&#8221; je neplatná."
1057
+
1058
+ # @ tablepress
1059
+ #: views/view-edit.php:120
1060
+ msgid ""
1061
+ "The entered value in the field &#8220;Pagination Entries&#8221; is not a "
1062
+ "number."
1063
+ msgstr "Zadaná hodnota v poli &#8220;stránkování záznamů&#8221; není číslo."
1064
+
1065
+ # @ tablepress
1066
+ #: views/view-edit.php:121 views/view-edit.php:259
1067
+ msgid "Sort ascending"
1068
+ msgstr "Řadit vzestupně"
1069
+
1070
+ # @ tablepress
1071
+ #: views/view-edit.php:122 views/view-edit.php:259
1072
+ msgid "Sort descending"
1073
+ msgstr "Řadit sestupně"
1074
+
1075
+ # @ tablepress
1076
+ #: views/view-edit.php:123
1077
+ msgid "You can not add rowspan to the first row!"
1078
+ msgstr "Nemůžete sloučit buňky prvního řádku!"
1079
+
1080
+ # @ tablepress
1081
+ #: views/view-edit.php:124
1082
+ msgid "You can not add colspan to the first column!"
1083
+ msgstr "Nemůžete sloučit buňky prvního sloupce!"
1084
+
1085
+ # @ tablepress
1086
+ #: views/view-edit.php:125
1087
+ msgid "You can not connect cells into the table head row!"
1088
+ msgstr "Nemůžete připojit buňky ke hlavičce tabulky!"
1089
+
1090
+ # @ tablepress
1091
+ #: views/view-edit.php:126
1092
+ msgid "You can not connect cells out of the table foot row!"
1093
+ msgstr "Nemůžete připojit buňky k patičce tabulky!"
1094
+
1095
+ # @ tablepress
1096
+ #: views/view-edit.php:132
1097
+ msgid "Table Information"
1098
+ msgstr "Informace o tabulce"
1099
+
1100
+ # @ tablepress
1101
+ #: views/view-edit.php:133
1102
+ msgid "Table Content"
1103
+ msgstr "Obsah tabulky"
1104
+
1105
+ # @ tablepress
1106
+ #: views/view-edit.php:134
1107
+ msgid "Table Manipulation"
1108
+ msgstr "Úpravy buněk"
1109
+
1110
+ # @ tablepress
1111
+ #: views/view-edit.php:135 views/view-edit.php:524
1112
+ msgid "Table Options"
1113
+ msgstr "Možnosti tabulky"
1114
+
1115
+ # @ tablepress
1116
+ #: views/view-edit.php:136
1117
+ msgid "Features of the DataTables JavaScript library"
1118
+ msgstr "Vlastnosti knihovny DataTables JavaScript"
1119
+
1120
+ # @ tablepress
1121
+ #: views/view-edit.php:162
1122
+ msgid "Insert into Table"
1123
+ msgstr "Vložit do tabulky"
1124
+
1125
+ # @ tablepress
1126
+ #: views/view-edit.php:191
1127
+ msgid "Table ID"
1128
+ msgstr "ID tabulky"
1129
+
1130
+ # @ tablepress
1131
+ #: views/view-edit.php:195
1132
+ msgid "Shortcode"
1133
+ msgstr "Zkrácený zápis"
1134
+
1135
+ # @ tablepress
1136
+ #: views/view-edit.php:208 views/view-list.php:314
1137
+ msgid "Last Modified"
1138
+ msgstr "Naposledy změněno"
1139
+
1140
+ # @ tablepress
1141
+ #: views/view-edit.php:209
1142
+ #, php-format
1143
+ msgid "%1$s by %2$s"
1144
+ msgstr "%1$s %2$s"
1145
+
1146
+ # @ tablepress
1147
+ #: views/view-edit.php:329
1148
+ msgid "Insert Link"
1149
+ msgstr "Vložit odkaz"
1150
+
1151
+ # @ tablepress
1152
+ #: views/view-edit.php:330
1153
+ msgid "Insert Image"
1154
+ msgstr "Vložit obrázek"
1155
+
1156
+ # @ tablepress
1157
+ #: views/view-edit.php:331
1158
+ msgid "Advanced Editor"
1159
+ msgstr "Rozšířený Editor"
1160
+
1161
+ # @ tablepress
1162
+ #: views/view-edit.php:334
1163
+ msgid "Combine cells"
1164
+ msgstr "Spojování buněk"
1165
+
1166
+ # @ tablepress
1167
+ #: views/view-edit.php:335
1168
+ msgid "in a column (rowspan)"
1169
+ msgstr "ve sloupci (rowspan)"
1170
+
1171
+ # @ tablepress
1172
+ #: views/view-edit.php:336
1173
+ msgid "in a row (colspan)"
1174
+ msgstr "v řádku (colspan)"
1175
+
1176
+ # @ tablepress
1177
+ #: views/view-edit.php:337
1178
+ msgid "?"
1179
+ msgstr "?"
1180
+
1181
+ # @ tablepress
1182
+ #: views/view-edit.php:339
1183
+ msgid "Table cells can span across more than one column or row."
1184
+ msgstr ""
1185
+ "Buňky tabulky mohou být rozložené přes více než jeden sloupec, nebo řádek."
1186
+
1187
+ # @ tablepress
1188
+ #: views/view-edit.php:340
1189
+ msgid ""
1190
+ "Combining consecutive cells within the same row is called &#8220;"
1191
+ "colspanning&#8221;."
1192
+ msgstr ""
1193
+ "Sloučení po sobě jdoucích buněk ve stejném řádku se nazývá &#8220;"
1194
+ "colspanning&#8221;."
1195
+
1196
+ # @ tablepress
1197
+ #: views/view-edit.php:341
1198
+ msgid ""
1199
+ "Combining consecutive cells within the same column is called &#8220;"
1200
+ "rowspanning&#8221;."
1201
+ msgstr ""
1202
+ "Sloučení po sobě jdoucích buněk ve stejném sloupci se nazývá &#8220;"
1203
+ "rowspanning&#8221;."
1204
+
1205
+ # @ tablepress
1206
+ #: views/view-edit.php:342
1207
+ msgid ""
1208
+ "To combine adjacent cells in a row, add the keyword <code>#colspan#</code> "
1209
+ "to the cell to the right of the one with the content for the combined cell "
1210
+ "by using the corresponding button."
1211
+ msgstr ""
1212
+ "Chcete-li sloučit sousední buňky v řádku, přidejte klíčové slovo "
1213
+ "<code>#colspan#</code> do buňky vpravo od té s obsahem, který chcete "
1214
+ "zobrazit ve sloučené buňce."
1215
+
1216
+ # @ tablepress
1217
+ #: views/view-edit.php:343
1218
+ msgid ""
1219
+ "To combine adjacent cells in a column, add the keyword <code>#rowspan#</"
1220
+ "code> to the cell below the one with the content for the combined cell by "
1221
+ "using the corresponding button."
1222
+ msgstr ""
1223
+ "Chcete-li sloučit sousední buňky ve sloupci, přidejte klíčové slovo "
1224
+ "<code>#colspan#</code> do buňky pod tou s obsahem, který chcete zobrazit ve "
1225
+ "sloučené buňce."
1226
+
1227
+ # @ tablepress
1228
+ #: views/view-edit.php:344
1229
+ msgid "Repeat this to add the keyword to all cells that shall be connected."
1230
+ msgstr ""
1231
+ "Opakujte tento postup přidáním klíčového slova do všech buněk, které mají "
1232
+ "být sloučeny."
1233
+
1234
+ # @ tablepress
1235
+ #: views/view-edit.php:345
1236
+ msgid ""
1237
+ "Be aware that the functions of the DataTables JavaScript library will not "
1238
+ "work on tables which have combined cells."
1239
+ msgstr ""
1240
+ "Funkce DataTables JavaScript nebude fungovat v tabulkách se sloučenými "
1241
+ "buňkami."
1242
+
1243
+ # @ tablepress
1244
+ #: views/view-edit.php:351 views/view-edit.php:363
1245
+ msgid "Selected rows"
1246
+ msgstr "Vybrané řádky"
1247
+
1248
+ # @ tablepress
1249
+ #: views/view-edit.php:352 views/view-edit.php:357
1250
+ msgid "Hide"
1251
+ msgstr "Skrýt"
1252
+
1253
+ # @ tablepress
1254
+ #: views/view-edit.php:353 views/view-edit.php:358
1255
+ msgid "Show"
1256
+ msgstr "Zobrazit"
1257
+
1258
+ # @ tablepress
1259
+ #: views/view-edit.php:356 views/view-edit.php:369
1260
+ msgid "Selected columns"
1261
+ msgstr "Vybrané sloupce"
1262
+
1263
+ # @ tablepress
1264
+ #: views/view-edit.php:364 views/view-edit.php:370
1265
+ msgid "Duplicate"
1266
+ msgstr "Duplikovat"
1267
+
1268
+ # @ tablepress
1269
+ #: views/view-edit.php:365 views/view-edit.php:371
1270
+ msgid "Insert"
1271
+ msgstr "Vložit"
1272
+
1273
+ # @ tablepress
1274
+ #: views/view-edit.php:366 views/view-edit.php:372 views/view-list.php:412
1275
+ msgid "Delete"
1276
+ msgstr "Smazat"
1277
+
1278
+ # @ tablepress
1279
+ #: views/view-edit.php:377
1280
+ #, php-format
1281
+ msgid "Add %s row(s)"
1282
+ msgstr "Přidat %s řádek (řádky)"
1283
+
1284
+ # @ tablepress
1285
+ #: views/view-add.php:82 views/view-add.php:87 views/view-edit.php:377
1286
+ #: views/view-edit.php:380
1287
+ msgid "This field must contain a positive number."
1288
+ msgstr "Toto pole musí obsahovat kladné číslo."
1289
+
1290
+ # @ tablepress
1291
+ #: views/view-edit.php:377 views/view-edit.php:380
1292
+ msgid "Add"
1293
+ msgstr "Přidat"
1294
+
1295
+ # @ tablepress
1296
+ #: views/view-edit.php:380
1297
+ #, php-format
1298
+ msgid "Add %s column(s)"
1299
+ msgstr "Přidat %s sloupec (sloupce)"
1300
+
1301
+ # @ tablepress
1302
+ #: views/view-edit.php:384
1303
+ msgid ""
1304
+ "To use the Table Manipulation features, JavaScript needs to be enabled in "
1305
+ "your browser."
1306
+ msgstr ""
1307
+ "Chcete-li používat vlastnosti pro &#8220;Úpravu buněk&#8221; povote "
1308
+ "JavaScript ve svém prohlížeči."
1309
+
1310
+ # @ tablepress
1311
+ #: views/view-edit.php:420
1312
+ msgid "Other Actions"
1313
+ msgstr "Ostatní akce"
1314
+
1315
+ # @ tablepress
1316
+ #: views/view-edit.php:426
1317
+ msgid "Delete Table"
1318
+ msgstr "Smazat tabulku"
1319
+
1320
+ # @ tablepress
1321
+ #: views/view-edit.php:424
1322
+ msgid "Export Table"
1323
+ msgstr "Export tabulky"
1324
+
1325
+ # @ tablepress
1326
+ #: views/view-edit.php:450
1327
+ msgid "Cancel"
1328
+ msgstr "Zrušit"
1329
+
1330
+ # @ tablepress
1331
+ #: views/view-edit.php:451
1332
+ msgid "OK"
1333
+ msgstr "OK"
1334
+
1335
+ # @ tablepress
1336
+ #: views/view-edit.php:472 views/view-edit.php:524
1337
+ msgid "Table Head Row"
1338
+ msgstr "Hlavička tabulky"
1339
+
1340
+ # @ tablepress
1341
+ #: views/view-edit.php:473
1342
+ msgid "The first row of the table is the table header."
1343
+ msgstr "První řádek tabulky je hlavička tabulky."
1344
+
1345
+ # @ tablepress
1346
+ #: views/view-edit.php:476
1347
+ msgid "Table Foot Row"
1348
+ msgstr "Patička tabulky"
1349
+
1350
+ # @ tablepress
1351
+ #: views/view-edit.php:477
1352
+ msgid "The last row of the table is the table footer."
1353
+ msgstr "Poslední řádek tabulky je patička."
1354
+
1355
+ # @ tablepress
1356
+ #: views/view-edit.php:480
1357
+ msgid "Alternating Row Colors"
1358
+ msgstr "Střídavá barva řádků"
1359
+
1360
+ # @ tablepress
1361
+ #: views/view-edit.php:481
1362
+ msgid "The background colors of consecutive rows shall alternate."
1363
+ msgstr "Barvy pozadí se v po sobě jdoucích řádcích střídají."
1364
+
1365
+ # @ tablepress
1366
+ #: views/view-edit.php:484
1367
+ msgid "Row Hover Highlighting"
1368
+ msgstr "Zvýraznění řádku"
1369
+
1370
+ # @ tablepress
1371
+ #: views/view-edit.php:485
1372
+ msgid ""
1373
+ "Highlight a row while the mouse cursor hovers above it by changing its "
1374
+ "background color."
1375
+ msgstr "Zvýraznit řádek změnou barvy pozadí při přejetí myší."
1376
+
1377
+ # @ tablepress
1378
+ #: views/view-edit.php:488
1379
+ msgid "Print Table Name"
1380
+ msgstr "Název tabulky"
1381
+
1382
+ # @ tablepress
1383
+ #: views/view-edit.php:491 views/view-edit.php:501
1384
+ msgid "above"
1385
+ msgstr "nad"
1386
+
1387
+ # @ tablepress
1388
+ #: views/view-edit.php:492 views/view-edit.php:502
1389
+ msgid "below"
1390
+ msgstr "pod"
1391
+
1392
+ # @ tablepress
1393
+ #: views/view-edit.php:498
1394
+ msgid "Print Table Description"
1395
+ msgstr "Popis tabulky"
1396
+
1397
+ # @ tablepress
1398
+ #: views/view-edit.php:508
1399
+ msgid "Extra CSS Classes"
1400
+ msgstr "Extra CSS třídy"
1401
+
1402
+ # @ tablepress
1403
+ #: views/view-edit.php:509
1404
+ msgid "Additional CSS classes for styling purposes can be entered here."
1405
+ msgstr "Další CSS třídy můžete zadat zde."
1406
+
1407
+ # @ tablepress
1408
+ #: views/view-edit.php:509
1409
+ #, php-format
1410
+ msgid "This is NOT the place to enter <a href=\"%s\">Custom CSS</a> code!"
1411
+ msgstr "Toto není místo pro vložení <a href=\"%s\">vlastního CSS</a> kódu!"
1412
+
1413
+ # @ tablepress
1414
+ #: views/view-edit.php:524
1415
+ #, php-format
1416
+ msgid ""
1417
+ "These features and options are only available, when the &#8220;%1$s&#8221; "
1418
+ "checkbox in the &#8220;%2$s&#8221; section is checked."
1419
+ msgstr ""
1420
+ "Tyto vlastnosti a možnosti jsou k dispozici, je-li vybrané &#8220;"
1421
+ "%1$s&#8221; zatržítko &#8220;%2$s&#8221; sekce."
1422
+
1423
+ # @ tablepress
1424
+ #: views/view-edit.php:528
1425
+ msgid "Use DataTables"
1426
+ msgstr "Použití DataTables"
1427
+
1428
+ # @ tablepress
1429
+ #: views/view-edit.php:529
1430
+ msgid ""
1431
+ "Use the following features of the DataTables JavaScript library with this "
1432
+ "table:"
1433
+ msgstr "Použít nasledující funkce knihovny <em>DataTables JavaScript</em>:"
1434
+
1435
+ # @ tablepress
1436
+ #: views/view-edit.php:532
1437
+ msgid "Sorting"
1438
+ msgstr "Řazení"
1439
+
1440
+ # @ tablepress
1441
+ #: views/view-edit.php:533
1442
+ msgid "Enable sorting of the table by the visitor."
1443
+ msgstr "Povolit návštěvníkům třídění údajů tabulky."
1444
+
1445
+ # @ tablepress
1446
+ #: views/view-edit.php:536
1447
+ msgid "Search/Filtering"
1448
+ msgstr "Vyhledávání / Filtrování"
1449
+
1450
+ # @ tablepress
1451
+ #: views/view-edit.php:537
1452
+ msgid ""
1453
+ "Enable the visitor to filter or search the table. Only rows with the search "
1454
+ "word in them are shown."
1455
+ msgstr ""
1456
+ "Povolit návštěvníkům filtrování, nebo vyhledávání v tabulce. Zobrazeny jsou "
1457
+ "pouze řádky s hledaným výrazem."
1458
+
1459
+ # @ tablepress
1460
+ #: views/view-edit.php:540
1461
+ msgid "Pagination"
1462
+ msgstr "Stránkování"
1463
+
1464
+ # @ tablepress
1465
+ #: views/view-edit.php:541
1466
+ msgid ""
1467
+ "Enable pagination of the table (viewing only a certain number of rows at a "
1468
+ "time) by the visitor."
1469
+ msgstr ""
1470
+ "Povolit návštěvníkům stránkování tabulky (zobrazí se pouze určitý počet "
1471
+ "řádků najednou)."
1472
+
1473
+ # @ tablepress
1474
+ #: views/view-edit.php:542
1475
+ #, php-format
1476
+ msgid "Show %s rows per page."
1477
+ msgstr "Zobrazit %s řádků na stránce."
1478
+
1479
+ # @ tablepress
1480
+ #: views/view-edit.php:545
1481
+ msgid "Pagination Length Change"
1482
+ msgstr "Změna délky stránkování"
1483
+
1484
+ # @ tablepress
1485
+ #: views/view-edit.php:546
1486
+ msgid ""
1487
+ "Allow the visitor to change the number of rows shown when using pagination."
1488
+ msgstr ""
1489
+ "Povolit návštěvníkům změnit počet řádků zobrazených při použití stránkování."
1490
+
1491
+ # @ tablepress
1492
+ #: views/view-edit.php:549
1493
+ msgid "Info"
1494
+ msgstr "Info"
1495
+
1496
+ # @ tablepress
1497
+ #: views/view-edit.php:550
1498
+ msgid ""
1499
+ "Enable the table information display, with information about the currently "
1500
+ "visible data, like the number of rows."
1501
+ msgstr "Zapnout informace o aktuálně zobrazených údajích, jako je počet řádků."
1502
+
1503
+ # @ tablepress
1504
+ #: views/view-edit.php:553
1505
+ msgid "Horizontal Scrolling"
1506
+ msgstr "Horizontální rolování"
1507
+
1508
+ # @ tablepress
1509
+ #: views/view-edit.php:554
1510
+ msgid ""
1511
+ "Enable horizontal scrolling, to make viewing tables with many columns easier."
1512
+ msgstr ""
1513
+ "Povolit vodorovné posouvání pro jednodušší prohlížení tabulek se mnoha "
1514
+ "sloupci."
1515
+
1516
+ # @ tablepress
1517
+ #: views/view-edit.php:560
1518
+ msgid "Custom Commands"
1519
+ msgstr "Vlastní příkazy"
1520
+
1521
+ # @ tablepress
1522
+ #: views/view-edit.php:561
1523
+ msgid ""
1524
+ "Additional parameters from the <a href=\"http://www.datatables.net/"
1525
+ "\">DataTables documentation</a> to be added to the JS call."
1526
+ msgstr ""
1527
+ "Přidat parametry z <a href=\"http://www.datatables.net/\">dokumentace "
1528
+ "DataTables</a>, pro javaskriptové volání."
1529
+
1530
+ # @ tablepress
1531
+ #: views/view-edit.php:561
1532
+ msgid "For advanced use only."
1533
+ msgstr "Jen pro pokročilé."
1534
+
1535
+ # @ tablepress
1536
+ #: views/view-edit.php:576
1537
+ #, php-format
1538
+ msgid ""
1539
+ "On this screen, you can edit the content and structure of the table with the "
1540
+ "ID %s."
1541
+ msgstr "Na této obrazovce lze měnit obsah a strukturu tabulky s ID %s."
1542
+
1543
+ # @ tablepress
1544
+ #: views/view-edit.php:577
1545
+ msgid ""
1546
+ "For example, you can insert things like text, images, or links into the "
1547
+ "table, or change the used table features. You can also insert, delete, move, "
1548
+ "hide, and swap columns and rows."
1549
+ msgstr ""
1550
+ "Například: můžete vložit do tabulky text, obrázky, nebo odkazy, nebo změnit "
1551
+ "vlastnosti tabulky. Můžete také vložit, odstranit, přesunout, skrýt a "
1552
+ "vyměnit sloupce a řádky."
1553
+
1554
+ # @ tablepress
1555
+ #: views/view-edit.php:580
1556
+ #, php-format
1557
+ msgid ""
1558
+ "To insert the table into a page, post, or text widget, copy the Shortcode %s "
1559
+ "and paste it at the desired place in the editor."
1560
+ msgstr ""
1561
+ "Když chcete vložit tabulku do stránky, příspěvku, nebo textového widgetu, "
1562
+ "zkopírujte <em>zkrácený zápis</em> %s a vložte ho na požadované místo v "
1563
+ "editoru."
1564
+
1565
+ # @ tablepress
1566
+ #: views/view-edit.php:591
1567
+ msgid "TablePress Feature: Moving rows and columns"
1568
+ msgstr "TablePress funkce: Přesun řádků a sloupců"
1569
+
1570
+ # @ tablepress
1571
+ #: views/view-edit.php:592
1572
+ msgid ""
1573
+ "Did you know? You can drag and drop rows and columns via the row number and "
1574
+ "the column title. And the arrows next to the column title can be used for "
1575
+ "sorting."
1576
+ msgstr ""
1577
+ "Věděli jste? Můžete přetáhnout řádky a sloupce pomocí čísla řádku a titulku "
1578
+ "sloupce. A šipky vedle názvu sloupce slouží pro třídění."
1579
+
1580
+ # @ tablepress
1581
+ #: views/view-editor_button_thickbox.php:71
1582
+ #: views/view-editor_button_thickbox.php:132
1583
+ msgid "List of Tables"
1584
+ msgstr "Seznam tabulek"
1585
+
1586
+ # @ tablepress
1587
+ #: views/view-editor_button_thickbox.php:135
1588
+ msgid "This is a list of all available tables."
1589
+ msgstr "Toto seznam všech dostupných tabulek."
1590
+
1591
+ # @ tablepress
1592
+ #: views/view-editor_button_thickbox.php:135
1593
+ msgid "You may insert a table into a post or page here."
1594
+ msgstr "Zde můžete vložit tabulku do příspěvku, nebo do stránky."
1595
+
1596
+ # @ tablepress
1597
+ #: views/view-editor_button_thickbox.php:137
1598
+ #, php-format
1599
+ msgid ""
1600
+ "Click the &#8220;%1$s&#8221; button for the desired table to automatically "
1601
+ "insert the<br />corresponding Shortcode (%2$s) into the editor."
1602
+ msgstr ""
1603
+ "Klikněte na tlačítko &#8220;%1$s&#8221; kterým vložíte zkrácený zápis (%2$s) "
1604
+ "pro požadovanou tabulku do editoru."
1605
+
1606
+ # @ tablepress
1607
+ #: views/view-editor_button_thickbox.php:137
1608
+ #: views/view-editor_button_thickbox.php:313
1609
+ msgid "Insert Shortcode"
1610
+ msgstr "Vložit tabulku"
1611
+
1612
+ # @ tablepress
1613
+ #: views/view-editor_button_thickbox.php:141 views/view-list.php:197
1614
+ #, php-format
1615
+ msgid "Search results for &#8220;%s&#8221;"
1616
+ msgstr "Výsledky hledání pro &#8220;%s&#8221;"
1617
+
1618
+ # @ tablepress
1619
+ #: views/view-editor_button_thickbox.php:146 views/view-list.php:203
1620
+ msgid "Search Tables"
1621
+ msgstr "Hledat tabulky"
1622
+
1623
+ # @ tablepress
1624
+ #: views/view-editor_button_thickbox.php:235 views/view-list.php:309
1625
+ msgid "ID"
1626
+ msgstr "ID"
1627
+
1628
+ # @ tablepress
1629
+ #: views/view-editor_button_thickbox.php:238
1630
+ msgid "Action"
1631
+ msgstr "Akce"
1632
+
1633
+ # @ tablepress
1634
+ #: views/view-editor_button_thickbox.php:300 views/view-list.php:429
1635
+ msgid "(no description)"
1636
+ msgstr "(žádný popis)"
1637
+
1638
+ # @ tablepress
1639
+ #: views/view-editor_button_thickbox.php:322 views/view-export.php:81
1640
+ #: views/view-list.php:535
1641
+ msgid "No tables found."
1642
+ msgstr "Žádné tabulky nebyly nalezeny."
1643
+
1644
+ # @ tablepress
1645
+ #: views/view-editor_button_thickbox.php:324
1646
+ msgid ""
1647
+ "You should add or import a table on the TablePress screens to get started!"
1648
+ msgstr ""
1649
+ "Začínáme: měli byste přidat nebo importovat do TablePress nějaké tabulky."
1650
+
1651
+ # @ tablepress
1652
+ #: views/view-export.php:35
1653
+ msgid "Error: The export failed."
1654
+ msgstr "Chyba: export selhal."
1655
+
1656
+ # @ tablepress
1657
+ #: views/view-export.php:36 views/view-list.php:103
1658
+ msgid "Error: This table could not be loaded!"
1659
+ msgstr "Chyba: Tuto tabulku se nepodařilo načíst!"
1660
+
1661
+ # @ tablepress
1662
+ #: views/view-export.php:37
1663
+ msgid "Error: The ZIP file could not be created."
1664
+ msgstr "Chyba: soubor ZIP se nepodařilo vytvořit."
1665
+
1666
+ # @ tablepress
1667
+ #: views/view-export.php:42 views/view-export.php:45
1668
+ msgid "Export Tables"
1669
+ msgstr "Exportovat tabulky"
1670
+
1671
+ # @ tablepress
1672
+ #: views/view-export.php:46
1673
+ msgctxt "button"
1674
+ msgid "Download Export File"
1675
+ msgstr "Stáhnout soubor exportu"
1676
+
1677
+ # @ tablepress
1678
+ #: views/view-export.php:59
1679
+ msgid ""
1680
+ "Exporting a table allows you to use it in other programs, like spreadsheets "
1681
+ "applications."
1682
+ msgstr "Exportované tabulky můžete použít v jiných programech."
1683
+
1684
+ # @ tablepress
1685
+ #: views/view-export.php:60
1686
+ msgid ""
1687
+ "Regularly exporting tables is also recommended as a backup of your data."
1688
+ msgstr "Pravidelný export tabulek je rovněž doporučován pro zálohu vašich dat."
1689
+
1690
+ # @ tablepress
1691
+ #: views/view-export.php:63
1692
+ msgid "To export, select the tables and the desired export format."
1693
+ msgstr "Chcete-li exportovat, vyberte tabulky a požadovaný exportní formát."
1694
+
1695
+ # @ tablepress
1696
+ #: views/view-export.php:64
1697
+ msgid ""
1698
+ "If you choose more than one table, the exported files will automatically be "
1699
+ "stored in a ZIP archive file."
1700
+ msgstr ""
1701
+ "Zvolíte-li více než jednu tabulku, budou exportované soubory automaticky "
1702
+ "uloženy do souboru ZIP."
1703
+
1704
+ # @ tablepress
1705
+ #: views/view-export.php:66
1706
+ msgid ""
1707
+ "Be aware that for the CSV and HTML formats only the table data, but no table "
1708
+ "options are exported!"
1709
+ msgstr ""
1710
+ "Pamatujte, že do souborů CSV a HTML jsou exportována pouze data tabulky, ne "
1711
+ "nastavení tabulky!"
1712
+
1713
+ # @ tablepress
1714
+ #: views/view-export.php:67
1715
+ msgid "For the JSON format, the table data and the table options are exported."
1716
+ msgstr "Do formátu JSON jsou exportována data i nastavení tabulky."
1717
+
1718
+ # @ tablepress
1719
+ #: views/view-export.php:82 views/view-list.php:544
1720
+ #, php-format
1721
+ msgid ""
1722
+ "You should <a href=\"%s\">add</a> or <a href=\"%s\">import</a> a table to "
1723
+ "get started!"
1724
+ msgstr ""
1725
+ "Začínáme: <a href=\"%s\">přidat</a> nebo <a href=\"%s\"> importovat </a> "
1726
+ "tabulku!"
1727
+
1728
+ # @ tablepress
1729
+ #: views/view-export.php:97
1730
+ msgid "Tables to Export"
1731
+ msgstr "Tabulky pro export"
1732
+
1733
+ # @ tablepress
1734
+ #: views/view-export.php:100
1735
+ msgid "Select all"
1736
+ msgstr "Vybrat všechny"
1737
+
1738
+ # @ tablepress
1739
+ #: views/view-export.php:118 views/view-import.php:191
1740
+ #, php-format
1741
+ msgid "ID %1$s: %2$s"
1742
+ msgstr "ID %1$s: %2$s"
1743
+
1744
+ # @ tablepress
1745
+ #: views/view-export.php:126
1746
+ msgid ""
1747
+ "You can select multiple tables by holding down the &#8220;Ctrl&#8221; key "
1748
+ "(Windows) or the &#8220;Command&#8221; key (Mac)."
1749
+ msgstr ""
1750
+ "Můžete vybrat více tabulek podržením klávesy &#8220;Ctrl&#8221; (Windows), "
1751
+ "nebo &#8220;Command&#8221; (Mac)."
1752
+
1753
+ # @ tablepress
1754
+ #: views/view-export.php:131
1755
+ msgid "Export Format"
1756
+ msgstr "Exportovat ve formátu"
1757
+
1758
+ # @ tablepress
1759
+ #: views/view-export.php:144
1760
+ msgid "CSV Delimiter"
1761
+ msgstr "CSV oddělovač "
1762
+
1763
+ # @ tablepress
1764
+ #: views/view-export.php:153
1765
+ msgid "(Only needed for CSV export.)"
1766
+ msgstr "(Potřebné pouze pro exportní formát CSV.)"
1767
+
1768
+ # @ tablepress
1769
+ #: views/view-export.php:157
1770
+ msgid "ZIP file"
1771
+ msgstr "soubor ZIP"
1772
+
1773
+ # @ tablepress
1774
+ #: views/view-export.php:163
1775
+ msgid "Create a ZIP archive."
1776
+ msgstr "Vytvořit ZIP archív"
1777
+
1778
+ # @ tablepress
1779
+ #: views/view-export.php:163
1780
+ msgid "(Mandatory if more than one table is selected.)"
1781
+ msgstr "(Povinné, je-li vybraná více jak jedna tabulka.)"
1782
+
1783
+ # @ tablepress
1784
+ #: views/view-export.php:166
1785
+ msgid ""
1786
+ "Note: Support for ZIP file creation seems not to be available on this server."
1787
+ msgstr "Poznámka: Vytváření souborů ZIP zřejmě tento server neumožňuje."
1788
+
1789
+ # @ tablepress
1790
+ #: views/view-import.php:45 views/view-import.php:57
1791
+ msgid "Error: You did not select what to import from WP-Table Reloaded!"
1792
+ msgstr "Chyba: Nevybrali jste, co chcete importovat z WP-Table Reloaded!"
1793
+
1794
+ # @ tablepress
1795
+ #: views/view-import.php:50
1796
+ msgid "Error: The import failed."
1797
+ msgstr "Chyba: import selhal."
1798
+
1799
+ # @ tablepress
1800
+ #: views/view-import.php:51
1801
+ msgid "Error: Import of ZIP files is not available on this server."
1802
+ msgstr "Chyba: import souborů ZIP tento server neumožňuje."
1803
+
1804
+ # @ tablepress
1805
+ #: views/view-import.php:52
1806
+ msgid "Error: The ZIP file could not be opened."
1807
+ msgstr "Chyba: soubor ZIP nelze otevřít."
1808
+
1809
+ # @ tablepress
1810
+ #: views/view-import.php:53
1811
+ msgid "Error: The data in the ZIP file is invalid."
1812
+ msgstr "Chyba: data v souboru ZIP jsou poškozená."
1813
+
1814
+ # @ tablepress
1815
+ #: views/view-import.php:54
1816
+ msgid ""
1817
+ "Error: You selected to replace or append to an existing table, but did not "
1818
+ "select a table."
1819
+ msgstr ""
1820
+ "Chyba: Vybrali jste <em>nahradit</em> nebo <em>připojit</em> k existující "
1821
+ "tabulce, ale nevybrali tabulku."
1822
+
1823
+ # @ tablepress
1824
+ #: views/view-import.php:55
1825
+ msgid "Error: The source for the import is invalid or could not be accessed."
1826
+ msgstr "Chyba: zdroj pro import je neplatný, nebo není dostupný."
1827
+
1828
+ # @ tablepress
1829
+ #: views/view-import.php:56
1830
+ msgid "Error: The data for the import is invalid."
1831
+ msgstr "Chyba: údaje pro import jsou chybné."
1832
+
1833
+ # @ tablepress
1834
+ #: views/view-import.php:58
1835
+ msgid ""
1836
+ "Error: Existing WP-Table Reloaded tables were not found in the database."
1837
+ msgstr "Chyba: tabulky z WP-Table Reloaded nebyly v databázi nalezeny."
1838
+
1839
+ # @ tablepress
1840
+ #: views/view-import.php:59
1841
+ msgid "Error: The tables from WP-Table Reloaded could not be imported."
1842
+ msgstr "Chyba: tabulky z WP-Tables Reloaded nemohly být importovány."
1843
+
1844
+ # @ tablepress
1845
+ #: views/view-import.php:60
1846
+ msgid "Error: The WP-Table Reloaded Dump File could not be imported!"
1847
+ msgstr "Chyba: zálohovací soubor WP-Table Reloaded nelze importovat!"
1848
+
1849
+ # @ tablepress
1850
+ #: views/view-import.php:64
1851
+ msgid "Import Tables"
1852
+ msgstr "Importovat tabulky"
1853
+
1854
+ # @ tablepress
1855
+ #: views/view-import.php:66
1856
+ msgid "Import from WP-Table Reloaded"
1857
+ msgstr "Importovat z WP-Table Reloaded"
1858
+
1859
+ # @ tablepress
1860
+ #: views/view-import.php:93
1861
+ msgid ""
1862
+ "You can also import existing tables from the WP-Table Reloaded plugin below."
1863
+ msgstr "Můžete také importovat existující tabulky z pluginu WP-Table Reloaded."
1864
+
1865
+ # @ tablepress
1866
+ #: views/view-import.php:96
1867
+ msgid ""
1868
+ "To import a table, select and enter the import source in the following form."
1869
+ msgstr ""
1870
+ "Chcete-li importovat tabulku, vyberte a zadejte zdroj importu v následujícím "
1871
+ "formuláři."
1872
+
1873
+ # @ tablepress
1874
+ #: views/view-import.php:96
1875
+ msgid ""
1876
+ "You can also choose to import it as a new table, to replace an existing "
1877
+ "table, or to append the rows to an existing table."
1878
+ msgstr ""
1879
+ "Máte několik možností importu: importovat jako novou tabulku, nahradit "
1880
+ "existující tabulku, nebo přidat řádky do existující tabulky."
1881
+
1882
+ # @ tablepress
1883
+ #: views/view-import.php:111 views/view-import.php:226
1884
+ msgid "Import Source"
1885
+ msgstr "Zdroj importu"
1886
+
1887
+ # @ tablepress
1888
+ #: views/view-import.php:113
1889
+ msgid "File Upload"
1890
+ msgstr "Nahrát soubor"
1891
+
1892
+ # @ tablepress
1893
+ #: views/view-import.php:114
1894
+ msgid "URL"
1895
+ msgstr "URL"
1896
+
1897
+ # @ tablepress
1898
+ #: views/view-import.php:115
1899
+ msgid "File on server"
1900
+ msgstr "Soubor na serveru"
1901
+
1902
+ # @ tablepress
1903
+ #: views/view-import.php:116
1904
+ msgid "Manual Input"
1905
+ msgstr "Vložit ručně"
1906
+
1907
+ # @ tablepress
1908
+ #: views/view-import.php:120 views/view-import.php:233
1909
+ msgid "Select file"
1910
+ msgstr "Vyberte soubor"
1911
+
1912
+ # @ tablepress
1913
+ #: views/view-import.php:125 views/view-import.php:135
1914
+ #: views/view-import.php:145
1915
+ msgid "You can import multiple tables by placing them in a ZIP file."
1916
+ msgstr ""
1917
+ "Můžete importovat více tabulek, jsou-li uloženy v archívním souboru ZIP."
1918
+
1919
+ # @ tablepress
1920
+ #: views/view-import.php:130
1921
+ msgid "File URL"
1922
+ msgstr "URL souboru"
1923
+
1924
+ # @ tablepress
1925
+ #: views/view-import.php:140
1926
+ msgid "Server Path to file"
1927
+ msgstr "Cesta k souboru na serveru"
1928
+
1929
+ # @ tablepress
1930
+ #: views/view-import.php:150
1931
+ msgid "Import data"
1932
+ msgstr "Importovat data"
1933
+
1934
+ # @ tablepress
1935
+ #: views/view-import.php:156
1936
+ msgid "Import Format"
1937
+ msgstr "Formát importu"
1938
+
1939
+ # @ tablepress
1940
+ #: views/view-import.php:168
1941
+ msgid "Import of HTML files is not available on your server."
1942
+ msgstr "Import HTML souborů tento server neumožňuje."
1943
+
1944
+ # @ tablepress
1945
+ #: views/view-import.php:173
1946
+ msgid "Add, Replace, or Append?"
1947
+ msgstr "Přidat, nahradit, nebo připojit?"
1948
+
1949
+ # @ tablepress
1950
+ #: views/view-import.php:175
1951
+ msgid "Add as new table"
1952
+ msgstr "Vytvořit novou tabulku"
1953
+
1954
+ # @ tablepress
1955
+ #: views/view-import.php:176
1956
+ msgid "Replace existing table"
1957
+ msgstr "Nahradit existující tabulku"
1958
+
1959
+ # @ tablepress
1960
+ #: views/view-import.php:177
1961
+ msgid "Append rows to existing table"
1962
+ msgstr "Připojit řádky k existující tabulce"
1963
+
1964
+ # @ tablepress
1965
+ #: views/view-import.php:181
1966
+ msgid "Table to replace or append to"
1967
+ msgstr "Nahradit tabulku nebo připojit k"
1968
+
1969
+ # @ tablepress
1970
+ #: views/view-import.php:184
1971
+ msgid "&mdash; Select &mdash;"
1972
+ msgstr "&mdash; Vyberte &mdash;"
1973
+
1974
+ # @ tablepress
1975
+ #: views/view-import.php:201
1976
+ msgctxt "button"
1977
+ msgid "Import"
1978
+ msgstr "Importovat"
1979
+
1980
+ # @ tablepress
1981
+ #: views/view-import.php:216
1982
+ msgid ""
1983
+ "To import all tables from a WP-Table Reloaded installation, choose the "
1984
+ "relevant import source below."
1985
+ msgstr ""
1986
+ "Chcete-li importovat všechny tabulky z instalace WP-Table Reloaded, zvolte "
1987
+ "níže příslušný zdroj importu."
1988
+
1989
+ # @ tablepress
1990
+ #: views/view-import.php:218
1991
+ msgid ""
1992
+ "If WP-Table Reloaded is installed on this site, the &#8220;WordPress "
1993
+ "database&#8221; option is recommended."
1994
+ msgstr ""
1995
+ "Máte-li na tomto webu nainstalovaný plugin WP-Table Reloaded, doporučuji "
1996
+ "zvolit &#8220;WordPress database&#8221;."
1997
+
1998
+ # @ tablepress
1999
+ #: views/view-import.php:219
2000
+ msgid ""
2001
+ "If you want to import tables from another site, create a &#8220;WP-Table "
2002
+ "Reloaded Dump File&#8221; there and upload it below, after choosing &#8220;"
2003
+ "WP-Table Reloaded Dump File&#8221;."
2004
+ msgstr ""
2005
+ "Chcete-li importovat tabulky z jiného webu, vytvořte si tam &#8220;"
2006
+ "zálohovací soubor WP-Table Reloaded&#8221; a nahrajte ho sem výběrem &#8220;"
2007
+ "zálohovací soubor WP-Table Reloaded&#8221;."
2008
+
2009
+ # @ tablepress
2010
+ #: views/view-import.php:221
2011
+ #, php-format
2012
+ msgid ""
2013
+ "Before doing this, it is highly recommended to read the <a href=\"%s"
2014
+ "\">migration guide</a> on the TablePress website."
2015
+ msgstr ""
2016
+ "Než to uděláte, doporučuji přečíst si na webu TablePress stránku <a href=\"%s"
2017
+ "\">migration guide</ a>."
2018
+
2019
+ # @ tablepress
2020
+ #: views/view-import.php:228
2021
+ msgid "WordPress database"
2022
+ msgstr "databáze WordPress"
2023
+
2024
+ # @ tablepress
2025
+ #: views/view-import.php:229
2026
+ msgid "WP-Table Reloaded Dump File"
2027
+ msgstr "zálohovací soubor WP-Table Reloaded"
2028
+
2029
+ # @ tablepress
2030
+ #: views/view-import.php:243
2031
+ msgid "Import tables"
2032
+ msgstr "Importovat tabulky"
2033
+
2034
+ # @ tablepress
2035
+ #: views/view-import.php:244
2036
+ msgid "Import all tables and their settings from WP-Table Reloaded."
2037
+ msgstr "Import všech tabulek a jejich nastavení z WP-Table Reloaded."
2038
+
2039
+ # @ tablepress
2040
+ #: views/view-import.php:244
2041
+ msgid "<span class=\"description\">(recommended)</span>"
2042
+ msgstr "<span class=\"popis\">(doporučeno)</span>"
2043
+
2044
+ # @ tablepress
2045
+ #: views/view-import.php:247
2046
+ msgid "Import styling"
2047
+ msgstr "Importovat styly"
2048
+
2049
+ # @ tablepress
2050
+ #: views/view-import.php:248
2051
+ msgid ""
2052
+ "Try to automatically convert the &#8220;Custom CSS&#8221; code from the "
2053
+ "&#8220;Plugin Options&#8221; screen of WP-Table Reloaded."
2054
+ msgstr ""
2055
+ "Pokusit sa automaticky převést &#8220;Vlastní CSS&#8221; styly z &#8220;"
2056
+ "nastavení pluginu&#8221; WP-Table Reloaded."
2057
+
2058
+ # @ tablepress
2059
+ #: views/view-import.php:252
2060
+ msgctxt "button"
2061
+ msgid "Import from WP-Table Reloaded"
2062
+ msgstr "Importovat z WP-Table Reloaded"
2063
+
2064
+ # @ tablepress
2065
+ #: views/view-import.php:268
2066
+ msgid "TablePress Feature: Import from WP-Table Reloaded"
2067
+ msgstr "Možnost TablePress: Importovat z WP-Table Reloaded"
2068
+
2069
+ # @ tablepress
2070
+ #: views/view-import.php:269
2071
+ msgid ""
2072
+ "You can import your existing tables and &#8220;Custom CSS&#8221; from WP-"
2073
+ "Table Reloaded into TablePress."
2074
+ msgstr ""
2075
+ "Můžete do TablePress importovat existující tabulky a &#8220;Vlastní "
2076
+ "CSS&#8221; z WP-Table Reloaded."
2077
+
2078
+ # @ tablepress
2079
+ #: views/view-list.php:46
2080
+ msgid "To embed this table into a post or page, use this Shortcode:"
2081
+ msgstr ""
2082
+ "Chcete-li vložit tabulku do příspěvku, či stránky, použite tento zkrácený "
2083
+ "zápis:"
2084
+
2085
+ # @ tablepress
2086
+ #: views/view-list.php:47
2087
+ msgid ""
2088
+ "Thank you very much! Your donation is highly appreciated. You just "
2089
+ "contributed to the further development of TablePress!"
2090
+ msgstr ""
2091
+ "Děkuji moc! Váš příspěvek je cenný. Právě jste přispěl k dalšímu rozvoji "
2092
+ "TablePress!"
2093
+
2094
+ # @ tablepress
2095
+ #: views/view-list.php:54
2096
+ msgid "Welcome!"
2097
+ msgstr "Vítejte!"
2098
+
2099
+ # @ tablepress
2100
+ #: views/view-list.php:55
2101
+ msgid "Thank you for using TablePress for the first time!"
2102
+ msgstr "Děkuji za první použití pluginu TablePress!"
2103
+
2104
+ # @ tablepress
2105
+ #: views/view-list.php:56
2106
+ #, php-format
2107
+ msgid ""
2108
+ "If you encounter any questions or problems, please visit the <a href=\"%1$s"
2109
+ "\">FAQ</a>, the <a href=\"%2$s\">documentation</a>, and the <a href=\"%3$s"
2110
+ "\">Support</a> section on the <a href=\"%4$s\">plugin website</a>."
2111
+ msgstr ""
2112
+ "Pokud narazíte na jakékoli dotazy či problémy, navštivte prosím stránky <a "
2113
+ "href=\"%1$s\"> FAQ </a>, <a href=\"%2$s\"> dokumentace </a>, a <a href=\"%3$s"
2114
+ "\"> Podpora </a> sekce na <a href=\"%4$s\">webu pluginu</a>."
2115
+
2116
+ # @ tablepress
2117
+ #: views/view-list.php:57 views/view-list.php:90
2118
+ msgid "Hide this message"
2119
+ msgstr "Skrýt tuto zprávu"
2120
+
2121
+ # @ tablepress
2122
+ #: views/view-list.php:62
2123
+ msgid "Attention!"
2124
+ msgstr "Pozor!"
2125
+
2126
+ # @ tablepress
2127
+ #: views/view-list.php:63
2128
+ msgid ""
2129
+ "You have activated the plugin WP-Table Reloaded, which can not be used "
2130
+ "together with TablePress."
2131
+ msgstr ""
2132
+ "Máte aktivovaný plugin WP-Table Reloaded, který nelze používat zároveň s "
2133
+ "TablePress."
2134
+
2135
+ # @ tablepress
2136
+ #: views/view-list.php:64
2137
+ msgid ""
2138
+ "It is strongly recommended that you switch from WP-Table Reloaded to "
2139
+ "TablePress, which not only fixes many problems, but also has more and better "
2140
+ "features than WP-Table Reloaded."
2141
+ msgstr ""
2142
+ "Důrazně doporučuji přejít z WP-Table Reloaded na TablePress, který nejen "
2143
+ "opravuje mnoho problémů, ale také má více lepších funkcí než WP-Table "
2144
+ "Reloaded."
2145
+
2146
+ # @ tablepress
2147
+ #: views/view-list.php:65
2148
+ #, php-format
2149
+ msgid ""
2150
+ "Please follow the <a href=\"%s\">migration guide</a> to move your tables and "
2151
+ "then deactivate WP-Table Reloaded!"
2152
+ msgstr ""
2153
+ "Postupujte, prosím, podle <a href=\"%s\">průvodce migrací </ a> - přesuňte "
2154
+ "své tabulky a pak deaktivujte WP-Table Reloaded!"
2155
+
2156
+ # @ tablepress
2157
+ #: views/view-list.php:66
2158
+ msgid "Import your tables from WP-Table Reloaded"
2159
+ msgstr "Importujte své tabulky z WP-Table Reloaded"
2160
+
2161
+ # @ tablepress
2162
+ #: views/view-list.php:72
2163
+ msgid "Tobias Bäthge, developer of TablePress"
2164
+ msgstr "Tobias Bäthge, autor TablePress"
2165
+
2166
+ # @ tablepress
2167
+ #: views/view-list.php:76
2168
+ #, php-format
2169
+ msgid ""
2170
+ "<a href=\"%s\">Donations</a> help me to continue user support and "
2171
+ "development of this <em>free</em> software &mdash; things for which I spend "
2172
+ "countless hours of my free time! Thank you very much!"
2173
+ msgstr ""
2174
+ "<a href=\"%s\">Dárcovství</ a>: pomozte mi pokračovat v uživatelské podpoře "
2175
+ "a vývoji tohoto <em> free </ em>softwaru, nad kterým jsem strávil nespočet "
2176
+ "hodin svého volného času! Děkuji moc!"
2177
+
2178
+ # @ tablepress
2179
+ #: views/view-list.php:77
2180
+ msgid "Sincerly, Tobias"
2181
+ msgstr "S pozdravem, Tobias"
2182
+
2183
+ # @ tablepress
2184
+ #: views/view-list.php:79
2185
+ msgid "I already donated."
2186
+ msgstr "Už jsem přispěl."
2187
+
2188
+ # @ tablepress
2189
+ #: views/view-list.php:84
2190
+ #, php-format
2191
+ msgid "Thank you for updating to TablePress %s!"
2192
+ msgstr "Děkuji za aktualizaci na TablePress %s!"
2193
+
2194
+ # @ tablepress
2195
+ #: views/view-list.php:87
2196
+ #, php-format
2197
+ msgid ""
2198
+ "Please read the <a href=\"%s\">release announcement</a> for more information."
2199
+ msgstr ""
2200
+ "Přečtěte si prosím <a href=\"%s\">poznámky k vydání</a>, kde získáte více "
2201
+ "informací."
2202
+
2203
+ # @ tablepress
2204
+ #: views/view-list.php:88
2205
+ #, php-format
2206
+ msgid ""
2207
+ "If you like the new features and enhancements, <a href=\"%s\">giving a "
2208
+ "donation</a> towards the further support and development of TablePress is "
2209
+ "recommended. Thank you!"
2210
+ msgstr ""
2211
+ "Pokud se vám nové funkce a vylepšení líbí, doporučuji <a href=\"%s\">přispět "
2212
+ "darem</a> na další podporu a rozvoj TablePress. Děkuji vám!"
2213
+
2214
+ # @ tablepress
2215
+ #: views/view-list.php:95 views/view-list.php:96
2216
+ msgid "The table was deleted successfully."
2217
+ msgid_plural "The tables were deleted successfully."
2218
+ msgstr[0] "Tabulka byla úspěšně smazána."
2219
+ msgstr[1] "Tabulky byly úspěšně smazány."
2220
+ msgstr[2] "Tabulky byly úspěšně smazány."
2221
+
2222
+ # @ tablepress
2223
+ #: views/view-edit.php:46 views/view-list.php:99 views/view-list.php:100
2224
+ msgid "The table was copied successfully."
2225
+ msgid_plural "The tables were copied successfully."
2226
+ msgstr[0] "Tabulka byla úspěšně zkopírována."
2227
+ msgstr[1] "Tabulky byly úspěšně zkopírovány."
2228
+ msgstr[2] "Tabulky byly úspěšně zkopírovány."
2229
+
2230
+ # @ tablepress
2231
+ #: views/view-list.php:101
2232
+ msgid "Error: The table could not be copied."
2233
+ msgstr "Chyba: Tabulku nelze zkopírovat."
2234
+
2235
+ # @ tablepress
2236
+ #: views/view-list.php:102
2237
+ msgid "Error: You did not specify a valid table ID."
2238
+ msgstr "Chyba: Nezadali jste platné ID tabulky."
2239
+
2240
+ # @ tablepress
2241
+ #: views/view-list.php:104
2242
+ msgid "Error: This bulk action is invalid!"
2243
+ msgstr "Chyba: Tato část akce je neplatná!"
2244
+
2245
+ # @ tablepress
2246
+ #: views/view-list.php:105
2247
+ msgid "Error: You did not select any tables!"
2248
+ msgstr "Chyba: Nevybrali jste žádné tabulky!"
2249
+
2250
+ # @ tablepress
2251
+ #: views/view-list.php:106
2252
+ msgid "Notice: Not all selected tables could be deleted!"
2253
+ msgstr "Upozornění: Ne všechny vybrané tabulky mohou být smazány!"
2254
+
2255
+ # @ tablepress
2256
+ #: views/view-list.php:107
2257
+ msgid "Notice: Not all selected tables could be copied!"
2258
+ msgstr "Poznámka: Ne všechny vybrané tabulky lze kopírovat!"
2259
+
2260
+ # @ tablepress
2261
+ #: views/view-list.php:108
2262
+ msgid "The tables were imported successfully."
2263
+ msgstr "Tabulky byly úspěšně importovány."
2264
+
2265
+ # @ tablepress
2266
+ #: views/view-list.php:109
2267
+ msgid "The tables were imported successfully from WP-Table Reloaded."
2268
+ msgstr "Tabulky byly z WP-Table Reloaded úspěšně importovány."
2269
+
2270
+ # @ tablepress
2271
+ #: views/view-list.php:115
2272
+ msgid "Tables"
2273
+ msgstr "Tabulky"
2274
+
2275
+ # @ tablepress
2276
+ #: views/view-list.php:179
2277
+ msgid "This is a list of your tables."
2278
+ msgstr "<strong>Seznam vašich tabulek</strong>."
2279
+
2280
+ # @ tablepress
2281
+ #: views/view-list.php:180
2282
+ msgid ""
2283
+ "Click the corresponding links within the list to edit, copy, delete, or "
2284
+ "preview a table."
2285
+ msgstr ""
2286
+ "Zvolte příslušnou pložku v seznamu pro úpravu, kopírování, odstranění, nebo "
2287
+ "pro náhled tabulky."
2288
+
2289
+ # @ tablepress
2290
+ #: views/view-list.php:184
2291
+ msgid "Each table has a unique ID that needs to be adjusted in that Shortcode."
2292
+ msgstr "Každá tabulka má unikátní ID, které <em>zkrácený zápis</em> obsahuje."
2293
+
2294
+ # @ tablepress
2295
+ #: views/view-list.php:312
2296
+ msgid "Author"
2297
+ msgstr "Autor"
2298
+
2299
+ # @ tablepress
2300
+ #: views/view-list.php:313
2301
+ msgid "Last Modified By"
2302
+ msgstr "Naposledy upraveno"
2303
+
2304
+ # @ tablepress
2305
+ #: views/view-list.php:399 views/view-list.php:405
2306
+ #, php-format
2307
+ msgid "Edit &#8220;%s&#8221;"
2308
+ msgstr "Upravit &#8220;%s&#8221;"
2309
+
2310
+ # @ tablepress
2311
+ #: views/view-list.php:406
2312
+ msgid "Show Shortcode"
2313
+ msgstr "Zobrazit <em>zkrácený zápis</em>"
2314
+
2315
+ # @ tablepress
2316
+ #: views/view-list.php:408
2317
+ #, php-format
2318
+ msgid "Copy &#8220;%s&#8221;"
2319
+ msgstr "Kopie &#8220;%s&#8221;"
2320
+
2321
+ # @ tablepress
2322
+ #: views/view-list.php:408
2323
+ msgid "Copy"
2324
+ msgstr "Kopírovat"
2325
+
2326
+ # @ tablepress
2327
+ #: views/view-list.php:410
2328
+ #, php-format
2329
+ msgid "Export &#8220;%s&#8221;"
2330
+ msgstr "Export &#8220;%s&#8221;"
2331
+
2332
+ # @ tablepress
2333
+ #: views/view-list.php:410
2334
+ msgctxt "row action"
2335
+ msgid "Export"
2336
+ msgstr "Exportovat"
2337
+
2338
+ # @ tablepress
2339
+ #: views/view-list.php:412
2340
+ #, php-format
2341
+ msgid "Delete &#8220;%s&#8221;"
2342
+ msgstr "Smazat &#8220;%s&#8221;"
2343
+
2344
+ # @ tablepress
2345
+ #: views/view-list.php:414
2346
+ #, php-format
2347
+ msgid "Show a preview of &#8220;%s&#8221;"
2348
+ msgstr "Zobrazit náhled &#8220;%s&#8221;"
2349
+
2350
+ # @ tablepress
2351
+ #: views/view-list.php:489
2352
+ msgctxt "bulk action"
2353
+ msgid "Copy"
2354
+ msgstr "Kopie"
2355
+
2356
+ # @ tablepress
2357
+ #: views/view-list.php:491
2358
+ msgctxt "bulk action"
2359
+ msgid "Export"
2360
+ msgstr "Export"
2361
+
2362
+ # @ tablepress
2363
+ #: views/view-list.php:493
2364
+ msgctxt "bulk action"
2365
+ msgid "Delete"
2366
+ msgstr "Smazat"
2367
+
2368
+ # @ tablepress
2369
+ #: views/view-list.php:521
2370
+ msgid "Bulk Actions"
2371
+ msgstr "Hromadné akce"
2372
+
2373
+ # @ tablepress
2374
+ #: views/view-list.php:526
2375
+ msgid "Apply"
2376
+ msgstr "Použít"
2377
+
2378
+ # @ tablepress
2379
+ #: views/view-list.php:546
2380
+ #, php-format
2381
+ msgid "You should <a href=\"%s\">add</a> a table to get started!"
2382
+ msgstr "Pro začátek <a href=\"%s\">přidejte</a> tabulku!"
2383
+
2384
+ # @ tablepress
2385
+ #: views/view-list.php:548
2386
+ #, php-format
2387
+ msgid "You should <a href=\"%s\">import</a> a table to get started!"
2388
+ msgstr "Pro začátek <a href=\"%s\">importujte</a> tabulku!"
2389
+
2390
+ # @ tablepress
2391
+ #: views/view-options.php:38
2392
+ msgid "Do you really want to uninstall TablePress and delete ALL data?"
2393
+ msgstr "Opravdu chcete odinstalovat TablePress a odstranit VŠECHNA data?"
2394
+
2395
+ # @ tablepress
2396
+ #: views/view-options.php:39
2397
+ msgid "Are you really sure?"
2398
+ msgstr "Jste si jisti?"
2399
+
2400
+ # @ tablepress
2401
+ #: views/view-options.php:44
2402
+ msgid "Options saved successfully."
2403
+ msgstr "Nastavení bylo úspěšně uloženo."
2404
+
2405
+ # @ tablepress
2406
+ #: views/view-options.php:45
2407
+ msgid ""
2408
+ "Options saved successfully, but &#8220;Custom CSS&#8221; was not saved to "
2409
+ "file."
2410
+ msgstr ""
2411
+ "Nastavení bylo úspěšně uloženo, ale &#8220;Vlastní CSS&#8221; nebyly uloženy "
2412
+ "do souboru."
2413
+
2414
+ # @ tablepress
2415
+ #: views/view-options.php:46
2416
+ msgid "Error: Options could not be saved."
2417
+ msgstr "Chyba: Nastavení se nepodařilo uložit."
2418
+
2419
+ # @ tablepress
2420
+ #: views/view-options.php:47
2421
+ msgid ""
2422
+ "The WP-Table Reloaded &#8220;Custom CSS&#8221; was imported successfully."
2423
+ msgstr ""
2424
+ "&#8220;Vlastní CSS&#8221; styly z pluginu WP-Table Reloaded byly úspěšně "
2425
+ "importovány."
2426
+
2427
+ # @ tablepress
2428
+ #: views/view-options.php:52
2429
+ msgid "Frontend Options"
2430
+ msgstr "Nastavení zobrazení"
2431
+
2432
+ # @ tablepress
2433
+ #: views/view-options.php:53
2434
+ msgid "User Options"
2435
+ msgstr "Uživatelská nastavení"
2436
+
2437
+ # @ tablepress
2438
+ #: views/view-options.php:68
2439
+ msgid ""
2440
+ "TablePress has several options which affect the plugin&#8217;s behavior in "
2441
+ "different areas."
2442
+ msgstr ""
2443
+ "TablePress má několik nastavení, které určují chování pluginu v různých "
2444
+ "oblastech."
2445
+
2446
+ # @ tablepress
2447
+ #: views/view-options.php:73
2448
+ msgid ""
2449
+ "Frontend Options influence the styling of tables in pages, posts, or text "
2450
+ "widgets, by defining which CSS code shall be loaded."
2451
+ msgstr ""
2452
+ "CSS nastavení ovlivňují vzhled tabulek na stránkách, v příspěvcích, nebo "
2453
+ "textových widgetech podle toho, který CSS kód je načtený."
2454
+
2455
+ # @ tablepress
2456
+ #: views/view-options.php:76
2457
+ msgid ""
2458
+ "In the User Options, every TablePress user can choose the position of the "
2459
+ "plugin in his WordPress admin menu, and his desired plugin language."
2460
+ msgstr ""
2461
+ "V Uživatelských nastaveních si může každý uživatel TablePress zvolit pozici "
2462
+ "pluginu v Menu admininistrace WordPressu a nastavit jazyk pluginu."
2463
+
2464
+ # @ tablepress
2465
+ #: views/view-options.php:92
2466
+ msgid "Custom CSS"
2467
+ msgstr "Vlastní CSS"
2468
+
2469
+ # @ tablepress
2470
+ #: views/view-options.php:93
2471
+ msgid ""
2472
+ "Load these &#8220;Custom CSS&#8221; commands to influence the table styling:"
2473
+ msgstr "Nahrát &#8220;Vlastní CSS&#8221; příkazy pro ovlivnění stylu tabulky:"
2474
+
2475
+ # @ tablepress
2476
+ #: views/view-options.php:101
2477
+ #, php-format
2478
+ msgid ""
2479
+ "&#8220;Custom CSS&#8221; (<a href=\"%s\">Cascading Style Sheets</a>) can be "
2480
+ "used to change the styling or layout of a table."
2481
+ msgstr ""
2482
+ "&#8220;Vlastní CSS&#8221; (<a href=\"%s\">Kaskádové styly</a>) mohou být "
2483
+ "použity ke změně vzhledu nebo rozložení tabulky."
2484
+
2485
+ # @ tablepress
2486
+ #: views/view-options.php:103
2487
+ #, php-format
2488
+ msgid "You can get styling examples from the <a href=\"%s\">FAQ</a>."
2489
+ msgstr "Příklady stylování designu najdete na <a href=\"%s\">FAQ</a>."
2490
+
2491
+ # @ tablepress
2492
+ #: views/view-options.php:105
2493
+ #, php-format
2494
+ msgid ""
2495
+ "Information on available CSS selectors can be found in the <a href=\"%s"
2496
+ "\">documentation</a>."
2497
+ msgstr ""
2498
+ "Informace o možných CSS selektorech najdete v <a href=\"%s\">dokumentaci</a>."
2499
+
2500
+ # @ tablepress
2501
+ #: views/view-options.php:107
2502
+ msgid ""
2503
+ "Please note that invalid CSS code will be stripped, if it can not be "
2504
+ "corrected automatically."
2505
+ msgstr ""
2506
+ "Vezměte na vědomí, že špatný CSS kód, který nepůjde opravit automaticky, "
2507
+ "bude odstraněn."
2508
+
2509
+ # @ tablepress
2510
+ #: views/view-options.php:141
2511
+ msgid "Top-Level (top)"
2512
+ msgstr "Top-Level (nahoře)"
2513
+
2514
+ # @ tablepress
2515
+ #: views/view-options.php:142
2516
+ msgid "Top-Level (middle)"
2517
+ msgstr "Top-Level (uprostřed)"
2518
+
2519
+ # @ tablepress
2520
+ #: views/view-options.php:143
2521
+ msgid "Top-Level (bottom)"
2522
+ msgstr "Top-Level (dole)"
2523
+
2524
+ # @ tablepress
2525
+ #: views/view-options.php:152
2526
+ msgid "Admin menu entry"
2527
+ msgstr "Umístění v admin menu"
2528
+
2529
+ # @ tablepress
2530
+ #: views/view-options.php:153
2531
+ #, php-format
2532
+ msgid "TablePress shall be shown in this section of my admin menu: %s"
2533
+ msgstr "TablePress může být zobrazen v této sekci admin menu: %s"
2534
+
2535
+ # @ tablepress
2536
+ #: views/view-options.php:157
2537
+ #, php-format
2538
+ msgid "WordPress Default (currently %s)"
2539
+ msgstr "výchozí nastavení WordPressu (aktuálně %s)"
2540
+
2541
+ # @ tablepress
2542
+ #: views/view-options.php:165
2543
+ msgid "Plugin Language"
2544
+ msgstr "Jazyk pluginu"
2545
+
2546
+ # @ tablepress
2547
+ #: views/view-options.php:166
2548
+ #, php-format
2549
+ msgid "I want to use TablePress in this language: %s"
2550
+ msgstr "Chci používat TablePress v tomto jazyce:% s"
2551
+
2552
+ # @ tablepress
2553
+ #: views/view-options.php:182
2554
+ msgid ""
2555
+ "Uninstalling <strong>will permanently delete</strong> all TablePress tables "
2556
+ "and options from the database."
2557
+ msgstr ""
2558
+ "Odinstalováním <strong>trvale vymažete</strong> všechny tabulky TablePressu "
2559
+ "a nastavení z databáze."
2560
+
2561
+ # @ tablepress
2562
+ #: views/view-options.php:183
2563
+ msgid ""
2564
+ "It is recommended that you create a backup of the tables (by exporting the "
2565
+ "tables in the JSON format), in case you later change your mind."
2566
+ msgstr ""
2567
+ "Doporučuji vytvořit si zálohu tabulek (pomocí exportu tabulky ve formátu "
2568
+ "JSON) pro případ, že se později rozmyslíte jinak."
2569
+
2570
+ # @ tablepress
2571
+ #: views/view-options.php:185
2572
+ msgid ""
2573
+ "Be very careful with this and only click the button if you know what you are "
2574
+ "doing!"
2575
+ msgstr "Buďte velmi opatrní - kliknětě na tlačítko jen pokud víte, co děláte!"
2576
+
2577
+ # @ tablepress
2578
+ #: views/view-options_custom_css.php:38
2579
+ msgid ""
2580
+ "Attention: Further action is required to save the changes to your &#8220;"
2581
+ "Custom CSS&#8221;!"
2582
+ msgstr ""
2583
+ "Pozor: Pro uložení změn ve &#8220;Vlastních CSS&#8221; je nutný další krok."
2584
+
2585
+ # @ tablepress
2586
+ #: views/view-options_custom_css.php:105
2587
+ msgid ""
2588
+ "Due to the configuration of your server, TablePress was not able to "
2589
+ "automatically save your &#8220;Custom CSS&#8221; to a file."
2590
+ msgstr ""
2591
+ "Vzhledem ke konfiguraci vašeho serveru, TablePress nebyl schopen automaticky "
2592
+ "uložit &#8220;Vlastní CSS&#8221; do souboru."
2593
+
2594
+ # @ tablepress
2595
+ #: views/view-options_custom_css.php:106
2596
+ #, php-format
2597
+ msgid ""
2598
+ "To try again with the same method that you use for updating plugins or "
2599
+ "themes, please fill out the &#8220;%s&#8221; form below."
2600
+ msgstr ""
2601
+ "Vyzkoušejte znovu stejným způsobem, který používáte pro aktualizaci pluginů "
2602
+ "či vzhledů - vyplňte prosím &#8220;%s&#8221; níže uvedený formulář."
2603
+
2604
+ # @ default
2605
+ #: views/view-options_custom_css.php:106
2606
+ msgid "Connection Information"
2607
+ msgstr "Informácie o pripojení"
2608
+
2609
+ # @ tablepress
2610
+ #: views/view-options_custom_css.php:127
2611
+ msgid "Proceed without saving a file"
2612
+ msgstr "Pokračovat bez uložení souboru"
2613
+
2614
+ # @ tablepress
2615
+ #: views/view-options_custom_css.php:129
2616
+ msgid ""
2617
+ "To proceed without trying to save the &#8220;Custom CSS&#8221; to a file, "
2618
+ "click the button below."
2619
+ msgstr ""
2620
+ "Pokud chcete pokračovat bez uložení &#8220;Vlastních CSS&#8221; do souboru, "
2621
+ "klikněte na tlačítko níže."
2622
+
2623
+ # @ tablepress
2624
+ #: views/view-options_custom_css.php:130
2625
+ msgid "Your &#8220;Custom CSS&#8221; will then be loaded inline."
2626
+ msgstr "Potom se váš &#8220;Vlastní CSS&#8221; bude načítat inline."
2627
+
2628
+ # @ tablepress
2629
+ #: views/view-options_custom_css.php:132
2630
+ msgid "Proceed without saving &#8220;Custom CSS&#8221; to a file"
2631
+ msgstr "Pokračovat bez uložení &#8220;Vlastních CSS&#8221; do souboru"
2632
+
2633
+ # @ tablepress
2634
+ #: views/view-preview_table.php:66
2635
+ msgid ""
2636
+ "Because of CSS styling in your theme, the table might look different on your "
2637
+ "page!"
2638
+ msgstr ""
2639
+ "Kvůli CSS stylům ve vašem motivu (theme) může tabulka na vaší stránce "
2640
+ "vypadat jinak!"
2641
+
2642
+ # @ tablepress
2643
+ #: views/view-preview_table.php:66
2644
+ msgid ""
2645
+ "The features of the DataTables JavaScript library are also not available or "
2646
+ "visible in this preview!"
2647
+ msgstr ""
2648
+ "Vlastnosti DataTables JavaScript knihovny v tomto náhledu rovněž nejsou k "
2649
+ "dispozici!"
2650
+
2651
+ # @ tablepress
2652
+ #: controllers/controller-admin.php:402
2653
+ msgctxt ""
2654
+ msgid ","
2655
+ msgstr ","
2656
+
2657
+ # @ tablepress
2658
+ #. translators: plugin header field 'PluginURI'
2659
+ #: tablepress.php:0
2660
+ msgid "https://tablepress.org/"
2661
+ msgstr "https://tablepress.org/"
2662
+
2663
+ # @ tablepress
2664
+ #. translators: plugin header field 'Description'
2665
+ #: tablepress.php:0
2666
+ msgid ""
2667
+ "TablePress enables you to create and manage tables in your posts and pages, "
2668
+ "without having to write HTML code, and it adds valuable functions for your "
2669
+ "visitors."
2670
+ msgstr ""
2671
+ "TablePress vám umožňuje vytvářet a spravovat tabulky ve vašich stránkách a "
2672
+ "příspěvcích, aniž byste museli znát jazyk HTML, a také přidává užitečné "
2673
+ "funkce pro návštěvníky vašich stránek."
2674
+
2675
+ # @ tablepress
2676
+ #. translators: plugin header field 'Author'
2677
+ #: tablepress.php:0
2678
+ msgid "Tobias Bäthge"
2679
+ msgstr "Tobias Bäthge"
2680
+
2681
+ # @ tablepress
2682
+ #. translators: plugin header field 'AuthorURI'
2683
+ #: tablepress.php:0
2684
+ msgid "https://tobias.baethge.com/"
2685
+ msgstr "https://tobias.baethge.com/"
2686
+
2687
+ # @ tablepress
2688
+ #: views/view-add.php:72
2689
+ msgid "Enter Table Name here"
2690
+ msgstr "Zadejte název tabulky"
2691
+
2692
+ # @ tablepress
2693
+ #: views/view-edit.php:194
2694
+ msgid ""
2695
+ "The Table ID can only consist of letters, numbers, hyphens (-), and "
2696
+ "underscores (_)."
2697
+ msgstr ""
2698
+ "Tabulka ID může obsahovat pouze písmena, číslice, pomlčky (-) a podtržítka "
2699
+ "(_)."
2700
+
2701
+ # @ tablepress
2702
+ #: views/view-edit.php:337
2703
+ msgid "Help on combining cells"
2704
+ msgstr "Pomoc při spojování buňek"
2705
+
2706
+ # @ tablepress
2707
+ #: views/view-edit.php:509
2708
+ msgid ""
2709
+ "This field can only contain letters, numbers, spaces, hyphens (-), and "
2710
+ "underscores (_)."
2711
+ msgstr ""
2712
+ "Toto pole může obsahovat pouze písmena, číslice, mezery, pomlčky (-) a "
2713
+ "podtržítka (_)."
2714
+
2715
+ # @ tablepress
2716
+ #: classes/class-import.php:87
2717
+ msgid "XLS - Microsoft Excel 97-2003 (experimental)"
2718
+ msgstr "XLS - Microsoft Excel 97-2003 (experimentálně)"
2719
+
2720
+ # @ tablepress
2721
+ #: classes/class-import.php:88
2722
+ msgid "XLSX - Microsoft Excel 2007-2013 (experimental)"
2723
+ msgstr "XLSX - Microsoft Excel 2007-2013 (experimentálně)"
2724
+
2725
+ # @ tablepress
2726
+ #: classes/class-tablepress.php:305
2727
+ msgid "<em>unknown</em>"
2728
+ msgstr "<em>neznámý</em>"
2729
+
2730
+ # @ tablepress
2731
+ #: controllers/controller-admin.php:468
2732
+ msgid "German"
2733
+ msgstr ""
2734
+
2735
+ # @ tablepress
2736
+ #: controllers/controller-admin.php:483
2737
+ msgid "Finnish"
2738
+ msgstr ""
2739
+
2740
+ # @ tablepress
2741
+ #: controllers/controller-admin.php:493
2742
+ msgid "Hebrew"
2743
+ msgstr ""
2744
+
2745
+ # @ tablepress
2746
+ #: controllers/controller-admin.php:498
2747
+ msgid "Italian"
2748
+ msgstr ""
2749
+
2750
+ # @ tablepress
2751
+ #: controllers/controller-admin.php:503
2752
+ msgid "Icelandic"
2753
+ msgstr ""
2754
+
2755
+ # @ tablepress
2756
+ #: controllers/controller-admin.php:508
2757
+ msgid "Japanese"
2758
+ msgstr ""
2759
+
2760
+ # @ tablepress
2761
+ #: controllers/controller-admin.php:513
2762
+ msgid "Latvian"
2763
+ msgstr ""
2764
+
2765
+ # @ tablepress
2766
+ #: controllers/controller-admin.php:518
2767
+ msgid "Dutch"
2768
+ msgstr ""
2769
+
2770
+ # @ tablepress
2771
+ #: controllers/controller-admin.php:528
2772
+ msgid "Brazilian Portuguese"
2773
+ msgstr ""
2774
+
2775
+ # @ tablepress
2776
+ #: controllers/controller-admin.php:533
2777
+ msgid "Russian"
2778
+ msgstr ""
2779
+
2780
+ # @ tablepress
2781
+ #: controllers/controller-admin.php:543
2782
+ msgid "Turkish"
2783
+ msgstr ""
2784
+
2785
+ # @ tablepress
2786
+ #: controllers/controller-admin.php:1763
2787
+ msgid ""
2788
+ "You may now ask the network admin to delete the plugin&#8217;s folder "
2789
+ "<code>tablepress</code> from the server, if no other site in the network "
2790
+ "uses it."
2791
+ msgstr ""
2792
+ "Nyní můžete požádat správce webu o smazání složky pluginu <code>tablepress</"
2793
+ "code> ze serveru, jestliže ji nepoužívá nikdo další."
2794
+
2795
+ # @ tablepress
2796
+ #: controllers/controller-admin.php:1765
2797
+ msgid ""
2798
+ "You may now manually delete the plugin&#8217;s folder <code>tablepress</"
2799
+ "code> from the <code>plugins</code> directory on your server or use the "
2800
+ "&#8220;Delete&#8221; link for TablePress on the WordPress &#8220;"
2801
+ "Plugins&#8221; page."
2802
+ msgstr ""
2803
+ "Nyní můžete ručně smazat složku pluginu <code>tablepress</code> z adresáře "
2804
+ "<code>plugins</code> na serveru, nebo použít volbu &#8220;Smazat&#8221; "
2805
+ "TablePress v administraci Worpressu &#8220;Pluginy&#8221;"
2806
+
2807
+ # @ tablepress
2808
+ #. translators: plugin header field 'Version'
2809
+ #: tablepress.php:0
2810
+ msgid "1.5"
2811
+ msgstr "1.5"
2812
+
2813
+ # @ tablepress
2814
+ #: views/view-about.php:77
2815
+ msgid ""
2816
+ "This means that you either let the plugin create an empty table for you or "
2817
+ "that you load an existing table from either a CSV, HTML, JSON, XLS, or XLSX "
2818
+ "file."
2819
+ msgstr ""
2820
+ "To znamená, že buď pomocí pluginu vytvoříte novou tabulku, nebo nahrajete "
2821
+ "existující tabulku z CSV, HTML, JSON, XLS, nebo souboru ze XLSX ."
2822
+
2823
+ # @ tablepress
2824
+ #: views/view-edit.php:46
2825
+ #, php-format
2826
+ msgid ""
2827
+ "You are now seeing the copied table, which has the table ID &#8220;%s&#8221;."
2828
+ msgstr "Nyní vidíte zkopírovanou tabulku, která má ID &#8220;%s&#8221;."
2829
+
2830
+ # @ tablepress
2831
+ #: views/view-edit.php:422
2832
+ msgid "Copy Table"
2833
+ msgstr "Kopírovat tabulku"
2834
+
2835
+ # @ tablepress
2836
+ #: views/view-edit.php:495
2837
+ #, php-format
2838
+ msgid "Show the table name %s the table."
2839
+ msgstr "Zobrazit název tabulky %s"
2840
+
2841
+ # @ tablepress
2842
+ #: views/view-edit.php:505
2843
+ #, php-format
2844
+ msgid "Show the table description %s the table."
2845
+ msgstr "Zobrazit popis tabulky %s."
2846
+
2847
+ # @ tablepress
2848
+ #: views/view-import.php:92
2849
+ msgid ""
2850
+ "TablePress can import tables from existing data, like from a CSV, XLS, or "
2851
+ "XLSX file from a spreadsheet application (e.g. Excel), an HTML file "
2852
+ "resembling a webpage, or its own JSON format."
2853
+ msgstr ""
2854
+ "TablePress dokáže importovat tabulky z existujících dat, jako jsou soubory "
2855
+ "CSV, XLS, XLSX z tabulkových procesorů (např. Excel), z HTML, nebo z "
2856
+ "vlastního JSON formátu."
2857
+
2858
+ # @ tablepress
2859
+ #: views/view-list.php:48
2860
+ #, php-format
2861
+ msgid ""
2862
+ "No problem! I still hope you enjoy the benefits that TablePress adds to your "
2863
+ "site. If you should change your mind, you&#8217;ll always find the &#8220;"
2864
+ "Donate&#8221; button on the <a href=\"%s\">TablePress website</a>."
2865
+ msgstr ""
2866
+
2867
+ # @ tablepress
2868
+ #: views/view-list.php:73
2869
+ msgid ""
2870
+ "Hi, my name is Tobias, I&#8217;m the developer of the TablePress plugin."
2871
+ msgstr ""
2872
+
2873
+ # @ tablepress
2874
+ #: views/view-list.php:74
2875
+ msgid ""
2876
+ "Thanks for using it! You&#8217;ve installed TablePress over a month ago."
2877
+ msgstr ""
2878
+
2879
+ # @ tablepress
2880
+ #: views/view-list.php:75
2881
+ #, php-format
2882
+ msgid ""
2883
+ "If everything works and you are satisfied with the results of managing your "
2884
+ "%s table, isn&#8217;t that worth a coffee or two?"
2885
+ msgid_plural ""
2886
+ "If everything works and you are satisfied with the results of managing your "
2887
+ "%s tables, isn&#8217;t that worth a coffee or two?"
2888
+ msgstr[0] ""
2889
+ msgstr[1] ""
2890
+ msgstr[2] ""
2891
+
2892
+ # @ tablepress
2893
+ #: views/view-list.php:78
2894
+ msgid "Sure, I&#8217;ll buy you a coffee and support TablePress!"
2895
+ msgstr ""
2896
+
2897
+ # @ tablepress
2898
+ #: views/view-list.php:80
2899
+ msgid "No, thanks. Don&#8217;t ask again."
2900
+ msgstr "Ne, díky. Znovu se neptat."
2901
+
2902
+ # @ tablepress
2903
+ #: views/view-list.php:99
2904
+ #, php-format
2905
+ msgid "The copied table has the table ID &#8220;%s&#8221;."
2906
+ msgstr "Zkopírovaná tabulka má ID &#8220;%s&#8221;."
2907
+
2908
+ # @ tablepress
2909
+ #: views/view-options.php:184
2910
+ msgid ""
2911
+ "You will manually need to remove the plugin&#8217;s files from the plugin "
2912
+ "folder afterwards."
2913
+ msgstr "Poté budete moci ručně smazat soubory pluginu ze složky pluginu."
i18n/tablepress-de_DE.mo ADDED
Binary file
i18n/tablepress-de_DE.po ADDED
@@ -0,0 +1,2898 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 TablePress
2
+ # This file is distributed under the same license as the TablePress package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: TablePress v1.6.1\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/tablepress\n"
7
+ "POT-Creation-Date: 2015-08-19 09:36+0200\n"
8
+ "PO-Revision-Date: 2015-08-19 09:36+0200\n"
9
+ "Last-Translator: Tobias Bäthge <wordpress@tobias.baethge.com>\n"
10
+ "Language-Team: Tobias Bäthge <wordpress@tobias.baethge.com>\n"
11
+ "Language: de_DE\n"
12
+ "MIME-Version: 1.0\n"
13
+ "Content-Type: text/plain; charset=UTF-8\n"
14
+ "Content-Transfer-Encoding: 8bit\n"
15
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
18
+ "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;"
19
+ "esc_attr_e\n"
20
+ "X-Poedit-Basepath: ..\n"
21
+ "X-Textdomain-Support: yes\n"
22
+ "X-Generator: Poedit 1.8.4\n"
23
+ "X-Poedit-SearchPath-0: .\n"
24
+
25
+ # @ tablepress
26
+ #: classes/class-admin-page-helper.php:79
27
+ msgid "Thank you for using <a href=\"https://tablepress.org/\">TablePress</a>."
28
+ msgstr ""
29
+ "Danke, dass du <a href=\"https://tablepress.org/\">TablePress</a> benutzt."
30
+
31
+ # @ tablepress
32
+ #: classes/class-admin-page-helper.php:80
33
+ msgid "Support the plugin with your <a href=\"%s\">donation</a>!"
34
+ msgstr "Unterstütze das Plugin mit deiner <a href=\"%s\">Spende</a>!"
35
+
36
+ # @ tablepress
37
+ #: classes/class-export.php:55 classes/class-import.php:80
38
+ msgid "CSV - Character-Separated Values"
39
+ msgstr "CSV - Trennzeichen getrennte Werte"
40
+
41
+ # @ tablepress
42
+ #: classes/class-export.php:56 classes/class-import.php:82
43
+ msgid "HTML - Hypertext Markup Language"
44
+ msgstr "HTML - Hypertext Markup Language"
45
+
46
+ # @ tablepress
47
+ #: classes/class-export.php:57 classes/class-import.php:84
48
+ msgid "JSON - JavaScript Object Notation"
49
+ msgstr "JSON - JavaScript Object Notation"
50
+
51
+ # @ tablepress
52
+ #: classes/class-export.php:60
53
+ msgid "; (semicolon)"
54
+ msgstr "; (Semikolon)"
55
+
56
+ # @ tablepress
57
+ #: classes/class-export.php:61
58
+ msgid ", (comma)"
59
+ msgstr ", (Komma)"
60
+
61
+ # @ tablepress
62
+ #: classes/class-export.php:62
63
+ msgid "\\t (tabulator)"
64
+ msgstr "\\t (Tabulator)"
65
+
66
+ #: classes/class-import.php:85
67
+ msgid "XLS - Microsoft Excel 97-2003 (experimental)"
68
+ msgstr "XLS - Microsoft Excel 97-2003 (experimentell)"
69
+
70
+ #: classes/class-import.php:86
71
+ msgid "XLSX - Microsoft Excel 2007-2013 (experimental)"
72
+ msgstr "XLSX - Microsoft Excel 2007-2013 (experimentell)"
73
+
74
+ # @ tablepress
75
+ #: classes/class-import.php:189 classes/class-import.php:301
76
+ #: classes/class-import.php:407
77
+ msgid "The imported file contains errors:"
78
+ msgstr "Die importierte Datei enthält Fehler:"
79
+
80
+ # @ tablepress
81
+ #: classes/class-render.php:272
82
+ msgid "<!-- The table with the ID %s is empty! -->"
83
+ msgstr "<!-- Die Tabelle mit der ID %s ist leer! -->"
84
+
85
+ # @ default
86
+ # @ tablepress
87
+ #: classes/class-render.php:410 views/view-list.php:421
88
+ msgid "Edit"
89
+ msgstr "Bearbeiten"
90
+
91
+ #: classes/class-tablepress.php:364
92
+ msgid "<em>unknown</em>"
93
+ msgstr "<em>unbekannt</em>"
94
+
95
+ # @ tablepress
96
+ #: classes/class-view.php:103
97
+ msgid "TablePress Help"
98
+ msgstr "TablePress-Hilfe"
99
+
100
+ # @ tablepress
101
+ #: classes/class-view.php:105
102
+ msgid ""
103
+ "More information about TablePress can be found on the <a href=\"%1$s"
104
+ "\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress "
105
+ "Plugin Directory</a>."
106
+ msgstr ""
107
+ "Weitere Informationen zu TablePress findes du auf der <a href=\"%1$s"
108
+ "\">Plugin-Website</a> oder im <a href=\"%s\">WordPress-Pluginverzeichnis</a>."
109
+
110
+ # @ tablepress
111
+ #: classes/class-view.php:106 views/view-about.php:114
112
+ msgid ""
113
+ "For technical information, please see the <a href=\"%s\">documentation</a>."
114
+ msgstr ""
115
+ "Für technische Informationen schaue in die <a href=\"%1$s\">Dokumentation</"
116
+ "a>."
117
+
118
+ # @ tablepress
119
+ #: classes/class-view.php:107
120
+ msgid ""
121
+ "<a href=\"%1$s\">Support</a> is provided through the <a href=\"%2$s"
122
+ "\">WordPress Support Forums</a>."
123
+ msgstr ""
124
+ "<a href=\"%1$s\">Hilfe</a> bekommst du in den <a href=\"%2$s\">WordPress-"
125
+ "Support-Foren</a> (auf englisch)."
126
+
127
+ # @ tablepress
128
+ #: classes/class-view.php:108 views/view-about.php:153
129
+ msgid ""
130
+ "Before asking for support, please carefully read the <a href=\"%s"
131
+ "\">Frequently Asked Questions</a>, where you will find answers to the most "
132
+ "common questions, and search through the forums."
133
+ msgstr ""
134
+ "Bevor du um Unterstützung bittest, lies bitte die <a href=\"%s\">Häufig "
135
+ "gestellten Fragen</a> und nutze die Suchfunktion des Forums."
136
+
137
+ # @ tablepress
138
+ #: classes/class-view.php:109
139
+ msgid ""
140
+ "If you like the plugin, <a href=\"%1$s\"><strong>a donation</strong></a> is "
141
+ "recommended."
142
+ msgstr ""
143
+ "Wenn dir das Plugin gefällt, würde ich mich über eine <a href=\"%1$s"
144
+ "\"><strong>Spende</strong></a> freuen."
145
+
146
+ # @ tablepress
147
+ #: classes/class-view.php:112
148
+ msgid "For more information:"
149
+ msgstr "Für weitere Informationen:"
150
+
151
+ # @ tablepress
152
+ #: classes/class-view.php:147 controllers/controller-admin.php:142
153
+ #: views/view-editor_button_thickbox.php:68
154
+ #: views/view-editor_button_thickbox.php:171
155
+ #: views/view-options_custom_css.php:37 views/view-preview_table.php:53
156
+ msgid "%1$s &lsaquo; %2$s"
157
+ msgstr "%1$s &lsaquo; %2$s"
158
+
159
+ # @ tablepress
160
+ #: classes/class-view.php:158 classes/class-view.php:159
161
+ msgid "Do you really want to delete this table?"
162
+ msgid_plural "Do you really want to delete these tables?"
163
+ msgstr[0] "Willst du diese Tabelle wirklich löschen?"
164
+ msgstr[1] "Willst du diese Tabellen wirklich löschen?"
165
+
166
+ # @ tablepress
167
+ #. Plugin Name of the plugin/theme
168
+ #: classes/class-view.php:382
169
+ msgid "TablePress"
170
+ msgstr "TablePress"
171
+
172
+ # @ tablepress
173
+ #: classes/class-view.php:414 views/view-edit.php:438 views/view-edit.php:439
174
+ #: views/view-options.php:55
175
+ msgid "Save Changes"
176
+ msgstr "Änderungen speichern"
177
+
178
+ # @ tablepress
179
+ #: controllers/controller-admin.php:205 views/view-about.php:91
180
+ #: views/view-list.php:190
181
+ msgid "Table"
182
+ msgstr "Tabelle"
183
+
184
+ # @ tablepress
185
+ #: controllers/controller-admin.php:206 controllers/controller-admin.php:207
186
+ msgid "Insert a Table from TablePress"
187
+ msgstr "Eine TablePress-Tabelle einfügen"
188
+
189
+ # @ tablepress
190
+ #: controllers/controller-admin.php:288
191
+ msgid "TablePress Table"
192
+ msgstr "TablePress-Tabelle"
193
+
194
+ # @ tablepress
195
+ #: controllers/controller-admin.php:315
196
+ msgid "Plugin page"
197
+ msgstr "Plugin-Seite"
198
+
199
+ #: controllers/controller-admin.php:330
200
+ msgid "Frequently Asked Questions"
201
+ msgstr "Häufig gestellte Fragen"
202
+
203
+ # @ tablepress
204
+ #: controllers/controller-admin.php:330
205
+ msgid "FAQ"
206
+ msgstr "FAQ"
207
+
208
+ # @ tablepress
209
+ #: controllers/controller-admin.php:331
210
+ msgid "Documentation"
211
+ msgstr "Dokumentation"
212
+
213
+ # @ tablepress
214
+ #: controllers/controller-admin.php:332
215
+ msgid "Support"
216
+ msgstr "Unterstützung"
217
+
218
+ # @ tablepress
219
+ #: controllers/controller-admin.php:333
220
+ msgid "Support TablePress with your donation!"
221
+ msgstr "Unterstütze das Plugin mit deiner Spende!"
222
+
223
+ # @ tablepress
224
+ #: controllers/controller-admin.php:333
225
+ msgid "Donate"
226
+ msgstr "Spenden"
227
+
228
+ # @ default
229
+ #: controllers/controller-admin.php:360 controllers/controller-admin.php:440
230
+ #: controllers/controller-admin.php:876 controllers/controller-admin.php:945
231
+ #: controllers/controller-admin.php:1001 controllers/controller-admin.php:1079
232
+ #: controllers/controller-admin.php:1119 controllers/controller-admin.php:1222
233
+ #: controllers/controller-admin.php:1234 controllers/controller-admin.php:1865
234
+ #: controllers/controller-admin.php:1892 controllers/controller-admin.php:1933
235
+ #: controllers/controller-admin.php:1977 controllers/controller-admin.php:2021
236
+ #: controllers/controller-admin.php:2049
237
+ msgid "You do not have sufficient permissions to access this page."
238
+ msgstr "Du hast keine ausreichenden Rechte um auf diese Seite zuzugreifen."
239
+
240
+ # @ tablepress
241
+ #: controllers/controller-admin.php:461
242
+ msgctxt ""
243
+ "Default CSV delimiter in the translated language (\";\", \",\", or \"tab\")"
244
+ msgid ","
245
+ msgstr ";"
246
+
247
+ #: controllers/controller-admin.php:533
248
+ msgid "Czech"
249
+ msgstr "Tschechisch"
250
+
251
+ #: controllers/controller-admin.php:538
252
+ msgid "German"
253
+ msgstr "Deutsch"
254
+
255
+ # @ tablepress
256
+ #: controllers/controller-admin.php:543
257
+ msgid "English"
258
+ msgstr "Englisch"
259
+
260
+ # @ tablepress
261
+ #: controllers/controller-admin.php:548
262
+ msgid "Spanish"
263
+ msgstr "Spanisch"
264
+
265
+ #: controllers/controller-admin.php:553
266
+ msgid "Finnish"
267
+ msgstr "Finnisch"
268
+
269
+ # @ tablepress
270
+ #: controllers/controller-admin.php:558
271
+ msgid "French"
272
+ msgstr "Französisch"
273
+
274
+ #: controllers/controller-admin.php:563
275
+ msgid "Hebrew"
276
+ msgstr "Hebräisch"
277
+
278
+ #: controllers/controller-admin.php:568
279
+ msgid "Italian"
280
+ msgstr "Italienisch"
281
+
282
+ #: controllers/controller-admin.php:573
283
+ msgid "Icelandic"
284
+ msgstr "Isländisch"
285
+
286
+ #: controllers/controller-admin.php:578
287
+ msgid "Japanese"
288
+ msgstr "Japanisch"
289
+
290
+ #: controllers/controller-admin.php:583
291
+ msgid "Korean"
292
+ msgstr "Koreanisch"
293
+
294
+ #: controllers/controller-admin.php:588
295
+ msgid "Latvian"
296
+ msgstr "Lettisch"
297
+
298
+ #: controllers/controller-admin.php:593
299
+ msgid "Dutch"
300
+ msgstr "Niederländisch"
301
+
302
+ # @ tablepress
303
+ #: controllers/controller-admin.php:598
304
+ msgid "Polish"
305
+ msgstr "Polnisch"
306
+
307
+ #: controllers/controller-admin.php:603
308
+ msgid "Brazilian Portuguese"
309
+ msgstr "Portugisisch (Brasilien)"
310
+
311
+ #: controllers/controller-admin.php:608
312
+ msgid "Russian"
313
+ msgstr "Russisch"
314
+
315
+ # @ tablepress
316
+ #: controllers/controller-admin.php:613
317
+ msgid "Slovak"
318
+ msgstr "Slowakisch"
319
+
320
+ #: controllers/controller-admin.php:618
321
+ msgid "Serbian"
322
+ msgstr "Serbisch"
323
+
324
+ #: controllers/controller-admin.php:623
325
+ msgid "Turkish"
326
+ msgstr "Türkisch"
327
+
328
+ #: controllers/controller-admin.php:628
329
+ msgid "Ukrainian"
330
+ msgstr "Ukrainisch"
331
+
332
+ # @ tablepress
333
+ #: controllers/controller-admin.php:633
334
+ msgid "Chinese (Simplified)"
335
+ msgstr "Chinesisch (vereinfacht)"
336
+
337
+ # @ tablepress
338
+ #: controllers/controller-admin.php:638
339
+ msgid "Chinese (Taiwan)"
340
+ msgstr "Chinesisch (Taiwan)"
341
+
342
+ # @ tablepress
343
+ #: controllers/controller-admin.php:694 controllers/controller-admin.php:695
344
+ #: controllers/controller-admin.php:696
345
+ msgid "All Tables"
346
+ msgstr "Alle Tabellen"
347
+
348
+ # @ tablepress
349
+ #: controllers/controller-admin.php:701 controllers/controller-admin.php:702
350
+ #: views/view-add.php:41
351
+ msgid "Add New Table"
352
+ msgstr "Neue Tabelle"
353
+
354
+ # @ tablepress
355
+ #: controllers/controller-admin.php:703
356
+ msgid "Add New"
357
+ msgstr "Neue Tabelle"
358
+
359
+ # @ tablepress
360
+ #: controllers/controller-admin.php:708
361
+ msgid "Edit Table"
362
+ msgstr "Tabelle bearbeiten"
363
+
364
+ # @ tablepress
365
+ #: controllers/controller-admin.php:715 controllers/controller-admin.php:716
366
+ msgid "Import a Table"
367
+ msgstr "Tabelle importieren"
368
+
369
+ # @ tablepress
370
+ #: controllers/controller-admin.php:717
371
+ msgctxt "navigation bar"
372
+ msgid "Import"
373
+ msgstr "Import"
374
+
375
+ # @ tablepress
376
+ #: controllers/controller-admin.php:722 controllers/controller-admin.php:723
377
+ msgid "Export a Table"
378
+ msgstr "Tabelle exportieren"
379
+
380
+ # @ tablepress
381
+ #: controllers/controller-admin.php:724
382
+ msgctxt "navigation bar"
383
+ msgid "Export"
384
+ msgstr "Export"
385
+
386
+ # @ tablepress
387
+ #: controllers/controller-admin.php:729 controllers/controller-admin.php:730
388
+ #: controllers/controller-admin.php:731
389
+ msgid "Plugin Options"
390
+ msgstr "Einstellungen"
391
+
392
+ # @ tablepress
393
+ #: controllers/controller-admin.php:736 controllers/controller-admin.php:738
394
+ msgid "About"
395
+ msgstr "Über"
396
+
397
+ # @ tablepress
398
+ #: controllers/controller-admin.php:737
399
+ msgid "About TablePress"
400
+ msgstr "Über TablePress"
401
+
402
+ # @ tablepress
403
+ #: controllers/controller-admin.php:1314
404
+ msgid "Imported from Manual Input"
405
+ msgstr "aus Manueller Eingabe importiert"
406
+
407
+ # @ tablepress
408
+ #: controllers/controller-admin.php:1973
409
+ #: controllers/controller-admin_ajax.php:272
410
+ msgid "The preview could not be loaded."
411
+ msgstr "Die Vorschau konnte nicht geladen werden."
412
+
413
+ # @ tablepress
414
+ #: controllers/controller-admin.php:1973 controllers/controller-admin.php:1983
415
+ #: views/view-edit.php:435 views/view-list.php:434
416
+ #: views/view-preview_table.php:53
417
+ msgid "Preview"
418
+ msgstr "Vorschau"
419
+
420
+ # @ tablepress
421
+ #: controllers/controller-admin.php:1983
422
+ msgid "The table could not be loaded."
423
+ msgstr "Die Tabelle konnte nicht geladen werden."
424
+
425
+ # @ tablepress
426
+ #: controllers/controller-admin.php:2067
427
+ msgid "TablePress was uninstalled successfully."
428
+ msgstr "TablePress wurde erfolgreich deinstalliert."
429
+
430
+ #: controllers/controller-admin.php:2068
431
+ msgid "All tables, data, and options were deleted."
432
+ msgstr "Alle Tabellen, Daten und Einstellungen wurden gelöscht."
433
+
434
+ #: controllers/controller-admin.php:2070
435
+ msgid ""
436
+ "You may now ask the network admin to delete the plugin&#8217;s folder "
437
+ "<code>tablepress</code> from the server, if no other site in the network "
438
+ "uses it."
439
+ msgstr ""
440
+ "Du kannst jetzt den WordPress-Server-Administrator bitten, den TablePress "
441
+ "Plugin-Ordner <code>tablepress</code> vom Server zu löschen, falls "
442
+ "TablePress von keiner anderen Seite des Netzwerks verwendet wird."
443
+
444
+ #: controllers/controller-admin.php:2072
445
+ msgid ""
446
+ "You may now manually delete the plugin&#8217;s folder <code>tablepress</"
447
+ "code> from the <code>plugins</code> directory on your server or use the "
448
+ "&#8220;Delete&#8221; link for TablePress on the WordPress &#8220;"
449
+ "Plugins&#8221; page."
450
+ msgstr ""
451
+ "Du kannst jetzt auch den Plugin-Ordner <code>tablepress</code> manuell aus "
452
+ "dem <code>plugins</code>-Ordern auf deinem Server löschen, oder den &#8220;"
453
+ "Löschen&#8221;-Link für TablePress auf der WordPress&#8220;Plugins&#8221;-"
454
+ "Seite nutzen."
455
+
456
+ # @ tablepress
457
+ #: controllers/controller-admin.php:2075
458
+ msgid ""
459
+ "Your TablePress &#8220;Custom CSS&#8221; files have been deleted "
460
+ "automatically."
461
+ msgstr "Die &#8220;Zusatz-CSS&#8221;-Dateien wurden automatisch gelöscht."
462
+
463
+ #: controllers/controller-admin.php:2078
464
+ msgid ""
465
+ "Please also ask him to delete your TablePress &#8220;Custom CSS&#8221; files "
466
+ "from the server."
467
+ msgstr ""
468
+ "Bitte ihn auch, die TablePress-&#8220;Zusatz-CSS&#8221;-Dateien vom Server "
469
+ "zu löschen."
470
+
471
+ #: controllers/controller-admin.php:2080
472
+ msgid ""
473
+ "You may now also delete your TablePress &#8220;Custom CSS&#8221; files in "
474
+ "the <code>wp-content</code> folder."
475
+ msgstr ""
476
+ "Du kannst jetzt auch die TablePress-&#8220;Zusatz-CSS&#8221;-Dateien im "
477
+ "<code>wp-content</code>-Ordner löschen."
478
+
479
+ # @ tablepress
480
+ #: controllers/controller-admin.php:2085
481
+ msgid "Go to &#8220;Plugins&#8221; page"
482
+ msgstr "zur &#8220;Plugins&#8221;-Seite gehen"
483
+
484
+ #: controllers/controller-admin.php:2087
485
+ msgid "Go to Dashboard"
486
+ msgstr "zum Dashboard gehen"
487
+
488
+ # @ tablepress
489
+ #: controllers/controller-admin.php:2089 views/view-options.php:197
490
+ #: views/view-options.php:204
491
+ msgid "Uninstall TablePress"
492
+ msgstr "TablePress deinstallieren"
493
+
494
+ # @ tablepress
495
+ #: controllers/controller-admin_ajax.php:265 views/view-preview_table.php:64
496
+ msgid "This is a preview of your table."
497
+ msgstr "Dies ist eine Vorschau der Tabelle."
498
+
499
+ # @ tablepress
500
+ #: controllers/controller-admin_ajax.php:266 views/view-preview_table.php:64
501
+ msgid ""
502
+ "Because of CSS styling in your theme, the table might look different on your "
503
+ "page!"
504
+ msgstr ""
505
+ "Aufgrund des CSS-Stylings deines Themes kann die Tabelle auf deiner Seite "
506
+ "anders aussehen!"
507
+
508
+ # @ tablepress
509
+ #: controllers/controller-admin_ajax.php:267 views/view-preview_table.php:64
510
+ msgid ""
511
+ "The features of the DataTables JavaScript library are also not available or "
512
+ "visible in this preview!"
513
+ msgstr ""
514
+ "Die Funktionen der DataTables-JavaScript-Bibliothek stehen in dieser "
515
+ "Vorschau nicht zur Verfügung!"
516
+
517
+ # @ tablepress
518
+ #: controllers/controller-admin_ajax.php:268 views/view-preview_table.php:65
519
+ msgid ""
520
+ "To insert the table into a page, post, or text widget, copy the Shortcode %s "
521
+ "and paste it into the editor."
522
+ msgstr ""
523
+ "Um die Tabelle in eine Seite, einen Beitrag oder ein Text-Widget einzufügen, "
524
+ "kopiere den Shortcode %s und füge ihn im Texteditor ein."
525
+
526
+ # @ tablepress
527
+ #: controllers/controller-frontend.php:738 views/view-list.php:493
528
+ msgid "%s ago"
529
+ msgstr "vor %s"
530
+
531
+ # @ tablepress
532
+ #: models/model-table.php:530 views/view-editor_button_thickbox.php:327
533
+ #: views/view-export.php:131 views/view-import.php:211 views/view-list.php:410
534
+ msgid "(no name)"
535
+ msgstr "(kein Name)"
536
+
537
+ # @ tablepress
538
+ #: models/model-table.php:532
539
+ msgid "Copy of %s"
540
+ msgstr "Kopie von %s"
541
+
542
+ # @ tablepress
543
+ #: views/view-about.php:42
544
+ msgid "Plugin Purpose"
545
+ msgstr "Zweck des Plugins"
546
+
547
+ # @ tablepress
548
+ #: views/view-about.php:43
549
+ msgid "Usage"
550
+ msgstr "Nutzung"
551
+
552
+ # @ tablepress
553
+ #: views/view-about.php:44
554
+ msgid "More Information and Documentation"
555
+ msgstr "Weitere Informationen und Dokumentation"
556
+
557
+ # @ tablepress
558
+ #: views/view-about.php:45
559
+ msgid "Help and Support"
560
+ msgstr "Hilfe und Unterstützung"
561
+
562
+ # @ tablepress
563
+ #: views/view-about.php:46
564
+ msgid "Author and License"
565
+ msgstr "Autor und Lizenz"
566
+
567
+ # @ tablepress
568
+ #: views/view-about.php:47
569
+ msgid "Credits and Thanks"
570
+ msgstr "Danksagung"
571
+
572
+ # @ tablepress
573
+ #: views/view-about.php:48
574
+ msgid "Debug and Version Information"
575
+ msgstr "Debug- und Versionsinformationen"
576
+
577
+ # @ tablepress
578
+ #: views/view-about.php:62
579
+ msgid ""
580
+ "TablePress allows you to create and manage tables in the admin area of "
581
+ "WordPress."
582
+ msgstr ""
583
+ "TablePress ermöglicht es, im Admin-Bereich von WordPress Tabellen zu "
584
+ "erstellen und zu verwalten."
585
+
586
+ # @ tablepress
587
+ #: views/view-about.php:63
588
+ msgid ""
589
+ "Tables may contain text, numbers and even HTML (e.g. to include images or "
590
+ "links)."
591
+ msgstr ""
592
+ "Tabellen können Text, Zahlen und auch HTML-Code (z.B. für Links und Bilder) "
593
+ "enthalten."
594
+
595
+ # @ tablepress
596
+ #: views/view-about.php:64
597
+ msgid ""
598
+ "You can then show the tables in your posts, on your pages, or in text "
599
+ "widgets by using a Shortcode."
600
+ msgstr ""
601
+ "Mittels eines Shortcodes kannst du eine Tabelle in einen Beitrag, eine Seite "
602
+ "oder ein Text-Widget einfügen."
603
+
604
+ # @ tablepress
605
+ #: views/view-about.php:65
606
+ msgid ""
607
+ "If you want to show your tables anywhere else in your theme, you can use a "
608
+ "Template Tag function."
609
+ msgstr ""
610
+ "Wenn du eine Tabelle an einer anderen Stelle deines Themes einfügen willst, "
611
+ "kannst du dazu eine Template-Tag-Funktion nutzen."
612
+
613
+ # @ tablepress
614
+ #: views/view-about.php:81
615
+ msgid "At first, you should add or import a table."
616
+ msgstr "Als Erstes solltest du eine neue Tabelle anlegen oder importieren."
617
+
618
+ # @ tablepress
619
+ #: views/view-about.php:82
620
+ msgid ""
621
+ "This means that you either let the plugin create an empty table for you or "
622
+ "that you load an existing table from either a CSV, HTML, JSON, XLS, or XLSX "
623
+ "file."
624
+ msgstr ""
625
+ "Das bedeutet, dass du das Plugin entweder eine leere Tabelle anlegen lassen "
626
+ "kannst, oder dass du eine existierende Tabelle aus einer CSV-, HTML-, JSON-, "
627
+ "XLS- oder XLSX-Datei lädst."
628
+
629
+ # @ tablepress
630
+ #: views/view-about.php:85
631
+ msgid ""
632
+ "Then you can edit your data or change the structure of your table (e.g. by "
633
+ "inserting, deleting, moving, or swaping rows or columns or sorting them) and "
634
+ "select specific table features like alternating row colors or whether to "
635
+ "print the name or description, if you want."
636
+ msgstr ""
637
+ "Dann kannst du die Daten bearbeiten oder die Struktur der Tabelle ändern (z."
638
+ "B. Zeilen oder Spalten einfügen, löschen, verschieben, tauschen oder "
639
+ "sortieren), und weitere Funktionen wie alternierende Zeilenfarben oder das "
640
+ "Anzeigen von Tabellenname oder -beschreibung auswählen, wenn du willst."
641
+
642
+ # @ tablepress
643
+ #: views/view-about.php:86
644
+ msgid "To easily add a link or an image to a cell, use the provided buttons."
645
+ msgstr ""
646
+ "Um auf einfache Art und Weise einen Link oder ein Bild in eine Zelle "
647
+ "einzufügen, nutze die dazu vorgesehenen Schaltflächen."
648
+
649
+ # @ tablepress
650
+ #: views/view-about.php:87
651
+ msgid ""
652
+ "Those will ask you for the necessary information and and corresponding HTML "
653
+ "code will be added to the cell automatically."
654
+ msgstr ""
655
+ "Du wirst dann nach den nötigen Informationen gefragt und der zugehörige HTML-"
656
+ "Code wird automatisch in die Zelle eingefügt."
657
+
658
+ # @ tablepress
659
+ #: views/view-about.php:90 views/view-list.php:188
660
+ msgid ""
661
+ "To insert a table into a page, post, or text widget, copy its Shortcode %s "
662
+ "and paste it at the desired place in the editor."
663
+ msgstr ""
664
+ "Um eine Tabelle in eine Seite, einen Beitrag oder ein Text-Widget "
665
+ "einzufügen, kopiere den Shortcode %s und füge ihn an der gewünschten Stelle "
666
+ "im Texteditor ein."
667
+
668
+ # @ tablepress
669
+ #: views/view-about.php:91 views/view-list.php:190
670
+ msgid ""
671
+ "You can also click the &#8220;%s&#8221; button in the editor toolbar to "
672
+ "select and insert a table."
673
+ msgstr ""
674
+ "Du kannst auch die &#8220;%s&#8221;-Schaltfläche in der Werkzeugleiste des "
675
+ "Texteditors klicken, um dann eine Tabelle auszuwählen und einzufügen."
676
+
677
+ # @ tablepress
678
+ #: views/view-about.php:94
679
+ msgid "Tables can be styled by changing and adding CSS commands."
680
+ msgstr "Das Aussehen von Tabellen kann durch CSS-Code geändert werden."
681
+
682
+ # @ tablepress
683
+ #: views/view-about.php:95
684
+ msgid ""
685
+ "The plugin ships with default CSS stylesheets, which can be customized with "
686
+ "own code or replaced with other stylesheets."
687
+ msgstr ""
688
+ "Das Plugin enthält ein CSS-Standarddesign, das mit eigenem CSS-Code geändert "
689
+ "oder erweitert werden kann."
690
+
691
+ # @ tablepress
692
+ #: views/view-about.php:96
693
+ msgid ""
694
+ "For this, each table is given certain CSS classes that can be used as CSS "
695
+ "selectors."
696
+ msgstr ""
697
+ "Dafür hat jede Tabelle bestimmte CSS-Klassen, die als CSS-Selektoren genutzt "
698
+ "werden könnnen."
699
+
700
+ # @ tablepress
701
+ #: views/view-about.php:97
702
+ msgid ""
703
+ "Please see the <a href=\"%s\">documentation</a> for a list of these "
704
+ "selectors and for styling examples."
705
+ msgstr ""
706
+ "Bitte lies die <a href=\"%s\">Dokumentation</a>, in der du eine Liste dieser "
707
+ "CSS-Selektoren und Styling-Beispiele findest."
708
+
709
+ # @ tablepress
710
+ #: views/view-about.php:113
711
+ msgid ""
712
+ "More information about TablePress can be found on the <a href=\"%s"
713
+ "\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress "
714
+ "Plugin Directory</a>."
715
+ msgstr ""
716
+ "Weitere Informationen zu TablePress findest du auf der <a href=\"%s\">Plugin-"
717
+ "Website</a> oder auf seiner Seite im <a href=\"%s\">WordPress-"
718
+ "Pluginverzeichnis</a>."
719
+
720
+ # @ tablepress
721
+ #: views/view-about.php:130
722
+ msgid ""
723
+ "This plugin was written and developed by <a href=\"%s\">Tobias Bäthge</a>."
724
+ msgstr ""
725
+ "Dieses Plugin wurde von <a href=\"%s\">Tobias Bäthge</a> programmiert und "
726
+ "entwickelt."
727
+
728
+ # @ tablepress
729
+ #: views/view-about.php:131
730
+ msgid ""
731
+ "It is licensed as Free Software under GNU General Public License 2 (GPL 2)."
732
+ msgstr ""
733
+ "Es steht als <em>Freie Software</em> unter GNU General Public License 2 (GPL "
734
+ "2)."
735
+
736
+ # @ tablepress
737
+ #: views/view-about.php:133
738
+ msgid ""
739
+ "If you like the plugin, <a href=\"%s\"><strong>giving a donation</strong></"
740
+ "a> is recommended."
741
+ msgstr ""
742
+ "Wenn dir das Plugin gefällt, wird eine <a href=\"%s\"><strong>Spende</"
743
+ "strong></a> empfohlen."
744
+
745
+ # @ tablepress
746
+ #: views/view-about.php:134
747
+ msgid ""
748
+ "Please rate and review the plugin in the <a href=\"%s\">WordPress Plugin "
749
+ "Directory</a>."
750
+ msgstr ""
751
+ "Bitte bewerte das Plugin im <a href=\"%s\">WordPress-Pluginverzeichnis</a>."
752
+
753
+ # @ tablepress
754
+ #: views/view-about.php:136
755
+ msgid ""
756
+ "Donations and good ratings encourage me to further develop the plugin and to "
757
+ "provide countless hours of support. Any amount is appreciated! Thanks!"
758
+ msgstr ""
759
+ "Spenden und gute Bewertungen ermuntern mich, das Plugin weiterzuentwickeln "
760
+ "und unzählige Stunden Hilfe und Unterstützung zu leisten. Jeder Betrag ist "
761
+ "willkommen. Vielen Dank!"
762
+
763
+ # @ tablepress
764
+ #: views/view-about.php:152
765
+ msgid ""
766
+ "<a href=\"%s\">Support</a> is provided through the <a href=\"%s\">WordPress "
767
+ "Support Forums</a>."
768
+ msgstr ""
769
+ "<a href=\"%s\">Hilfe und Unterstützung</a> bekommst du in den <a href=\"%s"
770
+ "\">WordPress-Support-Foren</a>."
771
+
772
+ # @ tablepress
773
+ #: views/view-about.php:156
774
+ msgid ""
775
+ "If you do not find an answer there, please <a href=\"%s\">open a new thread</"
776
+ "a> in the WordPress Support Forums."
777
+ msgstr ""
778
+ "Wenn du dort keine Antwort findest, <a href=\"%s\">öffne ein neues Thema</a> "
779
+ "in den WordPress-Support-Foren."
780
+
781
+ # @ tablepress
782
+ #: views/view-about.php:173
783
+ msgid "Please provide this information in bug reports and support requests."
784
+ msgstr ""
785
+ "Bitte gib diese Informationen in Fehlerbeschreibungen und Hilfsanfragen an."
786
+
787
+ # @ tablepress
788
+ #: views/view-about.php:209
789
+ msgid "Special Thanks go to:"
790
+ msgstr "Besonderen Dank an:"
791
+
792
+ # @ tablepress
793
+ #: views/view-about.php:210
794
+ msgid ""
795
+ "Allan Jardine for <a href=\"http://www.datatables.net/\">DataTables</a>,"
796
+ msgstr ""
797
+ "Allan Jardine für <a href=\"http://www.datatables.net/\">DataTables</a>,"
798
+
799
+ # @ tablepress
800
+ #: views/view-about.php:213
801
+ msgid "Thanks to the translators:"
802
+ msgstr "Vielen Dank an die Übersetzer:"
803
+
804
+ # @ tablepress
805
+ #: views/view-about.php:218
806
+ msgid "%s (thanks to %s)"
807
+ msgstr "%s (danke an %s)"
808
+
809
+ # @ tablepress
810
+ #: views/view-about.php:223
811
+ msgid ""
812
+ "Thank you to all donors, contributors, supporters, reviewers and users of "
813
+ "the plugin!"
814
+ msgstr ""
815
+ "Ein großes Dankeschön an alle Spender, Unterstützer, Reviewer und Nutzer des "
816
+ "Plugins!"
817
+
818
+ # @ tablepress
819
+ #: views/view-add.php:37
820
+ msgid "Error: The table could not be added."
821
+ msgstr "Fehler: Die Tabelle konnte nicht hinzugefügt werden."
822
+
823
+ # @ tablepress
824
+ #: views/view-add.php:42
825
+ msgid "Add Table"
826
+ msgstr "Tabelle hinzufügen"
827
+
828
+ # @ tablepress
829
+ #: views/view-add.php:57
830
+ msgid ""
831
+ "To add a new table, enter its name, a description (optional), and the number "
832
+ "of rows and columns into the form below."
833
+ msgstr ""
834
+ "Um eine neue Tabelle hinzuzufügen, gib einen Namen, eine (optionale) "
835
+ "Beschreibung, und die Anzahl der Zeilen und Spalten in das Formular ein."
836
+
837
+ # @ tablepress
838
+ #: views/view-add.php:60
839
+ msgid ""
840
+ "You can always change the name, description, and size of your table later."
841
+ msgstr ""
842
+ "Name, Beschreibung und Größe der Tabelle können später auch geändert werden."
843
+
844
+ # @ tablepress
845
+ #: views/view-add.php:77 views/view-edit.php:222
846
+ #: views/view-editor_button_thickbox.php:275 views/view-list.php:321
847
+ msgid "Table Name"
848
+ msgstr "Tabellen-Name"
849
+
850
+ # @ tablepress
851
+ #: views/view-add.php:78
852
+ msgid "Enter Table Name here"
853
+ msgstr "Tabellen-Name eingeben"
854
+
855
+ # @ tablepress
856
+ #: views/view-add.php:79
857
+ msgid "The name or title of your table."
858
+ msgstr "Name oder Titel der Tabelle."
859
+
860
+ # @ tablepress
861
+ #: views/view-add.php:82 views/view-edit.php:226
862
+ #: views/view-editor_button_thickbox.php:276 views/view-list.php:322
863
+ msgid "Description"
864
+ msgstr "Beschreibung"
865
+
866
+ # @ tablepress
867
+ #: views/view-add.php:82
868
+ msgid "(optional)"
869
+ msgstr "(optional)"
870
+
871
+ # @ tablepress
872
+ #: views/view-add.php:83
873
+ msgid "Enter Description here"
874
+ msgstr "Beschreibung eingeben"
875
+
876
+ # @ tablepress
877
+ #: views/view-add.php:84
878
+ msgid "A description of the contents of your table."
879
+ msgstr "Eine Beschreibung des Inhalts der Tabelle."
880
+
881
+ # @ tablepress
882
+ #: views/view-add.php:87
883
+ msgid "Number of Rows"
884
+ msgstr "Anzahl Zeilen"
885
+
886
+ # @ tablepress
887
+ #: views/view-add.php:88 views/view-add.php:93 views/view-edit.php:411
888
+ #: views/view-edit.php:414
889
+ msgid "This field must contain a positive number."
890
+ msgstr "Dieses Feld muss eine positive Zahl enthalten."
891
+
892
+ # @ tablepress
893
+ #: views/view-add.php:89
894
+ msgid "The number of rows in your table."
895
+ msgstr "Die Anzahl der Zeilen der Tabelle."
896
+
897
+ # @ tablepress
898
+ #: views/view-add.php:92
899
+ msgid "Number of Columns"
900
+ msgstr "Anzahl Spalten"
901
+
902
+ # @ tablepress
903
+ #: views/view-add.php:94
904
+ msgid "The number of columns in your table."
905
+ msgstr "Die Anzahl der Spalten der Tabelle"
906
+
907
+ # @ tablepress
908
+ #: views/view-edit.php:48
909
+ msgid "The table was saved successfully."
910
+ msgstr "Die Tabelle wurde erfolgreich gespeichert."
911
+
912
+ # @ tablepress
913
+ #: views/view-edit.php:49
914
+ msgid "The table was added successfully."
915
+ msgstr "Die Tabelle wurde erfolgreich hinzugefügt."
916
+
917
+ # @ tablepress
918
+ #: views/view-edit.php:50 views/view-list.php:102 views/view-list.php:103
919
+ msgid "The table was copied successfully."
920
+ msgid_plural "The tables were copied successfully."
921
+ msgstr[0] "Die Tabelle wurde erfolgreich kopiert."
922
+ msgstr[1] "Die Tabellen wurde erfolgreich kopiert."
923
+
924
+ #: views/view-edit.php:50
925
+ msgid ""
926
+ "You are now seeing the copied table, which has the table ID &#8220;%s&#8221;."
927
+ msgstr ""
928
+ "Du bearbeitest jetzt die kopierte Tabelle, die die ID &#8220;%s&#8221; hat."
929
+
930
+ # @ tablepress
931
+ #: views/view-edit.php:51
932
+ msgid "The table was imported successfully."
933
+ msgstr "Die Tabelle wurde erfolgreich importiert."
934
+
935
+ # @ tablepress
936
+ #: views/view-edit.php:52
937
+ msgid "The table was imported successfully from WP-Table Reloaded."
938
+ msgstr "Die Tabelle wurde erfolgreich aus WP-Table Reloaded importiert."
939
+
940
+ # @ tablepress
941
+ #: views/view-edit.php:53 views/view-list.php:101
942
+ msgid "Error: The table could not be saved."
943
+ msgstr "Fehler: Die Tabelle konnte nicht gespeichert werden."
944
+
945
+ # @ tablepress
946
+ #: views/view-edit.php:54 views/view-list.php:100
947
+ msgid "Error: The table could not be deleted."
948
+ msgstr "Fehler: Die Tabelle konnte nicht gelöscht werden."
949
+
950
+ # @ tablepress
951
+ #: views/view-edit.php:55
952
+ msgid "The table was saved successfully, and the table ID was changed."
953
+ msgstr ""
954
+ "Die Tabelle wurde erfolgreich gespeichert und die Tabellen-ID wurde geändert."
955
+
956
+ # @ tablepress
957
+ #: views/view-edit.php:56
958
+ msgid ""
959
+ "The table was saved successfully, but the table ID could not be changed!"
960
+ msgstr ""
961
+ "Die Tabelle wurde erfolgreich gespeichert, aber die Tabellen-ID konnte nicht "
962
+ "geändert werden."
963
+
964
+ # @ tablepress
965
+ #: views/view-edit.php:108
966
+ msgid "You can not delete all table rows!"
967
+ msgstr "Du kannst nicht alle Zeilen löschen!"
968
+
969
+ # @ tablepress
970
+ #: views/view-edit.php:109
971
+ msgid "You can not delete all table columns!"
972
+ msgstr "Du kannst nicht alle Spalten löschen!"
973
+
974
+ # @ tablepress
975
+ #: views/view-edit.php:110
976
+ msgid "You did not select any rows!"
977
+ msgstr "Du hast keine Zeilen ausgewählt!"
978
+
979
+ # @ tablepress
980
+ #: views/view-edit.php:111
981
+ msgid "You did not select any columns!"
982
+ msgstr "Du hast keine Spalten ausgewählt!"
983
+
984
+ # @ tablepress
985
+ #: views/view-edit.php:112
986
+ msgid "The value for the number of rows is invalid!"
987
+ msgstr "Die eingebene Anzahl der Zeilen ist ungültig!"
988
+
989
+ # @ tablepress
990
+ #: views/view-edit.php:113
991
+ msgid "The value for the number of columns is invalid!"
992
+ msgstr "Die eingebene Anzahl der Spalten ist ungültig!"
993
+
994
+ # @ tablepress
995
+ #: views/view-edit.php:114 views/view-edit.php:115
996
+ msgid "Do you really want to delete the selected row?"
997
+ msgid_plural "Do you really want to delete the selected rows?"
998
+ msgstr[0] "Willst du die gewählte Zeile wirklich löschen?"
999
+ msgstr[1] "Willst du die gewählten Zeilen wirklich löschen?"
1000
+
1001
+ # @ tablepress
1002
+ #: views/view-edit.php:116 views/view-edit.php:117
1003
+ msgid "Do you really want to delete the selected column?"
1004
+ msgid_plural "Do you really want to delete the selected columns?"
1005
+ msgstr[0] "Willst du die gewählte Spalte wirklich löschen?"
1006
+ msgstr[1] "Willst du die gewählten Spalten wirklich löschen?"
1007
+
1008
+ # @ tablepress
1009
+ #: views/view-edit.php:118
1010
+ msgid ""
1011
+ "Please click into the cell that you want to edit using the &#8220;Advanced "
1012
+ "Editor&#8221;."
1013
+ msgstr ""
1014
+ "Bitte klicke in die Tabellenzelle, die du mittels des &#8220;Erweiterten "
1015
+ "Editors&#8221; bearbeiten willst."
1016
+
1017
+ # @ tablepress
1018
+ #: views/view-edit.php:119
1019
+ msgid ""
1020
+ "To combine cells within a column, click into the cell below the cell that "
1021
+ "has the content the combined cells shall have."
1022
+ msgstr ""
1023
+ "Um Zellen innerhalb einer Spalte zu verbinden, klicke in die Zelle unterhalb "
1024
+ "von der, die den Inhalt der verbundenen Zellen beinhaltet."
1025
+
1026
+ # @ tablepress
1027
+ #: views/view-edit.php:120
1028
+ msgid ""
1029
+ "To combine cells within a row, click into the cell to the right of the cell "
1030
+ "that has the content the combined cells shall have."
1031
+ msgstr ""
1032
+ "Um Zellen innerhalb einer Zeile zu verbinden, klicke in die Zelle rechts von "
1033
+ "der, die den Inhalt der verbundenen Zellen beinhaltet."
1034
+
1035
+ #: views/view-edit.php:121
1036
+ msgid ""
1037
+ "Attention: You have enabled the usage of the DataTables JavaScript library "
1038
+ "for features like sorting, search, or pagination."
1039
+ msgstr ""
1040
+ "Achtung: Du hast die Nutzung der DataTables-JavaScript-Bibliothek, mit "
1041
+ "Funktionen wie Sortieren, Filtern/Suche und Umblättern, aktiviert."
1042
+
1043
+ #: views/view-edit.php:122
1044
+ msgid "Unfortunately, these can not be used in tables with combined cells."
1045
+ msgstr ""
1046
+ "Leider können diese nicht in Tabellen mit verbundenen Zellen genutzt werden."
1047
+
1048
+ #: views/view-edit.php:123
1049
+ msgid ""
1050
+ "Do you want to proceed and automatically turn off the usage of DataTables "
1051
+ "for this table?"
1052
+ msgstr ""
1053
+ "Möchtest du fortfahren und die Nutzung von DataTables automatisch für diese "
1054
+ "Tabelle deaktivieren?"
1055
+
1056
+ # @ tablepress
1057
+ #: views/view-edit.php:124
1058
+ msgid "Please click into the cell that you want to add a link to."
1059
+ msgstr "Bitte klicke in die Zelle, in die du einen Link einfügen möchtest."
1060
+
1061
+ # @ tablepress
1062
+ #: views/view-edit.php:125
1063
+ msgid ""
1064
+ "You can then enter the Link URL and Text or choose an existing page or post."
1065
+ msgstr "Danach kannst du die Adresse und den Link-Text eingeben."
1066
+
1067
+ # @ tablepress
1068
+ #: views/view-edit.php:126
1069
+ msgid "Please click into the cell that you want to add an image to."
1070
+ msgstr "Bitte klicke in die Zelle, in die du ein Bild einfügen möchtest."
1071
+
1072
+ # @ tablepress
1073
+ #: views/view-edit.php:127
1074
+ msgid ""
1075
+ "The Media Library will open, where you can select or upload the desired "
1076
+ "image or enter the image URL."
1077
+ msgstr ""
1078
+ "In der sich dann öffnen Medien-Bibliothek kannst du ein bestehendes Bild "
1079
+ "auswählen oder hochladen."
1080
+
1081
+ # @ tablepress
1082
+ #: views/view-edit.php:128
1083
+ msgid "Click the &#8220;%s&#8221; button to insert the image."
1084
+ msgstr "Klicke dann die &#8220;%s&#8221;-Schaltfläche, um das Bild einzufügen."
1085
+
1086
+ # @ tablepress
1087
+ #: views/view-edit.php:128 views/view-edit.php:182
1088
+ msgid "Insert into Table"
1089
+ msgstr "In die Tabelle einfügen"
1090
+
1091
+ # @ tablepress
1092
+ #: views/view-edit.php:129
1093
+ msgid ""
1094
+ "The changes to this table were not saved yet and will be lost if you "
1095
+ "navigate away from this page."
1096
+ msgstr ""
1097
+ "Deine Änderungen in dieser Tabelle wurden noch nicht gespeichert. Beim "
1098
+ "Verlassen der Seite werden diese Änderungen verworfen."
1099
+
1100
+ # @ tablepress
1101
+ #: views/view-edit.php:130
1102
+ msgid "The Table Preview is being loaded..."
1103
+ msgstr "Die Vorschau wird geladen..."
1104
+
1105
+ # @ tablepress
1106
+ #: views/view-edit.php:131
1107
+ msgid "The Table Preview could not be loaded."
1108
+ msgstr "Die Vorschau konnte nicht geladen werden."
1109
+
1110
+ # @ tablepress
1111
+ #: views/view-edit.php:132
1112
+ msgid "Saving successful"
1113
+ msgstr "Speichern erfolgreich"
1114
+
1115
+ # @ tablepress
1116
+ #: views/view-edit.php:133
1117
+ msgid "Saving failed"
1118
+ msgstr "Speichern fehlgeschlagen"
1119
+
1120
+ # @ tablepress
1121
+ #: views/view-edit.php:134
1122
+ msgid "Changes are being saved..."
1123
+ msgstr "Die Änderungen werden gespeichert..."
1124
+
1125
+ # @ tablepress
1126
+ #: views/view-edit.php:135
1127
+ msgid "The Table ID field can not be empty. Please enter a Table ID!"
1128
+ msgstr "Die Tabellen-ID kann nicht leer sein. Bitte gib eine Tabellen-ID ein."
1129
+
1130
+ # @ tablepress
1131
+ #: views/view-edit.php:136
1132
+ msgid ""
1133
+ "The Table ID &#8220;0&#8221; is not supported. Please enter a different "
1134
+ "Table ID!"
1135
+ msgstr ""
1136
+ "Die Tabellen-ID &#8220;0&#8221; ist nicht möglich. Bitte wähle eine andere "
1137
+ "ID!"
1138
+
1139
+ # @ tablepress
1140
+ #: views/view-edit.php:137
1141
+ msgid ""
1142
+ "Do you really want to change the Table ID? All Shortcodes for this table in "
1143
+ "your pages and posts will have to be adjusted!"
1144
+ msgstr ""
1145
+ "Willst du die Tabellen-ID wirklich ändern? Alle Shortcodes für diese Tabelle "
1146
+ "in deinen Seiten und Beiträgen müssen dann angepasst werden."
1147
+
1148
+ # @ tablepress
1149
+ #: views/view-edit.php:138
1150
+ msgid ""
1151
+ "The entered value in the field &#8220;Extra CSS classes&#8221; is invalid."
1152
+ msgstr ""
1153
+ "Der in das Feld &#8220;Weitere CSS-Klassen&#8221; eingegebene Wert ist "
1154
+ "ungültig."
1155
+
1156
+ # @ tablepress
1157
+ #: views/view-edit.php:139
1158
+ msgid ""
1159
+ "The entered value in the field &#8220;Pagination Entries&#8221; is not a "
1160
+ "number."
1161
+ msgstr ""
1162
+ "Der in das Feld &#8220;Umblättern&#8221; eingegebene Wert ist keine Zahl."
1163
+
1164
+ # @ tablepress
1165
+ #: views/view-edit.php:140 views/view-edit.php:285
1166
+ msgid "Sort ascending"
1167
+ msgstr "Aufsteigend Sortieren"
1168
+
1169
+ # @ tablepress
1170
+ #: views/view-edit.php:141 views/view-edit.php:285
1171
+ msgid "Sort descending"
1172
+ msgstr "Absteigend Sortieren"
1173
+
1174
+ # @ tablepress
1175
+ #: views/view-edit.php:142
1176
+ msgid "You can not add rowspan to the first row!"
1177
+ msgstr "Die erste Zeile kann nicht verbunden werden."
1178
+
1179
+ # @ tablepress
1180
+ #: views/view-edit.php:143
1181
+ msgid "You can not add colspan to the first column!"
1182
+ msgstr "Die erste Spalte kann nicht verbunden werden."
1183
+
1184
+ # @ tablepress
1185
+ #: views/view-edit.php:144
1186
+ msgid "You can not connect cells into the table head row!"
1187
+ msgstr ""
1188
+ "Diese Zelle kann nicht mit der darüber liegenden Zelle der Kopfzeile "
1189
+ "verbunden werden."
1190
+
1191
+ # @ tablepress
1192
+ #: views/view-edit.php:145
1193
+ msgid "You can not connect cells out of the table foot row!"
1194
+ msgstr ""
1195
+ "Diese Zelle der Fußzeile kann nicht mit der darüber liegenden Zelle "
1196
+ "verbunden werden."
1197
+
1198
+ # @ tablepress
1199
+ #: views/view-edit.php:153
1200
+ msgid "Table Information"
1201
+ msgstr "Informationen über die Tabelle"
1202
+
1203
+ # @ tablepress
1204
+ #: views/view-edit.php:154
1205
+ msgid "Table Content"
1206
+ msgstr "Tabellen-Inhalt"
1207
+
1208
+ # @ tablepress
1209
+ #: views/view-edit.php:155
1210
+ msgid "Table Manipulation"
1211
+ msgstr "Bearbeitungsfunktionen"
1212
+
1213
+ # @ tablepress
1214
+ #: views/view-edit.php:156 views/view-edit.php:578
1215
+ msgid "Table Options"
1216
+ msgstr "Tabellen-Einstellungen"
1217
+
1218
+ # @ tablepress
1219
+ #: views/view-edit.php:157
1220
+ msgid "Features of the DataTables JavaScript library"
1221
+ msgstr "Funktionen der DataTables-JavaScript-Bibliothek"
1222
+
1223
+ # @ tablepress
1224
+ #: views/view-edit.php:213
1225
+ msgid "Table ID"
1226
+ msgstr "Tabellen-ID"
1227
+
1228
+ #: views/view-edit.php:216
1229
+ msgid ""
1230
+ "The Table ID can only consist of letters, numbers, hyphens (-), and "
1231
+ "underscores (_)."
1232
+ msgstr ""
1233
+ "Die Tabellen-ID darf nur aus Buchstaben, Zahlen, Bindestrich (-) und "
1234
+ "Unterstrich (_) bestehen."
1235
+
1236
+ # @ tablepress
1237
+ #: views/view-edit.php:217
1238
+ msgid "Shortcode"
1239
+ msgstr "Shortcode"
1240
+
1241
+ # @ tablepress
1242
+ #: views/view-edit.php:230 views/view-list.php:325
1243
+ msgid "Last Modified"
1244
+ msgstr "Zuletzt geändert"
1245
+
1246
+ # @ tablepress
1247
+ #: views/view-edit.php:231
1248
+ msgid "%1$s by %2$s"
1249
+ msgstr "%1$s von %2$s"
1250
+
1251
+ # @ tablepress
1252
+ #: views/view-edit.php:363
1253
+ msgid "Insert Link"
1254
+ msgstr "Link einfügen"
1255
+
1256
+ # @ tablepress
1257
+ #: views/view-edit.php:364
1258
+ msgid "Insert Image"
1259
+ msgstr "Bild einfügen"
1260
+
1261
+ # @ tablepress
1262
+ #: views/view-edit.php:365
1263
+ msgid "Advanced Editor"
1264
+ msgstr "Erweiterter Editor"
1265
+
1266
+ # @ tablepress
1267
+ #: views/view-edit.php:368
1268
+ msgid "Combine cells"
1269
+ msgstr "Zellen verbinden"
1270
+
1271
+ # @ tablepress
1272
+ #: views/view-edit.php:369
1273
+ msgid "in a column (rowspan)"
1274
+ msgstr "in Spalte"
1275
+
1276
+ # @ tablepress
1277
+ #: views/view-edit.php:370
1278
+ msgid "in a row (colspan)"
1279
+ msgstr "in Zeile"
1280
+
1281
+ # @ tablepress
1282
+ #: views/view-edit.php:371
1283
+ msgid "?"
1284
+ msgstr "?"
1285
+
1286
+ # @ tablepress
1287
+ #: views/view-edit.php:371
1288
+ msgid "Help on combining cells"
1289
+ msgstr "Hilfe zum Verbinden von Zellen"
1290
+
1291
+ # @ tablepress
1292
+ #: views/view-edit.php:373
1293
+ msgid "Table cells can span across more than one column or row."
1294
+ msgstr "Tabellenzellen können mit ihren Nachbarzellen verbunden werden."
1295
+
1296
+ # @ tablepress
1297
+ #: views/view-edit.php:374
1298
+ msgid ""
1299
+ "Combining consecutive cells within the same row is called &#8220;"
1300
+ "colspanning&#8221;."
1301
+ msgstr ""
1302
+ "Das Verbinden von benachbarten Zellen in einer Zeile wird &#8220;"
1303
+ "colspan&#8221; genannt."
1304
+
1305
+ # @ tablepress
1306
+ #: views/view-edit.php:375
1307
+ msgid ""
1308
+ "Combining consecutive cells within the same column is called &#8220;"
1309
+ "rowspanning&#8221;."
1310
+ msgstr ""
1311
+ "Das Verbinden von benachbarten Zellen in einer Spalte wird &#8220;"
1312
+ "rowspan&#8221; genannt."
1313
+
1314
+ # @ tablepress
1315
+ #: views/view-edit.php:376
1316
+ msgid ""
1317
+ "To combine adjacent cells in a row, add the keyword <code>#colspan#</code> "
1318
+ "to the cell to the right of the one with the content for the combined cell "
1319
+ "by using the corresponding button."
1320
+ msgstr ""
1321
+ "Um benachbarte Zellen in einer Zeile zu verbinden, füge das Wort "
1322
+ "<code>#colspan#</code> in die Zelle rechts der Zelle, die den Inhalt der "
1323
+ "verbundenen Zelle enthält, ein, oder nutze die entsprechende Schaltfläche."
1324
+
1325
+ # @ tablepress
1326
+ #: views/view-edit.php:377
1327
+ msgid ""
1328
+ "To combine adjacent cells in a column, add the keyword <code>#rowspan#</"
1329
+ "code> to the cell below the one with the content for the combined cell by "
1330
+ "using the corresponding button."
1331
+ msgstr ""
1332
+ "Um benachbarte Zellen in einer Spalte zu verbinden, füge das Wort "
1333
+ "<code>#rowspan#</code> in die Zelle unterhalb der Zelle, die den Inhalt der "
1334
+ "verbundenen Zelle enthält, ein, oder nutze die entsprechende Schaltfläche."
1335
+
1336
+ # @ tablepress
1337
+ #: views/view-edit.php:378
1338
+ msgid "Repeat this to add the keyword to all cells that shall be connected."
1339
+ msgstr ""
1340
+ "Wiederhole diese Schritte mit allen Zellen, die verbunden werden sollen."
1341
+
1342
+ # @ tablepress
1343
+ #: views/view-edit.php:379
1344
+ msgid ""
1345
+ "Be aware that the functions of the DataTables JavaScript library will not "
1346
+ "work on tables which have combined cells."
1347
+ msgstr ""
1348
+ "Bitte beachte, dass die Funktionen der DataTables-JavaScript-Bibliothek in "
1349
+ "Tabellen mit verbundenen Zellen nicht zur Verfügung stehen."
1350
+
1351
+ # @ tablepress
1352
+ #: views/view-edit.php:385 views/view-edit.php:397
1353
+ msgid "Selected rows"
1354
+ msgstr "Gewählte Zeilen"
1355
+
1356
+ # @ tablepress
1357
+ #: views/view-edit.php:386 views/view-edit.php:391
1358
+ msgid "Hide"
1359
+ msgstr "Verstecken"
1360
+
1361
+ # @ tablepress
1362
+ #: views/view-edit.php:387 views/view-edit.php:392
1363
+ msgid "Show"
1364
+ msgstr "Zeigen"
1365
+
1366
+ # @ tablepress
1367
+ #: views/view-edit.php:390 views/view-edit.php:403
1368
+ msgid "Selected columns"
1369
+ msgstr "Gewählte Spalten"
1370
+
1371
+ # @ tablepress
1372
+ #: views/view-edit.php:398 views/view-edit.php:404
1373
+ msgid "Duplicate"
1374
+ msgstr "Duplizieren"
1375
+
1376
+ # @ tablepress
1377
+ #: views/view-edit.php:399 views/view-edit.php:405
1378
+ msgid "Insert"
1379
+ msgstr "Einfügen"
1380
+
1381
+ # @ tablepress
1382
+ #: views/view-edit.php:400 views/view-edit.php:406 views/view-list.php:431
1383
+ msgid "Delete"
1384
+ msgstr "Löschen"
1385
+
1386
+ # @ tablepress
1387
+ #: views/view-edit.php:411
1388
+ msgid "Add %s row(s)"
1389
+ msgstr "%s Zeile(n) hinzufügen"
1390
+
1391
+ # @ tablepress
1392
+ #: views/view-edit.php:411 views/view-edit.php:414
1393
+ msgid "Add"
1394
+ msgstr "Hinzufügen"
1395
+
1396
+ # @ tablepress
1397
+ #: views/view-edit.php:414
1398
+ msgid "Add %s column(s)"
1399
+ msgstr "%s Spalte(n) hinzufügen"
1400
+
1401
+ # @ tablepress
1402
+ #: views/view-edit.php:418
1403
+ msgid ""
1404
+ "To use the Table Manipulation features, JavaScript needs to be enabled in "
1405
+ "your browser."
1406
+ msgstr ""
1407
+ "Um die Bearbeitungsfunktionen zu nutzen, muss JavaScript in deinem Browser "
1408
+ "aktiviert sein."
1409
+
1410
+ # @ tablepress
1411
+ #: views/view-edit.php:462
1412
+ msgid "Other Actions"
1413
+ msgstr "Andere Aktionen"
1414
+
1415
+ # @ tablepress
1416
+ #: views/view-edit.php:464
1417
+ msgid "Copy Table"
1418
+ msgstr "Tabelle kopieren"
1419
+
1420
+ # @ tablepress
1421
+ #: views/view-edit.php:467
1422
+ msgid "Export Table"
1423
+ msgstr "Tabelle exportieren"
1424
+
1425
+ # @ tablepress
1426
+ #: views/view-edit.php:470
1427
+ msgid "Delete Table"
1428
+ msgstr "Tabelle löschen"
1429
+
1430
+ # @ tablepress
1431
+ #: views/view-edit.php:498
1432
+ msgid "Cancel"
1433
+ msgstr "Abbrechen"
1434
+
1435
+ # @ tablepress
1436
+ #: views/view-edit.php:499
1437
+ msgid "OK"
1438
+ msgstr "OK"
1439
+
1440
+ # @ tablepress
1441
+ #: views/view-edit.php:523 views/view-edit.php:578
1442
+ msgid "Table Head Row"
1443
+ msgstr "Tabellen-Kopfzeile"
1444
+
1445
+ # @ tablepress
1446
+ #: views/view-edit.php:524
1447
+ msgid "The first row of the table is the table header."
1448
+ msgstr "Die erste Zeile der Tabelle ist der Tabellenkopf."
1449
+
1450
+ # @ tablepress
1451
+ #: views/view-edit.php:527
1452
+ msgid "Table Foot Row"
1453
+ msgstr "Tabellen-Fußzeile"
1454
+
1455
+ # @ tablepress
1456
+ #: views/view-edit.php:528
1457
+ msgid "The last row of the table is the table footer."
1458
+ msgstr "Die letzte Zeile der Tabelle ist der Tabellenfuß."
1459
+
1460
+ # @ tablepress
1461
+ #: views/view-edit.php:531
1462
+ msgid "Alternating Row Colors"
1463
+ msgstr "Alternierende Zeilenfarben"
1464
+
1465
+ # @ tablepress
1466
+ #: views/view-edit.php:532
1467
+ msgid "The background colors of consecutive rows shall alternate."
1468
+ msgstr ""
1469
+ "Die Hintergrundfarben aufeinanderfolgender Zeilen sollen sich abwechseln."
1470
+
1471
+ # @ tablepress
1472
+ #: views/view-edit.php:535
1473
+ msgid "Row Hover Highlighting"
1474
+ msgstr "Zeilenhervorhebung"
1475
+
1476
+ # @ tablepress
1477
+ #: views/view-edit.php:536
1478
+ msgid ""
1479
+ "Highlight a row while the mouse cursor hovers above it by changing its "
1480
+ "background color."
1481
+ msgstr ""
1482
+ "Hebe eine Zeile durch Ändern der Hintergrundfarbe hervor, wenn sich die Maus "
1483
+ "darüber befindet."
1484
+
1485
+ # @ tablepress
1486
+ #: views/view-edit.php:539
1487
+ msgid "Print Table Name"
1488
+ msgstr "Tabellen-Name"
1489
+
1490
+ # @ tablepress
1491
+ #: views/view-edit.php:542 views/view-edit.php:552
1492
+ msgid "above"
1493
+ msgstr "über"
1494
+
1495
+ # @ tablepress
1496
+ #: views/view-edit.php:543 views/view-edit.php:553
1497
+ msgid "below"
1498
+ msgstr "unter"
1499
+
1500
+ # @ tablepress
1501
+ #: views/view-edit.php:546
1502
+ msgid "Show the table name %s the table."
1503
+ msgstr "Zeige den Tabellennamen %s der Tabelle."
1504
+
1505
+ # @ tablepress
1506
+ #: views/view-edit.php:549
1507
+ msgid "Print Table Description"
1508
+ msgstr "Tabellen-Beschreibung"
1509
+
1510
+ # @ tablepress
1511
+ #: views/view-edit.php:556
1512
+ msgid "Show the table description %s the table."
1513
+ msgstr "Zeige die Tabellenbeschreibung %s der Tabelle."
1514
+
1515
+ # @ tablepress
1516
+ #: views/view-edit.php:559
1517
+ msgid "Extra CSS Classes"
1518
+ msgstr "Weitere CSS-Klassen"
1519
+
1520
+ #: views/view-edit.php:560
1521
+ msgid ""
1522
+ "This field can only contain letters, numbers, spaces, hyphens (-), and "
1523
+ "underscores (_)."
1524
+ msgstr ""
1525
+ "Dieses Feld darf nur aus Buchstaben, Zahlen, Leerzeichen, Bindestrich (-) "
1526
+ "und Unterstrich (_) bestehen."
1527
+
1528
+ # @ tablepress
1529
+ #: views/view-edit.php:560
1530
+ msgid "Additional CSS classes for styling purposes can be entered here."
1531
+ msgstr "Hier können weitere CSS-Klassen für das Styling eingegeben werden."
1532
+
1533
+ # @ tablepress
1534
+ #: views/view-edit.php:560
1535
+ msgid "This is NOT the place to enter <a href=\"%s\">Custom CSS</a> code!"
1536
+ msgstr "Dies ist nicht das Feld für <a href=\"%s\">Zusatz-CSS</a>!"
1537
+
1538
+ # @ tablepress
1539
+ #: views/view-edit.php:578
1540
+ msgid ""
1541
+ "These features and options are only available, when the &#8220;%1$s&#8221; "
1542
+ "checkbox in the &#8220;%2$s&#8221; section is checked."
1543
+ msgstr ""
1544
+ "Diese Funktionen und Einstellungen sind nur verfügbar, wenn das &#8220;"
1545
+ "%1$s&#8221;-Kästchen im Abschnitt &#8220;%2$s&#8221; aktiviert ist."
1546
+
1547
+ # @ tablepress
1548
+ #: views/view-edit.php:582
1549
+ msgid "Use DataTables"
1550
+ msgstr "DataTables nutzen"
1551
+
1552
+ # @ tablepress
1553
+ #: views/view-edit.php:583
1554
+ msgid ""
1555
+ "Use the following features of the DataTables JavaScript library with this "
1556
+ "table:"
1557
+ msgstr ""
1558
+ "Nutze die folgenden Funktionen der DataTables-JavaScript-Bibliothek für "
1559
+ "diese Tabelle:"
1560
+
1561
+ # @ tablepress
1562
+ #: views/view-edit.php:586
1563
+ msgid "Sorting"
1564
+ msgstr "Sortieren"
1565
+
1566
+ # @ tablepress
1567
+ #: views/view-edit.php:587
1568
+ msgid "Enable sorting of the table by the visitor."
1569
+ msgstr "Aktiviere das Sortieren der Tabelle durch den Seiten-Besucher."
1570
+
1571
+ # @ tablepress
1572
+ #: views/view-edit.php:590
1573
+ msgid "Search/Filtering"
1574
+ msgstr "Filtern/Suche"
1575
+
1576
+ # @ tablepress
1577
+ #: views/view-edit.php:591
1578
+ msgid ""
1579
+ "Enable the visitor to filter or search the table. Only rows with the search "
1580
+ "word in them are shown."
1581
+ msgstr ""
1582
+ "Ermögliche dem Besucher, die Tabelle zu filtern. Dabei werden nur Zeilen, "
1583
+ "die ein Suchwort enthalten, angezeigt."
1584
+
1585
+ # @ tablepress
1586
+ #: views/view-edit.php:594
1587
+ msgid "Pagination"
1588
+ msgstr "Umblättern"
1589
+
1590
+ # @ tablepress
1591
+ #: views/view-edit.php:595
1592
+ msgid ""
1593
+ "Enable pagination of the table (viewing only a certain number of rows at a "
1594
+ "time) by the visitor."
1595
+ msgstr "Ermögliche das seitenweise Blättern in der Tabelle durch den Besucher."
1596
+
1597
+ # @ tablepress
1598
+ #: views/view-edit.php:596
1599
+ msgid "Show %s rows per page."
1600
+ msgstr "Zeige %s Zeilen pro Seite."
1601
+
1602
+ # @ tablepress
1603
+ #: views/view-edit.php:599
1604
+ msgid "Pagination Length Change"
1605
+ msgstr "Anzahl Zeilen"
1606
+
1607
+ # @ tablepress
1608
+ #: views/view-edit.php:600
1609
+ msgid ""
1610
+ "Allow the visitor to change the number of rows shown when using pagination."
1611
+ msgstr ""
1612
+ "Erlaube dem Besucher, die jeweils angezeigte Anzahl Zeilen beim seitenweisen "
1613
+ "Blättern zu ändern."
1614
+
1615
+ # @ tablepress
1616
+ #: views/view-edit.php:603
1617
+ msgid "Info"
1618
+ msgstr "Info-Zeile"
1619
+
1620
+ # @ tablepress
1621
+ #: views/view-edit.php:604
1622
+ msgid ""
1623
+ "Enable the table information display, with information about the currently "
1624
+ "visible data, like the number of rows."
1625
+ msgstr ""
1626
+ "Zeige Informationen und Statistiken über die im Moment angezeigten Daten "
1627
+ "unter der Tabelle an."
1628
+
1629
+ # @ tablepress
1630
+ #: views/view-edit.php:607
1631
+ msgid "Horizontal Scrolling"
1632
+ msgstr "Horizontales Scrollen"
1633
+
1634
+ # @ tablepress
1635
+ #: views/view-edit.php:608
1636
+ msgid ""
1637
+ "Enable horizontal scrolling, to make viewing tables with many columns easier."
1638
+ msgstr ""
1639
+ "Aktiviere das horizontale Scrollen, um das Ansehen großer Tabellen einfacher "
1640
+ "zu machen."
1641
+
1642
+ # @ tablepress
1643
+ #: views/view-edit.php:614
1644
+ msgid "Custom Commands"
1645
+ msgstr "Eigene Befehle"
1646
+
1647
+ # @ tablepress
1648
+ #: views/view-edit.php:615
1649
+ msgid ""
1650
+ "Additional parameters from the <a href=\"http://www.datatables.net/"
1651
+ "\">DataTables documentation</a> to be added to the JS call."
1652
+ msgstr ""
1653
+ "Zusätzliche Parameter aus der <a href=\"http://www.datatables.net/"
1654
+ "\">DataTables-Dokumentation</a>."
1655
+
1656
+ # @ tablepress
1657
+ #: views/view-edit.php:615
1658
+ msgid "For advanced use only."
1659
+ msgstr "Für fortgeschrittene Benutzer."
1660
+
1661
+ #: views/view-edit.php:633
1662
+ msgid "Attention: Unfortunately, an error occurred."
1663
+ msgstr "Achtung: Leider ist ein Fehler aufgetreten."
1664
+
1665
+ #: views/view-edit.php:636
1666
+ msgid "The internal data of table &#8220;%1$s&#8221 (ID %2$s) is corrupted."
1667
+ msgstr ""
1668
+ "Die internen Daten der Tabelle &#8220;%1$s&#8221 (ID %2$s) sind beschädigt."
1669
+
1670
+ #: views/view-edit.php:638
1671
+ msgid "The following error was registered: <code>%s</code>."
1672
+ msgstr "Der folgende Fehler ist aufgetreten: <code>%s</code>."
1673
+
1674
+ #: views/view-edit.php:643
1675
+ msgid ""
1676
+ "Because of this error, the table can not be edited at this time, to prevent "
1677
+ "possible further data loss."
1678
+ msgstr ""
1679
+ "Aufgrund dieses Fehlers kann die Tabelle derzeit nicht bearbeitet werden, um "
1680
+ "eventuellem Datenverlust vorzubeugen."
1681
+
1682
+ # @ tablepress
1683
+ #: views/view-edit.php:645
1684
+ msgid ""
1685
+ "Please see the <a href=\"%s\">TablePress FAQ page</a> for further "
1686
+ "instructions."
1687
+ msgstr ""
1688
+ "Bitte lies die <a href=\"%s\">TablePress-FAQ</a> für weitere Informationen."
1689
+
1690
+ # @ tablepress
1691
+ #: views/view-edit.php:650
1692
+ msgid "Back to the List of Tables"
1693
+ msgstr "Zurück zur Liste der Tabellen"
1694
+
1695
+ # @ tablepress
1696
+ #: views/view-edit.php:668
1697
+ msgid ""
1698
+ "On this screen, you can edit the content and structure of the table with the "
1699
+ "ID %s."
1700
+ msgstr ""
1701
+ "Auf dieser Seite kannst du den Inhalt und die Struktur der Tabelle mit der "
1702
+ "ID %s bearbeiten."
1703
+
1704
+ # @ tablepress
1705
+ #: views/view-edit.php:669
1706
+ msgid ""
1707
+ "For example, you can insert things like text, images, or links into the "
1708
+ "table, or change the used table features. You can also insert, delete, move, "
1709
+ "hide, and swap columns and rows."
1710
+ msgstr ""
1711
+ "Zum Beispiel kannst du Text, Bilder oder Links in die Tabelle einfügen, oder "
1712
+ "die genutzten Tabellenfunktionen ändern. Außerdem können Zeilen und Spalten "
1713
+ "eingefügt, gelöscht, dupliziert, verschoben, versteckt, getauscht oder "
1714
+ "sortiert werden."
1715
+
1716
+ # @ tablepress
1717
+ #: views/view-edit.php:672
1718
+ msgid ""
1719
+ "To insert the table into a page, post, or text widget, copy the Shortcode %s "
1720
+ "and paste it at the desired place in the editor."
1721
+ msgstr ""
1722
+ "Um die Tabelle in eine Seite, einen Beitrag oder ein Text-Widget einzufügen, "
1723
+ "kopiere den Shortcode %s und füge ihn an der entsprechenden Stelle im "
1724
+ "Texteditor ein."
1725
+
1726
+ # @ tablepress
1727
+ #: views/view-edit.php:683
1728
+ msgid "TablePress Feature: Moving rows and columns"
1729
+ msgstr "TablePress-Funktion: Zeilen und Spalten verschieben"
1730
+
1731
+ #: views/view-edit.php:684
1732
+ msgid ""
1733
+ "Did you know? You can drag and drop rows and columns via the row number and "
1734
+ "the column title. And the arrows next to the column title can be used for "
1735
+ "sorting."
1736
+ msgstr ""
1737
+ "Wusstest du schon? Du kannst Zeilen und Spalten durch Ziehen und Ablegen "
1738
+ "verschieben, indem du auf die Zeilennummer oder den Spaltennamen klickst. "
1739
+ "Und mit den Pfeilen neben dem Namen kannst du eine Spalte sortieren."
1740
+
1741
+ # @ tablepress
1742
+ #: views/view-editor_button_thickbox.php:68
1743
+ #: views/view-editor_button_thickbox.php:171
1744
+ msgid "List of Tables"
1745
+ msgstr "Liste der Tabellen"
1746
+
1747
+ # @ tablepress
1748
+ #: views/view-editor_button_thickbox.php:174
1749
+ msgid "This is a list of all available tables."
1750
+ msgstr "Dies ist eine Liste aller Tabellen."
1751
+
1752
+ # @ tablepress
1753
+ #: views/view-editor_button_thickbox.php:174
1754
+ msgid "You may insert a table into a post or page here."
1755
+ msgstr "Hier kannst du eine Tabelle in einen Beitrag oder eine Seite einfügen."
1756
+
1757
+ # @ tablepress
1758
+ #: views/view-editor_button_thickbox.php:176
1759
+ msgid ""
1760
+ "Click the &#8220;%1$s&#8221; button for the desired table to automatically "
1761
+ "insert the<br />corresponding Shortcode (%2$s) into the editor."
1762
+ msgstr ""
1763
+ "Klicke auf die &#8220;%1$s&#8221;-Schaltfläche hinter der gewünschten "
1764
+ "Tabelle,<br />um den zugehörigen Shortcode (%2$s) in den Editor einzufügen."
1765
+
1766
+ # @ tablepress
1767
+ #: views/view-editor_button_thickbox.php:176
1768
+ #: views/view-editor_button_thickbox.php:356
1769
+ msgid "Insert Shortcode"
1770
+ msgstr "Shortcode einfügen"
1771
+
1772
+ # @ tablepress
1773
+ #: views/view-editor_button_thickbox.php:180 views/view-list.php:205
1774
+ msgid "Search results for &#8220;%s&#8221;"
1775
+ msgstr "Such-Ergebnisse für &#8220;%s&#8221;"
1776
+
1777
+ # @ tablepress
1778
+ #: views/view-editor_button_thickbox.php:186 views/view-list.php:213
1779
+ msgid "Search Tables"
1780
+ msgstr "Tabellen durchsuchen"
1781
+
1782
+ # @ tablepress
1783
+ #: views/view-editor_button_thickbox.php:274 views/view-list.php:320
1784
+ msgid "ID"
1785
+ msgstr "ID"
1786
+
1787
+ # @ tablepress
1788
+ #: views/view-editor_button_thickbox.php:277
1789
+ msgid "Action"
1790
+ msgstr "Aktion"
1791
+
1792
+ # @ tablepress
1793
+ #: views/view-editor_button_thickbox.php:342 views/view-list.php:450
1794
+ msgid "(no description)"
1795
+ msgstr "(keine Beschreibung)"
1796
+
1797
+ # @ tablepress
1798
+ #: views/view-editor_button_thickbox.php:365 views/view-export.php:88
1799
+ #: views/view-list.php:568
1800
+ msgid "No tables found."
1801
+ msgstr "Keine Tabellen gefundenl"
1802
+
1803
+ # @ tablepress
1804
+ #: views/view-editor_button_thickbox.php:367
1805
+ msgid ""
1806
+ "You should add or import a table on the TablePress screens to get started!"
1807
+ msgstr ""
1808
+ "Du solltest zunächst eine Tabelle in TablePress hinzufügen oder importieren!"
1809
+
1810
+ # @ tablepress
1811
+ #: views/view-export.php:35
1812
+ msgid "Error: The export failed."
1813
+ msgstr "Fehler: Der Export ist fehlgeschlagen."
1814
+
1815
+ # @ tablepress
1816
+ #: views/view-export.php:36 views/view-list.php:106
1817
+ msgid "Error: This table could not be loaded!"
1818
+ msgstr "Fehler: Diese Tabelle konnte nicht geladen werden."
1819
+
1820
+ # @ tablepress
1821
+ #: views/view-export.php:37
1822
+ msgid "Error: The internal data of this table is corrupted!"
1823
+ msgstr "Fehler: Die internen Daten der Tabelle sind beschädigt!"
1824
+
1825
+ # @ tablepress
1826
+ #: views/view-export.php:38
1827
+ msgid "Error: The ZIP file could not be created."
1828
+ msgstr "Fehler: Die ZIP-Datei konnte nicht erstellt werden."
1829
+
1830
+ # @ tablepress
1831
+ #: views/view-export.php:43 views/view-export.php:46
1832
+ msgid "Export Tables"
1833
+ msgstr "Tabellen exportieren"
1834
+
1835
+ # @ tablepress
1836
+ #: views/view-export.php:47
1837
+ msgctxt "button"
1838
+ msgid "Download Export File"
1839
+ msgstr "Export-Datei herunterladen"
1840
+
1841
+ # @ tablepress
1842
+ #: views/view-export.php:63
1843
+ msgid ""
1844
+ "Exporting a table allows you to use it in other programs, like spreadsheets "
1845
+ "applications."
1846
+ msgstr ""
1847
+ "Der Export von Tabellen ermöglicht deren Nutzung in anderen Programmen, etwa "
1848
+ "einer Tabellenkalkulation."
1849
+
1850
+ # @ tablepress
1851
+ #: views/view-export.php:64
1852
+ msgid ""
1853
+ "Regularly exporting tables is also recommended as a backup of your data."
1854
+ msgstr ""
1855
+ "Es wird empfohlen, Tabellen regelmäßig als Datensicherung zu exportieren."
1856
+
1857
+ # @ tablepress
1858
+ #: views/view-export.php:67
1859
+ msgid "To export, select the tables and the desired export format."
1860
+ msgstr ""
1861
+ "Um Tabellen zu exportieren, markiere diese und wähle das gewünschte "
1862
+ "Exportformat."
1863
+
1864
+ # @ tablepress
1865
+ #: views/view-export.php:68
1866
+ msgid ""
1867
+ "If you choose more than one table, the exported files will automatically be "
1868
+ "stored in a ZIP archive file."
1869
+ msgstr ""
1870
+ "Wenn du mehr als eine Tabelle auswählst, werden die Tabellen automatisch in "
1871
+ "eine ZIP-Datei gepackt."
1872
+
1873
+ # @ tablepress
1874
+ #: views/view-export.php:70
1875
+ msgid ""
1876
+ "Be aware that for the CSV and HTML formats only the table data, but no table "
1877
+ "options are exported!"
1878
+ msgstr ""
1879
+ "Beachte, dass Exporte in das CSV- und HTML-Format nur die Daten der Tabelle "
1880
+ "beinhalten, nicht aber deren Einstellungen."
1881
+
1882
+ # @ tablepress
1883
+ #: views/view-export.php:71
1884
+ msgid "For the JSON format, the table data and the table options are exported."
1885
+ msgstr ""
1886
+ "Beim Export in das JSON-Format werden sowohl Daten als auch Einstellungen "
1887
+ "exportiert."
1888
+
1889
+ # @ tablepress
1890
+ #: views/view-export.php:89 views/view-list.php:577
1891
+ msgid ""
1892
+ "You should <a href=\"%s\">add</a> or <a href=\"%s\">import</a> a table to "
1893
+ "get started!"
1894
+ msgstr ""
1895
+ "Du solltest eine Tabelle <a href=\"%s\">neu hinzufügen</a> oder <a href=\"%s"
1896
+ "\">importieren</a>!"
1897
+
1898
+ # @ tablepress
1899
+ #: views/view-export.php:107
1900
+ msgid "Tables to Export"
1901
+ msgstr "Zu exportierende Tabellen"
1902
+
1903
+ # @ tablepress
1904
+ #: views/view-export.php:110
1905
+ msgid "Select all"
1906
+ msgstr "Alle auswählen"
1907
+
1908
+ # @ tablepress
1909
+ #: views/view-export.php:133 views/view-import.php:213
1910
+ msgid "ID %1$s: %2$s"
1911
+ msgstr "ID %1$s: %2$s"
1912
+
1913
+ # @ tablepress
1914
+ #: views/view-export.php:141
1915
+ msgid ""
1916
+ "You can select multiple tables by holding down the &#8220;Ctrl&#8221; key "
1917
+ "(Windows) or the &#8220;Command&#8221; key (Mac)."
1918
+ msgstr ""
1919
+ "Du kannst mehrere Tabellen wählen, indem du die &#8220;Strg&#8221;- "
1920
+ "(Windows) oder die &#8220;Cmd&#8221;-Taste (Mac) gedrückt hältst."
1921
+
1922
+ # @ tablepress
1923
+ #: views/view-export.php:147
1924
+ msgid "Export Format"
1925
+ msgstr "Export-Format"
1926
+
1927
+ # @ tablepress
1928
+ #: views/view-export.php:160
1929
+ msgid "CSV Delimiter"
1930
+ msgstr "CSV-Trennzeichen"
1931
+
1932
+ # @ tablepress
1933
+ #: views/view-export.php:169
1934
+ msgid "(Only needed for CSV export.)"
1935
+ msgstr "(Nur für CSV-Export benötigt.)"
1936
+
1937
+ # @ tablepress
1938
+ #: views/view-export.php:173
1939
+ msgid "ZIP file"
1940
+ msgstr "ZIP-Datei"
1941
+
1942
+ # @ tablepress
1943
+ #: views/view-export.php:179
1944
+ msgid "Create a ZIP archive."
1945
+ msgstr "Erstelle ein ZIP-Archiv."
1946
+
1947
+ # @ tablepress
1948
+ #: views/view-export.php:179
1949
+ msgid "(Mandatory if more than one table is selected.)"
1950
+ msgstr "(Zwingend erforderlich, wenn mehr als eine Tabelle ausgewäht wurde.)"
1951
+
1952
+ # @ tablepress
1953
+ #: views/view-export.php:182
1954
+ msgid ""
1955
+ "Note: Support for ZIP file creation seems not to be available on this server."
1956
+ msgstr ""
1957
+ "Hinweis: Die Funktion zur Erstellung von ZIP-Dateien ist auf dem Server "
1958
+ "nicht verfügbar."
1959
+
1960
+ # @ tablepress
1961
+ #: views/view-import.php:44 views/view-import.php:56
1962
+ msgid "Error: You did not select what to import from WP-Table Reloaded!"
1963
+ msgstr ""
1964
+ "Fehler: Du hast nicht ausgewählt, was du aus WP-Table Reloaded importieren "
1965
+ "möchtest!"
1966
+
1967
+ # @ tablepress
1968
+ #: views/view-import.php:49
1969
+ msgid "Error: The import failed."
1970
+ msgstr "Fehler: Der Import ist fehlgeschlagen."
1971
+
1972
+ # @ tablepress
1973
+ #: views/view-import.php:50
1974
+ msgid "Error: Import of ZIP files is not available on this server."
1975
+ msgstr ""
1976
+ "Fehler: Die Funktion zum Lesen von ZIP-Dateien ist auf dem Server nicht "
1977
+ "verfügbar."
1978
+
1979
+ # @ tablepress
1980
+ #: views/view-import.php:51
1981
+ msgid "Error: The ZIP file could not be opened."
1982
+ msgstr "Fehler: Die ZIP-Datei konnte nicht geöffnet werden."
1983
+
1984
+ # @ tablepress
1985
+ #: views/view-import.php:52
1986
+ msgid "Error: The data in the ZIP file is invalid."
1987
+ msgstr "Fehler: DIe Daten in der ZIP-Datei sind ungültig."
1988
+
1989
+ # @ tablepress
1990
+ #: views/view-import.php:53
1991
+ msgid ""
1992
+ "Error: You selected to replace or append to an existing table, but did not "
1993
+ "select a table."
1994
+ msgstr ""
1995
+ "Fehler: Du willst eine Tabelle ersetzen oder Daten anfügen, hast aber keine "
1996
+ "Tabelle dafür angegeben."
1997
+
1998
+ # @ tablepress
1999
+ #: views/view-import.php:54
2000
+ msgid "Error: The source for the import is invalid or could not be accessed."
2001
+ msgstr ""
2002
+ "Fehler: Die Import-Quelle ist ungültig oder es konnte nicht auf sie "
2003
+ "zugegriffen werden."
2004
+
2005
+ # @ tablepress
2006
+ #: views/view-import.php:55
2007
+ msgid "Error: The data for the import is invalid."
2008
+ msgstr "Fehler: Die Daten für den Import sind ungültig."
2009
+
2010
+ # @ tablepress
2011
+ #: views/view-import.php:57
2012
+ msgid ""
2013
+ "Error: Existing WP-Table Reloaded tables were not found in the database."
2014
+ msgstr ""
2015
+ "Fehler: Es wurden keine Tabellen von WP-Table Reloaded in der Datenbank "
2016
+ "gefunden."
2017
+
2018
+ # @ tablepress
2019
+ #: views/view-import.php:58
2020
+ msgid "Error: The tables from WP-Table Reloaded could not be imported."
2021
+ msgstr ""
2022
+ "Fehler: Die Tabellen aus WP-Table Reloaded konnten nicht importiert werden."
2023
+
2024
+ # @ tablepress
2025
+ #: views/view-import.php:59
2026
+ msgid "Error: The WP-Table Reloaded Dump File could not be imported!"
2027
+ msgstr ""
2028
+ "Fehler: Die WP-Table Reloaded Dump-Datei konnte nicht importiert werden!"
2029
+
2030
+ # @ tablepress
2031
+ #: views/view-import.php:63
2032
+ msgid "Import Tables"
2033
+ msgstr "Tabellen importieren"
2034
+
2035
+ # @ tablepress
2036
+ #: views/view-import.php:65
2037
+ msgid "Import from WP-Table Reloaded"
2038
+ msgstr "Import aus WP-Table Reloaded"
2039
+
2040
+ # @ tablepress
2041
+ #: views/view-import.php:97
2042
+ msgid ""
2043
+ "TablePress can import tables from existing data, like from a CSV, XLS, or "
2044
+ "XLSX file from a spreadsheet application (e.g. Excel), an HTML file "
2045
+ "resembling a webpage, or its own JSON format."
2046
+ msgstr ""
2047
+ "TablePress kann Tabellen aus bestehenden Daten importieren, etwa aus einer "
2048
+ "CSV-, XLS- oder XLSX-Datei aus einem Tabellenkalkulationsprogramm (wie "
2049
+ "Excel), einer HTML-Datei einer Webseite, oder seines eigenen JSON-"
2050
+ "Dateiformats."
2051
+
2052
+ # @ tablepress
2053
+ #: views/view-import.php:98
2054
+ msgid ""
2055
+ "You can also import existing tables from the WP-Table Reloaded plugin below."
2056
+ msgstr ""
2057
+ "Ebenso können bestehende Tabellen aus dem Plugin WP-Table Reloaded "
2058
+ "importiert werden."
2059
+
2060
+ # @ tablepress
2061
+ #: views/view-import.php:102
2062
+ msgid ""
2063
+ "To import a table, select and enter the import source in the following form."
2064
+ msgstr ""
2065
+ "Um eine Tabelle zu importieren, wähle die gewünschte Quelle im folgenden "
2066
+ "Formular aus."
2067
+
2068
+ # @ tablepress
2069
+ #: views/view-import.php:105
2070
+ msgid ""
2071
+ "You can also choose to import it as a new table, to replace an existing "
2072
+ "table, or to append the rows to an existing table."
2073
+ msgstr ""
2074
+ "Du kannst auch festlegen, ob die Tabelle als neue Tabelle hinzugefügt, eine "
2075
+ "bestehende Tabelle ersetzt, oder die Tabelle an eine bestehende Tabelle "
2076
+ "angefügt werden soll."
2077
+
2078
+ # @ tablepress
2079
+ #: views/view-import.php:126 views/view-import.php:251
2080
+ msgid "Import Source"
2081
+ msgstr "Import-Quelle"
2082
+
2083
+ # @ tablepress
2084
+ #: views/view-import.php:128
2085
+ msgid "File Upload"
2086
+ msgstr "Hochladen einer Datei"
2087
+
2088
+ # @ tablepress
2089
+ #: views/view-import.php:129
2090
+ msgid "URL"
2091
+ msgstr "URL"
2092
+
2093
+ # @ tablepress
2094
+ #: views/view-import.php:130
2095
+ msgid "File on server"
2096
+ msgstr "Datei auf dem Server"
2097
+
2098
+ # @ tablepress
2099
+ #: views/view-import.php:131
2100
+ msgid "Manual Input"
2101
+ msgstr "Manuelle Eingabe"
2102
+
2103
+ # @ tablepress
2104
+ #: views/view-import.php:135 views/view-import.php:258
2105
+ msgid "Select file"
2106
+ msgstr "Datei auswählen"
2107
+
2108
+ # @ tablepress
2109
+ #: views/view-import.php:140 views/view-import.php:151
2110
+ #: views/view-import.php:162
2111
+ msgid "You can import multiple tables by placing them in a ZIP file."
2112
+ msgstr ""
2113
+ "Du kannst mehrere Tabellen auf einmal importieren, wenn du diese in ein ZIP-"
2114
+ "Archiv packst."
2115
+
2116
+ # @ tablepress
2117
+ #: views/view-import.php:146
2118
+ msgid "File URL"
2119
+ msgstr "Datei-URL"
2120
+
2121
+ # @ tablepress
2122
+ #: views/view-import.php:157
2123
+ msgid "Server Path to file"
2124
+ msgstr "Serverpfad der Datei"
2125
+
2126
+ # @ tablepress
2127
+ #: views/view-import.php:168
2128
+ msgid "Import data"
2129
+ msgstr "zu importierende Daten"
2130
+
2131
+ # @ tablepress
2132
+ #: views/view-import.php:174
2133
+ msgid "Import Format"
2134
+ msgstr "Import-Format"
2135
+
2136
+ # @ tablepress
2137
+ #: views/view-import.php:186
2138
+ msgid "Import of HTML files is not available on your server."
2139
+ msgstr ""
2140
+ "Die Funktion zum Lesen von HTML-Dateien ist auf dem Server nicht verfügbar."
2141
+
2142
+ # @ tablepress
2143
+ #: views/view-import.php:192
2144
+ msgid "Add, Replace, or Append?"
2145
+ msgstr "Hinzufügen, Anhängen oder Ersetzen?"
2146
+
2147
+ # @ tablepress
2148
+ #: views/view-import.php:194
2149
+ msgid "Add as new table"
2150
+ msgstr "Als neue Tabelle hinzufügen"
2151
+
2152
+ # @ tablepress
2153
+ #: views/view-import.php:195
2154
+ msgid "Replace existing table"
2155
+ msgstr "Existierende Tabelle ersetzen"
2156
+
2157
+ # @ tablepress
2158
+ #: views/view-import.php:196
2159
+ msgid "Append rows to existing table"
2160
+ msgstr "Zeilen an bestehende Tabelle anfügen"
2161
+
2162
+ # @ tablepress
2163
+ #: views/view-import.php:200
2164
+ msgid "Table to replace or append to"
2165
+ msgstr "zu ersetzende bzw. zu erweiternde Tabelle"
2166
+
2167
+ # @ tablepress
2168
+ #: views/view-import.php:203
2169
+ msgid "&mdash; Select &mdash;"
2170
+ msgstr "&mdash; Auswahl &mdash;"
2171
+
2172
+ # @ tablepress
2173
+ #: views/view-import.php:223
2174
+ msgctxt "button"
2175
+ msgid "Import"
2176
+ msgstr "Import"
2177
+
2178
+ # @ tablepress
2179
+ #: views/view-import.php:241
2180
+ msgid ""
2181
+ "To import all tables from a WP-Table Reloaded installation, choose the "
2182
+ "relevant import source below."
2183
+ msgstr ""
2184
+ "Um alle Tabellen aus WP-Table Reloaded zu importieren, wähle die zutreffende "
2185
+ "Import-Quelle im folgenden Formular."
2186
+
2187
+ # @ tablepress
2188
+ #: views/view-import.php:243
2189
+ msgid ""
2190
+ "If WP-Table Reloaded is installed on this site, the &#8220;WordPress "
2191
+ "database&#8221; option is recommended."
2192
+ msgstr ""
2193
+ "Wenn WP-Table Reloaded auf dieser Seite installiert ist, wird die Wahl des "
2194
+ "Kästchens &#8220;WordPress-Datenbank&#8221; empfohlen."
2195
+
2196
+ # @ tablepress
2197
+ #: views/view-import.php:244
2198
+ msgid ""
2199
+ "If you want to import tables from another site, create a &#8220;WP-Table "
2200
+ "Reloaded Dump File&#8221; there and upload it below, after choosing &#8220;"
2201
+ "WP-Table Reloaded Dump File&#8221;."
2202
+ msgstr ""
2203
+ "Wenn du Tabellen von einer anderen Seite importieren willst, exportiere dort "
2204
+ "eine &#8220;WP-Table Reloaded Dump-Datei&#8221;, aktiviere das entsprechende "
2205
+ "Kästchen unten und lade die Datei hoch. "
2206
+
2207
+ # @ tablepress
2208
+ #: views/view-import.php:246
2209
+ msgid ""
2210
+ "Before doing this, it is highly recommended to read the <a href=\"%s"
2211
+ "\">migration guide</a> on the TablePress website."
2212
+ msgstr ""
2213
+ "Es wird dringend empfohlen, vorher den <a href=\"%s\">Wechselratgeber</a> "
2214
+ "auf der TablePress-Webseite zu lesen."
2215
+
2216
+ # @ tablepress
2217
+ #: views/view-import.php:253
2218
+ msgid "WordPress database"
2219
+ msgstr "WordPress-Datenbank"
2220
+
2221
+ # @ tablepress
2222
+ #: views/view-import.php:254
2223
+ msgid "WP-Table Reloaded Dump File"
2224
+ msgstr "WP-Table Reloaded Dump-Datei"
2225
+
2226
+ # @ tablepress
2227
+ #: views/view-import.php:268
2228
+ msgid "Import tables"
2229
+ msgstr "Tabellen importieren"
2230
+
2231
+ # @ tablepress
2232
+ #: views/view-import.php:269
2233
+ msgid "Import all tables and their settings from WP-Table Reloaded."
2234
+ msgstr "Importiere alle Tabellen und ihre Einstellungen aus WP-Table Reloaded."
2235
+
2236
+ # @ tablepress
2237
+ #: views/view-import.php:269
2238
+ msgid "<span class=\"description\">(recommended)</span>"
2239
+ msgstr "<span class=\"description\">(empfohlen)</span>"
2240
+
2241
+ # @ tablepress
2242
+ #: views/view-import.php:272
2243
+ msgid "Import styling"
2244
+ msgstr "Styling importieren"
2245
+
2246
+ # @ tablepress
2247
+ #: views/view-import.php:273
2248
+ msgid ""
2249
+ "Try to automatically convert the &#8220;Custom CSS&#8221; code from the "
2250
+ "&#8220;Plugin Options&#8221; screen of WP-Table Reloaded."
2251
+ msgstr ""
2252
+ "Versuche, den &#8220;Zusatz-CSS&#8221;-Code aus WP-Table Reloaded "
2253
+ "automatisch zu konvertieren."
2254
+
2255
+ # @ tablepress
2256
+ #: views/view-import.php:277
2257
+ msgctxt "button"
2258
+ msgid "Import from WP-Table Reloaded"
2259
+ msgstr "Import aus WP-Table Reloaded"
2260
+
2261
+ # @ tablepress
2262
+ #: views/view-import.php:294
2263
+ msgid "TablePress Feature: Import from WP-Table Reloaded"
2264
+ msgstr "TablePress-Funktion: Import aus WP-Table Reloaded"
2265
+
2266
+ # @ tablepress
2267
+ #: views/view-import.php:295
2268
+ msgid ""
2269
+ "You can import your existing tables and &#8220;Custom CSS&#8221; from WP-"
2270
+ "Table Reloaded into TablePress."
2271
+ msgstr ""
2272
+ "Du kannst deine bestehenden Tabellen und dein &#8220;Zusatz-CSS&#8221; aus "
2273
+ "WP-Table Reloaded in TablePress importieren."
2274
+
2275
+ # @ tablepress
2276
+ #: views/view-list.php:45
2277
+ msgid "To embed this table into a post or page, use this Shortcode:"
2278
+ msgstr ""
2279
+ "Um diese Tabelle in einen Beitrag oder eine Seite einzubinden, nutze diesen "
2280
+ "Shortcode:"
2281
+
2282
+ # @ tablepress
2283
+ #: views/view-list.php:46
2284
+ msgid ""
2285
+ "Thank you very much! Your donation is highly appreciated. You just "
2286
+ "contributed to the further development of TablePress!"
2287
+ msgstr ""
2288
+ "Vielen, vielen Dank! Ich bin sehr dankbar für deine Spende. Du trägst damit "
2289
+ "sehr zur Weiterentwicklung von TablePress bei!"
2290
+
2291
+ # @ tablepress
2292
+ #: views/view-list.php:47
2293
+ msgid ""
2294
+ "No problem! I still hope you enjoy the benefits that TablePress adds to your "
2295
+ "site. If you should change your mind, you&#8217;ll always find the &#8220;"
2296
+ "Donate&#8221; button on the <a href=\"%s\">TablePress website</a>."
2297
+ msgstr ""
2298
+ "Kein Problem! Ich hoffe dennoch, dass TablePress für deine Seite nützlich "
2299
+ "ist. Falls du deine Meinung später ändern solltest, findet du den &#8220;"
2300
+ "Spenden&#8221;-Knopf auf der <a href=\"%s\">TablePress-Webseite</a>."
2301
+
2302
+ # @ tablepress
2303
+ #: views/view-list.php:53
2304
+ msgid "Welcome!"
2305
+ msgstr "Hallo!"
2306
+
2307
+ # @ tablepress
2308
+ #: views/view-list.php:54
2309
+ msgid "Thank you for using TablePress for the first time!"
2310
+ msgstr "Danke, dass du TablePress benutzt!"
2311
+
2312
+ # @ tablepress
2313
+ #: views/view-list.php:55
2314
+ msgid ""
2315
+ "If you encounter any questions or problems, please visit the <a href=\"%1$s"
2316
+ "\">FAQ</a>, the <a href=\"%2$s\">documentation</a>, and the <a href=\"%3$s"
2317
+ "\">Support</a> section on the <a href=\"%4$s\">plugin website</a>."
2318
+ msgstr ""
2319
+ "Falls du Fragen oder Probleme hast, schaue bitte in die <a href=\"%1$s"
2320
+ "\">FAQ</a>, die <a href=\"%2$s\">Dokumentation</a> und die <a href=\"%3$s"
2321
+ "\">Support</a>-Seite auf der <a href=\"%4$s\">Plugin-Webseite</a>."
2322
+
2323
+ # @ tablepress
2324
+ #: views/view-list.php:56 views/view-list.php:93
2325
+ msgid "Hide this message"
2326
+ msgstr "Meldung ausblenden"
2327
+
2328
+ # @ tablepress
2329
+ #: views/view-list.php:63
2330
+ msgid "Attention!"
2331
+ msgstr "Achtung!"
2332
+
2333
+ # @ tablepress
2334
+ #: views/view-list.php:64
2335
+ msgid ""
2336
+ "You have activated the plugin WP-Table Reloaded, which can not be used "
2337
+ "together with TablePress."
2338
+ msgstr ""
2339
+ "Das Plugin WP-Table Reloaded, dass nicht zusammen mit TablePress genutzt "
2340
+ "werden kann, ist aktiviert."
2341
+
2342
+ # @ tablepress
2343
+ #: views/view-list.php:65
2344
+ msgid ""
2345
+ "It is strongly recommended that you switch from WP-Table Reloaded to "
2346
+ "TablePress, which not only fixes many problems, but also has more and better "
2347
+ "features than WP-Table Reloaded."
2348
+ msgstr ""
2349
+ "Es wird dringend empfohlen, von WP-Table Reloaded zu TablePress zu wechseln, "
2350
+ "das nicht nur viele Probleme in WP-Table Reloaded löst, sondern auch neue "
2351
+ "und bessere Funktionen mitbringt."
2352
+
2353
+ # @ tablepress
2354
+ #: views/view-list.php:66
2355
+ msgid ""
2356
+ "Please follow the <a href=\"%s\">migration guide</a> to move your tables and "
2357
+ "then deactivate WP-Table Reloaded!"
2358
+ msgstr ""
2359
+ "Bitte folge den Hinweisen im <a href=\"%s\">Wechselratgeber</a>, um deine "
2360
+ "Tabellen zu importieren, und deaktiviere danach WP-Table Reloaded."
2361
+
2362
+ # @ tablepress
2363
+ #: views/view-list.php:67
2364
+ msgid "Import your tables from WP-Table Reloaded"
2365
+ msgstr "Importiere deine Tabellen aus WP-Table Reloaded"
2366
+
2367
+ # @ tablepress
2368
+ #: views/view-list.php:74
2369
+ msgid "Tobias Bäthge, developer of TablePress"
2370
+ msgstr "Tobias Bäthge, Entwickler von TablePress"
2371
+
2372
+ # @ tablepress
2373
+ #: views/view-list.php:75
2374
+ msgid ""
2375
+ "Hi, my name is Tobias, I&#8217;m the developer of the TablePress plugin."
2376
+ msgstr ""
2377
+ "Hallo, ich bin Tobias, der Entwickler des Plugins &#8220;TablePress&#8221;."
2378
+
2379
+ # @ tablepress
2380
+ #: views/view-list.php:76
2381
+ msgid ""
2382
+ "Thanks for using it! You&#8217;ve installed TablePress over a month ago."
2383
+ msgstr ""
2384
+ "Danke, dass du es benutzt! Du hast TablePress vor über einem Monat "
2385
+ "installiert."
2386
+
2387
+ # @ tablepress
2388
+ #: views/view-list.php:77
2389
+ msgid ""
2390
+ "If everything works and you are satisfied with the results of managing your "
2391
+ "%s table, isn&#8217;t that worth a coffee or two?"
2392
+ msgid_plural ""
2393
+ "If everything works and you are satisfied with the results of managing your "
2394
+ "%s tables, isn&#8217;t that worth a coffee or two?"
2395
+ msgstr[0] ""
2396
+ "Wenn alles funktioniert, und du mit deiner Tabelle zufrieden bist, ist dir "
2397
+ "das nicht einen Kaffee oder zwei wert?"
2398
+ msgstr[1] ""
2399
+ "Wenn alles funktioniert, und du mit deinen %s Tabellen zufrieden bist, ist "
2400
+ "dir das nicht einen Kaffee oder zwei wert?"
2401
+
2402
+ # @ tablepress
2403
+ #: views/view-list.php:78
2404
+ msgid ""
2405
+ "<a href=\"%s\">Donations</a> help me to continue user support and "
2406
+ "development of this <em>free</em> software &mdash; things for which I spend "
2407
+ "countless hours of my free time! Thank you very much!"
2408
+ msgstr ""
2409
+ "<a href=\"%s\">Spenden</a> helfen mir, dieses <em>kostenlose</em> Plugin "
2410
+ "weiterzuentwickeln und zu unterstützen &mdash; Dinge, für die ich unzählige "
2411
+ "Stunden meiner Freizeit opfere! Vielen, vielen Dank!"
2412
+
2413
+ # @ tablepress
2414
+ #: views/view-list.php:79
2415
+ msgid "Sincerly, Tobias"
2416
+ msgstr "Mit besten Grüßen, Tobias"
2417
+
2418
+ # @ tablepress
2419
+ #: views/view-list.php:80
2420
+ msgid "Sure, I&#8217;ll buy you a coffee and support TablePress!"
2421
+ msgstr "Na klar, ich gebe dir einen Kaffee aus und unterstütze TablePress!"
2422
+
2423
+ # @ tablepress
2424
+ #: views/view-list.php:81
2425
+ msgid "I already donated."
2426
+ msgstr "Ich habe schon gespendet."
2427
+
2428
+ # @ tablepress
2429
+ #: views/view-list.php:82
2430
+ msgid "No, thanks. Don&#8217;t ask again."
2431
+ msgstr "Nein, danke. Frag nicht wieder."
2432
+
2433
+ # @ tablepress
2434
+ #: views/view-list.php:89
2435
+ msgid "Thank you for updating to TablePress %s!"
2436
+ msgstr "Danke, dass du TablePress auf Version %s aktualisiert hast!"
2437
+
2438
+ # @ tablepress
2439
+ #: views/view-list.php:90
2440
+ msgid ""
2441
+ "Please read the <a href=\"%s\">release announcement</a> for more information."
2442
+ msgstr ""
2443
+ "Für weitere Informationen, lies bitte die <a href=\"%s\">Release-"
2444
+ "Ankündigung</a>."
2445
+
2446
+ # @ tablepress
2447
+ #: views/view-list.php:91
2448
+ msgid ""
2449
+ "If you like the new features and enhancements, <a href=\"%s\">giving a "
2450
+ "donation</a> towards the further support and development of TablePress is "
2451
+ "recommended. Thank you!"
2452
+ msgstr ""
2453
+ "Wenn dir die neuen Funktionen und Verbesserungen gefallen, wird empfohlen, "
2454
+ "die weitere Entwicklung und Unterstützung von TablePress mit einer <a href="
2455
+ "\"%s\">Spende</a> zu unterstützen. Dankeschön!"
2456
+
2457
+ # @ tablepress
2458
+ #: views/view-list.php:98 views/view-list.php:99
2459
+ msgid "The table was deleted successfully."
2460
+ msgid_plural "The tables were deleted successfully."
2461
+ msgstr[0] "Die Tabelle wurde erfolgreich gelöscht."
2462
+ msgstr[1] "Die Tabellen wurden erfolgreich gelöscht."
2463
+
2464
+ #: views/view-list.php:102
2465
+ msgid "The copied table has the table ID &#8220;%s&#8221;."
2466
+ msgstr "Die kopierte Tabelle hat die ID &#8220;%s&#8221;."
2467
+
2468
+ # @ tablepress
2469
+ #: views/view-list.php:104
2470
+ msgid "Error: The table could not be copied."
2471
+ msgstr "Fehler: Die Tabelle konnte nicht kopiert werden."
2472
+
2473
+ # @ tablepress
2474
+ #: views/view-list.php:105
2475
+ msgid "Error: You did not specify a valid table ID."
2476
+ msgstr "Fehler: Du hast keine gültige Tabellen-ID angegeben."
2477
+
2478
+ # @ tablepress
2479
+ #: views/view-list.php:107
2480
+ msgid "Error: This bulk action is invalid!"
2481
+ msgstr "Fehler: Diese Aktion ist ungültig!"
2482
+
2483
+ # @ tablepress
2484
+ #: views/view-list.php:108
2485
+ msgid "Error: You did not select any tables!"
2486
+ msgstr "Fehler: Du hast keine Tabellen ausgewählt!"
2487
+
2488
+ # @ tablepress
2489
+ #: views/view-list.php:109
2490
+ msgid "Notice: Not all selected tables could be deleted!"
2491
+ msgstr "Hinweis: Nicht alle ausgewählten Tabellen konnten gelöscht werden!"
2492
+
2493
+ # @ tablepress
2494
+ #: views/view-list.php:110
2495
+ msgid "Notice: Not all selected tables could be copied!"
2496
+ msgstr "Hinweis: Nicht alle ausgewählten Tabellen konnten kopiert werden!"
2497
+
2498
+ # @ tablepress
2499
+ #: views/view-list.php:111
2500
+ msgid "The tables were imported successfully."
2501
+ msgstr "Die Tabellen wurden erfolgreich importiert."
2502
+
2503
+ # @ tablepress
2504
+ #: views/view-list.php:112
2505
+ msgid "The tables were imported successfully from WP-Table Reloaded."
2506
+ msgstr "Die Tabellen aus WP-Table Reloaded wurden erfolgreich importiert."
2507
+
2508
+ # @ tablepress
2509
+ #: views/view-list.php:118
2510
+ msgid "Tables"
2511
+ msgstr "Tabellen"
2512
+
2513
+ # @ tablepress
2514
+ #: views/view-list.php:184
2515
+ msgid "This is a list of your tables."
2516
+ msgstr "Dies ist eine Liste deiner Tabellen."
2517
+
2518
+ # @ tablepress
2519
+ #: views/view-list.php:185
2520
+ msgid ""
2521
+ "Click the corresponding links within the list to edit, copy, delete, or "
2522
+ "preview a table."
2523
+ msgstr ""
2524
+ "Klicke die entsprechenden Links in der Liste, um eine Tabelle zu bearbeiten, "
2525
+ "zu kopieren, zu löschen oder die Vorschau zu sehen."
2526
+
2527
+ # @ tablepress
2528
+ #: views/view-list.php:189
2529
+ msgid "Each table has a unique ID that needs to be adjusted in that Shortcode."
2530
+ msgstr ""
2531
+ "Jede Tabelle hat eine eindeutige ID, die in diesem Shortcode angepasst "
2532
+ "werden muss."
2533
+
2534
+ # @ tablepress
2535
+ #: views/view-list.php:323
2536
+ msgid "Author"
2537
+ msgstr "Autor"
2538
+
2539
+ # @ tablepress
2540
+ #: views/view-list.php:324
2541
+ msgid "Last Modified By"
2542
+ msgstr "Zuletzt geändert von"
2543
+
2544
+ # @ tablepress
2545
+ #: views/view-list.php:414 views/view-list.php:421
2546
+ msgid "Edit &#8220;%s&#8221;"
2547
+ msgstr "&#8220;%s&#8221; bearbeiten"
2548
+
2549
+ # @ tablepress
2550
+ #: views/view-list.php:423
2551
+ msgid "Show Shortcode"
2552
+ msgstr "Shortcode"
2553
+
2554
+ # @ tablepress
2555
+ #: views/view-list.php:425
2556
+ msgid "Copy &#8220;%s&#8221;"
2557
+ msgstr "&#8220;%s&#8221; kopieren"
2558
+
2559
+ # @ tablepress
2560
+ #: views/view-list.php:425
2561
+ msgid "Copy"
2562
+ msgstr "Kopieren"
2563
+
2564
+ # @ tablepress
2565
+ #: views/view-list.php:428
2566
+ msgid "Export &#8220;%s&#8221;"
2567
+ msgstr "&#8220;%s&#8221; exportieren"
2568
+
2569
+ # @ tablepress
2570
+ #: views/view-list.php:428
2571
+ msgctxt "row action"
2572
+ msgid "Export"
2573
+ msgstr "Exportieren"
2574
+
2575
+ # @ tablepress
2576
+ #: views/view-list.php:431
2577
+ msgid "Delete &#8220;%s&#8221;"
2578
+ msgstr "&#8220;%s&#8221; löschen"
2579
+
2580
+ # @ tablepress
2581
+ #: views/view-list.php:434
2582
+ msgid "Show a preview of &#8220;%s&#8221;"
2583
+ msgstr "Vorschau von &#8220;%s&#8221; anzeigen"
2584
+
2585
+ # @ tablepress
2586
+ #: views/view-list.php:513
2587
+ msgctxt "bulk action"
2588
+ msgid "Copy"
2589
+ msgstr "Kopieren"
2590
+
2591
+ # @ tablepress
2592
+ #: views/view-list.php:516
2593
+ msgctxt "bulk action"
2594
+ msgid "Export"
2595
+ msgstr "Exportieren"
2596
+
2597
+ # @ tablepress
2598
+ #: views/view-list.php:519
2599
+ msgctxt "bulk action"
2600
+ msgid "Delete"
2601
+ msgstr "Löschen"
2602
+
2603
+ # @ tablepress
2604
+ #: views/view-list.php:551
2605
+ msgid "Select Bulk Action"
2606
+ msgstr "Aktion wählen"
2607
+
2608
+ # @ tablepress
2609
+ #: views/view-list.php:553
2610
+ msgid "Bulk Actions"
2611
+ msgstr "Aktion wählen"
2612
+
2613
+ #: views/view-list.php:558
2614
+ msgid "Apply"
2615
+ msgstr "Anwenden"
2616
+
2617
+ # @ tablepress
2618
+ #: views/view-list.php:579
2619
+ msgid "You should <a href=\"%s\">add</a> a table to get started!"
2620
+ msgstr ""
2621
+ "Du solltest eine <a href=\"%s\">neue Tabelle anlegen</a>, um loszulegen!"
2622
+
2623
+ # @ tablepress
2624
+ #: views/view-list.php:581
2625
+ msgid "You should <a href=\"%s\">import</a> a table to get started!"
2626
+ msgstr ""
2627
+ "Du solltest eine <a href=\"%s\">Tabelle importieren</a>, um loszulegen!"
2628
+
2629
+ # @ tablepress
2630
+ #: views/view-options.php:38
2631
+ msgid "Do you really want to uninstall TablePress and delete ALL data?"
2632
+ msgstr "Möchtest du TablePress wirklich deinstallieren und ALLE Daten löschen?"
2633
+
2634
+ #: views/view-options.php:39
2635
+ msgid "Are you really sure?"
2636
+ msgstr "Bist du wirklich sicher?"
2637
+
2638
+ # @ tablepress
2639
+ #: views/view-options.php:44
2640
+ msgid "Options saved successfully."
2641
+ msgstr "Einstellungen erfolgreich gespeichert."
2642
+
2643
+ # @ tablepress
2644
+ #: views/view-options.php:45
2645
+ msgid ""
2646
+ "Options saved successfully, but &#8220;Custom CSS&#8221; was not saved to "
2647
+ "file."
2648
+ msgstr ""
2649
+ "Die Einstellungen wurden erfolgreich gespeichert, aber das &#8220;Zusatz-"
2650
+ "CSS&#8221; wurde nicht in eine Datei gespeichert."
2651
+
2652
+ # @ tablepress
2653
+ #: views/view-options.php:46
2654
+ msgid "Error: Options could not be saved."
2655
+ msgstr "Fehler: Einstellungen konnten nicht gespeichert werden."
2656
+
2657
+ # @ tablepress
2658
+ #: views/view-options.php:47
2659
+ msgid ""
2660
+ "The WP-Table Reloaded &#8220;Custom CSS&#8221; was imported successfully."
2661
+ msgstr ""
2662
+ "Das &#8220;Zusatz-CSS&#8221; aus WP-Table Reloaded wurde erfolgreich "
2663
+ "importiert."
2664
+
2665
+ # @ tablepress
2666
+ #: views/view-options.php:52
2667
+ msgid "Frontend Options"
2668
+ msgstr "Darstellungsoptionen"
2669
+
2670
+ # @ tablepress
2671
+ #: views/view-options.php:54
2672
+ msgid "User Options"
2673
+ msgstr "Nutzer-Einstellungen"
2674
+
2675
+ # @ tablepress
2676
+ #: views/view-options.php:73
2677
+ msgid ""
2678
+ "TablePress has several options which affect the plugin&#8217;s behavior in "
2679
+ "different areas."
2680
+ msgstr ""
2681
+ "TablePress hat mehrere Einstellungen, die das Verhalten des Plugins in "
2682
+ "verschiedenen Bereichen beeinflussen."
2683
+
2684
+ # @ tablepress
2685
+ #: views/view-options.php:78
2686
+ msgid ""
2687
+ "Frontend Options influence the styling of tables in pages, posts, or text "
2688
+ "widgets, by defining which CSS code shall be loaded."
2689
+ msgstr ""
2690
+ "Die Darstellungsoptionen beeinflussen das Aussehen von Tabellen in Seiten, "
2691
+ "Beiträgen und Text-Widgets, indem festgelegt wird, welcher CSS-Code geladen "
2692
+ "werden soll."
2693
+
2694
+ # @ tablepress
2695
+ #: views/view-options.php:81
2696
+ msgid ""
2697
+ "In the User Options, every TablePress user can choose the position of the "
2698
+ "plugin in his WordPress admin menu, and his desired plugin language."
2699
+ msgstr ""
2700
+ "In den Nutzer-Einstellungen kann jeder TablePress-Nutzer die Position des "
2701
+ "Plugins im WordPress-Admin-Menü, sowie die gewünschte Plugin-Sprache "
2702
+ "festlegen."
2703
+
2704
+ # @ tablepress
2705
+ #: views/view-options.php:100
2706
+ msgid "Custom CSS"
2707
+ msgstr "Zusatz-CSS"
2708
+
2709
+ # @ tablepress
2710
+ #: views/view-options.php:101
2711
+ msgid ""
2712
+ "Load these &#8220;Custom CSS&#8221; commands to influence the table styling:"
2713
+ msgstr ""
2714
+ "Lade die folgenden &#8220;Zusatz-CSS&#8221;-Befehle, um das Aussehen von "
2715
+ "Tabellen zu beeinflussen:"
2716
+
2717
+ # @ tablepress
2718
+ #: views/view-options.php:109
2719
+ msgid ""
2720
+ "&#8220;Custom CSS&#8221; (<a href=\"%s\">Cascading Style Sheets</a>) can be "
2721
+ "used to change the styling or layout of a table."
2722
+ msgstr ""
2723
+ "&#8220;Zusatz-CSS&#8221; (<a href=\"%s\">Cascading Style Sheets</a>) kann "
2724
+ "genutzt werden, um das Aussehen einer Tabelle zu ändern."
2725
+
2726
+ # @ tablepress
2727
+ #: views/view-options.php:111
2728
+ msgid "You can get styling examples from the <a href=\"%s\">FAQ</a>."
2729
+ msgstr "Styling-Beispiele findest du in der <a href=\"%s\">FAQ</a>."
2730
+
2731
+ # @ tablepress
2732
+ #: views/view-options.php:113
2733
+ msgid ""
2734
+ "Information on available CSS selectors can be found in the <a href=\"%s"
2735
+ "\">documentation</a>."
2736
+ msgstr ""
2737
+ "Die verfügbaren CSS-Selektoren sind in der <a href=\"%s\">Dokumentation</a> "
2738
+ "beschrieben."
2739
+
2740
+ # @ tablepress
2741
+ #: views/view-options.php:115
2742
+ msgid ""
2743
+ "Please note that invalid CSS code will be stripped, if it can not be "
2744
+ "corrected automatically."
2745
+ msgstr ""
2746
+ "Bitte beachte, dass ungültiger CSS-Code entfernt wird, wenn er nicht "
2747
+ "automatisch korrigiert werden kann."
2748
+
2749
+ # @ tablepress
2750
+ #: views/view-options.php:155
2751
+ msgid "Top-Level (top)"
2752
+ msgstr "Hauptebene (oben)"
2753
+
2754
+ # @ tablepress
2755
+ #: views/view-options.php:156
2756
+ msgid "Top-Level (middle)"
2757
+ msgstr "Hauptebene (Mitte)"
2758
+
2759
+ # @ tablepress
2760
+ #: views/view-options.php:157
2761
+ msgid "Top-Level (bottom)"
2762
+ msgstr "Hauptebene (unten)"
2763
+
2764
+ # @ tablepress
2765
+ #: views/view-options.php:166
2766
+ msgid "Admin menu entry"
2767
+ msgstr "Admin-Menü-Eintrag"
2768
+
2769
+ # @ tablepress
2770
+ #: views/view-options.php:167
2771
+ msgid "TablePress shall be shown in this section of my admin menu: %s"
2772
+ msgstr ""
2773
+ "TablePress soll in diesem Abschnitt dies Admin-Menüs angezeigt werden: %s"
2774
+
2775
+ # @ tablepress
2776
+ #: views/view-options.php:171
2777
+ msgid "WordPress Default (currently %s)"
2778
+ msgstr "WordPress-Standard (aktuell %s)"
2779
+
2780
+ # @ tablepress
2781
+ #: views/view-options.php:179
2782
+ msgid "Plugin Language"
2783
+ msgstr "Plugin-Sprache"
2784
+
2785
+ # @ tablepress
2786
+ #: views/view-options.php:180
2787
+ msgid "I want to use TablePress in this language: %s"
2788
+ msgstr "Ich möchte TablePress in dieser Sprache nutzen: %s"
2789
+
2790
+ #: views/view-options.php:199
2791
+ msgid ""
2792
+ "Uninstalling <strong>will permanently delete</strong> all TablePress tables "
2793
+ "and options from the database."
2794
+ msgstr ""
2795
+ "Das Deinstallieren wird alle TablePress-Tabellen und -Einstellungen in der "
2796
+ "Datenbank <strong>dauerhaft löschen</strong>."
2797
+
2798
+ #: views/view-options.php:200
2799
+ msgid ""
2800
+ "It is recommended that you create a backup of the tables (by exporting the "
2801
+ "tables in the JSON format), in case you later change your mind."
2802
+ msgstr ""
2803
+ "Es wird empfohlen, zunächst (durch Exportieren der Tabellen in das JSON-"
2804
+ "Format) eine Sicherungskopie der Tabellen anzulegen, falls du später deine "
2805
+ "Meinung änderst."
2806
+
2807
+ #: views/view-options.php:201
2808
+ msgid ""
2809
+ "You will manually need to remove the plugin&#8217;s files from the plugin "
2810
+ "folder afterwards."
2811
+ msgstr "Du musst hinterher nur die Plugin-Dateien vom Server löschen."
2812
+
2813
+ #: views/view-options.php:202
2814
+ msgid ""
2815
+ "Be very careful with this and only click the button if you know what you are "
2816
+ "doing!"
2817
+ msgstr ""
2818
+ "Bitte sei vorsichtig und klicke diese Schaltfläche nur, wenn du weißt, was "
2819
+ "du tust!"
2820
+
2821
+ # @ tablepress
2822
+ #: views/view-options_custom_css.php:39
2823
+ msgid ""
2824
+ "Attention: Further action is required to save the changes to your &#8220;"
2825
+ "Custom CSS&#8221;!"
2826
+ msgstr ""
2827
+ "Achtung: Um den &#8220;Zusatz-CSS&#8221;-Code zu speichern, sind weitere "
2828
+ "Schritte nötig!"
2829
+
2830
+ # @ tablepress
2831
+ #: views/view-options_custom_css.php:108
2832
+ msgid ""
2833
+ "Due to the configuration of your server, TablePress was not able to "
2834
+ "automatically save your &#8220;Custom CSS&#8221; to a file."
2835
+ msgstr ""
2836
+ "Aufgrund der Server-Konfiguration konnte TablePress den &#8220;Zusatz-"
2837
+ "CSS&#8221;-Code nicht automatisch in eine Datei speichern."
2838
+
2839
+ # @ tablepress
2840
+ #: views/view-options_custom_css.php:109
2841
+ msgid ""
2842
+ "To try again with the same method that you use for updating plugins or "
2843
+ "themes, please fill out the &#8220;%s&#8221; form below."
2844
+ msgstr ""
2845
+ "Um dies nochmal mit der gleichen Methode zu probieren, die auch für Plugin- "
2846
+ "und Theme-Updates verwendet wird, fülle das folgende &#8220;%s&#8221;-"
2847
+ "Formular aus."
2848
+
2849
+ # @ default
2850
+ #: views/view-options_custom_css.php:109
2851
+ msgid "Connection Information"
2852
+ msgstr "Verbindungsinformationen"
2853
+
2854
+ # @ tablepress
2855
+ #: views/view-options_custom_css.php:136
2856
+ msgid "Proceed without saving a file"
2857
+ msgstr "Fortfahren, ohne die Datei zu speichern"
2858
+
2859
+ # @ tablepress
2860
+ #: views/view-options_custom_css.php:138
2861
+ msgid ""
2862
+ "To proceed without trying to save the &#8220;Custom CSS&#8221; to a file, "
2863
+ "click the button below."
2864
+ msgstr ""
2865
+ "Um fortzufahren, ohne den &#8220;Zusatz-CSS&#8221;-Code in einer Datei zu "
2866
+ "speichern, klicke die entsprechende Schaltfläche unten."
2867
+
2868
+ # @ tablepress
2869
+ #: views/view-options_custom_css.php:139
2870
+ msgid "Your &#8220;Custom CSS&#8221; will then be loaded inline."
2871
+ msgstr ""
2872
+ "Der &#8220;Zusatz-CSS&#8221;-Code wird dann direkt in die Seite eingebunden."
2873
+
2874
+ # @ tablepress
2875
+ #: views/view-options_custom_css.php:141
2876
+ msgid "Proceed without saving &#8220;Custom CSS&#8221; to a file"
2877
+ msgstr "Fortfahren, ohne &#8220;Zusatz-CSS&#8221; in einer Datei zu speichern"
2878
+
2879
+ #. Plugin URI of the plugin/theme
2880
+ msgid "https://tablepress.org/"
2881
+ msgstr "https://tablepress.org/"
2882
+
2883
+ #. Description of the plugin/theme
2884
+ msgid ""
2885
+ "Embed beautiful and feature-rich tables into your posts and pages, without "
2886
+ "having to write code."
2887
+ msgstr ""
2888
+ "TablePress ermöglicht das Erstellen und Verwalten von Tabellen in Artikeln "
2889
+ "und Seiten, ohne dafür HTML-Code nutzen zu müssen, und fügt für die Besucher "
2890
+ "nützliche Funktionen hinzu."
2891
+
2892
+ #. Author of the plugin/theme
2893
+ msgid "Tobias Bäthge"
2894
+ msgstr "Tobias Bäthge"
2895
+
2896
+ #. Author URI of the plugin/theme
2897
+ msgid "https://tobias.baethge.com/"
2898
+ msgstr "https://tobias.baethge.com/"
i18n/tablepress-es_ES.mo ADDED
Binary file
i18n/tablepress-es_ES.po ADDED
@@ -0,0 +1,3056 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 TablePress
2
+ # This file is distributed under the same license as the TablePress package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: TablePress v1.6.1\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/tablepress\n"
7
+ "POT-Creation-Date: \n"
8
+ "PO-Revision-Date: 2014-11-05 19:11+0100\n"
9
+ "Last-Translator: Tobias Bäthge <wordpress@tobias.baethge.com>\n"
10
+ "Language-Team: Darío Hereñú <magallania@gmail.com>\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
15
+ "X-Generator: Poedit 1.6.10\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
18
+ "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
19
+ "X-Poedit-Basepath: ../\n"
20
+ "X-Textdomain-Support: yes\n"
21
+ "Language: es_ES\n"
22
+ "X-Poedit-SearchPath-0: .\n"
23
+
24
+ # @ tablepress
25
+ #: classes/class-admin-page-helper.php:79
26
+ msgid "Thank you for using <a href=\"https://tablepress.org/\">TablePress</a>."
27
+ msgstr ""
28
+ "Gracias por utilizar <a href=\"https://tablepress.org/\">TablePress</a>."
29
+
30
+ # @ tablepress
31
+ #: classes/class-admin-page-helper.php:80
32
+ #, php-format
33
+ msgid "Support the plugin with your <a href=\"%s\">donation</a>!"
34
+ msgstr "Ayude a esta extensión con su <a href=\"%s\">donación</a> !"
35
+
36
+ # @ tablepress
37
+ #: classes/class-export.php:55 classes/class-import.php:80
38
+ msgid "CSV - Character-Separated Values"
39
+ msgstr "CSV - Character-Separated Values"
40
+
41
+ # @ tablepress
42
+ #: classes/class-export.php:56 classes/class-import.php:82
43
+ msgid "HTML - Hypertext Markup Language"
44
+ msgstr "HTML - Hypertext Markup Language"
45
+
46
+ # @ tablepress
47
+ #: classes/class-export.php:57 classes/class-import.php:84
48
+ msgid "JSON - JavaScript Object Notation"
49
+ msgstr "JSON - JavaScript Object Notation"
50
+
51
+ # @ tablepress
52
+ #: classes/class-export.php:60
53
+ msgid "; (semicolon)"
54
+ msgstr "; (punto y coma)"
55
+
56
+ # @ tablepress
57
+ #: classes/class-export.php:61
58
+ msgid ", (comma)"
59
+ msgstr ", (coma)"
60
+
61
+ # @ tablepress
62
+ #: classes/class-export.php:62
63
+ msgid "\\t (tabulator)"
64
+ msgstr "\\t (tabuladora)"
65
+
66
+ # @ tablepress
67
+ #: classes/class-import.php:189 classes/class-import.php:301
68
+ #: classes/class-import.php:407
69
+ msgid "The imported file contains errors:"
70
+ msgstr "El archivo importado contiene errores:"
71
+
72
+ # @ tablepress
73
+ #: classes/class-render.php:272
74
+ #, php-format
75
+ msgid "<!-- The table with the ID %s is empty! -->"
76
+ msgstr "<!-- La tabla con el ID %s está vacía! -->"
77
+
78
+ # @ default
79
+ # @ tablepress
80
+ #: classes/class-render.php:410 views/view-list.php:421
81
+ msgid "Edit"
82
+ msgstr "Editar"
83
+
84
+ # @ tablepress
85
+ #: classes/class-view.php:103
86
+ msgid "TablePress Help"
87
+ msgstr "Ayuda de TablePress"
88
+
89
+ # @ tablepress
90
+ #: classes/class-view.php:105
91
+ #, php-format
92
+ msgid ""
93
+ "More information about TablePress can be found on the <a href=\"%1$s"
94
+ "\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress "
95
+ "Plugin Directory</a>."
96
+ msgstr ""
97
+ "Más información acerca de TablePress puede ser encontrada en el <a href="
98
+ "\"%1$s\">sitio de esta extensión</a> o en esta página <a href=\"%s"
99
+ "\">Directorio de extensiones de WordPress</a>."
100
+
101
+ # @ tablepress
102
+ #: classes/class-view.php:107
103
+ #, php-format
104
+ msgid ""
105
+ "<a href=\"%1$s\">Support</a> is provided through the <a href=\"%2$s"
106
+ "\">WordPress Support Forums</a>."
107
+ msgstr ""
108
+ "La <a href=\"%1$s\">ayuda</a> es provista a través de los <a href=\"%2$s"
109
+ "\">foros de ayuda de WordPress</a>."
110
+
111
+ # @ tablepress
112
+ #: classes/class-view.php:108 views/view-about.php:153
113
+ #, php-format
114
+ msgid ""
115
+ "Before asking for support, please carefully read the <a href=\"%s"
116
+ "\">Frequently Asked Questions</a>, where you will find answers to the most "
117
+ "common questions, and search through the forums."
118
+ msgstr ""
119
+ "Antes de pedir ayuda, por favor, lea atentamente las <a href=\"%s"
120
+ "\">Preguntas más frecuentes</a>, donde encontrará respuestas a las preguntas "
121
+ "más usuales. Asimismo, busque e investigue en los foros. "
122
+
123
+ # @ tablepress
124
+ #: classes/class-view.php:109
125
+ #, php-format
126
+ msgid ""
127
+ "If you like the plugin, <a href=\"%1$s\"><strong>a donation</strong></a> is "
128
+ "recommended."
129
+ msgstr ""
130
+ "Si encuentra útil esta extensión, <a href=\"%1$s\"><strong>una donación</"
131
+ "strong></a> será bienvenida."
132
+
133
+ # @ tablepress
134
+ #: classes/class-view.php:112
135
+ msgid "For more information:"
136
+ msgstr "Para una mayor información:"
137
+
138
+ # @ tablepress
139
+ #: classes/class-view.php:147 controllers/controller-admin.php:142
140
+ #: views/view-editor_button_thickbox.php:68
141
+ #: views/view-editor_button_thickbox.php:171
142
+ #: views/view-options_custom_css.php:37 views/view-preview_table.php:53
143
+ #, php-format
144
+ msgid "%1$s &lsaquo; %2$s"
145
+ msgstr "%1$s &lsaquo; %2$s"
146
+
147
+ # @ tablepress
148
+ #: classes/class-view.php:158 classes/class-view.php:159
149
+ msgid "Do you really want to delete this table?"
150
+ msgid_plural "Do you really want to delete these tables?"
151
+ msgstr[0] "¿Realmente quiere borrar esta tabla?"
152
+ msgstr[1] "¿Realmente quiere borrar estas tablas?"
153
+
154
+ # @ tablepress
155
+ #. translators: plugin header field 'Name'
156
+ #: classes/class-view.php:379 tablepress.php:0
157
+ msgid "TablePress"
158
+ msgstr "TablePress"
159
+
160
+ # @ tablepress
161
+ #: classes/class-view.php:411 views/view-edit.php:451 views/view-edit.php:452
162
+ #: views/view-options.php:55
163
+ msgid "Save Changes"
164
+ msgstr "Guardar cambios"
165
+
166
+ # @ tablepress
167
+ #: controllers/controller-admin.php:205 views/view-about.php:91
168
+ #: views/view-list.php:190
169
+ msgid "Table"
170
+ msgstr "Tabla"
171
+
172
+ # @ tablepress
173
+ #: controllers/controller-admin.php:206 controllers/controller-admin.php:207
174
+ msgid "Insert a Table from TablePress"
175
+ msgstr "Insertar una tabla desde TablePress"
176
+
177
+ # @ tablepress
178
+ #: controllers/controller-admin.php:288
179
+ msgid "TablePress Table"
180
+ msgstr "Tabla TablePress"
181
+
182
+ # @ tablepress
183
+ #: controllers/controller-admin.php:315
184
+ msgid "Plugin page"
185
+ msgstr "Página de la extensión"
186
+
187
+ # @ tablepress
188
+ #: controllers/controller-admin.php:330
189
+ msgid "Frequently Asked Questions"
190
+ msgstr "Preguntas más frecuentes"
191
+
192
+ # @ tablepress
193
+ #: controllers/controller-admin.php:330
194
+ msgid "FAQ"
195
+ msgstr "FAQ"
196
+
197
+ # @ tablepress
198
+ #: controllers/controller-admin.php:331
199
+ msgid "Documentation"
200
+ msgstr "Documentación"
201
+
202
+ # @ tablepress
203
+ #: controllers/controller-admin.php:332
204
+ msgid "Support"
205
+ msgstr "Ayuda"
206
+
207
+ # @ tablepress
208
+ #: controllers/controller-admin.php:333
209
+ msgid "Support TablePress with your donation!"
210
+ msgstr "Ayude a TablePress con su donación!"
211
+
212
+ # @ tablepress
213
+ #: controllers/controller-admin.php:333
214
+ msgid "Donate"
215
+ msgstr "Donar"
216
+
217
+ # @ default
218
+ #: controllers/controller-admin.php:360 controllers/controller-admin.php:441
219
+ #: controllers/controller-admin.php:872 controllers/controller-admin.php:941
220
+ #: controllers/controller-admin.php:997 controllers/controller-admin.php:1075
221
+ #: controllers/controller-admin.php:1115 controllers/controller-admin.php:1205
222
+ #: controllers/controller-admin.php:1217 controllers/controller-admin.php:1848
223
+ #: controllers/controller-admin.php:1879 controllers/controller-admin.php:1920
224
+ #: controllers/controller-admin.php:1964 controllers/controller-admin.php:2008
225
+ #: controllers/controller-admin.php:2036
226
+ msgid "You do not have sufficient permissions to access this page."
227
+ msgstr "No posee suficientes permisos para acceder a esta página."
228
+
229
+ # @ tablepress
230
+ #: controllers/controller-admin.php:544
231
+ msgid "English"
232
+ msgstr "Inglés"
233
+
234
+ # @ tablepress
235
+ #: controllers/controller-admin.php:690 controllers/controller-admin.php:691
236
+ #: controllers/controller-admin.php:692
237
+ msgid "All Tables"
238
+ msgstr "Todas las tablas"
239
+
240
+ # @ tablepress
241
+ #: controllers/controller-admin.php:697 controllers/controller-admin.php:698
242
+ #: views/view-add.php:41
243
+ msgid "Add New Table"
244
+ msgstr "Agregar nueva tabla"
245
+
246
+ # @ tablepress
247
+ #: controllers/controller-admin.php:699
248
+ msgid "Add New"
249
+ msgstr "Agregar nueva"
250
+
251
+ # @ tablepress
252
+ #: controllers/controller-admin.php:704
253
+ msgid "Edit Table"
254
+ msgstr "Editar la tabla"
255
+
256
+ # @ tablepress
257
+ #: controllers/controller-admin.php:711 controllers/controller-admin.php:712
258
+ msgid "Import a Table"
259
+ msgstr "Importar una tabla"
260
+
261
+ # @ tablepress
262
+ #: controllers/controller-admin.php:718 controllers/controller-admin.php:719
263
+ msgid "Export a Table"
264
+ msgstr "Exportar una tabla"
265
+
266
+ # @ tablepress
267
+ #: controllers/controller-admin.php:725 controllers/controller-admin.php:726
268
+ #: controllers/controller-admin.php:727
269
+ msgid "Plugin Options"
270
+ msgstr "Opciones de la extensión"
271
+
272
+ # @ tablepress
273
+ #: controllers/controller-admin.php:732 controllers/controller-admin.php:734
274
+ msgid "About"
275
+ msgstr "Acerca"
276
+
277
+ # @ tablepress
278
+ #: controllers/controller-admin.php:733
279
+ msgid "About TablePress"
280
+ msgstr "Acerca de TablePress"
281
+
282
+ # @ tablepress
283
+ #: controllers/controller-admin.php:1297
284
+ msgid "Imported from Manual Input"
285
+ msgstr "Importado de forma manual"
286
+
287
+ # @ tablepress
288
+ #: controllers/controller-admin.php:1960
289
+ #: controllers/controller-admin_ajax.php:276
290
+ msgid "The preview could not be loaded."
291
+ msgstr "La previsualización no puede ser cargada."
292
+
293
+ # @ tablepress
294
+ #: controllers/controller-admin.php:1960 controllers/controller-admin.php:1970
295
+ #: views/view-edit.php:448 views/view-list.php:434
296
+ #: views/view-preview_table.php:53
297
+ msgid "Preview"
298
+ msgstr "Previsualización"
299
+
300
+ # @ tablepress
301
+ #: controllers/controller-admin.php:1970
302
+ msgid "The table could not be loaded."
303
+ msgstr "La tabla no puede ser cargada."
304
+
305
+ # @ tablepress
306
+ #: controllers/controller-admin_ajax.php:269 views/view-preview_table.php:64
307
+ msgid "This is a preview of your table."
308
+ msgstr "Esta es la previsualización de su tabla."
309
+
310
+ # @ tablepress
311
+ #: controllers/controller-admin_ajax.php:272 views/view-preview_table.php:65
312
+ #, php-format
313
+ msgid ""
314
+ "To insert the table into a page, post, or text widget, copy the Shortcode %s "
315
+ "and paste it into the editor."
316
+ msgstr ""
317
+ "Para insertar una tabla en su página, artículo, o widget de texto, copie "
318
+ "este código abreviado %s y peguelo en su editor."
319
+
320
+ # @ tablepress
321
+ #: controllers/controller-frontend.php:738 views/view-list.php:493
322
+ #, php-format
323
+ msgid "%s ago"
324
+ msgstr "hace %s"
325
+
326
+ # @ tablepress
327
+ #: models/model-table.php:530 views/view-editor_button_thickbox.php:327
328
+ #: views/view-export.php:131 views/view-import.php:211 views/view-list.php:410
329
+ msgid "(no name)"
330
+ msgstr "(sin nombre)"
331
+
332
+ # @ tablepress
333
+ #: models/model-table.php:532
334
+ #, php-format
335
+ msgid "Copy of %s"
336
+ msgstr "Copia de %s"
337
+
338
+ # @ tablepress
339
+ #. translators: plugin header field 'PluginURI'
340
+ #: tablepress.php:0
341
+ msgid "https://tablepress.org/"
342
+ msgstr "https://tablepress.org/"
343
+
344
+ # @ tablepress
345
+ #. translators: plugin header field 'Description'
346
+ #: tablepress.php:0
347
+ msgid ""
348
+ "TablePress enables you to create and manage tables in your posts and pages, "
349
+ "without having to write HTML code, and it adds valuable functions for your "
350
+ "visitors."
351
+ msgstr ""
352
+ "TablePress le permite crear y administrar tablas en sus artículos o páginas, "
353
+ "sin siquiera escribir código HTML, agregando funciones valiosas para sus "
354
+ "visitantes."
355
+
356
+ # @ tablepress
357
+ #. translators: plugin header field 'Author'
358
+ #: tablepress.php:0
359
+ msgid "Tobias Bäthge"
360
+ msgstr "Tobias Bäthge"
361
+
362
+ # @ tablepress
363
+ #. translators: plugin header field 'AuthorURI'
364
+ #: tablepress.php:0
365
+ msgid "https://tobias.baethge.com/"
366
+ msgstr "https://tobias.baethge.com/"
367
+
368
+ # @ tablepress
369
+ #: views/view-about.php:42
370
+ msgid "Plugin Purpose"
371
+ msgstr "Funcionalidad de la extensión"
372
+
373
+ # @ tablepress
374
+ #: views/view-about.php:43
375
+ msgid "Usage"
376
+ msgstr "Uso"
377
+
378
+ # @ tablepress
379
+ #: views/view-about.php:44
380
+ msgid "More Information and Documentation"
381
+ msgstr "Más información y documentación"
382
+
383
+ # @ tablepress
384
+ #: views/view-about.php:45
385
+ msgid "Help and Support"
386
+ msgstr "Ayuda y soporte"
387
+
388
+ # @ tablepress
389
+ #: views/view-about.php:46
390
+ msgid "Author and License"
391
+ msgstr "Autor y licencia"
392
+
393
+ # @ tablepress
394
+ #: views/view-about.php:47
395
+ msgid "Credits and Thanks"
396
+ msgstr "Créditos y agradecimientos"
397
+
398
+ # @ tablepress
399
+ #: views/view-about.php:48
400
+ msgid "Debug and Version Information"
401
+ msgstr "Depuración e información de la versión"
402
+
403
+ # @ tablepress
404
+ #: views/view-about.php:62
405
+ msgid ""
406
+ "TablePress allows you to create and manage tables in the admin area of "
407
+ "WordPress."
408
+ msgstr ""
409
+ "TablePress le permite crear y administrar tablas en el área de "
410
+ "administración de su instalación Wordpress."
411
+
412
+ # @ tablepress
413
+ #: views/view-about.php:63
414
+ msgid ""
415
+ "Tables may contain text, numbers and even HTML (e.g. to include images or "
416
+ "links)."
417
+ msgstr ""
418
+ "Las tablas pueden contener texto, números e incluso HTML (por ejemplo: para "
419
+ "incluir imágenes o enlaces)."
420
+
421
+ # @ tablepress
422
+ #: views/view-about.php:64
423
+ msgid ""
424
+ "You can then show the tables in your posts, on your pages, or in text "
425
+ "widgets by using a Shortcode."
426
+ msgstr ""
427
+ "Puede después mostrar las tablas en sus artículos, en sus páginas, o en "
428
+ "widgets de texto simplemente utilizando un código abreviado."
429
+
430
+ # @ tablepress
431
+ #: views/view-about.php:65
432
+ msgid ""
433
+ "If you want to show your tables anywhere else in your theme, you can use a "
434
+ "Template Tag function."
435
+ msgstr ""
436
+ "Si quiere mostrar sus tablas en cualquier lugar de su tema, puede usar la "
437
+ "función de etiqueta de la plantilla."
438
+
439
+ # @ tablepress
440
+ #: views/view-about.php:85
441
+ msgid ""
442
+ "Then you can edit your data or change the structure of your table (e.g. by "
443
+ "inserting, deleting, moving, or swaping rows or columns or sorting them) and "
444
+ "select specific table features like alternating row colors or whether to "
445
+ "print the name or description, if you want."
446
+ msgstr ""
447
+ "Posteriormente, puede editar su información o cambiar la estructura de su "
448
+ "tabla (por ejemplo: agregando, borrando, moviendo o intercambiando filas o "
449
+ "columnas o simplemente ordenandolas) y seleccionar funciones específicas "
450
+ "como alternar los colores de las filas o imprimir nombres o descripciones, "
451
+ "si así lo desea.onner des spécificités d'un tableau telles que l'alternance "
452
+ "de couleur sur les lignes, l'affichage ou non de son nom ou de sa "
453
+ "description si vous le souhaitez."
454
+
455
+ # @ tablepress
456
+ #: views/view-about.php:86
457
+ msgid "To easily add a link or an image to a cell, use the provided buttons."
458
+ msgstr ""
459
+ "Para agregar facilmente un enlace o una imagen a una celda, utilice los "
460
+ "botones proporcionados."
461
+
462
+ # @ tablepress
463
+ #: views/view-about.php:87
464
+ msgid ""
465
+ "Those will ask you for the necessary information and and corresponding HTML "
466
+ "code will be added to the cell automatically."
467
+ msgstr ""
468
+ "Se le pedirá toda la información necesaria y el código HTML correspondiente "
469
+ "que será agregado a la celda automáticamente."
470
+
471
+ # @ tablepress
472
+ #: views/view-about.php:90 views/view-list.php:188
473
+ #, php-format
474
+ msgid ""
475
+ "To insert a table into a page, post, or text widget, copy its Shortcode %s "
476
+ "and paste it at the desired place in the editor."
477
+ msgstr ""
478
+ "Para insertar una tabla en una página, artículo o widget de texto, copie "
479
+ "este código abreviado %s y peguelo en el lugar deseado en su editor."
480
+
481
+ # @ tablepress
482
+ #: views/view-about.php:91 views/view-list.php:190
483
+ #, php-format
484
+ msgid ""
485
+ "You can also click the &#8220;%s&#8221; button in the editor toolbar to "
486
+ "select and insert a table."
487
+ msgstr ""
488
+ "Puede también cliquear el botón &#8220;%s&#8221; en la barra de herramientas "
489
+ "de su editor para seleccionar e insertar una tabla."
490
+
491
+ # @ tablepress
492
+ #: views/view-about.php:94
493
+ msgid "Tables can be styled by changing and adding CSS commands."
494
+ msgstr ""
495
+ "Las tablas pueden ser modificadas, simplemente cambiando y agregando "
496
+ "comandos CSS."
497
+
498
+ # @ tablepress
499
+ #: views/view-about.php:95
500
+ msgid ""
501
+ "The plugin ships with default CSS stylesheets, which can be customized with "
502
+ "own code or replaced with other stylesheets."
503
+ msgstr ""
504
+ "Esta extensión es entregada con hojas de estilo CSS por defecto, las cuales "
505
+ "pueden ser personalizadas con su propio código o reemplazadas con otras "
506
+ "hojas de estilo."
507
+
508
+ # @ tablepress
509
+ #: views/view-about.php:96
510
+ msgid ""
511
+ "For this, each table is given certain CSS classes that can be used as CSS "
512
+ "selectors."
513
+ msgstr ""
514
+ "Por esta, cada tabla posee ciertas clases CSS que pueden ser utilizadas como "
515
+ "selectores CSS."
516
+
517
+ # @ tablepress
518
+ #: views/view-about.php:97
519
+ #, php-format
520
+ msgid ""
521
+ "Please see the <a href=\"%s\">documentation</a> for a list of these "
522
+ "selectors and for styling examples."
523
+ msgstr ""
524
+ "Por favor, lea la <a href=\"%s\">documentación</a> referida al listado de "
525
+ "selectores y ejemplos de estilos."
526
+
527
+ # @ tablepress
528
+ #: views/view-about.php:113
529
+ #, php-format
530
+ msgid ""
531
+ "More information about TablePress can be found on the <a href=\"%s"
532
+ "\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress "
533
+ "Plugin Directory</a>."
534
+ msgstr ""
535
+ "Mayor información acerca de TablePress puede ser encontrada en el <a href="
536
+ "\"%s\">sitio de internet de la extensión</a> o en la propia página del <a "
537
+ "href=\"%s\">Directorio de extensiones de Wordpress</a>"
538
+
539
+ # @ tablepress
540
+ #: classes/class-view.php:106 views/view-about.php:114
541
+ #, php-format
542
+ msgid ""
543
+ "For technical information, please see the <a href=\"%s\">documentation</a>."
544
+ msgstr ""
545
+ "Para información técnica, por favor lea la <a href=\"%s\">documentación</a>."
546
+
547
+ # @ tablepress
548
+ #: views/view-about.php:130
549
+ #, php-format
550
+ msgid ""
551
+ "This plugin was written and developed by <a href=\"%s\">Tobias Bäthge</a>."
552
+ msgstr ""
553
+ "Esta extensión fue escrita y desarrollada por <a href=\"%s\">Tobias Bäthge</"
554
+ "a>."
555
+
556
+ # @ tablepress
557
+ #: views/view-about.php:131
558
+ msgid ""
559
+ "It is licensed as Free Software under GNU General Public License 2 (GPL 2)."
560
+ msgstr ""
561
+ "Está licenciado como Software Libre bajo GNU Licencia Pública General 2 (GPL "
562
+ "2)."
563
+
564
+ # @ tablepress
565
+ #: views/view-about.php:133
566
+ #, php-format
567
+ msgid ""
568
+ "If you like the plugin, <a href=\"%s\"><strong>giving a donation</strong></"
569
+ "a> is recommended."
570
+ msgstr ""
571
+ "Si está satisfecho con esta extensión, <a href=\"%s\"><strong>dar una "
572
+ "donación</strong></a> es siempre bienvenida."
573
+
574
+ # @ tablepress
575
+ #: views/view-about.php:134
576
+ #, php-format
577
+ msgid ""
578
+ "Please rate and review the plugin in the <a href=\"%s\">WordPress Plugin "
579
+ "Directory</a>."
580
+ msgstr ""
581
+ "Por favor califique y opine acerca de esta extensión en el <a href=\"%s"
582
+ "\">Directorio de extensiones de WordPress</a>."
583
+
584
+ # @ tablepress
585
+ #: views/view-about.php:136
586
+ msgid ""
587
+ "Donations and good ratings encourage me to further develop the plugin and to "
588
+ "provide countless hours of support. Any amount is appreciated! Thanks!"
589
+ msgstr ""
590
+ "Las donaciones y las buenas calificaciones me estimulan a seguir "
591
+ "desarrollando la extensión, más aun, dedicarles incontables horas de apoyo. "
592
+ "Cualquier monto es realmente apreciado! Gracias!"
593
+
594
+ # @ tablepress
595
+ #: views/view-about.php:152
596
+ #, php-format
597
+ msgid ""
598
+ "<a href=\"%s\">Support</a> is provided through the <a href=\"%s\">WordPress "
599
+ "Support Forums</a>."
600
+ msgstr ""
601
+ "La <a href=\"%s\">ayuda</a> es provista a través de los <a href=\"%s\">Foros "
602
+ "de ayuda de WordPress</a>."
603
+
604
+ # @ tablepress
605
+ #: views/view-about.php:156
606
+ #, php-format
607
+ msgid ""
608
+ "If you do not find an answer there, please <a href=\"%s\">open a new thread</"
609
+ "a> in the WordPress Support Forums."
610
+ msgstr ""
611
+ "Si no encuentra una respuesta aquí, por favor <a href=\"%s\">cree un nuevo "
612
+ "hilo de conversación</a> en los foros de ayuda de Wordpress."
613
+
614
+ # @ tablepress
615
+ #: views/view-about.php:173
616
+ msgid "Please provide this information in bug reports and support requests."
617
+ msgstr ""
618
+ "Por favor, suministre esta información acerca de errores y pedidos de ayuda."
619
+
620
+ # @ tablepress
621
+ #: views/view-about.php:209
622
+ msgid "Special Thanks go to:"
623
+ msgstr "Agradecimientos especiales a:"
624
+
625
+ # @ tablepress
626
+ #: views/view-about.php:210
627
+ msgid ""
628
+ "Allan Jardine for <a href=\"http://www.datatables.net/\">DataTables</a>,"
629
+ msgstr ""
630
+ "Allan Jardine para <a href=\"http://www.datatables.net/\">DataTables</a>,"
631
+
632
+ # @ tablepress
633
+ #: views/view-about.php:213
634
+ msgid "Thanks to the translators:"
635
+ msgstr "Gracias a los traductores:"
636
+
637
+ # @ tablepress
638
+ #: views/view-about.php:218
639
+ #, php-format
640
+ msgid "%s (thanks to %s)"
641
+ msgstr "%s (gracias a %s)"
642
+
643
+ # @ tablepress
644
+ #: views/view-about.php:223
645
+ msgid ""
646
+ "Thank you to all donors, contributors, supporters, reviewers and users of "
647
+ "the plugin!"
648
+ msgstr ""
649
+ "Gracias a todos los donantes, contribuyentes, revisores y usuarios de esta "
650
+ "extensión!"
651
+
652
+ # @ tablepress
653
+ #: views/view-add.php:37
654
+ msgid "Error: The table could not be added."
655
+ msgstr "Error: La tabla no puede ser añadida."
656
+
657
+ # @ tablepress
658
+ #: views/view-add.php:42
659
+ msgid "Add Table"
660
+ msgstr "Agregar tabla"
661
+
662
+ # @ tablepress
663
+ #: views/view-add.php:57
664
+ msgid ""
665
+ "To add a new table, enter its name, a description (optional), and the number "
666
+ "of rows and columns into the form below."
667
+ msgstr ""
668
+ "Para agregar una nueva tabla, ingrese su nombre, una descripción (opcional), "
669
+ "y el número de filas y columnas en el siguiente formulario."
670
+
671
+ # @ tablepress
672
+ #: views/view-add.php:60
673
+ msgid ""
674
+ "You can always change the name, description, and size of your table later."
675
+ msgstr ""
676
+ "Siempre puede cambiar el nombre, descripción y tamaño de su tabla más "
677
+ "adelante."
678
+
679
+ # @ tablepress
680
+ #: views/view-add.php:77 views/view-edit.php:235
681
+ #: views/view-editor_button_thickbox.php:275 views/view-list.php:321
682
+ msgid "Table Name"
683
+ msgstr "Nombre de la tabla"
684
+
685
+ # @ tablepress
686
+ #: views/view-add.php:78
687
+ msgid "Enter Table Name here"
688
+ msgstr "Ingrese el nombre de la tabla aquí"
689
+
690
+ # @ tablepress
691
+ #: views/view-add.php:79
692
+ msgid "The name or title of your table."
693
+ msgstr "El nombre o título de su tabla."
694
+
695
+ # @ tablepress
696
+ #: views/view-add.php:82 views/view-edit.php:239
697
+ #: views/view-editor_button_thickbox.php:276 views/view-list.php:322
698
+ msgid "Description"
699
+ msgstr "Descripción"
700
+
701
+ # @ tablepress
702
+ #: views/view-add.php:82
703
+ msgid "(optional)"
704
+ msgstr "(opcional)"
705
+
706
+ # @ tablepress
707
+ #: views/view-add.php:83
708
+ msgid "Enter Description here"
709
+ msgstr "Ingrese una descripción aquí"
710
+
711
+ # @ tablepress
712
+ #: views/view-add.php:84
713
+ msgid "A description of the contents of your table."
714
+ msgstr "Una descripción de los contenidos de su tabla."
715
+
716
+ # @ tablepress
717
+ #: views/view-add.php:87
718
+ msgid "Number of Rows"
719
+ msgstr "Número de filas"
720
+
721
+ # @ tablepress
722
+ #: views/view-add.php:88 views/view-add.php:93 views/view-edit.php:424
723
+ #: views/view-edit.php:427
724
+ msgid "This field must contain a positive number."
725
+ msgstr "Este campo debe contener un número positivo."
726
+
727
+ # @ tablepress
728
+ #: views/view-add.php:89
729
+ msgid "The number of rows in your table."
730
+ msgstr "El nombre de las filas en su tabla."
731
+
732
+ # @ tablepress
733
+ #: views/view-add.php:92
734
+ msgid "Number of Columns"
735
+ msgstr "Número de columnas"
736
+
737
+ # @ tablepress
738
+ #: views/view-add.php:94
739
+ msgid "The number of columns in your table."
740
+ msgstr "El nombre de las columnas en su tabla."
741
+
742
+ # @ tablepress
743
+ #: views/view-edit.php:48
744
+ msgid "The table was saved successfully."
745
+ msgstr "La tabla fue guardada exitosamente."
746
+
747
+ # @ tablepress
748
+ #: views/view-edit.php:49
749
+ msgid "The table was added successfully."
750
+ msgstr "La tabla fue agregada exitosamente."
751
+
752
+ # @ tablepress
753
+ #: views/view-edit.php:51
754
+ msgid "The table was imported successfully."
755
+ msgstr "La tabla fue importada exitosamente."
756
+
757
+ # @ tablepress
758
+ #: views/view-edit.php:52
759
+ msgid "The table was imported successfully from WP-Table Reloaded."
760
+ msgstr "La tabla fue importada exitosamente desde WP-Table Reloaded."
761
+
762
+ # @ tablepress
763
+ #: views/view-edit.php:53 views/view-list.php:101
764
+ msgid "Error: The table could not be saved."
765
+ msgstr "Error: La tabla no puede ser guardada."
766
+
767
+ # @ tablepress
768
+ #: views/view-edit.php:54 views/view-list.php:100
769
+ msgid "Error: The table could not be deleted."
770
+ msgstr "Error: La tabla no puede ser borrada."
771
+
772
+ # @ tablepress
773
+ #: views/view-edit.php:55
774
+ msgid "The table was saved successfully, and the table ID was changed."
775
+ msgstr ""
776
+ "La tabla fue guardada exitosamente, y el ID de la tabla fue modificado."
777
+
778
+ # @ tablepress
779
+ #: views/view-edit.php:56
780
+ msgid ""
781
+ "The table was saved successfully, but the table ID could not be changed!"
782
+ msgstr ""
783
+ "La tabla fue guardada exitosamente, pero el ID de la tabla no puede ser "
784
+ "modificado!"
785
+
786
+ # @ tablepress
787
+ #: views/view-edit.php:121
788
+ msgid "You can not delete all table rows!"
789
+ msgstr "No puede borrar todas las filas de la tabla!"
790
+
791
+ # @ tablepress
792
+ #: views/view-edit.php:122
793
+ msgid "You can not delete all table columns!"
794
+ msgstr "No puede borrar todas las columnas de la tabla!"
795
+
796
+ # @ tablepress
797
+ #: views/view-edit.php:123
798
+ msgid "You did not select any rows!"
799
+ msgstr "No seleccionó ninguna fila!"
800
+
801
+ # @ tablepress
802
+ #: views/view-edit.php:124
803
+ msgid "You did not select any columns!"
804
+ msgstr "No seleccionó ninguna columna!"
805
+
806
+ # @ tablepress
807
+ #: views/view-edit.php:125
808
+ msgid "The value for the number of rows is invalid!"
809
+ msgstr "El valor para el número de filas es inválido!"
810
+
811
+ # @ tablepress
812
+ #: views/view-edit.php:126
813
+ msgid "The value for the number of columns is invalid!"
814
+ msgstr "El valor para el número de columnas es inválido!"
815
+
816
+ # @ tablepress
817
+ #: views/view-edit.php:127 views/view-edit.php:128
818
+ msgid "Do you really want to delete the selected row?"
819
+ msgid_plural "Do you really want to delete the selected rows?"
820
+ msgstr[0] "¿Quiere realmente eliminar la fila seleccionada?"
821
+ msgstr[1] "¿Quiere realmente eliminar las filas seleccionadas?"
822
+
823
+ # @ tablepress
824
+ #: views/view-edit.php:129 views/view-edit.php:130
825
+ msgid "Do you really want to delete the selected column?"
826
+ msgid_plural "Do you really want to delete the selected columns?"
827
+ msgstr[0] "¿Quiere realmente eliminar la columna seleccionada?"
828
+ msgstr[1] "¿Quiere realmente eliminar las columnas seleccionadas?"
829
+
830
+ # @ tablepress
831
+ #: views/view-edit.php:131
832
+ msgid ""
833
+ "Please click into the cell that you want to edit using the &#8220;Advanced "
834
+ "Editor&#8221;."
835
+ msgstr ""
836
+ "Por favor, cliquee en la celda que quiere editar utilizando el &#8220;Editor "
837
+ "avanzado&#8221;."
838
+
839
+ # @ tablepress
840
+ #: views/view-edit.php:132
841
+ msgid ""
842
+ "To combine cells within a column, click into the cell below the cell that "
843
+ "has the content the combined cells shall have."
844
+ msgstr ""
845
+ "Para combinar celdas dentro de una columna, cliquee en la celda bajo la "
846
+ "celda que tiene el contenido que las celdas combinadas deberá tener."
847
+
848
+ # @ tablepress
849
+ #: views/view-edit.php:133
850
+ msgid ""
851
+ "To combine cells within a row, click into the cell to the right of the cell "
852
+ "that has the content the combined cells shall have."
853
+ msgstr ""
854
+ "Para combinar celdas dentro de una fila, cliquee dentro de la celda a la "
855
+ "derecha de la celda que tiene el contenido que las celdas combinadas deberá "
856
+ "tener."
857
+
858
+ # @ tablepress
859
+ #: views/view-edit.php:137
860
+ msgid "Please click into the cell that you want to add a link to."
861
+ msgstr "Por favor, cliquee dentro de la celda si quiere agregar un enlace."
862
+
863
+ # @ tablepress
864
+ #: views/view-edit.php:138
865
+ msgid ""
866
+ "You can then enter the Link URL and Text or choose an existing page or post."
867
+ msgstr ""
868
+ "Puede posteriormente ingresar un enlace URL y texto o elegir una página "
869
+ "existente o artículo."
870
+
871
+ # @ tablepress
872
+ #: views/view-edit.php:139
873
+ msgid "Please click into the cell that you want to add an image to."
874
+ msgstr ""
875
+ "Por favor, cliquee dentro de la celda a la cual quiere agregar una imagen."
876
+
877
+ # @ tablepress
878
+ #: views/view-edit.php:140
879
+ msgid ""
880
+ "The Media Library will open, where you can select or upload the desired "
881
+ "image or enter the image URL."
882
+ msgstr ""
883
+ "La biblioteca de medios se abrirá, donde puede seleccionar o agregar la "
884
+ "imagen deseada o ingresar la dirección de internet (URL) de la imagen."
885
+
886
+ # @ tablepress
887
+ #: views/view-edit.php:141
888
+ #, php-format
889
+ msgid "Click the &#8220;%s&#8221; button to insert the image."
890
+ msgstr "Cliquee sobre el botón &#8220;%s&#8221; para insertar la imagen."
891
+
892
+ # @ tablepress
893
+ #: views/view-edit.php:142
894
+ msgid ""
895
+ "The changes to this table were not saved yet and will be lost if you "
896
+ "navigate away from this page."
897
+ msgstr ""
898
+ "Los cambios en esta tabla no fueron salvados aun y serán perdidos si se "
899
+ "aleja de esta página."
900
+
901
+ # @ tablepress
902
+ #: views/view-edit.php:143
903
+ msgid "The Table Preview is being loaded..."
904
+ msgstr "La previsualización de la tabla está siendo cargada…"
905
+
906
+ # @ tablepress
907
+ #: views/view-edit.php:144
908
+ msgid "The Table Preview could not be loaded."
909
+ msgstr "La previsualización de la tabla no se puede cargar."
910
+
911
+ # @ tablepress
912
+ #: views/view-edit.php:145
913
+ msgid "Saving successful"
914
+ msgstr "Guardado exitoso"
915
+
916
+ # @ tablepress
917
+ #: views/view-edit.php:146
918
+ msgid "Saving failed"
919
+ msgstr "Guardado fracasó"
920
+
921
+ # @ tablepress
922
+ #: views/view-edit.php:147
923
+ msgid "Changes are being saved..."
924
+ msgstr "Los cambios están siendo guardados…"
925
+
926
+ # @ tablepress
927
+ #: views/view-edit.php:148
928
+ msgid "The Table ID field can not be empty. Please enter a Table ID!"
929
+ msgstr ""
930
+ "El campo ID de la tabla no puede estar vacío. Por favor, introduzca un ID "
931
+ "para esta tabla!"
932
+
933
+ # @ tablepress
934
+ #: views/view-edit.php:149
935
+ msgid ""
936
+ "The Table ID &#8220;0&#8221; is not supported. Please enter a different "
937
+ "Table ID!"
938
+ msgstr ""
939
+ "El ID de la tabla &#8220;0&#8221; no es admitido. Por favor, ingrese un ID "
940
+ "diferente!"
941
+
942
+ # @ tablepress
943
+ #: views/view-edit.php:150
944
+ msgid ""
945
+ "Do you really want to change the Table ID? All Shortcodes for this table in "
946
+ "your pages and posts will have to be adjusted!"
947
+ msgstr ""
948
+ "Quiere realmente cambiar el ID de la tabla? Todos los códigos abreviados de "
949
+ "esta tabla en todas las páginas y artículos deberán ser actualizados!"
950
+
951
+ # @ tablepress
952
+ #: views/view-edit.php:151
953
+ msgid ""
954
+ "The entered value in the field &#8220;Extra CSS classes&#8221; is invalid."
955
+ msgstr ""
956
+ "El valor ingresado en el campo &#8220; clases de CSS extras&#8221; es "
957
+ "inválido."
958
+
959
+ # @ tablepress
960
+ #: views/view-edit.php:152
961
+ msgid ""
962
+ "The entered value in the field &#8220;Pagination Entries&#8221; is not a "
963
+ "number."
964
+ msgstr ""
965
+ "El valor ingresado en el campo &#8220;Entradas de paginación&#8221; no es un "
966
+ "número."
967
+
968
+ # @ tablepress
969
+ #: views/view-edit.php:153 views/view-edit.php:298
970
+ msgid "Sort ascending"
971
+ msgstr "Orden ascendente"
972
+
973
+ # @ tablepress
974
+ #: views/view-edit.php:154 views/view-edit.php:298
975
+ msgid "Sort descending"
976
+ msgstr "Orden descendente"
977
+
978
+ # @ tablepress
979
+ #: views/view-edit.php:155
980
+ msgid "You can not add rowspan to the first row!"
981
+ msgstr "No puede agregar una combinación de celdas en la primera fila!"
982
+
983
+ # @ tablepress
984
+ #: views/view-edit.php:156
985
+ msgid "You can not add colspan to the first column!"
986
+ msgstr "No puede agregar una combinación de columnas en la primera columna!"
987
+
988
+ # @ tablepress
989
+ #: views/view-edit.php:157
990
+ msgid "You can not connect cells into the table head row!"
991
+ msgstr "No puede conectar celdas en la fila de encabezado de la tabla!"
992
+
993
+ # @ tablepress
994
+ #: views/view-edit.php:158
995
+ msgid "You can not connect cells out of the table foot row!"
996
+ msgstr "No puede combinar celdas de la fila final de la tabla!"
997
+
998
+ # @ tablepress
999
+ #: views/view-edit.php:166
1000
+ msgid "Table Information"
1001
+ msgstr "Información de tabla"
1002
+
1003
+ # @ tablepress
1004
+ #: views/view-edit.php:167
1005
+ msgid "Table Content"
1006
+ msgstr "Contenido de tabla"
1007
+
1008
+ # @ tablepress
1009
+ #: views/view-edit.php:168
1010
+ msgid "Table Manipulation"
1011
+ msgstr "Manipulación de la tabla"
1012
+
1013
+ # @ tablepress
1014
+ #: views/view-edit.php:169 views/view-edit.php:591
1015
+ msgid "Table Options"
1016
+ msgstr "Opciones de tabla"
1017
+
1018
+ # @ tablepress
1019
+ #: views/view-edit.php:170
1020
+ msgid "Features of the DataTables JavaScript library"
1021
+ msgstr "Funciones de la biblioteca Javascript de DataTables"
1022
+
1023
+ # @ tablepress
1024
+ #: views/view-edit.php:226
1025
+ msgid "Table ID"
1026
+ msgstr "ID de la tabla"
1027
+
1028
+ # @ tablepress
1029
+ #: views/view-edit.php:229
1030
+ msgid ""
1031
+ "The Table ID can only consist of letters, numbers, hyphens (-), and "
1032
+ "underscores (_)."
1033
+ msgstr ""
1034
+ "El ID de la tabla puede consistir únicamente de letras, números, guiones "
1035
+ "(-), y subrayados (_)."
1036
+
1037
+ # @ tablepress
1038
+ #: views/view-edit.php:230
1039
+ msgid "Shortcode"
1040
+ msgstr "Código abreviado"
1041
+
1042
+ # @ tablepress
1043
+ #: views/view-edit.php:243 views/view-list.php:325
1044
+ msgid "Last Modified"
1045
+ msgstr "Ultima modificación"
1046
+
1047
+ # @ tablepress
1048
+ #: views/view-edit.php:244
1049
+ #, php-format
1050
+ msgid "%1$s by %2$s"
1051
+ msgstr "%1$s por %2$s"
1052
+
1053
+ # @ tablepress
1054
+ #: views/view-edit.php:376
1055
+ msgid "Insert Link"
1056
+ msgstr "Insertar enlace"
1057
+
1058
+ # @ tablepress
1059
+ #: views/view-edit.php:377
1060
+ msgid "Insert Image"
1061
+ msgstr "Insertar una imagen"
1062
+
1063
+ # @ tablepress
1064
+ #: views/view-edit.php:378
1065
+ msgid "Advanced Editor"
1066
+ msgstr "Editor avanzado"
1067
+
1068
+ # @ tablepress
1069
+ #: views/view-edit.php:381
1070
+ msgid "Combine cells"
1071
+ msgstr "Combinar celdas"
1072
+
1073
+ # @ tablepress
1074
+ #: views/view-edit.php:382
1075
+ msgid "in a column (rowspan)"
1076
+ msgstr "en una columna (rowspan)"
1077
+
1078
+ # @ tablepress
1079
+ #: views/view-edit.php:383
1080
+ msgid "in a row (colspan)"
1081
+ msgstr "en una fila (colspan)"
1082
+
1083
+ # @ tablepress
1084
+ #: views/view-edit.php:384
1085
+ msgid "?"
1086
+ msgstr "?"
1087
+
1088
+ # @ tablepress
1089
+ #: views/view-edit.php:384
1090
+ msgid "Help on combining cells"
1091
+ msgstr "Ayuda sobre combinación de celdas"
1092
+
1093
+ # @ tablepress
1094
+ #: views/view-edit.php:386
1095
+ msgid "Table cells can span across more than one column or row."
1096
+ msgstr ""
1097
+ "Las celdas de una tabla puede expandirse más allá de una columna o fila. "
1098
+
1099
+ # @ tablepress
1100
+ #: views/view-edit.php:387
1101
+ msgid ""
1102
+ "Combining consecutive cells within the same row is called &#8220;"
1103
+ "colspanning&#8221;."
1104
+ msgstr ""
1105
+ "Combinando celdas consecutivas dentro de la misma fila es denominado &#8220;"
1106
+ "colspanning&#8221;."
1107
+
1108
+ # @ tablepress
1109
+ #: views/view-edit.php:388
1110
+ msgid ""
1111
+ "Combining consecutive cells within the same column is called &#8220;"
1112
+ "rowspanning&#8221;."
1113
+ msgstr ""
1114
+ "Combinar celdas consecutivas dentro de la misma columna es llamado &#8220;"
1115
+ "rowspanning&#8221;."
1116
+
1117
+ # @ tablepress
1118
+ #: views/view-edit.php:389
1119
+ msgid ""
1120
+ "To combine adjacent cells in a row, add the keyword <code>#colspan#</code> "
1121
+ "to the cell to the right of the one with the content for the combined cell "
1122
+ "by using the corresponding button."
1123
+ msgstr ""
1124
+ "Para combinar celdas adyacentes en una fila, agregue la palabra clave "
1125
+ "<code>#colspan#</code> a la celda de la derecha de aquella con el contenido "
1126
+ "de la celda combinada utilizado el botón suministrado."
1127
+
1128
+ # @ tablepress
1129
+ #: views/view-edit.php:390
1130
+ msgid ""
1131
+ "To combine adjacent cells in a column, add the keyword <code>#rowspan#</"
1132
+ "code> to the cell below the one with the content for the combined cell by "
1133
+ "using the corresponding button."
1134
+ msgstr ""
1135
+ "Para combinar celdas adyacentes en una columna, agregue la palabra clave "
1136
+ "<code>#rowspan#</code> a la celda debajo de aquella con el contenido para la "
1137
+ "celda combinada utilizando el botón suministrado."
1138
+
1139
+ # @ tablepress
1140
+ #: views/view-edit.php:391
1141
+ msgid "Repeat this to add the keyword to all cells that shall be connected."
1142
+ msgstr "Repita este palabra clave en todas las celdas que estarán conectadas."
1143
+
1144
+ # @ tablepress
1145
+ #: views/view-edit.php:392
1146
+ msgid ""
1147
+ "Be aware that the functions of the DataTables JavaScript library will not "
1148
+ "work on tables which have combined cells."
1149
+ msgstr ""
1150
+ "Tenga presente que las funciones que la librería Javascript de DataTables no "
1151
+ "funcionará en tablas que contienen celdas combinadas."
1152
+
1153
+ # @ tablepress
1154
+ #: views/view-edit.php:398 views/view-edit.php:410
1155
+ msgid "Selected rows"
1156
+ msgstr "Filas seleccionadas"
1157
+
1158
+ # @ tablepress
1159
+ #: views/view-edit.php:399 views/view-edit.php:404
1160
+ msgid "Hide"
1161
+ msgstr "Ocultar"
1162
+
1163
+ # @ tablepress
1164
+ #: views/view-edit.php:400 views/view-edit.php:405
1165
+ msgid "Show"
1166
+ msgstr "Mostrar"
1167
+
1168
+ # @ tablepress
1169
+ #: views/view-edit.php:403 views/view-edit.php:416
1170
+ msgid "Selected columns"
1171
+ msgstr "Columnas seleccionadas"
1172
+
1173
+ # @ tablepress
1174
+ #: views/view-edit.php:412 views/view-edit.php:418
1175
+ msgid "Insert"
1176
+ msgstr "Insertar"
1177
+
1178
+ # @ tablepress
1179
+ #: views/view-edit.php:413 views/view-edit.php:419 views/view-list.php:431
1180
+ msgid "Delete"
1181
+ msgstr "Borrar"
1182
+
1183
+ # @ tablepress
1184
+ #: views/view-edit.php:424
1185
+ #, php-format
1186
+ msgid "Add %s row(s)"
1187
+ msgstr "Agregar %s fila(s)"
1188
+
1189
+ # @ tablepress
1190
+ #: views/view-edit.php:424 views/view-edit.php:427
1191
+ msgid "Add"
1192
+ msgstr "Agregar"
1193
+
1194
+ # @ tablepress
1195
+ #: views/view-edit.php:427
1196
+ #, php-format
1197
+ msgid "Add %s column(s)"
1198
+ msgstr "Agregar %s columna(s)"
1199
+
1200
+ # @ tablepress
1201
+ #: views/view-edit.php:431
1202
+ msgid ""
1203
+ "To use the Table Manipulation features, JavaScript needs to be enabled in "
1204
+ "your browser."
1205
+ msgstr ""
1206
+ "Para utilizar la función de manipulación de tabla, Javascript debe ser "
1207
+ "habilitado en su navegador de internet."
1208
+
1209
+ # @ tablepress
1210
+ #: views/view-edit.php:475
1211
+ msgid "Other Actions"
1212
+ msgstr "Otras acciones"
1213
+
1214
+ # @ tablepress
1215
+ #: views/view-edit.php:483
1216
+ msgid "Delete Table"
1217
+ msgstr "Borrar tabla"
1218
+
1219
+ # @ tablepress
1220
+ #: views/view-edit.php:480
1221
+ msgid "Export Table"
1222
+ msgstr "Exportar tabla"
1223
+
1224
+ # @ tablepress
1225
+ #: views/view-edit.php:511
1226
+ msgid "Cancel"
1227
+ msgstr "Cancelar"
1228
+
1229
+ # @ tablepress
1230
+ #: views/view-edit.php:512
1231
+ msgid "OK"
1232
+ msgstr "OK"
1233
+
1234
+ # @ tablepress
1235
+ #: views/view-edit.php:536 views/view-edit.php:591
1236
+ msgid "Table Head Row"
1237
+ msgstr "Encabezado de fila de la tabla"
1238
+
1239
+ # @ tablepress
1240
+ #: views/view-edit.php:537
1241
+ msgid "The first row of the table is the table header."
1242
+ msgstr "La primera fila de la tabla es el encabezado de la misma."
1243
+
1244
+ # @ tablepress
1245
+ #: views/view-edit.php:540
1246
+ msgid "Table Foot Row"
1247
+ msgstr "Fila final de la tabla"
1248
+
1249
+ # @ tablepress
1250
+ #: views/view-edit.php:541
1251
+ msgid "The last row of the table is the table footer."
1252
+ msgstr "La última fila es el pie de página de la tabla."
1253
+
1254
+ # @ tablepress
1255
+ #: views/view-edit.php:544
1256
+ msgid "Alternating Row Colors"
1257
+ msgstr "Alternar los colores de la fila"
1258
+
1259
+ # @ tablepress
1260
+ #: views/view-edit.php:545
1261
+ msgid "The background colors of consecutive rows shall alternate."
1262
+ msgstr "Los colores de fondo de las filas consecutivas se alternarán."
1263
+
1264
+ # @ tablepress
1265
+ #: views/view-edit.php:548
1266
+ msgid "Row Hover Highlighting"
1267
+ msgstr "Destacado cada vez que se está encima de una fila"
1268
+
1269
+ # @ tablepress
1270
+ #: views/view-edit.php:549
1271
+ msgid ""
1272
+ "Highlight a row while the mouse cursor hovers above it by changing its "
1273
+ "background color."
1274
+ msgstr ""
1275
+ "Destacar fila mientras el cursor del ratón flota encima cambiando su color "
1276
+ "de fondo."
1277
+
1278
+ # @ tablepress
1279
+ #: views/view-edit.php:552
1280
+ msgid "Print Table Name"
1281
+ msgstr "Imprimir el nombre de la tabla"
1282
+
1283
+ # @ tablepress
1284
+ #: views/view-edit.php:555 views/view-edit.php:565
1285
+ msgid "above"
1286
+ msgstr "arriba"
1287
+
1288
+ # @ tablepress
1289
+ #: views/view-edit.php:556 views/view-edit.php:566
1290
+ msgid "below"
1291
+ msgstr "abajo"
1292
+
1293
+ # @ tablepress
1294
+ #: views/view-edit.php:562
1295
+ msgid "Print Table Description"
1296
+ msgstr "Imprimir la descripción de la tabla"
1297
+
1298
+ # @ tablepress
1299
+ #: views/view-edit.php:572
1300
+ msgid "Extra CSS Classes"
1301
+ msgstr "Clases CSS adicionales "
1302
+
1303
+ # @ tablepress
1304
+ #: views/view-edit.php:573
1305
+ msgid ""
1306
+ "This field can only contain letters, numbers, spaces, hyphens (-), and "
1307
+ "underscores (_)."
1308
+ msgstr ""
1309
+ "Este campo puede solamente contener letras, números, espacios, guiones (-) y "
1310
+ "subrayados (_)."
1311
+
1312
+ # @ tablepress
1313
+ #: views/view-edit.php:573
1314
+ msgid "Additional CSS classes for styling purposes can be entered here."
1315
+ msgstr ""
1316
+ "Clases CSS adicionales con el solo propósito de estilo y apariencia de la "
1317
+ "tabla pueden ser ingresadas aquí."
1318
+
1319
+ # @ tablepress
1320
+ #: views/view-edit.php:573
1321
+ #, php-format
1322
+ msgid "This is NOT the place to enter <a href=\"%s\">Custom CSS</a> code!"
1323
+ msgstr ""
1324
+ "Este NO es el lugar para ingresar su código <a href=\"%s\">CSS "
1325
+ "personalizado</a>!"
1326
+
1327
+ # @ tablepress
1328
+ #: views/view-edit.php:591
1329
+ #, php-format
1330
+ msgid ""
1331
+ "These features and options are only available, when the &#8220;%1$s&#8221; "
1332
+ "checkbox in the &#8220;%2$s&#8221; section is checked."
1333
+ msgstr ""
1334
+ "Estas funciones y opciones están solamente disponibles, cuando el cuadro de "
1335
+ "comprobación &#8220;%1$s&#8221; en la sección &#8220;%2$s&#8221; está "
1336
+ "apuntado."
1337
+
1338
+ # @ tablepress
1339
+ #: views/view-edit.php:595
1340
+ msgid "Use DataTables"
1341
+ msgstr "Utilizar DataTables"
1342
+
1343
+ # @ tablepress
1344
+ #: views/view-edit.php:596
1345
+ msgid ""
1346
+ "Use the following features of the DataTables JavaScript library with this "
1347
+ "table:"
1348
+ msgstr ""
1349
+ "Utilice las siguientes funciones de la biblioteca Javascript de DataTables "
1350
+ "con esta tabla:"
1351
+
1352
+ # @ tablepress
1353
+ #: views/view-edit.php:599
1354
+ msgid "Sorting"
1355
+ msgstr "Ordenando"
1356
+
1357
+ # @ tablepress
1358
+ #: views/view-edit.php:600
1359
+ msgid "Enable sorting of the table by the visitor."
1360
+ msgstr "Activar la posibilidad que el visitante ordene la tabla."
1361
+
1362
+ # @ tablepress
1363
+ #: views/view-edit.php:603
1364
+ msgid "Search/Filtering"
1365
+ msgstr "Buscar/filtrar"
1366
+
1367
+ # @ tablepress
1368
+ #: views/view-edit.php:604
1369
+ msgid ""
1370
+ "Enable the visitor to filter or search the table. Only rows with the search "
1371
+ "word in them are shown."
1372
+ msgstr ""
1373
+ "Habilitar al visitante la posibilidad de filtrar o buscar en la tabla. "
1374
+ "Solamente aquellas filas con la palabra buscada son visualizadas."
1375
+
1376
+ # @ tablepress
1377
+ #: views/view-edit.php:607
1378
+ msgid "Pagination"
1379
+ msgstr "Paginación"
1380
+
1381
+ # @ tablepress
1382
+ #: views/view-edit.php:608
1383
+ msgid ""
1384
+ "Enable pagination of the table (viewing only a certain number of rows at a "
1385
+ "time) by the visitor."
1386
+ msgstr ""
1387
+ "Activar la paginación de la tabla al visitante (visualizando solo un cierto "
1388
+ "número de filas a un tiempo)."
1389
+
1390
+ # @ tablepress
1391
+ #: views/view-edit.php:609
1392
+ #, php-format
1393
+ msgid "Show %s rows per page."
1394
+ msgstr "Mostrar %s filas por página."
1395
+
1396
+ # @ tablepress
1397
+ #: views/view-edit.php:612
1398
+ msgid "Pagination Length Change"
1399
+ msgstr "Cambiar la longitud de la paginación"
1400
+
1401
+ # @ tablepress
1402
+ #: views/view-edit.php:613
1403
+ msgid ""
1404
+ "Allow the visitor to change the number of rows shown when using pagination."
1405
+ msgstr ""
1406
+ "Permitir al visitante cambiar el número de filas visualizadas cuando se "
1407
+ "utilice paginación."
1408
+
1409
+ # @ tablepress
1410
+ #: views/view-edit.php:616
1411
+ msgid "Info"
1412
+ msgstr "Información"
1413
+
1414
+ # @ tablepress
1415
+ #: views/view-edit.php:617
1416
+ msgid ""
1417
+ "Enable the table information display, with information about the currently "
1418
+ "visible data, like the number of rows."
1419
+ msgstr ""
1420
+ "Habilitar la visualización de la información de la tabla, con datos acerca "
1421
+ "de lo actualmente visualizado, por ejemplo: como el número de filas."
1422
+
1423
+ # @ tablepress
1424
+ #: views/view-edit.php:620
1425
+ msgid "Horizontal Scrolling"
1426
+ msgstr "Desplazamiento horizontal"
1427
+
1428
+ # @ tablepress
1429
+ #: views/view-edit.php:621
1430
+ msgid ""
1431
+ "Enable horizontal scrolling, to make viewing tables with many columns easier."
1432
+ msgstr ""
1433
+ "Activar el desplazamiento horizontal, para facilitar la visualización de las "
1434
+ "tablas."
1435
+
1436
+ # @ tablepress
1437
+ #: views/view-edit.php:627
1438
+ msgid "Custom Commands"
1439
+ msgstr "Comandos personalizados"
1440
+
1441
+ # @ tablepress
1442
+ #: views/view-edit.php:628
1443
+ msgid ""
1444
+ "Additional parameters from the <a href=\"http://www.datatables.net/"
1445
+ "\">DataTables documentation</a> to be added to the JS call."
1446
+ msgstr ""
1447
+ "Parámetros adicionales desde la <a href=\"http://www.datatables.net/"
1448
+ "\">documentación de DataTables</a> para ser agregadas a una llamada JS."
1449
+
1450
+ # @ tablepress
1451
+ #: views/view-edit.php:628
1452
+ msgid "For advanced use only."
1453
+ msgstr "Para uso de usuarios avanzados."
1454
+
1455
+ # @ tablepress
1456
+ #: views/view-edit.php:681
1457
+ #, php-format
1458
+ msgid ""
1459
+ "On this screen, you can edit the content and structure of the table with the "
1460
+ "ID %s."
1461
+ msgstr ""
1462
+ "En esta pantalla, puede editar el contenido y estructura de la tabla con el "
1463
+ "ID %s."
1464
+
1465
+ # @ tablepress
1466
+ #: views/view-edit.php:682
1467
+ msgid ""
1468
+ "For example, you can insert things like text, images, or links into the "
1469
+ "table, or change the used table features. You can also insert, delete, move, "
1470
+ "hide, and swap columns and rows."
1471
+ msgstr ""
1472
+ "Por ejemplo, puede insertar objetos como texto, imágenes, o enlaces dentro "
1473
+ "de la tabla, o cambiar las funciones utilizadas en la tabla. Puede también "
1474
+ "agregar, borrar, mover, ocultar e intercambiar columnas y filas."
1475
+
1476
+ # @ tablepress
1477
+ #: views/view-edit.php:685
1478
+ #, php-format
1479
+ msgid ""
1480
+ "To insert the table into a page, post, or text widget, copy the Shortcode %s "
1481
+ "and paste it at the desired place in the editor."
1482
+ msgstr ""
1483
+ "Para insertar la tabla dentro de una página, artículo o widget de texto, "
1484
+ "copie el código abreviado %s y péguelos en el lugar deseado en el editor."
1485
+
1486
+ # @ tablepress
1487
+ #: views/view-editor_button_thickbox.php:68
1488
+ #: views/view-editor_button_thickbox.php:171
1489
+ msgid "List of Tables"
1490
+ msgstr "Lista de tablas"
1491
+
1492
+ # @ tablepress
1493
+ #: views/view-editor_button_thickbox.php:174
1494
+ msgid "This is a list of all available tables."
1495
+ msgstr "Este es un listado de todas las tablas disponibles."
1496
+
1497
+ # @ tablepress
1498
+ #: views/view-editor_button_thickbox.php:174
1499
+ msgid "You may insert a table into a post or page here."
1500
+ msgstr "Puede insertar una tabla dentro de un artículo o página aquí."
1501
+
1502
+ # @ tablepress
1503
+ #: views/view-editor_button_thickbox.php:176
1504
+ #: views/view-editor_button_thickbox.php:356
1505
+ msgid "Insert Shortcode"
1506
+ msgstr "Insertar código abreviado"
1507
+
1508
+ # @ tablepress
1509
+ #: views/view-editor_button_thickbox.php:180 views/view-list.php:205
1510
+ #, php-format
1511
+ msgid "Search results for &#8220;%s&#8221;"
1512
+ msgstr "Resultados de la búsqueda para &#8220;%s&#8221;"
1513
+
1514
+ # @ tablepress
1515
+ #: views/view-editor_button_thickbox.php:186 views/view-list.php:213
1516
+ msgid "Search Tables"
1517
+ msgstr "Buscar tablas"
1518
+
1519
+ # @ tablepress
1520
+ #: views/view-editor_button_thickbox.php:274 views/view-list.php:320
1521
+ msgid "ID"
1522
+ msgstr "ID"
1523
+
1524
+ # @ tablepress
1525
+ #: views/view-editor_button_thickbox.php:277
1526
+ msgid "Action"
1527
+ msgstr "Acción"
1528
+
1529
+ # @ tablepress
1530
+ #: views/view-editor_button_thickbox.php:342 views/view-list.php:450
1531
+ msgid "(no description)"
1532
+ msgstr "(sin descripción)"
1533
+
1534
+ # @ tablepress
1535
+ #: views/view-editor_button_thickbox.php:365 views/view-export.php:88
1536
+ #: views/view-list.php:568
1537
+ msgid "No tables found."
1538
+ msgstr "No se encontraron tablas."
1539
+
1540
+ # @ tablepress
1541
+ #: views/view-editor_button_thickbox.php:367
1542
+ msgid ""
1543
+ "You should add or import a table on the TablePress screens to get started!"
1544
+ msgstr "Deberá agregar o importar una tabla en TablePress para comenzar!"
1545
+
1546
+ # @ tablepress
1547
+ #: views/view-export.php:35
1548
+ msgid "Error: The export failed."
1549
+ msgstr "Error: La exportación fracasó."
1550
+
1551
+ # @ tablepress
1552
+ #: views/view-export.php:36 views/view-list.php:106
1553
+ msgid "Error: This table could not be loaded!"
1554
+ msgstr "Error: Esta tabla no puede ser creada!"
1555
+
1556
+ # @ tablepress
1557
+ #: views/view-export.php:38
1558
+ msgid "Error: The ZIP file could not be created."
1559
+ msgstr "Error: El archivo ZIP no puede ser creado."
1560
+
1561
+ # @ tablepress
1562
+ #: views/view-export.php:43 views/view-export.php:46
1563
+ msgid "Export Tables"
1564
+ msgstr "Exportar tablas"
1565
+
1566
+ # @ tablepress
1567
+ #: views/view-export.php:63
1568
+ msgid ""
1569
+ "Exporting a table allows you to use it in other programs, like spreadsheets "
1570
+ "applications."
1571
+ msgstr ""
1572
+ "Exportar una tabla le permite utilizar dicha información en otros programas, "
1573
+ "como aplicaciones tales como hojas de cálculo."
1574
+
1575
+ # @ tablepress
1576
+ #: views/view-export.php:64
1577
+ msgid ""
1578
+ "Regularly exporting tables is also recommended as a backup of your data."
1579
+ msgstr ""
1580
+ "Exportar tablas regularmente es altamente recomendable como un método de "
1581
+ "respaldo de su información."
1582
+
1583
+ # @ tablepress
1584
+ #: views/view-export.php:67
1585
+ msgid "To export, select the tables and the desired export format."
1586
+ msgstr ""
1587
+ "Para exportar, seleccione las tablas y el formato deseado de exportación."
1588
+
1589
+ # @ tablepress
1590
+ #: views/view-export.php:68
1591
+ msgid ""
1592
+ "If you choose more than one table, the exported files will automatically be "
1593
+ "stored in a ZIP archive file."
1594
+ msgstr ""
1595
+ "Si elige más de una tabla, los archivos exportados serán automáticamente "
1596
+ "guardados en un archivo en formato ZIP."
1597
+
1598
+ # @ tablepress
1599
+ #: views/view-export.php:70
1600
+ msgid ""
1601
+ "Be aware that for the CSV and HTML formats only the table data, but no table "
1602
+ "options are exported!"
1603
+ msgstr ""
1604
+ "Atención: en los formatos CSV y HTML solo se exportan los datos, nada más "
1605
+ "(ningún formato especial, etc.)"
1606
+
1607
+ # @ tablepress
1608
+ #: views/view-export.php:71
1609
+ msgid "For the JSON format, the table data and the table options are exported."
1610
+ msgstr ""
1611
+ "En el formato JSON, la información de la tabla y las opciones de la tabla "
1612
+ "son exportados. "
1613
+
1614
+ # @ tablepress
1615
+ #: views/view-export.php:89 views/view-list.php:577
1616
+ #, php-format
1617
+ msgid ""
1618
+ "You should <a href=\"%s\">add</a> or <a href=\"%s\">import</a> a table to "
1619
+ "get started!"
1620
+ msgstr ""
1621
+ "Debe <a href=\"%s\">agregar</a> o <a href=\"%s\">importar</a> una tabla para "
1622
+ "comenzar!"
1623
+
1624
+ # @ tablepress
1625
+ #: views/view-export.php:107
1626
+ msgid "Tables to Export"
1627
+ msgstr "Tablas a exportar"
1628
+
1629
+ # @ tablepress
1630
+ #: views/view-export.php:110
1631
+ msgid "Select all"
1632
+ msgstr "Seleccionar todo"
1633
+
1634
+ # @ tablepress
1635
+ #: views/view-export.php:133 views/view-import.php:213
1636
+ #, php-format
1637
+ msgid "ID %1$s: %2$s"
1638
+ msgstr "ID %1$s: %2$s"
1639
+
1640
+ # @ tablepress
1641
+ #: views/view-export.php:141
1642
+ msgid ""
1643
+ "You can select multiple tables by holding down the &#8220;Ctrl&#8221; key "
1644
+ "(Windows) or the &#8220;Command&#8221; key (Mac)."
1645
+ msgstr ""
1646
+ "Puede seleccionar múltiples tablas simplemente manteniendo la tecla &#8220;"
1647
+ "Ctrl&#8221; (en ambientes Windows) o la tecla &#8220;Cmd&#8221; (en "
1648
+ "ambientes Mac)."
1649
+
1650
+ # @ tablepress
1651
+ #: views/view-export.php:147
1652
+ msgid "Export Format"
1653
+ msgstr "Formato de exportación"
1654
+
1655
+ # @ tablepress
1656
+ #: views/view-export.php:160
1657
+ msgid "CSV Delimiter"
1658
+ msgstr "CSV delimitado"
1659
+
1660
+ # @ tablepress
1661
+ #: views/view-export.php:169
1662
+ msgid "(Only needed for CSV export.)"
1663
+ msgstr "(Necesario unicamente en la exportación en formato CSV)"
1664
+
1665
+ # @ tablepress
1666
+ #: views/view-export.php:173
1667
+ msgid "ZIP file"
1668
+ msgstr "Archivo comprimido ZIP"
1669
+
1670
+ # @ tablepress
1671
+ #: views/view-export.php:179
1672
+ msgid "Create a ZIP archive."
1673
+ msgstr "Crear un archivo ZIP."
1674
+
1675
+ # @ tablepress
1676
+ #: views/view-export.php:179
1677
+ msgid "(Mandatory if more than one table is selected.)"
1678
+ msgstr "(Obligatorio si más de una tabla es seleccionada)"
1679
+
1680
+ # @ tablepress
1681
+ #: views/view-export.php:182
1682
+ msgid ""
1683
+ "Note: Support for ZIP file creation seems not to be available on this server."
1684
+ msgstr ""
1685
+ "Nota: La creación de archivos en formato ZIP parece no estar disponible en "
1686
+ "este servidor."
1687
+
1688
+ # @ tablepress
1689
+ #: views/view-import.php:44 views/view-import.php:56
1690
+ msgid "Error: You did not select what to import from WP-Table Reloaded!"
1691
+ msgstr "Error: No seleccionó que importar desde WP-Table Reloaded!"
1692
+
1693
+ # @ tablepress
1694
+ #: views/view-import.php:49
1695
+ msgid "Error: The import failed."
1696
+ msgstr "Error: La importación fracasó."
1697
+
1698
+ # @ tablepress
1699
+ #: views/view-import.php:50
1700
+ msgid "Error: Import of ZIP files is not available on this server."
1701
+ msgstr ""
1702
+ "Error: La importación de archivos ZIP no está disponible en su servidor."
1703
+
1704
+ # @ tablepress
1705
+ #: views/view-import.php:51
1706
+ msgid "Error: The ZIP file could not be opened."
1707
+ msgstr "Error: El archivo ZIP no puede ser abierto."
1708
+
1709
+ # @ tablepress
1710
+ #: views/view-import.php:52
1711
+ msgid "Error: The data in the ZIP file is invalid."
1712
+ msgstr "Error: La información en el archivo ZIP es inválida."
1713
+
1714
+ # @ tablepress
1715
+ #: views/view-import.php:54
1716
+ msgid "Error: The source for the import is invalid or could not be accessed."
1717
+ msgstr ""
1718
+ "Error: El lugar elegido para la importación es inválido o no puede ser "
1719
+ "localizado."
1720
+
1721
+ # @ tablepress
1722
+ #: views/view-import.php:55
1723
+ msgid "Error: The data for the import is invalid."
1724
+ msgstr "Error: La información de la importación es inválida."
1725
+
1726
+ # @ tablepress
1727
+ #: views/view-import.php:57
1728
+ msgid ""
1729
+ "Error: Existing WP-Table Reloaded tables were not found in the database."
1730
+ msgstr ""
1731
+ "Error: Tablas existentes WP-Table Reloaded no se encuentran en la base de "
1732
+ "datos."
1733
+
1734
+ # @ tablepress
1735
+ #: views/view-import.php:58
1736
+ msgid "Error: The tables from WP-Table Reloaded could not be imported."
1737
+ msgstr ""
1738
+ "Error: Las tablas provenientes de WP-Table Reloaded no pueden ser importadas."
1739
+
1740
+ # @ tablepress
1741
+ #: views/view-import.php:59
1742
+ msgid "Error: The WP-Table Reloaded Dump File could not be imported!"
1743
+ msgstr "Error: El archivo de volcado WP-Table Reloaded no se puede importar!"
1744
+
1745
+ # @ tablepress
1746
+ #: views/view-import.php:63
1747
+ msgid "Import Tables"
1748
+ msgstr "Importar tablas"
1749
+
1750
+ # @ tablepress
1751
+ #: views/view-import.php:65
1752
+ msgid "Import from WP-Table Reloaded"
1753
+ msgstr "Importar desde WP-Table Reloaded"
1754
+
1755
+ # @ tablepress
1756
+ #: views/view-import.php:98
1757
+ msgid ""
1758
+ "You can also import existing tables from the WP-Table Reloaded plugin below."
1759
+ msgstr ""
1760
+ "También puede importar tablas desde la siguiente extensión WP-Table Reloaded."
1761
+
1762
+ # @ tablepress
1763
+ #: views/view-import.php:102
1764
+ msgid ""
1765
+ "To import a table, select and enter the import source in the following form."
1766
+ msgstr ""
1767
+ "Para importar una tabla, seleccione e ingrese la información pertinente en "
1768
+ "el siguiente formulario:"
1769
+
1770
+ # @ tablepress
1771
+ #: views/view-import.php:126 views/view-import.php:251
1772
+ msgid "Import Source"
1773
+ msgstr "Origen de la importación"
1774
+
1775
+ # @ tablepress
1776
+ #: views/view-import.php:128
1777
+ msgid "File Upload"
1778
+ msgstr "Carga de archivo"
1779
+
1780
+ # @ tablepress
1781
+ #: views/view-import.php:129
1782
+ msgid "URL"
1783
+ msgstr "URL"
1784
+
1785
+ # @ tablepress
1786
+ #: views/view-import.php:130
1787
+ msgid "File on server"
1788
+ msgstr "Archivo en servidor"
1789
+
1790
+ # @ tablepress
1791
+ #: views/view-import.php:131
1792
+ msgid "Manual Input"
1793
+ msgstr "Ingreso manual"
1794
+
1795
+ # @ tablepress
1796
+ #: views/view-import.php:135 views/view-import.php:258
1797
+ msgid "Select file"
1798
+ msgstr "Seleccionar un archivo"
1799
+
1800
+ # @ tablepress
1801
+ #: views/view-import.php:140 views/view-import.php:151
1802
+ #: views/view-import.php:162
1803
+ msgid "You can import multiple tables by placing them in a ZIP file."
1804
+ msgstr "Puede importar mútliples tablas disponiéndolas en un archivo ZIP."
1805
+
1806
+ # @ tablepress
1807
+ #: views/view-import.php:146
1808
+ msgid "File URL"
1809
+ msgstr "URL del archivo"
1810
+
1811
+ # @ tablepress
1812
+ #: views/view-import.php:157
1813
+ msgid "Server Path to file"
1814
+ msgstr "Dirección del archivo en el servidor"
1815
+
1816
+ # @ tablepress
1817
+ #: views/view-import.php:168
1818
+ msgid "Import data"
1819
+ msgstr "Importar información"
1820
+
1821
+ # @ tablepress
1822
+ #: views/view-import.php:174
1823
+ msgid "Import Format"
1824
+ msgstr "Formato de importación"
1825
+
1826
+ # @ tablepress
1827
+ #: views/view-import.php:186
1828
+ msgid "Import of HTML files is not available on your server."
1829
+ msgstr "La importación de archivos HTML no está disponible en su servidor."
1830
+
1831
+ # @ tablepress
1832
+ #: views/view-import.php:194
1833
+ msgid "Add as new table"
1834
+ msgstr "Agregar como una nueva tabla"
1835
+
1836
+ # @ tablepress
1837
+ #: views/view-import.php:195
1838
+ msgid "Replace existing table"
1839
+ msgstr "Reemplazar tabla existente"
1840
+
1841
+ # @ tablepress
1842
+ #: views/view-import.php:203
1843
+ msgid "&mdash; Select &mdash;"
1844
+ msgstr "&mdash; Seleccionar &mdash;"
1845
+
1846
+ # @ tablepress
1847
+ #: views/view-import.php:241
1848
+ msgid ""
1849
+ "To import all tables from a WP-Table Reloaded installation, choose the "
1850
+ "relevant import source below."
1851
+ msgstr ""
1852
+ "Para importar todas las tablas desde una instalación WP-Table Reloaded, "
1853
+ "elija el sitio de origen desde domde importar."
1854
+
1855
+ # @ tablepress
1856
+ #: views/view-import.php:243
1857
+ msgid ""
1858
+ "If WP-Table Reloaded is installed on this site, the &#8220;WordPress "
1859
+ "database&#8221; option is recommended."
1860
+ msgstr ""
1861
+ "Si WP-Table Reloaded está instalado en este sitio, la opción &#8220;Base de "
1862
+ "datos WordPress&#8221; es recomendada."
1863
+
1864
+ # @ tablepress
1865
+ #: views/view-import.php:244
1866
+ msgid ""
1867
+ "If you want to import tables from another site, create a &#8220;WP-Table "
1868
+ "Reloaded Dump File&#8221; there and upload it below, after choosing &#8220;"
1869
+ "WP-Table Reloaded Dump File&#8221;."
1870
+ msgstr ""
1871
+ "Si quiere importar tablas desde otro sitio, cree un &#8220;archivo de "
1872
+ "volcado en WP-Table Reloaded&#8221; cárguelo, después de elegir &#8220;"
1873
+ "Archivo de volcado WP-Table Reloaded&#8221;."
1874
+
1875
+ # @ tablepress
1876
+ #: views/view-import.php:253
1877
+ msgid "WordPress database"
1878
+ msgstr "Base de datos Wordpress"
1879
+
1880
+ # @ tablepress
1881
+ #: views/view-import.php:254
1882
+ msgid "WP-Table Reloaded Dump File"
1883
+ msgstr "Archivo de volcado de WP-Table Reloaded"
1884
+
1885
+ # @ tablepress
1886
+ #: views/view-import.php:268
1887
+ msgid "Import tables"
1888
+ msgstr "Importar tablas"
1889
+
1890
+ # @ tablepress
1891
+ #: views/view-import.php:269
1892
+ msgid "Import all tables and their settings from WP-Table Reloaded."
1893
+ msgstr ""
1894
+ "Importar todas las tablas y sus configuraciones desde WP-Table Reloaded."
1895
+
1896
+ # @ tablepress
1897
+ #: views/view-import.php:269
1898
+ msgid "<span class=\"description\">(recommended)</span>"
1899
+ msgstr "<span class=\"descripción\">(recomendado)</span>"
1900
+
1901
+ # @ tablepress
1902
+ #: views/view-import.php:272
1903
+ msgid "Import styling"
1904
+ msgstr "Importar estilos"
1905
+
1906
+ # @ tablepress
1907
+ #: views/view-import.php:273
1908
+ msgid ""
1909
+ "Try to automatically convert the &#8220;Custom CSS&#8221; code from the "
1910
+ "&#8220;Plugin Options&#8221; screen of WP-Table Reloaded."
1911
+ msgstr ""
1912
+ "Trate de convertir automáticamente el código &#8220;CSS personalizado&#8221; "
1913
+ "desde las &#8220;Opciones de la extensión&#8221; de WP-Table Reloaded."
1914
+
1915
+ # @ tablepress
1916
+ #: views/view-import.php:294
1917
+ msgid "TablePress Feature: Import from WP-Table Reloaded"
1918
+ msgstr "Función TablePress: Importar desde WP-Table Reloaded."
1919
+
1920
+ # @ tablepress
1921
+ #: views/view-list.php:45
1922
+ msgid "To embed this table into a post or page, use this Shortcode:"
1923
+ msgstr ""
1924
+ "Para incrustar esta tabla en un artículo o página, utilice este código "
1925
+ "abreviado:"
1926
+
1927
+ # @ tablepress
1928
+ #: views/view-list.php:46
1929
+ msgid ""
1930
+ "Thank you very much! Your donation is highly appreciated. You just "
1931
+ "contributed to the further development of TablePress!"
1932
+ msgstr ""
1933
+ "Muchas gracias! Su donación es altamente apreciada. Ha contribuido al "
1934
+ "desarrollo de TablePress!"
1935
+
1936
+ # @ tablepress
1937
+ #: views/view-list.php:53
1938
+ msgid "Welcome!"
1939
+ msgstr "Bienvenido!"
1940
+
1941
+ # @ tablepress
1942
+ #: views/view-list.php:54
1943
+ msgid "Thank you for using TablePress for the first time!"
1944
+ msgstr "Gracias por utilizar TablePress por primera vez!"
1945
+
1946
+ # @ tablepress
1947
+ #: views/view-list.php:55
1948
+ #, php-format
1949
+ msgid ""
1950
+ "If you encounter any questions or problems, please visit the <a href=\"%1$s"
1951
+ "\">FAQ</a>, the <a href=\"%2$s\">documentation</a>, and the <a href=\"%3$s"
1952
+ "\">Support</a> section on the <a href=\"%4$s\">plugin website</a>."
1953
+ msgstr ""
1954
+ "Si posee alguna pregunta o problema, por favor, visite las <a href=\"%1$s"
1955
+ "\">FAQ</a>, la <a href=\"%2$s\">documentación</a> y <a href=\"%3$s\">Ayuda</"
1956
+ "a> en el <a href=\"%4$s\">sitio de internet de la extensión</a>."
1957
+
1958
+ # @ tablepress
1959
+ #: views/view-list.php:56 views/view-list.php:93
1960
+ msgid "Hide this message"
1961
+ msgstr "Ocultar este mensaje"
1962
+
1963
+ # @ tablepress
1964
+ #: views/view-list.php:62
1965
+ msgid "Attention!"
1966
+ msgstr "Atención!"
1967
+
1968
+ # @ tablepress
1969
+ #: views/view-list.php:63
1970
+ msgid ""
1971
+ "You have activated the plugin WP-Table Reloaded, which can not be used "
1972
+ "together with TablePress."
1973
+ msgstr ""
1974
+ "Ha activado la extensión WP-Table Reloaded, que no puede ser usada al mismo "
1975
+ "tiempo que TablePress."
1976
+
1977
+ # @ tablepress
1978
+ #: views/view-list.php:64
1979
+ msgid ""
1980
+ "It is strongly recommended that you switch from WP-Table Reloaded to "
1981
+ "TablePress, which not only fixes many problems, but also has more and better "
1982
+ "features than WP-Table Reloaded."
1983
+ msgstr ""
1984
+ "Es altamente recomendable que migre desde WP-Table Reloaded a TablePress, "
1985
+ "que no solo corrige diversos problemas, sino que posee más y mejores "
1986
+ "funciones que WP-Table Reloaded."
1987
+
1988
+ # @ tablepress
1989
+ #: views/view-list.php:66
1990
+ msgid "Import your tables from WP-Table Reloaded"
1991
+ msgstr "Importar sus tablas desde WP-Table Reloaded"
1992
+
1993
+ # @ tablepress
1994
+ #: views/view-list.php:73
1995
+ msgid "Tobias Bäthge, developer of TablePress"
1996
+ msgstr "Tobias Bäthge, desarrollador de TablePress"
1997
+
1998
+ # @ tablepress
1999
+ #: views/view-list.php:77
2000
+ #, php-format
2001
+ msgid ""
2002
+ "<a href=\"%s\">Donations</a> help me to continue user support and "
2003
+ "development of this <em>free</em> software &mdash; things for which I spend "
2004
+ "countless hours of my free time! Thank you very much!"
2005
+ msgstr ""
2006
+ "Las <a href=\"%s\">donaciones</a> me ayudan a continuar dando ayuda a los "
2007
+ "usuarios y a desarrollar estas aplicaciones <em>gratuitas</em> &mdash; cosas "
2008
+ "por los cuales consumen incontables horas de mi tiempo libre. Muchas gracias!"
2009
+
2010
+ # @ tablepress
2011
+ #: views/view-list.php:78
2012
+ msgid "Sincerly, Tobias"
2013
+ msgstr "Sinceramente, Tobias"
2014
+
2015
+ # @ tablepress
2016
+ #: views/view-list.php:80
2017
+ msgid "I already donated."
2018
+ msgstr "Ya doné."
2019
+
2020
+ # @ tablepress
2021
+ #: views/view-list.php:86
2022
+ #, php-format
2023
+ msgid "Thank you for updating to TablePress %s!"
2024
+ msgstr "Gracias por actualizarte a TablePress %s !"
2025
+
2026
+ # @ tablepress
2027
+ #: views/view-list.php:90
2028
+ #, php-format
2029
+ msgid ""
2030
+ "Please read the <a href=\"%s\">release announcement</a> for more information."
2031
+ msgstr ""
2032
+ "Por favor, lea los <a href=\"%s\">anuncios de actualizaciones</a> para más "
2033
+ "información."
2034
+
2035
+ # @ tablepress
2036
+ #: views/view-list.php:91
2037
+ #, php-format
2038
+ msgid ""
2039
+ "If you like the new features and enhancements, <a href=\"%s\">giving a "
2040
+ "donation</a> towards the further support and development of TablePress is "
2041
+ "recommended. Thank you!"
2042
+ msgstr ""
2043
+ "Si le gustan las nuevas funciones y mejoras, <a href=\"%s\">dar una "
2044
+ "donación</a> para un mejor soporte, más aun, el desarrollo de TablePress es "
2045
+ "recomendado. Gracias!"
2046
+
2047
+ # @ tablepress
2048
+ #: views/view-list.php:98 views/view-list.php:99
2049
+ msgid "The table was deleted successfully."
2050
+ msgid_plural "The tables were deleted successfully."
2051
+ msgstr[0] "La tabla fue borrada exitosamente."
2052
+ msgstr[1] "Las tablas fueron borradas exitosamente."
2053
+
2054
+ # @ tablepress
2055
+ #: views/view-edit.php:50 views/view-list.php:102 views/view-list.php:103
2056
+ msgid "The table was copied successfully."
2057
+ msgid_plural "The tables were copied successfully."
2058
+ msgstr[0] "La tabla fue copiada exitosamente."
2059
+ msgstr[1] "Las tablas fueron copiadas exitosamente."
2060
+
2061
+ # @ tablepress
2062
+ #: views/view-list.php:104
2063
+ msgid "Error: The table could not be copied."
2064
+ msgstr "Error: La tabla no puede copiarse."
2065
+
2066
+ # @ tablepress
2067
+ #: views/view-list.php:105
2068
+ msgid "Error: You did not specify a valid table ID."
2069
+ msgstr "Error: No especificó un ID de tabla válido."
2070
+
2071
+ # @ tablepress
2072
+ #: views/view-list.php:107
2073
+ msgid "Error: This bulk action is invalid!"
2074
+ msgstr "Error: Esta acción en conjunto es inválida!"
2075
+
2076
+ # @ tablepress
2077
+ #: views/view-list.php:108
2078
+ msgid "Error: You did not select any tables!"
2079
+ msgstr "Error: No seleccionó ninguna tabla!"
2080
+
2081
+ # @ tablepress
2082
+ #: views/view-list.php:109
2083
+ msgid "Notice: Not all selected tables could be deleted!"
2084
+ msgstr "Nota: No todas las tablas seleccionadas pueden ser borradas!"
2085
+
2086
+ # @ tablepress
2087
+ #: views/view-list.php:110
2088
+ msgid "Notice: Not all selected tables could be copied!"
2089
+ msgstr "Nota: No todas las tablas seleccionadas pueden ser copiadas!"
2090
+
2091
+ # @ tablepress
2092
+ #: views/view-list.php:111
2093
+ msgid "The tables were imported successfully."
2094
+ msgstr "Las tablas se importaron exitosamente."
2095
+
2096
+ # @ tablepress
2097
+ #: views/view-list.php:112
2098
+ msgid "The tables were imported successfully from WP-Table Reloaded."
2099
+ msgstr "Las tablas fueron importadas exitosamente desde WP-Table Reloaded."
2100
+
2101
+ # @ tablepress
2102
+ #: views/view-list.php:118
2103
+ msgid "Tables"
2104
+ msgstr "Tablas"
2105
+
2106
+ # @ tablepress
2107
+ #: views/view-list.php:184
2108
+ msgid "This is a list of your tables."
2109
+ msgstr "Esta es la lista de sus tablas."
2110
+
2111
+ # @ tablepress
2112
+ #: views/view-list.php:185
2113
+ msgid ""
2114
+ "Click the corresponding links within the list to edit, copy, delete, or "
2115
+ "preview a table."
2116
+ msgstr ""
2117
+ "Cliquee los enlaces correspondientes dentro de la lista para editar, copiar, "
2118
+ "borrar o previsualizar una tabla."
2119
+
2120
+ # @ tablepress
2121
+ #: views/view-list.php:189
2122
+ msgid "Each table has a unique ID that needs to be adjusted in that Shortcode."
2123
+ msgstr ""
2124
+ "Cada tabla tiene un ID único que necesita ser ajustado en este código "
2125
+ "abreviado."
2126
+
2127
+ # @ tablepress
2128
+ #: views/view-list.php:323
2129
+ msgid "Author"
2130
+ msgstr "Autor"
2131
+
2132
+ # @ tablepress
2133
+ #: views/view-list.php:324
2134
+ msgid "Last Modified By"
2135
+ msgstr "Ultima modificación por"
2136
+
2137
+ # @ tablepress
2138
+ #: views/view-list.php:414 views/view-list.php:421
2139
+ #, php-format
2140
+ msgid "Edit &#8220;%s&#8221;"
2141
+ msgstr "Editar &#8220;%s&#8221;"
2142
+
2143
+ # @ tablepress
2144
+ #: views/view-list.php:423
2145
+ msgid "Show Shortcode"
2146
+ msgstr "Código abreviado"
2147
+
2148
+ # @ tablepress
2149
+ #: views/view-list.php:425
2150
+ #, php-format
2151
+ msgid "Copy &#8220;%s&#8221;"
2152
+ msgstr "Copiar &#8220;%s&#8221;"
2153
+
2154
+ # @ tablepress
2155
+ #: views/view-list.php:425
2156
+ msgid "Copy"
2157
+ msgstr "Copiar"
2158
+
2159
+ # @ tablepress
2160
+ #: views/view-list.php:428
2161
+ #, php-format
2162
+ msgid "Export &#8220;%s&#8221;"
2163
+ msgstr "Exportar &#8220;%s&#8221;"
2164
+
2165
+ # @ tablepress
2166
+ #: views/view-list.php:431
2167
+ #, php-format
2168
+ msgid "Delete &#8220;%s&#8221;"
2169
+ msgstr "Borrar &#8220;%s&#8221;"
2170
+
2171
+ # @ tablepress
2172
+ #: views/view-list.php:434
2173
+ #, php-format
2174
+ msgid "Show a preview of &#8220;%s&#8221;"
2175
+ msgstr "Mostrar una previsualización de &#8220;%s&#8221;"
2176
+
2177
+ # @ tablepress
2178
+ #: views/view-list.php:553
2179
+ msgid "Bulk Actions"
2180
+ msgstr "Acciones en conjunto"
2181
+
2182
+ # @ tablepress
2183
+ #: views/view-list.php:558
2184
+ msgid "Apply"
2185
+ msgstr "Aplicar"
2186
+
2187
+ # @ tablepress
2188
+ #: views/view-list.php:579
2189
+ #, php-format
2190
+ msgid "You should <a href=\"%s\">add</a> a table to get started!"
2191
+ msgstr "Debe <a href=\"%s\">agregar</a> una tabla para comenzar!"
2192
+
2193
+ # @ tablepress
2194
+ #: views/view-list.php:581
2195
+ #, php-format
2196
+ msgid "You should <a href=\"%s\">import</a> a table to get started!"
2197
+ msgstr "Debe <a href=\"%s\">importar</a> una tabla para comenzar!"
2198
+
2199
+ # @ tablepress
2200
+ #: views/view-options.php:44
2201
+ msgid "Options saved successfully."
2202
+ msgstr "Opciones guardadas exitosamente."
2203
+
2204
+ # @ tablepress
2205
+ #: views/view-options.php:45
2206
+ msgid ""
2207
+ "Options saved successfully, but &#8220;Custom CSS&#8221; was not saved to "
2208
+ "file."
2209
+ msgstr ""
2210
+ "Opciones guardadas exitosamente, pero el &#8220;CSS personalizado&#8221; no "
2211
+ "fue guardado en un archivo."
2212
+
2213
+ # @ tablepress
2214
+ #: views/view-options.php:46
2215
+ msgid "Error: Options could not be saved."
2216
+ msgstr "Error: las opciones no se pudieron guardar."
2217
+
2218
+ # @ tablepress
2219
+ #: views/view-options.php:47
2220
+ msgid ""
2221
+ "The WP-Table Reloaded &#8220;Custom CSS&#8221; was imported successfully."
2222
+ msgstr ""
2223
+ "El código &#8220;CSS personalizado&#8221; de WP-Table Reloaded fue importado "
2224
+ "exitosamente."
2225
+
2226
+ # @ tablepress
2227
+ #: views/view-options.php:52
2228
+ msgid "Frontend Options"
2229
+ msgstr "Opciones inicio del proceso"
2230
+
2231
+ # @ tablepress
2232
+ #: views/view-options.php:54
2233
+ msgid "User Options"
2234
+ msgstr "Opciones de usuario"
2235
+
2236
+ # @ tablepress
2237
+ #: views/view-options.php:73
2238
+ msgid ""
2239
+ "TablePress has several options which affect the plugin&#8217;s behavior in "
2240
+ "different areas."
2241
+ msgstr ""
2242
+ "TablePress posee varias opciones el cual afecta al desenvolvimiento de la "
2243
+ "extensión en diferentes areas."
2244
+
2245
+ # @ tablepress
2246
+ #: views/view-options.php:78
2247
+ msgid ""
2248
+ "Frontend Options influence the styling of tables in pages, posts, or text "
2249
+ "widgets, by defining which CSS code shall be loaded."
2250
+ msgstr ""
2251
+ "Las opciones inicio del proceso influencian el estilo y apariencia de las "
2252
+ "tablas en las páginas, artículos o widgets de texto, simplemente eligiendo "
2253
+ "que código CSS debe ser cargado."
2254
+
2255
+ # @ tablepress
2256
+ #: views/view-options.php:81
2257
+ msgid ""
2258
+ "In the User Options, every TablePress user can choose the position of the "
2259
+ "plugin in his WordPress admin menu, and his desired plugin language."
2260
+ msgstr ""
2261
+ "En las opciones de usuario, cada usuario TablePress puede elegir la posición "
2262
+ "de la extensión en el menú del administrador en Wordpress y en que idioma."
2263
+
2264
+ # @ tablepress
2265
+ #: views/view-options.php:100
2266
+ msgid "Custom CSS"
2267
+ msgstr "CSS personalizado"
2268
+
2269
+ # @ tablepress
2270
+ #: views/view-options.php:101
2271
+ msgid ""
2272
+ "Load these &#8220;Custom CSS&#8221; commands to influence the table styling:"
2273
+ msgstr ""
2274
+ "Cargue estos comandos &#8220;CSS personalizados&#8221; para dar formato a la "
2275
+ "apariencia de la tabla:"
2276
+
2277
+ # @ tablepress
2278
+ #: views/view-options.php:155
2279
+ msgid "Top-Level (top)"
2280
+ msgstr "Nivel superior (arriba)"
2281
+
2282
+ # @ tablepress
2283
+ #: views/view-options.php:156
2284
+ msgid "Top-Level (middle)"
2285
+ msgstr "Nivel medio (medio)"
2286
+
2287
+ # @ tablepress
2288
+ #: views/view-options.php:157
2289
+ msgid "Top-Level (bottom)"
2290
+ msgstr "Nivel inferior (final)"
2291
+
2292
+ # @ tablepress
2293
+ #: views/view-options.php:166
2294
+ msgid "Admin menu entry"
2295
+ msgstr "Menú de entrada del Administrador"
2296
+
2297
+ # @ tablepress
2298
+ #: views/view-options.php:167
2299
+ #, php-format
2300
+ msgid "TablePress shall be shown in this section of my admin menu: %s"
2301
+ msgstr "TablePress se muestra en esta sección en su menú de administrador: %s"
2302
+
2303
+ # @ tablepress
2304
+ #: views/view-options.php:171
2305
+ #, php-format
2306
+ msgid "WordPress Default (currently %s)"
2307
+ msgstr "Parámetros WordPress (actualmente %s)"
2308
+
2309
+ # @ tablepress
2310
+ #: views/view-options.php:179
2311
+ msgid "Plugin Language"
2312
+ msgstr "Lenguaje de la extensión"
2313
+
2314
+ # @ tablepress
2315
+ #: views/view-options.php:180
2316
+ #, php-format
2317
+ msgid "I want to use TablePress in this language: %s"
2318
+ msgstr "Quiero utilizar TablePress en este lenguaje: %s"
2319
+
2320
+ # @ tablepress
2321
+ #: views/view-options_custom_css.php:39
2322
+ msgid ""
2323
+ "Attention: Further action is required to save the changes to your &#8220;"
2324
+ "Custom CSS&#8221;!"
2325
+ msgstr ""
2326
+ "Atención: se necesitan más acciones para guardar los cambios en su &#8220;"
2327
+ "código CSS personalizado&#8221; !"
2328
+
2329
+ # @ tablepress
2330
+ #: views/view-options_custom_css.php:108
2331
+ msgid ""
2332
+ "Due to the configuration of your server, TablePress was not able to "
2333
+ "automatically save your &#8220;Custom CSS&#8221; to a file."
2334
+ msgstr ""
2335
+ "Dada la configuración de su servidor, TablePress no pudo guardar "
2336
+ "automáticamente su &#8220;códido CSS personalizado&#8221; en un archivo."
2337
+
2338
+ # @ tablepress
2339
+ #: views/view-options_custom_css.php:109
2340
+ #, php-format
2341
+ msgid ""
2342
+ "To try again with the same method that you use for updating plugins or "
2343
+ "themes, please fill out the &#8220;%s&#8221; form below."
2344
+ msgstr ""
2345
+ "Para utilizar el mismo método que utiliza para actualizar sus temas y "
2346
+ "extensiones, por favor, rellene el siguiente &#8220;%s&#8221; formulario."
2347
+
2348
+ # @ default
2349
+ #: views/view-options_custom_css.php:109
2350
+ msgid "Connection Information"
2351
+ msgstr "Información sobre la conexión"
2352
+
2353
+ # @ tablepress
2354
+ #: views/view-options_custom_css.php:136
2355
+ msgid "Proceed without saving a file"
2356
+ msgstr "Proceder sin guardar un archivo"
2357
+
2358
+ # @ tablepress
2359
+ #: views/view-options_custom_css.php:138
2360
+ msgid ""
2361
+ "To proceed without trying to save the &#8220;Custom CSS&#8221; to a file, "
2362
+ "click the button below."
2363
+ msgstr ""
2364
+ "Para proceder sin tratar de guardar el código &#8220;CSS "
2365
+ "personalizado&#8221; a un archivo, cliquee en el botón posterior."
2366
+
2367
+ # @ tablepress
2368
+ #: views/view-options_custom_css.php:139
2369
+ msgid "Your &#8220;Custom CSS&#8221; will then be loaded inline."
2370
+ msgstr "Su &#8220;CSS personalizado&#8221; después será cargado."
2371
+
2372
+ # @ tablepress
2373
+ #: views/view-options_custom_css.php:141
2374
+ msgid "Proceed without saving &#8220;Custom CSS&#8221; to a file"
2375
+ msgstr "Proceder sin guardar el &#8220;CSS personalizado&#8221; a un archivo"
2376
+
2377
+ # @ tablepress
2378
+ #: controllers/controller-admin_ajax.php:270 views/view-preview_table.php:64
2379
+ msgid ""
2380
+ "Because of CSS styling in your theme, the table might look different on your "
2381
+ "page!"
2382
+ msgstr ""
2383
+ "Debido al formato de código CSS en su tema, la tabla puede verse diferente "
2384
+ "en su página!"
2385
+
2386
+ # @ tablepress
2387
+ #: controllers/controller-admin_ajax.php:271 views/view-preview_table.php:64
2388
+ msgid ""
2389
+ "The features of the DataTables JavaScript library are also not available or "
2390
+ "visible in this preview!"
2391
+ msgstr ""
2392
+ "Las funcionalidades de la bilblioteca Javascript DataTables no está "
2393
+ "disponible o visible en esta previsualización!"
2394
+
2395
+ # @ tablepress
2396
+ #: controllers/controller-admin.php:462
2397
+ msgctxt ""
2398
+ "Default CSV delimiter in the translated language (\";\", \",\", or \"tab\")"
2399
+ msgid ","
2400
+ msgstr ";"
2401
+
2402
+ # @ tablepress
2403
+ #: controllers/controller-admin.php:559
2404
+ msgid "French"
2405
+ msgstr "Francés"
2406
+
2407
+ # @ tablepress
2408
+ #: controllers/controller-admin.php:629
2409
+ msgid "Chinese (Simplified)"
2410
+ msgstr "Chino"
2411
+
2412
+ # @ tablepress
2413
+ #: controllers/controller-admin.php:713
2414
+ msgctxt "navigation bar"
2415
+ msgid "Import"
2416
+ msgstr "Importar"
2417
+
2418
+ # @ tablepress
2419
+ #: controllers/controller-admin.php:720
2420
+ msgctxt "navigation bar"
2421
+ msgid "Export"
2422
+ msgstr "Exportar"
2423
+
2424
+ # @ tablepress
2425
+ #: views/view-about.php:81
2426
+ msgid "At first, you should add or import a table."
2427
+ msgstr "En un primer momento, debe agregar o importar una tabla."
2428
+
2429
+ # @ tablepress
2430
+ #: views/view-edit.php:80
2431
+ msgctxt "Insert Link dialog"
2432
+ msgid "Insert/edit link"
2433
+ msgstr "Insertar/editar enlace"
2434
+
2435
+ # @ tablepress
2436
+ #: views/view-edit.php:81
2437
+ msgctxt "Insert Link dialog"
2438
+ msgid "Update"
2439
+ msgstr "Actualizar"
2440
+
2441
+ # @ tablepress
2442
+ #: views/view-edit.php:82
2443
+ msgctxt "Insert Link dialog"
2444
+ msgid "Add Link"
2445
+ msgstr "Agregar enlace"
2446
+
2447
+ # @ tablepress
2448
+ #: views/view-edit.php:83
2449
+ msgctxt "Insert Link dialog"
2450
+ msgid "(no title)"
2451
+ msgstr "(sin título)"
2452
+
2453
+ # @ tablepress
2454
+ #: views/view-edit.php:84
2455
+ msgctxt "Insert Link dialog"
2456
+ msgid "No matches found."
2457
+ msgstr "No se han encontrado resultados."
2458
+
2459
+ # @ tablepress
2460
+ #: views/view-edit.php:86
2461
+ msgctxt "Insert Link dialog"
2462
+ msgid "Link Text"
2463
+ msgstr "Texto del enlace"
2464
+
2465
+ # @ tablepress
2466
+ #: views/view-edit.php:141 views/view-edit.php:195
2467
+ msgid "Insert into Table"
2468
+ msgstr "Insertar en la tabla"
2469
+
2470
+ # @ tablepress
2471
+ #: views/view-edit.php:411 views/view-edit.php:417
2472
+ msgid "Duplicate"
2473
+ msgstr "Duplicar"
2474
+
2475
+ # @ tablepress
2476
+ #: views/view-export.php:47
2477
+ msgctxt "button"
2478
+ msgid "Download Export File"
2479
+ msgstr "Descargar Archivo de Exportación"
2480
+
2481
+ # @ tablepress
2482
+ #: views/view-import.php:223
2483
+ msgctxt "button"
2484
+ msgid "Import"
2485
+ msgstr "Importar"
2486
+
2487
+ # @ tablepress
2488
+ #: views/view-import.php:277
2489
+ msgctxt "button"
2490
+ msgid "Import from WP-Table Reloaded"
2491
+ msgstr "Importar desde WP-Table Reloaded"
2492
+
2493
+ # @ tablepress
2494
+ #: views/view-import.php:295
2495
+ msgid ""
2496
+ "You can import your existing tables and &#8220;Custom CSS&#8221; from WP-"
2497
+ "Table Reloaded into TablePress."
2498
+ msgstr ""
2499
+ "Puede importar sus tablas y su código &#8220;CSS personalizado&#8221; desde "
2500
+ "WP-Table Reloaded a TablePress."
2501
+
2502
+ # @ tablepress
2503
+ #: views/view-list.php:428
2504
+ msgctxt "row action"
2505
+ msgid "Export"
2506
+ msgstr "Exportar"
2507
+
2508
+ # @ tablepress
2509
+ #: views/view-list.php:513
2510
+ msgctxt "bulk action"
2511
+ msgid "Copy"
2512
+ msgstr "Copiar"
2513
+
2514
+ # @ tablepress
2515
+ #: views/view-list.php:516
2516
+ msgctxt "bulk action"
2517
+ msgid "Export"
2518
+ msgstr "Exportar"
2519
+
2520
+ # @ tablepress
2521
+ #: views/view-list.php:519
2522
+ msgctxt "bulk action"
2523
+ msgid "Delete"
2524
+ msgstr "Borrar"
2525
+
2526
+ # @ tablepress
2527
+ #: views/view-options.php:109
2528
+ #, php-format
2529
+ msgid ""
2530
+ "&#8220;Custom CSS&#8221; (<a href=\"%s\">Cascading Style Sheets</a>) can be "
2531
+ "used to change the styling or layout of a table."
2532
+ msgstr ""
2533
+ "&#8220;CSS personalizado&#8221; (<a href=\"%s\">Cascading Style Sheets</a>) "
2534
+ "puede ser usado para cambiar el estilo o la disposición de una tabla."
2535
+
2536
+ # @ tablepress
2537
+ #: views/view-options.php:111
2538
+ #, php-format
2539
+ msgid "You can get styling examples from the <a href=\"%s\">FAQ</a>."
2540
+ msgstr ""
2541
+ "Puedes ver ejemplos de estilos en las <a href=\"%s\">Preguntas Frecuentes</"
2542
+ "a>."
2543
+
2544
+ # @ tablepress
2545
+ #: views/view-options.php:113
2546
+ #, php-format
2547
+ msgid ""
2548
+ "Information on available CSS selectors can be found in the <a href=\"%s"
2549
+ "\">documentation</a>."
2550
+ msgstr ""
2551
+ "Información sobre los selectors CSS disponibles puede ser encontrada en la "
2552
+ "<a href=\"%s\">documentación</a>."
2553
+
2554
+ # @ tablepress
2555
+ #: controllers/controller-admin.php:549
2556
+ msgid "Spanish"
2557
+ msgstr "Español"
2558
+
2559
+ # @ tablepress
2560
+ #: controllers/controller-admin.php:539
2561
+ msgid "German"
2562
+ msgstr "Alemán"
2563
+
2564
+ # @ tablepress
2565
+ #: classes/class-import.php:85
2566
+ msgid "XLS - Microsoft Excel 97-2003 (experimental)"
2567
+ msgstr "XLS - Microsoft Excel 97-2003 (experimental)"
2568
+
2569
+ # @ tablepress
2570
+ #: classes/class-import.php:86
2571
+ msgid "XLSX - Microsoft Excel 2007-2013 (experimental)"
2572
+ msgstr "XLSX - Microsoft Excel 2007-2013 (experimental)"
2573
+
2574
+ # @ tablepress
2575
+ #: classes/class-tablepress.php:363
2576
+ msgid "<em>unknown</em>"
2577
+ msgstr "<em>desconocido</em>"
2578
+
2579
+ # @ tablepress
2580
+ #: controllers/controller-admin.php:554
2581
+ msgid "Finnish"
2582
+ msgstr "Finlandés"
2583
+
2584
+ # @ tablepress
2585
+ #: controllers/controller-admin.php:564
2586
+ msgid "Hebrew"
2587
+ msgstr "Hebreo"
2588
+
2589
+ # @ tablepress
2590
+ #: controllers/controller-admin.php:569
2591
+ msgid "Italian"
2592
+ msgstr "Italiano"
2593
+
2594
+ # @ tablepress
2595
+ #: controllers/controller-admin.php:574
2596
+ msgid "Icelandic"
2597
+ msgstr "Islandés"
2598
+
2599
+ # @ tablepress
2600
+ #: controllers/controller-admin.php:579
2601
+ msgid "Japanese"
2602
+ msgstr "Japonés"
2603
+
2604
+ # @ tablepress
2605
+ #: controllers/controller-admin.php:584
2606
+ msgid "Latvian"
2607
+ msgstr "Letón"
2608
+
2609
+ # @ tablepress
2610
+ #: controllers/controller-admin.php:589
2611
+ msgid "Dutch"
2612
+ msgstr "Neerlandés"
2613
+
2614
+ # @ tablepress
2615
+ #: controllers/controller-admin.php:594
2616
+ msgid "Polish"
2617
+ msgstr "Polaco"
2618
+
2619
+ # @ tablepress
2620
+ #: controllers/controller-admin.php:599
2621
+ msgid "Brazilian Portuguese"
2622
+ msgstr "Portugués de Brasil"
2623
+
2624
+ # @ tablepress
2625
+ #: controllers/controller-admin.php:604
2626
+ msgid "Russian"
2627
+ msgstr "Ruso"
2628
+
2629
+ # @ tablepress
2630
+ #: controllers/controller-admin.php:609
2631
+ msgid "Slovak"
2632
+ msgstr "Eslovaco"
2633
+
2634
+ # @ tablepress
2635
+ #: controllers/controller-admin.php:619
2636
+ msgid "Turkish"
2637
+ msgstr "Turco"
2638
+
2639
+ # @ tablepress
2640
+ #: controllers/controller-admin.php:634
2641
+ msgid "Chinese (Taiwan)"
2642
+ msgstr "Chino (taiwanés)"
2643
+
2644
+ # @ tablepress
2645
+ #: controllers/controller-admin.php:2054
2646
+ msgid "TablePress was uninstalled successfully."
2647
+ msgstr "TablePress fue desinstalado exitosamente."
2648
+
2649
+ # @ tablepress
2650
+ #: controllers/controller-admin.php:2055
2651
+ msgid "All tables, data, and options were deleted."
2652
+ msgstr "Todas las tablas, los datos y las opciones fueron eliminadas."
2653
+
2654
+ # @ tablepress
2655
+ #: controllers/controller-admin.php:2057
2656
+ msgid ""
2657
+ "You may now ask the network admin to delete the plugin&#8217;s folder "
2658
+ "<code>tablepress</code> from the server, if no other site in the network "
2659
+ "uses it."
2660
+ msgstr ""
2661
+ "Ahora deberías pedirle al administrador de la red que elimine la carpeta del "
2662
+ "plugin <code>tablepress</code> del servidor, si ningún otro sitio en la red "
2663
+ "la usa."
2664
+
2665
+ # @ tablepress
2666
+ #: controllers/controller-admin.php:2059
2667
+ msgid ""
2668
+ "You may now manually delete the plugin&#8217;s folder <code>tablepress</"
2669
+ "code> from the <code>plugins</code> directory on your server or use the "
2670
+ "&#8220;Delete&#8221; link for TablePress on the WordPress &#8220;"
2671
+ "Plugins&#8221; page."
2672
+ msgstr ""
2673
+ "Ahora deberías eliminar manualmente la carpeta del plugin <code>tablepress</"
2674
+ "code> del directorio <code>plugins</code> en tu servidor, o usar el enlace "
2675
+ "&#8220;Borrar&#8221; con TablePress en la página de &#8220;Plugins&#8221; de "
2676
+ "Wordpress."
2677
+
2678
+ # @ tablepress
2679
+ #: controllers/controller-admin.php:2062
2680
+ msgid ""
2681
+ "Your TablePress &#8220;Custom CSS&#8221; files have been deleted "
2682
+ "automatically."
2683
+ msgstr ""
2684
+ "Tus archivos de &#8220;CSS Personalizado&#8221; de TablePress han sido "
2685
+ "eliminadas automáticamente."
2686
+
2687
+ # @ tablepress
2688
+ #: controllers/controller-admin.php:2065
2689
+ msgid ""
2690
+ "Please also ask him to delete your TablePress &#8220;Custom CSS&#8221; files "
2691
+ "from the server."
2692
+ msgstr ""
2693
+ "Por favor también pídele que borre tus archivos de &#8220;CSS "
2694
+ "Personalizado&#8221; de TablePress del servidor."
2695
+
2696
+ # @ tablepress
2697
+ #: controllers/controller-admin.php:2067
2698
+ msgid ""
2699
+ "You may now also delete your TablePress &#8220;Custom CSS&#8221; files in "
2700
+ "the <code>wp-content</code> folder."
2701
+ msgstr ""
2702
+ "Ahora también deberías eliminar tus archivos de &#8220;CSS "
2703
+ "Personalizado&#8221; de TablePress de la carpeta <code>wp-content</code>."
2704
+
2705
+ # @ tablepress
2706
+ #: controllers/controller-admin.php:2072
2707
+ msgid "Go to &#8220;Plugins&#8221; page"
2708
+ msgstr "Ir a la página &#8220;Plugins&#8221;"
2709
+
2710
+ # @ tablepress
2711
+ #: controllers/controller-admin.php:2074
2712
+ msgid "Go to Dashboard"
2713
+ msgstr "Ir al Escritorio"
2714
+
2715
+ # @ tablepress
2716
+ #: controllers/controller-admin.php:2076 views/view-options.php:197
2717
+ #: views/view-options.php:204
2718
+ msgid "Uninstall TablePress"
2719
+ msgstr "Desinstalar TablePress"
2720
+
2721
+ # @ tablepress
2722
+ #: views/view-about.php:82
2723
+ msgid ""
2724
+ "This means that you either let the plugin create an empty table for you or "
2725
+ "that you load an existing table from either a CSV, HTML, JSON, XLS, or XLSX "
2726
+ "file."
2727
+ msgstr ""
2728
+ "Esto significa que puedes dejar que el plugin cree una tabla vacía para ti, "
2729
+ "o bien que cargues una tabla existente desde un archivo CSV, HTML, JSON, XLS "
2730
+ "o XLSX."
2731
+
2732
+ # @ tablepress
2733
+ #: views/view-edit.php:50
2734
+ #, php-format
2735
+ msgid ""
2736
+ "You are now seeing the copied table, which has the table ID &#8220;%s&#8221;."
2737
+ msgstr ""
2738
+ "Estás viendo ahora la tabla copiada, que tiene el ID de tabla &#8220;"
2739
+ "%s&#8221;."
2740
+
2741
+ # @ tablepress
2742
+ #: views/view-edit.php:134
2743
+ msgid ""
2744
+ "Attention: You have enabled the usage of the DataTables JavaScript library "
2745
+ "for features like sorting, search, or pagination."
2746
+ msgstr ""
2747
+ "Atención: Has habilitado el uso de la biblioteca DataTables JavaScript para "
2748
+ "características como ordenación, búsqueda y paginación."
2749
+
2750
+ # @ tablepress
2751
+ #: views/view-edit.php:135
2752
+ msgid "Unfortunately, these can not be used in tables with combined cells."
2753
+ msgstr ""
2754
+ "Desafortunadamente estos no pueden ser usados en tablas con celdas "
2755
+ "combinadas."
2756
+
2757
+ # @ tablepress
2758
+ #: views/view-edit.php:136
2759
+ msgid ""
2760
+ "Do you want to proceed and automatically turn off the usage of DataTables "
2761
+ "for this table?"
2762
+ msgstr ""
2763
+ "¿Quieres proceder y deshabilitar automáticamente el uso de DataTables para "
2764
+ "esta tabla?"
2765
+
2766
+ # @ tablepress
2767
+ #: views/view-edit.php:477
2768
+ msgid "Copy Table"
2769
+ msgstr "Copiar Tabla"
2770
+
2771
+ # @ tablepress
2772
+ #: views/view-edit.php:559
2773
+ #, php-format
2774
+ msgid "Show the table name %s the table."
2775
+ msgstr "Mostrar el nombre de la tabla %s de la tabla."
2776
+
2777
+ # @ tablepress
2778
+ #: views/view-edit.php:569
2779
+ #, php-format
2780
+ msgid "Show the table description %s the table."
2781
+ msgstr "Mostrar la descripción de la tabla %s de la tabla."
2782
+
2783
+ # @ tablepress
2784
+ #: views/view-edit.php:696
2785
+ msgid "TablePress Feature: Moving rows and columns"
2786
+ msgstr "Característica de TablePress: Mover filas y columnas."
2787
+
2788
+ # @ tablepress
2789
+ #: views/view-edit.php:697
2790
+ msgid ""
2791
+ "Did you know? You can drag and drop rows and columns via the row number and "
2792
+ "the column title. And the arrows next to the column title can be used for "
2793
+ "sorting."
2794
+ msgstr ""
2795
+ "¿Sabías qué? Puedes arrastrar y soltar filas y columnas a través del número "
2796
+ "de fila y el título de la columna. Además las flechas junto al título de la "
2797
+ "columna pueden ser usadas para ordenación."
2798
+
2799
+ # @ tablepress
2800
+ #: views/view-editor_button_thickbox.php:176
2801
+ #, php-format
2802
+ msgid ""
2803
+ "Click the &#8220;%1$s&#8221; button for the desired table to automatically "
2804
+ "insert the<br />corresponding Shortcode (%2$s) into the editor."
2805
+ msgstr ""
2806
+ "Haz click en el botón &#8220;%1$s&#8221; en la tabla deseada para insertar "
2807
+ "automáticamente el<br />correspondiente Shortcode (%2$s) en el editor."
2808
+
2809
+ # @ tablepress
2810
+ #: views/view-import.php:53
2811
+ msgid ""
2812
+ "Error: You selected to replace or append to an existing table, but did not "
2813
+ "select a table."
2814
+ msgstr ""
2815
+ "Error: Elegiste reemplazar o adjuntar en una tabla existente, pero no "
2816
+ "elegiste ninguna tabla."
2817
+
2818
+ # @ tablepress
2819
+ #: views/view-import.php:97
2820
+ msgid ""
2821
+ "TablePress can import tables from existing data, like from a CSV, XLS, or "
2822
+ "XLSX file from a spreadsheet application (e.g. Excel), an HTML file "
2823
+ "resembling a webpage, or its own JSON format."
2824
+ msgstr ""
2825
+ "Tablepress puede importar tablas de datos existentes, como de archivos CSV, "
2826
+ "XLS o XLSX de una aplicación de planillas de cálculo (como Excel), un "
2827
+ "archivo HTML que se parezca a una página web, o en su propio formato JSON."
2828
+
2829
+ # @ tablepress
2830
+ #: views/view-import.php:105
2831
+ msgid ""
2832
+ "You can also choose to import it as a new table, to replace an existing "
2833
+ "table, or to append the rows to an existing table."
2834
+ msgstr ""
2835
+ "También puedes elegir importarlo como una nueva tabla, reemplazar una "
2836
+ "existente, o adjuntar las filas a una tabla existente."
2837
+
2838
+ # @ tablepress
2839
+ #: views/view-import.php:192
2840
+ msgid "Add, Replace, or Append?"
2841
+ msgstr "Insertar, Reemplazar, o Adjuntar?"
2842
+
2843
+ # @ tablepress
2844
+ #: views/view-import.php:196
2845
+ msgid "Append rows to existing table"
2846
+ msgstr "Adjuntar filas a una tabla existente"
2847
+
2848
+ # @ tablepress
2849
+ #: views/view-import.php:200
2850
+ msgid "Table to replace or append to"
2851
+ msgstr "Tabla a reemplazar o a adjuntarle"
2852
+
2853
+ # @ tablepress
2854
+ #: views/view-import.php:246
2855
+ #, php-format
2856
+ msgid ""
2857
+ "Before doing this, it is highly recommended to read the <a href=\"%s"
2858
+ "\">migration guide</a> on the TablePress website."
2859
+ msgstr ""
2860
+ "Antes de hacer esto, es muy recomendado que leas la <a href=\"%s\">guía de "
2861
+ "migración</a> en el sitio web de Tablepress."
2862
+
2863
+ # @ tablepress
2864
+ #: views/view-list.php:47
2865
+ #, php-format
2866
+ msgid ""
2867
+ "No problem! I still hope you enjoy the benefits that TablePress adds to your "
2868
+ "site. If you should change your mind, you&#8217;ll always find the &#8220;"
2869
+ "Donate&#8221; button on the <a href=\"%s\">TablePress website</a>."
2870
+ msgstr ""
2871
+ "¡No hay problema! Espero que todavía disfrutes de los beneficios que "
2872
+ "TablePress le agrega a tu sitio. Si cambias de opinión, siempre vas a "
2873
+ "encontrar el botón de &#8220;Donar&#8221; en el <a href=\"%s\">sitio web de "
2874
+ "TablePress</a>."
2875
+
2876
+ # @ tablepress
2877
+ #: views/view-list.php:65
2878
+ #, php-format
2879
+ msgid ""
2880
+ "Please follow the <a href=\"%s\">migration guide</a> to move your tables and "
2881
+ "then deactivate WP-Table Reloaded!"
2882
+ msgstr ""
2883
+ "¡Por favor sigue la <a href=\"%s\">guía de migración</a> para mover tus "
2884
+ "tablas y luego desactivar WP-Table Reloaded!"
2885
+
2886
+ # @ tablepress
2887
+ #: views/view-list.php:74
2888
+ msgid ""
2889
+ "Hi, my name is Tobias, I&#8217;m the developer of the TablePress plugin."
2890
+ msgstr "Hola, mi nombre es Tobías, soy un desarrollador del plugin TablePress."
2891
+
2892
+ # @ tablepress
2893
+ #: views/view-list.php:75
2894
+ msgid ""
2895
+ "Thanks for using it! You&#8217;ve installed TablePress over a month ago."
2896
+ msgstr "¡Gracias por usarlo! Instalaste TablePress hace más de un mes."
2897
+
2898
+ # @ tablepress
2899
+ #: views/view-list.php:76
2900
+ #, php-format
2901
+ msgid ""
2902
+ "If everything works and you are satisfied with the results of managing your "
2903
+ "%s table, isn&#8217;t that worth a coffee or two?"
2904
+ msgid_plural ""
2905
+ "If everything works and you are satisfied with the results of managing your "
2906
+ "%s tables, isn&#8217;t that worth a coffee or two?"
2907
+ msgstr[0] ""
2908
+ "Si todo funciona bien y estás satisfecho con los resultados del manejo de tu "
2909
+ "tabla %s, ¿eso no vale una taza de café o dos?"
2910
+ msgstr[1] ""
2911
+ "Si todo funciona bien y estás satisfecho con los resultados del manejo de "
2912
+ "tus tablas %s, ¿eso no vale una taza de café o dos?"
2913
+
2914
+ # @ tablepress
2915
+ #: views/view-list.php:79
2916
+ msgid "Sure, I&#8217;ll buy you a coffee and support TablePress!"
2917
+ msgstr "Seguro, ¡te compraré una taza de café y daré soporte a TablePress!"
2918
+
2919
+ # @ tablepress
2920
+ #: views/view-list.php:81
2921
+ msgid "No, thanks. Don&#8217;t ask again."
2922
+ msgstr "No, gracias. No me vuelvas a preguntar."
2923
+
2924
+ # @ tablepress
2925
+ #: views/view-list.php:102
2926
+ #, php-format
2927
+ msgid "The copied table has the table ID &#8220;%s&#8221;."
2928
+ msgstr "La tabla copiada tiene el ID de tabla &#8220;%s&#8221;."
2929
+
2930
+ # @ tablepress
2931
+ #: views/view-options.php:38
2932
+ msgid "Do you really want to uninstall TablePress and delete ALL data?"
2933
+ msgstr "¿Realmente quieres desinstalar TablePress y borrar TODOS los datos?"
2934
+
2935
+ # @ tablepress
2936
+ #: views/view-options.php:39
2937
+ msgid "Are you really sure?"
2938
+ msgstr "¿Estás realmente seguro?"
2939
+
2940
+ # @ tablepress
2941
+ #: views/view-options.php:115
2942
+ msgid ""
2943
+ "Please note that invalid CSS code will be stripped, if it can not be "
2944
+ "corrected automatically."
2945
+ msgstr ""
2946
+ "Por favor notar que el código CSS inválido va a ser despojado, si no puede "
2947
+ "ser corregido automáticamente."
2948
+
2949
+ # @ tablepress
2950
+ #: views/view-options.php:199
2951
+ msgid ""
2952
+ "Uninstalling <strong>will permanently delete</strong> all TablePress tables "
2953
+ "and options from the database."
2954
+ msgstr ""
2955
+ "Desinstalar <strong>va a borrar permanentemente</strong> todas las tablas "
2956
+ "TablePress y las opciones de la base de datos."
2957
+
2958
+ # @ tablepress
2959
+ #: views/view-options.php:200
2960
+ msgid ""
2961
+ "It is recommended that you create a backup of the tables (by exporting the "
2962
+ "tables in the JSON format), in case you later change your mind."
2963
+ msgstr ""
2964
+ "Es recomendado que hagas un respaldo de tus tablas (exportándolas en formato "
2965
+ "JSON), en caso de que luego cambies de opinión."
2966
+
2967
+ # @ tablepress
2968
+ #: views/view-options.php:201
2969
+ msgid ""
2970
+ "You will manually need to remove the plugin&#8217;s files from the plugin "
2971
+ "folder afterwards."
2972
+ msgstr ""
2973
+ "Necesitas remover manualmente los archivos del plugin de la carpeta del "
2974
+ "mismo luego."
2975
+
2976
+ # @ tablepress
2977
+ #: views/view-options.php:202
2978
+ msgid ""
2979
+ "Be very careful with this and only click the button if you know what you are "
2980
+ "doing!"
2981
+ msgstr ""
2982
+ "¡Ten cuidado con esto y sólo haz click en el botón si sabes lo que estás "
2983
+ "haciendo!"
2984
+
2985
+ # @ tablepress
2986
+ #: controllers/controller-admin.php:534
2987
+ msgid "Czech"
2988
+ msgstr "Checo"
2989
+
2990
+ # @ tablepress
2991
+ #: controllers/controller-admin.php:614
2992
+ msgid "Serbian"
2993
+ msgstr "Serbio"
2994
+
2995
+ # @ tablepress
2996
+ #: controllers/controller-admin.php:624
2997
+ msgid "Ukrainian"
2998
+ msgstr "Ucraniano"
2999
+
3000
+ # @ tablepress
3001
+ #. translators: plugin header field 'Version'
3002
+ #: tablepress.php:0
3003
+ msgid "1.5"
3004
+ msgstr "1.5"
3005
+
3006
+ # @ tablepress
3007
+ #: views/view-edit.php:646
3008
+ msgid "Attention: Unfortunately, an error occurred."
3009
+ msgstr "Atención: Desafortunadamente, un error ha ocurrido."
3010
+
3011
+ # @ tablepress
3012
+ #: views/view-edit.php:649
3013
+ #, php-format
3014
+ msgid "The internal data of table &#8220;%1$s&#8221 (ID %2$s) is corrupted."
3015
+ msgstr ""
3016
+ "Los datos internos de la tabla &#8220;%1$s&#8221 (ID %2$s) están corruptos."
3017
+
3018
+ # @ tablepress
3019
+ #: views/view-edit.php:651
3020
+ #, php-format
3021
+ msgid "The following error was registered: <code>%s</code>."
3022
+ msgstr "El siguiente error fue registrado: <code>%s</code>."
3023
+
3024
+ # @ tablepress
3025
+ #: views/view-edit.php:656
3026
+ msgid ""
3027
+ "Because of this error, the table can not be edited at this time, to prevent "
3028
+ "possible further data loss."
3029
+ msgstr ""
3030
+ "Debido a este error, la tabla no puede ser editada en este momento, para "
3031
+ "prevenir posible pérdida de datos."
3032
+
3033
+ # @ tablepress
3034
+ #: views/view-edit.php:658
3035
+ #, php-format
3036
+ msgid ""
3037
+ "Please see the <a href=\"%s\">TablePress FAQ page</a> for further "
3038
+ "instructions."
3039
+ msgstr ""
3040
+ "Por favor ver <a href=\"%s\">la página de preguntas más frecuentes de "
3041
+ "TablePress</a> por más instrucciones."
3042
+
3043
+ # @ tablepress
3044
+ #: views/view-edit.php:663
3045
+ msgid "Back to the List of Tables"
3046
+ msgstr "Volver a la Lista de Tablas"
3047
+
3048
+ # @ tablepress
3049
+ #: views/view-export.php:37
3050
+ msgid "Error: The internal data of this table is corrupted!"
3051
+ msgstr "Error: ¡Los datos internos de esta tabla están corruptos!"
3052
+
3053
+ # @ tablepress
3054
+ #: views/view-list.php:551
3055
+ msgid "Select Bulk Action"
3056
+ msgstr "Seleccionar acción en lote"
i18n/tablepress-fi.mo ADDED
Binary file
i18n/tablepress-fi.po ADDED
@@ -0,0 +1,2337 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 TablePress
2
+ # This file is distributed under the same license as the TablePress package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: TablePress v1.6.1\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/tablepress\n"
7
+ "POT-Creation-Date: 2013-04-15 18:25:34+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2013-08-01 14:25+0200\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "X-Generator: Poedit 1.5.4\n"
15
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
+
17
+ #: classes/class-admin-page-helper.php:78
18
+ msgid "Thank you for using <a href=\"https://tablepress.org/\">TablePress</a>."
19
+ msgstr "Kiitos kun käytät <a href=\"https://tablepress.org/\">TablePressiä</a>."
20
+
21
+ #: classes/class-admin-page-helper.php:79
22
+ msgid "Support the plugin with your <a href=\"%s\">donation</a>!"
23
+ msgstr "Tue lisäosaa <a href=\"%s\">lahjoittamalla</a>!"
24
+
25
+ #: classes/class-export.php:58 classes/class-import.php:83
26
+ msgid "CSV - Character-Separated Values"
27
+ msgstr "CSV - Character-Separated Values"
28
+
29
+ #: classes/class-export.php:59 classes/class-import.php:85
30
+ msgid "HTML - Hypertext Markup Language"
31
+ msgstr "HTML - Hypertext Markup Language"
32
+
33
+ #: classes/class-export.php:60 classes/class-import.php:86
34
+ msgid "JSON - JavaScript Object Notation"
35
+ msgstr "JSON - JavaScript Object Notation"
36
+
37
+ #: classes/class-export.php:63
38
+ msgid "; (semicolon)"
39
+ msgstr "; (puolipiste)"
40
+
41
+ #: classes/class-export.php:64
42
+ msgid ", (comma)"
43
+ msgstr ", (pilkku)"
44
+
45
+ #: classes/class-export.php:65
46
+ msgid "\\t (tabulator)"
47
+ msgstr "\\t (tabulaattori)"
48
+
49
+ #: classes/class-import.php:172
50
+ msgid "The imported file contains errors:"
51
+ msgstr "Tuotu tiedosto sisältää virheitä:"
52
+
53
+ #: classes/class-render.php:382
54
+ msgid "<!-- The table with the ID %s is empty! -->"
55
+ msgstr "<!-- Taulukko, jonka ID on %s on tyhjä! -->"
56
+
57
+ #: classes/class-render.php:458 views/view-list.php:414
58
+ msgid "Edit"
59
+ msgstr "Muokkaa"
60
+
61
+ #: classes/class-view.php:110
62
+ msgid "TablePress Help"
63
+ msgstr "TablePress Tuki"
64
+
65
+ #: classes/class-view.php:112
66
+ msgid ""
67
+ "More information about TablePress can be found on the <a href=\"%1$s"
68
+ "\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress "
69
+ "Plugin Directory</a>."
70
+ msgstr ""
71
+ "Lisää tietoa TablePressistä on <a href=\"%1$s\">Lisäosan&#8217;s sivulla</a> "
72
+ "tai sen sivulla <a href=\"%s\">WordPressin lisäosahakemistossa</a>."
73
+
74
+ #: classes/class-view.php:113 views/view-about.php:106
75
+ msgid ""
76
+ "For technical information, please see the <a href=\"%s\">documentation</a>."
77
+ msgstr "Teknisiä tietoja varten, katso <a href=\"%s\">dokumentointi</a>."
78
+
79
+ #: classes/class-view.php:114
80
+ msgid ""
81
+ "<a href=\"%1$s\">Support</a> is provided through the <a href=\"%2$s"
82
+ "\">WordPress Support Forums</a>."
83
+ msgstr ""
84
+ "<a href=\"%1$s\">Tukea</a> on saatavilla <a href=\"%2$s\">WordPressin "
85
+ "Tukifoorumeilla</a>."
86
+
87
+ #: classes/class-view.php:115 views/view-about.php:139
88
+ msgid ""
89
+ "Before asking for support, please carefully read the <a href=\"%s"
90
+ "\">Frequently Asked Questions</a>, where you will find answers to the most "
91
+ "common questions, and search through the forums."
92
+ msgstr ""
93
+ "Ennen kuin kysyt tukea, luethan huolellisesti <a href=\"%s\">Usein Kysytyt "
94
+ "Kysymykset</a>, mistä löydät vastaukset yleisimpiin kysymyksiin. Selaa myös "
95
+ "foorumia."
96
+
97
+ #: classes/class-view.php:116
98
+ msgid ""
99
+ "If you like the plugin, <a href=\"%1$s\"><strong>a donation</strong></a> is "
100
+ "recommended."
101
+ msgstr ""
102
+ "Jos pidät lisäosasta, <a href=\"%1$s\"><strong>lahjoittaminen</strong></a> "
103
+ "on suositeltavaa."
104
+
105
+ #: classes/class-view.php:119
106
+ msgid "For more information:"
107
+ msgstr "Lisätietoja:"
108
+
109
+ #: classes/class-view.php:153 controllers/controller-admin.php:117
110
+ #: views/view-editor_button_thickbox.php:71
111
+ #: views/view-editor_button_thickbox.php:132
112
+ #: views/view-options_custom_css.php:36 views/view-preview_table.php:55
113
+ msgid "%1$s &lsaquo; %2$s"
114
+ msgstr "%1$s &lsaquo; %2$s"
115
+
116
+ #: classes/class-view.php:165 classes/class-view.php:166
117
+ msgid "Do you really want to delete this table?"
118
+ msgid_plural "Do you really want to delete these tables?"
119
+ msgstr[0] "Haluatko todella poistaa taulukon?"
120
+ msgstr[1] "Haluatko todella poistaa taulukot?"
121
+
122
+ #. #-#-#-#-# plugin.pot (TablePress 0.9-RC) #-#-#-#-#
123
+ #. Plugin Name of the plugin/theme
124
+ #: classes/class-view.php:384
125
+ msgid "TablePress"
126
+ msgstr "TablePress"
127
+
128
+ #: classes/class-view.php:413 views/view-edit.php:399 views/view-edit.php:400
129
+ #: views/view-options.php:54
130
+ msgid "Save Changes"
131
+ msgstr "Tallenna muutokset"
132
+
133
+ #: controllers/controller-admin.php:171 views/view-about.php:86
134
+ #: views/view-list.php:185
135
+ msgid "Table"
136
+ msgstr "Taulukko"
137
+
138
+ #: controllers/controller-admin.php:172 controllers/controller-admin.php:173
139
+ msgid "Insert a Table from TablePress"
140
+ msgstr "Lisää taulukko TablePressistä"
141
+
142
+ #: controllers/controller-admin.php:244
143
+ msgid "TablePress Table"
144
+ msgstr "TablePress taulukko"
145
+
146
+ #: controllers/controller-admin.php:271
147
+ msgid "TablePress Plugin page"
148
+ msgstr "TablePress lisäosasivu"
149
+
150
+ #: controllers/controller-admin.php:271
151
+ msgid "Plugin page"
152
+ msgstr "Lisäosasivu"
153
+
154
+ #: controllers/controller-admin.php:285
155
+ msgid "Frequently Asked Questions"
156
+ msgstr "Usein kysytyt kysymykset"
157
+
158
+ #: controllers/controller-admin.php:285
159
+ msgid "FAQ"
160
+ msgstr "UKK"
161
+
162
+ #: controllers/controller-admin.php:286
163
+ msgid "Plugin Documentation"
164
+ msgstr "Lisäosan Dokumentointi"
165
+
166
+ #: controllers/controller-admin.php:286
167
+ msgid "Documentation"
168
+ msgstr "Dokumentointi"
169
+
170
+ #: controllers/controller-admin.php:287
171
+ msgid "Support"
172
+ msgstr "Tuki"
173
+
174
+ #: controllers/controller-admin.php:288
175
+ msgid "Support TablePress with your donation!"
176
+ msgstr "Tue TablePressiä lahjoituksella!"
177
+
178
+ #: controllers/controller-admin.php:288
179
+ msgid "Donate"
180
+ msgstr "Lahjoita"
181
+
182
+ #: controllers/controller-admin.php:314 controllers/controller-admin.php:379
183
+ #: controllers/controller-admin.php:697 controllers/controller-admin.php:755
184
+ #: controllers/controller-admin.php:805 controllers/controller-admin.php:928
185
+ #: controllers/controller-admin.php:958 controllers/controller-admin.php:1031
186
+ #: controllers/controller-admin.php:1041 controllers/controller-admin.php:1576
187
+ #: controllers/controller-admin.php:1603 controllers/controller-admin.php:1638
188
+ #: controllers/controller-admin.php:1672 controllers/controller-admin.php:1740
189
+ msgid "You do not have sufficient permissions to access this page."
190
+ msgstr "Sinulla ei ole oikeutta tälle sivulle."
191
+
192
+ #: controllers/controller-admin.php:396
193
+ msgctxt ""
194
+ "Default CSV delimiter in the translated language (\";\", \",\", or \"tab\")"
195
+ msgid ","
196
+ msgstr ","
197
+
198
+ #: controllers/controller-admin.php:457
199
+ msgid "German"
200
+ msgstr "Saksa"
201
+
202
+ #: controllers/controller-admin.php:462
203
+ msgid "English"
204
+ msgstr "Englanti"
205
+
206
+ #: controllers/controller-admin.php:467
207
+ msgid "Spanish"
208
+ msgstr "Espanja"
209
+
210
+ #: controllers/controller-admin.php:472
211
+ msgid "French"
212
+ msgstr "Ranska"
213
+
214
+ #: controllers/controller-admin.php:477
215
+ msgid "Polish"
216
+ msgstr "Puola"
217
+
218
+ #: controllers/controller-admin.php:482
219
+ msgid "Slovak"
220
+ msgstr "Slovakia"
221
+
222
+ #: controllers/controller-admin.php:487
223
+ msgid "Chinese (Simplified)"
224
+ msgstr "Kiina (Yksinkertaistettu)"
225
+
226
+ #: controllers/controller-admin.php:539 controllers/controller-admin.php:540
227
+ #: controllers/controller-admin.php:541
228
+ msgid "All Tables"
229
+ msgstr "Kaikki taulukot"
230
+
231
+ #: controllers/controller-admin.php:546 controllers/controller-admin.php:547
232
+ #: views/view-add.php:41
233
+ msgid "Add New Table"
234
+ msgstr "Lisää taulukko"
235
+
236
+ #: controllers/controller-admin.php:548
237
+ msgid "Add New"
238
+ msgstr "Lisää uusi"
239
+
240
+ #: controllers/controller-admin.php:553
241
+ msgid "Edit Table"
242
+ msgstr "Muokkaa taulukkoa"
243
+
244
+ #: controllers/controller-admin.php:560 controllers/controller-admin.php:561
245
+ msgid "Import a Table"
246
+ msgstr "Tuo taulukko"
247
+
248
+ #: controllers/controller-admin.php:562
249
+ msgctxt "navigation bar"
250
+ msgid "Import"
251
+ msgstr "Tuo"
252
+
253
+ #: controllers/controller-admin.php:567 controllers/controller-admin.php:568
254
+ msgid "Export a Table"
255
+ msgstr "Vie taulukko"
256
+
257
+ #: controllers/controller-admin.php:569
258
+ msgctxt "navigation bar"
259
+ msgid "Export"
260
+ msgstr "Vie"
261
+
262
+ #: controllers/controller-admin.php:574 controllers/controller-admin.php:575
263
+ #: controllers/controller-admin.php:576
264
+ msgid "Plugin Options"
265
+ msgstr "Lisäosan asetukset"
266
+
267
+ #: controllers/controller-admin.php:581 controllers/controller-admin.php:583
268
+ msgid "About"
269
+ msgstr "Tietoa"
270
+
271
+ #: controllers/controller-admin.php:582
272
+ msgid "About TablePress"
273
+ msgstr "Tietoa TablePressistä"
274
+
275
+ #: controllers/controller-admin.php:1111
276
+ msgid "Imported from Manual Input"
277
+ msgstr "Tuotu manuaalisesta syötöstä"
278
+
279
+ #: controllers/controller-admin.php:1669
280
+ #: controllers/controller-admin_ajax.php:236
281
+ msgid "The preview could not be loaded."
282
+ msgstr "Esikatselua ei voitu ladata."
283
+
284
+ #: controllers/controller-admin.php:1669 controllers/controller-admin.php:1677
285
+ #: views/view-edit.php:397 views/view-list.php:423
286
+ #: views/view-preview_table.php:55
287
+ msgid "Preview"
288
+ msgstr "Esikatselu"
289
+
290
+ #: controllers/controller-admin.php:1677
291
+ msgid "The table could not be loaded."
292
+ msgstr "Taulukkoa ei voitu ladata."
293
+
294
+ #: controllers/controller-admin.php:1754
295
+ msgid "TablePress was uninstalled successfully."
296
+ msgstr "TablePress poistettiin onnistuneesti."
297
+
298
+ #: controllers/controller-admin.php:1755
299
+ msgid "All tables, data, and options were deleted."
300
+ msgstr "Kaikki taulukot, data ja asetukset poistettiin."
301
+
302
+ #: controllers/controller-admin.php:1757
303
+ msgid ""
304
+ "You may now ask the network admin to delete the plugin's folder "
305
+ "<code>tablepress</code> from the server, if no other site in the network "
306
+ "uses it."
307
+ msgstr ""
308
+ "Sinun täytyy ehkä kysyä palvelimen ylläpitäjää poistamaan lisäosan kansio "
309
+ "<code>tablepress</code> palvelimelta, jos mikään muu sivu ei käytä sitä."
310
+
311
+ #: controllers/controller-admin.php:1759
312
+ msgid ""
313
+ "You may now manually delete the plugin's folder <code>tablepress</code> from "
314
+ "the <code>plugins</code> directory on your server or use the &#8220;"
315
+ "Delete&#8221; link for TablePress on the WordPress &#8220;Plugins&#8221; "
316
+ "page."
317
+ msgstr ""
318
+ "Sinun täytyy manuaalisesti poistaa lisäosan kansio <code>tablepress</code> "
319
+ "<code>plugins</code>- kansiosta tai käyttää &#8220;Delete&#8221; linkkiä "
320
+ "TablePressille Wordpress &#8220;Plugins&#8221; sivulla."
321
+
322
+ #: controllers/controller-admin.php:1761
323
+ msgid ""
324
+ "Your TablePress &#8220;Custom CSS&#8221; files have been deleted "
325
+ "automatically."
326
+ msgstr ""
327
+ "Sinun TablePress &#8220;Custom CSS&#8221; tiedostot on poistettu "
328
+ "automaattisesti."
329
+
330
+ #: controllers/controller-admin.php:1764
331
+ msgid ""
332
+ "Please also ask him to delete your TablePress &#8220;Custom CSS&#8221; files "
333
+ "from the server."
334
+ msgstr ""
335
+ "Pyydä häntä myös poistamaan TablePress &#8220;Custom CSS&#8221;-tiedostot "
336
+ "palvelimelta."
337
+
338
+ #: controllers/controller-admin.php:1766
339
+ msgid ""
340
+ "You may now also delete your TablePress &#8220;Custom CSS&#8221; files in "
341
+ "the <code>wp-content</code> folder."
342
+ msgstr ""
343
+ "Voit nyt poistaa TablePress &#8220;Custom CSS&#8221;- tiedostot <code>wp-"
344
+ "content</code> kansiosta."
345
+
346
+ #: controllers/controller-admin.php:1770
347
+ msgid "Go to &#8220;Plugins&#8221; page"
348
+ msgstr "Mene &#8220;Lisäosat&#8221; sivulle"
349
+
350
+ #: controllers/controller-admin.php:1771
351
+ msgid "Go to Dashboard"
352
+ msgstr "Mene Ohjausnäkymään"
353
+
354
+ #: controllers/controller-admin.php:1773 views/view-options.php:185
355
+ #: views/view-options.php:192
356
+ msgid "Uninstall TablePress"
357
+ msgstr "Poista TablePress"
358
+
359
+ #: controllers/controller-admin_ajax.php:229 views/view-preview_table.php:66
360
+ msgid "This is a preview of your table."
361
+ msgstr "Tämä on esikatselu."
362
+
363
+ #: controllers/controller-admin_ajax.php:230
364
+ msgid "Because of CSS styling, the table might look different on your page!"
365
+ msgstr "Riippuen CSS- tyylistä, taulukko saattaa näyttää erilaiselta sivullasi"
366
+
367
+ #: controllers/controller-admin_ajax.php:231
368
+ msgid ""
369
+ "The features of the DataTables JavaScript library are also not visible in "
370
+ "this preview!"
371
+ msgstr "DataTables JavaScript- kirjasto ei näy tässä esikatselussa."
372
+
373
+ #: controllers/controller-admin_ajax.php:232 views/view-preview_table.php:67
374
+ msgid ""
375
+ "To insert the table into a page, post, or text widget, copy the Shortcode %s "
376
+ "and paste it into the editor."
377
+ msgstr ""
378
+ "Lisätäksesi taulukon sivulle, artikkeliin tai vimpaimeen, kopioi Shortcode "
379
+ "%s ja lisää se tekstimuokkaimeen."
380
+
381
+ #: controllers/controller-frontend.php:458 views/view-list.php:479
382
+ msgid "%s ago"
383
+ msgstr "%s sitten"
384
+
385
+ #: models/model-table.php:346 views/view-editor_button_thickbox.php:286
386
+ #: views/view-export.php:117 views/view-import.php:190 views/view-list.php:405
387
+ msgid "(no name)"
388
+ msgstr "(ei nimeä)"
389
+
390
+ #: models/model-table.php:347
391
+ msgid "Copy of %s"
392
+ msgstr "Kopio %s"
393
+
394
+ #: views/view-about.php:43
395
+ msgid "Plugin Purpose"
396
+ msgstr "Lisäosan Tarkoitus"
397
+
398
+ #: views/view-about.php:44
399
+ msgid "Usage"
400
+ msgstr "Käyttö"
401
+
402
+ #: views/view-about.php:45
403
+ msgid "More Information and Documentation"
404
+ msgstr "Lisää tietoa ja dokumentointia"
405
+
406
+ #: views/view-about.php:46
407
+ msgid "Help and Support"
408
+ msgstr "Apu ja tuki"
409
+
410
+ #: views/view-about.php:47
411
+ msgid "Author and License"
412
+ msgstr "Lisenssitiedot"
413
+
414
+ #: views/view-about.php:48
415
+ msgid "Credits and Thanks"
416
+ msgstr "Kiitokset"
417
+
418
+ #: views/view-about.php:49
419
+ msgid "Debug and Version Information"
420
+ msgstr "Debuggaus ja versiotiedot"
421
+
422
+ #: views/view-about.php:60
423
+ msgid ""
424
+ "TablePress allows you to create and manage tables in the admin area of "
425
+ "WordPress."
426
+ msgstr ""
427
+ "TablePress antaa sinun luoda ja hallita taulukoita ylläpitoalueella "
428
+ "WordPressissä."
429
+
430
+ #: views/view-about.php:61
431
+ msgid ""
432
+ "Tables may contain text, numbers and even HTML (e.g. to include images or "
433
+ "links)."
434
+ msgstr ""
435
+ "Taulukot voivat sisältää tekstiä, numeroita ja HTML-tageja (esim. kuvia tai "
436
+ "linkkejä)"
437
+
438
+ #: views/view-about.php:62
439
+ msgid ""
440
+ "You can then show the tables in your posts, on your pages, or in text "
441
+ "widgets by using a Shortcode."
442
+ msgstr ""
443
+ "Voit näyttää taulukot artikkeleissasi, sivuillasi tai tekstivimpaimissa "
444
+ "käyttäen Shortcodea."
445
+
446
+ #: views/view-about.php:63
447
+ msgid ""
448
+ "If you want to show your tables anywhere else in your theme, you can use a "
449
+ "Template Tag function."
450
+ msgstr ""
451
+ "Jos haluat näyttää taulukot missä tahansa muualla teemassasi, voit käyttää "
452
+ "Template Tag- funktiota."
453
+
454
+ #: views/view-about.php:76
455
+ msgid "At first, you should add or import a table."
456
+ msgstr "Aluksi sinun pitäisi lisätä tai tuoda taulukko."
457
+
458
+ #: views/view-about.php:77
459
+ msgid ""
460
+ "This means that you either let the plugin create an empty table for you or "
461
+ "that you load an existing table from either a CSV, HTML, or JSON file."
462
+ msgstr ""
463
+ "Tämä tarkoittaa sitä, että voit luoda tyhjän taulukon lisäosalla, tai voit "
464
+ "ladata olemassaolevan taulukon CVS, HTML tai JSON- tiedostosta."
465
+
466
+ #: views/view-about.php:80
467
+ msgid ""
468
+ "Then you can edit your data or change the structure of your table (e.g. by "
469
+ "inserting, deleting, moving, or swaping rows or columns or sorting them) and "
470
+ "select specific table features like alternating row colors or whether to "
471
+ "print the name or description, if you want."
472
+ msgstr ""
473
+ "Sitten voit muokata tai vaihtaa taulukon rakennetta (esim. lisäämällä, "
474
+ "poistamalla, siirtämällä tai vaihtamalla rivejä tai sarakkeita, tai "
475
+ "järjestää niitä) ja valita erityisiä taulukko-ominaisuuksia kuten vaihtaa "
476
+ "rivien värejä tai näytettävän tiedon."
477
+
478
+ #: views/view-about.php:81
479
+ msgid "To easily add a link or an image to a cell, use the provided buttons."
480
+ msgstr ""
481
+ "Voit käyttää annettuja näppäimiä lisätäksesi helposti linkin tai kuvan "
482
+ "taulukkoalkioon."
483
+
484
+ #: views/view-about.php:82
485
+ msgid ""
486
+ "Those will ask you for the necessary information and and corresponding HTML "
487
+ "code will be added to the cell automatically."
488
+ msgstr ""
489
+ "Sinulta kysytään tarvittavat tiedot ja toimiva HTML-koodi lisätään alkioon "
490
+ "automaattisesti."
491
+
492
+ #: views/view-about.php:85 views/view-list.php:183
493
+ msgid ""
494
+ "To insert a table into a page, post, or text widget, copy its Shortcode %s "
495
+ "and paste it at the desired place in the editor."
496
+ msgstr ""
497
+ "Lisätäksesi taulukon sivulle, artikkeliin tai vimpaimeen, kopioi Shortcode "
498
+ "%s ja liitä se haluttuun paikkaan tekstimuokkaimessa."
499
+
500
+ #: views/view-about.php:86 views/view-list.php:185
501
+ msgid ""
502
+ "You can also click the &#8220;%s&#8221; button in the editor toolbar to "
503
+ "select and insert a table."
504
+ msgstr ""
505
+ "Voit myös klikata &#8220;%s&#8221;- näppäintä tekstimuokkaimen "
506
+ "työkalupalkissa lisätäksesi taulukon."
507
+
508
+ #: views/view-about.php:89
509
+ msgid "Tables can be styled by changing and adding CSS commands."
510
+ msgstr ""
511
+ "Taulukoiden tyyliä voi muuttaa vaihtamalla ja lisäämällä CSS- komentoja."
512
+
513
+ #: views/view-about.php:90
514
+ msgid ""
515
+ "The plugin ships with default CSS stylesheets, which can be customized with "
516
+ "own code or replaced with other stylesheets."
517
+ msgstr ""
518
+ "Lisäosan mukana tulee oletus CSS tyyli, jota voi muokata tai korvata "
519
+ "toisella tyylillä."
520
+
521
+ #: views/view-about.php:91
522
+ msgid ""
523
+ "For this, each table is given certain CSS classes that can be used as CSS "
524
+ "selectors."
525
+ msgstr ""
526
+ "Tässä jokaisella taulukolla on CSS- luokka, jota voi käyttää CSS valitsimena."
527
+
528
+ #: views/view-about.php:92
529
+ msgid ""
530
+ "Please see the <a href=\"%s\">documentation</a> for a list of these "
531
+ "selectors and for styling examples."
532
+ msgstr ""
533
+ "Katso <a href=\"%s\">dokumentaatio</a> valitsinlistalle ja tyyliesimerkeille."
534
+
535
+ #: views/view-about.php:105
536
+ msgid ""
537
+ "More information about TablePress can be found on the <a href=\"%s"
538
+ "\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress "
539
+ "Plugin Directory</a>."
540
+ msgstr ""
541
+ "Lisää tietoa TablePressistä on <a href=\"%1$s\">Lisäosan&#8217;s sivulla</a> "
542
+ "tai sen sivulla <a href=\"%s\">WordPressin lisäosahakemistossa</a>."
543
+
544
+ #: views/view-about.php:119
545
+ msgid ""
546
+ "This plugin was written and developed by <a href=\"%s\">Tobias Bäthge</a>."
547
+ msgstr ""
548
+ "Tämän lisäosan suunnitteli ja kirjoitti <a href=\"%s\">Tobias Bäthge</a>."
549
+
550
+ #: views/view-about.php:120
551
+ msgid ""
552
+ "It is licensed as Free Software under GNU General Public License 2 (GPL 2)."
553
+ msgstr ""
554
+ "Se on lisensoitu ilmaisena ohjelmana GNU General Public License 2 (GPL 2):n "
555
+ "mukaan."
556
+
557
+ #: views/view-about.php:122
558
+ msgid ""
559
+ "If you like the plugin, <a href=\"%s\"><strong>giving a donation</strong></"
560
+ "a> is recommended."
561
+ msgstr ""
562
+ "Jos pidät lisäosasta, <a href=\"%1$s\"><strong>lahjoittaminen</strong></a> "
563
+ "on suositeltavaa."
564
+
565
+ #: views/view-about.php:123
566
+ msgid ""
567
+ "Please rate and review the plugin in the <a href=\"%s\">WordPress Plugin "
568
+ "Directory</a>."
569
+ msgstr ""
570
+ "Voit arvioida lisäosan <a href=\"%s\">WordPress lisäosahakemistossa</a>."
571
+
572
+ #: views/view-about.php:125
573
+ msgid ""
574
+ "Donations and good ratings encourage me to further develop the plugin and to "
575
+ "provide countless hours of support. Any amount is appreciated! Thanks!"
576
+ msgstr ""
577
+ "Lahjotiukset ja hyvät arvostelut rohkaisevat minua kehittämään lisosaa ja "
578
+ "antamaan lukuisia tunteja tukea. Jokaista lahjoitusta arvostetaan!"
579
+
580
+ #: views/view-about.php:138
581
+ msgid ""
582
+ "<a href=\"%s\">Support</a> is provided through the <a href=\"%s\">WordPress "
583
+ "Support Forums</a>."
584
+ msgstr ""
585
+ "<a href=\"%s\">Tukea</a> on tarjolla <a href=\"%s\">WordPress "
586
+ "tukifoorumeilla.</a>."
587
+
588
+ #: views/view-about.php:142
589
+ msgid ""
590
+ "If you do not find an answer there, please <a href=\"%s\">open a new thread</"
591
+ "a> in the WordPress Support Forums."
592
+ msgstr ""
593
+ "Jos et löydä sieltä vastausta, <a href=\"%s\">aloita uusi keskustelu</a> "
594
+ "WordPress tukifoorumeilla."
595
+
596
+ #: views/view-about.php:155
597
+ msgid "Please provide this information in bug reports and support requests."
598
+ msgstr "Liitä tämä tieto vikailmoitukseen ja tukipyyntöön."
599
+
600
+ #: views/view-about.php:186
601
+ msgid "Special Thanks go to:"
602
+ msgstr "Erityiskiitokset:"
603
+
604
+ #: views/view-about.php:187
605
+ msgid ""
606
+ "Allan Jardine for <a href=\"http://www.datatables.net/\">DataTables</a>,"
607
+ msgstr ""
608
+ "Allan Jardinelle <a href=\"http://www.datatables.net/\">DataTableista</a>,"
609
+
610
+ #: views/view-about.php:190
611
+ msgid "Thanks to the translators:"
612
+ msgstr "Kiitos kääntäjille!"
613
+
614
+ #: views/view-about.php:195
615
+ msgid "%s (thanks to %s)"
616
+ msgstr "%s (kiitokset %s)"
617
+
618
+ #: views/view-about.php:200
619
+ msgid ""
620
+ "Thank you to all donors, contributors, supporters, reviewers and users of "
621
+ "the plugin!"
622
+ msgstr ""
623
+ "Kiitos kaikille lahjoittajille, osallistujille, tukijoille ja "
624
+ "arvostelijoille!"
625
+
626
+ #: views/view-add.php:37
627
+ msgid "Error: The table could not be added."
628
+ msgstr "Virhe: Taulukkoa ei voitu lisätä."
629
+
630
+ #: views/view-add.php:42
631
+ msgid "Add Table"
632
+ msgstr "Lisää taulukko"
633
+
634
+ #: views/view-add.php:54
635
+ msgid ""
636
+ "To add a new table, enter its name, a description (optional), and the number "
637
+ "of rows and columns into the form below."
638
+ msgstr ""
639
+ "Lisätäksesi uuden taulukon, anna sen nimi, kuvaus sekä rivien ja sarakkeiden "
640
+ "määrä allaolevaan lomakkeeseen."
641
+
642
+ #: views/view-add.php:57
643
+ msgid ""
644
+ "You can always change the name, description, and size of your table later."
645
+ msgstr "Voit aina vaihtaa nimen, kuvauksen ja taulukon koon myöhemmin."
646
+
647
+ #: views/view-add.php:71 views/view-edit.php:199
648
+ #: views/view-editor_button_thickbox.php:236 views/view-list.php:319
649
+ msgid "Table Name"
650
+ msgstr "Taulukon nimi"
651
+
652
+ #: views/view-add.php:72
653
+ msgid "Enter Table Name here"
654
+ msgstr "Syötä taulukon nimi tähän"
655
+
656
+ #: views/view-add.php:73
657
+ msgid "The name or title of your table."
658
+ msgstr "Taulukon nimi tai otsikko."
659
+
660
+ #: views/view-add.php:76 views/view-edit.php:203
661
+ #: views/view-editor_button_thickbox.php:237 views/view-list.php:320
662
+ msgid "Description"
663
+ msgstr "Kuvaus"
664
+
665
+ #: views/view-add.php:76
666
+ msgid "(optional)"
667
+ msgstr "(valinnainen)"
668
+
669
+ #: views/view-add.php:77
670
+ msgid "Enter Description here"
671
+ msgstr "Syötä kuvaus tähän"
672
+
673
+ #: views/view-add.php:78
674
+ msgid "A description of the contents of your table."
675
+ msgstr "Kuvaus taulukon sisällöstä"
676
+
677
+ #: views/view-add.php:81
678
+ msgid "Number of Rows"
679
+ msgstr "Rivien lukumäärä"
680
+
681
+ #: views/view-add.php:82 views/view-add.php:87 views/view-edit.php:376
682
+ #: views/view-edit.php:379
683
+ msgid "This field must contain a positive number."
684
+ msgstr "Kentän täytyy sisältää positiivinen luku."
685
+
686
+ #: views/view-add.php:83
687
+ msgid "The number of rows in your table."
688
+ msgstr "Rivien lukumäärä taulukossa"
689
+
690
+ #: views/view-add.php:86
691
+ msgid "Number of Columns"
692
+ msgstr "Sarakkeiden lukumäärä"
693
+
694
+ #: views/view-add.php:88
695
+ msgid "The number of columns in your table."
696
+ msgstr "Sarakkeiden lukumäärä taulukossa"
697
+
698
+ #: views/view-edit.php:44
699
+ msgid "The table was saved successfully."
700
+ msgstr "Taulukon tallennus onnistui."
701
+
702
+ #: views/view-edit.php:45
703
+ msgid "The table was added successfully."
704
+ msgstr "Taulukon lisäys onnistui."
705
+
706
+ #: views/view-edit.php:46
707
+ msgid "The table was imported successfully."
708
+ msgstr "Taulukon tuonti onnistui."
709
+
710
+ #: views/view-edit.php:47
711
+ msgid "The table was imported successfully from WP-Table Reloaded."
712
+ msgstr "Taulukon tuonti onnistui WP-Table Reloaded:sta."
713
+
714
+ #: views/view-edit.php:48 views/view-list.php:98
715
+ msgid "Error: The table could not be saved."
716
+ msgstr "Virhe: Tallennus epäonnistui"
717
+
718
+ #: views/view-edit.php:49 views/view-list.php:97
719
+ msgid "Error: The table could not be deleted."
720
+ msgstr "Virhe: Taulukkoa ei voitu poistaa"
721
+
722
+ #: views/view-edit.php:50
723
+ msgid "The table was saved successfully, and the table ID was changed."
724
+ msgstr "Tallennus onnistui, taulukon ID vaihdettiin."
725
+
726
+ #: views/view-edit.php:51
727
+ msgid ""
728
+ "The table was saved successfully, but the table ID could not be changed!"
729
+ msgstr "Tallennus onnistui, mutta ID:tä ei voitu muuttaa!"
730
+
731
+ #: views/view-edit.php:72
732
+ msgctxt "Insert Link dialog"
733
+ msgid "Insert/edit link"
734
+ msgstr "Lisää/muokkaa linkkiä"
735
+
736
+ #: views/view-edit.php:73
737
+ msgctxt "Insert Link dialog"
738
+ msgid "Update"
739
+ msgstr "Päivitä"
740
+
741
+ #: views/view-edit.php:74
742
+ msgctxt "Insert Link dialog"
743
+ msgid "Add Link"
744
+ msgstr "Lisää linkki"
745
+
746
+ #: views/view-edit.php:75
747
+ msgctxt "Insert Link dialog"
748
+ msgid "(no title)"
749
+ msgstr "(ei otsikkoa)"
750
+
751
+ #: views/view-edit.php:76
752
+ msgctxt "Insert Link dialog"
753
+ msgid "No matches found."
754
+ msgstr "Ei löydy."
755
+
756
+ #: views/view-edit.php:77
757
+ msgctxt "Insert Link dialog"
758
+ msgid "Link Text"
759
+ msgstr "Linkin teksti"
760
+
761
+ #: views/view-edit.php:88
762
+ msgid "You can not delete all table rows!"
763
+ msgstr "Et voi poistaa kaikkia rivejä!"
764
+
765
+ #: views/view-edit.php:89
766
+ msgid "You can not delete all table columns!"
767
+ msgstr "Et voi poistaa kaikkia sarakkeita!"
768
+
769
+ #: views/view-edit.php:90
770
+ msgid "You did not select any rows!"
771
+ msgstr "Et valinnut yhtään riviä!"
772
+
773
+ #: views/view-edit.php:91
774
+ msgid "You did not select any columns!"
775
+ msgstr "Et valinnut yhtään saraketta!"
776
+
777
+ #: views/view-edit.php:92
778
+ msgid "The value for the number of rows is invalid!"
779
+ msgstr "Rivien lukumäärä on virheellinen!"
780
+
781
+ #: views/view-edit.php:93
782
+ msgid "The value for the number of columns is invalid!"
783
+ msgstr "Sarakkeiden lukumäärä on virheellinen!"
784
+
785
+ #: views/view-edit.php:94 views/view-edit.php:95
786
+ msgid "Do you really want to delete the selected row?"
787
+ msgid_plural "Do you really want to delete the selected rows?"
788
+ msgstr[0] "Haluatko todella poistaa rivin?"
789
+ msgstr[1] "Haluatko todella poistaa rivit?"
790
+
791
+ #: views/view-edit.php:96 views/view-edit.php:97
792
+ msgid "Do you really want to delete the selected column?"
793
+ msgid_plural "Do you really want to delete the selected columns?"
794
+ msgstr[0] "Haluatko todella poistaa sarakkeen?"
795
+ msgstr[1] "Haluatko todella poistaa sarakkeet?"
796
+
797
+ #: views/view-edit.php:98
798
+ msgid ""
799
+ "Please click into the cell that you want to edit using the &#8220;Advanced "
800
+ "Editor&#8221;."
801
+ msgstr ""
802
+ "Valitse alkio jota haluat muuttaa &#8220;Edistyneellä muokkaimella&#8221;."
803
+
804
+ #: views/view-edit.php:99
805
+ #, fuzzy
806
+ msgid ""
807
+ "To combine cells within a column, click into the cell below the cell that "
808
+ "has the content the combined cells shall have."
809
+ msgstr ""
810
+ "To combine cells within a column, click into the cell below the cell that "
811
+ "has the content the combined cells shall have."
812
+
813
+ #: views/view-edit.php:100
814
+ #, fuzzy
815
+ msgid ""
816
+ "To combine cells within a row, click into the cell to the right of the cell "
817
+ "that has the content the combined cells shall have."
818
+ msgstr ""
819
+ "To combine cells within a row, click into the cell to the right of the cell "
820
+ "that has the content the combined cells shall have."
821
+
822
+ #: views/view-edit.php:101
823
+ msgid ""
824
+ "Attention: You have enabled the usage of the DataTables JavaScript library "
825
+ "for features like sorting, search, or pagination."
826
+ msgstr ""
827
+ "Huomio: Olet sallinut DataTables JavaScript- kirjaston käytön "
828
+ "ominaisuuksille kuten järjestely ja haku."
829
+
830
+ #: views/view-edit.php:102
831
+ msgid "Unfortunately, these can not be used in tables with combined cells."
832
+ msgstr ""
833
+ "Valitettavasti näitä ei voi käyttää taulukoissa joissa on yhdistettyjä "
834
+ "alkioita."
835
+
836
+ #: views/view-edit.php:103
837
+ msgid ""
838
+ "Do you want to proceed and automatically turn off the usage of DataTables "
839
+ "for this table?"
840
+ msgstr ""
841
+ "Haluatko automaattisesti poistaa DataTablesin käytöstä tälle taulukolle?"
842
+
843
+ #: views/view-edit.php:104
844
+ msgid "Please click into the cell that you want to add a link to."
845
+ msgstr "Valitse alkio, johon haluat lisätä linkin."
846
+
847
+ #: views/view-edit.php:105
848
+ msgid ""
849
+ "You can then enter the Link URL and Text or choose an existing page or post."
850
+ msgstr ""
851
+ "Voit syöttää linkin URLin ja tekstin tai valita olemassaolevan sivun tai "
852
+ "artikkelin."
853
+
854
+ #: views/view-edit.php:106
855
+ msgid "Please click into the cell that you want to add an image to."
856
+ msgstr "Valitse alkio johon haluat liittää kuvan."
857
+
858
+ #: views/view-edit.php:107
859
+ msgid ""
860
+ "The Media Library will open, where you can select or upload the desired "
861
+ "image or enter the image URL."
862
+ msgstr ""
863
+ "Mediakirjasto aukeaa, ja voit valita tai ladata kuvan, tai syöttää kuvan "
864
+ "URLin."
865
+
866
+ #: views/view-edit.php:108
867
+ msgid "Click the &#8220;%s&#8221; button to insert the image."
868
+ msgstr "Paina &#8220;%s&#8221; näppäintä lisätäksesi kuvan."
869
+
870
+ #: views/view-edit.php:108
871
+ msgid "Insert into Post"
872
+ msgstr "Liitä artikkeliin"
873
+
874
+ #: views/view-edit.php:109
875
+ msgid ""
876
+ "The changes to this table were not saved yet and will be lost if you "
877
+ "navigate away from this page."
878
+ msgstr ""
879
+ "Taulukkoon tehtyjä muutoksia ei tallennettu vielä, ja muutokset menetetään "
880
+ "jos poistut sivulta."
881
+
882
+ #: views/view-edit.php:110
883
+ msgid "The Table Preview is being loaded..."
884
+ msgstr "Esikatselua ladataan..."
885
+
886
+ #: views/view-edit.php:111
887
+ msgid "The Table Preview could not be loaded."
888
+ msgstr "Esikatselua ei voitu ladata."
889
+
890
+ #: views/view-edit.php:112
891
+ msgid "Saving successful"
892
+ msgstr "Tallennus onnistui"
893
+
894
+ #: views/view-edit.php:113
895
+ msgid "Saving failed"
896
+ msgstr "Tallennus epäonnistui"
897
+
898
+ #: views/view-edit.php:114
899
+ msgid "Changes are being saved..."
900
+ msgstr "Muutoksia tallennetaan..."
901
+
902
+ #: views/view-edit.php:115
903
+ msgid "The Table ID field can not be empty. Please enter a Table ID!"
904
+ msgstr "Taulukon ID-kenttä ei voi olla tyhjä. Lisää taulukon ID"
905
+
906
+ #: views/view-edit.php:116
907
+ msgid ""
908
+ "The Table ID &#8220;0&#8221; is not supported. Please enter a different "
909
+ "Table ID!"
910
+ msgstr "Taulukon ID &#8220;0&#8221; ei ole tuettu. Syötä toinen ID"
911
+
912
+ #: views/view-edit.php:117
913
+ msgid ""
914
+ "Do you really want to change the Table ID? All Shortcodes for this table in "
915
+ "your pages and posts will have to be adjusted!"
916
+ msgstr ""
917
+ "Haluatko vaihtaa taulukon ID:n? Kaikki Shortcodet sivuilla ja artikkeleissa "
918
+ "täytyy muuttaa."
919
+
920
+ #: views/view-edit.php:118
921
+ msgid ""
922
+ "The entered value in the field &#8220;Extra CSS classes&#8221; is invalid."
923
+ msgstr "Syötetty arvo kentässä &#8220;Extra CSS classes&#8221; ei kelpaa."
924
+
925
+ #: views/view-edit.php:119
926
+ msgid ""
927
+ "The entered value in the field &#8220;Pagination Entries&#8221; is not a "
928
+ "number."
929
+ msgstr "Syötetty arvo kentässä &#8220;Pagination Entries&#8221; ei ole numero."
930
+
931
+ #: views/view-edit.php:120 views/view-edit.php:258
932
+ msgid "Sort ascending"
933
+ msgstr "Järjestä nousevasti"
934
+
935
+ #: views/view-edit.php:121 views/view-edit.php:258
936
+ msgid "Sort descending"
937
+ msgstr "Järjestä laskevasti"
938
+
939
+ #: views/view-edit.php:122
940
+ msgid "You can not add rowspan to the first row!"
941
+ msgstr "Et voi lisätä riviväliä ensimmäiseen riviin"
942
+
943
+ #: views/view-edit.php:123
944
+ msgid "You can not add colspan to the first column!"
945
+ msgstr "Et voi lisätä sarakeväliä ensimmäiseen sarakkeeseen."
946
+
947
+ #: views/view-edit.php:124
948
+ msgid "You can not connect cells into the table head row!"
949
+ msgstr "Et voi yhdistää alkioita ylimpään riviin."
950
+
951
+ #: views/view-edit.php:125
952
+ msgid "You can not connect cells out of the table foot row!"
953
+ msgstr "Et voi yhdistää alkiotita alimman rivin alle."
954
+
955
+ #: views/view-edit.php:131
956
+ msgid "Table Information"
957
+ msgstr "Taulukon tiedot"
958
+
959
+ #: views/view-edit.php:132
960
+ msgid "Table Content"
961
+ msgstr "Taulukon sisältö"
962
+
963
+ #: views/view-edit.php:133
964
+ msgid "Table Manipulation"
965
+ msgstr "Taulukon muokkaus"
966
+
967
+ #: views/view-edit.php:134 views/view-edit.php:520
968
+ msgid "Table Options"
969
+ msgstr "Taulukon tiedot"
970
+
971
+ #: views/view-edit.php:135
972
+ msgid "Features of the DataTables JavaScript library"
973
+ msgstr "DataTables JavaScript- kirjaston ominaisuudet"
974
+
975
+ #: views/view-edit.php:161
976
+ msgid "Insert into Table"
977
+ msgstr "Lisää taulukkoon"
978
+
979
+ #: views/view-edit.php:190
980
+ msgid "Table ID"
981
+ msgstr "Taulukon ID"
982
+
983
+ #: views/view-edit.php:193
984
+ msgid ""
985
+ "The Table ID can only consist of letters, numbers, hyphens (-), and "
986
+ "underscores (_)."
987
+ msgstr ""
988
+ "Taulukon ID voi muodostua ainoastaan kirjaimista, numeroista sekä väli-, ja "
989
+ "alaviivoista"
990
+
991
+ #: views/view-edit.php:194
992
+ msgid "Shortcode"
993
+ msgstr "Shortcode"
994
+
995
+ #: views/view-edit.php:207 views/view-list.php:323
996
+ msgid "Last Modified"
997
+ msgstr "Muokattu viimeksi"
998
+
999
+ #: views/view-edit.php:208
1000
+ msgid "%1$s by %2$s"
1001
+ msgstr "%1$s by %2$s"
1002
+
1003
+ #: views/view-edit.php:328
1004
+ msgid "Insert Link"
1005
+ msgstr "Lisää linkki"
1006
+
1007
+ #: views/view-edit.php:329
1008
+ msgid "Insert Image"
1009
+ msgstr "Lisää kuva"
1010
+
1011
+ #: views/view-edit.php:330
1012
+ msgid "Advanced Editor"
1013
+ msgstr "Edistynyt muokkain"
1014
+
1015
+ #: views/view-edit.php:333
1016
+ msgid "Combine cells"
1017
+ msgstr "Yhdistä alkioita"
1018
+
1019
+ #: views/view-edit.php:334
1020
+ msgid "in a column (rowspan)"
1021
+ msgstr "sarakkeeseen (riviväli)"
1022
+
1023
+ #: views/view-edit.php:335
1024
+ msgid "in a row (colspan)"
1025
+ msgstr "riviin (sarakeväli)"
1026
+
1027
+ #: views/view-edit.php:336
1028
+ msgid "?"
1029
+ msgstr "?"
1030
+
1031
+ #: views/view-edit.php:336
1032
+ msgid "Help on combining cells"
1033
+ msgstr "Apua rivien yhdistämiseen"
1034
+
1035
+ #: views/view-edit.php:338
1036
+ msgid "Table cells can span across more than one column or row."
1037
+ msgstr "Alkiot voivat käsittää enemmän kuin yhden sarakkeen tai rivin."
1038
+
1039
+ #: views/view-edit.php:339
1040
+ #, fuzzy
1041
+ msgid ""
1042
+ "Combining consecutive cells within the same row is called &#8220;"
1043
+ "colspanning&#8221;."
1044
+ msgstr ""
1045
+ "Combining consecutive cells within the same row is called &#8220;"
1046
+ "colspanning&#8221;."
1047
+
1048
+ #: views/view-edit.php:340
1049
+ #, fuzzy
1050
+ msgid ""
1051
+ "Combining consecutive cells within the same column is called &#8220;"
1052
+ "rowspanning&#8221;."
1053
+ msgstr ""
1054
+ "Combining consecutive cells within the same column is called &#8220;"
1055
+ "rowspanning&#8221;."
1056
+
1057
+ #: views/view-edit.php:341
1058
+ #, fuzzy
1059
+ msgid ""
1060
+ "To combine adjacent cells in a row, add the keyword <code>#colspan#</code> "
1061
+ "to the cell to the right of the one with the content for the combined cell "
1062
+ "by using the corresponding button."
1063
+ msgstr ""
1064
+ "To combine adjacent cells in a row, add the keyword <code>#colspan#</code> "
1065
+ "to the cell to the right of the one with the content for the combined cell "
1066
+ "by using the corresponding button."
1067
+
1068
+ #: views/view-edit.php:342
1069
+ #, fuzzy
1070
+ msgid ""
1071
+ "To combine adjacent cells in a column, add the keyword <code>#rowspan#</"
1072
+ "code> to the cell below the one with the content for the combined cell by "
1073
+ "using the corresponding button."
1074
+ msgstr ""
1075
+ "To combine adjacent cells in a column, add the keyword <code>#rowspan#</"
1076
+ "code> to the cell below the one with the content for the combined cell by "
1077
+ "using the corresponding button."
1078
+
1079
+ #: views/view-edit.php:343
1080
+ msgid "Repeat this to add the keyword to all cells that shall be connected."
1081
+ msgstr ""
1082
+ "Toista tämä lisätäksesi avainsana kaikkiin alkioihin, jotka yhdistetään."
1083
+
1084
+ #: views/view-edit.php:344
1085
+ msgid ""
1086
+ "Be aware that the functions of the DataTables JavaScript library will not "
1087
+ "work on tables which have combined cells."
1088
+ msgstr ""
1089
+ "Huomioi, että DataTables JavaScript- kirjaston funktiot ei toimi "
1090
+ "taulukoissa, joissa on yhdistettyjä alkioita."
1091
+
1092
+ #: views/view-edit.php:350 views/view-edit.php:362
1093
+ msgid "Selected rows"
1094
+ msgstr "Valitut rivit"
1095
+
1096
+ #: views/view-edit.php:351 views/view-edit.php:356
1097
+ msgid "Hide"
1098
+ msgstr "Piilota"
1099
+
1100
+ #: views/view-edit.php:352 views/view-edit.php:357
1101
+ msgid "Show"
1102
+ msgstr "Näytä"
1103
+
1104
+ #: views/view-edit.php:355 views/view-edit.php:368
1105
+ msgid "Selected columns"
1106
+ msgstr "Valitut sarakkeet"
1107
+
1108
+ #: views/view-edit.php:363 views/view-edit.php:369
1109
+ msgid "Duplicate"
1110
+ msgstr "Monista"
1111
+
1112
+ #: views/view-edit.php:364 views/view-edit.php:370
1113
+ msgid "Insert"
1114
+ msgstr "Lisää"
1115
+
1116
+ #: views/view-edit.php:365 views/view-edit.php:371 views/view-list.php:421
1117
+ msgid "Delete"
1118
+ msgstr "Poista"
1119
+
1120
+ #: views/view-edit.php:376
1121
+ msgid "Add %s row(s)"
1122
+ msgstr "Lisää %s rivi/rivejä"
1123
+
1124
+ #: views/view-edit.php:376 views/view-edit.php:379
1125
+ msgid "Add"
1126
+ msgstr "Lisää"
1127
+
1128
+ #: views/view-edit.php:379
1129
+ msgid "Add %s column(s)"
1130
+ msgstr "Lisää %s sarake/sarakkeita"
1131
+
1132
+ #: views/view-edit.php:383
1133
+ msgid ""
1134
+ "To use the Table Manipulation features, JavaScript needs to be enabled in "
1135
+ "your browser."
1136
+ msgstr ""
1137
+ "Käyttääksesi taulukonmuokkausominaisuuksia, JavaScript pitää olla sallittuna "
1138
+ "selaimessasi."
1139
+
1140
+ #: views/view-edit.php:418
1141
+ msgid "Other Actions"
1142
+ msgstr "Muut toiminnot"
1143
+
1144
+ #: views/view-edit.php:420
1145
+ msgid "Delete Table"
1146
+ msgstr "Poista taulukko"
1147
+
1148
+ #: views/view-edit.php:422
1149
+ msgid "Export Table"
1150
+ msgstr "Vie taulukko"
1151
+
1152
+ #: views/view-edit.php:446
1153
+ msgid "Cancel"
1154
+ msgstr "Keskeytä"
1155
+
1156
+ #: views/view-edit.php:447
1157
+ msgid "OK"
1158
+ msgstr "OK"
1159
+
1160
+ #: views/view-edit.php:468 views/view-edit.php:520
1161
+ msgid "Table Head Row"
1162
+ msgstr "Taulukon päärivi"
1163
+
1164
+ #: views/view-edit.php:469
1165
+ msgid "The first row of the table is the table header."
1166
+ msgstr "Taulukon ensimmäinen rivi on otsikko."
1167
+
1168
+ #: views/view-edit.php:472
1169
+ msgid "Table Foot Row"
1170
+ msgstr "Taulukon alarivi"
1171
+
1172
+ #: views/view-edit.php:473
1173
+ msgid "The last row of the table is the table footer."
1174
+ msgstr "Taulukon viimeinen rivi on otsikko"
1175
+
1176
+ #: views/view-edit.php:476
1177
+ msgid "Alternating Row Colors"
1178
+ msgstr "Rivivärien muuttaminen"
1179
+
1180
+ #: views/view-edit.php:477
1181
+ msgid "The background colors of consecutive rows shall alternate."
1182
+ msgstr "Peräkkäisten rivien taustavärit voivat muuttua."
1183
+
1184
+ #: views/view-edit.php:480
1185
+ msgid "Row Hover Highlighting"
1186
+ msgstr "Kelluva korostus"
1187
+
1188
+ #: views/view-edit.php:481
1189
+ msgid ""
1190
+ "Highlight a row while the mouse cursor hovers above it by changing its "
1191
+ "background color."
1192
+ msgstr "Korosta rivi kun hiiri on sen päällä muuttamalla taustaväri."
1193
+
1194
+ #: views/view-edit.php:484
1195
+ msgid "Print Table Name"
1196
+ msgstr "Tulosta taulukon nimi"
1197
+
1198
+ #: views/view-edit.php:487 views/view-edit.php:497
1199
+ msgid "above"
1200
+ msgstr "yläpuolelle"
1201
+
1202
+ #: views/view-edit.php:488 views/view-edit.php:498
1203
+ msgid "below"
1204
+ msgstr "alapuolelle"
1205
+
1206
+ #: views/view-edit.php:491
1207
+ msgid "The table name shall be written %s the table."
1208
+ msgstr "Taulukon nimi kirjoitetaan taulukon %s "
1209
+
1210
+ #: views/view-edit.php:494
1211
+ msgid "Print Table Description"
1212
+ msgstr "Tulosta taulukon kuvaus"
1213
+
1214
+ #: views/view-edit.php:501
1215
+ msgid "The table description shall be written %s the table."
1216
+ msgstr "Taulukon kuvaus kirjoitetaan taulukon %s"
1217
+
1218
+ #: views/view-edit.php:504
1219
+ msgid "Extra CSS Classes"
1220
+ msgstr "Extra CSS-luokat"
1221
+
1222
+ #: views/view-edit.php:505
1223
+ msgid ""
1224
+ "This field can only contain letters, numbers, spaces, hyphens (-), and "
1225
+ "underscores (_)."
1226
+ msgstr ""
1227
+ "Tämä kenttä voi sisältää vain kirjaimia, numeroita, välilyöntejä sekä väli- "
1228
+ "ja alaviivoja."
1229
+
1230
+ #: views/view-edit.php:505
1231
+ msgid "Additional CSS classes for styling purposes can be entered here."
1232
+ msgstr "Lisää CSS-luokkia voi lisätä tähän."
1233
+
1234
+ #: views/view-edit.php:505
1235
+ msgid "This is NOT the place to enter <a href=\"%s\">Custom CSS</a> code!"
1236
+ msgstr "Tämä ei ole oikea paikka lisätä <a href=\"%s\">Custom CSS</a> koodi!"
1237
+
1238
+ #: views/view-edit.php:520
1239
+ msgid ""
1240
+ "These features and options are only available, when the &#8220;%1$s&#8221; "
1241
+ "checkbox in the &#8220;%2$s&#8221; section is checked."
1242
+ msgstr ""
1243
+ "Nämä ominaisuudet ovat käytössä vain, kun &#8220;%1$s&#8221; täppä &#8220;"
1244
+ "%2$s&#8221; osiossa on valittu."
1245
+
1246
+ #: views/view-edit.php:524
1247
+ msgid "Use DataTables"
1248
+ msgstr "Käytä DataTablesia"
1249
+
1250
+ #: views/view-edit.php:525
1251
+ msgid ""
1252
+ "Use the following features of the DataTables JavaScript library with this "
1253
+ "table:"
1254
+ msgstr ""
1255
+ "Käytä seuraavia ominaisuuksia DataTables JavaScript-kirjastosta tässä "
1256
+ "taulukossa:"
1257
+
1258
+ #: views/view-edit.php:528
1259
+ msgid "Sorting"
1260
+ msgstr "Järjestely"
1261
+
1262
+ #: views/view-edit.php:529
1263
+ msgid "Enable sorting of the table by the visitor."
1264
+ msgstr "Anna vierailijan järjestää taulukko."
1265
+
1266
+ #: views/view-edit.php:532
1267
+ msgid "Search/Filtering"
1268
+ msgstr "Haku/Suodatus"
1269
+
1270
+ #: views/view-edit.php:533
1271
+ msgid ""
1272
+ "Enable the visitor to filter or search the table. Only rows with the search "
1273
+ "word in them are shown."
1274
+ msgstr ""
1275
+ "Anna vierailijan käyttää hakua/suodatusta. Ainoastaan rivit joissa on "
1276
+ "hakusana näytetään."
1277
+
1278
+ #: views/view-edit.php:536
1279
+ msgid "Pagination"
1280
+ msgstr "Pagination"
1281
+
1282
+ #: views/view-edit.php:537
1283
+ msgid ""
1284
+ "Enable pagination of the table (viewing only a certain number of rows at a "
1285
+ "time) by the visitor."
1286
+ msgstr "Salli vierailijan muokata näkyvien rivien määrää taulukossa"
1287
+
1288
+ #: views/view-edit.php:538
1289
+ msgid "Show %s rows per page."
1290
+ msgstr "Näytä %s riviä sivulla"
1291
+
1292
+ #: views/view-edit.php:541
1293
+ msgid "Pagination Length Change"
1294
+ msgstr "Näkyvien rivien määrän vaihto"
1295
+
1296
+ #: views/view-edit.php:542
1297
+ msgid ""
1298
+ "Allow the visitor to change the number of rows shown when using pagination."
1299
+ msgstr "Anna vierailijan vaihtaa näytettävien rivien lukumäärä sivulla"
1300
+
1301
+ #: views/view-edit.php:545
1302
+ msgid "Info"
1303
+ msgstr "Info"
1304
+
1305
+ #: views/view-edit.php:546
1306
+ msgid ""
1307
+ "Enable the table information display, with information about the currently "
1308
+ "visible data, like the number of rows."
1309
+ msgstr "Salli taulukon tietojen näyttäminen."
1310
+
1311
+ #: views/view-edit.php:549
1312
+ msgid "Horizontal Scrolling"
1313
+ msgstr "Vaakasuora scrollaus."
1314
+
1315
+ #: views/view-edit.php:550
1316
+ msgid ""
1317
+ "Enable horizontal scrolling, to make viewing tables with many columns easier."
1318
+ msgstr "Salli vaakasuora scrollaus."
1319
+
1320
+ #: views/view-edit.php:556
1321
+ msgid "Custom Commands"
1322
+ msgstr "Custom komennot"
1323
+
1324
+ #: views/view-edit.php:557
1325
+ msgid ""
1326
+ "Additional parameters from the <a href=\"http://www.datatables.net/"
1327
+ "\">DataTables documentation</a> to be added to the JS call."
1328
+ msgstr ""
1329
+ "LIsää parametreja <a href=\"http://www.datatables.net/\">DataTables "
1330
+ "documentatoinnista</a> lisättäväksi JS kutsuun"
1331
+
1332
+ #: views/view-edit.php:557
1333
+ msgid "For advanced use only."
1334
+ msgstr "Edistyneille käyttäjille."
1335
+
1336
+ #: views/view-edit.php:572
1337
+ msgid ""
1338
+ "On this screen, you can edit the content and structure of the table with the "
1339
+ "ID %s."
1340
+ msgstr "Tässä näkymässä voit muokata taulukko ID %s:n sisältöä ja rakennetta."
1341
+
1342
+ #: views/view-edit.php:573
1343
+ msgid ""
1344
+ "For example, you can insert things like text, images, or links into the "
1345
+ "table, or change the used table features. You can also insert, delete, move, "
1346
+ "hide, and swap columns and rows."
1347
+ msgstr ""
1348
+ "Voit esimerkiksi lisätä tekstiä, kuvia tai linkkejä taulkkoon, tai vaihtaa "
1349
+ "taulukon ominaisuuksia. Voit myös lisätä, poistaa, siirtää, piilottaa tai "
1350
+ "vaihtaa sarakkeita ja rivejä."
1351
+
1352
+ #: views/view-edit.php:576
1353
+ msgid ""
1354
+ "To insert the table into a page, post, or text widget, copy the Shortcode %s "
1355
+ "and paste it at the desired place in the editor."
1356
+ msgstr ""
1357
+ "Lisätäksesi taulukon sivulle, artikkeliin tai vimpaimeen, kopioi Shortcode "
1358
+ "%s ja lisää se haluttuun paikkaan muokkaimessa."
1359
+
1360
+ #: views/view-edit.php:596
1361
+ msgid "TablePress Feature: Moving rows and columns"
1362
+ msgstr "TablePress ominaisuus: Siirrä rivejä ja sarakkeita"
1363
+
1364
+ #: views/view-edit.php:597
1365
+ msgid ""
1366
+ "Did you know? You can drag and drop rows and columns via the row number and "
1367
+ "the column title. And the arrows next to the column title can be used for "
1368
+ "sorting."
1369
+ msgstr ""
1370
+ "Tiesitkö? Voit siirtää rivejä ja sarakkeita raahaamalla rivinumerosta ja "
1371
+ "sarakkeen otsikosta. Sarakkeen otsikon vieressä olevia nuolia voi käyttää "
1372
+ "taulukon järjestämiseen."
1373
+
1374
+ #: views/view-editor_button_thickbox.php:71
1375
+ #: views/view-editor_button_thickbox.php:132
1376
+ msgid "List of Tables"
1377
+ msgstr "Lista taulukoista"
1378
+
1379
+ #: views/view-editor_button_thickbox.php:135
1380
+ msgid "This is a list of all available tables."
1381
+ msgstr "Tämä on lista kaikista taulukoista."
1382
+
1383
+ #: views/view-editor_button_thickbox.php:135
1384
+ msgid "You may insert a table into a post or page here."
1385
+ msgstr "Voit lisätä taulukon artikkeliin tai sivulle tästä."
1386
+
1387
+ #: views/view-editor_button_thickbox.php:137
1388
+ msgid ""
1389
+ "Click the &#8220;%1$s&#8221; button for the desired table to automatically "
1390
+ "insert the<br />corresponding Shortcode (%2$s) into the editor."
1391
+ msgstr ""
1392
+ "Paina &#8220;%1$s&#8221; näppäintä halutulle taulukolle lisätäksesi "
1393
+ "automaattisesti<br />Shortcode (%2$s) tekstimuokkaimeen."
1394
+
1395
+ #: views/view-editor_button_thickbox.php:137
1396
+ #: views/view-editor_button_thickbox.php:313
1397
+ msgid "Insert Shortcode"
1398
+ msgstr "Lisää shortcode"
1399
+
1400
+ #: views/view-editor_button_thickbox.php:141 views/view-list.php:197
1401
+ msgid "Search results for &#8220;%s&#8221;"
1402
+ msgstr "Hakutulokset &#8220;%s&#8221;"
1403
+
1404
+ #: views/view-editor_button_thickbox.php:146 views/view-list.php:203
1405
+ msgid "Search Tables"
1406
+ msgstr "Etsi taulukoita"
1407
+
1408
+ #: views/view-editor_button_thickbox.php:235 views/view-list.php:318
1409
+ msgid "ID"
1410
+ msgstr "ID"
1411
+
1412
+ #: views/view-editor_button_thickbox.php:238
1413
+ msgid "Action"
1414
+ msgstr "Toiminto"
1415
+
1416
+ #: views/view-editor_button_thickbox.php:300 views/view-list.php:438
1417
+ msgid "(no description)"
1418
+ msgstr "(ei kuvausta)"
1419
+
1420
+ #: views/view-editor_button_thickbox.php:322 views/view-export.php:81
1421
+ #: views/view-list.php:544
1422
+ msgid "No tables found."
1423
+ msgstr "Taulukoita ei löytynyt."
1424
+
1425
+ #: views/view-editor_button_thickbox.php:324
1426
+ msgid ""
1427
+ "You should add or import a table on the TablePress screens to get started!"
1428
+ msgstr ""
1429
+ "Sinun pitäisi lisätä tai tuoda taululoita TablePressiin päästäksesi alkuun."
1430
+
1431
+ #: views/view-export.php:35
1432
+ msgid "Error: The export failed."
1433
+ msgstr "Virhe: Vienti epäonnistui."
1434
+
1435
+ #: views/view-export.php:36 views/view-list.php:103
1436
+ msgid "Error: This table could not be loaded!"
1437
+ msgstr "Virhe: Tätä taulukkoa ei voitu ladata."
1438
+
1439
+ #: views/view-export.php:37
1440
+ msgid "Error: The ZIP file could not be created."
1441
+ msgstr "Virhe: ZIP- tiedostoa ei voitu luoda."
1442
+
1443
+ #: views/view-export.php:42 views/view-export.php:45
1444
+ msgid "Export Tables"
1445
+ msgstr "Vie taulukoita"
1446
+
1447
+ #: views/view-export.php:46
1448
+ msgctxt "button"
1449
+ msgid "Download Export File"
1450
+ msgstr "Lataa Vientitiedosto"
1451
+
1452
+ #: views/view-export.php:59
1453
+ msgid ""
1454
+ "Exporting a table allows you to use it in other programs, like spreadsheets "
1455
+ "applications."
1456
+ msgstr "Taulukon vienti mahdollistaa sen käytön muissa ohjelmissa."
1457
+
1458
+ #: views/view-export.php:60
1459
+ msgid ""
1460
+ "Regularly exporting tables is also recommended as a backup of your data."
1461
+ msgstr "Kannattaa viedä taulukoita säännöllisesti varmuuskopioidaksesi datan."
1462
+
1463
+ #: views/view-export.php:63
1464
+ msgid "To export, select the tables and the desired export format."
1465
+ msgstr "Valitse taulukot ja haluttu vientimuoto."
1466
+
1467
+ #: views/view-export.php:64
1468
+ msgid ""
1469
+ "If you choose more than one table, the exported files will automatically be "
1470
+ "stored in a ZIP archive file."
1471
+ msgstr ""
1472
+ "Jos valitset enemmän kuin yhden taulukon, viedyt taulukot säilötään "
1473
+ "automaattisesti ZIP-tiedostoon."
1474
+
1475
+ #: views/view-export.php:66
1476
+ msgid ""
1477
+ "Be aware that for the CSV and HTML formats only the table data, but no table "
1478
+ "options are exported!"
1479
+ msgstr "CVS- ja HTML- muodoissa ainoastaan data siirretään, ei asetukset."
1480
+
1481
+ #: views/view-export.php:67
1482
+ msgid "For the JSON format, the table data and the table options are exported."
1483
+ msgstr "JSON- formaatille, taulukkodata ja asetukset viedään."
1484
+
1485
+ #: views/view-export.php:82 views/view-list.php:553
1486
+ msgid ""
1487
+ "You should <a href=\"%s\">add</a> or <a href=\"%s\">import</a> a table to "
1488
+ "get started!"
1489
+ msgstr ""
1490
+ "Sinun pitäisi <a href=\"%s\">lisätä</a> tai <a href=\"%s\">tuoda</a> "
1491
+ "taulukko päästäksesi alkuun!"
1492
+
1493
+ #: views/view-export.php:97
1494
+ msgid "Tables to Export"
1495
+ msgstr "Vietävät taulukot"
1496
+
1497
+ #: views/view-export.php:100
1498
+ msgid "Select all"
1499
+ msgstr "Valitse kaikki"
1500
+
1501
+ #: views/view-export.php:118 views/view-import.php:191
1502
+ msgid "ID %1$s: %2$s"
1503
+ msgstr "ID %1$s: %2$s"
1504
+
1505
+ #: views/view-export.php:126
1506
+ msgid ""
1507
+ "You can select multiple tables by holding down the &#8220;Ctrl&#8221; key "
1508
+ "(Windows) or the &#8220;Command&#8221; key (Mac)."
1509
+ msgstr ""
1510
+ "Voit valita useita taulukoita painamalla pohjaan &#8220;Ctrl&#8221; "
1511
+ "näppäimen."
1512
+
1513
+ #: views/view-export.php:131
1514
+ msgid "Export Format"
1515
+ msgstr "Vientimuoto"
1516
+
1517
+ #: views/view-export.php:144
1518
+ msgid "CSV Delimiter"
1519
+ msgstr "CVS Delimiter"
1520
+
1521
+ #: views/view-export.php:153
1522
+ msgid "(Only needed for CSV export.)"
1523
+ msgstr "(Vaaditaan ainoastaan CVS- viennille.)"
1524
+
1525
+ #: views/view-export.php:157
1526
+ msgid "ZIP file"
1527
+ msgstr "ZIP- tiedosto"
1528
+
1529
+ #: views/view-export.php:163
1530
+ msgid "Create a ZIP archive."
1531
+ msgstr "Luo ZIP- tiedosto"
1532
+
1533
+ #: views/view-export.php:163
1534
+ msgid "(Mandatory if more than one table is selected.)"
1535
+ msgstr "(Pakollinen jos enemmän kuin yksi taulukko on valittu)"
1536
+
1537
+ #: views/view-export.php:166
1538
+ msgid ""
1539
+ "Note: Support for ZIP file creation seems not to be available on this server."
1540
+ msgstr ""
1541
+ "Huomaa: ZIP-tiedoston luominen ei näytä olevan mahdollista palvelimella."
1542
+
1543
+ #: views/view-import.php:45 views/view-import.php:57
1544
+ msgid "Error: You did not select what to import from WP-Table Reloaded!"
1545
+ msgstr "Virhe: Et valinnut mitä haluat tuoda WP-Table Reloadedista!"
1546
+
1547
+ #: views/view-import.php:50
1548
+ msgid "Error: The import failed."
1549
+ msgstr "Virhe: tuonti epäonnistui"
1550
+
1551
+ #: views/view-import.php:51
1552
+ msgid "Error: Import of ZIP files is not available on this server."
1553
+ msgstr "Virhe: ZIP- tiedostojen tuonti ei ole mahdollista palvelimella."
1554
+
1555
+ #: views/view-import.php:52
1556
+ msgid "Error: The ZIP file could not be opened."
1557
+ msgstr "Virhe: ZIP- tiedostoa ei voitu avata."
1558
+
1559
+ #: views/view-import.php:53
1560
+ msgid "Error: The data in the ZIP file is invalid."
1561
+ msgstr "Virhe: data ZIP- tiedostossa ei kelpaa."
1562
+
1563
+ #: views/view-import.php:54
1564
+ msgid ""
1565
+ "Error: You selected to replace or append to an existing table, but did not "
1566
+ "select a table."
1567
+ msgstr ""
1568
+ "Virhe: Valitsit korvata olemassaolevan taulukon, mutta et valinnut taulukkoa."
1569
+
1570
+ #: views/view-import.php:55
1571
+ msgid "Error: The source for the import is invalid or could not be accessed."
1572
+ msgstr "Virhe: Tuonnin lähde ei kelpaa tai siihen ei pääse käsiksi."
1573
+
1574
+ #: views/view-import.php:56
1575
+ msgid "Error: The data for the import is invalid."
1576
+ msgstr "Virhe: Tuontidata ei kelpaa."
1577
+
1578
+ #: views/view-import.php:58
1579
+ msgid ""
1580
+ "Error: Existing WP-Table Reloaded tables were not found in the database."
1581
+ msgstr ""
1582
+ "Virhe: Olemassaolevat WP-Table Reloaded- taulukot eivät löytyneet "
1583
+ "tietokannasta."
1584
+
1585
+ #: views/view-import.php:59
1586
+ msgid "Error: The tables from WP-Table Reloaded could not be imported."
1587
+ msgstr "Virhe: Taulukoita WP-Table Reloadedista ei voitu tuoda."
1588
+
1589
+ #: views/view-import.php:60
1590
+ msgid "Error: The WP-Table Reloaded Dump File could not be imported!"
1591
+ msgstr "Virhe: WP-Table Reloaded Dump-tiedostoa ei voitu tuoda."
1592
+
1593
+ #: views/view-import.php:64
1594
+ msgid "Import Tables"
1595
+ msgstr "Tuo taulukoita"
1596
+
1597
+ #: views/view-import.php:66
1598
+ msgid "Import from WP-Table Reloaded"
1599
+ msgstr "Tuo taulukoita WP-Table Reloadedista"
1600
+
1601
+ #: views/view-import.php:92
1602
+ msgid ""
1603
+ "TablePress can import tables from existing data, like from a CSV file from a "
1604
+ "spreadsheet application (e.g. Excel), an HTML file resembling a webpage, or "
1605
+ "its own JSON format."
1606
+ msgstr ""
1607
+ "TablePress voi tuoda taulukota olemassaolvasta datasta, kuten CVS- "
1608
+ "tiedostosta tai omasta JSON- muodosta."
1609
+
1610
+ #: views/view-import.php:93
1611
+ msgid ""
1612
+ "You can also import existing tables from the WP-Table Reloaded plugin below."
1613
+ msgstr ""
1614
+ "Voit myös tuoda olemassaolevia taulukoita WP-Table Reloaded- lisäosasta alta."
1615
+
1616
+ #: views/view-import.php:96
1617
+ msgid ""
1618
+ "To import a table, select and enter the import source in the following form."
1619
+ msgstr ""
1620
+ "Tuodaksesi taulukon, valitse ja syötä tuontilähde seuraavassa muodossa."
1621
+
1622
+ #: views/view-import.php:96
1623
+ msgid ""
1624
+ "You can also choose to import it as a new table, to replace an existing "
1625
+ "table, or to append the rows to an existing table."
1626
+ msgstr ""
1627
+ "Voit myös tuoda sen uutena taulukkona, korvata olemassaolevan taulukon tai "
1628
+ "lisätä rivit olemassaolevaan taulukkoon."
1629
+
1630
+ #: views/view-import.php:111 views/view-import.php:226
1631
+ msgid "Import Source"
1632
+ msgstr "Tuontilähde"
1633
+
1634
+ #: views/view-import.php:113
1635
+ msgid "File Upload"
1636
+ msgstr "Tiedoston lataus"
1637
+
1638
+ #: views/view-import.php:114
1639
+ msgid "URL"
1640
+ msgstr "URL"
1641
+
1642
+ #: views/view-import.php:115
1643
+ msgid "File on server"
1644
+ msgstr "Tiedosto palvelimella"
1645
+
1646
+ #: views/view-import.php:116
1647
+ msgid "Manual Input"
1648
+ msgstr "Manuaalinen syöte"
1649
+
1650
+ #: views/view-import.php:120 views/view-import.php:233
1651
+ msgid "Select file"
1652
+ msgstr "Valitse tiedosto"
1653
+
1654
+ #: views/view-import.php:125 views/view-import.php:135
1655
+ #: views/view-import.php:145
1656
+ msgid "You can import multiple tables by placing them in a ZIP file."
1657
+ msgstr "Voit tuoda useita taulukoita lisäämällä ne ZIP-tiedostoon"
1658
+
1659
+ #: views/view-import.php:130
1660
+ msgid "File URL"
1661
+ msgstr "Tiedoston URL"
1662
+
1663
+ #: views/view-import.php:140
1664
+ msgid "Server Path to file"
1665
+ msgstr "Palvelimen polku tiedostoon"
1666
+
1667
+ #: views/view-import.php:150
1668
+ msgid "Import data"
1669
+ msgstr "Tuo dataa"
1670
+
1671
+ #: views/view-import.php:156
1672
+ msgid "Import Format"
1673
+ msgstr "Tuontimuoto"
1674
+
1675
+ #: views/view-import.php:168
1676
+ msgid "Import of HTML files is not available on your server."
1677
+ msgstr "HTML tiedostojen tuonti ei ole sallittu palvelimellasi"
1678
+
1679
+ #: views/view-import.php:173
1680
+ msgid "Add, Replace, or Append?"
1681
+ msgstr "Lisää, korvaa vai Lisää taulukkoon?"
1682
+
1683
+ #: views/view-import.php:175
1684
+ msgid "Add as new table"
1685
+ msgstr "Lisää uutena taulukkona"
1686
+
1687
+ #: views/view-import.php:176
1688
+ msgid "Replace existing table"
1689
+ msgstr "Korvaa olemassaoleva taulukko"
1690
+
1691
+ #: views/view-import.php:177
1692
+ msgid "Append rows to existing table"
1693
+ msgstr "Lisää rivit olemassaolevaan taulukkoon"
1694
+
1695
+ #: views/view-import.php:181
1696
+ msgid "Table to replace or append to"
1697
+ msgstr "Taulukko, joka korvata tai johon lisätä"
1698
+
1699
+ #: views/view-import.php:184
1700
+ msgid "&mdash; Select &mdash;"
1701
+ msgstr "&mdash; Valitse &mdash;"
1702
+
1703
+ #: views/view-import.php:201
1704
+ msgctxt "button"
1705
+ msgid "Import"
1706
+ msgstr "Tuo"
1707
+
1708
+ #: views/view-import.php:216
1709
+ msgid ""
1710
+ "To import all tables from a WP-Table Reloaded installation, choose the "
1711
+ "relevant import source below."
1712
+ msgstr ""
1713
+ "Tuodaksesi kaikki taulukot WP-Table Reloaded asennuksesta, valitse oikea "
1714
+ "lähde alta."
1715
+
1716
+ #: views/view-import.php:218
1717
+ msgid ""
1718
+ "If WP-Table Reloaded is installed on this site, the &#8220;WordPress "
1719
+ "database&#8221; option is recommended."
1720
+ msgstr ""
1721
+ "Jos WP-Table Reloaded on asennettu tällle sivulle, &#8220;WordPress "
1722
+ "tietokanta&#8221; valinta on suositeltu."
1723
+
1724
+ #: views/view-import.php:219
1725
+ msgid ""
1726
+ "If you want to import tables from another site, create a &#8220;WP-Table "
1727
+ "Reloaded Dump File&#8221; there and upload it below, after choosing &#8220;"
1728
+ "WP-Table Reloaded Dump File&#8221;."
1729
+ msgstr ""
1730
+ "Jos haluat tuoda taulukoita toiselta sivulta, luo &#8220;WP-Table Reloaded "
1731
+ "Dump tiedosto&#8221; sinne ja lataa se alle valittuasi &#8220;WP-Table "
1732
+ "Reloaded Dump tiedoston&#8221;."
1733
+
1734
+ #: views/view-import.php:221
1735
+ msgid ""
1736
+ "Before doing this, it is highly recommended to read the <a href=\"%s"
1737
+ "\">migration guide</a> on the TablePress website."
1738
+ msgstr ""
1739
+ "Ennen kuin teet tämän, kannattaa lukea <a href=\"%s\">migration guide</a> "
1740
+ "TablePress sivulla."
1741
+
1742
+ #: views/view-import.php:228
1743
+ msgid "WordPress database"
1744
+ msgstr "WordPress tietokanta"
1745
+
1746
+ #: views/view-import.php:229
1747
+ msgid "WP-Table Reloaded Dump File"
1748
+ msgstr "WP-Table Reloaded Dump tiedosto"
1749
+
1750
+ #: views/view-import.php:243
1751
+ msgid "Import tables"
1752
+ msgstr "Tuo kaikki tiedostot"
1753
+
1754
+ #: views/view-import.php:244
1755
+ msgid "Import all tables and their settings from WP-Table Reloaded."
1756
+ msgstr "Tuo kaikki tiedostot ja niiden asetukset WP-Table Reloadedista."
1757
+
1758
+ #: views/view-import.php:244 views/view-options.php:113
1759
+ msgid "<span class=\"description\">(recommended)</span>"
1760
+ msgstr "<span class=\"description\">(suositeltu)</span>"
1761
+
1762
+ #: views/view-import.php:247
1763
+ msgid "Import styling"
1764
+ msgstr "Tuo tyyli"
1765
+
1766
+ #: views/view-import.php:248
1767
+ msgid ""
1768
+ "Try to automatically convert the &#8220;Custom CSS&#8221; code from the "
1769
+ "&#8220;Plugin Options&#8221; screen of WP-Table Reloaded."
1770
+ msgstr ""
1771
+ "Yritä automaattisesti siirtää &#8220;Custom CSS&#8221; -koodi WP-Table "
1772
+ "Reloadedin &#8220;lisäosa-asetuksista&#8221;"
1773
+
1774
+ #: views/view-import.php:252
1775
+ msgctxt "button"
1776
+ msgid "Import from WP-Table Reloaded"
1777
+ msgstr "Tuo WP-Table Reloadedista"
1778
+
1779
+ #: views/view-import.php:277
1780
+ msgid "TablePress Feature: Import from WP-Table Reloaded"
1781
+ msgstr "TablePress Ominaisuus: tuo WP-Table Reloadedista"
1782
+
1783
+ #: views/view-import.php:278
1784
+ msgid ""
1785
+ "You can import your existing tables and &#8220;Custom CSS&#8221; from WP-"
1786
+ "Table Reloaded into TablePress."
1787
+ msgstr ""
1788
+ "Voit tuoda olemassaolevat taulukot ja &#8220;Custom CSS&#8221;:n WP-Table "
1789
+ "Reloadedista TablePressiin"
1790
+
1791
+ #: views/view-list.php:46
1792
+ msgid "To embed this table into a post or page, use this Shortcode:"
1793
+ msgstr ""
1794
+ "Lisätäksesi tämän taulukon artikkeliin tai sivulle, käytä tätä Shortcodea:"
1795
+
1796
+ #: views/view-list.php:47
1797
+ msgid ""
1798
+ "Thank you very much! Your donation is highly appreciated. You just "
1799
+ "contributed to the further development of TablePress!"
1800
+ msgstr ""
1801
+ "Kiitos paljon! Lahjoitustasi arvostetaan. Osallistuit juuri TablePressin "
1802
+ "kehitykseen."
1803
+
1804
+ #: views/view-list.php:48
1805
+ msgid ""
1806
+ "No problem! I still hope you enjoy the benefits that TablePress adds to your "
1807
+ "site. If you should change your mind, you'll always find the &#8220;"
1808
+ "Donate&#8221; button on the <a href=\"%s\">TablePress website</a>."
1809
+ msgstr ""
1810
+ "Ei se mitään! Toivottavasti pidät TablePressin tuomista hyödyistä sivullesi. "
1811
+ "Jos muutat mieltäsi, löydät aina &#8220;Donate&#8221; nappulan <a href=\"%s"
1812
+ "\">TablePress nettisivulta</a>."
1813
+
1814
+ #: views/view-list.php:54
1815
+ msgid "Welcome!"
1816
+ msgstr "Tervetuloa!"
1817
+
1818
+ #: views/view-list.php:55
1819
+ msgid "Thank you for using TablePress for the first time!"
1820
+ msgstr "Kiitos kun käytät TablePressiä ensimmäisen kerran!"
1821
+
1822
+ #: views/view-list.php:56
1823
+ msgid ""
1824
+ "If you encounter any questions or problems, please visit the <a href=\"%1$s"
1825
+ "\">FAQ</a>, the <a href=\"%2$s\">documentation</a>, and the <a href=\"%3$s"
1826
+ "\">Support</a> section on the <a href=\"%4$s\">plugin website</a>."
1827
+ msgstr ""
1828
+ "Jos kohtaat ongelmia, katso <a href=\"%1$s\">UKK-</a>, <a href=\"%2$s"
1829
+ "\">dokumentaatio-</a>, ja <a href=\"%3$s\">tuki-</a> osuudet <a href=\"%4$s"
1830
+ "\">lisäosan sivuilta</a>."
1831
+
1832
+ #: views/view-list.php:57 views/view-list.php:90
1833
+ msgid "Hide this message"
1834
+ msgstr "Piilota tämä viesti"
1835
+
1836
+ #: views/view-list.php:62
1837
+ msgid "Attention!"
1838
+ msgstr "Huomio!"
1839
+
1840
+ #: views/view-list.php:63
1841
+ msgid ""
1842
+ "You have activated the plugin WP-Table Reloaded, which can not be used "
1843
+ "together with TablePress."
1844
+ msgstr ""
1845
+ "Olet aktivoinut WP-Table Reloadedin, jota ei voi käyttää yhdessä "
1846
+ "TablePressin kanssa"
1847
+
1848
+ #: views/view-list.php:64
1849
+ msgid ""
1850
+ "It is strongly recommended that you switch from WP-Table Reloaded to "
1851
+ "TablePress, which not only fixes many problems, but also has more and better "
1852
+ "features than WP-Table Reloaded."
1853
+ msgstr ""
1854
+ "On suositeltavaa, että vaihdat WP-Table Reloadedista TablePressiin, joka ei "
1855
+ "ainoastaan korjaa monia ongelmia, vaan myöskin sisältää enemmän ja parempia "
1856
+ "ominaisuuksia kuin WP-Table Reloaded."
1857
+
1858
+ #: views/view-list.php:65
1859
+ msgid ""
1860
+ "Please follow the <a href=\"%s\">migration guide</a> to move your tables and "
1861
+ "then deactivate WP-Table Reloaded!"
1862
+ msgstr ""
1863
+ "Katso <a href=\"%s\">muutosoppaasta</a> kuinka siirtää taulukota WP-Table "
1864
+ "reloadedista ja poistaa se käytöstä."
1865
+
1866
+ #: views/view-list.php:66
1867
+ msgid "Import your tables from WP-Table Reloaded"
1868
+ msgstr "Tuo taulukkosi WP-Table Reloadedista"
1869
+
1870
+ #: views/view-list.php:72
1871
+ msgid "Tobias Bäthge, developer of TablePress"
1872
+ msgstr "Tobias Bäthge, TablePressin kehittäjä"
1873
+
1874
+ #: views/view-list.php:73
1875
+ msgid "Hi, my name is Tobias, I'm the developer of the TablePress plugin."
1876
+ msgstr "Hei, nimeni on Tobias. Olen tämän lisäosan kehittäjä."
1877
+
1878
+ #: views/view-list.php:74
1879
+ msgid "Thanks for using it! You've installed TablePress over a month ago."
1880
+ msgstr ""
1881
+ "Kiitos kun käytät sitä! Olet asentanut TablePressin yli kuukausi sitten."
1882
+
1883
+ #: views/view-list.php:75
1884
+ msgid ""
1885
+ "If everything works and you are satisfied with the results of managing your "
1886
+ "%s table, isn't that worth a coffee or two?"
1887
+ msgid_plural ""
1888
+ "If everything works and you are satisfied with the results of managing your "
1889
+ "%s tables, isn't that worth a coffee or two?"
1890
+ msgstr[0] ""
1891
+ "Jos kaikki toimii ja olet tyytyväinen tuloksiin taulukon %s hallinnassa, "
1892
+ "eikö se olisi kahvin tai parin arvoista?"
1893
+ msgstr[1] ""
1894
+ "Jos kaikki toimii ja olet tyytyväinen tuloksiin taulukoiden %s hallinnassa, "
1895
+ "eikö se olisi kahvin tai parin arvoista?"
1896
+
1897
+ #: views/view-list.php:76
1898
+ msgid ""
1899
+ "<a href=\"%s\">Donations</a> help me to continue user support and "
1900
+ "development of this <em>free</em> software &mdash; things for which I spend "
1901
+ "countless hours of my free time! Thank you very much!"
1902
+ msgstr ""
1903
+ "<a href=\"%s\">Donations</a> help me to continue user support and "
1904
+ "development of this <em>free</em> software &mdash; things for which I spend "
1905
+ "countless hours of my free time! Thank you very much!"
1906
+
1907
+ #: views/view-list.php:77
1908
+ msgid "Sincerly, Tobias"
1909
+ msgstr "Sincerly, Tobias"
1910
+
1911
+ #: views/view-list.php:78
1912
+ msgid "Sure, I'll buy you a coffee and support TablePress!"
1913
+ msgstr "Sure, I'll buy you a coffee and support TablePress!"
1914
+
1915
+ #: views/view-list.php:79
1916
+ msgid "I already donated."
1917
+ msgstr "I already donated."
1918
+
1919
+ #: views/view-list.php:80
1920
+ msgid "No, thanks. Don't ask again."
1921
+ msgstr "No, thanks. Don't ask again."
1922
+
1923
+ #: views/view-list.php:84
1924
+ msgid "Thank you for updating to TablePress %s!"
1925
+ msgstr "Thank you for updating to TablePress %s!"
1926
+
1927
+ #: views/view-list.php:87
1928
+ msgid ""
1929
+ "Please read the <a href=\"%s\">release announcement</a> for more information."
1930
+ msgstr ""
1931
+ "Please read the <a href=\"%s\">release announcement</a> for more information."
1932
+
1933
+ #: views/view-list.php:88
1934
+ msgid ""
1935
+ "If you like the new features and enhancements, <a href=\"%s\">giving a "
1936
+ "donation</a> towards the further support and development of TablePress is "
1937
+ "recommended. Thank you!"
1938
+ msgstr ""
1939
+ "If you like the new features and enhancements, <a href=\"%s\">giving a "
1940
+ "donation</a> towards the further support and development of TablePress is "
1941
+ "recommended. Thank you!"
1942
+
1943
+ #: views/view-list.php:95 views/view-list.php:96
1944
+ msgid "The table was deleted successfully."
1945
+ msgid_plural "The tables were deleted successfully."
1946
+ msgstr[0] "Taulukko poistettiin onnistuneesti"
1947
+ msgstr[1] "Taulukot poistettiin onnistuneesti."
1948
+
1949
+ #: views/view-list.php:99 views/view-list.php:100
1950
+ msgid "The table was copied successfully."
1951
+ msgid_plural "The tables were copied successfully."
1952
+ msgstr[0] "Taulukko kopioitiin onnistuneesti."
1953
+ msgstr[1] "Taulukot kopioitiin onnistuneesti."
1954
+
1955
+ #: views/view-list.php:101
1956
+ msgid "Error: The table could not be copied."
1957
+ msgstr "Virhe: Taulukkoa ei voitu kopioida"
1958
+
1959
+ #: views/view-list.php:102
1960
+ msgid "Error: You did not specify a valid table ID."
1961
+ msgstr "Virhe: Et antanut kelvollista taulukko ID:tä"
1962
+
1963
+ #: views/view-list.php:104
1964
+ msgid "Error: This bulk action is invalid!"
1965
+ msgstr "Virhe: Tämä massatoiminto ei kelpaa!"
1966
+
1967
+ #: views/view-list.php:105
1968
+ msgid "Error: You did not select any tables!"
1969
+ msgstr "Virhe: Et valinnut yhtään taulukoita."
1970
+
1971
+ #: views/view-list.php:106
1972
+ msgid "Notice: Not all selected tables could be deleted!"
1973
+ msgstr "Huomaa: Kaikkia valittuja taulukoita ei voitu poistaa."
1974
+
1975
+ #: views/view-list.php:107
1976
+ msgid "Notice: Not all selected tables could be copied!"
1977
+ msgstr "Huomaa: Kaikkia valittuja taulukoita ei voitu kopioida."
1978
+
1979
+ #: views/view-list.php:108
1980
+ msgid "The tables were imported successfully."
1981
+ msgstr "Taulukoiden tuonti onnistui."
1982
+
1983
+ #: views/view-list.php:109
1984
+ msgid "The tables were imported successfully from WP-Table Reloaded."
1985
+ msgstr "Taulukot tuotiin onnistuneesti WP-Table Reloadedista."
1986
+
1987
+ #: views/view-list.php:115
1988
+ msgid "Tables"
1989
+ msgstr "Taulukot"
1990
+
1991
+ #: views/view-list.php:179
1992
+ msgid "This is a list of your tables."
1993
+ msgstr "Tämä on lista taulukoistasi"
1994
+
1995
+ #: views/view-list.php:180
1996
+ msgid ""
1997
+ "Click the corresponding links within the list to edit, copy, delete, or "
1998
+ "preview a table."
1999
+ msgstr ""
2000
+ "Paina linkkejä listassa muokataksesi, kopioidaksesi, poistaaksesi tai "
2001
+ "esikatsellaksesi taulukoita."
2002
+
2003
+ #: views/view-list.php:184
2004
+ msgid "Each table has a unique ID that needs to be adjusted in that Shortcode."
2005
+ msgstr "Jokaisella taulukolla on ID joka pitää muokata Shortcodeen"
2006
+
2007
+ #: views/view-list.php:321
2008
+ msgid "Author"
2009
+ msgstr "Tekijä"
2010
+
2011
+ #: views/view-list.php:322
2012
+ msgid "Last Modified By"
2013
+ msgstr "Viimeksi muokannut"
2014
+
2015
+ #: views/view-list.php:408 views/view-list.php:414
2016
+ msgid "Edit &#8220;%s&#8221;"
2017
+ msgstr "Muokkaa &#8220;%s&#8221;"
2018
+
2019
+ #: views/view-list.php:415
2020
+ msgid "Show Shortcode"
2021
+ msgstr "Näytä Shortcode"
2022
+
2023
+ #: views/view-list.php:417
2024
+ msgid "Copy &#8220;%s&#8221;"
2025
+ msgstr "Kopioi &#8220;%s&#8221;"
2026
+
2027
+ #: views/view-list.php:417
2028
+ msgid "Copy"
2029
+ msgstr "Kopioi"
2030
+
2031
+ #: views/view-list.php:419
2032
+ msgid "Export &#8220;%s&#8221;"
2033
+ msgstr "Tuo &#8220;%s&#8221;"
2034
+
2035
+ #: views/view-list.php:419
2036
+ msgctxt "row action"
2037
+ msgid "Export"
2038
+ msgstr "Tuo"
2039
+
2040
+ #: views/view-list.php:421
2041
+ msgid "Delete &#8220;%s&#8221;"
2042
+ msgstr "Poista &#8220;%s&#8221;"
2043
+
2044
+ #: views/view-list.php:423
2045
+ msgid "Show a preview of &#8220;%s&#8221;"
2046
+ msgstr "Näytä esikatselu &#8220;%s&#8221;"
2047
+
2048
+ #: views/view-list.php:498
2049
+ msgctxt "bulk action"
2050
+ msgid "Copy"
2051
+ msgstr "Kopioi"
2052
+
2053
+ #: views/view-list.php:500
2054
+ msgctxt "bulk action"
2055
+ msgid "Export"
2056
+ msgstr "Tuo"
2057
+
2058
+ #: views/view-list.php:502
2059
+ msgctxt "bulk action"
2060
+ msgid "Delete"
2061
+ msgstr "Poista"
2062
+
2063
+ #: views/view-list.php:530
2064
+ msgid "Bulk Actions"
2065
+ msgstr "Massatoiminnot"
2066
+
2067
+ #: views/view-list.php:535
2068
+ msgid "Apply"
2069
+ msgstr "Hyväksy"
2070
+
2071
+ #: views/view-list.php:555
2072
+ msgid "You should <a href=\"%s\">add</a> a table to get started!"
2073
+ msgstr "Sinun pitäisi <a href=\"%s\">lisätä</a> taulukko päästäksesi alkuun!"
2074
+
2075
+ #: views/view-list.php:557
2076
+ msgid "You should <a href=\"%s\">import</a> a table to get started!"
2077
+ msgstr "Sinun pitäisi <a href=\"%s\">tuoda</a> taulukko päästäksesi alkuun!"
2078
+
2079
+ #: views/view-options.php:38
2080
+ msgid "Do you really want to uninstall TablePress and delete ALL data?"
2081
+ msgstr "Haluatko poistaa TablePressin ja poistaa kaiken datan?"
2082
+
2083
+ #: views/view-options.php:39
2084
+ msgid "Are you really sure?"
2085
+ msgstr "Oletko varma?"
2086
+
2087
+ #: views/view-options.php:44
2088
+ msgid "Options saved successfully."
2089
+ msgstr "Asetusten tallennus onnistui."
2090
+
2091
+ #: views/view-options.php:45
2092
+ msgid ""
2093
+ "Options saved successfully, but &#8220;Custom CSS&#8221; was not saved to "
2094
+ "file."
2095
+ msgstr ""
2096
+ "Asetukset tallennettu, mutta &#8220;Custom CSS&#8221; ei tallennettu "
2097
+ "tiedostoon."
2098
+
2099
+ #: views/view-options.php:46
2100
+ msgid "Error: Options could not be saved."
2101
+ msgstr "Virhe: Asetuksia ei voitu tallentaa."
2102
+
2103
+ #: views/view-options.php:47
2104
+ msgid ""
2105
+ "The WP-Table Reloaded &#8220;Custom CSS&#8221; was imported successfully."
2106
+ msgstr "WP-Table Reloaded &#8220;Custom CSS&#8221; tuotiin onnistuneesti."
2107
+
2108
+ #: views/view-options.php:52
2109
+ msgid "Frontend Options"
2110
+ msgstr "Frontend asetukset"
2111
+
2112
+ #: views/view-options.php:53
2113
+ msgid "User Options"
2114
+ msgstr "Käyttäjäasetukset"
2115
+
2116
+ #: views/view-options.php:68
2117
+ msgid ""
2118
+ "TablePress has several options which affect the plugin&#8217;s behavior in "
2119
+ "different areas."
2120
+ msgstr ""
2121
+ "TablePressissä on muutamia asetuksia, jotka vaikuttavat lisäosa &#8217;n "
2122
+ "käyttäytymiseen eri alueilla."
2123
+
2124
+ #: views/view-options.php:73
2125
+ msgid ""
2126
+ "Frontend Options influence the styling of tables in pages, posts, or text "
2127
+ "widgets, by defining which CSS code shall be loaded."
2128
+ msgstr ""
2129
+ "Frontend- asetukset vaikuttavat taulukoiden tyyliin sivuilla, artikkeleissa "
2130
+ "tai tekstivimpaimissa määrittämällä mikä CSS- koodi ladataan."
2131
+
2132
+ #: views/view-options.php:76
2133
+ msgid ""
2134
+ "In the User Options, every TablePress user can choose the position of the "
2135
+ "plugin in his WordPress admin menu, and his desired plugin language."
2136
+ msgstr ""
2137
+ "Käyttäjäasetuksissa jokainen TablePressin käyttäjä voi valita lisäosan "
2138
+ "sijainnin omassa ohjausnäkymässään, ja haluamansa kielen."
2139
+
2140
+ #: views/view-options.php:92
2141
+ msgid "Custom CSS"
2142
+ msgstr "Custom CSS"
2143
+
2144
+ #: views/view-options.php:93
2145
+ msgid ""
2146
+ "Load these &#8220;Custom CSS&#8221; commands to influence the table styling:"
2147
+ msgstr ""
2148
+ "Lataa nämä &#8220;Custom CSS&#8221;-komennot vaikuttaaksesi taulukon tyyliin:"
2149
+
2150
+ #: views/view-options.php:101
2151
+ msgid ""
2152
+ "&#8220;Custom CSS&#8221; (<a href=\"%s\">Cascading Style Sheets</a>) can be "
2153
+ "used to change the styling or layout of a table."
2154
+ msgstr ""
2155
+ "&#8220;Custom CSS&#8221; (<a href=\"%s\">Cascading Style Sheets</a>) voidaan "
2156
+ "käyttää muuttamaan taulukon tyyliä tai ulkoasua."
2157
+
2158
+ #: views/view-options.php:103
2159
+ msgid "You can get styling examples from the <a href=\"%s\">FAQ</a>."
2160
+ msgstr "Voit etsiä tyyliesimerkkejä <a href=\"%s\">UKK</a>:sta"
2161
+
2162
+ #: views/view-options.php:105
2163
+ msgid ""
2164
+ "Information on available CSS selectors can be found in the <a href=\"%s"
2165
+ "\">documentation</a>."
2166
+ msgstr ""
2167
+ "Tietoa olemassaolevista CSS-valitsimista voi löytää <a href=\"%s"
2168
+ "\">dokumentoinnista</a>."
2169
+
2170
+ #: views/view-options.php:107
2171
+ msgid ""
2172
+ "Please note that invalid CSS code will be stripped, if it can not be "
2173
+ "corrected automatically."
2174
+ msgstr ""
2175
+ "Huomaa, että kelpaamaton CSS riisutaan, jos sitä ei voida korjata "
2176
+ "automaattisesti."
2177
+
2178
+ #: views/view-options.php:110
2179
+ msgid "File exists"
2180
+ msgstr "Tiedosto on olemassa"
2181
+
2182
+ #: views/view-options.php:110
2183
+ msgid "File seems not to exist"
2184
+ msgstr "Tiedostoa ei ole"
2185
+
2186
+ #: views/view-options.php:113
2187
+ msgid "Use a file for storing and loading the &#8220;Custom CSS&#8221; code."
2188
+ msgstr "Käytä tiedostoa &#8220;Custom CSS&#8221;- koodin säilömiseen."
2189
+
2190
+ #: views/view-options.php:146
2191
+ msgid "Top-Level (top)"
2192
+ msgstr "Ylätaso(ylä)"
2193
+
2194
+ #: views/view-options.php:147
2195
+ msgid "Top-Level (middle)"
2196
+ msgstr "Ylätaso(keski)"
2197
+
2198
+ #: views/view-options.php:148
2199
+ msgid "Top-Level (bottom)"
2200
+ msgstr "Ylätaso(ala)"
2201
+
2202
+ #: views/view-options.php:157
2203
+ msgid "Admin menu entry"
2204
+ msgstr "Ylläpitäjän valikko"
2205
+
2206
+ #: views/view-options.php:158
2207
+ msgid "TablePress shall be shown in this section of my admin menu: %s"
2208
+ msgstr "TablePress näytetään tässä osassa ylläpitovalikkoa: %s"
2209
+
2210
+ #: views/view-options.php:162
2211
+ msgid "WordPress Default (currently %s)"
2212
+ msgstr "Wordpress Oletus (nyt: %s)"
2213
+
2214
+ #: views/view-options.php:170
2215
+ msgid "Plugin Language"
2216
+ msgstr "Lisäosan Kieli"
2217
+
2218
+ #: views/view-options.php:171
2219
+ msgid "I want to use TablePress in this language: %s"
2220
+ msgstr "Haluan käyttää TablePressiä tällä kielellä: %s"
2221
+
2222
+ #: views/view-options.php:187
2223
+ msgid ""
2224
+ "Uninstalling <strong>will permanently delete</strong> all TablePress tables "
2225
+ "and options from the database."
2226
+ msgstr ""
2227
+ "Poistaminen <strong>tuhoaa lopullisesti</strong> kaikki TablePress taulukot "
2228
+ "ja asetukset tietokannasta"
2229
+
2230
+ #: views/view-options.php:188
2231
+ msgid ""
2232
+ "It is recommended that you create a backup of the tables (by exporting the "
2233
+ "tables in the JSON format), in case you later change your mind."
2234
+ msgstr ""
2235
+ "On suositeltavaa, että luot varmuuskopion taulukoista (viemällä taulukon "
2236
+ "JSON-muotoon) siltä varalta että muutat mielesi myöhemmin."
2237
+
2238
+ #: views/view-options.php:189
2239
+ msgid ""
2240
+ "You will manually need to remove the plugin's files from the plugin folder "
2241
+ "afterwards."
2242
+ msgstr ""
2243
+ "Sinun täytyy manuaalisesti poistaa lisäosan tiedostot lisäosan kansiosta "
2244
+ "myöhemmin."
2245
+
2246
+ #: views/view-options.php:190
2247
+ msgid ""
2248
+ "Be very careful with this and only click the button if you know what you are "
2249
+ "doing!"
2250
+ msgstr ""
2251
+ "Ole huolellinen tämän kanssa, ja paina näppäintä vain jos tiedät mitä olet "
2252
+ "tekemässä!"
2253
+
2254
+ #: views/view-options_custom_css.php:38
2255
+ msgid ""
2256
+ "Attention: Further action is required to save the changes to your &#8220;"
2257
+ "Custom CSS&#8221;!"
2258
+ msgstr ""
2259
+ "Huomio: Seuraava toiminta tarvitaan tallentaaksesi muutokset &#8220;Custom "
2260
+ "CSS&#8221;:n"
2261
+
2262
+ #: views/view-options_custom_css.php:105
2263
+ msgid ""
2264
+ "Due to the configuration of your server, TablePress was not able to "
2265
+ "automatically save your &#8220;Custom CSS&#8221; to a file."
2266
+ msgstr ""
2267
+ "Palvelimesi asetuksista johtuen, TablePress ei onnistunut automaattisesti "
2268
+ "tallentamaan &#8220;Custom CSS&#8221;:ää tiedostoon."
2269
+
2270
+ #: views/view-options_custom_css.php:106
2271
+ msgid ""
2272
+ "To try again with the same method that you use for updating plugins or "
2273
+ "themes, please fill out the &#8220;%s&#8221; form below."
2274
+ msgstr ""
2275
+ "Koettaaksesi samaa keinoa, jota käytät lisäosien ja teemojen päivittämiseen, "
2276
+ "täytä &#8220;%s&#8221; lomake alta."
2277
+
2278
+ #: views/view-options_custom_css.php:106
2279
+ msgid "Connection Information"
2280
+ msgstr "Yhteystiedot"
2281
+
2282
+ #: views/view-options_custom_css.php:127
2283
+ msgid "Proceed without saving a file"
2284
+ msgstr "Hyväksy tallentamatta tiedostoa"
2285
+
2286
+ #: views/view-options_custom_css.php:129
2287
+ msgid ""
2288
+ "To proceed without trying to save the &#8220;Custom CSS&#8221; to a file, "
2289
+ "click the button below."
2290
+ msgstr ""
2291
+ "Jatkaaksesi tallentamatta &#8220;Custom CSS&#8221;:ää tiedostoon, paina "
2292
+ "allaolevaa nappulaa."
2293
+
2294
+ #: views/view-options_custom_css.php:130
2295
+ msgid "Your &#8220;Custom CSS&#8221; will then be loaded inline."
2296
+ msgstr "Sinun &#8220;Custom CSS&#8221; tullaan lataamaan."
2297
+
2298
+ #: views/view-options_custom_css.php:132
2299
+ msgid "Proceed without saving &#8220;Custom CSS&#8221; to a file"
2300
+ msgstr "Jatka tallentamatta &#8220;Custom CSS&#8221; tiedostoon."
2301
+
2302
+ #: views/view-preview_table.php:66
2303
+ msgid ""
2304
+ "Because of CSS styling in your theme, the table might look different on your "
2305
+ "page!"
2306
+ msgstr ""
2307
+ "Teemasi CSS- tyylistä johtuen taulukko saattaa näyttää erilaiselta sivulla"
2308
+
2309
+ #: views/view-preview_table.php:66
2310
+ msgid ""
2311
+ "The features of the DataTables JavaScript library are also not available or "
2312
+ "visible in this preview!"
2313
+ msgstr ""
2314
+ "Ominaisuudet DataTables JavaScript- kirjastosta ei ole käytössä tässä "
2315
+ "esikatselussa!"
2316
+
2317
+ #. Plugin URI of the plugin/theme
2318
+ msgid "https://tablepress.org/"
2319
+ msgstr "https://tablepress.org/"
2320
+
2321
+ #. Description of the plugin/theme
2322
+ msgid ""
2323
+ "TablePress enables you to create and manage tables in your posts and pages, "
2324
+ "without having to write HTML code, and it adds valuable functions for your "
2325
+ "visitors."
2326
+ msgstr ""
2327
+ "TablePress antaa sinun luoda ja hallita taulukoita artikkeleissa ja "
2328
+ "sivuissa, ilman että tarvitsee kirjoittaa HTML-koodia, ja se lisää "
2329
+ "hyödyllisiä funktioita vierailijoille."
2330
+
2331
+ #. Author of the plugin/theme
2332
+ msgid "Tobias Bäthge"
2333
+ msgstr "Tobias Bäthge"
2334
+
2335
+ #. Author URI of the plugin/theme
2336
+ msgid "https://tobias.baethge.com/"
2337
+ msgstr "https://tobias.baethge.com/"
i18n/tablepress-fr_FR.mo ADDED
Binary file
i18n/tablepress-fr_FR.po ADDED
@@ -0,0 +1,2582 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 TablePress
2
+ # This file is distributed under the same license as the TablePress package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: TablePress v1.6.1\n"
6
+ "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/tablepress\n"
7
+ "POT-Creation-Date: \n"
8
+ "PO-Revision-Date: 2014-10-20 20:29:14+0000\n"
9
+ "Last-Translator: Tobias Bäthge <wordpress@tobias.baethge.com>\n"
10
+ "Language-Team: \n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=n>1;\n"
15
+ "X-Generator: Poedit 1.5.7\n"
16
+ "X-Poedit-Language: \n"
17
+ "X-Poedit-Country: \n"
18
+ "X-Poedit-SourceCharset: UTF-8\n"
19
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;\n"
20
+ "X-Poedit-Basepath: ../\n"
21
+ "X-Poedit-Bookmarks: \n"
22
+ "X-Poedit-SearchPath-0: .\n"
23
+ "X-Textdomain-Support: yes"
24
+
25
+ #: classes/class-admin-page-helper.php:79
26
+ #@ tablepress
27
+ msgid "Thank you for using <a href=\"https://tablepress.org/\">TablePress</a>."
28
+ msgstr "Merci d'utiliser <a href=\"https://tablepress.org/\">TablePress</a>."
29
+
30
+ #: classes/class-admin-page-helper.php:80
31
+ #, php-format
32
+ #@ tablepress
33
+ msgid "Support the plugin with your <a href=\"%s\">donation</a>!"
34
+ msgstr "Supportez cette extension avec un <a href=\"%s\">don</a> !"
35
+
36
+ #: classes/class-export.php:55
37
+ #: classes/class-import.php:80
38
+ #@ tablepress
39
+ msgid "CSV - Character-Separated Values"
40
+ msgstr "CSV - Character-Separated Values"
41
+
42
+ #: classes/class-export.php:56
43
+ #: classes/class-import.php:82
44
+ #@ tablepress
45
+ msgid "HTML - Hypertext Markup Language"
46
+ msgstr "HTML - Hypertext Markup Language"
47
+
48
+ #: classes/class-export.php:57
49
+ #: classes/class-import.php:84
50
+ #@ tablepress
51
+ msgid "JSON - JavaScript Object Notation"
52
+ msgstr "JSON - JavaScript Object Notation"
53
+
54
+ #: classes/class-export.php:60
55
+ #@ tablepress
56
+ msgid "; (semicolon)"
57
+ msgstr "; (point-virgule)"
58
+
59
+ #: classes/class-export.php:61
60
+ #@ tablepress
61
+ msgid ", (comma)"
62
+ msgstr ", (virgule)"
63
+
64
+ #: classes/class-export.php:62
65
+ #@ tablepress
66
+ msgid "\\t (tabulator)"
67
+ msgstr "\\t (tabulation)"
68
+
69
+ #: classes/class-import.php:189
70
+ #: classes/class-import.php:301
71
+ #: classes/class-import.php:407
72
+ #@ tablepress
73
+ msgid "The imported file contains errors:"
74
+ msgstr "Le fichier importé contient des erreurs :"
75
+
76
+ #: classes/class-render.php:272
77
+ #, php-format
78
+ #@ tablepress
79
+ msgid "<!-- The table with the ID %s is empty! -->"
80
+ msgstr "<!-- Le tableau avec l'ID %s est vide ! -->"
81
+
82
+ #: classes/class-render.php:410
83
+ #: views/view-list.php:422
84
+ #@ default
85
+ #@ tablepress
86
+ msgid "Edit"
87
+ msgstr "Editer"
88
+
89
+ #: classes/class-view.php:103
90
+ #@ tablepress
91
+ msgid "TablePress Help"
92
+ msgstr "Aide de TablePress"
93
+
94
+ #: classes/class-view.php:105
95
+ #, php-format
96
+ #@ tablepress
97
+ msgid "More information about TablePress can be found on the <a href=\"%1$s\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress Plugin Directory</a>."
98
+ msgstr "Plus d'information sur TablePress disponible sur le <a href=\"%1$s\">portail des extensions</a> ou sur sa page dédiée dans le <a href=\"%s\">Répertoire des extensions de WordPress</a>."
99
+
100
+ #: classes/class-view.php:107
101
+ #, php-format
102
+ #@ tablepress
103
+ msgid "<a href=\"%1$s\">Support</a> is provided through the <a href=\"%2$s\">WordPress Support Forums</a>."
104
+ msgstr "Le <a href=\"%1$s\">support</a> est assuré via le <a href=\"%2$s\">forum de support de WordPress</a>."
105
+
106
+ #: classes/class-view.php:108
107
+ #: views/view-about.php:153
108
+ #, php-format
109
+ #@ tablepress
110
+ msgid "Before asking for support, please carefully read the <a href=\"%s\">Frequently Asked Questions</a>, where you will find answers to the most common questions, and search through the forums."
111
+ msgstr "Avant d'écrire au support technique, merci de bien lire la <a href=\"%s\">FAQ</a>, où vous trouverez la réponses des questions les plus fréquentes, et de chercher à travers les forums."
112
+
113
+ #: classes/class-view.php:109
114
+ #, php-format
115
+ #@ tablepress
116
+ msgid "If you like the plugin, <a href=\"%1$s\"><strong>a donation</strong></a> is recommended."
117
+ msgstr "Si vous aimez cette extension, <a href=\"%1$s\"><strong>un don</strong></a> est recommandé."
118
+
119
+ #: classes/class-view.php:112
120
+ #@ tablepress
121
+ msgid "For more information:"
122
+ msgstr "Pour plus d'information :"
123
+
124
+ #: classes/class-view.php:147
125
+ #: controllers/controller-admin.php:142
126
+ #: views/view-editor_button_thickbox.php:68
127
+ #: views/view-editor_button_thickbox.php:171
128
+ #: views/view-options_custom_css.php:37
129
+ #: views/view-preview_table.php:53
130
+ #, php-format
131
+ #@ tablepress
132
+ msgid "%1$s &lsaquo; %2$s"
133
+ msgstr "%1$s &lsaquo; %2$s"
134
+
135
+ #: classes/class-view.php:158
136
+ #: classes/class-view.php:159
137
+ #@ tablepress
138
+ msgid "Do you really want to delete this table?"
139
+ msgid_plural "Do you really want to delete these tables?"
140
+ msgstr[0] "Voulez-vous vraiment effacer ce tableau ?"
141
+ msgstr[1] "Voulez-vous vraiment effacer ces tableaux ?"
142
+
143
+ #. translators: plugin header field 'Name'
144
+ #: classes/class-view.php:387
145
+ #: tablepress.php:0
146
+ #@ tablepress
147
+ msgid "TablePress"
148
+ msgstr "TablePress"
149
+
150
+ #: classes/class-view.php:419
151
+ #: views/view-edit.php:453
152
+ #: views/view-edit.php:454
153
+ #: views/view-options.php:55
154
+ #@ tablepress
155
+ msgid "Save Changes"
156
+ msgstr "Sauver les changements"
157
+
158
+ #: controllers/controller-admin.php:205
159
+ #: views/view-about.php:91
160
+ #: views/view-list.php:190
161
+ #@ tablepress
162
+ msgid "Table"
163
+ msgstr "Tableau"
164
+
165
+ #: controllers/controller-admin.php:206
166
+ #: controllers/controller-admin.php:207
167
+ #@ tablepress
168
+ msgid "Insert a Table from TablePress"
169
+ msgstr "Insérer un tableau TablePress"
170
+
171
+ #: controllers/controller-admin.php:288
172
+ #@ tablepress
173
+ msgid "TablePress Table"
174
+ msgstr "Tableau TablePress"
175
+
176
+ #: controllers/controller-admin.php:315
177
+ #@ tablepress
178
+ msgid "Plugin page"
179
+ msgstr "Page de l'extension"
180
+
181
+ #: controllers/controller-admin.php:330
182
+ #@ tablepress
183
+ msgid "Frequently Asked Questions"
184
+ msgstr "Frequently Asked Questions"
185
+
186
+ #: controllers/controller-admin.php:330
187
+ #@ tablepress
188
+ msgid "FAQ"
189
+ msgstr "FAQ"
190
+
191
+ #: controllers/controller-admin.php:331
192
+ #@ tablepress
193
+ msgid "Documentation"
194
+ msgstr "Documentation"
195
+
196
+ #: controllers/controller-admin.php:332
197
+ #@ tablepress
198
+ msgid "Support"
199
+ msgstr "Support"
200
+
201
+ #: controllers/controller-admin.php:333
202
+ #@ tablepress
203
+ msgid "Support TablePress with your donation!"
204
+ msgstr "Soutenez TablePress avec un don !"
205
+
206
+ #: controllers/controller-admin.php:333
207
+ #@ tablepress
208
+ msgid "Donate"
209
+ msgstr "Faites un don"
210
+
211
+ #: controllers/controller-admin.php:360
212
+ #: controllers/controller-admin.php:436
213
+ #: controllers/controller-admin.php:867
214
+ #: controllers/controller-admin.php:936
215
+ #: controllers/controller-admin.php:992
216
+ #: controllers/controller-admin.php:1070
217
+ #: controllers/controller-admin.php:1110
218
+ #: controllers/controller-admin.php:1200
219
+ #: controllers/controller-admin.php:1212
220
+ #: controllers/controller-admin.php:1843
221
+ #: controllers/controller-admin.php:1874
222
+ #: controllers/controller-admin.php:1915
223
+ #: controllers/controller-admin.php:1959
224
+ #: controllers/controller-admin.php:2003
225
+ #: controllers/controller-admin.php:2031
226
+ #@ default
227
+ msgid "You do not have sufficient permissions to access this page."
228
+ msgstr "Vous n'avez pas les droits suffisants pour accéder à cette page."
229
+
230
+ #: controllers/controller-admin.php:539
231
+ #@ tablepress
232
+ msgid "English"
233
+ msgstr "Anglais"
234
+
235
+ #: controllers/controller-admin.php:685
236
+ #: controllers/controller-admin.php:686
237
+ #: controllers/controller-admin.php:687
238
+ #@ tablepress
239
+ msgid "All Tables"
240
+ msgstr "Tous les tableaux"
241
+
242
+ #: controllers/controller-admin.php:692
243
+ #: controllers/controller-admin.php:693
244
+ #: views/view-add.php:41
245
+ #@ tablepress
246
+ msgid "Add New Table"
247
+ msgstr "Ajouter un tableau"
248
+
249
+ #: controllers/controller-admin.php:694
250
+ #@ tablepress
251
+ msgid "Add New"
252
+ msgstr "Ajouter"
253
+
254
+ #: controllers/controller-admin.php:699
255
+ #@ tablepress
256
+ msgid "Edit Table"
257
+ msgstr "Editer le tableau"
258
+
259
+ #: controllers/controller-admin.php:706
260
+ #: controllers/controller-admin.php:707
261
+ #@ tablepress
262
+ msgid "Import a Table"
263
+ msgstr "Importer un tableau"
264
+
265
+ #: controllers/controller-admin.php:713
266
+ #: controllers/controller-admin.php:714
267
+ #@ tablepress
268
+ msgid "Export a Table"
269
+ msgstr "Exporter un tableau"
270
+
271
+ #: controllers/controller-admin.php:720
272
+ #: controllers/controller-admin.php:721
273
+ #: controllers/controller-admin.php:722
274
+ #@ tablepress
275
+ msgid "Plugin Options"
276
+ msgstr "Options"
277
+
278
+ #: controllers/controller-admin.php:727
279
+ #: controllers/controller-admin.php:729
280
+ #@ tablepress
281
+ msgid "About"
282
+ msgstr "A propos"
283
+
284
+ #: controllers/controller-admin.php:728
285
+ #@ tablepress
286
+ msgid "About TablePress"
287
+ msgstr "A propos de TablePress"
288
+
289
+ #: controllers/controller-admin.php:1292
290
+ #@ tablepress
291
+ msgid "Imported from Manual Input"
292
+ msgstr "Importé depuis une entrée manuelle"
293
+
294
+ #: controllers/controller-admin.php:1955
295
+ #: controllers/controller-admin_ajax.php:276
296
+ #@ tablepress
297
+ msgid "The preview could not be loaded."
298
+ msgstr "L'aperçu ne peut pas être chargé"
299
+
300
+ #: controllers/controller-admin.php:1955
301
+ #: controllers/controller-admin.php:1965
302
+ #: views/view-edit.php:450
303
+ #: views/view-list.php:435
304
+ #: views/view-preview_table.php:53
305
+ #@ tablepress
306
+ msgid "Preview"
307
+ msgstr "Aperçu"
308
+
309
+ #: controllers/controller-admin.php:1965
310
+ #@ tablepress
311
+ msgid "The table could not be loaded."
312
+ msgstr "Ce tableau ne peut pas être chargé"
313
+
314
+ #: controllers/controller-admin_ajax.php:269
315
+ #: views/view-preview_table.php:64
316
+ #@ tablepress
317
+ msgid "This is a preview of your table."
318
+ msgstr "C'est un aperçu de votre tableau"
319
+
320
+ #: controllers/controller-admin_ajax.php:272
321
+ #: views/view-preview_table.php:65
322
+ #, php-format
323
+ #@ tablepress
324
+ msgid "To insert the table into a page, post, or text widget, copy the Shortcode %s and paste it into the editor."
325
+ msgstr "Pour insérer le tableau dans une page, un article ou un texte widget, copier le raccourci %s et collez-le dans l'éditeur."
326
+
327
+ #: controllers/controller-frontend.php:736
328
+ #: views/view-list.php:494
329
+ #, php-format
330
+ #@ tablepress
331
+ msgid "%s ago"
332
+ msgstr "Il y a %s"
333
+
334
+ #: models/model-table.php:530
335
+ #: views/view-editor_button_thickbox.php:328
336
+ #: views/view-export.php:131
337
+ #: views/view-import.php:211
338
+ #: views/view-list.php:411
339
+ #@ tablepress
340
+ msgid "(no name)"
341
+ msgstr "(sans nom)"
342
+
343
+ #: models/model-table.php:532
344
+ #, php-format
345
+ #@ tablepress
346
+ msgid "Copy of %s"
347
+ msgstr "Copie de %s"
348
+
349
+ #. translators: plugin header field 'PluginURI'
350
+ #: tablepress.php:0
351
+ #@ tablepress
352
+ msgid "https://tablepress.org/"
353
+ msgstr "https://tablepress.org/"
354
+
355
+ #. translators: plugin header field 'Description'
356
+ #: tablepress.php:0
357
+ #@ tablepress
358
+ msgid "TablePress enables you to create and manage tables in your posts and pages, without having to write HTML code, and it adds valuable functions for your visitors."
359
+ msgstr "TablePress vous permet de créer et gérer des tableaux dans vos articles et pages, sans avoir à écrire du code HTML, et il ajoute des fonctions utiles pour vos visiteurs."
360
+
361
+ #. translators: plugin header field 'Author'
362
+ #: tablepress.php:0
363
+ #@ tablepress
364
+ msgid "Tobias Bäthge"
365
+ msgstr "Tobias Bäthge"
366
+
367
+ #. translators: plugin header field 'AuthorURI'
368
+ #: tablepress.php:0
369
+ #@ tablepress
370
+ msgid "https://tobias.baethge.com/"
371
+ msgstr "https://tobias.baethge.com/"
372
+
373
+ #: views/view-about.php:42
374
+ #@ tablepress
375
+ msgid "Plugin Purpose"
376
+ msgstr "Fonctionnalités de l'extension"
377
+
378
+ #: views/view-about.php:43
379
+ #@ tablepress
380
+ msgid "Usage"
381
+ msgstr "Utilisation"
382
+
383
+ #: views/view-about.php:44
384
+ #@ tablepress
385
+ msgid "More Information and Documentation"
386
+ msgstr "Plus d'information et documentation"
387
+
388
+ #: views/view-about.php:45
389
+ #@ tablepress
390
+ msgid "Help and Support"
391
+ msgstr "Aide et support"
392
+
393
+ #: views/view-about.php:46
394
+ #@ tablepress
395
+ msgid "Author and License"
396
+ msgstr "Auteur et Licence"
397
+
398
+ #: views/view-about.php:47
399
+ #@ tablepress
400
+ msgid "Credits and Thanks"
401
+ msgstr "Crédits et remerciements"
402
+
403
+ #: views/view-about.php:48
404
+ #@ tablepress
405
+ msgid "Debug and Version Information"
406
+ msgstr "Debug et information de version"
407
+
408
+ #: views/view-about.php:62
409
+ #@ tablepress
410
+ msgid "TablePress allows you to create and manage tables in the admin area of WordPress."
411
+ msgstr "TablePress vous permet de créer et gérer des tableaux dans l'interface d'administration de WordPress."
412
+
413
+ #: views/view-about.php:63
414
+ #@ tablepress
415
+ msgid "Tables may contain text, numbers and even HTML (e.g. to include images or links)."
416
+ msgstr "Les tableaux peuvent contenir du texte, des nombres mais également de l'HTML (ex. pour inclure images ou liens)."
417
+
418
+ #: views/view-about.php:64
419
+ #@ tablepress
420
+ msgid "You can then show the tables in your posts, on your pages, or in text widgets by using a Shortcode."
421
+ msgstr "Vous pouvez alors montrer les tableaux dans vos articles, sur vos pages, ou dans vos textes widgets en utilisant un raccourci."
422
+
423
+ #: views/view-about.php:65
424
+ #@ tablepress
425
+ msgid "If you want to show your tables anywhere else in your theme, you can use a Template Tag function."
426
+ msgstr "Si vous voulez montrer vos tableaux n'importe où dans votre thème, vous pouvez utiliser la fonction Template Tag."
427
+
428
+ #: views/view-about.php:85
429
+ #@ tablepress
430
+ msgid "Then you can edit your data or change the structure of your table (e.g. by inserting, deleting, moving, or swaping rows or columns or sorting them) and select specific table features like alternating row colors or whether to print the name or description, if you want."
431
+ msgstr "Vous pouvez alors éditer vos données ou changer la structure du tableau (ex. insérer, effacer, déplacer ou intervertir des lignes ou colonnes ou encore classer les données) et sélectionner des spécificités d'un tableau telles que l'alternance de couleur sur les lignes, l'affichage ou non de son nom ou de sa description si vous le souhaitez."
432
+
433
+ #: views/view-about.php:86
434
+ #@ tablepress
435
+ msgid "To easily add a link or an image to a cell, use the provided buttons."
436
+ msgstr "Pour ajouter simplement une image ou un lien dans une cellule, utilisez les boutons dédiés."
437
+
438
+ #: views/view-about.php:87
439
+ #@ tablepress
440
+ msgid "Those will ask you for the necessary information and and corresponding HTML code will be added to the cell automatically."
441
+ msgstr "Cela va vous demander toutes les informations nécessaires et le code HTML va être automatiquement ajouté à la cellule."
442
+
443
+ #: views/view-about.php:90
444
+ #: views/view-list.php:188
445
+ #, php-format
446
+ #@ tablepress
447
+ msgid "To insert a table into a page, post, or text widget, copy its Shortcode %s and paste it at the desired place in the editor."
448
+ msgstr "Pour insérer un tableau dans une page, un article ou un texte widget, copier le raccourci %s et collez-le à l'endroit souhaité dans votre éditeur."
449
+
450
+ #: views/view-about.php:91
451
+ #: views/view-list.php:190
452
+ #, php-format
453
+ #@ tablepress
454
+ msgid "You can also click the &#8220;%s&#8221; button in the editor toolbar to select and insert a table."
455
+ msgstr "Vous pouvez également cliquer sur le bouton &#8220;%s&#8221; dans la barre d'outil de votre éditeur pour sélectionner ou insérer un tableau."
456
+
457
+ #: views/view-about.php:94
458
+ #@ tablepress
459
+ msgid "Tables can be styled by changing and adding CSS commands."
460
+ msgstr "Les tableaux peuvent être \"stylés\" en modifiant ou ajoutant des commandes CSS."
461
+
462
+ #: views/view-about.php:95
463
+ #@ tablepress
464
+ msgid "The plugin ships with default CSS stylesheets, which can be customized with own code or replaced with other stylesheets."
465
+ msgstr "L'extension est fournie avec une feuille de style CSS par défaut qui peut être personnalisée avec votre propre code ou remplacée par d'autres feuilles de style."
466
+
467
+ #: views/view-about.php:96
468
+ #@ tablepress
469
+ msgid "For this, each table is given certain CSS classes that can be used as CSS selectors."
470
+ msgstr "Pour cela, chaque tableau est donné avec des classes CSS spécifiques qui peuvent être utilisées comme des sélecteurs CSS."
471
+
472
+ #: views/view-about.php:97
473
+ #, php-format
474
+ #@ tablepress
475
+ msgid "Please see the <a href=\"%s\">documentation</a> for a list of these selectors and for styling examples."
476
+ msgstr "Merci de vous rendre sur la <a href=\"%s\">documentation</a> pour obtenir une liste de ces sélecteurs et d'exemples de styles."
477
+
478
+ #: views/view-about.php:113
479
+ #, php-format
480
+ #@ tablepress
481
+ msgid "More information about TablePress can be found on the <a href=\"%s\">plugin&#8217;s website</a> or on its page in the <a href=\"%s\">WordPress Plugin Directory</a>."
482
+ msgstr "Vous trouverez plus d'informations à propos de TablePress sur le <a href=\"%s\">site web de l'extension</a> ou sur sa propre page dans le <a href=\"%s\">Répertoire des Extensions de WordPress</a>"
483
+
484
+ #: classes/class-view.php:106
485
+ #: views/view-about.php:114
486
+ #, php-format
487
+ #@ tablepress
488
+ msgid "For technical information, please see the <a href=\"%s\">documentation</a>."
489
+ msgstr "Pour des informations techniques, merci de vous référer à la <a href=\"%s\">documentation</a>."
490
+
491
+ #: views/view-about.php:130
492
+ #, php-format
493
+ #@ tablepress
494
+ msgid "This plugin was written and developed by <a href=\"%s\">Tobias Bäthge</a>."
495
+ msgstr "Cette extension a été écrite et développée par <a href=\"%s\">Tobias Bäthge</a>."
496
+
497
+ #: views/view-about.php:131
498
+ #@ tablepress
499
+ msgid "It is licensed as Free Software under GNU General Public License 2 (GPL 2)."
500
+ msgstr "Cette extension est un Logiciel Libre sous licence GNU General Public License 2 (GPL 2)."
501
+
502
+ #: views/view-about.php:133
503
+ #, php-format
504
+ #@ tablepress
505
+ msgid "If you like the plugin, <a href=\"%s\"><strong>giving a donation</strong></a> is recommended."
506
+ msgstr "Si vous aimez cette extension, merci de <a href=\"%s\"><strong>faire un don</strong></a>."
507
+
508
+ #: views/view-about.php:134
509
+ #, php-format
510
+ #@ tablepress
511
+ msgid "Please rate and review the plugin in the <a href=\"%s\">WordPress Plugin Directory</a>."
512
+ msgstr "Merci de noter et évaluer cette extension dans le <a href=\"%s\">Répertoire des Extensions de WordPress</a>."
513
+
514
+ #: views/view-about.php:136
515
+ #@ tablepress
516
+ msgid "Donations and good ratings encourage me to further develop the plugin and to provide countless hours of support. Any amount is appreciated! Thanks!"
517
+ msgstr "Les dons et les bonnes évaluations m'encourage à encore plus développer cette extension et à assurer des heures de support sans compter. Toute aide est appréciée ! Merci !"
518
+
519
+ #: views/view-about.php:152
520
+ #, php-format
521
+ #@ tablepress
522
+ msgid "<a href=\"%s\">Support</a> is provided through the <a href=\"%s\">WordPress Support Forums</a>."
523
+ msgstr "Le <a href=\"%s\">support</a> est assuré via le <a href=\"%s\">Forum de support WordPress</a>."
524
+
525
+ #: views/view-about.php:156
526
+ #, php-format
527
+ #@ tablepress
528
+ msgid "If you do not find an answer there, please <a href=\"%s\">open a new thread</a> in the WordPress Support Forums."
529
+ msgstr "Si vous ne trouvez pas votre réponse ici, merci de <a href=\"%s\">créer un nouveau sujet</a> sur le forum de support de WordPress."
530
+
531
+ #: views/view-about.php:173
532
+ #@ tablepress
533
+ msgid "Please provide this information in bug reports and support requests."
534
+ msgstr "Merci de remonter l'information dans les rapports de bug et dans les demandes de support."
535
+
536
+ #: views/view-about.php:209
537
+ #@ tablepress
538
+ msgid "Special Thanks go to:"
539
+ msgstr "Remerciements particuliers pour :"
540
+
541
+ #: views/view-about.php:210
542
+ #@ tablepress
543
+ msgid "Allan Jardine for <a href=\"http://www.datatables.net/\">DataTables</a>,"
544
+ msgstr "Allan Jardine pour <a href=\"http://www.datatables.net/\">DataTables</a>,"
545
+
546
+ #: views/view-about.php:213
547
+ #@ tablepress
548
+ msgid "Thanks to the translators:"
549
+ msgstr "Merci aux traducteurs :"
550
+
551
+ #: views/view-about.php:218
552
+ #, php-format
553
+ #@ tablepress
554
+ msgid "%s (thanks to %s)"
555
+ msgstr "%s (merci à %s)"
556
+
557
+ #: views/view-about.php:223
558
+ #@ tablepress
559
+ msgid "Thank you to all donors, contributors, supporters, reviewers and users of the plugin!"
560
+ msgstr "Merci à tous les donateurs, les contributeurs, les supporters, les évaluateurs et les utilisateurs de l'extension !"
561
+
562
+ #: views/view-add.php:37
563
+ #@ tablepress
564
+ msgid "Error: The table could not be added."
565
+ msgstr "Erreur : Le tableau ne peut pas être ajouté."
566
+
567
+ #: views/view-add.php:42
568
+ #@ tablepress
569
+ msgid "Add Table"
570
+ msgstr "Ajouter un tableau"
571
+
572
+ #: views/view-add.php:57
573
+ #@ tablepress
574
+ msgid "To add a new table, enter its name, a description (optional), and the number of rows and columns into the form below."
575
+ msgstr "Pour ajouter un nouveau tableau, entrer son nom, une description (optionnelle), et le nombre de lignes et colonnes dans le formulaire ci-dessous."
576
+
577
+ #: views/view-add.php:60
578
+ #@ tablepress
579
+ msgid "You can always change the name, description, and size of your table later."
580
+ msgstr "Vous pourrez toujours changer le nom, la description, et la taille de votre tableau ultérieurement."
581
+
582
+ #: views/view-add.php:77
583
+ #: views/view-edit.php:237
584
+ #: views/view-editor_button_thickbox.php:276
585
+ #: views/view-list.php:322
586
+ #@ tablepress
587
+ msgid "Table Name"
588
+ msgstr "Nom du tableau"
589
+
590
+ #: views/view-add.php:78
591
+ #@ tablepress
592
+ msgid "Enter Table Name here"
593
+ msgstr "Entrer le nom du tableau ici"
594
+
595
+ #: views/view-add.php:79
596
+ #@ tablepress
597
+ msgid "The name or title of your table."
598
+ msgstr "Le nom ou titre de votre tableau."
599
+
600
+ #: views/view-add.php:82
601
+ #: views/view-edit.php:241
602
+ #: views/view-editor_button_thickbox.php:277
603
+ #: views/view-list.php:323
604
+ #@ tablepress
605
+ msgid "Description"
606
+ msgstr "Description"
607
+
608
+ #: views/view-add.php:82
609
+ #@ tablepress
610
+ msgid "(optional)"
611
+ msgstr "(optionnel)"
612
+
613
+ #: views/view-add.php:83
614
+ #@ tablepress
615
+ msgid "Enter Description here"
616
+ msgstr "Entrer une description ici"
617
+
618
+ #: views/view-add.php:84
619
+ #@ tablepress
620
+ msgid "A description of the contents of your table."
621
+ msgstr "Une description du contenu de votre tableau."
622
+
623
+ #: views/view-add.php:87
624
+ #@ tablepress
625
+ msgid "Number of Rows"
626
+ msgstr "Nombre de lignes"
627
+
628
+ #: views/view-add.php:88
629
+ #: views/view-add.php:93
630
+ #: views/view-edit.php:426
631
+ #: views/view-edit.php:429
632
+ #@ tablepress
633
+ msgid "This field must contain a positive number."
634
+ msgstr "Le champ doit contenir un nombre positif."
635
+
636
+ #: views/view-add.php:89
637
+ #@ tablepress
638
+ msgid "The number of rows in your table."
639
+ msgstr "Nombre de lignes dans votre tableau."
640
+
641
+ #: views/view-add.php:92
642
+ #@ tablepress
643
+ msgid "Number of Columns"
644
+ msgstr "Nombre de colonnes"
645
+
646
+ #: views/view-add.php:94
647
+ #@ tablepress
648
+ msgid "The number of columns in your table."
649
+ msgstr "Nombre de colonnes dans votre tableau."
650
+
651
+ #: views/view-edit.php:48
652
+ #@ tablepress
653
+ msgid "The table was saved successfully."
654
+ msgstr "Le tableau a correctement été enregistré."
655
+
656
+ #: views/view-edit.php:49
657
+ #@ tablepress
658
+ msgid "The table was added successfully."
659
+ msgstr "Le tableau a correctement été ajouté."
660
+
661
+ #: views/view-edit.php:51
662
+ #@ tablepress
663
+ msgid "The table was imported successfully."
664
+ msgstr "Le tableau a correctement été importé."
665
+
666
+ #: views/view-edit.php:52
667
+ #@ tablepress
668
+ msgid "The table was imported successfully from WP-Table Reloaded."
669
+ msgstr "Le tableau a correctement été importé depuis WP-Table Reloaded."
670
+
671
+ #: views/view-edit.php:53
672
+ #: views/view-list.php:101
673
+ #@ tablepress
674
+ msgid "Error: The table could not be saved."
675
+ msgstr "Erreur : Le tableau ne peut pas être enregistré."
676
+
677
+ #: views/view-edit.php:54
678
+ #: views/view-list.php:100
679
+ #@ tablepress
680
+ msgid "Error: The table could not be deleted."
681
+ msgstr "Erreur: Le tableau ne peut pas être supprimé."
682
+
683
+ #: views/view-edit.php:55
684
+ #@ tablepress
685
+ msgid "The table was saved successfully, and the table ID was changed."
686
+ msgstr "Le tableau a correctement été enregistré, et son ID a été changé."
687
+
688
+ #: views/view-edit.php:56
689
+ #@ tablepress
690
+ msgid "The table was saved successfully, but the table ID could not be changed!"
691
+ msgstr "Le tableau a correctement été enregistré, mais son ID n'a pas pu être changé !"
692
+
693
+ #: views/view-edit.php:121
694
+ #@ tablepress
695
+ msgid "You can not delete all table rows!"
696
+ msgstr "Vous ne pouvez pas supprimer toutes les lignes du tableau !"
697
+
698
+ #: views/view-edit.php:122
699
+ #@ tablepress
700
+ msgid "You can not delete all table columns!"
701
+ msgstr "Vous ne pouvez pas supprimer toutes les colonnes du tableau !"
702
+
703
+ #: views/view-edit.php:123
704
+ #@ tablepress
705
+ msgid "You did not select any rows!"
706
+ msgstr "Vous n'avez pas sélectionné de lignes !"
707
+
708
+ #: views/view-edit.php:124
709
+ #@ tablepress
710
+ msgid "You did not select any columns!"
711
+ msgstr "Vous n'avez pas sélectionné de colonnes !"
712
+
713
+ #: views/view-edit.php:125
714
+ #@ tablepress
715
+ msgid "The value for the number of rows is invalid!"
716
+ msgstr "La valeur donnée pour le nombre de lignes est invalide !"
717
+
718
+ #: views/view-edit.php:126
719
+ #@ tablepress
720
+ msgid "The value for the number of columns is invalid!"
721
+ msgstr "La valeur donnée pour le nombre de colonnes est invalide !"
722
+
723
+ #: views/view-edit.php:127
724
+ #: views/view-edit.php:128
725
+ #@ tablepress
726
+ msgid "Do you really want to delete the selected row?"
727
+ msgid_plural "Do you really want to delete the selected rows?"
728
+ msgstr[0] "Voulez-vous vraiment supprimer la ligne sélectionnée ?"
729
+ msgstr[1] "Voulez-vous vraiment supprimer les lignes sélectionnées ?"
730
+
731
+ #: views/view-edit.php:129
732
+ #: views/view-edit.php:130
733
+ #@ tablepress
734
+ msgid "Do you really want to delete the selected column?"
735
+ msgid_plural "Do you really want to delete the selected columns?"
736
+ msgstr[0] "Voulez-vous vraiment supprimer la colonne sélectionnée ?"
737
+ msgstr[1] "Voulez-vous vraiment supprimer les colonnes sélectionnées ?"
738
+
739
+ #: views/view-edit.php:131
740
+ #@ tablepress
741
+ msgid "Please click into the cell that you want to edit using the &#8220;Advanced Editor&#8221;."
742
+ msgstr "Merci de cliquer sur la cellule que vous voulez éditer avec l'&#8220;éditeur avancé&#8221;."
743
+
744
+ #: views/view-edit.php:132
745
+ #@ tablepress
746
+ msgid "To combine cells within a column, click into the cell below the cell that has the content the combined cells shall have."
747
+ msgstr "Pour combiner des cellules en une colonne, cliquer dans la cellule qui suit celle qui contient les données à combiner."
748
+
749
+ #: views/view-edit.php:133
750
+ #@ tablepress
751
+ msgid "To combine cells within a row, click into the cell to the right of the cell that has the content the combined cells shall have."
752
+ msgstr "Pour combiner des cellules en une ligne, cliquer dans la cellule qui suit celle qui contient les données à combiner."
753
+
754
+ #: views/view-edit.php:137
755
+ #@ tablepress
756
+ msgid "Please click into the cell that you want to add a link to."
757
+ msgstr "Merci de cliquer sur la cellule dans laquelle un lien doit être ajouté."
758
+
759
+ #: views/view-edit.php:138
760
+ #@ tablepress
761
+ msgid "You can then enter the Link URL and Text or choose an existing page or post."
762
+ msgstr "Vous pouvez maintenant entrer un lien URL et texte ou choisir dans vos pages ou articles."
763
+
764
+ #: views/view-edit.php:139
765
+ #@ tablepress
766
+ msgid "Please click into the cell that you want to add an image to."
767
+ msgstr "Merci de cliquer sur la cellule dans laquelle vous voulez ajouter une image."
768
+
769
+ #: views/view-edit.php:140
770
+ #@ tablepress
771
+ msgid "The Media Library will open, where you can select or upload the desired image or enter the image URL."
772
+ msgstr "La bibliothèque de Médias va s'ouvrir, vous pourrez alors sélectionner ou envoyer votre image ou entrer l'URL d'une image."
773
+
774
+ #: views/view-edit.php:141
775
+ #, php-format
776
+ #@ tablepress
777
+ msgid "Click the &#8220;%s&#8221; button to insert the image."
778
+ msgstr "Cliquer sur les boutons &#8220;%s&#8221; pour insérer une image."
779
+
780
+ #: views/view-edit.php:142
781
+ #@ tablepress
782
+ msgid "The changes to this table were not saved yet and will be lost if you navigate away from this page."
783
+ msgstr "Les changements de ce tableau ne sont pas sauvegardés et seront perdus si vous quittez cette page."
784
+
785
+ #: views/view-edit.php:143
786
+ #@ tablepress
787
+ msgid "The Table Preview is being loaded..."
788
+ msgstr "L'aperçu du tableau est en cours de chargement..."
789
+
790
+ #: views/view-edit.php:144
791
+ #@ tablepress
792
+ msgid "The Table Preview could not be loaded."
793
+ msgstr "L'aperçu du tableau ne peut pas être chargé."
794
+
795
+ #: views/view-edit.php:145
796
+ #@ tablepress
797
+ msgid "Saving successful"
798
+ msgstr "Enregistrement réussi"
799
+
800
+ #: views/view-edit.php:146
801
+ #@ tablepress
802
+ msgid "Saving failed"
803
+ msgstr "Echec d'enregistrement"
804
+
805
+ #: views/view-edit.php:147
806
+ #@ tablepress
807
+ msgid "Changes are being saved..."
808
+ msgstr "Les changements sont en cours d'enregistrement..."
809
+
810
+ #: views/view-edit.php:148
811
+ #@ tablepress
812
+ msgid "The Table ID field can not be empty. Please enter a Table ID!"
813
+ msgstr "Le champ de l'ID du tableau ne peut pas être vide. Merci de saisir un ID de tableau !"
814
+
815
+ #: views/view-edit.php:149
816
+ #@ tablepress
817
+ msgid "The Table ID &#8220;0&#8221; is not supported. Please enter a different Table ID!"
818
+ msgstr "L'ID de tableau &#8220;0&#8221; n'est pas autorisé. Merci de saisir un ID de tableau différent !"
819
+
820
+ #: views/view-edit.php:150
821
+ #@ tablepress
822
+ msgid "Do you really want to change the Table ID? All Shortcodes for this table in your pages and posts will have to be adjusted!"
823
+ msgstr "Voulez-vous vraiment changer l'ID du tableau ? Toutes les références à l'ancien raccourci dans vos pages et articles devront être revues !"
824
+
825
+ #: views/view-edit.php:151
826
+ #@ tablepress
827
+ msgid "The entered value in the field &#8220;Extra CSS classes&#8221; is invalid."
828
+ msgstr "La valeur saisie dans le champ &#8220;Extra classes CSS &#8221; est invalide."
829
+
830
+ #: views/view-edit.php:152
831
+ #@ tablepress
832
+ msgid "The entered value in the field &#8220;Pagination Entries&#8221; is not a number."
833
+ msgstr "La valeur entrée dans le champ &#8220;Entrées de Pagination&#8221; n'est pas un nombre."
834
+
835
+ #: views/view-edit.php:153
836
+ #: views/view-edit.php:300
837
+ #@ tablepress
838
+ msgid "Sort ascending"
839
+ msgstr "Tri ascendant"
840
+
841
+ #: views/view-edit.php:154
842
+ #: views/view-edit.php:300
843
+ #@ tablepress
844
+ msgid "Sort descending"
845
+ msgstr "Tri descendant"
846
+
847
+ #: views/view-edit.php:155
848
+ #@ tablepress
849
+ msgid "You can not add rowspan to the first row!"
850
+ msgstr "Vous ne pouvez pas ajouter une combinaison de lignes dès la première ligne !"
851
+
852
+ #: views/view-edit.php:156
853
+ #@ tablepress
854
+ msgid "You can not add colspan to the first column!"
855
+ msgstr "Vous ne pouvez pas ajouter une combinaison de colonnes dès la première colonne !"
856
+
857
+ #: views/view-edit.php:157
858
+ #@ tablepress
859
+ msgid "You can not connect cells into the table head row!"
860
+ msgstr "Vous ne pouvez pas combiner les cellules avec celles de la ligne d'en-tête du tableau !"
861
+
862
+ #: views/view-edit.php:158
863
+ #@ tablepress
864
+ msgid "You can not connect cells out of the table foot row!"
865
+ msgstr "Vous ne pouvez pas combiner les cellules avec celles de la ligne de pied de tableau !"
866
+
867
+ #: views/view-edit.php:166
868
+ #@ tablepress
869
+ msgid "Table Information"
870
+ msgstr "Informations du tableau"
871
+
872
+ #: views/view-edit.php:167
873
+ #@ tablepress
874
+ msgid "Table Content"
875
+ msgstr "Contenu du tableau"
876
+
877
+ #: views/view-edit.php:168
878
+ #@ tablepress
879
+ msgid "Table Manipulation"
880
+ msgstr "Manipulation du tableau"
881
+
882
+ #: views/view-edit.php:169
883
+ #: views/view-edit.php:593
884
+ #@ tablepress
885
+ msgid "Table Options"
886
+ msgstr "Options du tableau"
887
+
888
+ #: views/view-edit.php:170
889
+ #@ tablepress
890
+ msgid "Features of the DataTables JavaScript library"
891
+ msgstr "Contenu de la bibliothèque JavaScript DataTables"
892
+
893
+ #: views/view-edit.php:228
894
+ #@ tablepress
895
+ msgid "Table ID"
896
+ msgstr "ID du tableau"
897
+
898
+ #: views/view-edit.php:231
899
+ #@ tablepress
900
+ msgid "The Table ID can only consist of letters, numbers, hyphens (-), and underscores (_)."
901
+ msgstr "L'ID d'un tableau peut uniquement contenir des lettres, des nombres, des tirets (-) et des soulignés (_)."
902
+
903
+ #: views/view-edit.php:232
904
+ #@ tablepress
905
+ msgid "Shortcode"
906
+ msgstr "Raccourci"
907
+
908
+ #: views/view-edit.php:245
909
+ #: views/view-list.php:326
910
+ #@ tablepress
911
+ msgid "Last Modified"
912
+ msgstr "Dernière modification"
913
+
914
+ #: views/view-edit.php:246
915
+ #, php-format
916
+ #@ tablepress
917
+ msgid "%1$s by %2$s"
918
+ msgstr "%1$s par %2$s"
919
+
920
+ #: views/view-edit.php:378
921
+ #@ tablepress
922
+ msgid "Insert Link"
923
+ msgstr "Insérer un lien"
924
+
925
+ #: views/view-edit.php:379
926
+ #@ tablepress
927
+ msgid "Insert Image"
928
+ msgstr "Insérer une image"
929
+
930
+ #: views/view-edit.php:380
931
+ #@ tablepress
932
+ msgid "Advanced Editor"
933
+ msgstr "Editeur avancé"
934
+
935
+ #: views/view-edit.php:383
936
+ #@ tablepress
937
+ msgid "Combine cells"
938
+ msgstr "Combiner des cellules"
939
+
940
+ #: views/view-edit.php:384
941
+ #@ tablepress
942
+ msgid "in a column (rowspan)"
943
+ msgstr "En une colonne (rowspan)"
944
+
945
+ #: views/view-edit.php:385
946
+ #@ tablepress
947
+ msgid "in a row (colspan)"
948
+ msgstr "En une ligne (colspan)"
949
+
950
+ #: views/view-edit.php:386
951
+ #@ tablepress
952
+ msgid "?"
953
+ msgstr "?"
954
+
955
+ #: views/view-edit.php:386
956
+ #@ tablepress
957
+ msgid "Help on combining cells"
958
+ msgstr "Aide sur la combinaison de cellules"
959
+
960
+ #: views/view-edit.php:388
961
+ #@ tablepress
962
+ msgid "Table cells can span across more than one column or row."
963
+ msgstr "Les cellules d'un tableau peuvent être combinées depuis plusieurs colonnes ou lignes."
964
+
965
+ #: views/view-edit.php:389
966
+ #@ tablepress
967
+ msgid "Combining consecutive cells within the same row is called &#8220;colspanning&#8221;."
968
+ msgstr "Combiner plusieurs cellules consécutives dans une même ligne est appelé &#8220;colspanning&#8221;."
969
+
970
+ #: views/view-edit.php:390
971
+ #@ tablepress
972
+ msgid "Combining consecutive cells within the same column is called &#8220;rowspanning&#8221;."
973
+ msgstr "Combiner plusieurs cellules consécutives depuis une même colonne est appelé &#8220;rowspanning&#8221;."
974
+
975
+ #: views/view-edit.php:391
976
+ #@ tablepress
977
+ msgid "To combine adjacent cells in a row, add the keyword <code>#colspan#</code> to the cell to the right of the one with the content for the combined cell by using the corresponding button."
978
+ msgstr "Pour combiner des cellules adjacentes, ajouter le mot clef <code>#colspan#</code> dans la cellule à droite de la première qui contient les données à combiner en utilisant le bouton correspondant."
979
+
980
+ #: views/view-edit.php:392
981
+ #@ tablepress
982
+ msgid "To combine adjacent cells in a column, add the keyword <code>#rowspan#</code> to the cell below the one with the content for the combined cell by using the corresponding button."
983
+ msgstr "Pour combiner des cellules en une colonne, utilisez le mot clef <code>#rowspan#</code> dans la cellule sous la cellule qui contient les données à combiner en utilisant le bouton correspondant."
984
+
985
+ #: views/view-edit.php:393
986
+ #@ tablepress
987
+ msgid "Repeat this to add the keyword to all cells that shall be connected."
988
+ msgstr "Répéter cette opération à toutes les cellules qui ont besoin d'être combinées."
989
+
990
+ #: views/view-edit.php:394
991
+ #@ tablepress
992
+ msgid "Be aware that the functions of the DataTables JavaScript library will not work on tables which have combined cells."
993
+ msgstr "Prenez note que les fonctions de la librairie DataTables JavaScript ne fonctionneront pas dans les tableaux qui ont des cellules combinées."
994
+
995
+ #: views/view-edit.php:400
996
+ #: views/view-edit.php:412
997
+ #@ tablepress
998
+ msgid "Selected rows"
999
+ msgstr "Lignes sélectionnées"
1000
+
1001
+ #: views/view-edit.php:401
1002
+ #: views/view-edit.php:406
1003
+ #@ tablepress
1004
+ msgid "Hide"
1005
+ msgstr "Cacher"
1006
+
1007
+ #: views/view-edit.php:402
1008
+ #: views/view-edit.php:407
1009
+ #@ tablepress
1010
+ msgid "Show"
1011
+ msgstr "Montrer"
1012
+
1013
+ #: views/view-edit.php:405
1014
+ #: views/view-edit.php:418
1015
+ #@ tablepress
1016
+ msgid "Selected columns"
1017
+ msgstr "Colonnes sélectionnées"
1018
+
1019
+ #: views/view-edit.php:414
1020
+ #: views/view-edit.php:420
1021
+ #@ tablepress
1022
+ msgid "Insert"
1023
+ msgstr "Insérer"
1024
+
1025
+ #: views/view-edit.php:415
1026
+ #: views/view-edit.php:421
1027
+ #: views/view-list.php:432
1028
+ #@ tablepress
1029
+ msgid "Delete"
1030
+ msgstr "Supprimer"
1031
+
1032
+ #: views/view-edit.php:426
1033
+ #, php-format
1034
+ #@ tablepress
1035
+ msgid "Add %s row(s)"
1036
+ msgstr "Ajouter %s ligne(s)"
1037
+
1038
+ #: views/view-edit.php:426
1039
+ #: views/view-edit.php:429
1040
+ #@ tablepress
1041
+ msgid "Add"
1042
+ msgstr "Ajouter"
1043
+
1044
+ #: views/view-edit.php:429
1045
+ #, php-format
1046
+ #@ tablepress
1047
+ msgid "Add %s column(s)"
1048
+ msgstr "Ajouter %s colonne(s)"
1049
+
1050
+ #: views/view-edit.php:433
1051
+ #@ tablepress
1052
+ msgid "To use the Table Manipulation features, JavaScript needs to be enabled in your browser."
1053
+ msgstr "Pour que les opérations de manipulation d'un tableau fonctionnent, vous devez activer le JavaScript sur votre navigateur."
1054
+
1055
+ #: views/view-edit.php:477
1056
+ #@ tablepress
1057
+ msgid "Other Actions"
1058
+ msgstr "Autres actions"
1059
+
1060
+ #: views/view-edit.php:485
1061
+ #@ tablepress
1062
+ msgid "Delete Table"
1063
+ msgstr "Supprimer le tableau"
1064
+
1065
+ #: views/view-edit.php:482
1066
+ #@ tablepress
1067
+ msgid "Export Table"
1068
+ msgstr "Exporter le tableau"
1069
+
1070
+ #: views/view-edit.php:513
1071
+ #@ tablepress
1072
+ msgid "Cancel"
1073
+ msgstr "Annuler"
1074
+
1075
+ #: views/view-edit.php:514
1076
+ #@ tablepress
1077
+ msgid "OK"
1078
+ msgstr "Valider"
1079
+
1080
+ #: views/view-edit.php:538
1081
+ #: views/view-edit.php:593
1082
+ #@ tablepress
1083
+ msgid "Table Head Row"
1084
+ msgstr "Ligne d'en-tête du tableau"
1085
+
1086
+ #: views/view-edit.php:539
1087
+ #@ tablepress
1088
+ msgid "The first row of the table is the table header."
1089
+ msgstr "La première ligne du tableau est l'en-tête."
1090
+
1091
+ #: views/view-edit.php:542
1092
+ #@ tablepress
1093
+ msgid "Table Foot Row"
1094
+ msgstr "Ligne de pied du tableau"
1095
+
1096
+ #: views/view-edit.php:543
1097
+ #@ tablepress
1098
+ msgid "The last row of the table is the table footer."
1099
+ msgstr "La dernière ligne du tableau est le pied."
1100
+
1101
+ #: views/view-edit.php:546
1102
+ #@ tablepress
1103
+ msgid "Alternating Row Colors"
1104
+ msgstr "Alterner les couleurs"
1105
+
1106
+ #: views/view-edit.php:547
1107
+ #@ tablepress
1108
+ msgid "The background colors of consecutive rows shall alternate."
1109
+ msgstr "La couleur de fond des lignes consécutives devrait alterner."
1110
+
1111
+ #: views/view-edit.php:550
1112
+ #@ tablepress
1113
+ msgid "Row Hover Highlighting"
1114
+ msgstr "Mise en surbrillance du survol d'une ligne"
1115
+
1116
+ #: views/view-edit.php:551
1117
+ #@ tablepress
1118
+ msgid "Highlight a row while the mouse cursor hovers above it by changing its background color."
1119
+ msgstr "Met en surbrillance la ligne que survole le pointeur de la souris en changeant sa couleur de fond."
1120
+
1121
+ #: views/view-edit.php:554
1122
+ #@ tablepress
1123
+ msgid "Print Table Name"
1124
+ msgstr "Montrer le nom du tableau"
1125
+
1126
+ #: views/view-edit.php:557
1127
+ #: views/view-edit.php:567
1128
+ #@ tablepress
1129
+ msgid "above"
1130
+ msgstr "au dessus"
1131
+
1132
+ #: views/view-edit.php:558
1133
+ #: views/view-edit.php:568
1134
+ #@ tablepress
1135
+ msgid "below"
1136
+ msgstr "au dessous"
1137
+
1138
+ #: views/view-edit.php:564
1139
+ #@ tablepress
1140
+ msgid "Print Table Description"
1141
+ msgstr "Montrer la description du tableau"
1142
+
1143
+ #: views/view-edit.php:574
1144
+ #@ tablepress
1145
+ msgid "Extra CSS Classes"
1146
+ msgstr "Classes CSS Additionnelles"
1147
+
1148
+ #: views/view-edit.php:575
1149
+ #@ tablepress
1150
+ msgid "This field can only contain letters, numbers, spaces, hyphens (-), and underscores (_)."
1151
+ msgstr "Le champ peut uniquement contenir des lettres, des nombres, des espaces, des tirets (-) et des soulignés (_)."
1152
+
1153
+ #: views/view-edit.php:575
1154
+ #@ tablepress
1155
+ msgid "Additional CSS classes for styling purposes can be entered here."
1156
+ msgstr "Vous pouvez entrer ici des classes CSS additionnelles pour compléter le style."
1157
+
1158
+ #: views/view-edit.php:575
1159
+ #, php-format
1160
+ #@ tablepress
1161
+ msgid "This is NOT the place to enter <a href=\"%s\">Custom CSS</a> code!"
1162
+ msgstr "Ce n'est PAS l'endroit pour entrer du code <a href=\"%s\">CSS personnalisé</a> !"
1163
+
1164
+ #: views/view-edit.php:593
1165
+ #, php-format
1166
+ #@ tablepress
1167
+ msgid "These features and options are only available, when the &#8220;%1$s&#8221; checkbox in the &#8220;%2$s&#8221; section is checked."
1168
+ msgstr "Ces fonctions et options sont uniquement disponibles lorsque la case à cocher du &#8220;%1$s&#8221; dans la section &#8220;%2$s&#8221; est cochée."
1169
+
1170
+ #: views/view-edit.php:597
1171
+ #@ tablepress
1172
+ msgid "Use DataTables"
1173
+ msgstr "Utilise DataTables"
1174
+
1175
+ #: views/view-edit.php:598
1176
+ #@ tablepress
1177
+ msgid "Use the following features of the DataTables JavaScript library with this table:"
1178
+ msgstr "Utiliser les fonctions suivantes de la librairie JavaScript DataTables pour ce tableau :"
1179
+
1180
+ #: views/view-edit.php:601
1181
+ #@ tablepress
1182
+ msgid "Sorting"
1183
+ msgstr "Trier"
1184
+
1185
+ #: views/view-edit.php:602
1186
+ #@ tablepress
1187
+ msgid "Enable sorting of the table by the visitor."
1188
+ msgstr "Active la possibilité au visiteur de trier le tableau."
1189
+
1190
+ #: views/view-edit.php:605
1191
+ #@ tablepress
1192
+ msgid "Search/Filtering"
1193
+ msgstr "Chercher/Filtrer"
1194
+
1195
+ #: views/view-edit.php:606
1196
+ #@ tablepress
1197
+ msgid "Enable the visitor to filter or search the table. Only rows with the search word in them are shown."
1198
+ msgstr "Active la possibilité au visiteur de filtrer ou chercher dans le tableau. Seules les lignes avec le mot cherché sont montrées."
1199
+
1200
+ #: views/view-edit.php:609
1201
+ #@ tablepress
1202
+ msgid "Pagination"
1203
+ msgstr "Pagination"
1204
+
1205
+ #: views/view-edit.php:610
1206
+ #@ tablepress
1207
+ msgid "Enable pagination of the table (viewing only a certain number of rows at a time) by the visitor."
1208
+ msgstr "Active la pagination du tableau (montre un certain nombre de lignes à la fois) par le visiteur."
1209
+
1210
+ #: views/view-edit.php:611
1211
+ #, php-format
1212
+ #@ tablepress
1213
+ msgid "Show %s rows per page."
1214
+ msgstr "Montrer %s lignes par page."
1215
+
1216
+ #: views/view-edit.php:614
1217
+ #@ tablepress
1218
+ msgid "Pagination Length Change"
1219
+ msgstr "Changer la longueur de pagination"
1220
+
1221
+ #: views/view-edit.php:615
1222
+ #@ tablepress
1223
+ msgid "Allow the visitor to change the number of rows shown when using pagination."
1224
+ msgstr "Permet au visiteur de changer le nombre de lignes lorsque la pagination est active."
1225
+
1226
+ #: views/view-edit.php:618
1227
+ #@ tablepress
1228
+ msgid "Info"
1229
+ msgstr "Info"
1230
+
1231
+ #: views/view-edit.php:619
1232
+ #@ tablepress
1233
+ msgid "Enable the table information display, with information about the currently visible data, like the number of rows."
1234
+ msgstr "Active l'affichage des informations du tableau, avec les informations relatives au données visibles, comme le nombre de lignes."
1235
+
1236
+ #: views/view-edit.php:622
1237
+ #@ tablepress
1238
+ msgid "Horizontal Scrolling"
1239
+ msgstr "Défilement horizontal"
1240
+
1241
+ #: views/view-edit.php:623
1242
+ #@ tablepress
1243
+ msgid "Enable horizontal scrolling, to make viewing tables with many columns easier."
1244
+ msgstr "Active le défilement horizontal, pour faciliter la lecture du tableau avec de nombreuses colonnes."
1245
+
1246
+ #: views/view-edit.php:629
1247
+ #@ tablepress
1248
+ msgid "Custom Commands"
1249
+ msgstr "Commandes personnalisées"
1250
+
1251
+ #: views/view-edit.php:630
1252
+ #@ tablepress
1253
+ msgid "Additional parameters from the <a href=\"http://www.datatables.net/\">DataTables documentation</a> to be added to the JS call."
1254
+ msgstr "Paramètres supplémentaires qui peuvent être ajoutés aux appels JS depuis la <a href=\"http://www.datatables.net/\">documentation des DataTables</a>."
1255
+
1256
+ #: views/view-edit.php:630
1257
+ #@ tablepress
1258
+ msgid "For advanced use only."
1259
+ msgstr "Utilisation avancée seulement."
1260
+
1261
+ #: views/view-edit.php:683
1262
+ #, php-format
1263
+ #@ tablepress
1264
+ msgid "On this screen, you can edit the content and structure of the table with the ID %s."
1265
+ msgstr "Sur cet écran, vous pouvez éditer le contenu et la structure de la table ayant pour ID %s."
1266
+
1267
+ #: views/view-edit.php:684
1268
+ #@ tablepress
1269
+ msgid "For example, you can insert things like text, images, or links into the table, or change the used table features. You can also insert, delete, move, hide, and swap columns and rows."
1270
+ msgstr "Par exemple, vous pouvez insérer du texte, des images ou des liens dans le tableau, ou changer les propriétés du tableau. Vous pouvez également insérer, supprimer, déplacer, cacher et intervertir les colonnes et les lignes."
1271
+
1272
+ #: views/view-edit.php:687
1273
+ #, php-format
1274
+ #@ tablepress
1275
+ msgid "To insert the table into a page, post, or text widget, copy the Shortcode %s and paste it at the desired place in the editor."
1276
+ msgstr "Pour insérer le tableau dans une page, un article ou un texte widget, copier le raccourci %s et collez-le à l'endroit souhaité dans votre éditeur."
1277
+
1278
+ #: views/view-editor_button_thickbox.php:68
1279
+ #: views/view-editor_button_thickbox.php:171
1280
+ #@ tablepress
1281
+ msgid "List of Tables"
1282
+ msgstr "Liste des tableaux"
1283
+
1284
+ #: views/view-editor_button_thickbox.php:174
1285
+ #@ tablepress
1286
+ msgid "This is a list of all available tables."
1287
+ msgstr "C'est la liste de tous les tableaux disponibles"
1288
+
1289
+ #: views/view-editor_button_thickbox.php:174
1290
+ #@ tablepress
1291
+ msgid "You may insert a table into a post or page here."
1292
+ msgstr "C'est ici que vous devez insérer un tableau dans votre article ou page."
1293
+
1294
+ #: views/view-editor_button_thickbox.php:176
1295
+ #: views/view-editor_button_thickbox.php:357
1296
+ #@ tablepress
1297
+ msgid "Insert Shortcode"
1298
+ msgstr "Insérer le raccourci"
1299
+
1300
+ #: views/view-editor_button_thickbox.php:180
1301
+ #: views/view-list.php:205
1302
+ #, php-format
1303
+ #@ tablepress
1304
+ msgid "Search results for &#8220;%s&#8221;"
1305
+ msgstr "Résultats de recherche pour &#8220;%s&#8221;"
1306
+
1307
+ #: views/view-editor_button_thickbox.php:186
1308
+ #: views/view-list.php:213
1309
+ #@ tablepress
1310
+ msgid "Search Tables"
1311
+ msgstr "Rechercher"
1312
+
1313
+ #: views/view-editor_button_thickbox.php:275
1314
+ #: views/view-list.php:321
1315
+ #@ tablepress
1316
+ msgid "ID"
1317
+ msgstr "ID"
1318
+
1319
+ #: views/view-editor_button_thickbox.php:278
1320
+ #@ tablepress
1321
+ msgid "Action"
1322
+ msgstr "Action"
1323
+
1324
+ #: views/view-editor_button_thickbox.php:343
1325
+ #: views/view-list.php:451
1326
+ #@ tablepress
1327
+ msgid "(no description)"
1328
+ msgstr "(pas de description)"
1329
+
1330
+ #: views/view-editor_button_thickbox.php:366
1331
+ #: views/view-export.php:88
1332
+ #: views/view-list.php:569
1333
+ #@ tablepress
1334
+ msgid "No tables found."
1335
+ msgstr "Aucun tableau trouvé."
1336
+
1337
+ #: views/view-editor_button_thickbox.php:368
1338
+ #@ tablepress
1339
+ msgid "You should add or import a table on the TablePress screens to get started!"
1340
+ msgstr "Pour commencer, vous devez créer ou importer un tableau depuis l'écran de TablePress !"
1341
+
1342
+ #: views/view-export.php:35
1343
+ #@ tablepress
1344
+ msgid "Error: The export failed."
1345
+ msgstr "Erreur : L'export a échoué."
1346
+
1347
+ #: views/view-export.php:36
1348
+ #: views/view-list.php:106
1349
+ #@ tablepress
1350
+ msgid "Error: This table could not be loaded!"
1351
+ msgstr "Erreur : Ce tableau ne peut pas être chargé !"
1352
+
1353
+ #: views/view-export.php:38
1354
+ #@ tablepress
1355
+ msgid "Error: The ZIP file could not be created."
1356
+ msgstr "Erreur : Le fichier ZIP ne peut pas être créé."
1357
+
1358
+ #: views/view-export.php:43
1359
+ #: views/view-export.php:46
1360
+ #@ tablepress
1361
+ msgid "Export Tables"
1362
+ msgstr "Exporter des tableaux"
1363
+
1364
+ #: views/view-export.php:63
1365
+ #@ tablepress
1366
+ msgid "Exporting a table allows you to use it in other programs, like spreadsheets applications."
1367
+ msgstr "Exporter un tableau vous permet de l'utiliser dans d'autres programmes, comme des tableurs."
1368
+
1369
+ #: views/view-export.php:64
1370
+ #@ tablepress
1371
+ msgid "Regularly exporting tables is also recommended as a backup of your data."
1372
+ msgstr "Exporter régulièrement vos tableaux est recommandé en guise de sauvegarde de vos données."
1373
+
1374
+ #: views/view-export.php:67
1375
+ #@ tablepress
1376
+ msgid "To export, select the tables and the desired export format."
1377
+ msgstr "Pour exporter, sélectionner les tableaux ainsi que le format désiré."
1378
+
1379
+ #: views/view-export.php:68
1380
+ #@ tablepress
1381
+ msgid "If you choose more than one table, the exported files will automatically be stored in a ZIP archive file."
1382
+ msgstr "Si vous choisissez plus d'un tableau, les fichiers exportés seront automatiquement stockés dans un fichier archive ZIP."
1383
+
1384
+ #: views/view-export.php:70
1385
+ #@ tablepress
1386
+ msgid "Be aware that for the CSV and HTML formats only the table data, but no table options are exported!"
1387
+ msgstr "Attention : dans le format CSV et HTML, aucune propriété du tableau n'est prise en compte, seules ses données en elles-même sont exportées."
1388
+
1389
+ #: views/view-export.php:71
1390
+ #@ tablepress
1391
+ msgid "For the JSON format, the table data and the table options are exported."
1392
+ msgstr "Pour le format JSON, les données et ses propriétés sont exportées."
1393
+
1394
+ #: views/view-export.php:89
1395
+ #: views/view-list.php:578
1396
+ #, php-format
1397
+ #@ tablepress
1398
+ msgid "You should <a href=\"%s\">add</a> or <a href=\"%s\">import</a> a table to get started!"
1399
+ msgstr "Vous devez <a href=\"%s\">add</a> or <a href=\"%s\">importer</a> un tableau pour commencer !"
1400
+
1401
+ #: views/view-export.php:107
1402
+ #@ tablepress
1403
+ msgid "Tables to Export"
1404
+ msgstr "Tableaux à exporter"
1405
+
1406
+ #: views/view-export.php:110
1407
+ #@ tablepress
1408
+ msgid "Select all"
1409
+ msgstr "Tout sélectionner"
1410
+
1411
+ #: views/view-export.php:133
1412
+ #: views/view-import.php:213
1413
+ #, php-format
1414
+ #@ tablepress
1415
+ msgid "ID %1$s: %2$s"
1416
+ msgstr "ID %1$s: %2$s"
1417
+
1418
+ #: views/view-export.php:141
1419
+ #@ tablepress
1420
+ msgid "You can select multiple tables by holding down the &#8220;Ctrl&#8221; key (Windows) or the &#8220;Command&#8221; key (Mac)."
1421
+ msgstr "Vous pouvez sélectionner plusieurs tableaux en maintenant enfoncé la touche &#8220;Ctrl&#8221; (Windows) ou la touche &#8220;Cmd&#8221; (Mac)."
1422
+
1423
+ #: views/view-export.php:147
1424
+ #@ tablepress
1425
+ msgid "Export Format"
1426
+ msgstr "Format d'export"
1427
+
1428
+ #: views/view-export.php:160
1429
+ #@ tablepress
1430
+ msgid "CSV Delimiter"
1431
+ msgstr "Délimiteur CSV"
1432
+
1433
+ #: views/view-export.php:169
1434
+ #@ tablepress
1435
+ msgid "(Only needed for CSV export.)"
1436
+ msgstr "(nécessaire uniquement pour l'export CSV)"
1437
+
1438
+ #: views/view-export.php:173
1439
+ #@ tablepress
1440
+ msgid "ZIP file"
1441
+ msgstr "Fichier ZIP"
1442
+
1443
+ #: views/view-export.php:179
1444
+ #@ tablepress
1445
+ msgid "Create a ZIP archive."
1446
+ msgstr "Créer une archive ZIP."
1447
+
1448
+ #: views/view-export.php:179
1449
+ #@ tablepress
1450
+ msgid "(Mandatory if more than one table is selected.)"
1451
+ msgstr "(obligatoire si plus d'un tableau est sélectionné)"
1452
+
1453
+ #: views/view-export.php:182
1454
+ #@ tablepress
1455
+ msgid "Note: Support for ZIP file creation seems not to be available on this server."
1456
+ msgstr "Note : Le support de création de fichiers ZIP ne semble pas disponible sur ce serveur."
1457
+
1458
+ #: views/view-import.php:44
1459
+ #: views/view-import.php:56
1460
+ #@ tablepress
1461
+ msgid "Error: You did not select what to import from WP-Table Reloaded!"
1462
+ msgstr "Erreur : Vous n'avez pas sélectionné les éléments à importer depuis WP-Table Reloaded !"
1463
+
1464
+ #: views/view-import.php:49
1465
+ #@ tablepress
1466
+ msgid "Error: The import failed."
1467
+ msgstr "Erreur : L'import a échoué."
1468
+
1469
+ #: views/view-import.php:50
1470
+ #@ tablepress
1471
+ msgid "Error: Import of ZIP files is not available on this server."
1472
+ msgstr "Erreur : L'import de fichiers ZIP n'est pas disponible sur ce serveur."
1473
+
1474
+ #: views/view-import.php:51
1475
+ #@ tablepress
1476
+ msgid "Error: The ZIP file could not be opened."
1477
+ msgstr "Erreur : Le fichier ZIP ne peut pas être ouvert."
1478
+
1479
+ #: views/view-import.php:52
1480
+ #@ tablepress
1481
+ msgid "Error: The data in the ZIP file is invalid."
1482
+ msgstr "Erreur : Les données dans le fichier ZIP sont invalides."
1483
+
1484
+ #: views/view-import.php:54
1485
+ #@ tablepress
1486
+ msgid "Error: The source for the import is invalid or could not be accessed."
1487
+ msgstr "Erreur : La source à importer est invalide ou inaccessible."
1488
+
1489
+ #: views/view-import.php:55
1490
+ #@ tablepress
1491
+ msgid "Error: The data for the import is invalid."
1492
+ msgstr "Erreur : Les données à importer sont invalides."
1493
+
1494
+ #: views/view-import.php:57
1495
+ #@ tablepress
1496
+ msgid "Error: Existing WP-Table Reloaded tables were not found in the database."
1497
+ msgstr "Erreur : Des tableaux existants dans WP-Table Reloaded ont été trouvés dans la base de données."
1498
+
1499
+ #: views/view-import.php:58
1500
+ #@ tablepress
1501
+ msgid "Er