WP RSS Aggregator - Version 4.18

Version Description

(2021-03-08) = Added - The total import time is now recorded in the debug log.

Changed - Omitting dev files from the plugin, reducing its size. - Redesigned the "More Features" page. - Feed items link to the original article when shown without a template and in RSS feeds. - Allocating more PHP execution time for image downloads.

Fixed - Images with HTML entities in the URL resulted in broken images and missing featured images. - The code that checks when a feed is saved no longer runs unnecessarily. - Fixed styling issues with the "Save" button in the Templates edit page. - The max title length option in the "Default" template was being applied in the "Feed Items" page.

Download this release

Release Info

Developer Mekku
Plugin Icon 128x128 WP RSS Aggregator
Version 4.18
Comparing to
See all releases

Code changes from version 4.17.10 to 4.18

Files changed (39) hide show
  1. css/admin-styles.css +1289 -1262
  2. css/build/templates.min.css +1 -1
  3. css/templates/list/styles.css +10 -0
  4. includes/admin-heartbeat.php +53 -77
  5. includes/cron-jobs.php +384 -361
  6. includes/feed-importing-images.php +13 -1
  7. includes/feed-importing-new.php +407 -0
  8. includes/feed-importing.php +949 -932
  9. includes/functions.php +28 -0
  10. includes/legacy-feed-display.php +18 -11
  11. includes/misc-functions.php +20 -0
  12. includes/multimedia.php +60 -0
  13. includes/roles-capabilities.php +45 -7
  14. includes/system-info.php +3 -27
  15. js/build/templates.min.js +1 -1
  16. js/heartbeat.js +3 -0
  17. readme.txt +43 -26
  18. src/Container/ModuleContainer.php +14 -5
  19. src/Handlers/FeedSources/FeedSourceSaveMetaHandler.php +23 -10
  20. src/Modules/FeedItemsModule.php +16 -1
  21. src/Modules/FeedSourcesModule.php +2 -1
  22. src/Modules/FeedTemplatesModule.php +11 -0
  23. src/Query/DbQuery.php +31 -0
  24. src/Templates/Feeds/Types/ListTemplateType.php +4 -0
  25. src/Twig/Extensions/WpraExtension.php +14 -1
  26. templates/admin/upsell/more-features-page/main.twig +58 -0
  27. templates/feeds/_parts/audio-player.twig +11 -0
  28. templates/feeds/list/feed-item.twig +2 -0
  29. vendor/composer/ClassLoader.php +34 -2
  30. vendor/composer/InstalledVersions.php +647 -0
  31. vendor/composer/autoload_classmap.php +2 -1
  32. vendor/composer/autoload_real.php +4 -2
  33. vendor/composer/autoload_static.php +2 -1
  34. vendor/composer/installed.json +1993 -1947
  35. vendor/composer/installed.php +387 -0
  36. vendor/composer/platform_check.php +26 -0
  37. vendor/rebelcode/composer-cleanup-plugin/composer.json +5 -2
  38. vendor/rebelcode/composer-cleanup-plugin/src/CleanupPlugin.php +34 -30
  39. wp-rss-aggregator.php +5 -2
css/admin-styles.css CHANGED
@@ -1,1262 +1,1289 @@
1
- body.post-type-wprss_feed q {
2
- font-style: italic;
3
- }
4
- body.post-type-wprss_feed q:before {
5
- content: '"';
6
- }
7
- body.post-type-wprss_feed q:after {
8
- content: '"';
9
- }
10
-
11
- span.wp-rss-footer-text {
12
- font-style: italic;
13
- }
14
-
15
- .wprss-input {
16
- background: none repeat scroll 0 0 #EAF2FA;
17
- margin-bottom: 20px;
18
- padding-bottom: 10px;
19
- padding-left: 10px;
20
- padding-top: 10px;
21
- width: 600px;
22
- }
23
-
24
- .wprss-input p { line-height: 28px; }
25
-
26
- .wprss-input label {
27
- float: left;
28
- width: 95px !important;
29
- }
30
-
31
- .wprss-input input {
32
- height: 28px;
33
- margin-bottom: 0;
34
- padding: 0 0 0 5px;
35
- width: 400px;
36
- }
37
-
38
- .wprss-text-input {
39
- display: inline-block;
40
- width: 400px;
41
- max-width: 100%;
42
- }
43
-
44
- label.description {
45
- font-size: 13px;
46
- font-style: italic;
47
- }
48
-
49
- span.wprss-row-id {
50
- color: #8f8f8f;
51
- }
52
-
53
- #icon-wprss-aggregator {
54
- background: transparent url( '../images/icon-adminpage32.png' ) no-repeat !important;
55
- }
56
-
57
- body.post-type-wprss_feed #titlediv div.inside { display: none !important; }
58
-
59
- #misc-publishing-actions,
60
- #minor-publishing-actions { display: none; }
61
-
62
- div#force-feed-container {
63
- border-top: 1px solid #ddd;
64
- }
65
-
66
-
67
- /* FORM TABLES */
68
- .wprss-form-table th {
69
- width: 135px;
70
- max-width: 135px;
71
- padding: 7px 10px 10px 0;
72
- }
73
- .wprss-form-table td {
74
- padding: 7px 10px;
75
- }
76
- .wprss-form-table td label {
77
- line-height: 15px;
78
- }
79
- @media screen and (max-width: 1025px) {
80
- .wprss-form-table th {
81
- display: block;
82
- padding: 0;
83
- }
84
- .wprss-form-table td {
85
- display: block;
86
- padding-left: 0;
87
- padding-right: 0;
88
- }
89
-
90
- .wprss-form-table td input[type="text"],
91
- .wprss-form-table td input[type="url"],
92
- .wprss-form-table td select {
93
- display: block;
94
- width: 100%;
95
- }
96
-
97
- .wprss-form-table td span.description {
98
- display: inline;
99
- }
100
-
101
- .wprss-form-table td input[type="checkbox"] + label {
102
- display: inline !important;
103
- }
104
-
105
- .wprss-form-table td input {
106
- line-height: normal;
107
- }
108
- }
109
-
110
-
111
-
112
- body.post-type-wprss_feed_item .add-new-h2,
113
- body.post-type-wprss_feed_item .tablenav select[name="m"],
114
- body.post-type-wprss_feed_item #post-query-submit
115
- { display: none; }
116
-
117
- body.post-type-wprss_feed_item a.row-title {
118
- cursor: default;
119
- font-weight: normal;
120
- color: #555;
121
- }
122
-
123
- #latest-news-cpac-settings li {
124
- list-style: none;
125
- line-height: 16px;
126
- }
127
-
128
- li.twitter a {
129
- background: transparent url('../images/twitter.png') no-repeat 0;
130
- padding-left: 20px;
131
- }
132
-
133
- li.facebook a {
134
- background: transparent url('../images/facebook.png') no-repeat 0;
135
- padding-left: 20px;
136
- }
137
-
138
- li.donate_link a:hover {
139
- color: darkGreen;
140
- }
141
-
142
- #preview_meta_box ul {
143
- list-style: disc;
144
- margin-left: 16px;
145
- }
146
-
147
- #preview_meta_box .invalid-feed-url {
148
- color: red;
149
- }
150
-
151
- #preview_meta_box .rss-date {
152
- color: #666;
153
-
154
- }
155
-
156
- /*.rss-aggregator_page_wprss-aggregator-settings .form-table th { width: 80px; }*/
157
-
158
-
159
- /* For excerpts and thumbnails admin screens
160
- .wprss_feed_page_wprss-aggregator-settings input,
161
- .wprss_feed_page_wprss-aggregator-settings input[type="checkbox"],
162
- .wprss_feed_page_wprss-aggregator-settings input[type="radio"] {
163
- margin-right: 8px;
164
- }
165
- */
166
-
167
- input#default-thumbnail,
168
- input#wprss-et-license-key,
169
- input#wprss-c-license-key,
170
- input#wprss-kf-license-key,
171
- input#wprss-ftp-license-key {
172
- width: 300px;
173
- }
174
-
175
- input#thumbnails-height,
176
- input#thumbnails-width {
177
- /*width: 29px;*/
178
- }
179
-
180
-
181
- /* Red Button */
182
-
183
- .wp-core-ui .button-red {
184
- background: #BD2B2B;
185
- border-color: transparent;
186
- color: #fff;
187
- text-decoration: none;
188
- text-shadow: none;
189
- }
190
-
191
- .wp-core-ui .button-red.hover,
192
- .wp-core-ui .button-red:hover {
193
- color: #fff;
194
- border-color: transparent;
195
- background-color: #AC0F0F;
196
- }
197
-
198
- .wp-core-ui .button-red.focus,
199
- .wp-core-ui .button-red:focus {
200
- color: #fff;
201
- background-color: #AC0F0F;
202
- border-color: transparent;
203
- box-shadow: 0 0 0 1px #fff,0 0 0 3px #AC0F0F;
204
- }
205
-
206
- .wp-core-ui .button-red.active,
207
- .wp-core-ui .button-red:active {
208
- color: #fff;
209
- background-color: #A20909;
210
- border-color: transparent;
211
- }
212
-
213
- .wp-core-ui .button-red[disabled],
214
- .wp-core-ui .button-red:disabled,
215
- .wp-core-ui .button-red-disabled {
216
- color: #fba6a8 !important;
217
- background: #DD383A !important;
218
- box-shadow: 0 0 0 transparent !important;
219
- border-color: transparent !important;
220
- text-shadow: 0 0 0 transparent !important;
221
- }
222
-
223
- #wpra-system-info-textarea,
224
- #wprss-error-log-textarea {
225
- width: 800px;
226
- height: 400px;
227
- font-family: Menlo, Monaco, monospace;
228
- white-space: pre;
229
- overflow: auto;
230
- display: block;
231
- }
232
-
233
- #wpra-system-info-textarea {
234
- display: block;
235
- width: 100%;
236
- height: 600px;
237
- font-family: Menlo, Monaco, monospace;
238
- white-space: pre;
239
- overflow: auto;
240
- }
241
-
242
- .wprss-error-log-action {
243
- display: inline-block;
244
- }
245
-
246
- #wprss-clear-error-log-form {
247
- display: inline-block;
248
- }
249
- #wprss-clear-error-log-form,
250
- #wprss-clear-error-log-form > button {
251
- vertical-align: baseline;
252
- }
253
-
254
- form.wprss-error-log-action input[type="submit"]:active {
255
- vertical-align: baseline;
256
- }
257
- /* The debug log root element */
258
- div.wpra-log {
259
- display: block;
260
- position: relative;
261
- width: 100%;
262
- }
263
-
264
- /* The "Filters" label */
265
- div.wpra-log > p > strong:first-child {
266
- text-decoration: underline;
267
- margin-right: 10px;
268
- }
269
-
270
- /* The debug log filters separator */
271
- div.wpra-log .wpra-toggle-logs:not(:last-of-type)::after {
272
- content: ' | ';
273
- color: #3c3c3c;
274
- pointer-events: none;
275
- }
276
- /* The debug log filters */
277
- div.wpra-log .wpra-toggle-logs a {
278
- text-decoration: none;
279
- outline: none;
280
- box-shadow: 0 0 transparent;
281
- }
282
- /* The debug log filters when not selected */
283
- div.wpra-log .wpra-toggle-logs:not(.wpra-selected):not(.wpra-log-filter-disabled) a {
284
- color: #626262;
285
- }
286
- /* The debug log filters when selected */
287
- div.wpra-log .wpra-toggle-logs.wpra-selected:not(.wpra-log-filter-disabled) a {
288
- font-weight: bold;
289
- }
290
-
291
- /* The debug log "error" filter text color when there are errors */
292
- div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="error"]:not(.wpra-log-filter-disabled) a {
293
- color: #d40000;
294
- }
295
- /* The debug log "warning" filter text color when there are warnings */
296
- div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="warning"]:not(.wpra-log-filter-disabled) a {
297
- color: #d45500;
298
- }
299
- /* The debug log "notice" filter text color when there are notices */
300
- div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="notice"]:not(.wpra-log-filter-disabled) a {
301
- color: #d48a00;
302
- }
303
- /* The debug log "info" filter text color when there are info logs */
304
- div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="info"]:not(.wpra-log-filter-disabled) a {
305
- color: #009cd6;
306
- }
307
- /* The debug log "debug" filter text color when there are debug logs */
308
- div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="debug"]:not(.wpra-log-filter-disabled) a {
309
- color: #8242d4;
310
- }
311
-
312
- /* Disabled debug log filters */
313
- div.wpra-log .wpra-toggle-logs.wpra-log-filter-disabled a {
314
- color: #8b8b8b !important;
315
- font-style: italic;
316
- text-decoration: none;
317
- cursor: not-allowed;
318
- }
319
-
320
- /* The debug log */
321
- div.wpra-log-container {
322
- width: 100%;
323
- max-height: 600px;
324
- border: 1px solid #d1d1d1;
325
- padding: 5px;
326
- margin-bottom: 15px;
327
- overflow: auto;
328
- background: #222833;
329
- }
330
-
331
- /* The debug log & empty log notice */
332
- div.wpra-log-container,
333
- .notice.wpra-empty-log-notice {
334
- display: block;
335
- box-sizing: border-box;
336
- }
337
- .notice.wpra-empty-log-notice {
338
- width: 400px;
339
- }
340
-
341
- /* The log table */
342
- div.wpra-log-container > table {
343
- font-family: monospace;
344
- min-width: 100%;
345
- border: 0;
346
- border-collapse: collapse;
347
- }
348
- /* Log table: row formatting */
349
- div.wpra-log-container > table > tbody > tr {
350
- }
351
- /* Log table: cell formatting */
352
- div.wpra-log-container > table > tbody > tr > td {
353
- color: #cbcdda;
354
- vertical-align: baseline;
355
- padding: 4px 10px;
356
- border-bottom: 2px solid #222833;
357
- }
358
-
359
- /* Log table: row on hover */
360
- div.wpra-log-container > table > tbody > tr:hover {
361
- background: rgba(200, 200, 200, 0.1);
362
- }
363
-
364
- /* Log table: date and level cells do not wrap */
365
- div.wpra-log-container > table > tbody > tr > td.wpra-log-date,
366
- div.wpra-log-container > table > tbody > tr > td.wpra-log-level {
367
- white-space: nowrap;
368
- overflow: hidden;
369
- }
370
- div.wpra-log-container > table > tbody > tr > td.wpra-log-date {
371
- width: 150px;
372
- }
373
- div.wpra-log-container > table > tbody > tr > td.wpra-log-level {
374
- text-align: center;
375
- width: 60px;
376
- }
377
- div.wpra-log-container > table > tbody > tr > td.wpra-log-feed {
378
- width: 150px;
379
- }
380
-
381
- /* Log table: styling for DEBUG log messages */
382
- div.wpra-log-container > table > tbody > tr.wpra-log-debug > td:not(.wpra-log-date) {
383
- color: #b695e6;
384
- }
385
- /* Log table: styling for INFO log messages */
386
- div.wpra-log-container > table > tbody > tr.wpra-log-info > td:not(.wpra-log-date) {
387
- color: #38eaff;
388
- }
389
- /* Log table: styling for NOTICE log messages */
390
- div.wpra-log-container > table > tbody > tr.wpra-log-notice > td:not(.wpra-log-date) {
391
- color: #ffea00;
392
- }
393
- /* Log table: styling for WARNING log messages */
394
- div.wpra-log-container > table > tbody > tr.wpra-log-warning > td {
395
- color: #000;
396
- background-color: #ffea00;
397
- font-weight: bold;
398
- }
399
- /* Log table: styling for ERROR log messages */
400
- div.wpra-log-container > table > tbody > tr.wpra-log-error > td {
401
- color: white;
402
- background-color: #b90000;
403
- font-weight: bold;
404
- }
405
-
406
- @media screen and (min-width: 782px) {
407
- #custom_feed_title {
408
- width: 400px;
409
- }
410
- }
411
-
412
- /* Number Roller for Feed Source Limit */
413
- .wprss-number-roller {
414
- width: 80px;
415
- vertical-align: middle;
416
- }
417
- @media screen and (max-width: 782px) {
418
- .wprss-number-roller {
419
- width: 100px;
420
- }
421
- }
422
-
423
- /* Welcome Screen */
424
- .about-wrap ul {
425
- list-style: disc;
426
- padding-left: 30px;
427
- }
428
-
429
- /* Excerpts and Thumbnails */
430
-
431
- input#thumbnails-height,
432
- input#thumbnails-width {
433
- margin-right: 2px;
434
- }
435
-
436
- label[for=thumbnails-height],
437
- label[for=thumbnails-width] {
438
- margin-left: 8px;
439
- }
440
-
441
- .wp-list-table > thead > tr > th#thumbnail[scope="col"] {
442
- width: 95px;
443
- }
444
-
445
- select + label.description {
446
- margin-left: 8px;
447
- }
448
-
449
- input#title-limit {
450
- width: 100px;
451
- }
452
-
453
- .wprss-form-table th,
454
- .wprss-form-table tr,
455
- .wprss-form-table td {
456
- border: 0 transparent !important;
457
- }
458
-
459
- .wprss-indicator-green,
460
- .wprss-indicator-red,
461
- .wprss-indicator-grey {
462
- font-size: 1.6em;
463
- vertical-align: middle;
464
- margin-right: 10px;
465
- line-height: 30px;
466
- }
467
- .wprss-indicator-green {
468
- color: #009922;
469
- }
470
- .wprss-indicator-grey {
471
- color: #888;
472
- }
473
- .wprss-indicator-red {
474
- color: #EB442A;
475
- }
476
-
477
-
478
- .wprss-meta-slider {
479
- display: none;
480
- margin-top: 5px;
481
- }
482
-
483
- .wprss-slider-button {
484
- cursor: pointer;
485
- margin-right: 8px !important;
486
- }
487
-
488
- #wprss_activate_feed,
489
- #wprss_pause_feed {
490
- display: block;
491
- }
492
-
493
- .wprss-date-error {
494
- background: rgba( 245, 45, 45, 0.6 );
495
- }
496
-
497
- div.wprss-meta-side-setting {
498
- display: block;
499
- padding: 8px;
500
- border-bottom: 1px solid rgba(0,0,0,0.1);
501
- }
502
-
503
- div.wprss-meta-side-setting > p {
504
- margin: 2px 0;
505
- }
506
- div.wprss-meta-side-setting > p > label {
507
- vertical-align: baseline;
508
- }
509
- div.wprss-meta-side-setting a.wprss-slider-button {
510
- vertical-align: middle;
511
- }
512
-
513
- div.inside .wprss-meta-side-setting:last-child {
514
- border-bottom: 0 solid transparent;
515
- }
516
-
517
- input[type="checkbox"]#wprss-force-feed {
518
- margin-left: 10px;
519
- }
520
-
521
- /******************************
522
- * FEED SOURCES PAGE COLUMNS
523
- */
524
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th {
525
- text-align: left;
526
- overflow: hidden;
527
- }
528
- /* CHECKBOX */
529
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead td#cb {
530
- width: 30px !important;
531
- }
532
- /* STATE */
533
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#state {
534
- width: 70px !important;
535
- }
536
- /* NAME */
537
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#title {
538
- width: auto;
539
- }
540
- /* NEXT UPDATE */
541
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#updates {
542
- width: 300px !important;
543
- }
544
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts td.column-updates p {
545
- margin-bottom: 0 !important;
546
- }
547
- /* FEED COUNT */
548
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#feed-count {
549
- width: 200px !important;
550
- }
551
- /* CATEGORIES */
552
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#category,
553
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#category {
554
- width: 130px !important;
555
- }
556
-
557
- /* FEED ITEM IMAGE */
558
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#image {
559
- width: 120px;
560
- }
561
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody img.wpra-item-ft-image {
562
- width: 100px;
563
- }
564
-
565
- @media screen and (max-width: 660px) {
566
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#id,
567
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts tfoot th.column-id,
568
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts tbody td.column-id,
569
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#state,
570
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts tfoot th.column-state,
571
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts tbody td.column-state {
572
- display: none;
573
- }
574
- }
575
- @media only screen and (max-width: 782px) {
576
- /* WIDEN CHECKBOX COLUMN */
577
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead td#cb {
578
- width: 50px !important;
579
- }
580
-
581
- /* HIDE STATE COLUMN */
582
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#state,
583
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts tfoot th.column-state,
584
- body.post-type-wprss_feed.edit-php table.wp-list-table.posts tbody td.column-state {
585
- display: none;
586
- padding: 8px 10px;
587
- }
588
-
589
- /* HIDE ITEM IMAGE COLUMN */
590
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#image,
591
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tfoot th.column-image,
592
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody td.column-image {
593
- display: none;
594
- }
595
-
596
- /* IMAGE IS LARGER IN RESPONSIVE MOBILE VIEW */
597
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody img.wpra-item-ft-image {
598
- width: 350px;
599
- }
600
-
601
- /* HIDE INLINE IMAGE COLUMN NAME IN RESPONSIVE MOBILE VIEW */
602
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody td.column-image::before {
603
- display: none;
604
- }
605
- }
606
-
607
- @media only screen and (max-width: 1200px) {
608
- /* HIDE ITEM PERMALINK COLUMN */
609
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#permalink,
610
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tfoot th.column-permalink,
611
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody td.column-permalink {
612
- display: none;
613
- }
614
- }
615
-
616
- /* For feed items */
617
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#publishdate {
618
- width: 150px;
619
- }
620
- body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#source {
621
- width: 200px;
622
- }
623
-
624
-
625
-
626
- i.wprss-feed-error-symbol {
627
- display: none;
628
- font-size: 1.2em;
629
- vertical-align: middle;
630
- color: rgb(200,0,0);
631
- margin-left: 8px;
632
- }
633
-
634
- i.wprss-updating-feed-icon {
635
- margin-left: 8px;
636
- display: none;
637
- }
638
-
639
- i.wprss-feed-error-symbol.wprss-show,
640
- i.wprss-updating-feed-icon.wprss-show {
641
- display: inline-block;
642
- }
643
-
644
- /* Log textarea styles */
645
- #wprss-log-textarea {
646
- width: 800px;
647
- height: 400px;
648
- font-family: Menlo, Monaco, monospace;
649
- background: none;
650
- white-space: pre-wrap;
651
- overflow: auto;
652
- display: block;
653
- background: rgb( 255, 245, 245 );
654
- }
655
-
656
-
657
-
658
- /*--------------------------------------------------------------------------
659
- *
660
- * Add-Ons
661
- *
662
- *-------------------------------------------------------------------------*/
663
-
664
- #add-ons {
665
- margin-bottom: 20px;
666
- }
667
-
668
- #add-ons .add-on-group {
669
- margin-top: 20px;
670
- padding-top: 20px;
671
- border-top: #F5F5F5 solid 1px;
672
- }
673
-
674
- #add-ons .add-on-group:first-child {
675
- margin-top: 0;
676
- padding-top: 0;
677
- border-top: 0 none;
678
- }
679
-
680
- #add-ons .add-on {
681
- float: left;
682
- width: 220px;
683
- margin: 10px 20px 10px 0;
684
- background: #FFFFFF;
685
- border: 1px solid #E5E5E5;
686
- position: relative;
687
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
688
- min-height: 320px;
689
- }
690
-
691
- #add-ons .add-on h3 {
692
- margin-top: 0.5em;
693
- }
694
-
695
- #add-ons .add-on h3 a {
696
- color: inherit;
697
- text-decoration: none;
698
- }
699
-
700
- #add-ons .add-on .inner {
701
- min-height: 170px;
702
- padding: 15px;
703
- }
704
-
705
- #add-ons .add-on .footer {
706
- background: #F5F5F5;
707
- border-top: 1px solid #E1E1E1;
708
- overflow: hidden;
709
- position: absolute;
710
- width: 100%;
711
- bottom: 0;
712
- padding-top: 15px;
713
- height: 45px;
714
- }
715
-
716
- #add-ons .add-on .footer .button {
717
- float: left;
718
- margin-left: 15px;
719
- }
720
-
721
- #add-ons .add-on-active .button-disabled:focus,
722
- #add-ons .add-on-active .button-disabled:active {
723
- background: #fafafa;
724
- }
725
-
726
- #add-ons .add-on-title {
727
- float: left;
728
- width: 100%;
729
- margin: 25px 0 25px;
730
- border-top: #F5F5F5 solid 1px;
731
- }
732
-
733
-
734
- /*== BLACKLIST */
735
- body.post-type-wprss_blacklist .add-new-h2,
736
- body.post-type-wprss_blacklist ul.subsubsub,
737
- body.post-type-wprss_blacklist .alignleft.actions {
738
- display: none;
739
- }
740
-
741
- body.post-type-wprss_blacklist .alignleft.actions.bulkactions {
742
- display: inline-block;
743
- }
744
-
745
- .wprss-header-small {
746
- color: #777;
747
- font-size: 0.7em;
748
- }
749
-
750
- /* Inline Help ============================================================== */
751
-
752
- .wprss-tooltip-handle,
753
- .wprss-tooltip-handle:hover,
754
- .wprss-tooltip-handle:focus {
755
- text-decoration: none;
756
- color: #aaaaaa;
757
- outline: none;
758
- }
759
-
760
- .wprss-tooltip-handle {
761
- margin-left: 5px;
762
- font-size: 15px;
763
- color: rgb(190, 190, 190);
764
- vertical-align: middle;
765
- }
766
-
767
- .wprss-tooltip-handle-side {
768
- float: right;
769
- }
770
-
771
- .wprss-tooltip-content {
772
- display: none;
773
- }
774
-
775
- .wprss-ui-tooltip {
776
- color: #444 !important;
777
- padding: 8px 10px !important;
778
- background: #fefefe !important;
779
- border: 1px solid #ccc !important;
780
- border-radius: 1px !important;
781
- font-family: "Open Sans", sans-serif !important;
782
- box-shadow: 0 0 5px rgba(0, 0, 0, 0.17) !important;
783
- }
784
- .wprss-ui-tooltip p:first-child {
785
- margin-top: 0;
786
- }
787
- .wprss-ui-tooltip p:last-child {
788
- margin-bottom: 0;
789
- }
790
- .wprss-ui-tooltip p {
791
- margin: 8px 0;
792
- }
793
- .wprss-ui-tooltip p, code {
794
- font-size: 0.9em !important;
795
- }
796
- .wprss-ui-tooltip hr {
797
- margin: 0;
798
- }
799
-
800
- .wprss-section-tooltip-handle,
801
- .wprss-section-tooltip-handle:hover,
802
- .wprss-section-tooltip-handle:active,
803
- .wprss-section-tooltip-handle:visited,
804
- .wprss-section-tooltip-handle:link,
805
- .wprss-section-tooltip-handle:focus {
806
- color: #006799;
807
- margin-left: 5px;
808
- text-decoration: none;
809
- outline: none;
810
- cursor: help;
811
- font-size: 15px;
812
- }
813
-
814
- /* For non settings page screens */
815
- @media only screen and (max-width: 850px) {
816
-
817
- body:not(.wprss_feed_page_wprss-aggregator-settings)
818
- .wprss-tooltip-handle {
819
- color: #999;
820
- font-size: 1em;
821
- padding: 6px 10px;
822
- margin-left: 0;
823
- background: #e5e5e5;
824
- border-radius: 3px;
825
- vertical-align: middle;
826
- }
827
-
828
- body:not(.wprss_feed_page_wprss-aggregator-settings)
829
- select + .wprss-tooltip-handle,
830
- body:not(.wprss_feed_page_wprss-aggregator-settings)
831
- input[type="input"] + .wprss-tooltip-handle,
832
- body:not(.wprss_feed_page_wprss-aggregator-settings)
833
- input[type="password"] + .wprss-tooltip-handle {
834
- margin-top: 5px;
835
- }
836
-
837
- body:not(.wprss_feed_page_wprss-aggregator-settings)
838
- .wprss-tooltip-handle:after {
839
- content: 'Help';
840
- margin-left: 5px;
841
- font-family: 'Open Sans', sans-serif;
842
- }
843
-
844
- }
845
-
846
-
847
- /* For settings page screens */
848
- @media only screen and (max-width: 782px) {
849
-
850
- body.wprss_feed_page_wprss-aggregator-settings
851
- .wprss-tooltip-handle {
852
- color: #999;
853
- font-size: 1em;
854
- padding: 6px 10px;
855
- margin-left: 0;
856
- background: #e5e5e5;
857
- border-radius: 3px;
858
- vertical-align: middle;
859
- }
860
-
861
- body.wprss_feed_page_wprss-aggregator-settings
862
- select + .wprss-tooltip-handle,
863
- body.wprss_feed_page_wprss-aggregator-settings
864
- input[type="input"] + .wprss-tooltip-handle,
865
- body.wprss_feed_page_wprss-aggregator-settings
866
- input[type="password"] + .wprss-tooltip-handle {
867
- margin-top: 5px;
868
- }
869
-
870
- body.wprss_feed_page_wprss-aggregator-settings
871
- .wprss-tooltip-handle:after {
872
- content: 'Help';
873
- margin-left: 5px;
874
- font-family: 'Open Sans', sans-serif;
875
- }
876
-
877
- }
878
-
879
-
880
- @media only screen and (max-width: 1026px) {
881
- .wprss-tr-hr th {
882
- padding-top: 10px;
883
- }
884
- }
885
-
886
- .ajax-error,
887
- .ajax-error:hover,
888
- .ajax-error:visited,
889
- .ajax-error:link,
890
- .ajax-error:active {
891
- color: #a00;
892
- }
893
-
894
- /* Removes the "Add New" button for Feed Items */
895
- .post-type-wprss_feed_item .page-title-action {
896
- display: none
897
- }
898
-
899
- /* Changelog styles */
900
- .wpra-changelog-container h2 {
901
- font-size: 1.4em;
902
- }
903
- .wpra-changelog-container h3 {
904
- font-weight: normal;
905
- font-size: 1.2em;
906
- }
907
- .wpra-changelog-container ul {
908
- list-style: disc;
909
- list-style-position: inside;
910
- }
911
-
912
- .wpra_ft_image_option {
913
- margin-top: 10px;
914
- }
915
-
916
- #wpra_image_min_size_row {
917
- display: none;
918
- }
919
-
920
- /* Spacing between image width and height fields */
921
- #wpra_image_min_size_row > td > label {
922
- margin-right: 10px;
923
- }
924
-
925
- #wprss-feed-def-ft-image-preview {
926
- width: 220px;
927
- }
928
-
929
- #wprss-feed-def-ft-image-preview-hint {
930
- margin-bottom: 8px;
931
- }
932
-
933
-
934
- /*
935
- * The Feed Source List Table styles that mimic the plugins table
936
- */
937
-
938
- .post-type-wprss_feed table.wp-list-table.posts tbody tr th,
939
- .post-type-wprss_feed table.wp-list-table.posts tbody tr td
940
- {
941
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1);
942
- }
943
-
944
- /* Feed updating/deleting animation in feed sources table */
945
- .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-updating,
946
- .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-deleting {
947
- /*background-image: linear-gradient(-45deg, rgba(30, 30, 30, 0.05) 25%, transparent 0, transparent 50%, rgba(50, 50, 50, 0.05) 50%, rgba(30, 30, 30, 0.05) 75%, transparent 0, #0000);*/
948
- /*background-image: linear-gradient(*/
949
- /* -45deg, rgba(0, 0, 0, 0.9) 25%,*/
950
- /* transparent 0,*/
951
- /* transparent 50%,*/
952
- /* rgba(0, 0, 0, 0.9) 50%,*/
953
- /* rgba(0, 0, 0, 0.9) 75%,*/
954
- /* transparent 0, #0000*/
955
- /*);*/
956
- background-size: 80px 80px;
957
- background-blend-mode: overlay;
958
- }
959
-
960
- .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-updating > *,
961
- .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-deleting > * {
962
- background: transparent !important;
963
- }
964
-
965
- .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-updating {
966
- animation: wpra-feed-updating-animation 1.3s linear infinite;
967
- background-color: #e9f9ee;
968
- }
969
- .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-deleting {
970
- animation: wpra-feed-updating-animation 1s linear infinite;
971
- background-color: #f8eaea;
972
- }
973
-
974
- @keyframes wpra-feed-updating-animation {
975
- 0% {
976
- background-position: 0 0;
977
- }
978
- 50% {
979
- background-position: 80px 80px;
980
- }
981
- 100% {
982
- background-position: 160px 160px;
983
- }
984
- }
985
-
986
- /*
987
- * Styles for the Feed Source List Table "State" column
988
- */
989
- div.wprss-feed-state-container,
990
- div.wprss-feed-source-type
991
- {
992
- display: inline-block;
993
- }
994
-
995
- /* the feed type icon */
996
- div.wprss-feed-source-type {
997
- float: right;
998
- }
999
- /* inactive color */
1000
- .post-type-wprss_feed table.wp-list-table tr div.wprss-feed-source-type {
1001
- color: #aaa;
1002
- }
1003
- /* active color */
1004
- .post-type-wprss_feed table.wp-list-table tr.active div.wprss-feed-source-type {
1005
- color: #ff792b;
1006
- }
1007
- /* youtube color */
1008
- .post-type-wprss_feed table.wp-list-table tr.active div.wprss-feed-source-type.wprss-feed-source-type-yt {
1009
- color: #ff0000;
1010
- }
1011
-
1012
- .post-type-wprss_feed table.wp-list-table tbody td.column-state {
1013
- padding-right: 0;
1014
- }
1015
-
1016
- .column-updates > p {
1017
- margin: 0 !important;
1018
- }
1019
- .post-type-wprss_feed table.wp-list-table.posts tbody tr .next-update-container {
1020
- font-weight: bold;
1021
- }
1022
- .post-type-wprss_feed table.wp-list-table.posts tbody tr:not(.active) .next-update-container {
1023
- display: none;
1024
- }
1025
-
1026
- /* The last update time in the feed sources page table */
1027
- .post-type-wprss_feed table.wp-list-table.posts .last-update-num-items-container {
1028
- color: #666;
1029
- font-style: italic;
1030
- font-size: 90%;
1031
- }
1032
-
1033
- /* The imported items link in the feed sources page - disabled when 0 items */
1034
- .post-type-wprss_feed table.wp-list-table.posts .items-imported-link.has-imported-items {
1035
- font-weight: bold;
1036
- line-height: 20px;
1037
- }
1038
- .post-type-wprss_feed table.wp-list-table.posts .items-imported-link:not(.has-imported-items) {
1039
- color: #777;
1040
- pointer-events: none;
1041
- }
1042
-
1043
- /* The delete items row action in the feed sources page - hidden when 0 items */
1044
- .post-type-wprss_feed table.wp-list-table.posts .row-actions .purge-posts:not(.has-imported-items) {
1045
- display: none;
1046
- }
1047
-
1048
- /* Styles for the disabled "Fetch" and "Delete" feed source row actions */
1049
- .post-type-wprss_feed table.wp-list-table.posts .row-actions a.wprss_fetch_items_ajax_action[disabled] {
1050
- color: #555;
1051
- }
1052
- .post-type-wprss_feed table.wp-list-table.posts .row-actions a.wprss_delete_items_ajax_action[disabled] {
1053
- color: #666;
1054
- }
1055
-
1056
- /* The feed updating/deleting spinner icon */
1057
- .post-type-wprss_feed table.wp-list-table.posts .column-feed-count .spinner {
1058
- float: none;
1059
- vertical-align: bottom;
1060
- }
1061
- .post-type-wprss_feed table.wp-list-table.posts tr.wpra-feed-is-updating .column-feed-count .spinner,
1062
- .post-type-wprss_feed table.wp-list-table.posts tr.wpra-feed-is-deleting .column-feed-count .spinner {
1063
- visibility: visible;
1064
- }
1065
-
1066
- /*
1067
- * TOGGLE SWITCH
1068
- */
1069
- .wprss-switch {
1070
- position: relative;
1071
- display: inline-block;
1072
- width: 34px;
1073
- height: 18px;
1074
- }
1075
- .wprss-switch input {
1076
- opacity: 0;
1077
- width: 0;
1078
- height: 0;
1079
- }
1080
- .wprss-switch-slider {
1081
- position: absolute;
1082
- cursor: pointer;
1083
- top: 0;
1084
- left: 0;
1085
- right: 0;
1086
- bottom: 0;
1087
- border-radius: 34px;
1088
- background-color: #ccc;
1089
- transition: .2s;
1090
- -webkit-transition: .2s;
1091
- }
1092
- .wprss-switch-slider:before {
1093
- position: absolute;
1094
- content: "";
1095
- width: 12px;
1096
- height: 12px;
1097
- left: 4px;
1098
- bottom: 3px;
1099
- border-radius: 50%;
1100
- background-color: white;
1101
- transition: .2s;
1102
- -webkit-transition: .2s;
1103
- }
1104
- input:checked + .wprss-switch-slider {
1105
- background-color: #0baa3c;
1106
- }
1107
- input:focus + .wprss-switch-slider {
1108
- box-shadow: 0 0 1px #2196F3;
1109
- }
1110
- input:checked + .wprss-switch-slider:before {
1111
- -webkit-transform: translateX(14px);
1112
- -ms-transform: translateX(14px);
1113
- transform: translateX(14px);
1114
- }
1115
-
1116
- .postbox .inside .wpra-feed-save-meta-box {
1117
- border-bottom: 1px solid #ccc;
1118
- padding: 10px;
1119
- margin: 0 -10px;
1120
- margin-top: -11px;
1121
- margin-bottom: 10px;
1122
- background: #fff;
1123
- }
1124
-
1125
- .postbox .inside .wpra-feed-save-meta-box label span {
1126
- font-weight: bold;
1127
- font-size: 14px;
1128
- }
1129
-
1130
- .postbox .inside .wpra-feed-save-meta-box input[type="text"] {
1131
- text-align: left !important;
1132
- }
1133
-
1134
- /* -- INLINE STYLES -- */
1135
-
1136
- form.wpra-inline-form {
1137
- display: inline-block;
1138
- }
1139
-
1140
- form.wpra-header-form {
1141
- display: inline-block;
1142
- margin: 0;
1143
- padding: 0;
1144
- border: 0;
1145
- }
1146
-
1147
- h1.wpra-inline-header,
1148
- h2.wpra-inline-header,
1149
- h3.wpra-inline-header,
1150
- h4.wpra-inline-header
1151
- {
1152
- display: inline-block;
1153
- margin-right: 5px;
1154
- }
1155
-
1156
- button.button.wpra-header-button {
1157
- position: relative;
1158
- vertical-align: baseline;
1159
- top: -1px;
1160
- }
1161
-
1162
- /* -- SLIDE BOX -- */
1163
-
1164
- div.wpra-slide-box {
1165
- display: none;
1166
- margin: 10px 0;
1167
- padding: 15px;
1168
- background: #fff;
1169
- border: 1px solid #ccc;
1170
- border-radius: 2px;
1171
- }
1172
-
1173
- div.wpra-slide-box.wpra-slide-box-open {
1174
- display: block;
1175
- }
1176
-
1177
- div.wpra-slide-box form {
1178
- display: block;
1179
- }
1180
-
1181
- div.wpra-slide-box h4 {
1182
- font-size: 16px;
1183
- margin: 0;
1184
- margin-bottom: 15px;
1185
- padding-bottom: 5px;
1186
- border-bottom: 1px solid #ddd;
1187
- }
1188
-
1189
- div.wpra-slide-box form label {
1190
- display: flex;
1191
- flex-direction: row;
1192
- align-items: center;
1193
- line-height: 1;
1194
- font-size: 1em;
1195
- margin: 5px 0;
1196
- }
1197
-
1198
- div.wpra-slide-box label > * {
1199
- flex-grow: 1;
1200
- }
1201
-
1202
- div.wpra-slide-box label > span {
1203
- display: inline-block;
1204
- flex-grow: 0;
1205
- width: 200px;
1206
- font-size: 1em;
1207
- }
1208
- div.wpra-slide-box label input[type="text"],
1209
- div.wpra-slide-box label input[type="number"],
1210
- div.wpra-slide-box label input[type="text"]
1211
- {
1212
- height: 28px;
1213
- min-height: 28px;
1214
- }
1215
-
1216
- div.wpra-slide-box div.wpra-submit-wrap {
1217
- margin-top: 10px;
1218
- }
1219
- div.wpra-slide-box div.wpra-submit-wrap.right {
1220
- text-align: right;
1221
- }
1222
-
1223
- div.wpra-slide-box div.wpra-submit-wrap > button {
1224
- text-align: center;
1225
- }
1226
-
1227
- /* -- ERROR LOG OPTIONS (SLIDE BOX) -- */
1228
-
1229
- #wprss-log-options-form input[name="logging_limit_days"] {
1230
- width: 80px;
1231
- }
1232
-
1233
- /* -- BLACKLIST TOOL -- */
1234
-
1235
- #wpra-add-blacklist-container form label span:first-child {
1236
- width: 120px;
1237
- }
1238
-
1239
- /* -- LOG TOOL -- */
1240
-
1241
- #wprss-error-log-options {
1242
- margin: 15px 0;
1243
- }
1244
-
1245
- #wprss-clear-error-log-form {
1246
- float: right;
1247
- position: relative;
1248
- top: -3px;
1249
- }
1250
-
1251
- .wpra-log-filters {
1252
- padding: 2px 0;
1253
- margin: 0;
1254
- }
1255
- p.wpra-logs-shown-msg {
1256
- margin: 5px 0;
1257
- }
1258
-
1259
- /* -- MISC -- */
1260
- .wpra-no-margin {
1261
- margin: 0;
1262
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ body.post-type-wprss_feed q {
2
+ font-style: italic;
3
+ }
4
+ body.post-type-wprss_feed q:before {
5
+ content: '"';
6
+ }
7
+ body.post-type-wprss_feed q:after {
8
+ content: '"';
9
+ }
10
+
11
+ span.wp-rss-footer-text {
12
+ font-style: italic;
13
+ }
14
+
15
+ .wprss-input {
16
+ background: none repeat scroll 0 0 #EAF2FA;
17
+ margin-bottom: 20px;
18
+ padding-bottom: 10px;
19
+ padding-left: 10px;
20
+ padding-top: 10px;
21
+ width: 600px;
22
+ }
23
+
24
+ .wprss-input p { line-height: 28px; }
25
+
26
+ .wprss-input label {
27
+ float: left;
28
+ width: 95px !important;
29
+ }
30
+
31
+ .wprss-input input {
32
+ height: 28px;
33
+ margin-bottom: 0;
34
+ padding: 0 0 0 5px;
35
+ width: 400px;
36
+ }
37
+
38
+ .wprss-text-input {
39
+ display: inline-block;
40
+ width: 400px;
41
+ max-width: 100%;
42
+ }
43
+
44
+ label.description {
45
+ font-size: 13px;
46
+ font-style: italic;
47
+ }
48
+
49
+ span.wprss-row-id {
50
+ color: #8f8f8f;
51
+ }
52
+
53
+ #icon-wprss-aggregator {
54
+ background: transparent url( '../images/icon-adminpage32.png' ) no-repeat !important;
55
+ }
56
+
57
+ body.post-type-wprss_feed #titlediv div.inside { display: none !important; }
58
+
59
+ #misc-publishing-actions,
60
+ #minor-publishing-actions { display: none; }
61
+
62
+ div#force-feed-container {
63
+ border-top: 1px solid #ddd;
64
+ }
65
+
66
+
67
+ /* FORM TABLES */
68
+ .wprss-form-table th {
69
+ width: 160px;
70
+ max-width: 200px;
71
+ padding: 10px;
72
+ }
73
+ .wprss-form-table th label {
74
+ padding-top: 7px;
75
+ }
76
+ .wprss-form-table td {
77
+ padding: 8px 10px;
78
+ }
79
+ .wprss-form-table td label {
80
+ line-height: 15px;
81
+ }
82
+ @media screen and (max-width: 1025px) {
83
+ .wprss-form-table th {
84
+ display: block;
85
+ padding: 0;
86
+ }
87
+ .wprss-form-table td {
88
+ display: block;
89
+ padding-left: 0;
90
+ padding-right: 0;
91
+ }
92
+
93
+ .wprss-form-table td input[type="text"],
94
+ .wprss-form-table td input[type="url"],
95
+ .wprss-form-table td select {
96
+ display: block;
97
+ width: 100%;
98
+ }
99
+
100
+ .wprss-form-table td span.description {
101
+ display: inline;
102
+ }
103
+
104
+ .wprss-form-table td input[type="checkbox"] + label {
105
+ display: inline !important;
106
+ }
107
+
108
+ .wprss-form-table td input {
109
+ line-height: normal;
110
+ }
111
+ }
112
+
113
+
114
+
115
+ body.post-type-wprss_feed_item .add-new-h2,
116
+ body.post-type-wprss_feed_item .tablenav select[name="m"],
117
+ body.post-type-wprss_feed_item #post-query-submit
118
+ { display: none; }
119
+
120
+ body.post-type-wprss_feed_item a.row-title {
121
+ cursor: default;
122
+ font-weight: normal;
123
+ color: #555;
124
+ }
125
+
126
+ #latest-news-cpac-settings li {
127
+ list-style: none;
128
+ line-height: 16px;
129
+ }
130
+
131
+ li.twitter a {
132
+ background: transparent url('../images/twitter.png') no-repeat 0;
133
+ padding-left: 20px;
134
+ }
135
+
136
+ li.facebook a {
137
+ background: transparent url('../images/facebook.png') no-repeat 0;
138
+ padding-left: 20px;
139
+ }
140
+
141
+ li.donate_link a:hover {
142
+ color: darkGreen;
143
+ }
144
+
145
+ #preview_meta_box ul {
146
+ list-style: disc;
147
+ margin-left: 16px;
148
+ }
149
+
150
+ #preview_meta_box .invalid-feed-url {
151
+ color: red;
152
+ }
153
+
154
+ #preview_meta_box .rss-date {
155
+ color: #666;
156
+
157
+ }
158
+
159
+ /*.rss-aggregator_page_wprss-aggregator-settings .form-table th { width: 80px; }*/
160
+
161
+
162
+ /* For excerpts and thumbnails admin screens
163
+ .wprss_feed_page_wprss-aggregator-settings input,
164
+ .wprss_feed_page_wprss-aggregator-settings input[type="checkbox"],
165
+ .wprss_feed_page_wprss-aggregator-settings input[type="radio"] {
166
+ margin-right: 8px;
167
+ }
168
+ */
169
+
170
+ input#default-thumbnail,
171
+ input#wprss-et-license-key,
172
+ input#wprss-c-license-key,
173
+ input#wprss-kf-license-key,
174
+ input#wprss-ftp-license-key {
175
+ width: 300px;
176
+ }
177
+
178
+ input#thumbnails-height,
179
+ input#thumbnails-width {
180
+ /*width: 29px;*/
181
+ }
182
+
183
+
184
+ /* Red Button */
185
+
186
+ .wp-core-ui .button-red {
187
+ background: #BD2B2B;
188
+ border-color: transparent;
189
+ color: #fff;
190
+ text-decoration: none;
191
+ text-shadow: none;
192
+ }
193
+
194
+ .wp-core-ui .button-red.hover,
195
+ .wp-core-ui .button-red:hover {
196
+ color: #fff;
197
+ border-color: transparent;
198
+ background-color: #AC0F0F;
199
+ }
200
+
201
+ .wp-core-ui .button-red.focus,
202
+ .wp-core-ui .button-red:focus {
203
+ color: #fff;
204
+ background-color: #AC0F0F;
205
+ border-color: transparent;
206
+ box-shadow: 0 0 0 1px #fff,0 0 0 3px #AC0F0F;
207
+ }
208
+
209
+ .wp-core-ui .button-red.active,
210
+ .wp-core-ui .button-red:active {
211
+ color: #fff;
212
+ background-color: #A20909;
213
+ border-color: transparent;
214
+ }
215
+
216
+ .wp-core-ui .button-red[disabled],
217
+ .wp-core-ui .button-red:disabled,
218
+ .wp-core-ui .button-red-disabled {
219
+ color: #fba6a8 !important;
220
+ background: #DD383A !important;
221
+ box-shadow: 0 0 0 transparent !important;
222
+ border-color: transparent !important;
223
+ text-shadow: 0 0 0 transparent !important;
224
+ }
225
+
226
+ #wpra-system-info-textarea,
227
+ #wprss-error-log-textarea {
228
+ width: 800px;
229
+ height: 400px;
230
+ font-family: Menlo, Monaco, monospace;
231
+ white-space: pre;
232
+ overflow: auto;
233
+ display: block;
234
+ }
235
+
236
+ #wpra-system-info-textarea {
237
+ display: block;
238
+ width: 100%;
239
+ height: 600px;
240
+ font-family: Menlo, Monaco, monospace;
241
+ white-space: pre;
242
+ overflow: auto;
243
+ }
244
+
245
+ .wprss-error-log-action {
246
+ display: inline-block;
247
+ }
248
+
249
+ #wprss-clear-error-log-form {
250
+ display: inline-block;
251
+ }
252
+ #wprss-clear-error-log-form,
253
+ #wprss-clear-error-log-form > button {
254
+ vertical-align: baseline;
255
+ }
256
+
257
+ form.wprss-error-log-action input[type="submit"]:active {
258
+ vertical-align: baseline;
259
+ }
260
+ /* The debug log root element */
261
+ div.wpra-log {
262
+ display: block;
263
+ position: relative;
264
+ width: 100%;
265
+ }
266
+
267
+ /* The "Filters" label */
268
+ div.wpra-log > p > strong:first-child {
269
+ text-decoration: underline;
270
+ margin-right: 10px;
271
+ }
272
+
273
+ /* The debug log filters separator */
274
+ div.wpra-log .wpra-toggle-logs:not(:last-of-type)::after {
275
+ content: ' | ';
276
+ color: #3c3c3c;
277
+ pointer-events: none;
278
+ }
279
+ /* The debug log filters */
280
+ div.wpra-log .wpra-toggle-logs a {
281
+ text-decoration: none;
282
+ outline: none;
283
+ box-shadow: 0 0 transparent;
284
+ }
285
+ /* The debug log filters when not selected */
286
+ div.wpra-log .wpra-toggle-logs:not(.wpra-selected):not(.wpra-log-filter-disabled) a {
287
+ color: #626262;
288
+ }
289
+ /* The debug log filters when selected */
290
+ div.wpra-log .wpra-toggle-logs.wpra-selected:not(.wpra-log-filter-disabled) a {
291
+ font-weight: bold;
292
+ }
293
+
294
+ /* The debug log "error" filter text color when there are errors */
295
+ div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="error"]:not(.wpra-log-filter-disabled) a {
296
+ color: #d40000;
297
+ }
298
+ /* The debug log "warning" filter text color when there are warnings */
299
+ div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="warning"]:not(.wpra-log-filter-disabled) a {
300
+ color: #d45500;
301
+ }
302
+ /* The debug log "notice" filter text color when there are notices */
303
+ div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="notice"]:not(.wpra-log-filter-disabled) a {
304
+ color: #d48a00;
305
+ }
306
+ /* The debug log "info" filter text color when there are info logs */
307
+ div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="info"]:not(.wpra-log-filter-disabled) a {
308
+ color: #009cd6;
309
+ }
310
+ /* The debug log "debug" filter text color when there are debug logs */
311
+ div.wpra-log .wpra-toggle-logs.wpra-selected[data-level="debug"]:not(.wpra-log-filter-disabled) a {
312
+ color: #8242d4;
313
+ }
314
+
315
+ /* Disabled debug log filters */
316
+ div.wpra-log .wpra-toggle-logs.wpra-log-filter-disabled a {
317
+ color: #8b8b8b !important;
318
+ font-style: italic;
319
+ text-decoration: none;
320
+ cursor: not-allowed;
321
+ }
322
+
323
+ /* The debug log */
324
+ div.wpra-log-container {
325
+ width: 100%;
326
+ max-height: 600px;
327
+ border: 1px solid #d1d1d1;
328
+ padding: 5px;
329
+ margin-bottom: 15px;
330
+ overflow: auto;
331
+ background: #222833;
332
+ }
333
+
334
+ /* The debug log & empty log notice */
335
+ div.wpra-log-container,
336
+ .notice.wpra-empty-log-notice {
337
+ display: block;
338
+ box-sizing: border-box;
339
+ }
340
+ .notice.wpra-empty-log-notice {
341
+ width: 400px;
342
+ }
343
+
344
+ /* The log table */
345
+ div.wpra-log-container > table {
346
+ font-family: monospace;
347
+ min-width: 100%;
348
+ border: 0;
349
+ border-collapse: collapse;
350
+ }
351
+ /* Log table: row formatting */
352
+ div.wpra-log-container > table > tbody > tr {
353
+ }
354
+ /* Log table: cell formatting */
355
+ div.wpra-log-container > table > tbody > tr > td {
356
+ color: #cbcdda;
357
+ vertical-align: baseline;
358
+ padding: 4px 10px;
359
+ border-bottom: 2px solid #222833;
360
+ }
361
+
362
+ /* Log table: row on hover */
363
+ div.wpra-log-container > table > tbody > tr:hover {
364
+ background: rgba(200, 200, 200, 0.1);
365
+ }
366
+
367
+ /* Log table: date and level cells do not wrap */
368
+ div.wpra-log-container > table > tbody > tr > td.wpra-log-date,
369
+ div.wpra-log-container > table > tbody > tr > td.wpra-log-level {
370
+ white-space: nowrap;
371
+ overflow: hidden;
372
+ }
373
+ div.wpra-log-container > table > tbody > tr > td.wpra-log-date {
374
+ width: 150px;
375
+ }
376
+ div.wpra-log-container > table > tbody > tr > td.wpra-log-level {
377
+ text-align: center;
378
+ width: 60px;
379
+ }
380
+ div.wpra-log-container > table > tbody > tr > td.wpra-log-feed {
381
+ width: 150px;
382
+ }
383
+
384
+ /* Log table: styling for DEBUG log messages */
385
+ div.wpra-log-container > table > tbody > tr.wpra-log-debug > td:not(.wpra-log-date) {
386
+ color: #b695e6;
387
+ }
388
+ /* Log table: styling for INFO log messages */
389
+ div.wpra-log-container > table > tbody > tr.wpra-log-info > td:not(.wpra-log-date) {
390
+ color: #38eaff;
391
+ }
392
+ /* Log table: styling for NOTICE log messages */
393
+ div.wpra-log-container > table > tbody > tr.wpra-log-notice > td:not(.wpra-log-date) {
394
+ color: #ffea00;
395
+ }
396
+ /* Log table: styling for WARNING log messages */
397
+ div.wpra-log-container > table > tbody > tr.wpra-log-warning > td {
398
+ color: #000;
399
+ background-color: #ffea00;
400
+ font-weight: bold;
401
+ }
402
+ /* Log table: styling for ERROR log messages */
403
+ div.wpra-log-container > table > tbody > tr.wpra-log-error > td {
404
+ color: white;
405
+ background-color: #b90000;
406
+ font-weight: bold;
407
+ }
408
+
409
+ @media screen and (min-width: 782px) {
410
+ #custom_feed_title {
411
+ width: 400px;
412
+ }
413
+ }
414
+
415
+ /* Number Roller for Feed Source Limit */
416
+ .wprss-number-roller {
417
+ width: 80px;
418
+ vertical-align: middle;
419
+ }
420
+ @media screen and (max-width: 782px) {
421
+ .wprss-number-roller {
422
+ width: 100px;
423
+ }
424
+ }
425
+
426
+ /* Welcome Screen */
427
+ .about-wrap ul {
428
+ list-style: disc;
429
+ padding-left: 30px;
430
+ }
431
+
432
+ /* Excerpts and Thumbnails */
433
+
434
+ input#thumbnails-height,
435
+ input#thumbnails-width {
436
+ margin-right: 2px;
437
+ }
438
+
439
+ label[for=thumbnails-height],
440
+ label[for=thumbnails-width] {
441
+ margin-left: 8px;
442
+ }
443
+
444
+ .wp-list-table > thead > tr > th#thumbnail[scope="col"] {
445
+ width: 95px;
446
+ }
447
+
448
+ select + label.description {
449
+ margin-left: 8px;
450
+ }
451
+
452
+ input#title-limit {
453
+ width: 100px;
454
+ }
455
+
456
+ .wprss-form-table th,
457
+ .wprss-form-table tr,
458
+ .wprss-form-table td {
459
+ border: 0 transparent !important;
460
+ }
461
+
462
+ .wprss-indicator-green,
463
+ .wprss-indicator-red,
464
+ .wprss-indicator-grey {
465
+ font-size: 1.6em;
466
+ vertical-align: middle;
467
+ margin-right: 10px;
468
+ line-height: 30px;
469
+ }
470
+ .wprss-indicator-green {
471
+ color: #009922;
472
+ }
473
+ .wprss-indicator-grey {
474
+ color: #888;
475
+ }
476
+ .wprss-indicator-red {
477
+ color: #EB442A;
478
+ }
479
+
480
+
481
+ .wprss-meta-slider {
482
+ display: none;
483
+ margin-top: 5px;
484
+ }
485
+
486
+ .wprss-slider-button {
487
+ cursor: pointer;
488
+ margin-right: 8px !important;
489
+ }
490
+
491
+ #wprss_activate_feed,
492
+ #wprss_pause_feed {
493
+ display: block;
494
+ }
495
+
496
+ .wprss-date-error {
497
+ background: rgba( 245, 45, 45, 0.6 );
498
+ }
499
+
500
+ div.wprss-meta-side-setting {
501
+ display: block;
502
+ padding: 8px;
503
+ border-bottom: 1px solid rgba(0,0,0,0.1);
504
+ }
505
+
506
+ div.wprss-meta-side-setting > p {
507
+ margin: 2px 0;
508
+ }
509
+ div.wprss-meta-side-setting > p > label {
510
+ vertical-align: baseline;
511
+ }
512
+ div.wprss-meta-side-setting a.wprss-slider-button {
513
+ vertical-align: middle;
514
+ }
515
+
516
+ div.inside .wprss-meta-side-setting:last-child {
517
+ border-bottom: 0 solid transparent;
518
+ }
519
+
520
+ input[type="checkbox"]#wprss-force-feed {
521
+ margin-left: 10px;
522
+ }
523
+
524
+ /******************************
525
+ * FEED SOURCES PAGE COLUMNS
526
+ */
527
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th {
528
+ text-align: left;
529
+ overflow: hidden;
530
+ }
531
+ /* CHECKBOX */
532
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead td#cb {
533
+ width: 30px !important;
534
+ }
535
+ /* STATE */
536
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#state {
537
+ width: 70px !important;
538
+ }
539
+ /* NAME */
540
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#title {
541
+ width: auto;
542
+ }
543
+ /* NEXT UPDATE */
544
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#updates {
545
+ width: 300px !important;
546
+ }
547
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts td.column-updates p {
548
+ margin-bottom: 0 !important;
549
+ }
550
+ /* FEED COUNT */
551
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#feed-count {
552
+ width: 200px !important;
553
+ }
554
+ /* CATEGORIES */
555
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#category,
556
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#category {
557
+ width: 130px !important;
558
+ }
559
+
560
+ /* FEED ITEM IMAGE */
561
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#image {
562
+ width: 120px;
563
+ }
564
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody img.wpra-item-ft-image {
565
+ width: 100px;
566
+ }
567
+
568
+ @media screen and (max-width: 660px) {
569
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#id,
570
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts tfoot th.column-id,
571
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts tbody td.column-id,
572
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#state,
573
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts tfoot th.column-state,
574
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts tbody td.column-state {
575
+ display: none;
576
+ }
577
+ }
578
+ @media only screen and (max-width: 782px) {
579
+ /* WIDEN CHECKBOX COLUMN */
580
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead td#cb {
581
+ width: 50px !important;
582
+ }
583
+
584
+ /* HIDE STATE COLUMN */
585
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts thead th#state,
586
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts tfoot th.column-state,
587
+ body.post-type-wprss_feed.edit-php table.wp-list-table.posts tbody td.column-state {
588
+ display: none;
589
+ padding: 8px 10px;
590
+ }
591
+
592
+ /* HIDE ITEM IMAGE COLUMN */
593
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#image,
594
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tfoot th.column-image,
595
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody td.column-image {
596
+ display: none;
597
+ }
598
+
599
+ /* IMAGE IS LARGER IN RESPONSIVE MOBILE VIEW */
600
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody img.wpra-item-ft-image {
601
+ width: 350px;
602
+ }
603
+
604
+ /* HIDE INLINE IMAGE COLUMN NAME IN RESPONSIVE MOBILE VIEW */
605
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody td.column-image::before {
606
+ display: none;
607
+ }
608
+ }
609
+
610
+ @media only screen and (max-width: 1200px) {
611
+ /* HIDE ITEM PERMALINK COLUMN */
612
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#permalink,
613
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tfoot th.column-permalink,
614
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts tbody td.column-permalink {
615
+ display: none;
616
+ }
617
+ }
618
+
619
+ /* For feed items */
620
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#publishdate {
621
+ width: 150px;
622
+ }
623
+ body.post-type-wprss_feed_item.edit-php table.wp-list-table.posts thead th#source {
624
+ width: 200px;
625
+ }
626
+
627
+
628
+
629
+ i.wprss-feed-error-symbol {
630
+ display: none;
631
+ font-size: 1.2em;
632
+ vertical-align: middle;
633
+ color: rgb(200,0,0);
634
+ margin-left: 8px;
635
+ }
636
+
637
+ i.wprss-updating-feed-icon {
638
+ margin-left: 8px;
639
+ display: none;
640
+ }
641
+
642
+ i.wprss-feed-error-symbol.wprss-show,
643
+ i.wprss-updating-feed-icon.wprss-show {
644
+ display: inline-block;
645
+ }
646
+
647
+ /* Log textarea styles */
648
+ #wprss-log-textarea {
649
+ width: 800px;
650
+ height: 400px;
651
+ font-family: Menlo, Monaco, monospace;
652
+ background: none;
653
+ white-space: pre-wrap;
654
+ overflow: auto;
655
+ display: block;
656
+ background: rgb( 255, 245, 245 );
657
+ }
658
+
659
+
660
+
661
+ /*--------------------------------------------------------------------------
662
+ *
663
+ * Add-Ons
664
+ *
665
+ *-------------------------------------------------------------------------*/
666
+
667
+ #add-ons {
668
+ margin-bottom: 20px;
669
+ }
670
+
671
+ #add-ons .add-on-group {
672
+ display: flex;
673
+ flex-flow: row wrap;
674
+ justify-content: flex-start;
675
+ align-items: flex-start;
676
+ }
677
+
678
+ #add-ons .add-on-group:first-child {
679
+ margin-top: 0;
680
+ padding-top: 0;
681
+ }
682
+
683
+ #add-ons .add-on {
684
+ display: inline-block;
685
+ position: relative;
686
+ flex: 0 0 220px;
687
+ width: 220px;
688
+ margin: 10px 20px 10px 0;
689
+ background: #FFFFFF;
690
+ border: 1px solid #E5E5E5;
691
+ border-radius: 3px;
692
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
693
+ box-sizing: border-box;
694
+ min-height: 320px;
695
+ overflow: hidden;
696
+ }
697
+
698
+ #add-ons .add-on h3 {
699
+ margin: 0.5em 0 1.5em;
700
+ }
701
+
702
+ #add-ons .add-on h3 a {
703
+ color: inherit;
704
+ text-decoration: none;
705
+ }
706
+
707
+ #add-ons .add-on .inner {
708
+ min-height: 170px;
709
+ padding: 20px 15px;
710
+ }
711
+
712
+ #add-ons .add-on .footer {
713
+ overflow: hidden;
714
+ position: absolute;
715
+ width: 100%;
716
+ bottom: 0;
717
+ padding: 15px 0;
718
+ }
719
+
720
+ #add-ons .add-on .footer .button {
721
+ float: left;
722
+ margin-left: 15px;
723
+ }
724
+
725
+ .add-on .corner-ribbon {
726
+ position: absolute;
727
+ top: 18px;
728
+ right: -47px;
729
+ font-size: 12px;
730
+ width: 150px;
731
+ padding: 2px 0;
732
+ color: #fff;
733
+ background: #333;
734
+ text-align: center;
735
+ transform: rotate(45deg);
736
+ transform-origin: center center;
737
+ }
738
+
739
+ #add-ons .add-on.bundle-plan {
740
+ border: 2px solid #ff792b;
741
+ box-shadow: 0 0 25px -12px rgba(255, 121, 43, 0.6);
742
+ }
743
+
744
+ #add-ons .add-on.bundle-plan .corner-ribbon {
745
+ background: #ff792b;
746
+ }
747
+
748
+ #add-ons .add-on.spotlight .corner-ribbon {
749
+ background: #DD234B;
750
+ }
751
+
752
+ #add-ons .add-on.bundle-plan .footer,
753
+ #add-ons .add-on.spotlight .footer {
754
+ background: transparent;
755
+ border-top: 0;
756
+ }
757
+
758
+
759
+ #add-ons .add-on-active .button-disabled:focus,
760
+ #add-ons .add-on-active .button-disabled:active {
761
+ background: #fafafa;
762
+ }
763
+
764
+ #add-ons .add-on-title {
765
+ float: left;
766
+ width: 100%;
767
+ margin: 25px 0 25px;
768
+ border-top: #F5F5F5 solid 1px;
769
+ }
770
+
771
+ /*== BLACKLIST */
772
+ body.post-type-wprss_blacklist .add-new-h2,
773
+ body.post-type-wprss_blacklist ul.subsubsub,
774
+ body.post-type-wprss_blacklist .alignleft.actions {
775
+ display: none;
776
+ }
777
+
778
+ body.post-type-wprss_blacklist .alignleft.actions.bulkactions {
779
+ display: inline-block;
780
+ }
781
+
782
+ .wprss-header-small {
783
+ color: #777;
784
+ font-size: 0.7em;
785
+ }
786
+
787
+ /* Inline Help ============================================================== */
788
+
789
+ .wprss-tooltip-handle,
790
+ .wprss-tooltip-handle:hover,
791
+ .wprss-tooltip-handle:focus {
792
+ text-decoration: none;
793
+ color: #aaaaaa;
794
+ outline: none;
795
+ }
796
+
797
+ .wprss-tooltip-handle {
798
+ margin-left: 5px;
799
+ font-size: 15px;
800
+ color: rgb(190, 190, 190);
801
+ vertical-align: middle;
802
+ }
803
+
804
+ .wprss-tooltip-handle-side {
805
+ float: right;
806
+ }
807
+
808
+ .wprss-tooltip-content {
809
+ display: none;
810
+ }
811
+
812
+ .wprss-ui-tooltip {
813
+ color: #444 !important;
814
+ padding: 8px 10px !important;
815
+ background: #fefefe !important;
816
+ border: 1px solid #ccc !important;
817
+ border-radius: 1px !important;
818
+ font-family: "Open Sans", sans-serif !important;
819
+ box-shadow: 0 0 5px rgba(0, 0, 0, 0.17) !important;
820
+ }
821
+ .wprss-ui-tooltip p:first-child {
822
+ margin-top: 0;
823
+ }
824
+ .wprss-ui-tooltip p:last-child {
825
+ margin-bottom: 0;
826
+ }
827
+ .wprss-ui-tooltip p {
828
+ margin: 8px 0;
829
+ }
830
+ .wprss-ui-tooltip p, code {
831
+ font-size: 0.9em !important;
832
+ }
833
+ .wprss-ui-tooltip hr {
834
+ margin: 0;
835
+ }
836
+
837
+ .wprss-section-tooltip-handle,
838
+ .wprss-section-tooltip-handle:hover,
839
+ .wprss-section-tooltip-handle:active,
840
+ .wprss-section-tooltip-handle:visited,
841
+ .wprss-section-tooltip-handle:link,
842
+ .wprss-section-tooltip-handle:focus {
843
+ color: #006799;
844
+ margin-left: 5px;
845
+ text-decoration: none;
846
+ outline: none;
847
+ cursor: help;
848
+ font-size: 15px;
849
+ }
850
+
851
+ /* For non settings page screens */
852
+ @media only screen and (max-width: 850px) {
853
+
854
+ body:not(.wprss_feed_page_wprss-aggregator-settings) .wprss-tooltip-handle {
855
+ color: #999;
856
+ font-size: 1em;
857
+ padding: 6px 10px;
858
+ margin-left: 0;
859
+ background: #e5e5e5;
860
+ border-radius: 3px;
861
+ vertical-align: middle;
862
+ }
863
+
864
+ body:not(.wprss_feed_page_wprss-aggregator-settings) select + .wprss-tooltip-handle,
865
+ body:not(.wprss_feed_page_wprss-aggregator-settings) input[type="input"] + .wprss-tooltip-handle,
866
+ body:not(.wprss_feed_page_wprss-aggregator-settings) input[type="password"] + .wprss-tooltip-handle {
867
+ margin-top: 5px;
868
+ }
869
+
870
+ body:not(.wprss_feed_page_wprss-aggregator-settings) .wprss-tooltip-handle:after {
871
+ content: 'Help';
872
+ margin-left: 5px;
873
+ font-family: 'Open Sans', sans-serif;
874
+ }
875
+
876
+ }
877
+
878
+
879
+ /* For settings page screens */
880
+ @media only screen and (max-width: 782px) {
881
+
882
+ body.wprss_feed_page_wprss-aggregator-settings .wprss-tooltip-handle {
883
+ color: #999;
884
+ font-size: 1em;
885
+ padding: 6px 10px;
886
+ margin-left: 0;
887
+ background: #e5e5e5;
888
+ border-radius: 3px;
889
+ vertical-align: middle;
890
+ }
891
+
892
+ body.wprss_feed_page_wprss-aggregator-settings select + .wprss-tooltip-handle,
893
+ body.wprss_feed_page_wprss-aggregator-settings input[type="input"] + .wprss-tooltip-handle,
894
+ body.wprss_feed_page_wprss-aggregator-settings input[type="password"] + .wprss-tooltip-handle {
895
+ margin-top: 5px;
896
+ }
897
+
898
+ body.wprss_feed_page_wprss-aggregator-settings .wprss-tooltip-handle:after {
899
+ content: 'Help';
900
+ margin-left: 5px;
901
+ font-family: 'Open Sans', sans-serif;
902
+ }
903
+
904
+ }
905
+
906
+
907
+ @media only screen and (max-width: 1026px) {
908
+ .wprss-tr-hr th {
909
+ padding-top: 10px;
910
+ }
911
+ }
912
+
913
+ .ajax-error,
914
+ .ajax-error:hover,
915
+ .ajax-error:visited,
916
+ .ajax-error:link,
917
+ .ajax-error:active {
918
+ color: #a00;
919
+ }
920
+
921
+ /* Removes the "Add New" button for Feed Items */
922
+ .post-type-wprss_feed_item .page-title-action {
923
+ display: none
924
+ }
925
+
926
+ /* Changelog styles */
927
+ .wpra-changelog-container h2 {
928
+ font-size: 1.4em;
929
+ }
930
+ .wpra-changelog-container h3 {
931
+ font-weight: normal;
932
+ font-size: 1.2em;
933
+ }
934
+ .wpra-changelog-container ul {
935
+ list-style: disc;
936
+ list-style-position: inside;
937
+ }
938
+
939
+ .wpra_ft_image_option {
940
+ margin-top: 10px;
941
+ }
942
+
943
+ #wpra_image_min_size_row {
944
+ display: none;
945
+ }
946
+
947
+ /* Spacing between image width and height fields */
948
+ #wpra_image_min_size_row > td > label {
949
+ margin-right: 10px;
950
+ }
951
+
952
+ #wprss-feed-def-ft-image-preview {
953
+ width: 220px;
954
+ }
955
+
956
+ #wprss-feed-def-ft-image-preview-hint {
957
+ margin-bottom: 8px;
958
+ }
959
+
960
+
961
+ /*
962
+ * The Feed Source List Table styles that mimic the plugins table
963
+ */
964
+
965
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr th,
966
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr td
967
+ {
968
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .1);
969
+ }
970
+
971
+ /* Feed updating/deleting animation in feed sources table */
972
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-updating,
973
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-deleting {
974
+ /*background-image: linear-gradient(-45deg, rgba(30, 30, 30, 0.05) 25%, transparent 0, transparent 50%, rgba(50, 50, 50, 0.05) 50%, rgba(30, 30, 30, 0.05) 75%, transparent 0, #0000);*/
975
+ /*background-image: linear-gradient(*/
976
+ /* -45deg, rgba(0, 0, 0, 0.9) 25%,*/
977
+ /* transparent 0,*/
978
+ /* transparent 50%,*/
979
+ /* rgba(0, 0, 0, 0.9) 50%,*/
980
+ /* rgba(0, 0, 0, 0.9) 75%,*/
981
+ /* transparent 0, #0000*/
982
+ /*);*/
983
+ background-size: 80px 80px;
984
+ background-blend-mode: overlay;
985
+ }
986
+
987
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-updating > *,
988
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-deleting > * {
989
+ background: transparent !important;
990
+ }
991
+
992
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-updating {
993
+ animation: wpra-feed-updating-animation 1.3s linear infinite;
994
+ background-color: #e9f9ee;
995
+ }
996
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr.wpra-feed-is-deleting {
997
+ animation: wpra-feed-updating-animation 1s linear infinite;
998
+ background-color: #f8eaea;
999
+ }
1000
+
1001
+ @keyframes wpra-feed-updating-animation {
1002
+ 0% {
1003
+ background-position: 0 0;
1004
+ }
1005
+ 50% {
1006
+ background-position: 80px 80px;
1007
+ }
1008
+ 100% {
1009
+ background-position: 160px 160px;
1010
+ }
1011
+ }
1012
+
1013
+ /*
1014
+ * Styles for the Feed Source List Table "State" column
1015
+ */
1016
+ div.wprss-feed-state-container,
1017
+ div.wprss-feed-source-type
1018
+ {
1019
+ display: inline-block;
1020
+ }
1021
+
1022
+ /* the feed type icon */
1023
+ div.wprss-feed-source-type {
1024
+ float: right;
1025
+ }
1026
+ /* inactive color */
1027
+ .post-type-wprss_feed table.wp-list-table tr div.wprss-feed-source-type {
1028
+ color: #aaa;
1029
+ }
1030
+ /* active color */
1031
+ .post-type-wprss_feed table.wp-list-table tr.active div.wprss-feed-source-type {
1032
+ color: #ff792b;
1033
+ }
1034
+ /* youtube color */
1035
+ .post-type-wprss_feed table.wp-list-table tr.active div.wprss-feed-source-type.wprss-feed-source-type-yt {
1036
+ color: #ff0000;
1037
+ }
1038
+
1039
+ .post-type-wprss_feed table.wp-list-table tbody td.column-state {
1040
+ padding-right: 0;
1041
+ }
1042
+
1043
+ .column-updates > p {
1044
+ margin: 0 !important;
1045
+ }
1046
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr .next-update-container {
1047
+ font-weight: bold;
1048
+ }
1049
+ .post-type-wprss_feed table.wp-list-table.posts tbody tr:not(.active) .next-update-container {
1050
+ display: none;
1051
+ }
1052
+
1053
+ /* The last update time in the feed sources page table */
1054
+ .post-type-wprss_feed table.wp-list-table.posts .last-update-num-items-container {
1055
+ color: #666;
1056
+ font-style: italic;
1057
+ font-size: 90%;
1058
+ }
1059
+
1060
+ /* The imported items link in the feed sources page - disabled when 0 items */
1061
+ .post-type-wprss_feed table.wp-list-table.posts .items-imported-link.has-imported-items {
1062
+ font-weight: bold;
1063
+ line-height: 20px;
1064
+ }
1065
+ .post-type-wprss_feed table.wp-list-table.posts .items-imported-link:not(.has-imported-items) {
1066
+ color: #777;
1067
+ pointer-events: none;
1068
+ }
1069
+
1070
+ /* The delete items row action in the feed sources page - hidden when 0 items */
1071
+ .post-type-wprss_feed table.wp-list-table.posts .row-actions .purge-posts:not(.has-imported-items) {
1072
+ display: none;
1073
+ }
1074
+
1075
+ /* Styles for the disabled "Fetch" and "Delete" feed source row actions */
1076
+ .post-type-wprss_feed table.wp-list-table.posts .row-actions a.wprss_fetch_items_ajax_action[disabled] {
1077
+ color: #555;
1078
+ }
1079
+ .post-type-wprss_feed table.wp-list-table.posts .row-actions a.wprss_delete_items_ajax_action[disabled] {
1080
+ color: #666;
1081
+ }
1082
+
1083
+ /* The feed updating/deleting spinner icon */
1084
+ .post-type-wprss_feed table.wp-list-table.posts .column-feed-count .spinner {
1085
+ float: none;
1086
+ vertical-align: bottom;
1087
+ }
1088
+ .post-type-wprss_feed table.wp-list-table.posts tr.wpra-feed-is-updating .column-feed-count .spinner,
1089
+ .post-type-wprss_feed table.wp-list-table.posts tr.wpra-feed-is-deleting .column-feed-count .spinner {
1090
+ visibility: visible;
1091
+ }
1092
+
1093
+ /*
1094
+ * TOGGLE SWITCH
1095
+ */
1096
+ .wprss-switch {
1097
+ position: relative;
1098
+ display: inline-block;
1099
+ width: 34px;
1100
+ height: 18px;
1101
+ }
1102
+ .wprss-switch input {
1103
+ opacity: 0;
1104
+ width: 0;
1105
+ height: 0;
1106
+ }
1107
+ .wprss-switch-slider {
1108
+ position: absolute;
1109
+ cursor: pointer;
1110
+ top: 0;
1111
+ left: 0;
1112
+ right: 0;
1113
+ bottom: 0;
1114
+ border-radius: 34px;
1115
+ background-color: #ccc;
1116
+ transition: .2s;
1117
+ -webkit-transition: .2s;
1118
+ }
1119
+ .wprss-switch-slider:before {
1120
+ position: absolute;
1121
+ content: "";
1122
+ width: 12px;
1123
+ height: 12px;
1124
+ left: 4px;
1125
+ bottom: 3px;
1126
+ border-radius: 50%;
1127
+ background-color: white;
1128
+ transition: .2s;
1129
+ -webkit-transition: .2s;
1130
+ }
1131
+ input:checked + .wprss-switch-slider {
1132
+ background-color: #0baa3c;
1133
+ }
1134
+ input:focus + .wprss-switch-slider {
1135
+ box-shadow: 0 0 1px #2196F3;
1136
+ }
1137
+ input:checked + .wprss-switch-slider:before {
1138
+ -webkit-transform: translateX(14px);
1139
+ -ms-transform: translateX(14px);
1140
+ transform: translateX(14px);
1141
+ }
1142
+
1143
+ .postbox .inside .wpra-feed-save-meta-box {
1144
+ border-bottom: 1px solid #ccc;
1145
+ padding: 10px;
1146
+ margin: 0 -10px;
1147
+ margin-top: -11px;
1148
+ margin-bottom: 10px;
1149
+ background: #fff;
1150
+ }
1151
+
1152
+ .postbox .inside .wpra-feed-save-meta-box label span {
1153
+ font-weight: bold;
1154
+ font-size: 14px;
1155
+ }
1156
+
1157
+ .postbox .inside .wpra-feed-save-meta-box input[type="text"] {
1158
+ text-align: left !important;
1159
+ }
1160
+
1161
+ /* -- INLINE STYLES -- */
1162
+
1163
+ form.wpra-inline-form {
1164
+ display: inline-block;
1165
+ }
1166
+
1167
+ form.wpra-header-form {
1168
+ display: inline-block;
1169
+ margin: 0;
1170
+ padding: 0;
1171
+ border: 0;
1172
+ }
1173
+
1174
+ h1.wpra-inline-header,
1175
+ h2.wpra-inline-header,
1176
+ h3.wpra-inline-header,
1177
+ h4.wpra-inline-header
1178
+ {
1179
+ display: inline-block;
1180
+ margin-right: 5px;
1181
+ }
1182
+
1183
+ button.button.wpra-header-button {
1184
+ position: relative;
1185
+ vertical-align: baseline;
1186
+ top: -1px;
1187
+ }
1188
+
1189
+ /* -- SLIDE BOX -- */
1190
+
1191
+ div.wpra-slide-box {
1192
+ display: none;
1193
+ margin: 10px 0;
1194
+ padding: 15px;
1195
+ background: #fff;
1196
+ border: 1px solid #ccc;
1197
+ border-radius: 2px;
1198
+ }
1199
+
1200
+ div.wpra-slide-box.wpra-slide-box-open {
1201
+ display: block;
1202
+ }
1203
+
1204
+ div.wpra-slide-box form {
1205
+ display: block;
1206
+ }
1207
+
1208
+ div.wpra-slide-box h4 {
1209
+ font-size: 16px;
1210
+ margin: 0;
1211
+ margin-bottom: 15px;
1212
+ padding-bottom: 5px;
1213
+ border-bottom: 1px solid #ddd;
1214
+ }
1215
+
1216
+ div.wpra-slide-box form label {
1217
+ display: flex;
1218
+ flex-direction: row;
1219
+ align-items: center;
1220
+ line-height: 1;
1221
+ font-size: 1em;
1222
+ margin: 5px 0;
1223
+ }
1224
+
1225
+ div.wpra-slide-box label > * {
1226
+ flex-grow: 1;
1227
+ }
1228
+
1229
+ div.wpra-slide-box label > span {
1230
+ display: inline-block;
1231
+ flex-grow: 0;
1232
+ width: 200px;
1233
+ font-size: 1em;
1234
+ }
1235
+ div.wpra-slide-box label input[type="text"],
1236
+ div.wpra-slide-box label input[type="number"],
1237
+ div.wpra-slide-box label input[type="text"]
1238
+ {
1239
+ height: 28px;
1240
+ min-height: 28px;
1241
+ }
1242
+
1243
+ div.wpra-slide-box div.wpra-submit-wrap {
1244
+ margin-top: 10px;
1245
+ }
1246
+ div.wpra-slide-box div.wpra-submit-wrap.right {
1247
+ text-align: right;
1248
+ }
1249
+
1250
+ div.wpra-slide-box div.wpra-submit-wrap > button {
1251
+ text-align: center;
1252
+ }
1253
+
1254
+ /* -- ERROR LOG OPTIONS (SLIDE BOX) -- */
1255
+
1256
+ #wprss-log-options-form input[name="logging_limit_days"] {
1257
+ width: 80px;
1258
+ }
1259
+
1260
+ /* -- BLACKLIST TOOL -- */
1261
+
1262
+ #wpra-add-blacklist-container form label span:first-child {
1263
+ width: 120px;
1264
+ }
1265
+
1266
+ /* -- LOG TOOL -- */
1267
+
1268
+ #wprss-error-log-options {
1269
+ margin: 15px 0;
1270
+ }
1271
+
1272
+ #wprss-clear-error-log-form {
1273
+ float: right;
1274
+ position: relative;
1275
+ top: -3px;
1276
+ }
1277
+
1278
+ .wpra-log-filters {
1279
+ padding: 2px 0;
1280
+ margin: 0;
1281
+ }
1282
+ p.wpra-logs-shown-msg {
1283
+ margin: 5px 0;
1284
+ }
1285
+
1286
+ /* -- MISC -- */
1287
+ .wpra-no-margin {
1288
+ margin: 0;
1289
+ }
css/build/templates.min.css CHANGED
@@ -1 +1 @@
1
- .mobile-collapsed{display:inherit}.mobile-only{display:none!important}@media (max-width:782px){.mobile-only{display:inherit!important}.mobile-collapsed{display:none!important}}.wpra-bottom-panel{position:sticky;bottom:0;z-index:9;background-color:#fffce9;padding:1rem;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04)}.wpra-bottom-panel__title{font-size:1rem;font-weight:500;padding-bottom:8px}a.disabled{color:#9c9c9c;pointer-events:none}[v-cloak] .vcloak--visible{display:block}[v-cloak] .vcloak--hidden{display:none}.vcloak--visible{min-height:60px;display:none}.loading-container{min-height:5rem;position:relative}.loading-container:before{display:block;content:"";position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);box-sizing:border-box;height:40px;width:40px;border:0 solid #d0d0d0;border-radius:50%;box-shadow:inset 0 -12px 0 16px #d0d0d0;animation:rotate 1s infinite linear;z-index:3}.loading-container:after{display:block;content:"";position:absolute;z-index:2;background-color:hsla(0,0%,95%,.5);width:100%;height:100%;left:0;top:0}.loading-container--white:after{background-color:#fff}.loading-button{pointer-events:none;position:relative}.loading-button:before{display:block;content:"";position:absolute;left:calc(50% - 8px);top:calc(50% - 8px);box-sizing:border-box;height:16px;width:16px;border:0 solid #fff;border-radius:50%;box-shadow:inset 0 -4px 0 6px #fff;animation:rotate 1s infinite linear;z-index:3}.loading-button:after{display:block;content:"";position:absolute;z-index:2;background-color:inherit;width:100%;height:100%;left:0;top:0}.button-default.loading-button:before{box-shadow:inset 0 -4px 0 6px #6f6f6f}.loading-inline{display:inline-block;pointer-events:none;position:relative}.loading-inline:before{display:block;content:"";position:absolute;left:calc(50% + 1px);top:calc(50% - 11px);box-sizing:border-box;height:14px;width:14px;border:0 solid #d0d0d0;border-radius:50%;box-shadow:inset 0 -3px 0 5px #d0d0d0;animation:rotate 1s infinite linear;z-index:3}.loading-inline:after{display:block;content:"";position:absolute;z-index:2;background-color:inherit;width:100%;height:100%;left:0;top:0}@keyframes rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.table-loading{position:relative}.table-loading .table-loader-wrap{position:absolute;width:100%;height:100%;z-index:9}.table-loading .table-loader-wrap .table-loader-center{position:absolute;top:50%;transform:translateY(-50%);width:100%}.table-loading .tablenav,.table-loading .wp-list-table{opacity:.4}.table-loader{font-size:10px;margin:50px auto;text-indent:-9999em;width:11em;height:11em;border-radius:50%;background:#fff;background:-moz-linear-gradient(left,#fff 10%,hsla(0,0%,100%,0) 42%);background:-webkit-linear-gradient(left,#fff 10%,hsla(0,0%,100%,0) 42%);background:-o-linear-gradient(left,#fff 10%,hsla(0,0%,100%,0) 42%);background:-ms-linear-gradient(left,#fff 10%,hsla(0,0%,100%,0) 42%);background:linear-gradient(90deg,#fff 10%,hsla(0,0%,100%,0) 42%);position:relative;-webkit-animation:tableLoading 1s infinite linear;animation:tableLoading 1s infinite linear;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.table-loader:before{width:50%;height:50%;background:#fff;border-radius:100% 0 0 0}.table-loader:after,.table-loader:before{position:absolute;top:0;left:0;content:""}.table-loader:after{background:#f4f4f4;width:75%;height:75%;border-radius:50%;margin:auto;bottom:0;right:0}@-webkit-keyframes tableLoading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes tableLoading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.toasted-container.top-center{top:44px!important}.toasted{background:#23282d!important;color:#e5e5e5!important;font-size:inherit!important;font-weight:inherit!important;justify-content:start!important;border-left:none!important}.toasted.error .dashicons{color:#ff7781}.toasted .dashicons{margin-right:12px;margin-left:-8px;display:inline-block;opacity:.65}.flex-row{display:flex}.flex-col{box-sizing:border-box;padding:0 10px;flex:1 1 0}.flex-col:first-child{padding-left:0}.flex-col:last-child{padding-right:0}.wpra-postbox .hndle{cursor:unset!important}.wpra-shortcode-copy{font-size:13px;background-color:#fff;margin-left:auto;padding:9px 14px;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);border-left:4px solid #0085ba;display:flex;align-items:center}@media (max-width:782px){.wpra-shortcode-copy{display:block}}.wpra-shortcode-copy__icon{padding-left:16px}@media (max-width:782px){.wpra-shortcode-copy__icon{padding-left:0;margin-top:1rem}}.page-title{display:flex;align-items:center;padding:9px 0 4px}@media (max-width:782px){.page-title{display:block}}.page-title a:focus{text-decoration:none}.page-title h1{margin-left:6px;padding:0}.back-button{opacity:.75;text-decoration:none;font-size:20px;display:flex;align-items:center;padding-right:10px;margin-right:4px;border-right:1px solid #b4b4b4}@media (max-width:782px){.back-button{border-right:none;margin-bottom:.5rem}}.back-button .dashicons{margin-right:8px}.tippy-tooltip.light-theme{font-size:13px!important;font-family:unset!important;text-align:left!important}.tippy-tooltip.light-theme hr{border:none;height:1px;background-color:#efefef}.form-input{display:flex;margin:.75rem 0}.form-input--disabled{pointer-events:none}.form-input--disabled .form-input__label :not(.disable-ignored){opacity:.5;user-select:none}.form-input .disable-ignored{opacity:1}.form-input--vertical{flex-direction:column}.form-input--vertical .form-input__label{padding-right:0;padding-bottom:4px;flex-basis:100%}@media (max-width:782px){.form-input{flex-direction:column}.form-input .form-input__label{padding-right:0;padding-bottom:4px;flex-basis:100%}}.form-input:last-child{margin-bottom:0}.form-input__tip{cursor:pointer;display:inline-block;margin-left:4px;opacity:.25;vertical-align:middle}.form-input__tip:hover{opacity:.85}.form-input__tip .dashicons{font-size:18px}.form-input__label{padding-right:12px;flex-basis:260px}.form-input__label-description{padding-top:2px;padding-right:10px;line-height:1.65;opacity:.6;font-size:12px}.form-input__label-description a{pointer-events:auto!important}.form-input__field{flex-grow:1}.form-input__field input:not([type=checkbox]),.form-input__field select,.form-input__field textarea{width:100%;max-width:325px}.built-in{background:#f1f1f1}.built-in [type=checkbox]{display:none}.wpra-preview-link{vertical-align:middle}.wpra-preview-link span.dashicons{opacity:.75;font-size:16px;vertical-align:middle}.wpra-no-cb .column-cb input[type=checkbox]{display:none}@media (max-width:782px){.column.name small{display:block}}@media (max-width:782px){.inside .wpra-preview-link{float:none}}@media (max-width:782px){.wpra-postbox-container{display:flex;flex-direction:column}.wpra-postbox-container .wpra-postbox-last{order:100}}
1
+ .mobile-collapsed{display:inherit}.mobile-only{display:none!important}@media (max-width:782px){.mobile-only{display:inherit!important}.mobile-collapsed{display:none!important}}.wpra-bottom-panel{position:sticky;bottom:0;z-index:9;background-color:#fffce9;padding:1rem;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04)}.wpra-bottom-panel__title{font-size:1rem;font-weight:500;padding-bottom:8px}a.disabled{color:#9c9c9c;pointer-events:none}[v-cloak] .vcloak--visible{display:block}[v-cloak] .vcloak--hidden{display:none}.vcloak--visible{min-height:60px;display:none}.loading-container{min-height:5rem;position:relative}.loading-container:before{display:block;content:"";position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);box-sizing:border-box;height:40px;width:40px;border:0 solid #d0d0d0;border-radius:50%;box-shadow:inset 0 -12px 0 16px #d0d0d0;animation:rotate 1s infinite linear;z-index:3}.loading-container:after{display:block;content:"";position:absolute;z-index:2;background-color:hsla(0,0%,95%,.5);width:100%;height:100%;left:0;top:0}.loading-container--white:after{background-color:#fff}.loading-button{pointer-events:none;position:relative}.loading-button:before{display:block;content:"";position:absolute;left:calc(50% - 8px);top:calc(50% - 8px);box-sizing:border-box;height:16px;width:16px;border:0 solid #aaa;border-radius:50%;box-shadow:inset 0 -4px 0 6px #aaa;animation:rotate 1s infinite linear;z-index:3}.loading-button:after{display:block;content:"";position:absolute;z-index:2;background-color:inherit;width:100%;height:100%;left:0;top:0}.button-default.loading-button:before{box-shadow:inset 0 -4px 0 6px #6f6f6f}.loading-inline{display:inline-block;pointer-events:none;position:relative}.loading-inline:before{display:block;content:"";position:absolute;left:calc(50% + 1px);top:calc(50% - 11px);box-sizing:border-box;height:14px;width:14px;border:0 solid #d0d0d0;border-radius:50%;box-shadow:inset 0 -3px 0 5px #d0d0d0;animation:rotate 1s infinite linear;z-index:3}.loading-inline:after{display:block;content:"";position:absolute;z-index:2;background-color:inherit;width:100%;height:100%;left:0;top:0}@keyframes rotate{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.table-loading{position:relative}.table-loading .table-loader-wrap{position:absolute;width:100%;height:100%;z-index:9}.table-loading .table-loader-wrap .table-loader-center{position:absolute;top:50%;transform:translateY(-50%);width:100%}.table-loading .tablenav,.table-loading .wp-list-table{opacity:.4}.table-loader{font-size:10px;margin:50px auto;text-indent:-9999em;width:11em;height:11em;border-radius:50%;background:#fff;background:-moz-linear-gradient(left,#fff 10%,hsla(0,0%,100%,0) 42%);background:-webkit-linear-gradient(left,#fff 10%,hsla(0,0%,100%,0) 42%);background:-o-linear-gradient(left,#fff 10%,hsla(0,0%,100%,0) 42%);background:-ms-linear-gradient(left,#fff 10%,hsla(0,0%,100%,0) 42%);background:linear-gradient(90deg,#fff 10%,hsla(0,0%,100%,0) 42%);position:relative;-webkit-animation:tableLoading 1s infinite linear;animation:tableLoading 1s infinite linear;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.table-loader:before{width:50%;height:50%;background:#fff;border-radius:100% 0 0 0}.table-loader:after,.table-loader:before{position:absolute;top:0;left:0;content:""}.table-loader:after{background:#f4f4f4;width:75%;height:75%;border-radius:50%;margin:auto;bottom:0;right:0}@-webkit-keyframes tableLoading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes tableLoading{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.toasted-container.top-center{top:44px!important}.toasted{background:#23282d!important;color:#e5e5e5!important;font-size:inherit!important;font-weight:inherit!important;justify-content:start!important;border-left:none!important}.toasted.error .dashicons{color:#ff7781}.toasted .dashicons{margin-right:12px;margin-left:-8px;display:inline-block;opacity:.65}.flex-row{display:flex}.flex-col{box-sizing:border-box;padding:0 10px;flex:1 1 0}.flex-col:first-child{padding-left:0}.flex-col:last-child{padding-right:0}.wpra-postbox .hndle{cursor:unset!important}.wpra-shortcode-copy{font-size:13px;background-color:#fff;margin-left:auto;padding:9px 14px;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);border-left:4px solid #0085ba;display:flex;align-items:center}@media (max-width:782px){.wpra-shortcode-copy{display:block}}.wpra-shortcode-copy__icon{padding-left:16px}@media (max-width:782px){.wpra-shortcode-copy__icon{padding-left:0;margin-top:1rem}}.page-title{display:flex;align-items:center;padding:9px 0 4px}@media (max-width:782px){.page-title{display:block}}.page-title a:focus{text-decoration:none}.page-title h1{margin-left:6px;padding:0}.back-button{opacity:.75;text-decoration:none;font-size:20px;display:flex;align-items:center;padding-right:10px;margin-right:4px;border-right:1px solid #b4b4b4}@media (max-width:782px){.back-button{border-right:none;margin-bottom:.5rem}}.back-button .dashicons{margin-right:8px}.tippy-tooltip.light-theme{font-size:13px!important;font-family:unset!important;text-align:left!important}.tippy-tooltip.light-theme hr{border:none;height:1px;background-color:#efefef}.form-input{display:flex;margin:.75rem 0}.form-input--disabled{pointer-events:none}.form-input--disabled .form-input__label :not(.disable-ignored){opacity:.5;user-select:none}.form-input .disable-ignored{opacity:1}.form-input--vertical{flex-direction:column}.form-input--vertical .form-input__label{padding-right:0;padding-bottom:4px;flex-basis:100%}@media (max-width:782px){.form-input{flex-direction:column}.form-input .form-input__label{padding-right:0;padding-bottom:4px;flex-basis:100%}}.form-input:last-child{margin-bottom:0}.form-input__tip{cursor:pointer;display:inline-block;margin-left:4px;opacity:.25;vertical-align:middle}.form-input__tip:hover{opacity:.85}.form-input__tip .dashicons{font-size:18px}.form-input__label{padding-right:12px;flex-basis:260px}.form-input__label-description{padding-top:2px;padding-right:10px;line-height:1.65;opacity:.6;font-size:12px}.form-input__label-description a{pointer-events:auto!important}.form-input__field{flex-grow:1}.form-input__field input:not([type=checkbox]),.form-input__field select,.form-input__field textarea{width:100%;max-width:325px}.built-in{background:#f1f1f1}.built-in [type=checkbox]{display:none}.wpra-preview-link{vertical-align:middle}.wpra-preview-link span.dashicons{opacity:.75;font-size:16px;vertical-align:middle}.wpra-no-cb .column-cb input[type=checkbox]{display:none}@media (max-width:782px){.column.name small{display:block}}@media (max-width:782px){.inside .wpra-preview-link{float:none}}@media (max-width:782px){.wpra-postbox-container{display:flex;flex-direction:column}.wpra-postbox-container .wpra-postbox-last{order:100}}
css/templates/list/styles.css CHANGED
@@ -27,6 +27,16 @@ div.wpra-list-template .wpra-item-list > li.wpra-item > div.wprss-feed-meta > sp
27
  list-style: decimal;
28
  }
29
 
 
 
 
 
 
 
 
 
 
 
30
  /**
31
  * Old styles
32
  */
27
  list-style: decimal;
28
  }
29
 
30
+ /* Audio player */
31
+ .wpra-feed-audio {
32
+ display: block;
33
+ margin: 0 5px;
34
+ }
35
+
36
+ .wpra-feed-audio audio {
37
+ width: 100%;
38
+ }
39
+
40
  /**
41
  * Old styles
42
  */
includes/admin-heartbeat.php CHANGED
@@ -1,88 +1,64 @@
1
  <?php
2
 
3
- add_action( 'wp_ajax_wprss_feed_source_table_ajax', 'wprss_feed_source_updates');
4
- /**
5
- *
6
- */
7
- function wprss_feed_source_updates() {
8
- $response = array();
9
-
10
- if ( ! current_user_can( 'edit_feed_sources' ) ) return $response;
11
 
12
- if ( empty($_POST['wprss_heartbeat']) ) return $response;
 
 
13
 
14
- // Get the wprss heartbeat data and extract the data
15
- $wprss_heartbeat = $_POST['wprss_heartbeat'];
16
- $action = $wprss_heartbeat['action'];
17
- $params = $wprss_heartbeat['params'];
18
 
19
- // Perform the action specified by the heartbeat data
20
- switch( $action ) {
21
- /* FEED SOURCE UPDATING STATUS
22
- * Used to determine whether or not to show the updating icon in the feed source table.
23
- */
24
- case 'feed_sources':
25
- // Prepare array of IDs for feed sources currently updating
26
- $feed_sources_data = array();
27
- // Iterate all feed sources
28
- foreach ( $params as $feed_id ) {
29
- $feed_sources_data[$feed_id] = array();
30
- $feed_source_data = &$feed_sources_data[$feed_id];
31
 
32
- // Check if the feed source is updating
33
- $next_fetch = wprss_get_next_feed_source_update($feed_id);
34
- $fetches_soon = $next_fetch !== false && $next_fetch < 2 && $next_fetch > 0;
35
- $is_fetching = wprss_is_feed_source_updating($feed_id);
36
- $is_deleting = wprss_is_feed_source_deleting($feed_id);
37
- $feed_source_data['fetching'] = $fetches_soon || $is_fetching;
38
- $feed_source_data['deleting'] = $is_deleting;
 
 
 
39
 
40
- // Add the number of imported items
41
- $items = wprss_get_feed_items_for_source( $feed_id );
42
- $feed_source_data['items'] = $items->post_count;
43
- // Update the meta field
44
- update_post_meta( $feed_id, 'wprss_items_imported', $items->post_count );
 
 
 
 
45
 
46
- // Add the next update time
47
- $next_update = wprss_get_next_feed_source_update( $feed_id );
48
- $update_interval = get_post_meta( $feed_id, 'wprss_update_interval', TRUE );
49
- // If using the global interval, get the timestamp of the next global update
50
- if ( $update_interval === wprss_get_default_feed_source_update_interval() || $update_interval === '' ) {
51
- $next_update = wp_next_scheduled( 'wprss_fetch_all_feeds_hook', array() );
52
- }
53
- // Set the text appropriately
54
- if ( ! wprss_is_feed_source_active( $feed_id ) ) {
55
- $feed_source_data['next-update'] = __( '...', 'wprss' );
56
- }
57
- elseif( $next_update === FALSE ) {
58
- $feed_source_data['next-update'] = __( 'None', 'wprss' );
59
- wprss_activate_feed_source( $feed_id );
60
- }
61
- else {
62
- $time_diff = absint($next_update - time());
63
 
64
- $feed_source_data['next-update'] = ($time_diff > 1)
65
- ? human_time_diff( $next_update, time() )
66
- : _x('now', 'Next update: now', 'wprss');
67
- }
68
- // Update the meta field
69
- update_post_meta( $feed_id, 'wprss_next_update', $feed_source_data['next-update'] );
70
 
71
- // Add the last update information
72
- $last_update = get_post_meta( $feed_id, 'wprss_last_update', TRUE );
73
- $last_update_items = get_post_meta( $feed_id, 'wprss_last_update_items', TRUE );
 
 
 
74
 
75
- $feed_source_data['last-update'] = ( $last_update === '' )? '' : human_time_diff( $last_update, time() );
76
- $feed_source_data['last-update-imported'] = $last_update_items;
77
-
78
- // Add any error info
79
- $errors = get_post_meta( $feed_id, 'wprss_error_last_import', true );
80
- $feed_source_data['errors'] = $errors;
81
- }
82
- // Send back all the IDs
83
- $response['wprss_feed_sources_data'] = $feed_sources_data;
84
- break;
85
- }
86
- // Return the response
87
- die( json_encode($response) );
88
- }
1
  <?php
2
 
3
+ add_action('wp_ajax_wprss_feed_source_table_ajax', function () {
4
+ $response = [];
 
 
 
 
 
 
5
 
6
+ if (!current_user_can('edit_feed_sources') || empty($_POST['wprss_heartbeat'])) {
7
+ return [];
8
+ }
9
 
10
+ $request = $_POST['wprss_heartbeat'];
11
+ $action = isset($request['action']) ? $request['action'] : '';
12
+ $params = isset($request['params']) ? $request['params'] : '';
 
13
 
14
+ switch ($action) {
15
+ case 'feed_sources':
16
+ {
17
+ $feeds = [];
 
 
 
 
 
 
 
 
18
 
19
+ foreach ($params as $feedId) {
20
+ $nextFetch = wprss_get_next_feed_source_update($feedId, false);
21
+ $isFetching = wprss_is_feed_source_updating($feedId);
22
+ $isDeleting = wprss_is_feed_source_deleting($feedId);
23
+ $fetchesSoon = $nextFetch !== false && $nextFetch < 2 && $nextFetch > 0;
24
+ $isActive = wprss_is_feed_source_active($feedId);
25
+ $numItems = wprss_get_feed_items_for_source($feedId)->post_count;
26
+ $lastUpdateTime = get_post_meta($feedId, 'wprss_last_update', true);
27
+ $lastUpdateItems = get_post_meta($feedId, 'wprss_last_update_items', true);
28
+ $errors = get_post_meta($feedId, 'wprss_error_last_import', true);
29
 
30
+ if ($nextFetch === false) {
31
+ $nextFetchText = __('None', 'wprss');
32
+ } elseif ($isActive) {
33
+ $nextFetchText = $fetchesSoon
34
+ ? _x('now', 'Next update: now', 'wprss')
35
+ : human_time_diff($nextFetch, time());
36
+ } else {
37
+ $nextFetchText = __('...', 'wprss');
38
+ }
39
 
40
+ $feeds[$feedId] = [
41
+ 'active' => $isActive,
42
+ 'fetching' => $isFetching || $fetchesSoon,
43
+ 'deleting' => $isDeleting,
44
+ 'items' => $numItems,
45
+ 'next-update' => $nextFetchText,
46
+ 'last-update' => empty($lastUpdateTime) ? '' : human_time_diff($lastUpdateTime, time()),
47
+ 'last-update-imported' => $lastUpdateItems,
48
+ 'errors' => $errors,
49
+ ];
 
 
 
 
 
 
 
50
 
51
+ update_post_meta($feedId, 'wprss_items_imported', $numItems);
52
+ update_post_meta($feedId, 'wprss_next_update', $nextFetchText);
53
+ }
 
 
 
54
 
55
+ $response = [
56
+ 'wprss_feed_sources_data' => $feeds,
57
+ ];
58
+ break;
59
+ }
60
+ }
61
 
62
+ echo json_encode($response);
63
+ die;
64
+ });
 
 
 
 
 
 
 
 
 
 
 
includes/cron-jobs.php CHANGED
@@ -1,361 +1,384 @@
1
- <?php
2
-
3
- define('WPRA_FETCH_ALL_FEEDS_HOOK', 'wprss_fetch_all_feeds_hook');
4
- define('WPRA_FETCH_FEED_HOOK', 'wprss_fetch_single_feed_hook');
5
- define('WPRA_TRUNCATE_ITEMS_HOOK', 'wprss_truncate_posts_hook');
6
- define('WPRA_ACTIVATE_FEED_HOOK', 'wprss_activate_feed_schedule_hook');
7
- define('WPRA_PAUSE_FEED_HOOK', 'wprss_pause_feed_schedule_hook');
8
-
9
- define('WPRA_TRUNCATE_ITEMS_INTERVAL', 'daily');
10
-
11
- /**
12
- * Alias for add_action, primarily used for readability to distinguish between cron-events and normal hooks.
13
- *
14
- * @since 4.17
15
- *
16
- * @param string $cron The cron hook event.
17
- * @param callable $callback The callback to invoke for the cron.
18
- */
19
- function wpra_on_cron_do($cron, $callback)
20
- {
21
- add_action($cron, $callback);
22
- }
23
-
24
- // Cron events
25
- wpra_on_cron_do(WPRA_FETCH_ALL_FEEDS_HOOK, 'wprss_fetch_insert_all_feed_items_from_cron');
26
- wpra_on_cron_do(WPRA_TRUNCATE_ITEMS_HOOK, 'wprss_truncate_posts');
27
- wpra_on_cron_do(WPRA_ACTIVATE_FEED_HOOK, 'wprss_activate_feed_source');
28
- wpra_on_cron_do(WPRA_PAUSE_FEED_HOOK, 'wprss_pause_feed_source');
29
-
30
- // Initialize crons that must always be scheduled
31
- add_action('init', 'wpra_init_crons');
32
-
33
- // When a feed source is activated, schedule its fetch cron
34
- add_action('wprss_on_feed_source_activated', 'wprss_feed_source_update_start_schedule');
35
-
36
- // When a feed source is paused, cancel its fetch cron
37
- add_action('wprss_on_feed_source_paused', 'wprss_feed_source_update_stop_schedule');
38
-
39
- // Filter the possible cron intervals to add more options
40
- add_filter('cron_schedules', 'wprss_filter_cron_schedules');
41
-
42
- /**
43
- * Initializes the cron jobs.
44
- *
45
- * @since 4.17
46
- */
47
- function wpra_init_crons()
48
- {
49
- wprss_schedule_fetch_all_feeds_cron();
50
- wprss_schedule_truncate_posts_cron();
51
- }
52
-
53
- /**
54
- * Creates the cron to fetch feeds.
55
- *
56
- * @since 2.0
57
- */
58
- function wprss_schedule_fetch_all_feeds_cron()
59
- {
60
- // Check if the global fetch is scheduled
61
- if (wp_next_scheduled(WPRA_FETCH_ALL_FEEDS_HOOK)) {
62
- return;
63
- }
64
-
65
- // If the event is not scheduled, schedule it
66
- $interval = wprss_get_general_setting('cron_interval');
67
- wp_schedule_event(time(), $interval, WPRA_FETCH_ALL_FEEDS_HOOK);
68
- }
69
-
70
- /**
71
- * Gets the time of the global fetch cron.
72
- *
73
- * @since 4.17
74
- *
75
- * @return false|string A time string in the form `H:i`
76
- */
77
- function wprss_get_global_update_time()
78
- {
79
- // If the global fetch cron is not scheduled, schedule it
80
- wprss_schedule_fetch_all_feeds_cron();
81
-
82
- // Get the timestamp for the next run
83
- $next = wp_next_scheduled(WPRA_FETCH_ALL_FEEDS_HOOK);
84
-
85
- return date('H:i', $next);
86
- }
87
-
88
- /**
89
- * Creates the cron to truncate wprss_feed_item posts daily
90
- *
91
- * @since 2.0
92
- */
93
- function wprss_schedule_truncate_posts_cron()
94
- {
95
- // Check if the truncatation cron is scheduled
96
- if (wp_next_scheduled(WPRA_TRUNCATE_ITEMS_HOOK)) {
97
- return;
98
- }
99
-
100
- // If not, schedule it
101
- wp_schedule_event(time(), WPRA_TRUNCATE_ITEMS_INTERVAL, WPRA_TRUNCATE_ITEMS_HOOK);
102
- }
103
-
104
- /**
105
- * Updates the feed processing cron job schedules.
106
- * Removes the current schedules and adds the ones in the feed source's meta.
107
- *
108
- * @since 3.8
109
- *
110
- * @param int $feed_id The id of the wprss_feed
111
- */
112
- function wprss_update_feed_processing_schedules($feed_id)
113
- {
114
- // Get the feed's activate and pause times
115
- $activate = get_post_meta($feed_id, 'wprss_activate_feed', true);
116
- $pause = get_post_meta($feed_id, 'wprss_pause_feed', true);
117
-
118
- // Parse as time strings
119
- $activate = wprss_strtotime($activate);
120
- $pause = wprss_strtotime($pause);
121
-
122
- if (!empty($activate)) {
123
- wpra_reschedule($activate, WPRA_ACTIVATE_FEED_HOOK, null, [$feed_id]);
124
- }
125
-
126
- if ($pause !== '') {
127
- wpra_reschedule($pause, WPRA_PAUSE_FEED_HOOK, null, [$feed_id]);
128
- }
129
- }
130
-
131
- /**
132
- * Starts the looping schedule for a feed source. Runs on a schedule
133
- *
134
- * @since 3.9
135
- *
136
- * @param int $feed_id The ID of the feed source
137
- */
138
- function wprss_feed_source_update_start_schedule($feed_id)
139
- {
140
- // Stop any currently scheduled update operations
141
- wprss_feed_source_update_stop_schedule($feed_id);
142
-
143
- // Get the interval
144
- $interval = get_post_meta($feed_id, 'wprss_update_interval', true);
145
- // Do nothing if the feed source has no update interval (not sure if possible) or if the interval
146
- // is set to global
147
- if ($interval === '' || $interval === wprss_get_default_feed_source_update_interval()) {
148
- return;
149
- }
150
-
151
- wp_schedule_event(time(), $interval, WPRA_FETCH_FEED_HOOK, [strval($feed_id)]);
152
- }
153
-
154
- /**
155
- * Stops any scheduled update operations for a feed source. Runs on a schedule.
156
- *
157
- * @since 3.9
158
- *
159
- * @param int $feed_id The ID of the feed source ( wprss_feed )
160
- */
161
- function wprss_feed_source_update_stop_schedule($feed_id)
162
- {
163
- $timestamp = wprss_get_next_feed_source_update($feed_id);
164
-
165
- // If a schedule exists, unschedule it
166
- if ($timestamp !== false) {
167
- wp_unschedule_event($timestamp, WPRA_FETCH_FEED_HOOK, [strval($feed_id)]);
168
- }
169
- }
170
-
171
- /**
172
- * Returns the timestamp for the next feed source update
173
- *
174
- * @since 3.9
175
- *
176
- * @param int $feed_id The ID of the feed source ( wprss_feed )
177
- *
178
- * @return int The timestamp of the next update operation, or false is no
179
- * update is scheduled.
180
- */
181
- function wprss_get_next_feed_source_update($feed_id)
182
- {
183
- return wp_next_scheduled(WPRA_FETCH_FEED_HOOK, [strval($feed_id)]);
184
- }
185
-
186
- /**
187
- * Reschedules a cron event, unscheduling any existing matching crons.
188
- *
189
- * @since 4.17
190
- *
191
- * @param int $timestamp The timestamp.
192
- * @param string $event The hook event.
193
- * @param string|null $recurrence The recurrence.
194
- * @param array $args Additional args.
195
- */
196
- function wpra_reschedule($timestamp, $event, $recurrence = null, $args = [])
197
- {
198
- $existing = wp_next_scheduled($event, $args);
199
-
200
- if ($existing !== false) {
201
- wp_unschedule_event($existing, $event, $args);
202
- }
203
-
204
- if ($recurrence === null) {
205
- wp_schedule_single_event($timestamp, $event, $args);
206
- } else {
207
- wp_schedule_event($timestamp, $recurrence, $event, $args);
208
- }
209
- }
210
-
211
- /**
212
- * Clears all events scheduled to a particular hook, regardless of their args.
213
- *
214
- * @since 4.17.9
215
- *
216
- * @param string $hook
217
- */
218
- function wpra_clear_all_scheduled_hooks($hook)
219
- {
220
- foreach (wpra_get_crons() as $key => $events) {
221
- if ($key === $hook) {
222
- foreach ($events as $event) {
223
- wp_clear_scheduled_hook($key, $event->args);
224
- }
225
- }
226
- }
227
- }
228
-
229
- /**
230
- * Retrieves all cron jobs from WordPress.
231
- *
232
- * @since 4.17.9
233
- *
234
- * @return array A mapping of hook names to sub-arrays of even objects.
235
- */
236
- function wpra_get_crons()
237
- {
238
- $cronsArray = _get_cron_array();
239
- $crons = [];
240
- foreach ($cronsArray as $ts => $list) {
241
- foreach ($list as $hook => $events) {
242
- $crons[$hook] = isset($crons[$hook]) ? $crons[$hook] : [];
243
-
244
- foreach ($events as $event) {
245
- $crons[$hook][] = (object) $event;
246
- }
247
- }
248
- }
249
-
250
- return $crons;
251
- }
252
-
253
- /**
254
- * Retrieves the cron schedules that WPRA uses.
255
- *
256
- * @since 4.17
257
- *
258
- * @return array
259
- */
260
- function wpra_get_cron_schedules()
261
- {
262
- return [
263
- 'five_min' => array(
264
- 'display' => __('Once every 5 minutes', 'wprss'),
265
- 'interval' => MINUTE_IN_SECONDS * 5,
266
- ),
267
- 'ten_min' => array(
268
- 'display' => __('Once every 10 minutes', 'wprss'),
269
- 'interval' => MINUTE_IN_SECONDS * 10,
270
- ),
271
- 'fifteen_min' => array(
272
- 'display' => __('Once every 15 minutes', 'wprss'),
273
- 'interval' => MINUTE_IN_SECONDS * 15,
274
- ),
275
- 'thirty_min' => array(
276
- 'display' => __('Once every 30 minutes', 'wprss'),
277
- 'interval' => MINUTE_IN_SECONDS * 30,
278
- ),
279
- 'two_hours' => array(
280
- 'display' => __('Once every 2 hours', 'wprss'),
281
- 'interval' => HOUR_IN_SECONDS * 2,
282
- ),
283
- 'weekly' => array(
284
- 'display' => __('Once weekly', 'wprss'),
285
- 'interval' => WEEK_IN_SECONDS,
286
- ),
287
- ];
288
- }
289
-
290
- /**
291
- * Registers the cron schedules to WordPress, avoiding duplicates.
292
- *
293
- * @since 3.0
294
- */
295
- function wprss_filter_cron_schedules($schedules)
296
- {
297
- // Pluck out the intervals
298
- $intervals = array_map(function ($schedule) {
299
- return $schedule['interval'];
300
- }, $schedules);
301
- // Get a map of intervals -> keys for fast interval lookup
302
- $intervalsMap = array_flip($intervals);
303
-
304
- // Register each WPRA schedule
305
- $wpraSchedules = wpra_get_cron_schedules();
306
- foreach ($wpraSchedules as $key => $schedule) {
307
- // If the interval already exists, skip the schedule
308
- if (array_key_exists($schedule['interval'], $intervalsMap)) {
309
- continue;
310
- }
311
-
312
- $schedules[$key] = $schedule;
313
- }
314
-
315
- return $schedules;
316
- }
317
-
318
- /**
319
- * Deletes a custom cron schedule.
320
- *
321
- * Credits: WPCrontrol
322
- *
323
- * @since 3.7
324
- *
325
- * @param string $name The internal_name of the schedule to delete.
326
- */
327
- function wprss_delete_schedule($name)
328
- {
329
- $scheds = get_option('crontrol_schedules', array());
330
- unset($scheds[$name]);
331
- update_option('crontrol_schedules', $scheds);
332
- }
333
-
334
- /**
335
- * Parses the date time string into a UTC timestamp.
336
- * The string must be in the format: m/d/y h:m:s
337
- *
338
- * @since 3.9
339
- */
340
- function wprss_strtotime($str)
341
- {
342
- if (empty($str)) {
343
- return 0;
344
- }
345
-
346
- $parts = explode(' ', $str);
347
- $date = explode('/', $parts[0]);
348
- $time = explode(':', $parts[1]);
349
-
350
- return mktime($time[0], $time[1], $time[2], $date[1], $date[0], $date[2]);
351
- }
352
-
353
- /**
354
- * Returns the default value for the per feed source update interval
355
- *
356
- * @since 3.9
357
- */
358
- function wprss_get_default_feed_source_update_interval()
359
- {
360
- return 'global';
361
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ define('WPRA_FETCH_ALL_FEEDS_HOOK', 'wprss_fetch_all_feeds_hook');
4
+ define('WPRA_FETCH_FEED_HOOK', 'wprss_fetch_single_feed_hook');
5
+ define('WPRA_TRUNCATE_ITEMS_HOOK', 'wprss_truncate_posts_hook');
6
+ define('WPRA_ACTIVATE_FEED_HOOK', 'wprss_activate_feed_schedule_hook');
7
+ define('WPRA_PAUSE_FEED_HOOK', 'wprss_pause_feed_schedule_hook');
8
+
9
+ define('WPRA_TRUNCATE_ITEMS_INTERVAL', 'daily');
10
+
11
+ /**
12
+ * Alias for add_action, primarily used for readability to distinguish between cron-events and normal hooks.
13
+ *
14
+ * @since 4.17
15
+ *
16
+ * @param string $cron The cron hook event.
17
+ * @param callable $callback The callback to invoke for the cron.
18
+ */
19
+ function wpra_on_cron_do($cron, $callback)
20
+ {
21
+ add_action($cron, $callback);
22
+ }
23
+
24
+ // Cron events
25
+ wpra_on_cron_do(WPRA_FETCH_ALL_FEEDS_HOOK, 'wprss_fetch_insert_all_feed_items_from_cron');
26
+ wpra_on_cron_do(WPRA_TRUNCATE_ITEMS_HOOK, 'wprss_truncate_posts');
27
+ wpra_on_cron_do(WPRA_ACTIVATE_FEED_HOOK, 'wprss_activate_feed_source');
28
+ wpra_on_cron_do(WPRA_PAUSE_FEED_HOOK, 'wprss_pause_feed_source');
29
+
30
+ // Initialize crons that must always be scheduled
31
+ add_action('init', 'wpra_init_crons');
32
+
33
+ // When a feed source is activated, schedule its fetch cron
34
+ add_action('wprss_on_feed_source_activated', 'wprss_feed_source_update_start_schedule');
35
+
36
+ // When a feed source is paused, cancel its fetch cron
37
+ add_action('wprss_on_feed_source_paused', 'wprss_feed_source_update_stop_schedule');
38
+
39
+ // Filter the possible cron intervals to add more options
40
+ add_filter('cron_schedules', 'wprss_filter_cron_schedules');
41
+
42
+ /**
43
+ * Initializes the cron jobs.
44
+ *
45
+ * @since 4.17
46
+ */
47
+ function wpra_init_crons()
48
+ {
49
+ wprss_schedule_fetch_all_feeds_cron();
50
+ wprss_schedule_truncate_posts_cron();
51
+ }
52
+
53
+ /**
54
+ * Creates the cron to fetch feeds.
55
+ *
56
+ * @since 2.0
57
+ */
58
+ function wprss_schedule_fetch_all_feeds_cron()
59
+ {
60
+ // Check if the global fetch is scheduled
61
+ if (wp_next_scheduled(WPRA_FETCH_ALL_FEEDS_HOOK)) {
62
+ return;
63
+ }
64
+
65
+ // If the event is not scheduled, schedule it
66
+ $interval = wprss_get_general_setting('cron_interval');
67
+ wp_schedule_event(time(), $interval, WPRA_FETCH_ALL_FEEDS_HOOK);
68
+ }
69
+
70
+ /**
71
+ * Gets the time of the global fetch cron.
72
+ *
73
+ * @since 4.17
74
+ *
75
+ * @return false|string A time string in the form `H:i`
76
+ */
77
+ function wprss_get_global_update_time()
78
+ {
79
+ // If the global fetch cron is not scheduled, schedule it
80
+ wprss_schedule_fetch_all_feeds_cron();
81
+
82
+ // Get the timestamp for the next run
83
+ $next = wp_next_scheduled(WPRA_FETCH_ALL_FEEDS_HOOK);
84
+
85
+ return date('H:i', $next);
86
+ }
87
+
88
+ /**
89
+ * Creates the cron to truncate wprss_feed_item posts daily
90
+ *
91
+ * @since 2.0
92
+ */
93
+ function wprss_schedule_truncate_posts_cron()
94
+ {
95
+ // Check if the truncatation cron is scheduled
96
+ if (wp_next_scheduled(WPRA_TRUNCATE_ITEMS_HOOK)) {
97
+ return;
98
+ }
99
+
100
+ // If not, schedule it
101
+ wp_schedule_event(time(), WPRA_TRUNCATE_ITEMS_INTERVAL, WPRA_TRUNCATE_ITEMS_HOOK);
102
+ }
103
+
104
+ /**
105
+ * Updates the feed processing cron job schedules.
106
+ * Removes the current schedules and adds the ones in the feed source's meta.
107
+ *
108
+ * @since 3.8
109
+ *
110
+ * @param int $feed_id The id of the wprss_feed
111
+ */
112
+ function wprss_update_feed_processing_schedules($feed_id)
113
+ {
114
+ // Get the feed's activate and pause times
115
+ $activate = get_post_meta($feed_id, 'wprss_activate_feed', true);
116
+ $pause = get_post_meta($feed_id, 'wprss_pause_feed', true);
117
+
118
+ // Parse as time strings
119
+ $activate = wprss_strtotime($activate);
120
+ $pause = wprss_strtotime($pause);
121
+
122
+ if (!empty($activate)) {
123
+ wpra_reschedule($activate, WPRA_ACTIVATE_FEED_HOOK, null, [$feed_id]);
124
+ }
125
+
126
+ if ($pause !== '') {
127
+ wpra_reschedule($pause, WPRA_PAUSE_FEED_HOOK, null, [$feed_id]);
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Starts the looping schedule for a feed source. Runs on a schedule
133
+ *
134
+ * @since 3.9
135
+ *
136
+ * @param int $feed_id The ID of the feed source
137
+ */
138
+ function wprss_feed_source_update_start_schedule($feed_id)
139
+ {
140
+ // Stop any currently scheduled update operations
141
+ wprss_feed_source_update_stop_schedule($feed_id);
142
+
143
+ // Get the interval
144
+ $interval = get_post_meta($feed_id, 'wprss_update_interval', true);
145
+ // Do nothing if the feed source has no update interval (not sure if possible) or if the interval
146
+ // is set to global
147
+ if ($interval === '' || $interval === wprss_get_default_feed_source_update_interval()) {
148
+ return;
149
+ }
150
+
151
+ wp_schedule_event(time(), $interval, WPRA_FETCH_FEED_HOOK, [strval($feed_id)]);
152
+ }
153
+
154
+ /**
155
+ * Stops any scheduled update operations for a feed source. Runs on a schedule.
156
+ *
157
+ * @since 3.9
158
+ *
159
+ * @param int $feed_id The ID of the feed source ( wprss_feed )
160
+ */
161
+ function wprss_feed_source_update_stop_schedule($feed_id)
162
+ {
163
+ $timestamp = wprss_get_next_feed_source_update($feed_id);
164
+
165
+ // If a schedule exists, unschedule it
166
+ if ($timestamp !== false) {
167
+ wp_unschedule_event($timestamp, WPRA_FETCH_FEED_HOOK, [strval($feed_id)]);
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Returns the timestamp for the next global update
173
+ *
174
+ * @since 4.18
175
+ *
176
+ * @return int The timestamp of the next global update operation, or false if no update is scheduled.
177
+ */
178
+ function wprss_get_next_global_update()
179
+ {
180
+ return wp_next_scheduled(WPRA_FETCH_ALL_FEEDS_HOOK, []);
181
+ }
182
+
183
+ /**
184
+ * Returns the timestamp for the next feed source update
185
+ *
186
+ * @since 3.9
187
+ *
188
+ * @param int $feed_id The ID of the feed source ( wprss_feed )
189
+ * @param bool $explicit If true, the function won't default to the global update if the feed doesn't use its own
190
+ * update interval.
191
+ *
192
+ * @return int The timestamp of the next update operation, or false if no update is scheduled.
193
+ */
194
+ function wprss_get_next_feed_source_update($feed_id, $explicit = true)
195
+ {
196
+ $next = wp_next_scheduled(WPRA_FETCH_FEED_HOOK, [strval($feed_id)]);
197
+
198
+ if ($explicit) {
199
+ return $next;
200
+ }
201
+
202
+ $meta = get_post_meta($feed_id, 'wprss_update_interval', true);
203
+
204
+ return (empty($meta) || $meta === wprss_get_default_feed_source_update_interval())
205
+ ? wprss_get_next_global_update()
206
+ : $next;
207
+ }
208
+
209
+ /**
210
+ * Reschedules a cron event, unscheduling any existing matching crons.
211
+ *
212
+ * @since 4.17
213
+ *
214
+ * @param int $timestamp The timestamp.
215
+ * @param string $event The hook event.
216
+ * @param string|null $recurrence The recurrence.
217
+ * @param array $args Additional args.
218
+ */
219
+ function wpra_reschedule($timestamp, $event, $recurrence = null, $args = [])
220
+ {
221
+ $existing = wp_next_scheduled($event, $args);
222
+
223
+ if ($existing !== false) {
224
+ wp_unschedule_event($existing, $event, $args);
225
+ }
226
+
227
+ if ($recurrence === null) {
228
+ wp_schedule_single_event($timestamp, $event, $args);
229
+ } else {
230
+ wp_schedule_event($timestamp, $recurrence, $event, $args);
231
+ }
232
+ }
233
+
234
+ /**
235
+ * Clears all events scheduled to a particular hook, regardless of their args.
236
+ *
237
+ * @since 4.17.9
238
+ *
239
+ * @param string $hook
240
+ */
241
+ function wpra_clear_all_scheduled_hooks($hook)
242
+ {
243
+ foreach (wpra_get_crons() as $key => $events) {
244
+ if ($key === $hook) {
245
+ foreach ($events as $event) {
246
+ wp_clear_scheduled_hook($key, $event->args);
247
+ }
248
+ }
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Retrieves all cron jobs from WordPress.
254
+ *
255
+ * @since 4.17.9
256
+ *
257
+ * @return array A mapping of hook names to sub-arrays of even objects.
258
+ */
259
+ function wpra_get_crons()
260
+ {
261
+ $cronsArray = _get_cron_array();
262
+ $crons = [];
263
+ foreach ($cronsArray as $ts => $list) {
264
+ foreach ($list as $hook => $events) {
265
+ $crons[$hook] = isset($crons[$hook]) ? $crons[$hook] : [];
266
+
267
+ foreach ($events as $event) {
268
+ $crons[$hook][] = (object) $event;
269
+ }
270
+ }
271
+ }
272
+
273
+ return $crons;
274
+ }
275
+
276
+ /**
277
+ * Retrieves the cron schedules that WPRA uses.
278
+ *
279
+ * @since 4.17
280
+ *
281
+ * @return array
282
+ */
283
+ function wpra_get_cron_schedules()
284
+ {
285
+ return [
286
+ 'five_min' => array(
287
+ 'display' => __('Once every 5 minutes', 'wprss'),
288
+ 'interval' => MINUTE_IN_SECONDS * 5,
289
+ ),
290
+ 'ten_min' => array(
291
+ 'display' => __('Once every 10 minutes', 'wprss'),
292
+ 'interval' => MINUTE_IN_SECONDS * 10,
293
+ ),
294
+ 'fifteen_min' => array(
295
+ 'display' => __('Once every 15 minutes', 'wprss'),
296
+ 'interval' => MINUTE_IN_SECONDS * 15,
297
+ ),
298
+ 'thirty_min' => array(
299
+ 'display' => __('Once every 30 minutes', 'wprss'),
300
+ 'interval' => MINUTE_IN_SECONDS * 30,
301
+ ),
302
+ 'two_hours' => array(
303
+ 'display' => __('Once every 2 hours', 'wprss'),
304
+ 'interval' => HOUR_IN_SECONDS * 2,
305
+ ),
306
+ 'weekly' => array(
307
+ 'display' => __('Once weekly', 'wprss'),
308
+ 'interval' => WEEK_IN_SECONDS,
309
+ ),
310
+ ];
311
+ }
312
+
313
+ /**
314
+ * Registers the cron schedules to WordPress, avoiding duplicates.
315
+ *
316
+ * @since 3.0
317
+ */
318
+ function wprss_filter_cron_schedules($schedules)
319
+ {
320
+ // Pluck out the intervals
321
+ $intervals = array_map(function ($schedule) {
322
+ return $schedule['interval'];
323
+ }, $schedules);
324
+ // Get a map of intervals -> keys for fast interval lookup
325
+ $intervalsMap = array_flip($intervals);
326
+
327
+ // Register each WPRA schedule
328
+ $wpraSchedules = wpra_get_cron_schedules();
329
+ foreach ($wpraSchedules as $key => $schedule) {
330
+ // If the interval already exists, skip the schedule
331
+ if (array_key_exists($schedule['interval'], $intervalsMap)) {
332
+ continue;
333
+ }
334
+
335
+ $schedules[$key] = $schedule;
336
+ }
337
+
338
+ return $schedules;
339
+ }
340
+
341
+ /**
342
+ * Deletes a custom cron schedule.
343
+ *
344
+ * Credits: WPCrontrol
345
+ *
346
+ * @since 3.7
347
+ *
348
+ * @param string $name The internal_name of the schedule to delete.
349
+ */
350
+ function wprss_delete_schedule($name)
351
+ {
352
+ $scheds = get_option('crontrol_schedules', array());
353
+ unset($scheds[$name]);
354
+ update_option('crontrol_schedules', $scheds);
355
+ }
356
+
357
+ /**
358
+ * Parses the date time string into a UTC timestamp.
359
+ * The string must be in the format: m/d/y h:m:s
360
+ *
361
+ * @since 3.9
362
+ */
363
+ function wprss_strtotime($str)
364
+ {
365
+ if (empty($str)) {
366
+ return 0;
367
+ }
368
+
369
+ $parts = explode(' ', $str);
370
+ $date = explode('/', $parts[0]);
371
+ $time = explode(':', $parts[1]);
372
+
373
+ return mktime($time[0], $time[1], $time[2], $date[1], $date[0], $date[2]);
374
+ }
375
+
376
+ /**
377
+ * Returns the default value for the per feed source update interval
378
+ *
379
+ * @since 3.9
380
+ */
381
+ function wprss_get_default_feed_source_update_interval()
382
+ {
383
+ return 'global';
384
+ }
includes/feed-importing-images.php CHANGED
@@ -451,7 +451,7 @@ function wpra_get_item_content_images($item)
451
  $i = 0;
452
  $images = [];
453
  while (!empty($matches[1][$i])) {
454
- $imageUrl = urldecode(trim($matches[1][$i]));
455
  // Increment early to allow the iteration body to use "continue" statements
456
  $i++;
457
 
@@ -703,6 +703,9 @@ function wpra_media_sideload_image($url = null, $post_id = null, $attach = null,
703
  return new WP_Error('missing', "Need a valid URL and post ID...");
704
  }
705
 
 
 
 
706
  // Check if the image already exists in the media library
707
  $existing = get_posts([
708
  'post_type' => 'attachment',
@@ -724,6 +727,9 @@ function wpra_media_sideload_image($url = null, $post_id = null, $attach = null,
724
  /* @var $img WPRSS_Image_Cache_Image */
725
  $url = apply_filters('wpra/images/url_to_download', $url);
726
 
 
 
 
727
  $img = $images->get($url);
728
  } catch (Exception $e) {
729
  return new WP_Error('could_not_load_image', $e->getMessage(), $url);
@@ -786,6 +792,9 @@ function wpra_media_sideload_image($url = null, $post_id = null, $attach = null,
786
  }
787
  }
788
 
 
 
 
789
  $file_array['name'] = $baseName;
790
 
791
  // set additional wp_posts columns
@@ -849,6 +858,9 @@ function wpra_media_sideload_image($url = null, $post_id = null, $attach = null,
849
  // For some reason, deep down filesize() returned 0 for the temporary file without this
850
  clearstatcache(false, $file_array['tmp_name']);
851
 
 
 
 
852
  // $post_data can override the items saved to wp_posts table,
853
  // like post_mime_type, guid, post_parent, post_title, post_content, post_status
854
  $att_id = media_handle_sideload($file_array, $post_id, '', $post_data);
451
  $i = 0;
452
  $images = [];
453
  while (!empty($matches[1][$i])) {
454
+ $imageUrl = urldecode(trim(html_entity_decode($matches[1][$i])));
455
  // Increment early to allow the iteration body to use "continue" statements
456
  $i++;
457
 
703
  return new WP_Error('missing', "Need a valid URL and post ID...");
704
  }
705
 
706
+ // Allow 10 seconds prior to beginning the actual download
707
+ set_time_limit(10);
708
+
709
  // Check if the image already exists in the media library
710
  $existing = get_posts([
711
  'post_type' => 'attachment',
727
  /* @var $img WPRSS_Image_Cache_Image */
728
  $url = apply_filters('wpra/images/url_to_download', $url);
729
 
730
+ // Allow 30 seconds for the download process
731
+ set_time_limit(30);
732
+
733
  $img = $images->get($url);
734
  } catch (Exception $e) {
735
  return new WP_Error('could_not_load_image', $e->getMessage(), $url);
792
  }
793
  }
794
 
795
+ // Fix for Facebook images that come from a PHP endpoint
796
+ $baseName = str_replace($baseName, 'safe_image.php', 'fb_image.jpeg');
797
+
798
  $file_array['name'] = $baseName;
799
 
800
  // set additional wp_posts columns
858
  // For some reason, deep down filesize() returned 0 for the temporary file without this
859
  clearstatcache(false, $file_array['tmp_name']);
860
 
861
+ // Allocate 10 for WordPress to copy and process the image
862
+ set_time_limit(10);
863
+
864
  // $post_data can override the items saved to wp_posts table,
865
  // like post_mime_type, guid, post_parent, post_title, post_content, post_status
866
  $att_id = media_handle_sideload($file_array, $post_id, '', $post_data);
includes/feed-importing-new.php ADDED
@@ -0,0 +1,407 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace RebelCode\Wpra\Core\Importer;
4
+
5
+ use SimplePie_Item;
6
+ use WP_Post;
7
+
8
+ /**
9
+ * Fetches new items from a feed.
10
+ *
11
+ * @since [*next-version*]
12
+ *
13
+ * @param int|string $feedId The ID of the feed source.
14
+ *
15
+ * @return SimplePie_Item[]
16
+ */
17
+ function fetchNewItems($feedId)
18
+ {
19
+ $feed = get_post($feedId);
20
+ $logger = wpra_get_logger($feedId);
21
+
22
+ if ($feed instanceof WP_Post) {
23
+ $logger->info('Fetching items');
24
+ } else {
25
+ $logger->error('Feed source #{0} does not exist', [$feedId]);
26
+ }
27
+
28
+ // Filter the URL
29
+ $feedUrl = apply_filters('wprss_feed_source_url', $feed->wprss_url, $feedId);
30
+ if ($feedUrl !== $feed->wprss_url) {
31
+ $logger->debug('Filtered RSS URL: {0}', [$feedUrl]);
32
+ }
33
+
34
+ // Validate the URL
35
+ if (!wprss_validate_url($feedUrl)) {
36
+ $logger->error('Feed URL is not valid!');
37
+
38
+ return [];
39
+ }
40
+
41
+ // Get the feed items from the source
42
+ $items = wprss_get_feed_items($feedUrl, $feedId);
43
+ $items = (empty($items) || !is_array($items)) ? [] : $items;
44
+
45
+ // See `wprss_item_comparators` filter
46
+ wprss_sort_items($items);
47
+
48
+ // Apply fixed limit
49
+ {
50
+ $feedLimit = $feed->wprss_limit;
51
+ $globalLimit = wprss_get_general_setting('limit_feed_items_imported');
52
+ $filteredLimits = array_filter([$feedLimit, $globalLimit], function ($limit) {
53
+ return !empty($limit) && intval($limit) > 0;
54
+ });
55
+ $limit = (int) reset($filteredLimits);
56
+
57
+ if ($limit > 0) {
58
+ $preLimitCount = count($items);
59
+ $items = array_slice($items, 0, $limit);
60
+
61
+ $logger->debug('{0} items in the feed, {1} items after applying limit', [
62
+ $preLimitCount,
63
+ $limit,
64
+ ]);
65
+ }
66
+ }
67
+
68
+ // Process "unique titles only" option
69
+ {
70
+ $feedUto = $feed->wprss_unique_titles;
71
+ $globalUto = wprss_get_general_setting('unique_titles');
72
+ $uto = empty($feedUto) ? $globalUto : $feedUto;
73
+ $uto = filter_var($uto, FILTER_VALIDATE_BOOLEAN);
74
+ }
75
+
76
+ $items = apply_filters('wpra/importer/items/before_filters', $items, $feed, $logger);
77
+
78
+ // Gather the titles and permalinks of the items that are being fetched
79
+ $existingTitles = [];
80
+ $existingPermalinks = wprss_get_existing_permalinks($feedId);
81
+
82
+ $newItems = [];
83
+ foreach ($items as $item) {
84
+ // Filter the item
85
+ $item = apply_filters('wpra/importer/item', $item, $feed, $logger);
86
+
87
+ $title = $item->get_title();
88
+ $permalink = wprss_normalize_permalink($item->get_permalink(), $item, $feedId);
89
+
90
+ // Check if already imported
91
+ if (array_key_exists($permalink, $existingPermalinks)) {
92
+ $logger->debug('Skipping item "{0}": already imported', [$title]);
93
+
94
+ continue;
95
+ }
96
+
97
+ // Check if blacklisted
98
+ if (wprss_is_blacklisted($permalink)) {
99
+ $logger->debug('Skipping item "{0}": blacklisted', [$title]);
100
+
101
+ continue;
102
+ }
103
+
104
+ // Check if title exists
105
+ if ($uto) {
106
+ $existingTitles[$title] = 1;
107
+
108
+ if (wprss_item_title_exists($title) || array_key_exists($title, $existingTitles)) {
109
+ $logger->debug('Skipping item "{0}": title is not unique', [$title]);
110
+
111
+ continue;
112
+ }
113
+ }
114
+
115
+ if (apply_filters('wpra/importer/filter_item', true, $item, $feed, $logger)) {
116
+ $newItems[] = $item;
117
+ }
118
+ }
119
+
120
+ $items = apply_filters('wpra/importer/items/after_filters', $items, $feed, $logger);
121
+
122
+ $numOgItems = count($items);
123
+ $numNewItems = count($newItems);
124
+ if ($numOgItems !== $numNewItems) {
125
+ $logger->debug('{0} items were skipped', [$numOgItems - $numNewItems]);
126
+ }
127
+
128
+ // Apply the "per-import" limit
129
+ $importLimit = (int) wprss_get_general_setting('limit_feed_items_per_import');
130
+ if ($importLimit > 0) {
131
+ $items = array_slice($items, 0, $importLimit);
132
+ }
133
+
134
+ return $items;
135
+ }
136
+
137
+ /**
138
+ * Imports a feed item.
139
+ *
140
+ * @since [*next-version*]
141
+ *
142
+ * @param SimplePie_Item $item The item to import.
143
+ * @param int|string $feedId The ID of the feed source.
144
+ *
145
+ * @return bool True if the item was imported successfully, false if importing failed.
146
+ */
147
+ function importItem(SimplePie_Item $item, $feedId)
148
+ {
149
+ $logger = wpra_get_logger($feedId);
150
+ $logger->debug('Importing item "{0}"', [$item->get_title()]);
151
+
152
+ set_time_limit(wprss_get_item_import_time_limit());
153
+
154
+ $lcc = legacyConditionalCheck($item, $feedId);
155
+ $item = $lcc[0];
156
+ $import = $lcc[1];
157
+
158
+ // If item should not be imported,
159
+ // -> return true if the item was imported by other means (not null)
160
+ // -> return false if the item was blocked (is null)
161
+ if (!$import) {
162
+ return $item !== null;
163
+ }
164
+
165
+ $title = trim(html_entity_decode($item->get_title()));
166
+ $title = empty($title) ? $item->get_id() : $title;
167
+
168
+ $enclosure = $item->get_enclosure();
169
+ $enclosureUrl = $enclosure ? $enclosure->get_link() : null;
170
+
171
+ $permalink = htmlspecialchars_decode($item->get_permalink());
172
+ $permalink = wprss_normalize_permalink($permalink, $item, $feedId);
173
+
174
+ $dates = getImportDates($item, $feedId);
175
+ $date = $dates[0];
176
+ $dateGmt = $dates[1];
177
+ $isFuture = $dates[2];
178
+ $status = $isFuture ? 'future' : 'publish';
179
+
180
+ $excerpt = wprss_sanitize_excerpt($item->get_description());
181
+ $content = $item->get_content();
182
+
183
+ $source = getSourceInfo($item);
184
+ $author = getAuthorInfo($item);
185
+
186
+ // Do not let WordPress sanitize the excerpt
187
+ // WordPress sanitizes the excerpt because it's expected to be typed by a user and sent in a POST
188
+ // request. However, our excerpt is being inserted as a raw string with custom sanitization.
189
+ remove_all_filters('excerpt_save_pre');
190
+
191
+ $postData = apply_filters(
192
+ 'wprss_populate_post_data',
193
+ [
194
+ 'post_title' => $title,
195
+ 'post_content' => $content,
196
+ 'post_excerpt' => $excerpt,
197
+ 'post_status' => $status,
198
+ 'post_type' => 'wprss_feed_item',
199
+ 'post_date' => $date,
200
+ 'post_date_gmt' => $dateGmt,
201
+ 'meta_input' => [
202
+ 'wprss_feed_id' => $feedId,
203
+ 'wprss_item_date' => $item->get_date(DATE_ISO8601),
204
+ 'wprss_item_permalink' => $permalink,
205
+ 'wprss_item_enclosure' => $enclosureUrl,
206
+ 'wprss_item_source_name' => $source[0],
207
+ 'wprss_item_source_url' => $source[1],
208
+ 'wprss_item_author' => $author[0],
209
+ 'wprss_item_author_email' => $author[1],
210
+ 'wprss_item_author_link' => $author[2],
211
+ ],
212
+ ],
213
+ $item
214
+ );
215
+
216
+ $postData = apply_filters('wpra/importer/item/post_data', $postData, $item, $feedId);
217
+
218
+ if (defined('ICL_SITEPRESS_VERSION')) {
219
+ @include_once(WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php');
220
+ }
221
+ if (defined('ICL_LANGUAGE_CODE')) {
222
+ $_POST['icl_post_language'] = $language_code = ICL_LANGUAGE_CODE;
223
+ }
224
+
225
+ // Create and insert post object into the DB
226
+ $postId = wp_insert_post($postData);
227
+
228
+ if (is_wp_error($postId)) {
229
+ update_post_meta(
230
+ $feedId,
231
+ 'wprss_error_last_import',
232
+ 'An error occurred while inserting a feed item into the database.'
233
+ );
234
+
235
+ $logger->error('Failed to insert item into the database');
236
+
237
+ return false;
238
+ }
239
+
240
+ do_action('wprss_items_create_post_meta', $postId, $item, $feedId);
241
+ do_action('wpra/importer/item/inserted', $item, $feedId);
242
+
243
+ $logger->notice('Imported item {0}. ID: {1}', [$title, $postId]);
244
+
245
+ return true;
246
+ }
247
+
248
+ /**
249
+ * Runs the legacy "post item conditionals" filter for a feed item.
250
+ *
251
+ * @since [*next-version*]
252
+ *
253
+ * @param SimplePie_Item $item The item.
254
+ * @param int|string $feedId The ID of the feed source.
255
+ *
256
+ * @return array An array with 2 elements:
257
+ * 1. the filtered item, or null if the item was rejected.
258
+ * 2. a boolean that signifies whether the item should be imported or not.
259
+ * A return value containing a non-null item and a false boolean signifies a non-rejected item, but that
260
+ * should still not be imported because it was imported using a non-Core mechanism (ex. Feed to Post).
261
+ */
262
+ function legacyConditionalCheck(SimplePie_Item $item, $feedId)
263
+ {
264
+ $logger = wpra_get_logger($feedId);
265
+
266
+ // Log the callbacks that are hooked into the filter
267
+ $condCallbacks = wpra_get_hook_callbacks('wprss_insert_post_item_conditionals');
268
+ if (count($condCallbacks) > 0) {
269
+ $logger->debug('Hooks for `wprss_insert_post_item_conditionals`:');
270
+
271
+ foreach ($condCallbacks as $callback) {
272
+ $logger->debug('-> {0}', [wprss_format_hook_callback($callback)]);
273
+ }
274
+ }
275
+
276
+ $title = $item->get_title();
277
+ $permalink = htmlspecialchars_decode($item->get_permalink());
278
+ $permalink = wprss_normalize_permalink($permalink, $item, $feedId);
279
+
280
+ $preItem = $item;
281
+ $postItem = apply_filters('wprss_insert_post_item_conditionals', $item, $feedId, $permalink);
282
+ $updateCount = apply_filters('wprss_still_update_import_count', false);
283
+
284
+ if (is_bool($postItem) || $postItem === null) {
285
+ // Item is TRUE, or it's FALSE/NULL but it still counts
286
+ if ($postItem || $updateCount) {
287
+ $logger->debug('Item "{0}" was imported by an add-on or filter', [$title]);
288
+
289
+ return [$preItem, false];
290
+ }
291
+
292
+ // Item was filtered
293
+ if (has_filter('wprss_insert_post_item_conditionals', 'wprss_kf_check_post_item_keywords')) {
294
+ $logger->info('Item "{0}" was rejected by your keyword or tag filtering.', [$title]);
295
+ } else {
296
+ $logger->notice('Item "{0}" was rejected by an add-on or filter.', [$title]);
297
+ }
298
+
299
+ return [null, false];
300
+ } else {
301
+ return [$postItem, true];
302
+ }
303
+ }
304
+
305
+ function getImportDates(SimplePie_Item $item, $feedId)
306
+ {
307
+ $logger = wpra_get_logger($feedId);
308
+
309
+ $dateFormat = 'Y-m-d H:i:s';
310
+ $timestamp = $item->get_gmdate('U');
311
+ $isFuture = false;
312
+
313
+ if ($timestamp) {
314
+ if ($timestamp > time()) {
315
+ $scheduleItemsFilter = apply_filters('wpra/importer/allow_scheduled_items', false);
316
+ $scheduleItemsOption = wprss_get_general_setting('schedule_future_items');
317
+
318
+ if ($scheduleItemsFilter || $scheduleItemsOption) {
319
+ // If can schedule future items, set the post status to "future" (aka scheduled)
320
+ $isFuture = true;
321
+ $logger->debug('Setting future status due to future date');
322
+ } else {
323
+ // If cannot schedule future items, clamp the timestamp to the current time
324
+ $timestamp = min(time(), $timestamp);
325
+ $logger->debug('Date clamped to present time');
326
+ }
327
+ }
328
+ } else {
329
+ // Item has no date ...
330
+ $logger->debug('Item has no date. Using current time');
331
+ $timestamp = time();
332
+ }
333
+
334
+ $date = $item->get_date($dateFormat);
335
+ $dateGmt = gmdate($dateFormat, $timestamp);
336
+
337
+ return [$date, $dateGmt, $isFuture];
338
+ }
339
+
340
+ function getSourceInfo(SimplePie_Item $item)
341
+ {
342
+ /* @var $item SimplePie_Item */
343
+ $feed = $item->get_feed();
344
+
345
+ // Get the source from the RSS item
346
+ $source = $item->get_source();
347
+
348
+ // Get the source name if available. If empty, default to the feed source CPT title
349
+ $name = ($source === null) ? '' : $source->get_title();
350
+ $name = empty($name) ? $feed->get_title() : $name;
351
+
352
+ // Get the source URL if available. If empty, default to the RSS feed's URL
353
+ $url = ($source === null) ? '' : $source->get_permalink();
354
+ $url = empty($url) ? $feed->get_permalink() : $url;
355
+
356
+ return [$name, $url];
357
+ }
358
+
359
+ function getAuthorInfo(SimplePie_Item $item)
360
+ {
361
+ $author = $item->get_author();
362
+
363
+ if ($author) {
364
+ $name = $author->get_name();
365
+ $email = $author->get_email();
366
+ $link = $author->get_link();
367
+ } else {
368
+ $name = '';
369
+ $email = '';
370
+ $link = '';
371
+ }
372
+
373
+ return [$name, $email, $link];
374
+ }
375
+
376
+ function getExcessItems($feedId, $add = 0)
377
+ {
378
+ $limit = getLimit($feedId);
379
+
380
+ if ($limit <= 0) {
381
+ return 0;
382
+ }
383
+
384
+ // Get existing items
385
+ $dbItems = wprss_get_feed_items_for_source($feedId);
386
+ $numDbItems = $dbItems->post_count + $add;
387
+
388
+ if ($numDbItems <= $limit) {
389
+ return 0;
390
+ }
391
+
392
+ $numExcess = $numDbItems - $limit;
393
+
394
+ return array_slice(array_reverse($dbItems->posts), 0, $numExcess);
395
+ }
396
+
397
+ function getLimit($feedId)
398
+ {
399
+ $feedLimit = get_post_meta($feedId, 'wprss_limit', true);
400
+ $globalLimit = wprss_get_general_setting('limit_feed_items_imported');
401
+
402
+ $filteredLimits = array_filter([$feedLimit, $globalLimit], function ($limit) {
403
+ return !empty($limit) && intval($limit) > 0;
404
+ });
405
+
406
+ return (int) reset($filteredLimits);
407
+ }
includes/feed-importing.php CHANGED
@@ -1,257 +1,262 @@
1
  <?php
2
 
3
- /**
4
- * Functions relating to feed importing
5
- *
6
- * @package WPRSSAggregator
7
- */
8
-
9
- // Warning: Order may be important
10
- add_filter('wprss_normalize_permalink', 'wprss_google_news_url_fix', 8);
11
- add_filter('wprss_normalize_permalink', 'wprss_bing_news_url_fix', 9);
12
- add_filter('wprss_normalize_permalink', 'wprss_google_alerts_url_fix', 10);
13
- add_filter('wprss_normalize_permalink', 'wprss_convert_video_permalink', 100);
14
-
15
- // Adds comparators for item sorting
16
- add_filter('wprss_item_comparators', 'wprss_sort_comparators_default');
17
-
18
- add_action( 'wprss_fetch_single_feed_hook', 'wprss_fetch_insert_single_feed_items' );
19
- /**
20
- * The main feed fetching function.
21
- * Fetches the feed items from the source provided and inserts them into the DB.
22
- *
23
- * Called on hook 'wprss_fetch_single_feed_hook'.
24
- *
25
- * @since 3.2
26
- */
27
- function wprss_fetch_insert_single_feed_items( $feed_ID ) {
28
- set_transient('wpra/feeds/importing/' . $feed_ID, true, 0);
29
-
30
- global $wprss_importing_feed;
31
- $wprss_importing_feed = $feed_ID;
32
-
33
- register_shutdown_function('wprss_detect_exec_timeout');
34
-
35
- $importFn = function ($feed_ID) {
36
- $logger = wpra_get_logger($feed_ID);
37
-
38
- $logger->info('Starting import of feed {id}', ['id' => $feed_ID]);
39
-
40
- // Check if the feed source is active.
41
- if ( ! wprss_is_feed_source_active( $feed_ID ) && ! wprss_feed_source_force_next_fetch( $feed_ID ) ) {
42
- $logger->info('Feed is not active. Finished');
43
- return;
44
- }
45
-
46
- // If the feed source is forced for next fetch, remove the force next fetch data
47
- if ( wprss_feed_source_force_next_fetch( $feed_ID ) ) {
48
- delete_post_meta( $feed_ID, 'wprss_force_next_fetch' );
49
- }
50
 
51
- // Truncate old items first
52
- wprss_truncate_items_for_source( $feed_ID );
 
 
 
53
 
54
- // Get the feed source URL from post meta, and filter it
55
- $feed_url = get_post_meta( $feed_ID, 'wprss_url', true );
56
- $feed_url = apply_filters( 'wprss_feed_source_url', $feed_url, $feed_ID );
57
- $logger->debug('Feed source URL: {0}', [$feed_url]);
58
 
59
- // Get the feed limit from post meta
60
- $feed_limit = get_post_meta( $feed_ID, 'wprss_limit', true );
 
 
 
 
 
 
 
 
 
61
 
62
- // If the feed has no individual limit
63
- if ( $feed_limit === '' || intval( $feed_limit ) <= 0 ) {
64
- // Get the global limit
65
- $global_limit = wprss_get_general_setting('limit_feed_items_imported');
66
- // If no global limit is set, mark as NULL
67
- if ( $global_limit === '' || intval($global_limit) <= 0 ) {
68
- $feed_limit = NULL;
69
- }
70
- else $feed_limit = $global_limit;
71
- }
72
 
73
- // Filter the URL for validaty
74
- if ( ! wprss_validate_url( $feed_url ) ) {
75
- $logger->error('Feed URL is not valid!');
76
- } else {
77
- // Get the feed items from the source
78
- $items = wprss_get_feed_items( $feed_url, $feed_ID );
79
 
80
- // If got NULL, convert to an empty array
81
- if ( $items === NULL ) {
82
- $items_to_insert = array();
83
- } else {
84
- // See `wprss_item_comparators` filter
85
- wprss_sort_items($items);
86
-
87
- // If using a limit ...
88
- if ( $feed_limit === NULL ) {
89
- $items_to_insert = $items;
90
- } else {
91
- $items_to_insert = array_slice( $items, 0, $feed_limit );
92
- $logger->debug('{0} items in the feed, {1} items after applying limit', [
93
- count($items),
94
- count($items_to_insert)
95
- ]);
96
- }
97
- }
98
 
99
- $unique_titles_only = get_post_meta($feed_ID, 'wprss_unique_titles', true);
100
- $unique_titles_only = ($unique_titles_only === '')
101
- ? wprss_get_general_setting('unique_titles')
102
- : $unique_titles_only;
103
- $unique_titles_only = filter_var($unique_titles_only, FILTER_VALIDATE_BOOLEAN);
104
- // Gather the titles of the items that are imported
105
- // The import process will check not only the titles in the DB but the titles currently in the feed
106
- $existing_titles = [];
107
 
108
- // Gather the permalinks of existing feed item's related to this feed source
109
- $existing_permalinks = wprss_get_existing_permalinks( $feed_ID );
 
 
 
110
 
111
- // Generate a list of items fetched, that are not already in the DB
112
- $new_items = array();
113
- foreach ( $items_to_insert as $item ) {
114
- $item_title = $item->get_title();
115
- $permalink = wprss_normalize_permalink( $item->get_permalink(), $item, $feed_ID );
116
 
117
- // Check if blacklisted
118
- if (wprss_is_blacklisted($permalink)) {
119
- $logger->debug('Item "{0}" is blacklisted', [$item_title]);
120
 
121
- continue;
122
- }
 
 
123
 
124
- // Check if already imported
125
- if (array_key_exists($permalink, $existing_permalinks)) {
126
- $logger->debug('Item "{0}" already exists in the database', [$item_title]);
127
 
128
- continue;
129
- }
 
 
 
 
 
 
 
 
130
 
131
- // Check if title exists (if the option is enabled)
132
- if ($unique_titles_only) {
133
- $title_exists_db = wprss_item_title_exists($item->get_title());
134
- $title_exists_feed = array_key_exists($item_title, $existing_titles);
135
- $title_exists = $title_exists_db || $title_exists_feed;
136
- // Add this item's title to the list to check against
137
- $existing_titles[$item_title] = 1;
138
 
139
- if ($title_exists) {
140
- $logger->debug('An item with the title "{0}" already exists', [$item_title]);
 
 
 
 
141
 
142
- continue;
143
- }
144
- }
 
 
 
 
 
 
 
 
145
 
146
- $new_items[] = $item;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
  }
148
 
149
- $original_count = count( $items_to_insert );
150
- $new_count = count( $new_items );
 
151
 
152
- if ( $new_count !== $original_count ) {
153
- $logger->debug('{0} will be skipped', [$original_count - $new_count]);
154
  }
155
 
156
- $items_to_insert = $new_items;
157
- $per_import = wprss_get_general_setting('limit_feed_items_per_import');
158
- if (!empty($per_import)) {
159
- $items_to_insert = array_slice( $items_to_insert, 0, $per_import );
160
- }
 
 
161
 
162
- // If using a limit - delete any excess items to make room for the new items
163
- if ( $feed_limit !== NULL ) {
164
- // Get the number of feed items in DB, and their count
165
- $db_feed_items = wprss_get_feed_items_for_source( $feed_ID );
166
- $num_db_feed_items = $db_feed_items->post_count;
167
-
168
- // Get the number of feed items we can store until we reach the limit
169
- $num_can_insert = $feed_limit - $num_db_feed_items;
170
- // Calculate how many feed items we must delete before importing, to keep to the limit
171
- $num_new_items = count( $new_items );
172
- $num_feed_items_to_delete = $num_can_insert > $num_new_items
173
- ? 0
174
- : $num_new_items - $num_can_insert;
175
-
176
- // Get an array with the DB feed items in reverse order (oldest first)
177
- $db_feed_items_reversed = array_reverse( $db_feed_items->posts );
178
- // Cut the array to get only the first few that are to be deleted ( equal to $num_feed_items_to_delete )
179
- $feed_items_to_delete = array_slice( $db_feed_items_reversed, 0, $num_feed_items_to_delete );
180
-
181
- // Iterate the feed items and delete them
182
- $num_items_deleted = 0;
183
- foreach ( $feed_items_to_delete as $key => $post ) {
184
- wp_delete_post( $post->ID, TRUE );
185
- $num_items_deleted++;
186
- }
187
 
188
- if ($num_items_deleted > 0) {
189
- $logger->info('Deleted the oldest {0} items', [$num_items_deleted]);
190
  }
191
  }
192
 
193
- update_post_meta( $feed_ID, 'wprss_last_update', $last_update_time = time() );
194
- update_post_meta( $feed_ID, 'wprss_last_update_items', 0 );
 
 
 
195
 
196
- // Insert the items into the db
197
- if ( !empty( $items_to_insert ) ) {
198
- wprss_items_insert_post( $items_to_insert, $feed_ID );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  }
200
  }
201
 
202
- $next_scheduled = get_post_meta( $feed_ID, 'wprss_reschedule_event', TRUE );
 
203
 
204
- if ( $next_scheduled !== '' ) {
205
- wprss_feed_source_update_start_schedule( $feed_ID );
206
- delete_post_meta( $feed_ID, 'wprss_reschedule_event' );
207
- $logger->info('Scheduled next update');
208
  }
 
209
 
210
- $logger->info('Import completed!');
211
 
212
- };
 
 
 
 
213
 
214
- $importFn($feed_ID);
215
 
216
- delete_transient('wpra/feeds/importing/' . $feed_ID);
217
- wprss_flag_feed_as_idle($feed_ID);
218
- $wprss_importing_feed = null;
219
- }
220
 
 
221
 
222
- /**
223
- * Fetches the feed items from a feed at the given URL.
224
- *
225
- * Called from 'wprss_fetch_insert_single_feed_items'
226
- *
227
- * @since 3.0
228
- */
229
- function wprss_get_feed_items( $feed_url, $source, $force_feed = FALSE ) {
230
- // Add filters and actions prior to fetching the feed items
231
- add_filter( 'wp_feed_cache_transient_lifetime' , 'wprss_feed_cache_lifetime' );
232
 
233
- /* Fetch the feed from the soure URL specified */
234
- $feed = wprss_fetch_feed( $feed_url, $source, $force_feed );
 
 
 
 
 
 
 
 
 
 
235
 
236
- if (is_wp_error($feed)) {
237
- wpra_get_logger($source)->error('Failed to fetch the feed from {0}. Error: {1}', [
238
- $feed_url,
239
- $feed->get_error_message()
240
- ]);
241
 
242
- return NULL;
243
- }
 
 
 
244
 
245
- update_post_meta( $source, 'wprss_site_url', $feed->get_permalink() );
246
- update_post_meta( $source, 'wprss_feed_image', $feed->get_image_url() );
247
 
248
- // Remove previously added filters and actions
249
- remove_filter( 'wp_feed_cache_transient_lifetime' , 'wprss_feed_cache_lifetime' );
250
 
251
- return @$feed->get_items();
252
- }
253
 
254
- //add_action ('cron_request', 'wpse_cron_add_xdebug_cookie', 10, 2) ;
 
 
 
 
 
255
 
256
  /**
257
  * Allow debugging of wp_cron jobs
@@ -261,7 +266,7 @@
261
  *
262
  * @return array $cron_request_array with the current XDEBUG_SESSION cookie added if set
263
  */
264
- function wpse_cron_add_xdebug_cookie ($cron_request_array, $doing_wp_cron)
265
  {
266
  if (empty ($_COOKIE['XDEBUG_SESSION'])) {
267
  return ($cron_request_array) ;
@@ -316,798 +321,810 @@ function wprss_get_feed_cache_dir()
316
  }
317
 
318
 
319
- /**
320
- * A clone of the function 'fetch_feed' in wp-includes/feed.php [line #529]
321
- *
322
- * Called from 'wprss_get_feed_items'
323
- *
324
- * @since 3.5
325
- */
326
- function wprss_fetch_feed($url, $source = null, $param_force_feed = false)
327
- {
328
- // Trim the URL
329
- $url = trim($url);
330
- // Parse the URL
331
- $parsed = wpra_parse_url($url);
332
- // Filter the URL
333
- $url = apply_filters('wpra/importer/feed/url', $url, $parsed);
334
-
335
- // Initialize the Feed
336
- $feed = new SimplePie();
337
- $feed->set_feed_url($url);
338
- $feed->set_autodiscovery_level(SIMPLEPIE_LOCATOR_ALL);
339
-
340
- // If a feed source was passed
341
- if ($source !== null || $param_force_feed) {
342
- // Get the force feed option for the feed source
343
- $force_feed = get_post_meta($source, 'wprss_force_feed', true);
344
- // If turned on, force the feed
345
- if ($force_feed == 'true' || $param_force_feed) {
346
- $feed->force_feed(true);
347
- $feed->set_autodiscovery_level(SIMPLEPIE_LOCATOR_NONE);
348
-
349
- global $wpraNoSslVerification;
350
- $wpraNoSslVerification = true;
351
- }
352
  }
 
 
 
 
 
 
 
 
 
 
 
 
353
 
354
- // Set timeout limit
355
- $fetch_time_limit = wprss_get_feed_fetch_time_limit();
356
- $feed->set_timeout($fetch_time_limit);
357
 
358
- $cacheEnabled = wprss_is_feed_cache_enabled();
359
- $feed->enable_cache($cacheEnabled);
 
 
360
 
361
- if ($cacheEnabled) {
362
- $feed->set_cache_location(wprss_get_feed_cache_dir());
 
 
 
 
 
 
 
 
 
 
 
363
  }
 
 
 
 
 
 
364
 
365
- // Reference array action hook, for the feed object and the URL
366
- do_action_ref_array('wp_feed_options', array(&$feed, $url));
367
 
368
- // Prepare the tags to strip from the feed
369
- $tags_to_strip = apply_filters('wprss_feed_tags_to_strip', $feed->strip_htmltags, $source);
370
- // Strip them
371
- $feed->strip_htmltags($tags_to_strip);
 
 
 
 
 
 
 
 
 
 
372
 
373
- do_action('wprss_fetch_feed_before', $feed, $source);
374
 
375
- // Fetch the feed
376
- $feed->init();
377
- $feed->handle_content_type();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
378
 
379
- do_action('wprss_fetch_feed_after', $feed);
 
 
380
 
381
- // Convert the feed error into a WP_Error, if applicable
382
- if ($feed->error()) {
383
- if ($source !== null) {
384
- $msg = sprintf(__('Failed to fetch the RSS feed. Error: %s', WPRSS_TEXT_DOMAIN), $feed->error());
385
- update_post_meta($source, 'wprss_error_last_import', $msg);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
386
  }
387
- return new WP_Error('simplepie-error', $feed->error(), array('feed' => $feed));
388
  }
389
- // If no error, return the feed and remove any error meta
390
- delete_post_meta($source, 'wprss_error_last_import');
391
- return $feed;
392
- }
393
-
394
-
395
- /**
396
- * Normalizes the given permalink.
397
- *
398
- * @param $permalink The permalink to normalize
399
- * @return string The normalized permalink
400
- * @since 4.2.3
401
- */
402
- function wprss_normalize_permalink( $permalink, $item, $feed_ID) {
403
- // Apply normalization functions on the permalink
404
- $permalink = trim( $permalink );
405
- $permalink = apply_filters( 'wprss_normalize_permalink', $permalink, $item, $feed_ID);
406
- // Return the normalized permalink
407
- return $permalink;
408
- }
409
-
410
-
411
- /**
412
- * Extracts the actual URL from a Google News permalink
413
- *
414
- * @param string $permalink The permalink to normalize.
415
- * @since 4.2.3
416
- */
417
- function wprss_google_news_url_fix($permalink) {
418
- return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?' . preg_quote('news.google.com', '!') . '.*!');
419
- }
420
-
421
-
422
- /**
423
- * Extracts the actual URL from a Google Alerts permalink
424
- *
425
- * @param string $permalink The permalink to normalize.
426
- * @since 4.7.3
427
- */
428
- function wprss_google_alerts_url_fix($permalink) {
429
- return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?(www\.)?' . preg_quote('google.com/url', '!') . '.*!');
430
- }
431
-
432
-
433
- /**
434
- * Extracts the actual URL from a Bing permalink
435
- *
436
- * @param string $permalink The permalink to normalize.
437
- * @since 4.2.3
438
- */
439
- function wprss_bing_news_url_fix($permalink) {
440
- return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?(www\.)?' . preg_quote('bing.com/news', '!') . '.*!');
441
- }
442
-
443
-
444
- /**
445
- * Checks if the permalink is a tracking permalink based on host, and if
446
- * it is, returns the normalized URL of the proper feed item article,
447
- * determined by the named query argument.
448
- *
449
- * Fixes the issue with equivalent Google News etc. items having
450
- * different URLs, that contain randomly generated GET parameters.
451
- * Example:
452
- *
453
- * http://news.google.com/news/url?sa=t&fd=R&ct2=us&ei=V3e9U6izMMnm1QaB1YHoDA&url=http://abcd...
454
- * http://news.google.com/news/url?sa=t&fd=R&ct2=us&ei=One9U-HQLsTp1Aal-oDQBQ&url=http://abcd...
455
- *
456
- * @param string $permalink The permalink URL to check and/or normalize.
457
- * @param string|array $patterns One or an array of host names, for which the URL should be fixed.
458
- * @param string Name of the query argument that specifies the actual URL.
459
- * @return string The normalized URL of the original article, as indicated by the `url`
460
- * parameter in the URL query string.
461
- * @since 4.2.3
462
- */
463
- function wprss_tracking_url_fix( $permalink, $patterns, $argName = 'url' ) {
464
- // Parse the url
465
- $parsed = parse_url( urldecode( html_entity_decode( $permalink ) ) );
466
- $patterns = is_array($patterns) ? $patterns :array($patterns);
467
-
468
- // If parsing failed, return the permalink
469
- if ( $parsed === FALSE || $parsed === NULL ) return $permalink;
470
-
471
- // Determine if it's a tracking item
472
- $isMatch = false;
473
- foreach( $patterns as $_idx => $_pattern ) {
474
- if( preg_match($_pattern, $permalink) ) {
475
- $isMatch = true;
476
- break;
477
- }
478
- }
479
-
480
- if( !$isMatch ) return $permalink;
481
-
482
- // Check if the url GET query string is present
483
- if ( !isset( $parsed['query'] ) ) return $permalink;
484
-
485
- // Parse the query string
486
- $query = array();
487
- parse_str( $parsed['query'], $query );
488
-
489
- // Check if the url GET parameter is present in the query string
490
- if ( !is_array($query) || !isset( $query[$argName] ) ) return $permalink;
491
-
492
- return urldecode( $query[$argName] );
493
- }
494
-
495
-
496
- /**
497
- * Converts YouTube, Vimeo and DailyMotion video urls
498
- * into embedded video player urls.
499
- * If the permalink is not a video url, the permalink is returned as is.
500
- *
501
- * @param $permalink The string permalink url to convert.
502
- * @return A string, with the convert permalink, or the same permalink passed as parameter if
503
- * not a video url.
504
- * @since 4.0
505
- */
506
- function wprss_convert_video_permalink( $permalink ) {
507
- // CHECK PERMALINK FOR VIDEO HOSTS : YOUTUBE, VIMEO AND DAILYMOTION
508
- $found_video_host = preg_match( '/http[s]?:\/\/(www\.)?(youtube|dailymotion|vimeo)\.com\/(.*)/i', $permalink, $matches );
509
-
510
- // If video host was found
511
- if ( $found_video_host !== 0 && $found_video_host !== FALSE ) {
512
-
513
- // Get general options
514
- $options = get_option( 'wprss_settings_general' );
515
- // Get the video link option entry, or false if it does not exist
516
- $video_link = ( isset($options['video_link']) )? $options['video_link'] : 'false';
517
-
518
- // If the video link option is true, change the video URL to its repective host's embedded
519
- // video player URL. Otherwise, leave the permalink as is.
520
- if ( strtolower( $video_link ) === 'true' ) {
521
- $host = $matches[2];
522
- switch( $host ) {
523
- case 'youtube':
524
- preg_match( '/(&|\?)v=([^&]+)/', $permalink, $yt_matches );
525
- $permalink = 'https://www.youtube.com/embed/' . $yt_matches[2];
526
- break;
527
- case 'vimeo':
528
- preg_match( '/(\d*)$/i', $permalink, $vim_matches );
529
- $permalink = 'https://player.vimeo.com/video/' . $vim_matches[0];
530
- break;
531
- case 'dailymotion':
532
- preg_match( '/(\.com\/)(video\/)(.*)/i', $permalink, $dm_matches );
533
- $permalink = 'https://www.dailymotion.com/embed/video/' . $dm_matches[3];
534
- break;
535
- }
536
- }
537
- }
538
-
539
- return $permalink;
540
- }
541
-
542
-
543
- /**
544
- * Insert wprss_feed_item posts into the DB
545
- *
546
- * @since 3.0
547
- *
548
- * @param SimplePie_Item[] $items
549
- * @param int|string $feed_ID
550
- */
551
- function wprss_items_insert_post( $items, $feed_ID ) {
552
- update_post_meta( $feed_ID, 'wprss_feed_is_updating', $update_started_at = time() );
553
- $logger = wpra_get_logger($feed_ID);
554
-
555
- // Gather the permalinks of existing feed item's related to this feed source
556
- $existing_permalinks = wprss_get_existing_permalinks( $feed_ID );
557
-
558
- // Count of items inserted
559
- $items_inserted = 0;
560
-
561
- foreach ( $items as $i => $item ) {
562
-
563
- // Normalize the URL
564
- $permalink = $item->get_permalink(); // Link or enclosure URL
565
- $permalink = htmlspecialchars_decode( $permalink ); // SimplePie encodes HTML special chars
566
-
567
- $logger->debug('Beginning import for item "{0}"', [$item->get_title()]);
568
-
569
- $permalink = wprss_normalize_permalink( $permalink, $item, $feed_ID );
570
-
571
- // Save the enclosure URL
572
- $enclosure_url = '';
573
- $enclosure = $item->get_enclosure(0);
574
-
575
- if ($enclosure && $enclosure->get_link()) {
576
- $enclosure_url = $enclosure->get_link();
577
- }
578
-
579
- // Check if newly fetched item already present in existing feed items,
580
- // if not insert it into wp_posts and insert post meta.
581
- if ( ! ( array_key_exists( $permalink, $existing_permalinks ) ) ) {
582
- // Extend the importing time and refresh the feed's updating flag to reflect that it is active
583
- $time_limit = wprss_get_item_import_time_limit();
584
- set_time_limit( $time_limit );
585
-
586
- global $wp_filter;
587
- if (isset($wp_filter['wprss_insert_post_item_conditionals'])) {
588
- $hook = $wp_filter['wprss_insert_post_item_conditionals'];
589
-
590
- if (count($hook->callbacks) > 0) {
591
- $logger->debug('Hooks for `wprss_insert_post_item_conditionals`:');
592
- }
593
 
594
- foreach ($hook->callbacks as $list) {
595
- foreach ($list as $callback) {
596
- $logger->debug('-> {0}', [wprss_format_hook_callback($callback)]);
597
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
598
  }
599
  }
 
 
 
 
 
 
 
 
 
 
 
600
 
601
- $logger->debug('Checking conditionals ...');
 
 
602
 
603
- // Apply filters that determine if the feed item should be inserted into the DB or not.
604
- $ogItem = $item;
605
- $item = apply_filters( 'wprss_insert_post_item_conditionals', $item, $feed_ID, $permalink );
606
- /* @var $item SimplePie_Item */
607
 
608
- // Check if the imported count should still be updated, even if the item is NULL
609
- $still_update_count = apply_filters( 'wprss_still_update_import_count', FALSE );
 
 
610
 
611
- // If the item is not NULL, continue to inserting the feed item post into the DB
612
- if ( $item !== NULL && !is_bool($item) ) {
613
- $logger->debug('Resuming insertion into DB');
614
 
615
- $post_status = 'publish';
 
 
616
 
617
- // Get the date and GMT date and normalize if not valid or not given by the feed
618
- $format = 'Y-m-d H:i:s';
619
- $timestamp = $item->get_date( 'U' );
620
- $has_date = $timestamp ? true : false;
621
 
622
- if ($has_date) {
623
- $logger->debug('Feed item "{0}" date: {1}', [$item->get_title(), $item->get_date($format)]);
 
624
 
625
- if ($timestamp > time()) {
626
- // Item has a future timestamp ...
627
- $logger->debug('Item "{0}" has a future date', [$item->get_title()]);
 
 
 
 
 
 
 
 
 
 
 
628
 
629
- $schedule_items_filter = apply_filters('wpra/importer/allow_scheduled_items', false);
630
- $schedule_items_option = wprss_get_general_setting('schedule_future_items');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
631
 
632
- if ($schedule_items_filter || $schedule_items_option) {
633
- // If can schedule future items, set the post status to "future" (aka scheduled)
634
- $post_status = 'future';
635
 
636
- $logger->debug('Setting future status');
637
- } else {
638
- // If cannot schedule future items, clamp the timestamp to the current time minus
639
- // 1 second for each iteration done so far
640
- $timestamp = min(time() - $i, $timestamp);
641
 
642
- $logger->debug('Date was clamped to present time');
643
- }
 
 
 
 
644
  }
645
- } else {
646
- // Item has no date ...
647
- $logger->debug('Item "{0}" has no date. Using current time', [$item->get_title()]);
648
- $timestamp = time();
649
  }
650
 
651
- $date = date( $format, $timestamp );
652
- $date_gmt = gmdate( $format, $item->get_gmdate( 'U' ) );
653
-
654
- $logger->debug('Date for "{0}" will be {1}', [$item->get_title(), $date]);
655
-
656
- // Do not let WordPress sanitize the excerpt
657
- // WordPress sanitizes the excerpt because it's expected to be typed by a user and sent in a POST
658
- // request. However, our excerpt is being inserted as a raw string with custom sanitization.
659
- remove_all_filters( 'excerpt_save_pre' );
660
-
661
- $title = trim(html_entity_decode($item->get_title()));
662
- $title = empty($title) ? $item->get_id() : $title;
663
-
664
- // Prepare the item data
665
- $feed_item = apply_filters(
666
- 'wprss_populate_post_data',
667
- array(
668
- 'post_title' => $title,
669
- 'post_content' => $item->get_content(),
670
- 'post_excerpt' => wprss_sanitize_excerpt($item->get_description()),
671
- 'post_status' => $post_status,
672
- 'post_type' => 'wprss_feed_item',
673
- 'post_date' => $date,
674
- 'post_date_gmt' => $date_gmt
675
- ),
676
- $item
677
- );
678
-
679
- if ( defined('ICL_SITEPRESS_VERSION') )
680
- @include_once( WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php' );
681
- if ( defined('ICL_LANGUAGE_CODE') ) {
682
- $_POST['icl_post_language'] = $language_code = ICL_LANGUAGE_CODE;
683
- }
684
-
685
- // Create and insert post object into the DB
686
- $inserted_ID = wp_insert_post( $feed_item );
687
-
688
- if ( !is_wp_error( $inserted_ID ) ) {
689
-
690
- if ( is_object( $inserted_ID ) ) {
691
- if ( isset( $inserted_ID['ID'] ) ) {
692
- $inserted_ID = $inserted_ID['ID'];
693
- }
694
- elseif ( isset( $inserted_ID->ID ) ) {
695
- $inserted_ID = $inserted_ID->ID;
696
- }
697
- }
698
-
699
- $logger->debug('Item "{0}" was inserted into DB, ID: {1}', [
700
- $ogItem->get_title(),
701
- $inserted_ID,
702
- ]);
703
-
704
- // Create and insert post meta into the DB
705
- wprss_items_insert_post_meta( $inserted_ID, $item, $feed_ID, $permalink, $enclosure_url );
706
-
707
- $logger->debug('Inserted meta data for item #{0}', [
708
- $inserted_ID,
709
- ]);
710
-
711
- // Remember newly added permalink
712
- $existing_permalinks[$permalink] = 1;
713
-
714
- // Increment the inserted items counter
715
- $items_inserted++;
716
-
717
- $logger->notice('Finished import for item {0}, ID {1}', [
718
- $ogItem->get_title(),
719
- $inserted_ID,
720
- ]);
721
- }
722
- else {
723
- update_post_meta( $feed_ID, 'wprss_error_last_import', 'An error occurred while inserting a feed item into the database.' );
724
-
725
- $logger->error('Failed to save item "{0}" into the database', [$item->get_title()]);
726
- }
727
- }
728
- // If the item is TRUE, then a hook function in the filter inserted the item.
729
- // increment the inserted counter
730
- elseif ( ( is_bool($item) && $item === TRUE ) || ( $still_update_count === TRUE && $item !== FALSE ) ) {
731
- $logger->debug('Item "{0}" was imported by an add-on or filter', [
732
  $ogItem->get_title(),
 
733
  ]);
734
- $items_inserted++;
735
- } elseif (has_filter('wprss_insert_post_item_conditionals', 'wprss_kf_check_post_item_keywords')) {
736
- $logger->info('Item "{0}" was rejected by your keyword or tag filtering.', [
737
- $ogItem->get_title()
 
 
738
  ]);
739
- } else {
740
- $logger->notice('Item "{0}" was rejected by an add-on or filter.', [
741
- $ogItem->get_title()
 
 
 
 
 
 
 
742
  ]);
743
  }
744
- }
745
- }
746
 
747
- update_post_meta( $feed_ID, 'wprss_last_update_items', $items_inserted );
748
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
749
 
750
- /**
751
- * Inserts the appropriate post meta for feed items.
752
- *
753
- * Called from 'wprss_items_insert_post'
754
- *
755
- * @since 2.3
756
- *
757
- * @param int $inserted_ID The inserted post ID.
758
- * @param SimplePie_Item $item The SimplePie item object.
759
- * @param string $permalink The item's permalink.
760
- * @param string $enclosure_url The URL to the item's enclosure.
761
- */
762
- function wprss_items_insert_post_meta( $inserted_ID, $item, $feed_ID, $permalink, $enclosure_url ) {
763
- update_post_meta( $inserted_ID, 'wprss_item_date', $item->get_date(DATE_ISO8601) );
764
- update_post_meta( $inserted_ID, 'wprss_item_permalink', $permalink );
765
- update_post_meta( $inserted_ID, 'wprss_item_enclosure', $enclosure_url );
766
-
767
- /* @var $item SimplePie_Item */
768
- $feed = $item->get_feed();
769
-
770
- // Get the source from the RSS item
771
- $source = $item->get_source();
772
-
773
- // Get the source name if available. If empty, default to the feed source CPT title
774
- $source_name = ($source === null) ? '' : $source->get_title();
775
- $source_name = empty($source_name) ? $feed->get_title() : $source_name;
776
-
777
- // Get the source URL if available. If empty, default to the RSS feed's URL
778
- $source_url = ($source === null) ? '' : $source->get_permalink();
779
- $source_url = empty($source_url) ? $feed->get_permalink() : $source_url;
780
-
781
- update_post_meta( $inserted_ID, 'wprss_item_source_name', $source_name);
782
- update_post_meta( $inserted_ID, 'wprss_item_source_url', $source_url);
783
-
784
- $author = $item->get_author();
785
- if ($author instanceof SimplePie_Author) {
786
- update_post_meta( $inserted_ID, 'wprss_item_author', $author->get_name() );
787
- update_post_meta( $inserted_ID, 'wprss_item_author_email', $author->get_email() );
788
- update_post_meta( $inserted_ID, 'wprss_item_author_link', $author->get_link() );
789
- }
790
-
791
- update_post_meta( $inserted_ID, 'wprss_feed_id', $feed_ID);
792
- do_action( 'wprss_items_create_post_meta', $inserted_ID, $item, $feed_ID );
793
- }
794
-
795
-
796
- /**
797
- * Returns the time limit for the importing of a single feed item.
798
- * The value if filtered through 'wprss_item_import_time_limit'. The default value is WPRSS_ITEM_IMPORT_TIME_LIMIT.
799
- *
800
- * @since 4.6.6
801
- * @return int The maximum amount of seconds allowed for a single feed item to import.
802
- */
803
- function wprss_get_item_import_time_limit() {
804
- return apply_filters( 'wprss_item_import_time_limit', WPRSS_ITEM_IMPORT_TIME_LIMIT );
805
- }
806
-
807
- /**
808
- * Returns the time limit for a feed fetch operation.
809
- * The value if filtered through 'wprss_feed_fetch_time_limit'. The default value is WPRSS_FEED_FETCH_TIME_LIMIT.
810
- *
811
- * @since 4.6.6
812
- * @return int The maximum amount of seconds allowed for an RSS feed XML document to be fetched.
813
- */
814
- function wprss_get_feed_fetch_time_limit() {
815
- return apply_filters( 'wprss_feed_fetch_time_limit', WPRSS_FEED_FETCH_TIME_LIMIT );
816
- }
817
-
818
-
819
- /**
820
- * Fetches all feed items from all feed sources.
821
- * Iteratively calls 'wprss_fetch_insert_single_feed_items' for all feed sources.
822
- *
823
- * This function is used by the cron job or the debugging functions to get all feeds from all feed sources
824
- *
825
- * @param $all If set to TRUE, the function will pull from all feed sources, regardless of their individual
826
- * update interval. If set to FALSE, only feed sources using the global update system will be updated.
827
- * (Optional) Default: TRUE.
828
- * @since 3.0
829
- */
830
- function wprss_fetch_insert_all_feed_items( $all = TRUE ) {
831
- wpra_get_logger()->info('Beginning import for all feed sources');
832
- // Get all feed sources
833
- $feed_sources = wprss_get_all_feed_sources();
834
-
835
- if( $feed_sources->have_posts() ) {
836
- // Start by getting one feed source, we will cycle through them one by one,
837
- // fetching feed items and adding them to the database in each pass
838
- while ( $feed_sources->have_posts() ) {
839
- $feed_sources->the_post();
840
-
841
- $interval = get_post_meta( get_the_ID(), 'wprss_update_interval', TRUE );
842
- $using_global_interval = ( $interval === wprss_get_default_feed_source_update_interval() || $interval === '' );
843
-
844
- // Check if fetching from all, or if feed source uses the global interval
845
- if ( $all === TRUE || $using_global_interval ) {
846
- wp_schedule_single_event( time(), 'wprss_fetch_single_feed_hook', array( get_the_ID() ) );
847
- }
848
- }
849
- wp_reset_postdata(); // Restore the $post global to the current post in the main query
850
- }
851
- }
852
-
853
-
854
- /**
855
- * Runs the above function with parameter FALSE
856
- *
857
- * @since 3.9
858
- */
859
- function wprss_fetch_insert_all_feed_items_from_cron() {
860
- wprss_fetch_insert_all_feed_items( FALSE );
861
- }
862
-
863
-
864
- /**
865
- * Shutdown function for detecting if the PHP script reaches the maximum execution time limit
866
- * while importing a feed.
867
- *
868
- * @since 4.6.6
869
- */
870
- function wprss_detect_exec_timeout() {
871
- global $wprss_importing_feed;
872
- $feed_ID = (isset($wprss_importing_feed) && !empty($wprss_importing_feed))
873
- ? $wprss_importing_feed
874
- : null;
875
 
876
- if ($feed_ID === null) {
877
- return;
878
- }
 
 
 
 
 
 
 
 
 
 
 
879
 
880
- // Remove the "importing" flag from the feed source
881
- wprss_flag_feed_as_idle($feed_ID);
882
 
883
- // If no error, stop
884
- $error = error_get_last();
885
- if (empty($error)) {
886
- return;
 
 
 
 
887
  }
 
888
 
889
- $msg = sprintf(
890
- __('The importing process failed after %d seconds with the message: "%s"', 'wprss'),
891
- wprss_get_item_import_time_limit(),
892
- $error['message']
893
- );
894
- // Save the error in the feed source's meta and the plugin log
895
- update_post_meta($feed_ID, 'wprss_error_last_import', $msg);
896
- wpra_get_logger($feed_ID)->error($msg);
897
- }
898
 
899
- /**
900
- * Validates a feed item.
901
- *
902
- * @since 4.11.2
903
- *
904
- * @param \SimplePie_Item|mixed $item The item to validate.
905
- *
906
- * @return \SimplePie_Item|null The item, if it passes; otherwise, null.
907
- */
908
- function wprss_item_filter_valid($item)
909
- {
910
- return $item instanceof \SimplePie_Item
911
- ? $item
912
- : null;
 
 
 
 
 
913
  }
914
 
915
- /**
916
- * Sorts items according to settings.
917
- *
918
- * Use the `wprss_item_comparators` filter to change the list of comparators
919
- * used to determine the new order of items. See {@see wprss_items_sort_compare_items()}.
920
- *
921
- * @since 4.11.2
922
- *
923
- * @param \SimplePie_Item[] $items The items list.
924
- * @param \WP_Post $feedSource The feed source, for which to sort, if any.
925
- */
926
- function wprss_sort_items(&$items, $feedSource = null)
927
- {
928
- // Callbacks used to compare items
929
- $comparators = apply_filters('wprss_item_comparators', array());
930
- if (empty($comparators)) {
931
- return;
932
- }
 
 
 
 
 
 
 
 
933
 
934
- try {
935
- usort($items, function ($itemA, $itemB) use ($comparators, $feedSource) {
936
- return wprss_items_sort_compare_items($itemA, $itemB, $comparators, $feedSource);
937
- });
938
- } catch (\InvalidArgumentException $e) {
939
- wpra_get_logger($feedSource)->warning('Encountered an error while sorting the database items: {0}', [
940
- $e->getMessage()
941
- ]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
942
  }
 
943
  }
 
944
 
945
- /**
946
- * Recursively compares two items using a list of comparators.
947
- *
948
- * If a comparator determines that two items are equal, then the items are
949
- * evaluated using the next comparator in list, recursively until one of
950
- * the comparators establishes a difference between items, or the list of
951
- * comparators is exhausted.
952
- *
953
- * @since 4.11.2
954
- *
955
- * @param \SimplePie_Item|mixed $itemA The item being compared;
956
- * @param \SimplePie_Item|mixed $itemB The item being compared to;
957
- * @param callable[] $comparators A list of functions for item comparison.
958
- *
959
- * @return int A result usable as a return value for {@see usort()}.
960
- *
961
- * @throws \InvalidArgumentException If the comparator is not callable.
962
- */
963
- function wprss_items_sort_compare_items($itemA, $itemB, $comparators, $feedSource = null)
964
- {
965
- if (empty($comparators)) {
966
- return 0;
967
- }
968
 
969
- $comparator = array_shift($comparators);
970
- if (!is_callable($comparator)) {
971
- throw new \InvalidArgumentException('Comparator must be callable');
972
- }
 
 
 
 
973
 
974
- $result = call_user_func_array($comparator, array($itemA, $itemB, $feedSource));
975
- if (!$result) {
976
- return wprss_items_sort_compare_items($itemA, $itemB, $comparators);
977
- }
978
 
979
- return $result;
 
 
 
 
 
 
 
 
 
 
 
 
 
980
  }
981
 
982
- /**
983
- * Retrieves a custom field of a feed source, or a general setting if the field doesn't exist.
984
- *
985
- * @since 4.11.2
986
- *
987
- * @param string $key The key of the field or setting.
988
- * @param \WP_Post|null $feedSource The feed source, if any.
989
- * @return type
990
- */
991
- function wprss_get_source_meta_or_setting($key, $feedSource = null)
992
- {
993
- $value = null;
994
- if ($feedSource instanceof \WP_Post) {
995
- $value = $feedSource->{$key};
996
- }
997
 
998
- return $value !== null && $value !== false
999
- ? $value
1000
- : wprss_get_general_setting($key);
 
1001
  }
1002
 
1003
- /**
1004
- * Determines date order of two feed items.
1005
- *
1006
- * Which should come first is determined by `feed_items_import_order` setting.
1007
- *
1008
- * @since 4.11.2
1009
- *
1010
- * @param \SimplePie_Item|mixed $itemA The first item.
1011
- * @param \SimplePie_Item|mixed $itemB The second item.
1012
- * @param \WP_Post|null $feedSource The feed source for which the items are being compared, if any.
1013
- * @return int A comparison result for {@see usort()}.
1014
- */
1015
- function wprss_item_comparator_date($itemA, $itemB, $feedSource = null)
1016
- {
1017
- $sortOrder = wprss_get_source_meta_or_setting('feed_items_import_order', $feedSource);
1018
- if (empty($sortOrder)) {
1019
- return 0;
1020
- }
1021
 
1022
- if (!wprss_item_filter_valid($itemA) || !wprss_item_filter_valid($itemB)) {
1023
- return 0;
1024
- }
 
 
 
 
 
 
 
 
 
 
 
 
1025
 
1026
- $aDate = intval($itemA->get_gmdate('U'));
1027
- $bDate = intval($itemB->get_gmdate('U'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1028
 
1029
- switch ($sortOrder) {
1030
- case 'latest':
1031
- if ($aDate === $bDate) {
1032
- return null;
1033
- }
1034
- return $aDate > $bDate ? -1 : 1;
1035
- break;
 
 
 
1036
 
1037
- case 'oldest':
1038
- return $aDate < $bDate ? -1 : 1;
1039
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1040
 
1041
- case '':
1042
- default:
1043
- return 0;
1044
- break;
1045
- }
1046
  }
1047
 
1048
- /**
1049
- * Retrieves default comparators for sorting.
1050
- *
1051
- * @since 4.11.2
1052
- *
1053
- * @param \WP_Post|null $feedSource The feed source, for which to get comparators, if any.
1054
- *
1055
- * @return callable[] The list of comparators.
1056
- */
1057
- function wprss_sort_comparators_default($feedSource = null)
1058
- {
1059
- $helper = wprss_wp_container()->get('wprss.admin_helper');
1060
- $defaultArgs = array(2 => $feedSource);
1061
- return array(
1062
- $helper->createCommand('wprss_item_comparator_date', $defaultArgs),
1063
- );
1064
  }
1065
 
1066
- /**
1067
- * Sanitizes a post excerpt, cleverly removing all HTML markup while preserving text content and whitespace.
1068
- *
1069
- * @since 4.14
1070
- *
1071
- * @param string $excerpt The excerpt to sanitize.
1072
- *
1073
- * @return string
1074
- */
1075
- function wprss_sanitize_excerpt($excerpt) {
1076
- // Decode HTML entities back to their respective characters
1077
- $excerpt = html_entity_decode($excerpt);
1078
- // Add a space between any HTML elements
1079
- $excerpt = str_replace('>', ' >', $excerpt);
1080
- // Strip all HTML tags
1081
- $excerpt = strip_tags($excerpt);
1082
- // Remove any redundant spaces
1083
- $excerpt = str_replace(' ', ' ', trim($excerpt));
1084
-
1085
- return $excerpt;
1086
  }
1087
 
1088
- /**
1089
- * Parses a URL, it's query and its path.
1090
- *
1091
- * @since 4.14
1092
- *
1093
- * @param string $url The URL to parse.
1094
- *
1095
- * @return array
1096
- */
1097
- function wpra_parse_url($url)
1098
- {
1099
- // Parse the URL
1100
- $parsed = parse_url($url);
1101
-
1102
- // Move the path to "path_str"
1103
- $parsed['path_str'] = isset($parsed['path']) ? $parsed['path'] : '';
1104
- // Explode the path
1105
- $parsed['path'] = explode('/', $parsed['path_str']);
1106
-
1107
- // Move the query to "query_str"
1108
- $parsed['query_str'] = isset($parsed['query']) ? $parsed['query'] : '';
1109
- // Parse the query
1110
- parse_str($parsed['query_str'], $parsed['query']);
1111
-
1112
- return $parsed;
1113
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
 
3
+ /**
4
+ * Functions relating to feed importing
5
+ *
6
+ * @package WPRSSAggregator
7
+ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
+ // Warning: Order may be important
10
+ add_filter('wprss_normalize_permalink', 'wprss_google_news_url_fix', 8);
11
+ add_filter('wprss_normalize_permalink', 'wprss_bing_news_url_fix', 9);
12
+ add_filter('wprss_normalize_permalink', 'wprss_google_alerts_url_fix', 10);
13
+ add_filter('wprss_normalize_permalink', 'wprss_convert_video_permalink', 100);
14
 
15
+ // Adds comparators for item sorting
16
+ add_filter('wprss_item_comparators', 'wprss_sort_comparators_default');
 
 
17
 
18
+ add_action( 'wprss_fetch_single_feed_hook', 'wprss_fetch_insert_single_feed_items' );
19
+ /**
20
+ * The main feed fetching function.
21
+ * Fetches the feed items from the source provided and inserts them into the DB.
22
+ *
23
+ * Called on hook 'wprss_fetch_single_feed_hook'.
24
+ *
25
+ * @since 3.2
26
+ */
27
+ function wprss_fetch_insert_single_feed_items( $feed_ID ) {
28
+ set_transient('wpra/feeds/importing/' . $feed_ID, true, 0);
29
 
30
+ global $wprss_importing_feed;
31
+ $wprss_importing_feed = $feed_ID;
 
 
 
 
 
 
 
 
32
 
33
+ register_shutdown_function('wprss_detect_exec_timeout');
 
 
 
 
 
34
 
35
+ $importFn = function ($feed_ID) {
36
+ $logger = wpra_get_logger($feed_ID);
37
+ $logger->info('Starting import of feed {id}', ['id' => $feed_ID]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
+ $t = microtime(true);
 
 
 
 
 
 
 
40
 
41
+ // Check if the feed source is active.
42
+ if ( ! wprss_is_feed_source_active( $feed_ID ) && ! wprss_feed_source_force_next_fetch( $feed_ID ) ) {
43
+ $logger->info('Feed is not active. Finished');
44
+ return;
45
+ }
46
 
47
+ // If the feed source is forced for next fetch, remove the force next fetch data
48
+ if ( wprss_feed_source_force_next_fetch( $feed_ID ) ) {
49
+ delete_post_meta( $feed_ID, 'wprss_force_next_fetch' );
50
+ }
 
51
 
52
+ // Truncate old items first
53
+ wprss_truncate_items_for_source( $feed_ID );
 
54
 
55
+ // Get the feed source URL from post meta, and filter it
56
+ $feed_url = get_post_meta( $feed_ID, 'wprss_url', true );
57
+ $feed_url = apply_filters( 'wprss_feed_source_url', $feed_url, $feed_ID );
58
+ $logger->debug('Feed source URL: {0}', [$feed_url]);
59
 
60
+ // Get the feed limit from post meta
61
+ $feed_limit = get_post_meta( $feed_ID, 'wprss_limit', true );
 
62
 
63
+ // If the feed has no individual limit
64
+ if ( $feed_limit === '' || intval( $feed_limit ) <= 0 ) {
65
+ // Get the global limit
66
+ $global_limit = wprss_get_general_setting('limit_feed_items_imported');
67
+ // If no global limit is set, mark as NULL
68
+ if ( $global_limit === '' || intval($global_limit) <= 0 ) {
69
+ $feed_limit = NULL;
70
+ }
71
+ else $feed_limit = $global_limit;
72
+ }
73
 
74
+ // Filter the URL for validaty
75
+ if ( ! wprss_validate_url( $feed_url ) ) {
76
+ $logger->error('Feed URL is not valid!');
77
+ } else {
78
+ // Get the feed items from the source
79
+ $items = wprss_get_feed_items( $feed_url, $feed_ID );
 
80
 
81
+ // If got NULL, convert to an empty array
82
+ if ( $items === NULL ) {
83
+ $items_to_insert = array();
84
+ } else {
85
+ // See `wprss_item_comparators` filter
86
+ wprss_sort_items($items);
87
 
88
+ // If using a limit ...
89
+ if ( $feed_limit === NULL ) {
90
+ $items_to_insert = $items;
91
+ } else {
92
+ $items_to_insert = array_slice( $items, 0, $feed_limit );
93
+ $logger->debug('{0} items in the feed, {1} items after applying limit', [
94
+ count($items),
95
+ count($items_to_insert)
96
+ ]);
97
+ }
98
+ }
99
 
100
+ $unique_titles_only = get_post_meta($feed_ID, 'wprss_unique_titles', true);
101
+ $unique_titles_only = ($unique_titles_only === '')
102
+ ? wprss_get_general_setting('unique_titles')
103
+ : $unique_titles_only;
104
+ $unique_titles_only = filter_var($unique_titles_only, FILTER_VALIDATE_BOOLEAN);
105
+ // Gather the titles of the items that are imported
106
+ // The import process will check not only the titles in the DB but the titles currently in the feed
107
+ $existing_titles = [];
108
+
109
+ // Gather the permalinks of existing feed item's related to this feed source
110
+ $existing_permalinks = wprss_get_existing_permalinks( $feed_ID );
111
+
112
+ // Generate a list of items fetched, that are not already in the DB
113
+ $new_items = array();
114
+ foreach ( $items_to_insert as $item ) {
115
+ $item_title = $item->get_title();
116
+ $permalink = wprss_normalize_permalink( $item->get_permalink(), $item, $feed_ID );
117
+
118
+ // Check if blacklisted
119
+ if (wprss_is_blacklisted($permalink)) {
120
+ $logger->debug('Item "{0}" is blacklisted', [$item_title]);
121
+
122
+ continue;
123
  }
124
 
125
+ // Check if already imported
126
+ if (array_key_exists($permalink, $existing_permalinks)) {
127
+ $logger->debug('Item "{0}" already exists in the database', [$item_title]);
128
 
129
+ continue;
 
130
  }
131
 
132
+ // Check if title exists (if the option is enabled)
133
+ if ($unique_titles_only) {
134
+ $title_exists_db = wprss_item_title_exists($item->get_title());
135
+ $title_exists_feed = array_key_exists($item_title, $existing_titles);
136
+ $title_exists = $title_exists_db || $title_exists_feed;
137
+ // Add this item's title to the list to check against
138
+ $existing_titles[$item_title] = 1;
139
 
140
+ if ($title_exists) {
141
+ $logger->debug('An item with the title "{0}" already exists', [$item_title]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
 
143
+ continue;
 
144
  }
145
  }
146
 
147
+ $new_items[] = $item;
148
+ }
149
+
150
+ $original_count = count( $items_to_insert );
151
+ $new_count = count( $new_items );
152
 
153
+ if ( $new_count !== $original_count ) {
154
+ $logger->debug('{0} will be skipped', [$original_count - $new_count]);
155
+ }
156
+
157
+ $items_to_insert = $new_items;
158
+ $per_import = wprss_get_general_setting('limit_feed_items_per_import');
159
+ if (!empty($per_import)) {
160
+ $items_to_insert = array_slice( $items_to_insert, 0, $per_import );
161
+ }
162
+
163
+ // If using a limit - delete any excess items to make room for the new items
164
+ if ( $feed_limit !== NULL ) {
165
+ // Get the number of feed items in DB, and their count
166
+ $db_feed_items = wprss_get_feed_items_for_source( $feed_ID );
167
+ $num_db_feed_items = $db_feed_items->post_count;
168
+
169
+ // Get the number of feed items we can store until we reach the limit
170
+ $num_can_insert = $feed_limit - $num_db_feed_items;
171
+ // Calculate how many feed items we must delete before importing, to keep to the limit
172
+ $num_new_items = count( $new_items );
173
+ $num_feed_items_to_delete = $num_can_insert > $num_new_items
174
+ ? 0
175
+ : $num_new_items - $num_can_insert;
176
+
177
+ // Get an array with the DB feed items in reverse order (oldest first)
178
+ $db_feed_items_reversed = array_reverse( $db_feed_items->posts );
179
+ // Cut the array to get only the first few that are to be deleted ( equal to $num_feed_items_to_delete )
180
+ $feed_items_to_delete = array_slice( $db_feed_items_reversed, 0, $num_feed_items_to_delete );
181
+
182
+ // Iterate the feed items and delete them
183
+ $num_items_deleted = 0;
184
+ foreach ( $feed_items_to_delete as $key => $post ) {
185
+ wp_delete_post( $post->ID, TRUE );
186
+ $num_items_deleted++;
187
+ }
188
+
189
+ if ($num_items_deleted > 0) {
190
+ $logger->info('Deleted the oldest {0} items', [$num_items_deleted]);
191
  }
192
  }
193
 
194
+ update_post_meta( $feed_ID, 'wprss_last_update', $last_update_time = time() );
195
+ update_post_meta( $feed_ID, 'wprss_last_update_items', 0 );
196
 
197
+ // Insert the items into the db
198
+ if ( !empty( $items_to_insert ) ) {
199
+ wprss_items_insert_post( $items_to_insert, $feed_ID );
 
200
  }
201
+ }
202
 
203
+ $next_scheduled = get_post_meta( $feed_ID, 'wprss_reschedule_event', TRUE );
204
 
205
+ if ( $next_scheduled !== '' ) {
206
+ wprss_feed_source_update_start_schedule( $feed_ID );
207
+ delete_post_meta( $feed_ID, 'wprss_reschedule_event' );
208
+ $logger->info('Scheduled next update');
209
+ }
210
 
211
+ $t = microtime(true) - $t;
212
 
213
+ $logger->info(sprintf('Import completed in %.2f seconds!', $t));
214
+ };
 
 
215
 
216
+ $importFn($feed_ID);
217
 
218
+ delete_transient('wpra/feeds/importing/' . $feed_ID);
219
+ wprss_flag_feed_as_idle($feed_ID);
220
+ $wprss_importing_feed = null;
221
+ }
 
 
 
 
 
 
222
 
223
+ /**
224
+ * Fetches the feed items from a feed at the given URL.
225
+ *
226
+ * Called from 'wprss_fetch_insert_single_feed_items'
227
+ *
228
+ * @since 3.0
229
+ *
230
+ * @return SimplePie_Item[]|null
231
+ */
232
+ function wprss_get_feed_items( $feed_url, $source, $force_feed = FALSE ) {
233
+ // Add filters and actions prior to fetching the feed items
234
+ add_filter( 'wp_feed_cache_transient_lifetime' , 'wprss_feed_cache_lifetime' );
235
 
236
+ /* Fetch the feed from the soure URL specified */
237
+ $feed = wprss_fetch_feed( $feed_url, $source, $force_feed );
 
 
 
238
 
239
+ if (is_wp_error($feed)) {
240
+ wpra_get_logger($source)->error('Failed to fetch the feed from {0}. Error: {1}', [
241
+ $feed_url,
242
+ $feed->get_error_message()
243
+ ]);
244
 
245
+ return NULL;
246
+ }
247
 
248
+ update_post_meta( $source, 'wprss_site_url', $feed->get_permalink() );
249
+ update_post_meta( $source, 'wprss_feed_image', $feed->get_image_url() );
250
 
251
+ // Remove previously added filters and actions
252
+ remove_filter( 'wp_feed_cache_transient_lifetime' , 'wprss_feed_cache_lifetime' );
253
 
254
+ return @$feed->get_items();
255
+ }
256
+
257
+ if (defined('WP_DEBUG') && WP_DEBUG) {
258
+ add_action ('cron_request', 'wpse_cron_add_xdebug_cookie', 10) ;
259
+ }
260
 
261
  /**
262
  * Allow debugging of wp_cron jobs
266
  *
267
  * @return array $cron_request_array with the current XDEBUG_SESSION cookie added if set
268
  */
269
+ function wpse_cron_add_xdebug_cookie ($cron_request_array)
270
  {
271
  if (empty ($_COOKIE['XDEBUG_SESSION'])) {
272
  return ($cron_request_array) ;
321
  }
322
 
323
 
324
+ /**
325
+ * A clone of the function 'fetch_feed' in wp-includes/feed.php [line #529]
326
+ *
327
+ * Called from 'wprss_get_feed_items'
328
+ *
329
+ * @since 3.5
330
+ */
331
+ function wprss_fetch_feed($url, $source = null, $param_force_feed = false)
332
+ {
333
+ // Trim the URL
334
+ $url = trim($url);
335
+ // Parse the URL
336
+ $parsed = wpra_parse_url($url);
337
+ // Filter the URL
338
+ $url = apply_filters('wpra/importer/feed/url', $url, $parsed);
339
+
340
+ // Initialize the Feed
341
+ $feed = new SimplePie();
342
+ $feed->set_feed_url($url);
343
+ $feed->set_autodiscovery_level(SIMPLEPIE_LOCATOR_ALL);
344
+
345
+ // If a feed source was passed
346
+ if ($source !== null || $param_force_feed) {
347
+ // Get the force feed option for the feed source
348
+ $force_feed = get_post_meta($source, 'wprss_force_feed', true);
349
+ // If turned on, force the feed
350
+ if ($force_feed == 'true' || $param_force_feed) {
351
+ $feed->force_feed(true);
352
+ $feed->set_autodiscovery_level(SIMPLEPIE_LOCATOR_NONE);
353
+
354
+ global $wpraNoSslVerification;
355
+ $wpraNoSslVerification = true;
 
356
  }
357
+ }
358
+
359
+ // Set timeout limit
360
+ $fetch_time_limit = wprss_get_feed_fetch_time_limit();
361
+ $feed->set_timeout($fetch_time_limit);
362
+
363
+ $cacheEnabled = wprss_is_feed_cache_enabled();
364
+ $feed->enable_cache($cacheEnabled);
365
+
366
+ if ($cacheEnabled) {
367
+ $feed->set_cache_location(wprss_get_feed_cache_dir());
368
+ }
369
 
370
+ // Reference array action hook, for the feed object and the URL
371
+ do_action_ref_array('wp_feed_options', array(&$feed, $url));
 
372
 
373
+ // Prepare the tags to strip from the feed
374
+ $tags_to_strip = apply_filters('wprss_feed_tags_to_strip', $feed->strip_htmltags, $source);
375
+ // Strip them
376
+ $feed->strip_htmltags($tags_to_strip);
377
 
378
+ do_action('wprss_fetch_feed_before', $feed, $source);
379
+
380
+ // Fetch the feed
381
+ $feed->init();
382
+ $feed->handle_content_type();
383
+
384
+ do_action('wprss_fetch_feed_after', $feed);
385
+
386
+ // Convert the feed error into a WP_Error, if applicable
387
+ if ($feed->error()) {
388
+ if ($source !== null) {
389
+ $msg = sprintf(__('Failed to fetch the RSS feed. Error: %s', WPRSS_TEXT_DOMAIN), $feed->error());
390
+ update_post_meta($source, 'wprss_error_last_import', $msg);
391
  }
392
+ return new WP_Error('simplepie-error', $feed->error(), array('feed' => $feed));
393
+ }
394
+ // If no error, return the feed and remove any error meta
395
+ delete_post_meta($source, 'wprss_error_last_import');
396
+ return $feed;
397
+ }
398
 
 
 
399
 
400
+ /**
401
+ * Normalizes the given permalink.
402
+ *
403
+ * @param string $permalink The permalink to normalize
404
+ * @return string The normalized permalink
405
+ * @since 4.2.3
406
+ */
407
+ function wprss_normalize_permalink( $permalink, $item, $feed_ID) {
408
+ // Apply normalization functions on the permalink
409
+ $permalink = trim( $permalink );
410
+ $permalink = apply_filters( 'wprss_normalize_permalink', $permalink, $item, $feed_ID);
411
+ // Return the normalized permalink
412
+ return $permalink;
413
+ }
414
 
 
415
 
416
+ /**
417
+ * Extracts the actual URL from a Google News permalink
418
+ *
419
+ * @param string $permalink The permalink to normalize.
420
+ * @since 4.2.3
421
+ */
422
+ function wprss_google_news_url_fix($permalink) {
423
+ return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?' . preg_quote('news.google.com', '!') . '.*!');
424
+ }
425
+
426
+
427
+ /**
428
+ * Extracts the actual URL from a Google Alerts permalink
429
+ *
430
+ * @param string $permalink The permalink to normalize.
431
+ * @since 4.7.3
432
+ */
433
+ function wprss_google_alerts_url_fix($permalink) {
434
+ return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?(www\.)?' . preg_quote('google.com/url', '!') . '.*!');
435
+ }
436
+
437
+
438
+ /**
439
+ * Extracts the actual URL from a Bing permalink
440
+ *
441
+ * @param string $permalink The permalink to normalize.
442
+ * @since 4.2.3
443
+ */
444
+ function wprss_bing_news_url_fix($permalink) {
445
+ return wprss_tracking_url_fix($permalink, '!^(https?:\/\/)?(www\.)?' . preg_quote('bing.com/news', '!') . '.*!');
446
+ }
447
+
448
+
449
+ /**
450
+ * Checks if the permalink is a tracking permalink based on host, and if
451
+ * it is, returns the normalized URL of the proper feed item article,
452
+ * determined by the named query argument.
453
+ *
454
+ * Fixes the issue with equivalent Google News etc. items having
455
+ * different URLs, that contain randomly generated GET parameters.
456
+ * Example:
457
+ *
458
+ * http://news.google.com/news/url?sa=t&fd=R&ct2=us&ei=V3e9U6izMMnm1QaB1YHoDA&url=http://abcd...
459
+ * http://news.google.com/news/url?sa=t&fd=R&ct2=us&ei=One9U-HQLsTp1Aal-oDQBQ&url=http://abcd...
460
+ *
461
+ * @param string $permalink The permalink URL to check and/or normalize.
462
+ * @param string|array $patterns One or an array of host names, for which the URL should be fixed.
463
+ * @param string Name of the query argument that specifies the actual URL.
464
+ * @return string The normalized URL of the original article, as indicated by the `url`
465
+ * parameter in the URL query string.
466
+ * @since 4.2.3
467
+ */
468
+ function wprss_tracking_url_fix( $permalink, $patterns, $argName = 'url' ) {
469
+ // Parse the url
470
+ $parsed = parse_url( urldecode( html_entity_decode( $permalink ) ) );
471
+ $patterns = is_array($patterns) ? $patterns :array($patterns);
472
+
473
+ // If parsing failed, return the permalink
474
+ if ( $parsed === FALSE || $parsed === NULL ) return $permalink;
475
+
476
+ // Determine if it's a tracking item
477
+ $isMatch = false;
478
+ foreach( $patterns as $_idx => $_pattern ) {
479
+ if( preg_match($_pattern, $permalink) ) {
480
+ $isMatch = true;
481
+ break;
482
+ }
483
+ }
484
+
485
+ if( !$isMatch ) return $permalink;
486
+
487
+ // Check if the url GET query string is present
488
+ if ( !isset( $parsed['query'] ) ) return $permalink;
489
 
490
+ // Parse the query string
491
+ $query = array();
492
+ parse_str( $parsed['query'], $query );
493
 
494
+ // Check if the url GET parameter is present in the query string
495
+ if ( !is_array($query) || !isset( $query[$argName] ) ) return $permalink;
496
+
497
+ return urldecode( $query[$argName] );
498
+ }
499
+
500
+
501
+ /**
502
+ * Converts YouTube, Vimeo and DailyMotion video urls
503
+ * into embedded video player urls.
504
+ * If the permalink is not a video url, the permalink is returned as is.
505
+ *
506
+ * @param $permalink The string permalink url to convert.
507
+ * @return A string, with the convert permalink, or the same permalink passed as parameter if
508
+ * not a video url.
509
+ * @since 4.0
510
+ */
511
+ function wprss_convert_video_permalink( $permalink ) {
512
+ // CHECK PERMALINK FOR VIDEO HOSTS : YOUTUBE, VIMEO AND DAILYMOTION
513
+ $found_video_host = preg_match( '/http[s]?:\/\/(www\.)?(youtube|dailymotion|vimeo)\.com\/(.*)/i', $permalink, $matches );
514
+
515
+ // If video host was found
516
+ if ( $found_video_host !== 0 && $found_video_host !== FALSE ) {
517
+
518
+ // Get general options
519
+ $options = get_option( 'wprss_settings_general' );
520
+ // Get the video link option entry, or false if it does not exist
521
+ $video_link = ( isset($options['video_link']) )? $options['video_link'] : 'false';
522
+
523
+ // If the video link option is true, change the video URL to its repective host's embedded
524
+ // video player URL. Otherwise, leave the permalink as is.
525
+ if ( strtolower( $video_link ) === 'true' ) {
526
+ $host = $matches[2];
527
+ switch( $host ) {
528
+ case 'youtube':
529
+ preg_match( '/(&|\?)v=([^&]+)/', $permalink, $yt_matches );
530
+ $permalink = 'https://www.youtube.com/embed/' . $yt_matches[2];
531
+ break;
532
+ case 'vimeo':
533
+ preg_match( '/(\d*)$/i', $permalink, $vim_matches );
534
+ $permalink = 'https://player.vimeo.com/video/' . $vim_matches[0];
535
+ break;
536
+ case 'dailymotion':
537
+ preg_match( '/(\.com\/)(video\/)(.*)/i', $permalink, $dm_matches );
538
+ $permalink = 'https://www.dailymotion.com/embed/video/' . $dm_matches[3];
539
+ break;
540
  }
 
541
  }
542
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
543
 
544
+ return $permalink;
545
+ }
546
+
547
+
548
+ /**
549
+ * Insert wprss_feed_item posts into the DB
550
+ *
551
+ * @since 3.0
552
+ *
553
+ * @param SimplePie_Item[] $items
554
+ * @param int|string $feed_ID
555
+ */
556
+ function wprss_items_insert_post( $items, $feed_ID ) {
557
+ update_post_meta( $feed_ID, 'wprss_feed_is_updating', $update_started_at = time() );
558
+ $logger = wpra_get_logger($feed_ID);
559
+
560
+ // Gather the permalinks of existing feed item's related to this feed source
561
+ $existing_permalinks = wprss_get_existing_permalinks( $feed_ID );
562
+
563
+ // Count of items inserted
564
+ $items_inserted = 0;
565
+
566
+ foreach ( $items as $i => $item ) {
567
+
568
+ // Normalize the URL
569
+ $permalink = $item->get_permalink(); // Link or enclosure URL
570
+ $permalink = htmlspecialchars_decode( $permalink ); // SimplePie encodes HTML special chars
571
+
572
+ $logger->debug('Beginning import for item "{0}"', [$item->get_title()]);
573
+
574
+ $permalink = wprss_normalize_permalink( $permalink, $item, $feed_ID );
575
+
576
+ // Save the enclosure URL
577
+ $enclosure_url = '';
578
+ $enclosure = $item->get_enclosure(0);
579
+
580
+ if ($enclosure && $enclosure->get_link()) {
581
+ $enclosure_url = $enclosure->get_link();
582
+ }
583
+
584
+ // Check if newly fetched item already present in existing feed items,
585
+ // if not insert it into wp_posts and insert post meta.
586
+ if ( ! ( array_key_exists( $permalink, $existing_permalinks ) ) ) {
587
+ // Extend the importing time and refresh the feed's updating flag to reflect that it is active
588
+ $time_limit = wprss_get_item_import_time_limit();
589
+ set_time_limit( $time_limit );
590
+
591
+ global $wp_filter;
592
+ if (isset($wp_filter['wprss_insert_post_item_conditionals'])) {
593
+ $hook = $wp_filter['wprss_insert_post_item_conditionals'];
594
+
595
+ if (count($hook->callbacks) > 0) {
596
+ $logger->debug('Hooks for `wprss_insert_post_item_conditionals`:');
597
+ }
598
+
599
+ foreach ($hook->callbacks as $list) {
600
+ foreach ($list as $callback) {
601
+ $logger->debug('-> {0}', [wprss_format_hook_callback($callback)]);
602
  }
603
  }
604
+ }
605
+
606
+ $logger->debug('Checking conditionals ...');
607
+
608
+ // Apply filters that determine if the feed item should be inserted into the DB or not.
609
+ $ogItem = $item;
610
+ $item = apply_filters( 'wprss_insert_post_item_conditionals', $item, $feed_ID, $permalink );
611
+ /* @var $item SimplePie_Item */
612
+
613
+ // Check if the imported count should still be updated, even if the item is NULL
614
+ $still_update_count = apply_filters( 'wprss_still_update_import_count', FALSE );
615
 
616
+ // If the item is not NULL, continue to inserting the feed item post into the DB
617
+ if ( $item !== NULL && !is_bool($item) ) {
618
+ $logger->debug('Resuming insertion into DB');
619
 
620
+ $post_status = 'publish';
 
 
 
621
 
622
+ // Get the date and GMT date and normalize if not valid or not given by the feed
623
+ $format = 'Y-m-d H:i:s';
624
+ $timestamp = $item->get_date( 'U' );
625
+ $has_date = $timestamp ? true : false;
626
 
627
+ if ($has_date) {
628
+ $logger->debug('Feed item "{0}" date: {1}', [$item->get_title(), $item->get_date($format)]);
 
629
 
630
+ if ($timestamp > time()) {
631
+ // Item has a future timestamp ...
632
+ $logger->debug('Item "{0}" has a future date', [$item->get_title()]);
633
 
634
+ $schedule_items_filter = apply_filters('wpra/importer/allow_scheduled_items', false);
635
+ $schedule_items_option = wprss_get_general_setting('schedule_future_items');
 
 
636
 
637
+ if ($schedule_items_filter || $schedule_items_option) {
638
+ // If can schedule future items, set the post status to "future" (aka scheduled)
639
+ $post_status = 'future';
640
 
641
+ $logger->debug('Setting future status');
642
+ } else {
643
+ // If cannot schedule future items, clamp the timestamp to the current time minus
644
+ // 1 second for each iteration done so far
645
+ $timestamp = min(time() - $i, $timestamp);
646
+
647
+ $logger->debug('Date was clamped to present time');
648
+ }
649
+ }
650
+ } else {
651
+ // Item has no date ...
652
+ $logger->debug('Item "{0}" has no date. Using current time', [$item->get_title()]);
653
+ $timestamp = time();
654
+ }
655
 
656
+ $date = date( $format, $timestamp );
657
+ $date_gmt = gmdate( $format, $item->get_gmdate( 'U' ) );
658
+
659
+ $logger->debug('Date for "{0}" will be {1}', [$item->get_title(), $date]);
660
+
661
+ // Do not let WordPress sanitize the excerpt
662
+ // WordPress sanitizes the excerpt because it's expected to be typed by a user and sent in a POST
663
+ // request. However, our excerpt is being inserted as a raw string with custom sanitization.
664
+ remove_all_filters( 'excerpt_save_pre' );
665
+
666
+ $title = trim(html_entity_decode($item->get_title()));
667
+ $title = empty($title) ? $item->get_id() : $title;
668
+
669
+ // Prepare the item data
670
+ $feed_item = apply_filters(
671
+ 'wprss_populate_post_data',
672
+ array(
673
+ 'post_title' => $title,
674
+ 'post_content' => $item->get_content(),
675
+ 'post_excerpt' => wprss_sanitize_excerpt($item->get_description()),
676
+ 'post_status' => $post_status,
677
+ 'post_type' => 'wprss_feed_item',
678
+ 'post_date' => $date,
679
+ 'post_date_gmt' => $date_gmt
680
+ ),
681
+ $item
682
+ );
683
+
684
+ if ( defined('ICL_SITEPRESS_VERSION') )
685
+ @include_once( WP_PLUGIN_DIR . '/sitepress-multilingual-cms/inc/wpml-api.php' );
686
+ if ( defined('ICL_LANGUAGE_CODE') ) {
687
+ $_POST['icl_post_language'] = $language_code = ICL_LANGUAGE_CODE;
688
+ }
689
 
690
+ // Create and insert post object into the DB
691
+ $inserted_ID = wp_insert_post( $feed_item );
 
692
 
693
+ if ( !is_wp_error( $inserted_ID ) ) {
 
 
 
 
694
 
695
+ if ( is_object( $inserted_ID ) ) {
696
+ if ( isset( $inserted_ID['ID'] ) ) {
697
+ $inserted_ID = $inserted_ID['ID'];
698
+ }
699
+ elseif ( isset( $inserted_ID->ID ) ) {
700
+ $inserted_ID = $inserted_ID->ID;
701
  }
 
 
 
 
702
  }
703
 
704
+ $logger->debug('Item "{0}" was inserted into DB, ID: {1}', [
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
705
  $ogItem->get_title(),
706
+ $inserted_ID,
707
  ]);
708
+
709
+ // Create and insert post meta into the DB
710
+ wprss_items_insert_post_meta( $inserted_ID, $item, $feed_ID, $permalink );
711
+
712
+ $logger->debug('Inserted meta data for item #{0}', [
713
+ $inserted_ID,
714
  ]);
715
+
716
+ // Remember newly added permalink
717
+ $existing_permalinks[$permalink] = 1;
718
+
719
+ // Increment the inserted items counter
720
+ $items_inserted++;
721
+
722
+ $logger->notice('Finished import for item {0}, ID {1}', [
723
+ $ogItem->get_title(),
724
+ $inserted_ID,
725
  ]);
726
  }
727
+ else {
728
+ update_post_meta( $feed_ID, 'wprss_error_last_import', 'An error occurred while inserting a feed item into the database.' );
729
 
730
+ $logger->error('Failed to save item "{0}" into the database', [$item->get_title()]);
731
+ }
732
+ }
733
+ // If the item is TRUE, then a hook function in the filter inserted the item.
734
+ // increment the inserted counter
735
+ elseif ( ( is_bool($item) && $item === TRUE ) || ( $still_update_count === TRUE && $item !== FALSE ) ) {
736
+ $logger->debug('Item "{0}" was imported by an add-on or filter', [
737
+ $ogItem->get_title(),
738
+ ]);
739
+ $items_inserted++;
740
+ } elseif (has_filter('wprss_insert_post_item_conditionals', 'wprss_kf_check_post_item_keywords')) {
741
+ $logger->info('Item "{0}" was rejected by your keyword or tag filtering.', [
742
+ $ogItem->get_title()
743
+ ]);
744
+ } else {
745
+ $logger->notice('Item "{0}" was rejected by an add-on or filter.', [
746
+ $ogItem->get_title()
747
+ ]);
748
+ }
749
+ }
750
+ }
751
 
752
+ update_post_meta( $feed_ID, 'wprss_last_update_items', $items_inserted );
753
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
754
 
755
+ /**
756
+ * Inserts the appropriate post meta for feed items.
757
+ *
758
+ * Called from 'wprss_items_insert_post'
759
+ *
760
+ * @since 2.3
761
+ *
762
+ * @param int $inserted_ID The inserted post ID.
763
+ * @param SimplePie_Item $item The SimplePie item object.
764
+ * @param string $permalink The item's permalink.
765
+ */
766
+ function wprss_items_insert_post_meta( $inserted_ID, $item, $feed_ID, $permalink ) {
767
+ update_post_meta( $inserted_ID, 'wprss_item_date', $item->get_date(DATE_ISO8601) );
768
+ update_post_meta( $inserted_ID, 'wprss_item_permalink', $permalink );
769
 
770
+ $enclosure = $item->get_enclosure(0);
771
+ $enclosureUrl = $enclosure ? $enclosure->get_link() : null;
772
 
773
+ if ($enclosureUrl) {
774
+ $enclosureType = $enclosure->get_type();
775
+
776
+ update_post_meta( $inserted_ID, 'wprss_item_enclosure', $enclosureUrl );
777
+ update_post_meta( $inserted_ID, 'wprss_item_enclosure_type', $enclosureType );
778
+
779
+ if (stripos($enclosureType, 'audio')) {
780
+ update_post_meta( $inserted_ID, 'wprss_item_audio', $enclosureUrl );
781
  }
782
+ }
783
 
784
+ /* @var $item SimplePie_Item */
785
+ $feed = $item->get_feed();
 
 
 
 
 
 
 
786
 
787
+ // Get the source from the RSS item
788
+ $source = $item->get_source();
789
+
790
+ // Get the source name if available. If empty, default to the feed source CPT title
791
+ $source_name = ($source === null) ? '' : $source->get_title();
792
+ $source_name = empty($source_name) ? $feed->get_title() : $source_name;
793
+
794
+ // Get the source URL if available. If empty, default to the RSS feed's URL
795
+ $source_url = ($source === null) ? '' : $source->get_permalink();
796
+ $source_url = empty($source_url) ? $feed->get_permalink() : $source_url;
797
+
798
+ update_post_meta( $inserted_ID, 'wprss_item_source_name', $source_name);
799
+ update_post_meta( $inserted_ID, 'wprss_item_source_url', $source_url);
800
+
801
+ $author = $item->get_author();
802
+ if ($author instanceof SimplePie_Author) {
803
+ update_post_meta( $inserted_ID, 'wprss_item_author', $author->get_name() );
804
+ update_post_meta( $inserted_ID, 'wprss_item_author_email', $author->get_email() );
805
+ update_post_meta( $inserted_ID, 'wprss_item_author_link', $author->get_link() );
806
  }
807
 
808
+ update_post_meta( $inserted_ID, 'wprss_feed_id', $feed_ID);
809
+ do_action( 'wprss_items_create_post_meta', $inserted_ID, $item, $feed_ID );
810
+ }
811
+
812
+
813
+ /**
814
+ * Returns the time limit for the importing of a single feed item.
815
+ * The value if filtered through 'wprss_item_import_time_limit'. The default value is WPRSS_ITEM_IMPORT_TIME_LIMIT.
816
+ *
817
+ * @since 4.6.6
818
+ * @return int The maximum amount of seconds allowed for a single feed item to import.
819
+ */
820
+ function wprss_get_item_import_time_limit() {
821
+ return apply_filters( 'wprss_item_import_time_limit', WPRSS_ITEM_IMPORT_TIME_LIMIT );
822
+ }
823
+
824
+ /**
825
+ * Returns the time limit for a feed fetch operation.
826
+ * The value if filtered through 'wprss_feed_fetch_time_limit'. The default value is WPRSS_FEED_FETCH_TIME_LIMIT.
827
+ *
828
+ * @since 4.6.6
829
+ * @return int The maximum amount of seconds allowed for an RSS feed XML document to be fetched.
830
+ */
831
+ function wprss_get_feed_fetch_time_limit() {
832
+ return apply_filters( 'wprss_feed_fetch_time_limit', WPRSS_FEED_FETCH_TIME_LIMIT );
833
+ }
834
 
835
+
836
+ /**
837
+ * Fetches all feed items from all feed sources.
838
+ * Iteratively calls 'wprss_fetch_insert_single_feed_items' for all feed sources.
839
+ *
840
+ * This function is used by the cron job or the debugging functions to get all feeds from all feed sources
841
+ *
842
+ * @param $all If set to TRUE, the function will pull from all feed sources, regardless of their individual
843
+ * update interval. If set to FALSE, only feed sources using the global update system will be updated.
844
+ * (Optional) Default: TRUE.
845
+ * @since 3.0
846
+ */
847
+ function wprss_fetch_insert_all_feed_items( $all = TRUE ) {
848
+ wpra_get_logger()->info('Beginning import for all feed sources');
849
+ // Get all feed sources
850
+ $feed_sources = wprss_get_all_feed_sources();
851
+
852
+ if( $feed_sources->have_posts() ) {
853
+ // Start by getting one feed source, we will cycle through them one by one,
854
+ // fetching feed items and adding them to the database in each pass
855
+ while ( $feed_sources->have_posts() ) {
856
+ $feed_sources->the_post();
857
+
858
+ $interval = get_post_meta( get_the_ID(), 'wprss_update_interval', TRUE );
859
+ $using_global_interval = ( $interval === wprss_get_default_feed_source_update_interval() || $interval === '' );
860
+
861
+ // Check if fetching from all, or if feed source uses the global interval
862
+ if ( $all === TRUE || $using_global_interval ) {
863
+ wp_schedule_single_event( time(), 'wprss_fetch_single_feed_hook', array( get_the_ID() ) );
864
+ }
865
  }
866
+ wp_reset_postdata(); // Restore the $post global to the current post in the main query
867
  }
868
+ }
869
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
870
 
871
+ /**
872
+ * Runs the above function with parameter FALSE
873
+ *
874
+ * @since 3.9
875
+ */
876
+ function wprss_fetch_insert_all_feed_items_from_cron() {
877
+ wprss_fetch_insert_all_feed_items( FALSE );
878
+ }
879
 
 
 
 
 
880
 
881
+ /**
882
+ * Shutdown function for detecting if the PHP script reaches the maximum execution time limit
883
+ * while importing a feed.
884
+ *
885
+ * @since 4.6.6
886
+ */
887
+ function wprss_detect_exec_timeout() {
888
+ global $wprss_importing_feed;
889
+ $feed_ID = (isset($wprss_importing_feed) && !empty($wprss_importing_feed))
890
+ ? $wprss_importing_feed
891
+ : null;
892
+
893
+ if ($feed_ID === null) {
894
+ return;
895
  }
896
 
897
+ // Remove the "importing" flag from the feed source
898
+ wprss_flag_feed_as_idle($feed_ID);
 
 
 
 
 
 
 
 
 
 
 
 
 
899
 
900
+ // If no error, stop
901
+ $error = error_get_last();
902
+ if (empty($error)) {
903
+ return;
904
  }
905
 
906
+ $msg = sprintf(
907
+ __('The importing process failed after %d seconds with the message: "%s"', 'wprss'),
908
+ wprss_get_item_import_time_limit(),
909
+ $error['message']
910
+ );
911
+ // Save the error in the feed source's meta and the plugin log
912
+ update_post_meta($feed_ID, 'wprss_error_last_import', $msg);
913
+ wpra_get_logger($feed_ID)->error($msg);
914
+ }
 
 
 
 
 
 
 
 
 
915
 
916
+ /**
917
+ * Validates a feed item.
918
+ *
919
+ * @since 4.11.2
920
+ *
921
+ * @param \SimplePie_Item|mixed $item The item to validate.
922
+ *
923
+ * @return \SimplePie_Item|null The item, if it passes; otherwise, null.
924
+ */
925
+ function wprss_item_filter_valid($item)
926
+ {
927
+ return $item instanceof \SimplePie_Item
928
+ ? $item
929
+ : null;
930
+ }
931
 
932
+ /**
933
+ * Sorts items according to settings.
934
+ *
935
+ * Use the `wprss_item_comparators` filter to change the list of comparators
936
+ * used to determine the new order of items. See {@see wprss_items_sort_compare_items()}.
937
+ *
938
+ * @since 4.11.2
939
+ *
940
+ * @param \SimplePie_Item[] $items The items list.
941
+ * @param \WP_Post $feedSource The feed source, for which to sort, if any.
942
+ */
943
+ function wprss_sort_items(&$items, $feedSource = null)
944
+ {
945
+ // Callbacks used to compare items
946
+ $comparators = apply_filters('wprss_item_comparators', array());
947
+ if (empty($comparators)) {
948
+ return;
949
+ }
950
 
951
+ try {
952
+ usort($items, function ($itemA, $itemB) use ($comparators, $feedSource) {
953
+ return wprss_items_sort_compare_items($itemA, $itemB, $comparators, $feedSource);
954
+ });
955
+ } catch (\InvalidArgumentException $e) {
956
+ wpra_get_logger($feedSource)->warning('Encountered an error while sorting the database items: {0}', [
957
+ $e->getMessage()
958
+ ]);
959
+ }
960
+ }
961
 
962
+ /**
963
+ * Recursively compares two items using a list of comparators.
964
+ *
965
+ * If a comparator determines that two items are equal, then the items are
966
+ * evaluated using the next comparator in list, recursively until one of
967
+ * the comparators establishes a difference between items, or the list of
968
+ * comparators is exhausted.
969
+ *
970
+ * @since 4.11.2
971
+ *
972
+ * @param \SimplePie_Item|mixed $itemA The item being compared;
973
+ * @param \SimplePie_Item|mixed $itemB The item being compared to;
974
+ * @param callable[] $comparators A list of functions for item comparison.
975
+ *
976
+ * @return int A result usable as a return value for {@see usort()}.
977
+ *
978
+ * @throws \InvalidArgumentException If the comparator is not callable.
979
+ */
980
+ function wprss_items_sort_compare_items($itemA, $itemB, $comparators, $feedSource = null)
981
+ {
982
+ if (empty($comparators)) {
983
+ return 0;
984
+ }
985
 
986
+ $comparator = array_shift($comparators);
987
+ if (!is_callable($comparator)) {
988
+ throw new \InvalidArgumentException('Comparator must be callable');
 
 
989
  }
990
 
991
+ $result = call_user_func_array($comparator, array($itemA, $itemB, $feedSource));
992
+ if (!$result) {
993
+ return wprss_items_sort_compare_items($itemA, $itemB, $comparators);
 
 
 
 
 
 
 
 
 
 
 
 
 
994
  }
995
 
996
+ return $result;
997
+ }
998
+
999
+ /**
1000
+ * Retrieves a custom field of a feed source, or a general setting if the field doesn't exist.
1001
+ *
1002
+ * @since 4.11.2
1003
+ *
1004
+ * @param string $key The key of the field or setting.
1005
+ * @param \WP_Post|null $feedSource The feed source, if any.
1006
+ * @return type
1007
+ */
1008
+ function wprss_get_source_meta_or_setting($key, $feedSource = null)
1009
+ {
1010
+ $value = null;
1011
+ if ($feedSource instanceof \WP_Post) {
1012
+ $value = $feedSource->{$key};
 
 
 
1013
  }
1014
 
1015
+ return $value !== null && $value !== false
1016
+ ? $value
1017
+ : wprss_get_general_setting($key);
1018
+ }
1019
+
1020
+ /**
1021
+ * Determines date order of two feed items.
1022
+ *
1023
+ * Which should come first is determined by `feed_items_import_order` setting.
1024
+ *
1025
+ * @since 4.11.2
1026
+ *
1027
+ * @param \SimplePie_Item|mixed $itemA The first item.
1028
+ * @param \SimplePie_Item|mixed $itemB The second item.
1029
+ * @param \WP_Post|null $feedSource The feed source for which the items are being compared, if any.
1030
+ * @return int A comparison result for {@see usort()}.
1031
+ */
1032
+ function wprss_item_comparator_date($itemA, $itemB, $feedSource = null)
1033
+ {
1034
+ $sortOrder = wprss_get_source_meta_or_setting('feed_items_import_order', $feedSource);
1035
+ if (empty($sortOrder)) {
1036
+ return 0;
 
 
 
1037
  }
1038
+
1039
+ if (!wprss_item_filter_valid($itemA) || !wprss_item_filter_valid($itemB)) {
1040
+ return 0;
1041
+ }
1042
+
1043
+ $aDate = intval($itemA->get_gmdate('U'));
1044
+ $bDate = intval($itemB->get_gmdate('U'));
1045
+
1046
+ switch ($sortOrder) {
1047
+ case 'latest':
1048
+ if ($aDate === $bDate) {
1049
+ return null;
1050
+ }
1051
+ return $aDate > $bDate ? -1 : 1;
1052
+ break;
1053
+
1054
+ case 'oldest':
1055
+ return $aDate < $bDate ? -1 : 1;
1056
+ break;
1057
+
1058
+ case '':
1059
+ default:
1060
+ return 0;
1061
+ break;
1062
+ }
1063
+ }
1064
+
1065
+ /**
1066
+ * Retrieves default comparators for sorting.
1067
+ *
1068
+ * @since 4.11.2
1069
+ *
1070
+ * @param \WP_Post|null $feedSource The feed source, for which to get comparators, if any.
1071
+ *
1072
+ * @return callable[] The list of comparators.
1073
+ */
1074
+ function wprss_sort_comparators_default($feedSource = null)
1075
+ {
1076
+ $helper = wprss_wp_container()->get('wprss.admin_helper');
1077
+ $defaultArgs = array(2 => $feedSource);
1078
+ return array(
1079
+ $helper->createCommand('wprss_item_comparator_date', $defaultArgs),
1080
+ );
1081
+ }
1082
+
1083
+ /**
1084
+ * Sanitizes a post excerpt, cleverly removing all HTML markup while preserving text content and whitespace.
1085
+ *
1086
+ * @since 4.14
1087
+ *
1088
+ * @param string $excerpt The excerpt to sanitize.
1089
+ *
1090
+ * @return string
1091
+ */
1092
+ function wprss_sanitize_excerpt($excerpt) {
1093
+ // Decode HTML entities back to their respective characters
1094
+ $excerpt = html_entity_decode($excerpt);
1095
+ // Add a space between any HTML elements
1096
+ $excerpt = str_replace('>', ' >', $excerpt);
1097
+ // Strip all HTML tags
1098
+ $excerpt = strip_tags($excerpt);
1099
+ // Remove any redundant spaces
1100
+ $excerpt = str_replace(' ', ' ', trim($excerpt));
1101
+
1102
+ return $excerpt;
1103
+ }
1104
+
1105
+ /**
1106
+ * Parses a URL, it's query and its path.
1107
+ *
1108
+ * @since 4.14
1109
+ *
1110
+ * @param string $url The URL to parse.
1111
+ *
1112
+ * @return array
1113
+ */
1114
+ function wpra_parse_url($url)
1115
+ {
1116
+ // Parse the URL
1117
+ $parsed = parse_url($url);
1118
+
1119
+ // Move the path to "path_str"
1120
+ $parsed['path_str'] = isset($parsed['path']) ? $parsed['path'] : '';
1121
+ // Explode the path
1122
+ $parsed['path'] = explode('/', $parsed['path_str']);
1123
+
1124
+ // Move the query to "query_str"
1125
+ $parsed['query_str'] = isset($parsed['query']) ? $parsed['query'] : '';
1126
+ // Parse the query
1127
+ parse_str($parsed['query_str'], $parsed['query']);
1128
+
1129
+ return $parsed;
1130
+ }
includes/functions.php CHANGED
@@ -108,6 +108,34 @@ function wpra_get_activate_plugin_url($basename)
108
  );
109
  }
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  /**
112
  * Returns a representation of an HTML expression that matches all representations of that HTML.
113
  *
108
  );
109
  }
110
 
111
+ /**
112
+ * Retrieves the callbacks that are attached to a hook.
113
+ *
114
+ * @since 4.18
115
+ *
116
+ * @param string $hook The hook name.
117
+ *
118
+ * @return callable[] A list of callbacks.
119
+ */
120
+ function wpra_get_hook_callbacks($hook)
121
+ {
122
+ global $wp_filter;
123
+
124
+ $results = [];
125
+
126
+ if (isset($wp_filter[$hook])) {
127
+ $hook = $wp_filter[$hook];
128
+
129
+ foreach ($hook->callbacks as $list) {
130
+ foreach ($list as $callback) {
131
+ $results[] = $callback;
132
+ }
133
+ }
134
+ }
135
+
136
+ return $results;
137
+ }
138
+
139
  /**
140
  * Returns a representation of an HTML expression that matches all representations of that HTML.
141
  *
includes/legacy-feed-display.php CHANGED
@@ -115,6 +115,7 @@
115
 
116
  // Prepare the title
117
  $feed_item_title = get_the_title();
 
118
  $feed_item_title_link = ( $link_enclosure === 'true' && $enclosure !== '' )? $enclosure : $permalink;
119
 
120
  // Prepare the text that precedes the source
@@ -453,23 +454,29 @@
453
  }
454
 
455
 
456
- add_filter( 'the_title', 'wprss_shorten_title', 10, 2 );
457
  /**
458
- * Checks the title limit option and shortens the title when necassary.
459
  *
460
  * @since 1.0
 
 
 
 
 
461
  */
462
  function wprss_shorten_title( $title, $id = null ) {
463
- if ( $id === null ) return $title;
464
- // Get the option. If does not exist, use 0, which is ignored.
465
- $general_settings = get_option( 'wprss_settings_general' );
466
- $title_limit = isset( $general_settings['title_limit'] )? intval( $general_settings['title_limit'] ) : 0;
467
- // Check if the title is for a wprss_feed_item, and check if trimming is needed
468
- if ( isset( $id ) && get_post_type( $id ) === 'wprss_feed_item' && $title_limit > 0 && strlen( $title ) > $title_limit ) {
469
- // Return the trimmed version of the title
470
- return substr( $title, 0, $title_limit ) . apply_filters( 'wprss_shortened_title_ending', '...' );
 
 
471
  }
472
- // Otherwise, return the same title
473
  return $title;
474
  }
475
 
115
 
116
  // Prepare the title
117
  $feed_item_title = get_the_title();
118
+ $feed_item_title = wprss_shorten_title($feed_item_title, $ID);
119
  $feed_item_title_link = ( $link_enclosure === 'true' && $enclosure !== '' )? $enclosure : $permalink;
120
 
121
  // Prepare the text that precedes the source
454
  }
455
 
456
 
 
457
  /**
458
+ * Checks the title limit option and shortens the title when necessary.
459
  *
460
  * @since 1.0
461
+ *
462
+ * @param string $title The title of tge feed item.
463
+ * @param int|string|null $id The ID of the feed item.
464
+ *
465
+ * @return string
466
  */
467
  function wprss_shorten_title( $title, $id = null ) {
468
+ if (isset($id) && get_post_type($id) === 'wprss_feed_item') {
469
+ $settings = get_option('wprss_settings_general');
470
+ $limit = isset($settings['title_limit'])
471
+ ? intval($settings['title_limit'])
472
+ : 0;
473
+
474
+ if ($limit > 0 && strlen($title) > $limit) {
475
+ $suffix = apply_filters('wprss_shortened_title_ending', '...');
476
+ $title = substr($title, 0, $limit) . $suffix;
477
+ }
478
  }
479
+
480
  return $title;
481
  }
482
 
includes/misc-functions.php CHANGED
@@ -435,3 +435,23 @@ function wprss_format_hook_callback(array $callback)
435
 
436
  return $callback['name'];
437
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
435
 
436
  return $callback['name'];
437
  }
438
+
439
+ /**
440
+ * Retrieves the file extension from a URI.
441
+ *
442
+ * @since 4.18
443
+ *
444
+ * @param string $uri The URI
445
+ *
446
+ * @return string|null The file extension or null if it could not be determined.
447
+ */
448
+ function wpra_get_uri_extension($uri)
449
+ {
450
+ $path = parse_url($uri, PHP_URL_PATH);
451
+
452
+ if (!$path || empty($path)) {
453
+ return null;
454
+ }
455
+
456
+ return strtolower(pathinfo($path, PATHINFO_EXTENSION));
457
+ }
includes/multimedia.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Checks if a URI points to an audio file.
5
+ *
6
+ * @since 4.18
7
+ *
8
+ * @param string $uri The URI to check.
9
+ *
10
+ * @return bool True if the URI points to an audio file, false if not.
11
+ */
12
+ function wpra_is_audio_file($uri)
13
+ {
14
+ switch (wpra_get_uri_extension($uri)) {
15
+ case 'aac':
16
+ case 'adts':
17
+ case 'aif':
18
+ case 'aifc':
19
+ case 'aiff':
20
+ case 'cdda':
21
+ case 'bwf':
22
+ case 'kar':
23
+ case 'mid':
24
+ case 'midi':
25
+ case 'smf':
26
+ case 'm4a':
27
+ case 'mp3':
28
+ case 'swa':
29
+ case 'wav':
30
+ case 'wax':
31
+ case 'wma':
32
+ return true;
33
+ default:
34
+ return false;
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Checks if a URI points to a video file.
40
+ *
41
+ * @since 4.18
42
+ *
43
+ * @param string $uri The URI to check.
44
+ *
45
+ * @return bool True if the URI points to a video file, false if not.
46
+ */
47
+ function wpra_is_video_file($uri)
48
+ {
49
+ switch (wpra_get_uri_extension($uri)) {
50
+ case 'mp4':
51
+ case 'mkv':
52
+ case 'mov':
53
+ case 'avi':
54
+ case 'webm':
55
+ case 'ogg':
56
+ return true;
57
+ default:
58
+ return false;
59
+ }
60
+ }
includes/roles-capabilities.php CHANGED
@@ -14,21 +14,20 @@
14
  */
15
  function wprss_remove_caps()
16
  {
17
- if (class_exists('WP_Roles')) {
18
- if (!isset($wp_roles)) {
19
- $wp_roles = new WP_Roles();
20
- }
21
- }
22
 
23
- if (is_object($wp_roles)) {
 
 
24
 
 
25
  /** Site Administrator Capabilities */
26
  $wp_roles->remove_cap('administrator', 'manage_feed_settings');
27
  /** Editor Capabilities */
28
  $wp_roles->remove_cap('editor', 'manage_feed_settings');
29
 
30
  /** Remove the Main Post Type Capabilities */
31
- $capabilities = $this->get_core_caps();
32
 
33
  foreach ($capabilities as $cap_group) {
34
  foreach ($cap_group as $cap) {
@@ -38,3 +37,42 @@ function wprss_remove_caps()
38
  }
39
  }
40
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  */
15
  function wprss_remove_caps()
16
  {
17
+ global $wp_roles;
 
 
 
 
18
 
19
+ if (!isset($wp_roles)) {
20
+ $wp_roles = new WP_Roles();
21
+ }
22
 
23
+ if ($wp_roles instanceof WP_Roles) {
24
  /** Site Administrator Capabilities */
25
  $wp_roles->remove_cap('administrator', 'manage_feed_settings');
26
  /** Editor Capabilities */
27
  $wp_roles->remove_cap('editor', 'manage_feed_settings');
28
 
29
  /** Remove the Main Post Type Capabilities */
30
+ $capabilities = wprss_get_core_caps();
31
 
32
  foreach ($capabilities as $cap_group) {
33
  foreach ($cap_group as $cap) {
37
  }
38
  }
39
  }
40
+
41
+ /**
42
+ * Gets the core post type capabilities.
43
+ *
44
+ * @since 4.18
45
+ */
46
+ function wprss_get_core_caps()
47
+ {
48
+ $capabilities = [];
49
+
50
+ $capability_types = ['feed', 'feed_source'];
51
+
52
+ foreach ($capability_types as $capability_type) {
53
+ $capabilities[$capability_type] = [
54
+ // Post type
55
+ "edit_{$capability_type}",
56
+ "read_{$capability_type}",
57
+ "delete_{$capability_type}",
58
+ "edit_{$capability_type}s",
59
+ "edit_others_{$capability_type}s",
60
+ "publish_{$capability_type}s",
61
+ "read_private_{$capability_type}s",
62
+ "delete_{$capability_type}s",
63
+ "delete_private_{$capability_type}s",
64
+ "delete_published_{$capability_type}s",
65
+ "delete_others_{$capability_type}s",
66
+ "edit_private_{$capability_type}s",
67
+ "edit_published_{$capability_type}s",
68
+
69
+ // Terms
70
+ "manage_{$capability_type}_terms",
71
+ "edit_{$capability_type}_terms",
72
+ "delete_{$capability_type}_terms",
73
+ "assign_{$capability_type}_terms",
74
+ ];
75
+ }
76
+
77
+ return $capabilities;
78
+ }
includes/system-info.php CHANGED
@@ -157,13 +157,8 @@ endif;
157
  CURRENT THEME:
158
 
159
  <?php
160
- if ( get_bloginfo( 'version' ) < '3.4' ) {
161
- $theme_data = get_theme_data( get_stylesheet_directory() . '/style.css' );
162
- echo $theme_data['Name'] . ': ' . $theme_data['Version'];
163
- } else {
164
- $theme_data = wp_get_theme();
165
- echo $theme_data->Name . ': ' . $theme_data->Version;
166
- }
167
  ?>
168
 
169
 
@@ -232,7 +227,7 @@ foreach ($extensions as $extension) {
232
  * @param null|string $host The address of the database host, to which to connect.
233
  * May contain the port number in standard URI format.
234
  * Default: value of the DB_HOST constant, if defined, otherwise null.
235
- * @param null|string $username The username to be used for connecting to the databse.
236
  * Default: value of the DB_USER constant, if defined, otherwise null.
237
  * @param null|string $password The password to be used for connecting to the database.
238
  * Default: value of the DB_PASSWORD constant, if defined, otherwise null.
@@ -262,24 +257,5 @@ function wprss_sysinfo_get_db_server( $host = null, $username = null, $password
262
  return $result;
263
  }
264
 
265
- if ( function_exists( 'mysql_connect' ) ) {
266
- if (version_compare(PHP_VERSION, '7.0', '>=')) {
267
- $result['warning'] = __(
268
- 'The mysql extension is deprecated since PHP 5.5 and removed since PHP 7.0; Use mysqli instead',
269
- 'wprss'
270
- );
271
- $result['extension'] = 'mysql';
272
- $result['server_info'] = '';
273
- return $result;
274
- }
275
-
276
- if ( $port ) $host = implode ( ':', array( $host, $port ) );
277
-
278
- $mysql = mysql_connect( $host, $username, $password );
279
- $result['extension'] = 'mysql';
280
- $result['server_info'] = mysql_get_server_info( $mysql );
281
- return $result;
282
- }
283
-
284
  return null;
285
  }
157
  CURRENT THEME:
158
 
159
  <?php
160
+ $theme_data = wp_get_theme();
161
+ echo $theme_data->Name . ': ' . $theme_data->Version;
 
 
 
 
 
162
  ?>
163
 
164
 
227
  * @param null|string $host The address of the database host, to which to connect.
228
  * May contain the port number in standard URI format.
229
  * Default: value of the DB_HOST constant, if defined, otherwise null.
230
+ * @param null|string $username The username to be used for connecting to the database.
231
  * Default: value of the DB_USER constant, if defined, otherwise null.
232
  * @param null|string $password The password to be used for connecting to the database.
233
  * Default: value of the DB_PASSWORD constant, if defined, otherwise null.
257
  return $result;
258
  }
259
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
  return null;
261
  }
js/build/templates.min.js CHANGED
@@ -1 +1 @@
1
- !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.WPRA=e():t.WPRA=e()}("undefined"!=typeof self?self:this,function(){return webpackJsonpWPRA([1],{40:function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t){return new I(t)}function a(t){return t&&"object"===(void 0===t?"undefined":Z(t))&&"[object RegExp]"!==Object.prototype.toString.call(t)&&"[object Date]"!==Object.prototype.toString.call(t)}function r(t){return Array.isArray(t)?[]:{}}function s(t,e){return e&&!0===e.clone&&a(t)?u(r(t),t,e):t}function l(t,e,i){var n=t.slice();return e.forEach(function(e,o){void 0===n[o]?n[o]=s(e,i):a(e)?n[o]=u(t[o],e,i):-1===t.indexOf(e)&&n.push(s(e,i))}),n}function p(t,e,i){var n={};return a(t)&&Object.keys(t).forEach(function(e){n[e]=s(t[e],i)}),Object.keys(e).forEach(function(o){a(e[o])&&t[o]?n[o]=u(t[o],e[o],i):n[o]=s(e[o],i)}),n}function u(t,e,i){var n=Array.isArray(e),o=i||{arrayMerge:l},a=o.arrayMerge||l;return n?Array.isArray(t)?a(t,e,i):s(e,i):p(t,e,i)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var h=i(42),f=i(43),m=i.n(f),y=i(9),v=i.n(y),b=i(45),g=i.n(b),_=i(46),w=i.n(_),k=i(47),x=i(2),S=i.n(x),A=i(48),T=i.n(A),C={props:{path:{},gate:{}},inject:["router"],methods:{getPath:function(){return this.router.buildRoute(this.path)},navigate:function(t){var e=!this.gate||this.gate();t.preventDefault(),e&&this.router.navigate(this.path)}},render:function(){var t=this,e=arguments[0],i=this.getPath();return e("a",S()([{attrs:{href:i}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.navigate.apply(t,[e].concat(n))}}}]),[this.$slots.default])}},O=null,P={props:{mediaType:{type:String,default:"image"},mediaTitle:{type:String,default:"Select Media"},mediaValueProperty:{type:String,default:"id"}},methods:{mediaNode:function(){var t=this,e=this.$createElement;return this.assertMediaLoaded(),e("div",[e("input",{attrs:{type:"text"},domProps:{value:this.value}}),e("button",S()([{class:"button"},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.openFrame.apply(t,[e].concat(n))}}}]),["Choose image"])])},openFrame:function(){O||(O=this.createFrame()),O.open()},createFrame:function(){var t=this;return O=wp.media({title:this.mediaTitle,multiple:!1,library:{type:this.mediaType}}),O.on("close",function(){var e=O.state().get("selection"),i=null;e.each(function(t){i=t}),i&&i.id&&t.$emit("input",{id:i.id,url:i.attributes.url}[t.mediaValueProperty])}),O.on("open",function(){var e=O.state().get("selection");if("id"===t.mediaValueProperty&&t.value){var i=wp.media.attachment(t.value);i.fetch(),e.add(i?[i]:[])}}),O},assertMediaLoaded:function(){if(!window.wp.media)throw Error("[MediaInput] wp.media dependency is not loaded")}}},j={mixins:[P],props:{id:{type:String,default:function(){return Math.random().toString(36).substr(0,12)}},label:{},description:{},after:{},type:{},value:{},placeholder:{},title:{},inputDisabled:{},options:{default:function(){return{}}}},methods:{inputNode:function(){var t=this,e=this.$createElement;return"media"===this.type?this.mediaNode():"checkbox"===this.type?e("input",S()([{attrs:{type:"checkbox",id:this.id,placeholder:this.placeholder,disabled:this.$attrs.disabled||this.inputDisabled},domProps:{checked:!!this.value}},{attrs:this.$attrs},{on:{change:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(){return t.$emit("input",!t.value)}).apply(void 0,[e].concat(n))}}}])):"select"!==this.type?e("input",S()([{attrs:{type:this.type,id:this.id,placeholder:this.placeholder,disabled:this.$attrs.disabled||this.inputDisabled},domProps:{value:this.value}},{attrs:this.$attrs},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.$emit("input",e.target.value)}).apply(void 0,[e].concat(n))}}}])):this.selectNode()},selectNode:function(){var t=this,e=this.$createElement,i=Object.keys(this.options).map(function(i){return e("option",{domProps:{value:i,selected:t.value===i}},[t.options[i]])});return e("select",S()([{attrs:this.$attrs},{attrs:{id:this.id,disabled:this.$attrs.disabled||this.inputDisabled}},{on:{change:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.$emit("input",e.target.value)}).apply(void 0,[e].concat(n))}}}]),[i])}},render:function(){var t=arguments[0],e=[];return this.title&&e.push({name:"tippy"}),t("div",{class:{"form-input":!0,"form-input--disabled":this.$attrs.disabled||!1}},[this.label?t("label",{class:"form-input__label",attrs:{for:this.id}},[t("div",[this.label,this.title?t("div",S()([{class:"form-input__tip"},{directives:e},{attrs:{title:this.title}}]),[t("span",{class:"dashicons dashicons-editor-help"})]):null]),this.description?t("div",S()([{class:"form-input__label-description"},{domProps:{innerHTML:this.description}}])):""]):null,t("div",{class:"form-input__field"},[this.inputNode(),this.after])])}},L=function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{staticClass:"wpra-bottom-panel"},[t._t("default")],2)},W=[],M={},$=M,N=i(1),R=Object(N.a)($,L,W,!1,null,null,null),E=R.exports,D=function(t){return JSON.parse(JSON.stringify(t))},F="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},I=function(){function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"id";return n(this,t),this.data=e,this.primaryField=i,this}return t.prototype.find=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("object"!==(void 0===t?"undefined":F(t))&&null!==t){var i;i={},i[this.primaryField]=t,t=i}for(var n in this.data)if(this._isMatching(this.data[n],t))return this.data[n];return e},t.prototype.pluck=function(t){return this.data.map(function(e){return e[t]})},t.prototype.remove=function(t){for(var e in this.data)this._isMatching(this.data[e],t)&&this.data.splice(e,1);return this},t.prototype.appendDiff=function(t){for(var e=t,i=Array.isArray(e),n=0,e=i?e:e[Symbol.iterator]();;){var o;if(i){if(n>=e.length)break;o=e[n++]}else{if(n=e.next(),n.done)break;o=n.value}var a=o;this.contains(a)||this.data.push(a)}},t.prototype.prependDiff=function(t){for(var e=t.slice().reverse(),i=Array.isArray(e),n=0,e=i?e:e[Symbol.iterator]();;){var o;if(i){if(n>=e.length)break;o=e[n++]}else{if(n=e.next(),n.done)break;o=n.value}var a=o;this.contains(a)||this.data.unshift(a)}},t.prototype.contains=function(t){for(var e=this.data,i=Array.isArray(e),n=0,e=i?e:e[Symbol.iterator]();;){var o;if(i){if(n>=e.length)break;o=e[n++]}else{if(n=e.next(),n.done)break;o=n.value}if(o.id==t.id)return!0}return!1},t.prototype.filterValues=function(t){var e=this;return Object.keys(this.data).filter(function(i){return t(e.data[i],i)}).reduce(function(t,i){return t[i]=e.data[i],t},{})},t.prototype.filter=function(t){var e=this;return this.data.filter(function(i){return e._isMatching(i,t)})},t.prototype.whereIn=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"id",i=[],n={};n[e]=null;for(var o=t,a=Array.isArray(o),r=0,o=a?o:o[Symbol.iterator]();;){var s;if(a){if(r>=o.length)break;s=o[r++]}else{if(r=o.next(),r.done)break;s=r.value}var l=s;n[e]=l;var p=this.find(n);p&&i.push(p)}return i},t.prototype.key=function(e){return new t(this.data.slice().reduce(function(t,i){return t[i[e]]=i,t},{}))},t.prototype.mapValues=function(t){var e=this;return Object.keys(this.data).map(function(i){e.data[i]=t(e.data[i],i)}),this},t.prototype.values=function(){return this.data},t.prototype._isMatching=function(t,e){if(!(t instanceof Object||e instanceof Object))return t==e;for(var i=!0,n=Object.keys(e),o=Array.isArray(n),a=0,n=o?n:n[Symbol.iterator]();;){var r;if(o){if(a>=n.length)break;r=n[a++]}else{if(a=n.next(),a.done)break;r=a.value}var s=r,l=t.hasOwnProperty(s)&&t[s]==e[s];i=i&&l}return i},t}(),U=o,B={data:function(){return{loading:!1,columns:{name:{label:"Template Name",class:"column-primary"},style:{label:"Template Type"},previewTemplate:{label:"Preview"}},filters:WpraTemplates.options.type,checked:[],filter:{paged:parseInt(this.router.params.paged||1),type:this.router.params.type||"",s:this.router.params.s||""},baseUrl:WpraTemplates.base_url,total:0}},inject:["hooks","http","router"],computed:{totalPages:function(){return Math.ceil(this.total/20)},list:{get:function(){return this.$store.state.templates.items},set:function(t){this.$store.commit("templates/set",t)}}},methods:{navigated:function(){var t=this;Object.keys(this.filter).forEach(function(e){t.filter[e]=t.router.params[e]||""}),this.filter.paged=parseInt(this.filter.paged||1),this.fetchList()},fetchList:function(){var t=this;this.loading=!0;var e=this.getParams(),i=parseInt(e.paged);return delete e.paged,i&&1!==i&&(e.page=i),this.http.get(this.baseUrl,{params:e}).then(function(e){t.list=e.data.items,t.total=e.data.count}).finally(function(){t.loading=!1})},deleteTemplate:function(t){var e=this;if(confirm("Are you sure you want to delete this template? If this template is being used in a shortcode or Gutenberg block anywhere on your site, the default template will be used instead."))return this.loading=!0,this.http.delete(this.baseUrl+"/"+t).then(function(){return e.fetchList()}).then(function(){e.loading=!1})},bulkDelete:function(){var t=this;if(confirm("Are you sure you want to delete these templates? If a template is being used in a shortcode or Gutenberg block anywhere on your site, the default template will be used instead."))return this.loading=!0,this.http.delete(this.baseUrl,{params:{ids:this.checked}}).then(function(){return t.checked=[],t.$refs.table.checkedItems=[],t.fetchList()}).then(function(){t.loading=!1})},duplicateTemplate:function(t){var e=D(t);delete e.id,"__built_in"===e.type&&delete e.type,e.name=e.name+" (Copy)",this.$store.commit("templates/updatePreset",e),this.router.navigate({name:"templates",params:{action:"new"}})},getPreviewLink:function(t){return WpraGlobal.admin_base_url+"?wpra_preview_template="+t.id},createTemplate:function(){this.$store.commit("templates/updatePreset",{}),this.router.navigate({name:"templates",params:{action:"new"}})},setChecked:function(t){var e=this;this.checked=t.filter(function(t){return"__built_in"!==U(e.list).find(t,{}).type})},getParams:function(){var t=this;return Object.keys(this.filter).filter(function(e){return!!t.filter[e]&&"all"!==t.filter[e]}).reduce(function(e,i){return e[i]=t.filter[i],e},{})},setFilter:function(t,e){this.filter[t]=e},submitFilter:function(){this.router.mergeParams(this.getParams())},getRowClass:function(t){return"__built_in"===t.type?"built-in":""}},render:function(){var t=this,e=arguments[0],i=function(t){return{name:"templates",params:{action:"edit",id:t}}},n=this.hooks.apply("wpra-templates-list-cells",this,{name:function(n){var o=n.row;return[e("div",[e("strong",[e(C,{attrs:{path:i(o.id)}},[o.name])]),e("small",{style:{paddingLeft:"4px",opacity:"0.6"}},[o.slug]),"__built_in"===o.type?e("span",{style:{opacity:"0.6",display:"block"}},['This is the default feed template. To create your own, either duplicate it or click "Add New" above.']):null]),e("div",{class:"row-actions"},[e("span",{attrs:{className:"edit"}},[e(C,{attrs:{path:i(o.id)}},["Edit"])," |"]),e("span",{class:"inline",style:{paddingLeft:"4px"}},[e("a",S()([{attrs:{href:"#"}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),a=1;a<i;a++)n[a-1]=arguments[a];(function(e){e.preventDefault(),t.duplicateTemplate(o)}).apply(void 0,[e].concat(n))}}}]),["Duplicate"])," ","__built_in"!==o.type?"|":""]),"__built_in"!==o.type?e("span",S()([{class:"trash",style:{paddingLeft:"4px"}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),a=1;a<i;a++)n[a-1]=arguments[a];(function(e){e.preventDefault(),t.deleteTemplate(o.id)}).apply(void 0,[e].concat(n))}}}]),[e("a",{attrs:{href:"#","aria-label":"Delete Item"},class:"submitdelete"},["Delete"])]):null])]},style:function(i){var n=i.row;return t.filters[n.type]?[e("div",[t.filters[n.type]])]:[e("div",[t.filters.list," ",e("span",{style:{opacity:.7,fontSize:"90%"}},["(Missing type: ",e("code",[n.type]),")"])])]},previewTemplate:function(i){var n=i.row;return[e("div",[e("a",{attrs:{href:t.getPreviewLink(n),target:"wpra-preview-template"},class:"wpra-preview-link"},["Open preview ",e("span",{class:"dashicons dashicons-external"})])])]},filters:function(){var i=Object.keys(WpraTemplates.options.type).filter(function(t){return"_"!==t[0]}).reduce(function(t,e){return t[e]=WpraTemplates.options.type[e],t},{all:"Select Template Type"});return[e(j,S()([{attrs:{type:"select",options:i,value:t.filter.type},style:{margin:0}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){t.filter.type=e,t.submitFilter()}).apply(void 0,[e].concat(n))}}}]))]}}),o=e("div",[e("h1",{class:"wp-heading-inline"},["Templates"]),e("a",S()([{class:"page-title-action",attrs:{href:"#"}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){e.preventDefault(),t.createTemplate()}).apply(void 0,[e].concat(n))}}}]),["Add New"]),e("p",{class:"search-box",style:{padding:"10px 0"}},[e("label",{class:"screen-reader-text",attrs:{for:"post-search-input"}},["Search Templates:"]),e("input",S()([{attrs:{type:"search",id:"post-search-input",name:"s"},domProps:{value:this.filter.s}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.filter.s=e.target.value}).apply(void 0,[e].concat(n))},keyup:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];if(!("button"in e)&&t._k(e.keyCode,"enter",13))return null;t.submitFilter.apply(t,[e].concat(n))}}}])),e("input",S()([{attrs:{type:"submit",id:"search-submit",value:"Search Templates"},class:"button"},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.submitFilter.apply(t,[e].concat(n))}}}]))]),e(T.a,S()([{attrs:{columns:this.columns,rows:this.list,loading:this.loading,totalItems:this.total,perPage:20,totalPages:this.totalPages,currentPage:this.filter.paged,notFound:"No templates found.",rowClass:this.getRowClass},ref:"table",class:{"wpra-no-cb":0===this.list.length||1===this.list.length&&"__built_in"===this.list[0].type},scopedSlots:n},{on:{checked:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.setChecked.apply(t,[e].concat(n))},pagination:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){t.filter.paged=e,t.submitFilter()}).apply(void 0,[e].concat(n))}}}])),this.checked.length?e(E,[e("div",{class:"flex-row"},[e("div",{class:"flex-col"},[e("div",{class:"wpra-bottom-panel__title"},["Bulk Actions"]),e("a",S()([{attrs:{href:"#"}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){e.preventDefault(),t.bulkDelete()}).apply(void 0,[e].concat(n))}}}]),["Delete"])])])]):null]);return this.hooks.apply("wpra-templates-list",this,o)}},V={inject:["hooks"],data:function(){return{expanded:!0}},props:{title:{},id:{},submit:{type:Boolean,default:!1},context:{}},methods:{toggle:function(){this.expanded=!this.expanded}},render:function(t){var e=this;return this.hooks.apply("postbox-"+this.id,this.context||this,t("div",{class:"postbox wpra-postbox",attrs:{id:this.submit?"submitdiv":""}},[t("div",{class:"postbox-header"},[t("h2",S()([{class:"hndle ui-sortable-handle"},{on:{click:function(t){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];e.toggle.apply(e,[t].concat(n))}}}]),[t("span",[this.title])])]),t("div",{class:"inside"},[this.hooks.apply("postbox-content-"+this.id,this.context||this,[this.$slots.default],{h:t})])]),{h:t})}},G=V,J=Object(N.a)(G,void 0,void 0,!1,null,null,null),q=J.exports,z={render:function(){return(0,arguments[0])("div",{attrs:{id:"postbox-container-2"},class:"postbox-container"},[this.$slots.default])}},H={render:function(){return(0,arguments[0])("div",{attrs:{id:"postbox-container-1"},class:"wpra-postbox-container postbox-container"},[this.$slots.default])}},K={render:function(){return(0,arguments[0])("div",{attrs:{id:"post-body"}},[this.$slots.default])}},X={props:{loading:{type:Boolean,default:!1}},render:function(){return(0,arguments[0])("button",{attrs:{disabled:this.loading},class:{button:!0,"loading-button":this.loading}},[this.$slots.default])}},Y={data:function(){return{shouldBeVisible:!0}},props:{id:{type:String,required:!0},title:{type:String},body:{type:String},learnMore:{default:!1},okayText:{type:String,default:"Got it"},learnMoreText:{type:String,default:"Learn more"},visible:{type:Boolean,default:!0}},computed:{isVisible:function(){return this.visible&&this.shouldBeVisible&&JSON.parse(localStorage.getItem(this.getBlockKey())||"true")}},methods:{onOkayClick:function(){this.shouldBeVisible=!1,localStorage.setItem(this.getBlockKey(),JSON.stringify(!1))},onLearnMoreClick:function(){window.open(this.learnMore,"_blank").focus()},getBlockKey:function(){return"wpra-"+this.id+"-visible"}},render:function(){var t=arguments[0];if(!this.isVisible)return null;var e=this.learnMore?t(X,{class:"button-clear",nativeOn:{click:this.onLearnMoreClick}},[this.learnMoreText," ",t("span",{class:"dashicons dashicons-external"})]):null;return t("div",{class:"wpra-notice-block"},[t("div",{class:"wpra-notice-block__title"},[this.title]),t("div",S()([{class:"wpra-notice-block__body"},{domProps:{innerHTML:this.body}}])),t("div",{class:"wpra-notice-block__buttons"},[t(X,{class:"brand button-primary",nativeOn:{click:this.onOkayClick}},[this.okayText]),e])])}},Z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};u.all=function(t,e){if(!Array.isArray(t)||t.length<2)throw new Error("first argument should be an array with at least two elements");return t.reduce(function(t,i){return u(t,i,e)})};var Q=u,tt=i(49),et=i.n(tt),it={data:function(){return{changes:{model:{}}}},methods:{isChanged:function(){return!et()(this.model,this.changes.model)},rememberModel:function(){this.$set(this.changes,"model",D(this.model))},cancelChanges:function(){confirm("Are you sure you want to cancel your changes for this template? This action cannot be reverted and all changes made since your last save will be lost.")&&this.$set(this,"model",D(this.changes.model))}}},nt={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(t){var e,i,n,o,a,r,s,l="",p=0;for(t=nt._utf8_encode(t);p<t.length;)e=t.charCodeAt(p++),i=t.charCodeAt(p++),n=t.charCodeAt(p++),o=e>>2,a=(3&e)<<4|i>>4,r=(15&i)<<2|n>>6,s=63&n,isNaN(i)?r=s=64:isNaN(n)&&(s=64),l=l+this._keyStr.charAt(o)+this._keyStr.charAt(a)+this._keyStr.charAt(r)+this._keyStr.charAt(s);return l},decode:function(t){var e,i,n,o,a,r,s,l="",p=0;for(t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");p<t.length;)o=this._keyStr.indexOf(t.charAt(p++)),a=this._keyStr.indexOf(t.charAt(p++)),r=this._keyStr.indexOf(t.charAt(p++)),s=this._keyStr.indexOf(t.charAt(p++)),e=o<<2|a>>4,i=(15&a)<<4|r>>2,n=(3&r)<<6|s,l+=String.fromCharCode(e),64!=r&&(l+=String.fromCharCode(i)),64!=s&&(l+=String.fromCharCode(n));return l=nt._utf8_decode(l)},_utf8_encode:function(t){t=t.replace(/\r\n/g,"\n");for(var e="",i=0;i<t.length;i++){var n=t.charCodeAt(i);n<128?e+=String.fromCharCode(n):n>127&&n<2048?(e+=String.fromCharCode(n>>6|192),e+=String.fromCharCode(63&n|128)):(e+=String.fromCharCode(n>>12|224),e+=String.fromCharCode(n>>6&63|128),e+=String.fromCharCode(63&n|128))}return e},_utf8_decode:function(t){for(var e="",i=0,n=0,o=0;i<t.length;)n=t.charCodeAt(i),n<128?(e+=String.fromCharCode(n),i++):n>191&&n<224?(o=t.charCodeAt(i+1),e+=String.fromCharCode((31&n)<<6|63&o),i+=2):(o=t.charCodeAt(i+1),c3=t.charCodeAt(i+2),e+=String.fromCharCode((15&n)<<12|(63&o)<<6|63&c3),i+=3);return e}},ot=nt,at=i(6),rt={mixins:[it],data:function(){return{typeOptions:Object.keys(WpraTemplates.options.type).filter(function(t){return"_"!==t[0]}).reduce(function(t,e){return t[e]=WpraTemplates.options.type[e],t},{}),model:D(WpraTemplates.model_schema),validation:D(WpraTemplates.model_schema),tooltips:D(WpraTemplates.model_tooltips),baseUrl:WpraTemplates.base_url,isSaving:!1,isLoading:!1}},inject:["hooks","http","router","notification"],mounted:function(){this.resolveEditingItem()},computed:{previewUrl:function(){var t=ot.encode(JSON.stringify(this.model.options));return WpraGlobal.admin_base_url+"?wpra_preview_template="+this.router.params.id+"&wpra_template_options="+t}},methods:{resolveEditingItem:function(){var t=this,e=Q(D(WpraTemplates.model_schema),this.$store.state.templates.preset);this.isLoading=!0,function(){var e=t.router.params.id;if(!e)return Promise.resolve(null);var i=t.$store.getters["templates/item"](e);return i?Promise.resolve(i):t.http.get(t.baseUrl+"/"+e).then(function(t){return t.data})}().then(function(i){if(t.isLoading=!1,!i)return t.$set(t,"model",e),void t.rememberModel();i=Object.assign({},i),t.model=Q(t.model,i),t.rememberModel()})},save:function(){var t=this,e=!this.model.id;this.isSaving=!0,this.runRequest().then(function(i){t.model=Q(t.model,i.data),t.rememberModel(),t.notification.show("Template saved!",{type:"success",icon:function(t){return t.classList.add("dashicons","dashicons-yes"),t}}),e&&t.router.navigate({name:"templates",params:{action:"edit",id:i.data.id}})},function(e){t.notification.show("Something went wrong. Template is not saved!",{type:"error",icon:function(t){return t.classList.add("dashicons","dashicons-warning"),t}})}).finally(function(){t.isSaving=!1})},runRequest:function(){var t=this.model.id?"put":"post",e=this.model.id?this.baseUrl+"/"+this.model.id:this.baseUrl;return this.http[t](e,this.prepareModel())},prepareModel:function(){var t=this,e=Object.keys(WpraTemplates.model_schema);return Object.keys(this.model).filter(function(i){return!(!e.includes(i)||"__built_in"===t.model.type&&["name","type"].includes(i)||["slug","id"].includes(i))}).reduce(function(e,i){return e[i]=t.model[i],e},{})},getShortcode:function(){return'[wp-rss-aggregator template="'+this.model.slug+'"]'},preventLoosingNotSavedData:function(){return!this.isChanged()||confirm("You have unsaved changes. All changes will be lost if you go back to the Template list before updating. Are you sure you want to continue?")},copyShortcode:function(t){Object(at.a)(this.getShortcode());var e=t.target.innerText;t.target.style.width=t.target.getBoundingClientRect().width+"px",t.target.disabled=!0,t.target.innerText="Copied!",setTimeout(function(){t.target.style.width=null,t.target.innerText=e,t.target.disabled=!1},5e3)}},render:function(){var t=this,e=arguments[0],i={name:"templates"},n=null,o=null,a=e(Y,{class:"postbox",attrs:{id:"templates-usage",title:"Setting up your Templates",body:'Templates are used to display the items imported using WP RSS Aggregator. Choose the preferred options below and use them anywhere on your site via our <a href="https://kb.wprssaggregator.com/article/54-displaying-imported-items-shortcode#tinymce" target="_blank">shortcode</a> or our <a href="https://kb.wprssaggregator.com/article/454-displaying-imported-items-block-gutenberg" target="_blank">block</a>.',learnMore:"https://kb.wprssaggregator.com/article/457-templates"}});this.router.params.id&&(n=e("div",{attrs:{id:""},style:{padding:"6px 0"}},[e("div",{class:"misc-pub-section misc-pub-visibility"},[e("a",{attrs:{href:this.previewUrl,role:"button",target:"wpra-preview-template"},class:"wpra-preview-link",style:{marginLeft:"4px",textDecoration:"none"}},["Open preview",e("span",{class:"dashicons dashicons-external"})])])])),this.model.id&&(o=e("div",{class:"wpra-shortcode-copy",attrs:{title:"Copy chortcode"}},[e("div",{class:"wpra-shortcode-copy__content"},[e("strong",["Shortcode: "]),e("code",[this.getShortcode()])]),e("div",{class:"wpra-shortcode-copy__icon"},[e("button",S()([{class:"button"},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.copyShortcode.apply(t,[e].concat(n))}}}]),["Copy Shortcode"])])]));var r=e("div",[e("div",{class:"page-title"},[e(C,{class:"back-button",attrs:{path:i,gate:this.preventLoosingNotSavedData}},[e("span",{class:"dashicons dashicons-arrow-left-alt"}),"Templates"]),e("h1",[this.router.params.id?this.changes.model.name||this.changes.model.slug:"Create a New Template"]),o]),e("div",{attrs:{id:"poststuff"}},[this.isLoading?e("div",{class:"loading-container"}):e(K,{class:"metabox-holder columns-2"},[e(z,[a,e(q,{attrs:{id:"template-details",title:"Template Details",context:this}},[e(j,S()([{attrs:{type:"text",label:"Template name",value:this.model.name,disabled:"__built_in"===this.model.type}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.name=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"select",label:"Template type",value:this.model.type,options:this.typeOptions,disabled:"__built_in"===this.model.type,inputDisabled:!WpraTemplates.options.is_type_enabled,description:WpraTemplates.options.is_type_enabled?null:'<div class="disable-ignored"><strong class="disable-ignored">Get more template types, including a customisable grid template.</strong> <a target="_blank" href="https://www.wprssaggregator.com/extensions/templates/" class="disable-ignored">Learn more.</a></div>'}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.type=e}).apply(void 0,[e].concat(n))}}}])),"__built_in"===this.model.type?e("div",{class:"wpra-info-box"},[e("div",{class:"wpra-info-box__icon"},[e("span",{class:"dashicons dashicons-info"})]),e("div",{class:"wpra-info-box__text"},["This is the default template for WP RSS Aggregator. It is used as the fallback template when one is not selected via the shortcode or block. To create a new one, please go back to the templates list page."])]):null]),e(q,{attrs:{id:"template-options",title:"Template Options",context:this}},[e(j,S()([{attrs:{type:"checkbox",label:"Link title to original article",value:this.model.options.title_is_link,title:this.tooltips.options.title_is_link}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.title_is_link=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"number",label:"Title maximum length",value:this.model.options.title_max_length||"",placeholder:"No limit",title:this.tooltips.options.title_max_length}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.title_max_length=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"number",label:"Number of items to show",value:this.model.options.limit||"",title:this.tooltips.options.limit,placeholder:"Show all items",min:"0"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.limit=""===e?0:e}).apply(void 0,[e].concat(n))}}}])),e("div",{attrs:{id:"wpra-list-template-publish-date"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show publish date",value:this.model.options.date_enabled,title:this.tooltips.options.date_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.date_enabled=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"text",label:"Date prefix",value:this.model.options.date_prefix,disabled:!this.model.options.date_enabled,title:this.tooltips.options.date_prefix}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.date_prefix=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"text",label:"Date format",value:this.model.options.date_format,disabled:this.model.options.date_use_time_ago||!this.model.options.date_enabled,title:this.tooltips.options.date_format}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.date_format=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"checkbox",label:'Use "time ago" format',description:"Example: 20 minutes ago",value:this.model.options.date_use_time_ago,disabled:!this.model.options.date_enabled,title:this.tooltips.options.date_use_time_ago}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.date_use_time_ago=e}).apply(void 0,[e].concat(n))}}}]))]),e("div",{attrs:{id:"wpra-list-template-source"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show source name",value:this.model.options.source_enabled,title:this.tooltips.options.source_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.source_enabled=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"text",label:"Source prefix",value:this.model.options.source_prefix,disabled:!this.model.options.source_enabled,title:this.tooltips.options.source_prefix}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.source_prefix=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"checkbox",label:"Link source name",value:this.model.options.source_is_link,disabled:!this.model.options.source_enabled,title:this.tooltips.options.source_is_link}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.source_is_link=e}).apply(void 0,[e].concat(n))}}}]))]),e("div",{attrs:{id:"wpra-list-template-author"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show author name",value:this.model.options.author_enabled,title:this.tooltips.options.author_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.author_enabled=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"text",label:"Author prefix",value:this.model.options.author_prefix,disabled:!this.model.options.author_enabled,title:this.tooltips.options.author_prefix}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.author_prefix=e}).apply(void 0,[e].concat(n))}}}]))]),e("div",{attrs:{id:"wpra-list-template-pagination"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Pagination",value:this.model.options.pagination,title:this.tooltips.options.pagination,disabled:parseInt(this.model.options.limit)<1||!this.model.options.limit},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.pagination=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"select",label:"Pagination style",options:WpraTemplates.options.pagination_type,value:this.model.options.pagination_type,disabled:!this.model.options.pagination||parseInt(this.model.options.limit)<1||!this.model.options.limit,title:this.tooltips.options.pagination_type}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.pagination_type=e}).apply(void 0,[e].concat(n))}}}]))]),e("div",{attrs:{id:"wpra-list-template-bullets"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show bullets",value:this.model.options.bullets_enabled,title:this.tooltips.options.bullets_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.bullets_enabled=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"select",label:"Bullet style",options:WpraTemplates.options.bullet_type,value:this.model.options.bullet_type,disabled:!this.model.options.bullets_enabled,title:this.tooltips.options.bullet_type}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.bullet_type=e}).apply(void 0,[e].concat(n))}}}]))])])]),e(H,[e(q,{attrs:{id:"template-create",title:this.model.id?"Update Template":"Create Template",submit:!0,context:this},class:"wpra-postbox-last"},[e("div",{class:"submitbox",attrs:{id:"submitpost"}},[n,e("div",{attrs:{id:"major-publishing-actions"}},[e("div",{attrs:{id:"delete-action"}},[this.isChanged()?e("a",S()([{attrs:{href:"#"},class:"submitdelete"},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){e.preventDefault(),t.cancelChanges()}).apply(void 0,[e].concat(n))}}}]),["Cancel Changes"]):null]),e("div",{attrs:{id:"publishing-action"}},[e(X,{class:"button-primary button-large",attrs:{loading:this.isSaving},nativeOn:{click:this.save}},[this.model.id?"Save":"Publish"])]),e("div",{class:"clear"})])])]),e(q,{attrs:{id:"template-link-preferences",title:"Link Preferences",context:this}},[e("p",{style:{opacity:.65}},["These options apply to all links within this template."]),e(j,S()([{attrs:{type:"checkbox",label:"Set links as nofollow",value:this.model.options.links_nofollow,title:this.tooltips.options.links_nofollow}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.links_nofollow=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"select",label:"Open links behaviour",value:this.model.options.links_behavior,options:WpraTemplates.options.links_behavior,title:this.tooltips.options.links_behavior},class:"form-input--vertical"},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.links_behavior=e}).apply(void 0,[e].concat(n))}}}])),"lightbox"===this.model.options.links_behavior?e("div",{class:"notice notice-info notice-alt"},[e("p",["Some sites may not allow their content to be shown in a lightbox."]),e("p",["Embedded content usually works. Try ticking the below checkbox."]),e("p",[e("a",{attrs:{href:"https://kb.wprssaggregator.com/article/471-q-why-wont-some-of-my-feed-items-work-with-the-lightbox-link-behaviour-for-templates",target:"_blank"}},["Learn more"])])]):null,e(j,S()([{attrs:{type:"checkbox",label:"Set links to open embeds",value:this.model.options.link_to_embed,title:this.tooltips.options.link_to_embed}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.link_to_embed=e}).apply(void 0,[e].concat(n))}}}]))]),e(q,{attrs:{id:"template-custom-css",title:"Custom Style",context:this}},[e(j,S()([{attrs:{type:"text",label:"Custom HTML class name",value:this.model.options.custom_css_classname,title:this.tooltips.options.custom_css_classname},class:"form-input--vertical"},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.custom_css_classname=e}).apply(void 0,[e].concat(n))}}}]))])])])])]);return this.hooks.apply("wpra-templates-form",this,r)}},st=function(t){var e=t.store,i=t.router;return{store:e,data:function(){return{afterNavigate:function(){},params:{},currentRoute:null}},created:function(){i.setApp(this),this.currentRoute=i.parseLocation(window.location),this.navigated()},mounted:function(){var t=this;window.addEventListener("popstate",function(){t.currentRoute=i.parseLocation(window.location),t.navigated()})},methods:{ViewComponent:function(){return i.findRoute(this.currentRoute).component},navigated:function(){var t=this;this.$nextTick(function(){var e=t.$refs.main;e&&e.navigated&&e.navigated({route:i.findRoute(t.currentRoute)})})}},render:function(t){var e=t(this.ViewComponent(),{ref:"main"});return this.afterNavigate(),e}}},lt=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),pt=function(t){t||(t=location.href);var e=t.indexOf("?"),i=t.indexOf("#");if(-1==i&&-1==e)return{};-1==i&&(i=t.length);var n=-1==e||i==e+1?t.substring(i):t.substring(e+1,i),o={};return n.split("&").forEach(function(t){if(t){t=t.split("+").join(" ");var e=t.indexOf("="),i=e>-1?t.substr(0,e):t,n=e>-1?decodeURIComponent(t.substr(e+1)):"",a=i.indexOf("[");if(-1==a)o[decodeURIComponent(i)]=n;else{var r=i.indexOf("]",a),s=decodeURIComponent(i.substring(a+1,r));i=decodeURIComponent(i.substring(0,a)),o[i]||(o[i]=[]),s?o[i][s]=n:o[i].push(n)}}}),o},ut=function(){function t(e,i){c(this,t),this.routes=e,this.options=i,this.baseParams=i.baseParams||["post_type","page","action","id"]}return t.prototype.setApp=function(t){this.app=t,this.app.afterNavigate=this.options.afterNavigating||function(){}},t.prototype.findRoute=function(t){return this.routes.find(function(e){var i=e.route;return-1!==t.indexOf(i)})},t.prototype.updateParams=function(t){this.app.$set(this.app,"params",t)},t.prototype.mergeParams=function(t){var e=this,i=Object.keys(this.params).filter(function(i){return-1!==e.baseParams.indexOf(i)||t.hasOwnProperty(i)}).reduce(function(t,i){return t[i]=e.params[i],t},{}),n=Object.assign({},i,t);this.updateParams(n),window.history.pushState(null,null,this.routeFromParams()),this.app.navigated()},t.prototype.routeFromParams=function(){var t=!!Object.keys(this.params).length;return location.pathname+(t?"?"+this.buildParams(this.params):"")},t.prototype.buildRoute=function(t){if(t.name){var e=this.routes.find(function(e){return e.name===t.name});if(!e)return null;var i=e.route,n=-1!==i.indexOf("?")?"&":"?";return i+(t.params?n+this.buildParams(t.params?t.params:{}):"")}},t.prototype.buildParams=function(t){return Object.keys(t).map(function(e){return e+"="+t[e]}).join("&")},t.prototype.parseLocation=function(t){return this.updateParams(pt(t.search)),pt(t.search),t.pathname+t.search},t.prototype.navigate=function(t){this.app&&(this.app.currentRoute=this.buildRoute(t)),this.updateParams(Object.assign({},t.params||{},pt(this.buildRoute(t)))),window.history.pushState(null,null,this.buildRoute(t)),this.app.navigated()},lt(t,[{key:"params",get:function(){return this.app?this.app.params:{}}}]),t}(),ct=ut,dt={set:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];t.isInitialized=!0,t.items=e},updatePreset:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;t.preset=e}},ht={},ft={isInitialized:!1,items:[],preset:{}},mt={item:function(t){return function(e){return U(t.items).find(e)}}},yt={namespaced:!0,mutations:dt,actions:ht,state:ft,getters:mt},vt=function(){function t(e,i){d(this,t),this.showMethod=e,this.errorMethod=i}return t.prototype.show=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.showMethod(t,e)},t.prototype.error=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.errorMethod(t,e)},t}(),bt=vt,gt=i(5),_t={Input:j,NoticeBlock:Y,Postbox:q,RouteLink:C,TransitionExpand:gt.a,Button:X},wt={register:function(t){t.TemplateEdit=function(){return rt},t.TemplateList=function(){return B},t.router=function(t){var e=t.document,i=t.TemplateEdit,n=t.TemplateList;return new ct([{route:WpraGlobal.templates_url_base+"&action",name:"templates-form",component:i},{route:WpraGlobal.templates_url_base,name:"templates",component:n}],{afterNavigating:function(){e.querySelector("html").scrollTop=0}})},t.App=function(t){return st(t)},t.vuex=function(t){return t.vue.use(k.a),k.a},t.notification=function(t){var e=t.vue;return e.use(g.a,{position:"top-center",duration:4e3,iconPack:"callback"}),new bt(e.toasted.show,e.toasted.error)},t.store=function(t){return new t.vuex.Store({modules:{templates:yt},state:{}})},t.http=function(){var t=WpraGlobal&&WpraGlobal.nonce?{headers:{"X-WP-Nonce":WpraGlobal.nonce}}:{};return v.a.create(t)};for(var e=Object.entries(_t),i=Array.isArray(e),n=0,e=i?e:e[Symbol.iterator]();;){var o;if("break"===function(){if(i){if(n>=e.length)return"break";o=e[n++]}else{if(n=e.next(),n.done)return"break";o=n.value}var a=o,r=a[0],s=a[1];t[r]=function(){return s}}())break}return t},run:function(t){t.container.vue.use(w.a,{theme:"light",animation:"fade",arrow:!0,arrowTransform:"scale(0)",placement:"right"})}},kt=i(4);i(41);var xt=h.Container,St=h.Core,At=h.Services;window.UiFramework&&(window.UiFramework=Object.assign({},window.UiFramework,St.UiFramework));var Tt={uiFramework:h,hooks:new At.HookService,document:document,vue:function(t){return kt.a.use(t.uiFramework.Core.InjectedComponents,{container:t}),kt.a}},Ct=new xt.ContainerFactory(m.a),Ot=new St.UiFramework.App(Ct,Tt);window.UiFramework.registerPlugin("templates-app",wt),Ot.use(WpraTemplates.modules||["templates-app"]),Ot.init({"#wpra-templates-app":"App"})},41:function(t,e){},5:function(t,e,i){"use strict";var n={name:"TransitionExpand",functional:!0,render:function(t,e){return t("transition",{props:{name:"expand"},on:{afterEnter:function(t){t.style.height="auto"},enter:function(t){var e=getComputedStyle(t),i=e.width;t.style.width=i,t.style.position="absolute",t.style.visibility="hidden",t.style.height="auto";var n=getComputedStyle(t),o=n.height;t.style.width=null,t.style.position=null,t.style.visibility=null,t.style.height=0,getComputedStyle(t).height,setTimeout(function(){t.style.height=o})},leave:function(t){var e=getComputedStyle(t),i=e.height;t.style.height=i,getComputedStyle(t).height,setTimeout(function(){t.style.height=0})}}},e.children)}},o=n,a=i(1),r=Object(a.a)(o,void 0,void 0,!1,null,null,null);e.a=r.exports},6:function(t,e,i){"use strict";function n(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!navigator.clipboard)return void o(t,e);navigator.clipboard.writeText(t).then(function(){},function(t){console.error("Async: Could not copy text: ",t)})}e.a=n;var o=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e=e||document.body.parentElement;var i=document.createElement("textarea");i.value=t;var n=e.scrollTop;document.body.appendChild(i),i.focus(),i.select();try{document.execCommand("copy")}catch(t){console.error("Fallback: Oops, unable to copy",t)}document.body.removeChild(i),e.scrollTop=n}}},[40])});
1
+ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.WPRA=e():t.WPRA=e()}("undefined"!=typeof self?self:this,function(){return webpackJsonpWPRA([1],{40:function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t){return new I(t)}function a(t){return t&&"object"===(void 0===t?"undefined":Z(t))&&"[object RegExp]"!==Object.prototype.toString.call(t)&&"[object Date]"!==Object.prototype.toString.call(t)}function r(t){return Array.isArray(t)?[]:{}}function s(t,e){return e&&!0===e.clone&&a(t)?u(r(t),t,e):t}function l(t,e,i){var n=t.slice();return e.forEach(function(e,o){void 0===n[o]?n[o]=s(e,i):a(e)?n[o]=u(t[o],e,i):-1===t.indexOf(e)&&n.push(s(e,i))}),n}function p(t,e,i){var n={};return a(t)&&Object.keys(t).forEach(function(e){n[e]=s(t[e],i)}),Object.keys(e).forEach(function(o){a(e[o])&&t[o]?n[o]=u(t[o],e[o],i):n[o]=s(e[o],i)}),n}function u(t,e,i){var n=Array.isArray(e),o=i||{arrayMerge:l},a=o.arrayMerge||l;return n?Array.isArray(t)?a(t,e,i):s(e,i):p(t,e,i)}function c(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function d(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var h=i(42),f=i(43),m=i.n(f),y=i(9),v=i.n(y),b=i(45),g=i.n(b),_=i(46),w=i.n(_),k=i(47),x=i(2),S=i.n(x),A=i(48),T=i.n(A),C={props:{path:{},gate:{}},inject:["router"],methods:{getPath:function(){return this.router.buildRoute(this.path)},navigate:function(t){var e=!this.gate||this.gate();t.preventDefault(),e&&this.router.navigate(this.path)}},render:function(){var t=this,e=arguments[0],i=this.getPath();return e("a",S()([{attrs:{href:i}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.navigate.apply(t,[e].concat(n))}}}]),[this.$slots.default])}},O=null,P={props:{mediaType:{type:String,default:"image"},mediaTitle:{type:String,default:"Select Media"},mediaValueProperty:{type:String,default:"id"}},methods:{mediaNode:function(){var t=this,e=this.$createElement;return this.assertMediaLoaded(),e("div",[e("input",{attrs:{type:"text"},domProps:{value:this.value}}),e("button",S()([{class:"button"},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.openFrame.apply(t,[e].concat(n))}}}]),["Choose image"])])},openFrame:function(){O||(O=this.createFrame()),O.open()},createFrame:function(){var t=this;return O=wp.media({title:this.mediaTitle,multiple:!1,library:{type:this.mediaType}}),O.on("close",function(){var e=O.state().get("selection"),i=null;e.each(function(t){i=t}),i&&i.id&&t.$emit("input",{id:i.id,url:i.attributes.url}[t.mediaValueProperty])}),O.on("open",function(){var e=O.state().get("selection");if("id"===t.mediaValueProperty&&t.value){var i=wp.media.attachment(t.value);i.fetch(),e.add(i?[i]:[])}}),O},assertMediaLoaded:function(){if(!window.wp.media)throw Error("[MediaInput] wp.media dependency is not loaded")}}},j={mixins:[P],props:{id:{type:String,default:function(){return Math.random().toString(36).substr(0,12)}},label:{},description:{},after:{},type:{},value:{},placeholder:{},title:{},inputDisabled:{},options:{default:function(){return{}}}},methods:{inputNode:function(){var t=this,e=this.$createElement;return"media"===this.type?this.mediaNode():"checkbox"===this.type?e("input",S()([{attrs:{type:"checkbox",id:this.id,placeholder:this.placeholder,disabled:this.$attrs.disabled||this.inputDisabled},domProps:{checked:!!this.value}},{attrs:this.$attrs},{on:{change:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(){return t.$emit("input",!t.value)}).apply(void 0,[e].concat(n))}}}])):"select"!==this.type?e("input",S()([{attrs:{type:this.type,id:this.id,placeholder:this.placeholder,disabled:this.$attrs.disabled||this.inputDisabled},domProps:{value:this.value}},{attrs:this.$attrs},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.$emit("input",e.target.value)}).apply(void 0,[e].concat(n))}}}])):this.selectNode()},selectNode:function(){var t=this,e=this.$createElement,i=Object.keys(this.options).map(function(i){return e("option",{domProps:{value:i,selected:t.value===i}},[t.options[i]])});return e("select",S()([{attrs:this.$attrs},{attrs:{id:this.id,disabled:this.$attrs.disabled||this.inputDisabled}},{on:{change:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.$emit("input",e.target.value)}).apply(void 0,[e].concat(n))}}}]),[i])}},render:function(){var t=arguments[0],e=[];return this.title&&e.push({name:"tippy"}),t("div",{class:{"form-input":!0,"form-input--disabled":this.$attrs.disabled||!1}},[this.label?t("label",{class:"form-input__label",attrs:{for:this.id}},[t("div",[this.label,this.title?t("div",S()([{class:"form-input__tip"},{directives:e},{attrs:{title:this.title}}]),[t("span",{class:"dashicons dashicons-editor-help"})]):null]),this.description?t("div",S()([{class:"form-input__label-description"},{domProps:{innerHTML:this.description}}])):""]):null,t("div",{class:"form-input__field"},[this.inputNode(),this.after])])}},L=function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{staticClass:"wpra-bottom-panel"},[t._t("default")],2)},W=[],M={},$=M,N=i(1),R=Object(N.a)($,L,W,!1,null,null,null),E=R.exports,D=function(t){return JSON.parse(JSON.stringify(t))},F="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},I=function(){function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"id";return n(this,t),this.data=e,this.primaryField=i,this}return t.prototype.find=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("object"!==(void 0===t?"undefined":F(t))&&null!==t){var i;i={},i[this.primaryField]=t,t=i}for(var n in this.data)if(this._isMatching(this.data[n],t))return this.data[n];return e},t.prototype.pluck=function(t){return this.data.map(function(e){return e[t]})},t.prototype.remove=function(t){for(var e in this.data)this._isMatching(this.data[e],t)&&this.data.splice(e,1);return this},t.prototype.appendDiff=function(t){for(var e=t,i=Array.isArray(e),n=0,e=i?e:e[Symbol.iterator]();;){var o;if(i){if(n>=e.length)break;o=e[n++]}else{if(n=e.next(),n.done)break;o=n.value}var a=o;this.contains(a)||this.data.push(a)}},t.prototype.prependDiff=function(t){for(var e=t.slice().reverse(),i=Array.isArray(e),n=0,e=i?e:e[Symbol.iterator]();;){var o;if(i){if(n>=e.length)break;o=e[n++]}else{if(n=e.next(),n.done)break;o=n.value}var a=o;this.contains(a)||this.data.unshift(a)}},t.prototype.contains=function(t){for(var e=this.data,i=Array.isArray(e),n=0,e=i?e:e[Symbol.iterator]();;){var o;if(i){if(n>=e.length)break;o=e[n++]}else{if(n=e.next(),n.done)break;o=n.value}if(o.id==t.id)return!0}return!1},t.prototype.filterValues=function(t){var e=this;return Object.keys(this.data).filter(function(i){return t(e.data[i],i)}).reduce(function(t,i){return t[i]=e.data[i],t},{})},t.prototype.filter=function(t){var e=this;return this.data.filter(function(i){return e._isMatching(i,t)})},t.prototype.whereIn=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"id",i=[],n={};n[e]=null;for(var o=t,a=Array.isArray(o),r=0,o=a?o:o[Symbol.iterator]();;){var s;if(a){if(r>=o.length)break;s=o[r++]}else{if(r=o.next(),r.done)break;s=r.value}var l=s;n[e]=l;var p=this.find(n);p&&i.push(p)}return i},t.prototype.key=function(e){return new t(this.data.slice().reduce(function(t,i){return t[i[e]]=i,t},{}))},t.prototype.mapValues=function(t){var e=this;return Object.keys(this.data).map(function(i){e.data[i]=t(e.data[i],i)}),this},t.prototype.values=function(){return this.data},t.prototype._isMatching=function(t,e){if(!(t instanceof Object||e instanceof Object))return t==e;for(var i=!0,n=Object.keys(e),o=Array.isArray(n),a=0,n=o?n:n[Symbol.iterator]();;){var r;if(o){if(a>=n.length)break;r=n[a++]}else{if(a=n.next(),a.done)break;r=a.value}var s=r,l=t.hasOwnProperty(s)&&t[s]==e[s];i=i&&l}return i},t}(),U=o,B={data:function(){return{loading:!1,columns:{name:{label:"Template Name",class:"column-primary"},style:{label:"Template Type"},previewTemplate:{label:"Preview"}},filters:WpraTemplates.options.type,checked:[],filter:{paged:parseInt(this.router.params.paged||1),type:this.router.params.type||"",s:this.router.params.s||""},baseUrl:WpraTemplates.base_url,total:0}},inject:["hooks","http","router"],computed:{totalPages:function(){return Math.ceil(this.total/20)},list:{get:function(){return this.$store.state.templates.items},set:function(t){this.$store.commit("templates/set",t)}}},methods:{navigated:function(){var t=this;Object.keys(this.filter).forEach(function(e){t.filter[e]=t.router.params[e]||""}),this.filter.paged=parseInt(this.filter.paged||1),this.fetchList()},fetchList:function(){var t=this;this.loading=!0;var e=this.getParams(),i=parseInt(e.paged);return delete e.paged,i&&1!==i&&(e.page=i),this.http.get(this.baseUrl,{params:e}).then(function(e){t.list=e.data.items,t.total=e.data.count}).finally(function(){t.loading=!1})},deleteTemplate:function(t){var e=this;if(confirm("Are you sure you want to delete this template? If this template is being used in a shortcode or Gutenberg block anywhere on your site, the default template will be used instead."))return this.loading=!0,this.http.delete(this.baseUrl+"/"+t).then(function(){return e.fetchList()}).then(function(){e.loading=!1})},bulkDelete:function(){var t=this;if(confirm("Are you sure you want to delete these templates? If a template is being used in a shortcode or Gutenberg block anywhere on your site, the default template will be used instead."))return this.loading=!0,this.http.delete(this.baseUrl,{params:{ids:this.checked}}).then(function(){return t.checked=[],t.$refs.table.checkedItems=[],t.fetchList()}).then(function(){t.loading=!1})},duplicateTemplate:function(t){var e=D(t);delete e.id,"__built_in"===e.type&&delete e.type,e.name=e.name+" (Copy)",this.$store.commit("templates/updatePreset",e),this.router.navigate({name:"templates",params:{action:"new"}})},getPreviewLink:function(t){return WpraGlobal.admin_base_url+"?wpra_preview_template="+t.id},createTemplate:function(){this.$store.commit("templates/updatePreset",{}),this.router.navigate({name:"templates",params:{action:"new"}})},setChecked:function(t){var e=this;this.checked=t.filter(function(t){return"__built_in"!==U(e.list).find(t,{}).type})},getParams:function(){var t=this;return Object.keys(this.filter).filter(function(e){return!!t.filter[e]&&"all"!==t.filter[e]}).reduce(function(e,i){return e[i]=t.filter[i],e},{})},setFilter:function(t,e){this.filter[t]=e},submitFilter:function(){this.router.mergeParams(this.getParams())},getRowClass:function(t){return"__built_in"===t.type?"built-in":""}},render:function(){var t=this,e=arguments[0],i=function(t){return{name:"templates",params:{action:"edit",id:t}}},n=this.hooks.apply("wpra-templates-list-cells",this,{name:function(n){var o=n.row;return[e("div",[e("strong",[e(C,{attrs:{path:i(o.id)}},[o.name])]),e("small",{style:{paddingLeft:"4px",opacity:"0.6"}},[o.slug]),"__built_in"===o.type?e("span",{style:{opacity:"0.6",display:"block"}},['This is the default feed template. To create your own, either duplicate it or click "Add New" above.']):null]),e("div",{class:"row-actions"},[e("span",{attrs:{className:"edit"}},[e(C,{attrs:{path:i(o.id)}},["Edit"])," |"]),e("span",{class:"inline",style:{paddingLeft:"4px"}},[e("a",S()([{attrs:{href:"#"}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),a=1;a<i;a++)n[a-1]=arguments[a];(function(e){e.preventDefault(),t.duplicateTemplate(o)}).apply(void 0,[e].concat(n))}}}]),["Duplicate"])," ","__built_in"!==o.type?"|":""]),"__built_in"!==o.type?e("span",S()([{class:"trash",style:{paddingLeft:"4px"}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),a=1;a<i;a++)n[a-1]=arguments[a];(function(e){e.preventDefault(),t.deleteTemplate(o.id)}).apply(void 0,[e].concat(n))}}}]),[e("a",{attrs:{href:"#","aria-label":"Delete Item"},class:"submitdelete"},["Delete"])]):null])]},style:function(i){var n=i.row;return t.filters[n.type]?[e("div",[t.filters[n.type]])]:[e("div",[t.filters.list," ",e("span",{style:{opacity:.7,fontSize:"90%"}},["(Missing type: ",e("code",[n.type]),")"])])]},previewTemplate:function(i){var n=i.row;return[e("div",[e("a",{attrs:{href:t.getPreviewLink(n),target:"wpra-preview-template"},class:"wpra-preview-link"},["Open preview ",e("span",{class:"dashicons dashicons-external"})])])]},filters:function(){var i=Object.keys(WpraTemplates.options.type).filter(function(t){return"_"!==t[0]}).reduce(function(t,e){return t[e]=WpraTemplates.options.type[e],t},{all:"Select Template Type"});return[e(j,S()([{attrs:{type:"select",options:i,value:t.filter.type},style:{margin:0}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){t.filter.type=e,t.submitFilter()}).apply(void 0,[e].concat(n))}}}]))]}}),o=e("div",[e("h1",{class:"wp-heading-inline"},["Templates"]),e("a",S()([{class:"page-title-action",attrs:{href:"#"}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){e.preventDefault(),t.createTemplate()}).apply(void 0,[e].concat(n))}}}]),["Add New"]),e("p",{class:"search-box",style:{padding:"10px 0"}},[e("label",{class:"screen-reader-text",attrs:{for:"post-search-input"}},["Search Templates:"]),e("input",S()([{attrs:{type:"search",id:"post-search-input",name:"s"},domProps:{value:this.filter.s}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.filter.s=e.target.value}).apply(void 0,[e].concat(n))},keyup:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];if(!("button"in e)&&t._k(e.keyCode,"enter",13))return null;t.submitFilter.apply(t,[e].concat(n))}}}])),e("input",S()([{attrs:{type:"submit",id:"search-submit",value:"Search Templates"},class:"button"},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.submitFilter.apply(t,[e].concat(n))}}}]))]),e(T.a,S()([{attrs:{columns:this.columns,rows:this.list,loading:this.loading,totalItems:this.total,perPage:20,totalPages:this.totalPages,currentPage:this.filter.paged,notFound:"No templates found.",rowClass:this.getRowClass},ref:"table",class:{"wpra-no-cb":0===this.list.length||1===this.list.length&&"__built_in"===this.list[0].type},scopedSlots:n},{on:{checked:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.setChecked.apply(t,[e].concat(n))},pagination:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){t.filter.paged=e,t.submitFilter()}).apply(void 0,[e].concat(n))}}}])),this.checked.length?e(E,[e("div",{class:"flex-row"},[e("div",{class:"flex-col"},[e("div",{class:"wpra-bottom-panel__title"},["Bulk Actions"]),e("a",S()([{attrs:{href:"#"}},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){e.preventDefault(),t.bulkDelete()}).apply(void 0,[e].concat(n))}}}]),["Delete"])])])]):null]);return this.hooks.apply("wpra-templates-list",this,o)}},V={inject:["hooks"],data:function(){return{expanded:!0}},props:{title:{},id:{},submit:{type:Boolean,default:!1},context:{}},methods:{toggle:function(){this.expanded=!this.expanded}},render:function(t){var e=this;return this.hooks.apply("postbox-"+this.id,this.context||this,t("div",{class:"postbox wpra-postbox",attrs:{id:this.submit?"submitdiv":""}},[t("div",{class:"postbox-header"},[t("h2",S()([{class:"hndle ui-sortable-handle"},{on:{click:function(t){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];e.toggle.apply(e,[t].concat(n))}}}]),[t("span",[this.title])])]),t("div",{class:"inside"},[this.hooks.apply("postbox-content-"+this.id,this.context||this,[this.$slots.default],{h:t})])]),{h:t})}},G=V,J=Object(N.a)(G,void 0,void 0,!1,null,null,null),q=J.exports,z={render:function(){return(0,arguments[0])("div",{attrs:{id:"postbox-container-2"},class:"postbox-container"},[this.$slots.default])}},H={render:function(){return(0,arguments[0])("div",{attrs:{id:"postbox-container-1"},class:"wpra-postbox-container postbox-container"},[this.$slots.default])}},K={render:function(){return(0,arguments[0])("div",{attrs:{id:"post-body"}},[this.$slots.default])}},X={props:{loading:{type:Boolean,default:!1}},render:function(){return(0,arguments[0])("button",{attrs:{disabled:this.loading},class:{button:!0,"loading-button":this.loading}},[this.$slots.default])}},Y={data:function(){return{shouldBeVisible:!0}},props:{id:{type:String,required:!0},title:{type:String},body:{type:String},learnMore:{default:!1},okayText:{type:String,default:"Got it"},learnMoreText:{type:String,default:"Learn more"},visible:{type:Boolean,default:!0}},computed:{isVisible:function(){return this.visible&&this.shouldBeVisible&&JSON.parse(localStorage.getItem(this.getBlockKey())||"true")}},methods:{onOkayClick:function(){this.shouldBeVisible=!1,localStorage.setItem(this.getBlockKey(),JSON.stringify(!1))},onLearnMoreClick:function(){window.open(this.learnMore,"_blank").focus()},getBlockKey:function(){return"wpra-"+this.id+"-visible"}},render:function(){var t=arguments[0];if(!this.isVisible)return null;var e=this.learnMore?t(X,{class:"button-clear",nativeOn:{click:this.onLearnMoreClick}},[this.learnMoreText," ",t("span",{class:"dashicons dashicons-external"})]):null;return t("div",{class:"wpra-notice-block"},[t("div",{class:"wpra-notice-block__title"},[this.title]),t("div",S()([{class:"wpra-notice-block__body"},{domProps:{innerHTML:this.body}}])),t("div",{class:"wpra-notice-block__buttons"},[t(X,{class:"brand button-primary",nativeOn:{click:this.onOkayClick}},[this.okayText]),e])])}},Z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};u.all=function(t,e){if(!Array.isArray(t)||t.length<2)throw new Error("first argument should be an array with at least two elements");return t.reduce(function(t,i){return u(t,i,e)})};var Q=u,tt=i(49),et=i.n(tt),it={data:function(){return{changes:{model:{}}}},methods:{isChanged:function(){return!et()(this.model,this.changes.model)},rememberModel:function(){this.$set(this.changes,"model",D(this.model))},cancelChanges:function(){confirm("Are you sure you want to cancel your changes for this template? This action cannot be reverted and all changes made since your last save will be lost.")&&this.$set(this,"model",D(this.changes.model))}}},nt={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(t){var e,i,n,o,a,r,s,l="",p=0;for(t=nt._utf8_encode(t);p<t.length;)e=t.charCodeAt(p++),i=t.charCodeAt(p++),n=t.charCodeAt(p++),o=e>>2,a=(3&e)<<4|i>>4,r=(15&i)<<2|n>>6,s=63&n,isNaN(i)?r=s=64:isNaN(n)&&(s=64),l=l+this._keyStr.charAt(o)+this._keyStr.charAt(a)+this._keyStr.charAt(r)+this._keyStr.charAt(s);return l},decode:function(t){var e,i,n,o,a,r,s,l="",p=0;for(t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");p<t.length;)o=this._keyStr.indexOf(t.charAt(p++)),a=this._keyStr.indexOf(t.charAt(p++)),r=this._keyStr.indexOf(t.charAt(p++)),s=this._keyStr.indexOf(t.charAt(p++)),e=o<<2|a>>4,i=(15&a)<<4|r>>2,n=(3&r)<<6|s,l+=String.fromCharCode(e),64!=r&&(l+=String.fromCharCode(i)),64!=s&&(l+=String.fromCharCode(n));return l=nt._utf8_decode(l)},_utf8_encode:function(t){t=t.replace(/\r\n/g,"\n");for(var e="",i=0;i<t.length;i++){var n=t.charCodeAt(i);n<128?e+=String.fromCharCode(n):n>127&&n<2048?(e+=String.fromCharCode(n>>6|192),e+=String.fromCharCode(63&n|128)):(e+=String.fromCharCode(n>>12|224),e+=String.fromCharCode(n>>6&63|128),e+=String.fromCharCode(63&n|128))}return e},_utf8_decode:function(t){for(var e="",i=0,n=0,o=0;i<t.length;)n=t.charCodeAt(i),n<128?(e+=String.fromCharCode(n),i++):n>191&&n<224?(o=t.charCodeAt(i+1),e+=String.fromCharCode((31&n)<<6|63&o),i+=2):(o=t.charCodeAt(i+1),c3=t.charCodeAt(i+2),e+=String.fromCharCode((15&n)<<12|(63&o)<<6|63&c3),i+=3);return e}},ot=nt,at=i(6),rt={mixins:[it],data:function(){return{typeOptions:Object.keys(WpraTemplates.options.type).filter(function(t){return"_"!==t[0]}).reduce(function(t,e){return t[e]=WpraTemplates.options.type[e],t},{}),model:D(WpraTemplates.model_schema),validation:D(WpraTemplates.model_schema),tooltips:D(WpraTemplates.model_tooltips),baseUrl:WpraTemplates.base_url,isSaving:!1,isLoading:!1}},inject:["hooks","http","router","notification"],mounted:function(){this.resolveEditingItem()},computed:{previewUrl:function(){var t=ot.encode(JSON.stringify(this.model.options));return WpraGlobal.admin_base_url+"?wpra_preview_template="+this.router.params.id+"&wpra_template_options="+t}},methods:{resolveEditingItem:function(){var t=this,e=Q(D(WpraTemplates.model_schema),this.$store.state.templates.preset);this.isLoading=!0,function(){var e=t.router.params.id;if(!e)return Promise.resolve(null);var i=t.$store.getters["templates/item"](e);return i?Promise.resolve(i):t.http.get(t.baseUrl+"/"+e).then(function(t){return t.data})}().then(function(i){if(t.isLoading=!1,!i)return t.$set(t,"model",e),void t.rememberModel();i=Object.assign({},i),t.model=Q(t.model,i),t.rememberModel()})},save:function(){var t=this,e=!this.model.id;this.isSaving=!0,this.runRequest().then(function(i){t.model=Q(t.model,i.data),t.rememberModel(),t.notification.show("Template saved!",{type:"success",icon:function(t){return t.classList.add("dashicons","dashicons-yes"),t}}),e&&t.router.navigate({name:"templates",params:{action:"edit",id:i.data.id}})},function(e){t.notification.show("Something went wrong. Template is not saved!",{type:"error",icon:function(t){return t.classList.add("dashicons","dashicons-warning"),t}})}).finally(function(){t.isSaving=!1})},runRequest:function(){var t=this.model.id?"put":"post",e=this.model.id?this.baseUrl+"/"+this.model.id:this.baseUrl;return this.http[t](e,this.prepareModel())},prepareModel:function(){var t=this,e=Object.keys(WpraTemplates.model_schema);return Object.keys(this.model).filter(function(i){return!(!e.includes(i)||"__built_in"===t.model.type&&["name","type"].includes(i)||["slug","id"].includes(i))}).reduce(function(e,i){return e[i]=t.model[i],e},{})},getShortcode:function(){return'[wp-rss-aggregator template="'+this.model.slug+'"]'},preventLoosingNotSavedData:function(){return!this.isChanged()||confirm("You have unsaved changes. All changes will be lost if you go back to the Template list before updating. Are you sure you want to continue?")},copyShortcode:function(t){Object(at.a)(this.getShortcode());var e=t.target.innerText;t.target.style.width=t.target.getBoundingClientRect().width+"px",t.target.disabled=!0,t.target.innerText="Copied!",setTimeout(function(){t.target.style.width=null,t.target.innerText=e,t.target.disabled=!1},5e3)}},render:function(){var t=this,e=arguments[0],i={name:"templates"},n=null,o=null,a=e(Y,{class:"postbox",attrs:{id:"templates-usage",title:"Setting up your Templates",body:'Templates are used to display the items imported using WP RSS Aggregator. Choose the preferred options below and use them anywhere on your site via our <a href="https://kb.wprssaggregator.com/article/54-displaying-imported-items-shortcode#tinymce" target="_blank">shortcode</a> or our <a href="https://kb.wprssaggregator.com/article/454-displaying-imported-items-block-gutenberg" target="_blank">block</a>.',learnMore:"https://kb.wprssaggregator.com/article/457-templates"}});this.router.params.id&&(n=e("div",{attrs:{id:""},style:{padding:"6px 0"}},[e("div",{class:"misc-pub-section misc-pub-visibility"},[e("a",{attrs:{href:this.previewUrl,role:"button",target:"wpra-preview-template"},class:"wpra-preview-link",style:{marginLeft:"4px",textDecoration:"none"}},["Open preview",e("span",{class:"dashicons dashicons-external"})])])])),this.model.id&&(o=e("div",{class:"wpra-shortcode-copy",attrs:{title:"Copy chortcode"}},[e("div",{class:"wpra-shortcode-copy__content"},[e("strong",["Shortcode: "]),e("code",[this.getShortcode()])]),e("div",{class:"wpra-shortcode-copy__icon"},[e("button",S()([{class:"button"},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];t.copyShortcode.apply(t,[e].concat(n))}}}]),["Copy Shortcode"])])]));var r=e("div",[e("div",{class:"page-title"},[e(C,{class:"back-button",attrs:{path:i,gate:this.preventLoosingNotSavedData}},[e("span",{class:"dashicons dashicons-arrow-left-alt"}),"Templates"]),e("h1",[this.router.params.id?this.changes.model.name||this.changes.model.slug:"Create a New Template"]),o]),e("div",{attrs:{id:"poststuff"}},[this.isLoading?e("div",{class:"loading-container"}):e(K,{class:"metabox-holder columns-2"},[e(z,[a,e(q,{attrs:{id:"template-details",title:"Template Details",context:this}},[e(j,S()([{attrs:{type:"text",label:"Template name",value:this.model.name,disabled:"__built_in"===this.model.type}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.name=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"select",label:"Template type",value:this.model.type,options:this.typeOptions,disabled:"__built_in"===this.model.type,inputDisabled:!WpraTemplates.options.is_type_enabled,description:WpraTemplates.options.is_type_enabled?null:'<div class="disable-ignored"><strong class="disable-ignored">Get more template types, including a customisable grid template.</strong> <a target="_blank" href="https://www.wprssaggregator.com/extensions/templates/" class="disable-ignored">Learn more.</a></div>'}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.type=e}).apply(void 0,[e].concat(n))}}}])),"__built_in"===this.model.type?e("div",{class:"wpra-info-box"},[e("div",{class:"wpra-info-box__icon"},[e("span",{class:"dashicons dashicons-info"})]),e("div",{class:"wpra-info-box__text"},["This is the default template for WP RSS Aggregator. It is used as the fallback template when one is not selected via the shortcode or block. To create a new one, please go back to the templates list page."])]):null]),e(q,{attrs:{id:"template-options",title:"Template Options",context:this}},[e(j,S()([{attrs:{type:"checkbox",label:"Link title to original article",value:this.model.options.title_is_link,title:this.tooltips.options.title_is_link}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.title_is_link=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"number",label:"Title maximum length",value:this.model.options.title_max_length||"",placeholder:"No limit",title:this.tooltips.options.title_max_length}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.title_max_length=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"number",label:"Number of items to show",value:this.model.options.limit||"",title:this.tooltips.options.limit,placeholder:"Show all items",min:"0"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.limit=""===e?0:e}).apply(void 0,[e].concat(n))}}}])),e("div",{attrs:{id:"wpra-list-template-publish-date"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show publish date",value:this.model.options.date_enabled,title:this.tooltips.options.date_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.date_enabled=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"text",label:"Date prefix",value:this.model.options.date_prefix,disabled:!this.model.options.date_enabled,title:this.tooltips.options.date_prefix}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.date_prefix=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"text",label:"Date format",value:this.model.options.date_format,disabled:this.model.options.date_use_time_ago||!this.model.options.date_enabled,title:this.tooltips.options.date_format}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.date_format=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"checkbox",label:'Use "time ago" format',description:"Example: 20 minutes ago",value:this.model.options.date_use_time_ago,disabled:!this.model.options.date_enabled,title:this.tooltips.options.date_use_time_ago}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.date_use_time_ago=e}).apply(void 0,[e].concat(n))}}}]))]),e("div",{attrs:{id:"wpra-list-template-source"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show source name",value:this.model.options.source_enabled,title:this.tooltips.options.source_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.source_enabled=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"text",label:"Source prefix",value:this.model.options.source_prefix,disabled:!this.model.options.source_enabled,title:this.tooltips.options.source_prefix}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.source_prefix=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"checkbox",label:"Link source name",value:this.model.options.source_is_link,disabled:!this.model.options.source_enabled,title:this.tooltips.options.source_is_link}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.source_is_link=e}).apply(void 0,[e].concat(n))}}}]))]),e("div",{attrs:{id:"wpra-list-template-author"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show author name",value:this.model.options.author_enabled,title:this.tooltips.options.author_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.author_enabled=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"text",label:"Author prefix",value:this.model.options.author_prefix,disabled:!this.model.options.author_enabled,title:this.tooltips.options.author_prefix}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.author_prefix=e}).apply(void 0,[e].concat(n))}}}]))]),e("div",{attrs:{id:"wpra-list-template-pagination"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Pagination",value:this.model.options.pagination,title:this.tooltips.options.pagination,disabled:parseInt(this.model.options.limit)<1||!this.model.options.limit},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.pagination=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"select",label:"Pagination style",options:WpraTemplates.options.pagination_type,value:this.model.options.pagination_type,disabled:!this.model.options.pagination||parseInt(this.model.options.limit)<1||!this.model.options.limit,title:this.tooltips.options.pagination_type}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.pagination_type=e}).apply(void 0,[e].concat(n))}}}]))]),e("div",{attrs:{id:"wpra-list-template-bullets"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show bullets",value:this.model.options.bullets_enabled,title:this.tooltips.options.bullets_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.bullets_enabled=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"select",label:"Bullet style",options:WpraTemplates.options.bullet_type,value:this.model.options.bullet_type,disabled:!this.model.options.bullets_enabled,title:this.tooltips.options.bullet_type}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.bullet_type=e}).apply(void 0,[e].concat(n))}}}]))]),WpraTemplates.audio_features_enabled&&e("div",{attrs:{id:"wpra-list-template-media"},style:{paddingTop:"10px"}},[e(j,S()([{attrs:{type:"checkbox",label:"Show audio player",value:this.model.options.audio_player_enabled,title:this.tooltips.options.audio_player_enabled},style:{fontWeight:"bold"}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.audio_player_enabled=e}).apply(void 0,[e].concat(n))}}}]))])])]),e(H,[e(q,{attrs:{id:"template-create",title:this.model.id?"Update Template":"Create Template",submit:!0,context:this},class:"wpra-postbox-last"},[e("div",{class:"submitbox",attrs:{id:"submitpost"}},[n,e("div",{attrs:{id:"major-publishing-actions"}},[e("div",{attrs:{id:"delete-action"}},[this.isChanged()?e("a",S()([{attrs:{href:"#"},class:"submitdelete"},{on:{click:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){e.preventDefault(),t.cancelChanges()}).apply(void 0,[e].concat(n))}}}]),["Cancel Changes"]):null]),e("div",{attrs:{id:"publishing-action"}},[e(X,{class:"button-primary button-large",attrs:{loading:this.isSaving},nativeOn:{click:this.save}},[this.model.id?"Save":"Publish"])]),e("div",{class:"clear"})])])]),e(q,{attrs:{id:"template-link-preferences",title:"Link Preferences",context:this}},[e("p",{style:{opacity:.65}},["These options apply to all links within this template."]),e(j,S()([{attrs:{type:"checkbox",label:"Set links as nofollow",value:this.model.options.links_nofollow,title:this.tooltips.options.links_nofollow}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.links_nofollow=e}).apply(void 0,[e].concat(n))}}}])),e(j,S()([{attrs:{type:"select",label:"Open links behaviour",value:this.model.options.links_behavior,options:WpraTemplates.options.links_behavior,title:this.tooltips.options.links_behavior},class:"form-input--vertical"},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.links_behavior=e}).apply(void 0,[e].concat(n))}}}])),"lightbox"===this.model.options.links_behavior?e("div",{class:"notice notice-info notice-alt"},[e("p",["Some sites may not allow their content to be shown in a lightbox."]),e("p",["Embedded content usually works. Try ticking the below checkbox."]),e("p",[e("a",{attrs:{href:"https://kb.wprssaggregator.com/article/471-q-why-wont-some-of-my-feed-items-work-with-the-lightbox-link-behaviour-for-templates",target:"_blank"}},["Learn more"])])]):null,e(j,S()([{attrs:{type:"checkbox",label:"Set links to open embeds",value:this.model.options.link_to_embed,title:this.tooltips.options.link_to_embed}},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.link_to_embed=e}).apply(void 0,[e].concat(n))}}}]))]),e(q,{attrs:{id:"template-custom-css",title:"Custom Style",context:this}},[e(j,S()([{attrs:{type:"text",label:"Custom HTML class name",value:this.model.options.custom_css_classname,title:this.tooltips.options.custom_css_classname},class:"form-input--vertical"},{on:{input:function(e){for(var i=arguments.length,n=Array(i>1?i-1:0),o=1;o<i;o++)n[o-1]=arguments[o];(function(e){return t.model.options.custom_css_classname=e}).apply(void 0,[e].concat(n))}}}]))])])])])]);return this.hooks.apply("wpra-templates-form",this,r)}},st=function(t){var e=t.store,i=t.router;return{store:e,data:function(){return{afterNavigate:function(){},params:{},currentRoute:null}},created:function(){i.setApp(this),this.currentRoute=i.parseLocation(window.location),this.navigated()},mounted:function(){var t=this;window.addEventListener("popstate",function(){t.currentRoute=i.parseLocation(window.location),t.navigated()})},methods:{ViewComponent:function(){return i.findRoute(this.currentRoute).component},navigated:function(){var t=this;this.$nextTick(function(){var e=t.$refs.main;e&&e.navigated&&e.navigated({route:i.findRoute(t.currentRoute)})})}},render:function(t){var e=t(this.ViewComponent(),{ref:"main"});return this.afterNavigate(),e}}},lt=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),pt=function(t){t||(t=location.href);var e=t.indexOf("?"),i=t.indexOf("#");if(-1==i&&-1==e)return{};-1==i&&(i=t.length);var n=-1==e||i==e+1?t.substring(i):t.substring(e+1,i),o={};return n.split("&").forEach(function(t){if(t){t=t.split("+").join(" ");var e=t.indexOf("="),i=e>-1?t.substr(0,e):t,n=e>-1?decodeURIComponent(t.substr(e+1)):"",a=i.indexOf("[");if(-1==a)o[decodeURIComponent(i)]=n;else{var r=i.indexOf("]",a),s=decodeURIComponent(i.substring(a+1,r));i=decodeURIComponent(i.substring(0,a)),o[i]||(o[i]=[]),s?o[i][s]=n:o[i].push(n)}}}),o},ut=function(){function t(e,i){c(this,t),this.routes=e,this.options=i,this.baseParams=i.baseParams||["post_type","page","action","id"]}return t.prototype.setApp=function(t){this.app=t,this.app.afterNavigate=this.options.afterNavigating||function(){}},t.prototype.findRoute=function(t){return this.routes.find(function(e){var i=e.route;return-1!==t.indexOf(i)})},t.prototype.updateParams=function(t){this.app.$set(this.app,"params",t)},t.prototype.mergeParams=function(t){var e=this,i=Object.keys(this.params).filter(function(i){return-1!==e.baseParams.indexOf(i)||t.hasOwnProperty(i)}).reduce(function(t,i){return t[i]=e.params[i],t},{}),n=Object.assign({},i,t);this.updateParams(n),window.history.pushState(null,null,this.routeFromParams()),this.app.navigated()},t.prototype.routeFromParams=function(){var t=!!Object.keys(this.params).length;return location.pathname+(t?"?"+this.buildParams(this.params):"")},t.prototype.buildRoute=function(t){if(t.name){var e=this.routes.find(function(e){return e.name===t.name});if(!e)return null;var i=e.route,n=-1!==i.indexOf("?")?"&":"?";return i+(t.params?n+this.buildParams(t.params?t.params:{}):"")}},t.prototype.buildParams=function(t){return Object.keys(t).map(function(e){return e+"="+t[e]}).join("&")},t.prototype.parseLocation=function(t){return this.updateParams(pt(t.search)),pt(t.search),t.pathname+t.search},t.prototype.navigate=function(t){this.app&&(this.app.currentRoute=this.buildRoute(t)),this.updateParams(Object.assign({},t.params||{},pt(this.buildRoute(t)))),window.history.pushState(null,null,this.buildRoute(t)),this.app.navigated()},lt(t,[{key:"params",get:function(){return this.app?this.app.params:{}}}]),t}(),ct=ut,dt={set:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];t.isInitialized=!0,t.items=e},updatePreset:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;t.preset=e}},ht={},ft={isInitialized:!1,items:[],preset:{}},mt={item:function(t){return function(e){return U(t.items).find(e)}}},yt={namespaced:!0,mutations:dt,actions:ht,state:ft,getters:mt},vt=function(){function t(e,i){d(this,t),this.showMethod=e,this.errorMethod=i}return t.prototype.show=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.showMethod(t,e)},t.prototype.error=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.errorMethod(t,e)},t}(),bt=vt,gt=i(5),_t={Input:j,NoticeBlock:Y,Postbox:q,RouteLink:C,TransitionExpand:gt.a,Button:X},wt={register:function(t){t.TemplateEdit=function(){return rt},t.TemplateList=function(){return B},t.router=function(t){var e=t.document,i=t.TemplateEdit,n=t.TemplateList;return new ct([{route:WpraGlobal.templates_url_base+"&action",name:"templates-form",component:i},{route:WpraGlobal.templates_url_base,name:"templates",component:n}],{afterNavigating:function(){e.querySelector("html").scrollTop=0}})},t.App=function(t){return st(t)},t.vuex=function(t){return t.vue.use(k.a),k.a},t.notification=function(t){var e=t.vue;return e.use(g.a,{position:"top-center",duration:4e3,iconPack:"callback"}),new bt(e.toasted.show,e.toasted.error)},t.store=function(t){return new t.vuex.Store({modules:{templates:yt},state:{}})},t.http=function(){var t=WpraGlobal&&WpraGlobal.nonce?{headers:{"X-WP-Nonce":WpraGlobal.nonce}}:{};return v.a.create(t)};for(var e=Object.entries(_t),i=Array.isArray(e),n=0,e=i?e:e[Symbol.iterator]();;){var o;if("break"===function(){if(i){if(n>=e.length)return"break";o=e[n++]}else{if(n=e.next(),n.done)return"break";o=n.value}var a=o,r=a[0],s=a[1];t[r]=function(){return s}}())break}return t},run:function(t){t.container.vue.use(w.a,{theme:"light",animation:"fade",arrow:!0,arrowTransform:"scale(0)",placement:"right"})}},kt=i(4);i(41);var xt=h.Container,St=h.Core,At=h.Services;window.UiFramework&&(window.UiFramework=Object.assign({},window.UiFramework,St.UiFramework));var Tt={uiFramework:h,hooks:new At.HookService,document:document,vue:function(t){return kt.a.use(t.uiFramework.Core.InjectedComponents,{container:t}),kt.a}},Ct=new xt.ContainerFactory(m.a),Ot=new St.UiFramework.App(Ct,Tt);window.UiFramework.registerPlugin("templates-app",wt),Ot.use(WpraTemplates.modules||["templates-app"]),Ot.init({"#wpra-templates-app":"App"})},41:function(t,e){},5:function(t,e,i){"use strict";var n={name:"TransitionExpand",functional:!0,render:function(t,e){return t("transition",{props:{name:"expand"},on:{afterEnter:function(t){t.style.height="auto"},enter:function(t){var e=getComputedStyle(t),i=e.width;t.style.width=i,t.style.position="absolute",t.style.visibility="hidden",t.style.height="auto";var n=getComputedStyle(t),o=n.height;t.style.width=null,t.style.position=null,t.style.visibility=null,t.style.height=0,getComputedStyle(t).height,setTimeout(function(){t.style.height=o})},leave:function(t){var e=getComputedStyle(t),i=e.height;t.style.height=i,getComputedStyle(t).height,setTimeout(function(){t.style.height=0})}}},e.children)}},o=n,a=i(1),r=Object(a.a)(o,void 0,void 0,!1,null,null,null);e.a=r.exports},6:function(t,e,i){"use strict";function n(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!navigator.clipboard)return void o(t,e);navigator.clipboard.writeText(t).then(function(){},function(t){console.error("Async: Could not copy text: ",t)})}e.a=n;var o=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e=e||document.body.parentElement;var i=document.createElement("textarea");i.value=t;var n=e.scrollTop;document.body.appendChild(i),i.focus(),i.select();try{document.execCommand("copy")}catch(t){console.error("Fallback: Oops, unable to copy",t)}document.body.removeChild(i),e.scrollTop=n}}},[40])});
js/heartbeat.js CHANGED
@@ -45,6 +45,9 @@
45
  var updatesCol = row.find('td.column-updates');
46
  var itemsCol = row.find('td.column-feed-count');
47
 
 
 
 
48
  // Update the next update time
49
  updatesCol.find('code.next-update').text( feed_source['next-update'] );
50
 
45
  var updatesCol = row.find('td.column-updates');
46
  var itemsCol = row.find('td.column-feed-count');
47
 
48
+ // Toggle the state checkbox
49
+ row.find('input.wprss-toggle-feed-state').prop('checked', feed_source['active']);
50
+
51
  // Update the next update time
52
  updatesCol.find('code.next-update').text( feed_source['next-update'] );
53
 
readme.txt CHANGED
@@ -1,29 +1,29 @@
1
- === WP RSS Aggregator - Automatic and Powerful Content Aggregation and Curation ===
2
  Contributors: RebelCode, jeangalea, markzahra, Mekku
3
  Plugin URI: https://www.wprssaggregator.com
4
- Tags: RSS import, RSS aggregator, feed import, content curation, feed to post, news aggregator, autoblog, rss to post, content syndication, feeds, rss feeds, rss importer, feed importer, post importer, news importer
5
  Requires at least: 4.0 or higher
6
  Tested up to: 5.6
7
  Requires PHP: 5.4
8
- Stable tag: 4.17.10
9
  License: GPLv3
10
 
11
- The most popular RSS aggregator for WordPress. Build a news aggregator with content from unlimited sources within minutes. Simple, robust & powerful.
12
 
13
  == Description ==
14
 
15
- WP RSS Aggregator is the original, most popular, and most robust plugin for importing, merging, and displaying RSS and Atom feeds anywhere on your site within minutes. Set up your feeds and let the plugin do the leg-work.
16
 
17
  == Automatically import RSS feeds & display them on your site ==
18
 
19
  * Import unlimited content from an unlimited number of sites.
20
- * Manage all your content sources from a single page.
21
- * Set each feed source to fetch new content automatically.
22
  * Customise the [display templates](https://kb.wprssaggregator.com/article/457-templates) to match your website's design.
23
- * Built-in [shortcode](https://kb.wprssaggregator.com/article/54-how-to-use-the-shortcode-to-display-feed-items) and [Gutenberg block](https://kb.wprssaggregator.com/article/454-displaying-imported-items-block-gutenberg) to display your feeds in seconds.
24
  * RSS feed auto-discovery for sources with hard-to-find RSS feeds.
25
- * Import Youtube videos and have them playable on your site.
26
- * Limit the items stored and fetched for improved performance.
27
  * Create a custom RSS feed from imported items to use elsewhere.
28
  * Extendable via action and filter hooks.
29
 
@@ -36,6 +36,7 @@ Importing and displaying RSS feeds is a powerful tool for many website owners.
36
  * Aggregator or curate news from the top sources in your market or niche to improve your SEO and build a better reputation.
37
  * Show related content from other reputable sites to build a sense of trust with your readers.
38
  * Since video content has become so popular, link to Youtube videos anywhere on your site to provide visitors with more reasons to stick around.
 
39
  * Provide value to your readers by curating job openings, real estate listings, or other information to help them grow.
40
  * Aggregate ever-popular podcast episodes related to the topic of your website to keep visitors engaged.
41
  * Authors, writers, and other content creators, display a feed of your work from multiple sites in a single portfolio.
@@ -74,26 +75,28 @@ Find out more... [**Content curation and SEO: What you need to know**](https://w
74
 
75
  == Premium features ==
76
 
77
- WP RSS Aggregator can be extended through its powerful [premium add-ons](https://www.wprssaggregator.com/extensions/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_premium_features) and [discounted plans](https://www.wprssaggregator.com/pricing/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_seo_benefits).
78
 
79
- * **[Feed to Post](https://www.wprssaggregator.com/extension/feed-to-post/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_f2p_link&utm_content=f2p_link)** is the most powerful add-on available, enabling you to import feeds into WordPress Posts or any other custom post type. It includes options such as automatically assigning a post type, the post status, categories, tags, images, authors, and more.
 
 
80
  * **[Full Text RSS Feeds](https://www.wprssaggregator.com/extension/full-text-rss-feeds/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_ftr_link&utm_content=ftr_link)** takes Feed to Post to the next level by connecting it to our premium full text service. This helps bring in content from sources that don't provide it in their RSS feeds. It's especially useful when missing certain important images or other content.
81
- * **[Templates](https://www.wprssaggregator.com/extension/templates/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_f2p_link&utm_content=f2p_link)** offers premium template types including the fully customisable Grid as well as an Excerpts & Thumbnails template that take your block or shortcode displays to a whole new level.
82
  * **[Keyword Filtering](https://www.wprssaggregator.com/extension/keyword-filtering/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_kf_link&utm_content=kf_link)** enables you to filter the content imported from any source based on keywords, phrases and/or tags.
83
  * **[Categories](https://www.wprssaggregator.com/extension/categories/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_cat_link&utm_content=cat_link)** provides a simple way to categorise your sources and keep them organised.
84
  * **[WordAi](https://www.wprssaggregator.com/extension/wordai/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_cat_link&utm_content=cat_link)** and **[Spinner Chief](https://www.wprssaggregator.com/extension/spinnerchief/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_cat_link&utm_content=cat_link)** integrate the Feed to Post add-on with the respective 3rd-party content spinning services.
85
 
86
- == We stand behind what we build ==
87
 
88
  Our comprehensive [Knowledge Base](https://kb.wprssaggregator.com/) provides you with everything you need to install, set up and customise the plugin to your needs. You can also browse through a number of FAQs to get started.
89
 
90
  If that doesn't do the trick, we provide support for the free version of WP RSS Aggregator via the support forum [here](https://wordpress.org/support/plugin/wp-rss-aggregator), while for premium support (owners of valid premium add-on licenses) and pre-sales questions please contact us via our [premium support channel](https://www.wprssaggregator.com/contact/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_contact_link&utm_content=contact_link).
91
 
92
- Our plugin also includes a Help Beacon within your dashboard through which you can search our knowledge base without ever leaving your website.
93
 
94
  == Additional information ==
95
 
96
- We provide a [Feed Creator](http://createfeed.wprssaggregator.com/) service that allows you to generate RSS feeds from any webpage, even if it doesn't have its own RSS feed. It provides inline documentation on how to use the service.
97
 
98
  Our terms & conditions can be found [here](https://www.wprssaggregator.com/terms-conditions/).
99
 
@@ -185,6 +188,12 @@ Check out our dedicated page on [WordPress hosting](https://www.wprssaggregator.
185
 
186
  - - -
187
 
 
 
 
 
 
 
188
  = Does WP RSS Aggregator work using JSON as the source? =
189
 
190
  No, our plugin does not currently import from JSON, it only imports from RSS and Atom structured XML.
@@ -205,9 +214,9 @@ If the problems persist, please [contact our support team](https://wordpress.org
205
 
206
  - - -
207
 
208
- = Can I store imported feed items as posts? =
209
 
210
- Yes, you can do that using the [Feed to Post](http://www.wprssaggregator.com/extensions/feed-to-post) premium add-on. You will not only be able to store items as posts, but as any post type. You can also set the author, set tags and categories, import images into the gallery or set featured images, and much more. These can then be displayed in your theme's blog page, via a page builder, etc.
211
 
212
  - - -
213
 
@@ -217,14 +226,6 @@ Yes, along with the [Feed to Post](http://www.wprssaggregator.com/extensions/fee
217
 
218
  - - -
219
 
220
- = I'm not sure which premium add-ons are right for me. Can you help me out? =
221
-
222
- Sure! We built an [add-on finder (guide)](https://www.wprssaggregator.com/add-on-finder/) that will help determine what you need.
223
-
224
- If you need any further help you can [contact our support team](http://www.wprssaggregator.com/contact/).
225
-
226
- - - -
227
-
228
  = Where can I find the documentation for the plugin? =
229
 
230
  Our complete Knowledge Base with FAQs can be found [here](https://kb.wprssaggregator.com/).
@@ -253,6 +254,22 @@ Our complete Knowledge Base with FAQs can be found [here](https://kb.wprssaggreg
253
 
254
  == Changelog ==
255
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  = 4.17.10 (2020-12-01) =
257
  **Fixed**
258
  - After updating the Templates add-on from v0.2, the add-on would be deactivated.
1
+ === WP RSS Aggregator News Feeds, Autoblogging, Youtube Video Feeds and More ===
2
  Contributors: RebelCode, jeangalea, markzahra, Mekku
3
  Plugin URI: https://www.wprssaggregator.com
4
+ Tags: RSS import, RSS aggregator, autoblog, feed to post, news aggregator, rss to post, content curation, feed import, content syndication, rss feeds, podcast feed, youtube
5
  Requires at least: 4.0 or higher
6
  Tested up to: 5.6
7
  Requires PHP: 5.4
8
+ Stable tag: 4.18
9
  License: GPLv3
10
 
11
+ The most powerful and reliable RSS aggregator for WordPress. Build a news aggregator, autoblog and more in minutes with unlimited RSS feeds.
12
 
13
  == Description ==
14
 
15
+ WP RSS Aggregator is the original, most popular and most robust plugin for importing, merging, and displaying RSS feeds and Atom feeds anywhere on your site. Set up your RSS feed sources and let the plugin do the leg-work.
16
 
17
  == Automatically import RSS feeds & display them on your site ==
18
 
19
  * Import unlimited content from an unlimited number of sites.
20
+ * Manage all your RSS feed sources from a single page.
21
+ * Set all RSS feeds to fetch new content automatically.
22
  * Customise the [display templates](https://kb.wprssaggregator.com/article/457-templates) to match your website's design.
23
+ * Built-in [shortcode](https://kb.wprssaggregator.com/article/54-how-to-use-the-shortcode-to-display-feed-items) and [block](https://kb.wprssaggregator.com/article/454-displaying-imported-items-block-gutenberg) to display your feeds in seconds.
24
  * RSS feed auto-discovery for sources with hard-to-find RSS feeds.
25
+ * Import and display playable Youtube videos on your site.
26
+ * Limit the RSS feed items stored and fetched for better performance.
27
  * Create a custom RSS feed from imported items to use elsewhere.
28
  * Extendable via action and filter hooks.
29
 
36
  * Aggregator or curate news from the top sources in your market or niche to improve your SEO and build a better reputation.
37
  * Show related content from other reputable sites to build a sense of trust with your readers.
38
  * Since video content has become so popular, link to Youtube videos anywhere on your site to provide visitors with more reasons to stick around.
39
+ * Share podcast feeds with your readers to make the most of audio content.
40
  * Provide value to your readers by curating job openings, real estate listings, or other information to help them grow.
41
  * Aggregate ever-popular podcast episodes related to the topic of your website to keep visitors engaged.
42
  * Authors, writers, and other content creators, display a feed of your work from multiple sites in a single portfolio.
75
 
76
  == Premium features ==
77
 
78
+ WP RSS Aggregator can be extended through its powerful [premium add-ons](https://www.wprssaggregator.com/extensions/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_premium_features) and [bundled plans](https://www.wprssaggregator.com/pricing/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_premium).
79
 
80
+ The most popular add-ons are always Feed to Post and Full Text RSS feeds, giving you the option to create any sort of feed you can imagine anywhere on your site. They are part of our most popular premium option, the [**Pro Plan**](https://www.wprssaggregator.com/pricing/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_premium_pro).
81
+
82
+ * **[Feed to Post](https://www.wprssaggregator.com/extension/feed-to-post/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_f2p_link&utm_content=f2p_link)** is the most powerful add-on available, enabling you to import RSS feeds into WordPress Posts or any other custom post type. It includes options such as automatically assigning a post type, post status, categories, tags, images, audio players (ideal for podcasts), authors, and more.
83
  * **[Full Text RSS Feeds](https://www.wprssaggregator.com/extension/full-text-rss-feeds/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_ftr_link&utm_content=ftr_link)** takes Feed to Post to the next level by connecting it to our premium full text service. This helps bring in content from sources that don't provide it in their RSS feeds. It's especially useful when missing certain important images or other content.
84
+ * **[Templates](https://www.wprssaggregator.com/extension/templates/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_f2p_link&utm_content=f2p_link)** offers premium template types including the fully customisable Grid as well as an Excerpts & Thumbnails template that take your block or shortcode displays to a whole new level with images, excerpts, and even an audio player for podcasts, music and more.
85
  * **[Keyword Filtering](https://www.wprssaggregator.com/extension/keyword-filtering/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_kf_link&utm_content=kf_link)** enables you to filter the content imported from any source based on keywords, phrases and/or tags.
86
  * **[Categories](https://www.wprssaggregator.com/extension/categories/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_cat_link&utm_content=cat_link)** provides a simple way to categorise your sources and keep them organised.
87
  * **[WordAi](https://www.wprssaggregator.com/extension/wordai/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_cat_link&utm_content=cat_link)** and **[Spinner Chief](https://www.wprssaggregator.com/extension/spinnerchief/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_cat_link&utm_content=cat_link)** integrate the Feed to Post add-on with the respective 3rd-party content spinning services.
88
 
89
+ == Top-notch support ==
90
 
91
  Our comprehensive [Knowledge Base](https://kb.wprssaggregator.com/) provides you with everything you need to install, set up and customise the plugin to your needs. You can also browse through a number of FAQs to get started.
92
 
93
  If that doesn't do the trick, we provide support for the free version of WP RSS Aggregator via the support forum [here](https://wordpress.org/support/plugin/wp-rss-aggregator), while for premium support (owners of valid premium add-on licenses) and pre-sales questions please contact us via our [premium support channel](https://www.wprssaggregator.com/contact/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_contact_link&utm_content=contact_link).
94
 
95
+ Our plugin also includes a Help Beacon within your website's dashboard through which you can search our knowledge base without ever leaving your website.
96
 
97
  == Additional information ==
98
 
99
+ We provide a [Feed Creator](http://createfeed.wprssaggregator.com/) service that allows you to generate full text RSS feeds from any webpage, even if it doesn't have its own RSS feed. It provides inline documentation on how to use the service.
100
 
101
  Our terms & conditions can be found [here](https://www.wprssaggregator.com/terms-conditions/).
102
 
188
 
189
  - - -
190
 
191
+ = Can I import the full text from any source site? =
192
+
193
+ In the majority of cases, this possible using our Feed to Post and Full Text RSS feeds add-ons, both of which are part of our most popular bundle, the [Pro Plan](https://www.wprssaggregator.com/pricing/?utm_source=wordpress-dot-org&utm_medium=readme&utm_campaign=readme_fulltextfaq).
194
+
195
+ - - -
196
+
197
  = Does WP RSS Aggregator work using JSON as the source? =
198
 
199
  No, our plugin does not currently import from JSON, it only imports from RSS and Atom structured XML.
214
 
215
  - - -
216
 
217
+ = Can I store imported feed items as Posts? =
218
 
219
+ Yes, you can do that using the [Feed to Post](http://www.wprssaggregator.com/extensions/feed-to-post/) premium add-on. You will not only be able to store items as posts, but as any post type. You can also set the author, set tags and categories, import images into the gallery or set featured images, and much more. These can then be displayed in your theme's blog page, via a page builder, etc. Add [Full Text RSS Feeds](http://www.wprssaggregator.com/extensions/full-text-rss-feeds/) into the mix for the most powerful combination of add-ons.
220
 
221
  - - -
222
 
226
 
227
  - - -
228
 
 
 
 
 
 
 
 
 
229
  = Where can I find the documentation for the plugin? =
230
 
231
  Our complete Knowledge Base with FAQs can be found [here](https://kb.wprssaggregator.com/).
254
 
255
  == Changelog ==
256
 
257
+ = 4.18 (2021-03-08) =
258
+ **Added**
259
+ - The total import time is now recorded in the debug log.
260
+
261
+ **Changed**
262
+ - Omitting dev files from the plugin, reducing its size.
263
+ - Redesigned the "More Features" page.
264
+ - Feed items link to the original article when shown without a template and in RSS feeds.
265
+ - Allocating more PHP execution time for image downloads.
266
+
267
+ **Fixed**
268
+ - Images with HTML entities in the URL resulted in broken images and missing featured images.
269
+ - The code that checks when a feed is saved no longer runs unnecessarily.
270
+ - Fixed styling issues with the "Save" button in the Templates edit page.
271
+ - The max title length option in the "Default" template was being applied in the "Feed Items" page.
272
+
273
  = 4.17.10 (2020-12-01) =
274
  **Fixed**
275
  - After updating the Templates add-on from v0.2, the add-on would be deactivated.
src/Container/ModuleContainer.php CHANGED
@@ -62,17 +62,26 @@ class ModuleContainer implements ContainerInterface
62
  */
63
  public function get($id)
64
  {
 
 
65
  // If no definition for the given ID, throw an exception
66
  if (!$this->has($id)) {
 
67
  throw new NotFoundException(
68
- sprintf(__('Service "%s" was not found', 'wprss'), $id)
69
  );
70
  }
71
 
72
- // Invoke the definition and save the service in cache, if needed
73
- if (!array_key_exists($id, $this->cache)) {
74
- $container = ($this->proxy === null) ? $this : $this->proxy;
75
- $this->cache[$id] = call_user_func_array($this->definitions[$id], [$container]);
 
 
 
 
 
 
76
  }
77
 
78
  return $this->cache[$id];
62
  */
63
  public function get($id)
64
  {
65
+ static $stack = [];
66
+
67
  // If no definition for the given ID, throw an exception
68
  if (!$this->has($id)) {
69
+ $stackStr = implode("\n", $stack);
70
  throw new NotFoundException(
71
+ sprintf(__('Service "%s" was not found; stack: %s', 'wprss'), $id, "\n$stackStr")
72
  );
73
  }
74
 
75
+ $stack[] = $id;
76
+
77
+ try {
78
+ // Invoke the definition and save the service in cache, if needed
79
+ if (!array_key_exists($id, $this->cache)) {
80
+ $container = ($this->proxy === null) ? $this : $this->proxy;
81
+ $this->cache[$id] = call_user_func_array($this->definitions[$id], [$container]);
82
+ }
83
+ } finally {
84
+ array_pop($stack);
85
  }
86
 
87
  return $this->cache[$id];
src/Handlers/FeedSources/FeedSourceSaveMetaHandler.php CHANGED
@@ -12,6 +12,13 @@ use WP_Post;
12
  */
13
  class FeedSourceSaveMetaHandler
14
  {
 
 
 
 
 
 
 
15
  /**
16
  * @since [*some-version*]
17
  *
@@ -31,10 +38,12 @@ class FeedSourceSaveMetaHandler
31
  *
32
  * @since [*some-version*]
33
  *
 
34
  * @param CollectionInterface $collection The feed sources collection.
35
  */
36
- public function __construct(CollectionInterface $collection)
37
  {
 
38
  $this->collection = $collection;
39
  $this->locked = false;
40
  }
@@ -44,8 +53,20 @@ class FeedSourceSaveMetaHandler
44
  *
45
  * @since 4.14
46
  */
47
- public function __invoke($postId, WP_Post $post)
48
  {
 
 
 
 
 
 
 
 
 
 
 
 
49
  // If the handler is locked (already running), stop to prevent an infinite loop
50
  if ($this->locked) {
51
  return;
@@ -62,14 +83,6 @@ class FeedSourceSaveMetaHandler
62
  return;
63
  }
64
 
65
- // Get the post type object.
66
- $post_type = get_post_type_object($post->post_type);
67
-
68
- // Check if a revision. If so, stop
69
- if ($post->post_type === 'revision') {
70
- return;
71
- }
72
-
73
  // Check if the current user has permission to edit the post.
74
  if (!current_user_can($post_type->cap->edit_post, $postId)) {
75
  return;
12
  */
13
  class FeedSourceSaveMetaHandler
14
  {
15
+ /**
16
+ * @since 4.18
17
+ *
18
+ * @var string
19
+ */
20
+ protected $postType;
21
+
22
  /**
23
  * @since [*some-version*]
24
  *
38
  *
39
  * @since [*some-version*]
40
  *
41
+ * @param string $postType The feed source post type.
42
  * @param CollectionInterface $collection The feed sources collection.
43
  */
44
+ public function __construct($postType, CollectionInterface $collection)
45
  {
46
+ $this->postType = $postType;
47
  $this->collection = $collection;
48
  $this->locked = false;
49
  }
53
  *
54
  * @since 4.14
55
  */
56
+ public function __invoke($postId, $post)
57
  {
58
+ if (!($post instanceof WP_Post)) {
59
+ return;
60
+ }
61
+
62
+ // Get the post type object.
63
+ $post_type = get_post_type_object($post->post_type);
64
+
65
+ // Check if a valid post type
66
+ if ($post->post_type !== $this->postType) {
67
+ return;
68
+ }
69
+
70
  // If the handler is locked (already running), stop to prevent an infinite loop
71
  if ($this->locked) {
72
  return;
83
  return;
84
  }
85
 
 
 
 
 
 
 
 
 
86
  // Check if the current user has permission to edit the post.
87
  if (!current_user_can($post_type->cap->edit_post, $postId)) {
88
  return;
src/Modules/FeedItemsModule.php CHANGED
@@ -50,6 +50,12 @@ class FeedItemsModule implements ModuleInterface
50
  new WpPostPermalinkProperty($idProp)
51
  );
52
 
 
 
 
 
 
 
53
  return [
54
  'id' => $idProp,
55
  'title' => new Property('post_title'),
@@ -57,7 +63,8 @@ class FeedItemsModule implements ModuleInterface
57
  'excerpt' => new DefaultingProperty(['post_excerpt', 'post_content']),
58
  'url' => $urlProp,
59
  'permalink' => $urlProp,
60
- 'enclosure' => new Property('wprss_item_enclosure'),
 
61
  'author' => new Property('wprss_item_author'),
62
  'date' => new Property('wprss_item_date'),
63
  'timestamp' => new TimestampProperty(new Property('post_date_gmt'), 'Y-m-d H:i:s'),
@@ -69,6 +76,7 @@ class FeedItemsModule implements ModuleInterface
69
  'embed_url' => new Property('wprss_item_embed_url'),
70
  'is_yt' => new Property('wprss_item_is_yt'),
71
  'yt_embed_url' => new Property('wprss_item_yt_embed_url'),
 
72
  'source_id' => new Property('wprss_feed_id'),
73
  'source_name' => new WpraItemSourceProperty(
74
  new Property('wprss_item_source_name'),
@@ -256,5 +264,12 @@ class FeedItemsModule implements ModuleInterface
256
  {
257
  add_action('init', $c->get('wpra/feeds/items/handlers/register_cpt'));
258
  add_action('admin_init', $c->get('wpra/feeds/items/handlers/add_cpt_capabilities'));
 
 
 
 
 
 
 
259
  }
260
  }
50
  new WpPostPermalinkProperty($idProp)
51
  );
52
 
53
+ $enclosureProp = new WpraPostTypeDependentProperty(
54
+ $idProp,
55
+ new Property('wprss_item_enclosure'),
56
+ new Property('wprss_ftp_enclosure_link')
57
+ );
58
+
59
  return [
60
  'id' => $idProp,
61
  'title' => new Property('post_title'),
63
  'excerpt' => new DefaultingProperty(['post_excerpt', 'post_content']),
64
  'url' => $urlProp,
65
  'permalink' => $urlProp,
66
+ 'enclosure' => $enclosureProp,
67
+ 'enclosure_type' => new Property('wprss_item_enclosure_type'),
68
  'author' => new Property('wprss_item_author'),
69
  'date' => new Property('wprss_item_date'),
70
  'timestamp' => new TimestampProperty(new Property('post_date_gmt'), 'Y-m-d H:i:s'),
76
  'embed_url' => new Property('wprss_item_embed_url'),
77
  'is_yt' => new Property('wprss_item_is_yt'),
78
  'yt_embed_url' => new Property('wprss_item_yt_embed_url'),
79
+ 'audio_url' => new Property('wprss_item_audio'),
80
  'source_id' => new Property('wprss_feed_id'),
81
  'source_name' => new WpraItemSourceProperty(
82
  new Property('wprss_item_source_name'),
264
  {
265
  add_action('init', $c->get('wpra/feeds/items/handlers/register_cpt'));
266
  add_action('admin_init', $c->get('wpra/feeds/items/handlers/add_cpt_capabilities'));
267
+
268
+ // Set the public permalink of feed items to be equal to the URL to the original article
269
+ add_filter('post_type_link', function($url, $post) {
270
+ return (get_post_type($post->ID) === 'wprss_feed_item')
271
+ ? get_post_meta($post->ID, 'wprss_item_permalink', true)
272
+ : $url;
273
+ }, 10, 2);
274
  }
275
  }
src/Modules/FeedSourcesModule.php CHANGED
@@ -342,6 +342,7 @@ class FeedSourcesModule implements ModuleInterface
342
  */
343
  'wpra/feeds/sources/meta_box/save_handler' => function (ContainerInterface $c) {
344
  return new FeedSourceSaveMetaHandler(
 
345
  $c->get('wpra/feeds/sources/collection')
346
  );
347
  },
@@ -359,7 +360,7 @@ class FeedSourcesModule implements ModuleInterface
359
  /*
360
  * Extends the list of REST API endpoints to register the feed sources endpoints.
361
  *
362
- * @since [*next-version*]
363
  */
364
  'wpra/rest_api/v1/endpoints' => function (ContainerInterface $c, $endpoints) {
365
  $endpoints['get_sources'] = new EndPoint(
342
  */
343
  'wpra/feeds/sources/meta_box/save_handler' => function (ContainerInterface $c) {
344
  return new FeedSourceSaveMetaHandler(
345
+ $c->get('wpra/feeds/sources/cpt/name'),
346
  $c->get('wpra/feeds/sources/collection')
347
  );
348
  },
360
  /*
361
  * Extends the list of REST API endpoints to register the feed sources endpoints.
362
  *
363
+ * @since 4.18
364
  */
365
  'wpra/rest_api/v1/endpoints' => function (ContainerInterface $c, $endpoints) {
366
  $endpoints['get_sources'] = new EndPoint(
src/Modules/FeedTemplatesModule.php CHANGED
@@ -447,6 +447,7 @@ class FeedTemplatesModule implements ModuleInterface
447
  'bullets_enabled' => true,
448
  'bullet_type' => 'default',
449
  'custom_css_classname' => '',
 
450
  ],
451
  ];
452
  },
@@ -480,6 +481,7 @@ class FeedTemplatesModule implements ModuleInterface
480
  'bullets_enabled' => __('Enable this option to show bullets next to feed items.', 'wprss'),
481
  'bullet_type' => __('The bullet type to use for feed items.', 'wprss'),
482
  'custom_css_classname' => __('You can add your own HTML class name to the template output. This lets you customize your template further using custom CSS styling or custom JS functionality.'),
 
483
  ],
484
  ];
485
  },
@@ -587,6 +589,14 @@ class FeedTemplatesModule implements ModuleInterface
587
 
588
  return $script;
589
  },
 
 
 
 
 
 
 
 
590
  /*
591
  * The state for the templates script.
592
  *
@@ -599,6 +609,7 @@ class FeedTemplatesModule implements ModuleInterface
599
  'options' => $c->get('wpra/feeds/templates/template_options'),
600
  'modules' => $c->get('wpra/feeds/templates/admin/js_modules'),
601
  'base_url' => rest_url('/wpra/v1/templates'),
 
602
  ];
603
  },
604
  /*
447
  'bullets_enabled' => true,
448
  'bullet_type' => 'default',
449
  'custom_css_classname' => '',
450
+ 'audio_player_enabled' => false,
451
  ],
452
  ];
453
  },
481
  'bullets_enabled' => __('Enable this option to show bullets next to feed items.', 'wprss'),
482
  'bullet_type' => __('The bullet type to use for feed items.', 'wprss'),
483
  'custom_css_classname' => __('You can add your own HTML class name to the template output. This lets you customize your template further using custom CSS styling or custom JS functionality.'),
484
+ 'audio_player_enabled' => __('If the feed item or post has an audio attachment, you can choose to show an audio player that plays the attached audio file.'),
485
  ],
486
  ];
487
  },
589
 
590
  return $script;
591
  },
592
+ /*
593
+ * Whether audio features are enabled.
594
+ *
595
+ * @since 4.18
596
+ */
597
+ 'wpra/feeds/templates/audio_features_enabled' => function () {
598
+ return false;
599
+ },
600
  /*
601
  * The state for the templates script.
602
  *
609
  'options' => $c->get('wpra/feeds/templates/template_options'),
610
  'modules' => $c->get('wpra/feeds/templates/admin/js_modules'),
611
  'base_url' => rest_url('/wpra/v1/templates'),
612
+ 'audio_features_enabled' => $c->get('wpra/feeds/templates/audio_features_enabled'),
613
  ];
614
  },
615
  /*
src/Query/DbQuery.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace RebelCode\Wpra\Core\Query;
4
+
5
+ class DbQuery
6
+ {
7
+ public $args;
8
+
9
+ public function __construct($args = [])
10
+ {
11
+ $this->args = array_merge(self::defaults(), $args);
12
+ }
13
+
14
+ public static function create(array $args = [])
15
+ {
16
+ return new self($args);
17
+ }
18
+
19
+ public static function defaults()
20
+ {
21
+ return [
22
+ 'post_type' => 'any',
23
+ 'post_status' => 'any',
24
+ 'posts_per_page' => -1,
25
+ 'suppress_filters' => true,
26
+ 'cache_results' => false,
27
+ 'no_found_rows' => true,
28
+ 'ignore_sticky_posts' => true,
29
+ ];
30
+ }
31
+ }
src/Templates/Feeds/Types/ListTemplateType.php CHANGED
@@ -135,6 +135,10 @@ class ListTemplateType extends AbstractWpraFeedTemplateType
135
  'options' => ['default', 'numbers'],
136
  'default' => 'default',
137
  ],
 
 
 
 
138
  ];
139
  }
140
  }
135
  'options' => ['default', 'numbers'],
136
  'default' => 'default',
137
  ],
138
+ 'audio_player_enabled' => [
139
+ 'filter' => FILTER_VALIDATE_BOOLEAN,
140
+ 'default' => false,
141
+ ]
142
  ];
143
  }
144
  }
src/Twig/Extensions/WpraExtension.php CHANGED
@@ -45,6 +45,7 @@ class WpraExtension extends AbstractExtension
45
  $this->getWpraTooltipFunction(),
46
  $this->getHtmlEntitiesDecodeFunction(),
47
  $this->getWpraItemUrlFunction(),
 
48
  ];
49
  }
50
 
@@ -163,10 +164,22 @@ class WpraExtension extends AbstractExtension
163
  ];
164
 
165
  return new TwigFunction($name, function ($url, $options, $className = '') {
166
- return ' ' . $this->prepareLinkAttrs($url, $options, $className);
167
  }, $options);
168
  }
169
 
 
 
 
 
 
 
 
 
 
 
 
 
170
  /**
171
  * Retrieves the "wpra_word_limit" Twig filter.
172
  *
45
  $this->getWpraTooltipFunction(),
46
  $this->getHtmlEntitiesDecodeFunction(),
47
  $this->getWpraItemUrlFunction(),
48
+ $this->getWpraIsAudioFunction(),
49
  ];
50
  }
51
 
164
  ];
165
 
166
  return new TwigFunction($name, function ($url, $options, $className = '') {
167
+ return ' ' . $this->prepareLinkAttrs($url, $options, $className);
168
  }, $options);
169
  }
170
 
171
+ /**
172
+ * Retrieves the "wpra_is_audio_url" Twig function.
173
+ *
174
+ * @since 4.18
175
+ *
176
+ * @return TwigFunction The function instance.
177
+ */
178
+ protected function getWpraIsAudioFunction()
179
+ {
180
+ return new TwigFunction('wpra_is_audio_url', 'wpra_is_audio_file');
181
+ }
182
+
183
  /**
184
  * Retrieves the "wpra_word_limit" Twig filter.
185
  *
templates/admin/upsell/more-features-page/main.twig CHANGED
@@ -13,9 +13,67 @@
13
 
14
  <div id="add-ons" class="clearfix">
15
  <div class="add-on-group clearfix">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  {% for item in items %}
17
  {{ include('admin/upsell/more-features-page/' ~ item.type ~ '.twig') }}
18
  {% endfor %}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </div>
20
  </div>
21
  </div>
13
 
14
  <div id="add-ons" class="clearfix">
15
  <div class="add-on-group clearfix">
16
+
17
+ {# PRO PLAN #}
18
+ <div class="add-on wp-box bundle-plan">
19
+ <span class="corner-ribbon">Most Popular</span>
20
+ <div class="inner">
21
+ <h3>Pro Plan</h3>
22
+ <p>A discounted bundle including:</p>
23
+ <ul>
24
+ <li>Feed to Post</li>
25
+ <li>Full Text RSS Feeds</li>
26
+ <li>Templates</li>
27
+ <li>Keyword Filtering</li>
28
+ <li>Source Categories</li>
29
+ </ul>
30
+ </div>
31
+ <div class="footer">
32
+ <a class="button button-secondary" href="https://wprssaggregator.com/pricing">
33
+ See Pricing
34
+ </a>
35
+ </div>
36
+ </div>
37
+
38
+ {# BASIC PLAN #}
39
+ <div class="add-on bundle-plan">
40
+ <div class="inner">
41
+ <h3>Basic Plan</h3>
42
+ <p>A discounted bundle including:</p>
43
+ <ul>
44
+ <li>Templates</li>
45
+ <li>Keyword Filtering</li>
46
+ <li>Source Categories</li>
47
+ </ul>
48
+ </div>
49
+ <div class="footer">
50
+ <a class="button button-secondary" href="https://wprssaggregator.com/pricing">
51
+ See Pricing
52
+ </a>
53
+ </div>
54
+ </div>
55
+
56
+ {# ADD_ONS #}
57
  {% for item in items %}
58
  {{ include('admin/upsell/more-features-page/' ~ item.type ~ '.twig') }}
59
  {% endfor %}
60
+
61
+ {# SPOTLIGHT #}
62
+ <div class="add-on spotlight">
63
+ <span class="corner-ribbon">NEW</span>
64
+ <div class="inner">
65
+ <h3>Instagram Feeds</h3>
66
+ <p>
67
+ Spotlight, a sister-product of WP RSS Aggregator, is the best and simplest way of adding
68
+ Instagram feeds anywhere on your site in under 2 minutes.
69
+ </p>
70
+ </div>
71
+ <div class="footer">
72
+ <a class="button button-secondary" href="https://spotlightwp.com">
73
+ Try Spotlight
74
+ </a>
75
+ </div>
76
+ </div>
77
  </div>
78
  </div>
79
  </div>
templates/feeds/_parts/audio-player.twig ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {% set audio_url = item.audio_url ? item.audio_url : item.enclosure %}
2
+ {% set is_audio = wpra_is_audio_url(audio_url) %}
3
+
4
+ {% if options.audio_player_enabled and is_audio %}
5
+ <div class="wpra-feed-audio">
6
+ <audio controls>
7
+ <source src="{{ audio_url }}" type="{{ item.enclosure_type }}" />
8
+ Your browser does not support HTML5 audio players.
9
+ </audio>
10
+ </div>
11
+ {% endif %}
templates/feeds/list/feed-item.twig CHANGED
@@ -50,3 +50,5 @@
50
  </span>
51
  {% endif %}
52
  </div>
 
 
50
  </span>
51
  {% endif %}
52
  </div>
53
+
54
+ {% include "feeds/_parts/audio-player.twig" %}
vendor/composer/ClassLoader.php CHANGED
@@ -37,11 +37,13 @@ namespace Composer\Autoload;
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
40
- * @see http://www.php-fig.org/psr/psr-0/
41
- * @see http://www.php-fig.org/psr/psr-4/
42
  */
43
  class ClassLoader
44
  {
 
 
45
  // PSR-4
46
  private $prefixLengthsPsr4 = array();
47
  private $prefixDirsPsr4 = array();
@@ -57,6 +59,13 @@ class ClassLoader
57
  private $missingClasses = array();
58
  private $apcuPrefix;
59
 
 
 
 
 
 
 
 
60
  public function getPrefixes()
61
  {
62
  if (!empty($this->prefixesPsr0)) {
@@ -300,6 +309,15 @@ class ClassLoader
300
  public function register($prepend = false)
301
  {
302
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 
 
 
 
 
 
 
 
 
303
  }
304
 
305
  /**
@@ -308,6 +326,10 @@ class ClassLoader
308
  public function unregister()
309
  {
310
  spl_autoload_unregister(array($this, 'loadClass'));
 
 
 
 
311
  }
312
 
313
  /**
@@ -367,6 +389,16 @@ class ClassLoader
367
  return $file;
368
  }
369
 
 
 
 
 
 
 
 
 
 
 
370
  private function findFileWithExtension($class, $ext)
371
  {
372
  // PSR-4 lookup
37
  *
38
  * @author Fabien Potencier <fabien@symfony.com>
39
  * @author Jordi Boggiano <j.boggiano@seld.be>
40
+ * @see https://www.php-fig.org/psr/psr-0/
41
+ * @see https://www.php-fig.org/psr/psr-4/
42
  */
43
  class ClassLoader
44
  {
45
+ private $vendorDir;
46
+
47
  // PSR-4
48
  private $prefixLengthsPsr4 = array();
49
  private $prefixDirsPsr4 = array();
59
  private $missingClasses = array();
60
  private $apcuPrefix;
61
 
62
+ private static $registeredLoaders = array();
63
+
64
+ public function __construct($vendorDir = null)
65
+ {
66
+ $this->vendorDir = $vendorDir;
67
+ }
68
+
69
  public function getPrefixes()
70
  {
71
  if (!empty($this->prefixesPsr0)) {
309
  public function register($prepend = false)
310
  {
311
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
312
+
313
+ if (null === $this->vendorDir) {
314
+ //no-op
315
+ } elseif ($prepend) {
316
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
317
+ } else {
318
+ unset(self::$registeredLoaders[$this->vendorDir]);
319
+ self::$registeredLoaders[$this->vendorDir] = $this;
320
+ }
321
  }
322
 
323
  /**
326
  public function unregister()
327
  {
328
  spl_autoload_unregister(array($this, 'loadClass'));
329
+
330
+ if (null !== $this->vendorDir) {
331
+ unset(self::$registeredLoaders[$this->vendorDir]);
332
+ }
333
  }
334
 
335
  /**
389
  return $file;
390
  }
391
 
392
+ /**
393
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
394
+ *
395
+ * @return self[]
396
+ */
397
+ public static function getRegisteredLoaders()
398
+ {
399
+ return self::$registeredLoaders;
400
+ }
401
+
402
  private function findFileWithExtension($class, $ext)
403
  {
404
  // PSR-4 lookup
vendor/composer/InstalledVersions.php ADDED
@@ -0,0 +1,647 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+ namespace Composer;
14
+
15
+ use Composer\Autoload\ClassLoader;
16
+ use Composer\Semver\VersionParser;
17
+
18
+
19
+
20
+
21
+
22
+
23
+ class InstalledVersions
24
+ {
25
+ private static $installed = array (
26
+ 'root' =>
27
+ array (
28
+ 'pretty_version' => 'dev-develop',
29
+ 'version' => 'dev-develop',
30
+ 'aliases' =>
31
+ array (
32
+ ),
33
+ 'reference' => 'dbbd846351515ddbc9f72dc75ff1c3654e3bebf5',
34
+ 'name' => 'wprss/core',
35
+ ),
36
+ 'versions' =>
37
+ array (
38
+ 'container-interop/container-interop' =>
39
+ array (
40
+ 'pretty_version' => '1.2.0',
41
+ 'version' => '1.2.0.0',
42
+ 'aliases' =>
43
+ array (
44
+ ),
45
+ 'reference' => '79cbf1341c22ec75643d841642dd5d6acd83bdb8',
46
+ ),
47
+ 'container-interop/container-interop-implementation' =>
48
+ array (
49
+ 'provided' =>
50
+ array (
51
+ 0 => '^1.0',
52
+ ),
53
+ ),
54
+ 'container-interop/service-provider' =>
55
+ array (
56
+ 'pretty_version' => 'v0.3.0',
57
+ 'version' => '0.3.0.0',
58
+ 'aliases' =>
59
+ array (
60
+ ),
61
+ 'reference' => '5cb38893b836edb00d3e1ace26c20ee1d29957cf',
62
+ ),
63
+ 'dhii/collections-abstract' =>
64
+ array (
65
+ 'pretty_version' => 'v0.1.0',
66
+ 'version' => '0.1.0.0',
67
+ 'aliases' =>
68
+ array (
69
+ ),
70
+ 'reference' => '7c9141202af4d83b31e75efcbf481fa1cb588ad8',
71
+ ),
72
+ 'dhii/collections-abstract-base' =>
73
+ array (
74
+ 'pretty_version' => 'v0.1.0',
75
+ 'version' => '0.1.0.0',
76
+ 'aliases' =>
77
+ array (
78
+ ),
79
+ 'reference' => '0ec0147451a72a13fb327ac6ff747c5e953c56f3',
80
+ ),
81
+ 'dhii/collections-interface' =>
82
+ array (
83
+ 'pretty_version' => 'v0.1.2',
84
+ 'version' => '0.1.2.0',
85
+ 'aliases' =>
86
+ array (
87
+ ),
88
+ 'reference' => 'a8e9a30366a30d77bc270042a67150b3f8f6d94d',
89
+ ),
90
+ 'dhii/container-helper-base' =>
91
+ array (
92
+ 'pretty_version' => 'v0.1-alpha8',
93
+ 'version' => '0.1.0.0-alpha8',
94
+ 'aliases' =>
95
+ array (
96
+ ),
97
+ 'reference' => '1b8206842e06b71abcff769aaddfc51bf8f317cd',
98
+ ),
99
+ 'dhii/di' =>
100
+ array (
101
+ 'pretty_version' => 'v0.1.1',
102
+ 'version' => '0.1.1.0',
103
+ 'aliases' =>
104
+ array (
105
+ ),
106
+ 'reference' => '52efd50f1b11fcdd2f789bae483bdb858772c306',
107
+ ),
108
+ 'dhii/di-abstract' =>
109
+ array (
110
+ 'pretty_version' => 'v0.1',
111
+ 'version' => '0.1.0.0',
112
+ 'aliases' =>
113
+ array (
114
+ ),
115
+ 'reference' => 'e87ee3782d5f4c44724e79c4b2e1a55103e5cd11',
116
+ ),
117
+ 'dhii/di-interface' =>
118
+ array (
119
+ 'pretty_version' => 'v0.1',
120
+ 'version' => '0.1.0.0',
121
+ 'aliases' =>
122
+ array (
123
+ ),
124
+ 'reference' => '0320846a577d68b761e29acd5d4db40d88cc4f98',
125
+ ),
126
+ 'dhii/exception' =>
127
+ array (
128
+ 'pretty_version' => 'v0.1-alpha5',
129
+ 'version' => '0.1.0.0-alpha5',
130
+ 'aliases' =>
131
+ array (
132
+ ),
133
+ 'reference' => 'f7afb934c970a4e167b2c7ba24fa3df50714e0fe',
134
+ ),
135
+ 'dhii/exception-helper-base' =>
136
+ array (
137
+ 'replaced' =>
138
+ array (
139
+ 0 => '0.1-alpha1|0.1-alpha2',
140
+ ),
141
+ ),
142
+ 'dhii/exception-interface' =>
143
+ array (
144
+ 'pretty_version' => 'v0.2',
145
+ 'version' => '0.2.0.0',
146
+ 'aliases' =>
147
+ array (
148
+ ),
149
+ 'reference' => 'b69feebf7cb2879cd43977a03342e2393b73f7fb',
150
+ ),
151
+ 'dhii/factory-interface' =>
152
+ array (
153
+ 'pretty_version' => 'v0.1',
154
+ 'version' => '0.1.0.0',
155
+ 'aliases' =>
156
+ array (
157
+ ),
158
+ 'reference' => 'b8d217aec8838e64ccaa770cb03dc164bf6f0515',
159
+ ),
160
+ 'dhii/i18n-helper-base' =>
161
+ array (
162
+ 'pretty_version' => 'v0.1-alpha1',
163
+ 'version' => '0.1.0.0-alpha1',
164
+ 'aliases' =>
165
+ array (
166
+ ),
167
+ 'reference' => 'fc4c881f3e528ea918588831ebeffb92738f8dd5',
168
+ ),
169
+ 'dhii/i18n-interface' =>
170
+ array (
171
+ 'pretty_version' => 'v0.2',
172
+ 'version' => '0.2.0.0',
173
+ 'aliases' =>
174
+ array (
175
+ ),
176
+ 'reference' => '7eaf0731ba80eea37a5deea6d894a0326e10be67',
177
+ ),
178
+ 'dhii/iterator-helper-base' =>
179
+ array (
180
+ 'pretty_version' => 'v0.1-alpha2',
181
+ 'version' => '0.1.0.0-alpha2',
182
+ 'aliases' =>
183
+ array (
184
+ ),
185
+ 'reference' => 'cf62fb9f8b658a82815f15a2d906d8d1ff5c52ce',
186
+ ),
187
+ 'dhii/normalization-helper-base' =>
188
+ array (
189
+ 'pretty_version' => 'v0.1-alpha4',
190
+ 'version' => '0.1.0.0-alpha4',
191
+ 'aliases' =>
192
+ array (
193
+ ),
194
+ 'reference' => '1b64f0ea6b3e32f9478f854f6049500795b51da7',
195
+ ),
196
+ 'dhii/output-renderer-abstract' =>
197
+ array (
198
+ 'pretty_version' => 'v0.1-alpha2',
199
+ 'version' => '0.1.0.0-alpha2',
200
+ 'aliases' =>
201
+ array (
202
+ ),
203
+ 'reference' => '0f6e5eed940025332dd1986d6c771e10f7197b1a',
204
+ ),
205
+ 'dhii/output-renderer-base' =>
206
+ array (
207
+ 'pretty_version' => 'v0.1-alpha1',
208
+ 'version' => '0.1.0.0-alpha1',
209
+ 'aliases' =>
210
+ array (
211
+ ),
212
+ 'reference' => '700483a37016e502be2ead9580bb9258ad8bf17b',
213
+ ),
214
+ 'dhii/output-renderer-interface' =>
215
+ array (
216
+ 'pretty_version' => 'v0.3',
217
+ 'version' => '0.3.0.0',
218
+ 'aliases' =>
219
+ array (
220
+ ),
221
+ 'reference' => '407014d7fd1af0427958f2acd61aff008ee9e032',
222
+ ),
223
+ 'dhii/stats-abstract' =>
224
+ array (
225
+ 'pretty_version' => 'v0.1.0',
226
+ 'version' => '0.1.0.0',
227
+ 'aliases' =>
228
+ array (
229
+ ),
230
+ 'reference' => '71f6702c3257c71ab3917b6d076d3c3588cc9f49',
231
+ ),
232
+ 'dhii/stats-interface' =>
233
+ array (
234
+ 'pretty_version' => 'v0.1.0',
235
+ 'version' => '0.1.0.0',
236
+ 'aliases' =>
237
+ array (
238
+ ),
239
+ 'reference' => '36d09a8b8a3b8058214dae6eefb8ecdd98e0f0ba',
240
+ ),
241
+ 'dhii/stringable-interface' =>
242
+ array (
243
+ 'pretty_version' => 'v0.1',
244
+ 'version' => '0.1.0.0',
245
+ 'aliases' =>
246
+ array (
247
+ ),
248
+ 'reference' => 'b6653905eef2ebf377749feb80a6d18abbe913ef',
249
+ ),
250
+ 'dhii/transformer-interface' =>
251
+ array (
252
+ 'pretty_version' => 'v0.1-alpha1',
253
+ 'version' => '0.1.0.0-alpha1',
254
+ 'aliases' =>
255
+ array (
256
+ ),
257
+ 'reference' => 'e774efef46413eb34bdafc19a6bd74fbf656235d',
258
+ ),
259
+ 'dhii/validation-abstract' =>
260
+ array (
261
+ 'pretty_version' => 'v0.2-alpha1',
262
+ 'version' => '0.2.0.0-alpha1',
263
+ 'aliases' =>
264
+ array (
265
+ ),
266
+ 'reference' => 'dff998ba3476927a0fc6d10bb022425de8f1c844',
267
+ ),
268
+ 'dhii/validation-base' =>
269
+ array (
270
+ 'pretty_version' => 'v0.2-alpha2',
271
+ 'version' => '0.2.0.0-alpha2',
272
+ 'aliases' =>
273
+ array (
274
+ ),
275
+ 'reference' => '9e75c5f886a2403c6989c36c2d4ffcfae158172e',
276
+ ),
277
+ 'dhii/validation-interface' =>
278
+ array (
279
+ 'pretty_version' => 'v0.2',
280
+ 'version' => '0.2.0.0',
281
+ 'aliases' =>
282
+ array (
283
+ ),
284
+ 'reference' => 'a26026ae5cdf0a650b3511a22dbcb9329073b82c',
285
+ ),
286
+ 'erusev/parsedown' =>
287
+ array (
288
+ 'pretty_version' => '1.7.4',
289
+ 'version' => '1.7.4.0',
290
+ 'aliases' =>
291
+ array (
292
+ ),
293
+ 'reference' => 'cb17b6477dfff935958ba01325f2e8a2bfa6dab3',
294
+ ),
295
+ 'mnapoli/php-di' =>
296
+ array (
297
+ 'replaced' =>
298
+ array (
299
+ 0 => '*',
300
+ ),
301
+ ),
302
+ 'php-di/invoker' =>
303
+ array (
304
+ 'pretty_version' => '1.3.3',
305
+ 'version' => '1.3.3.0',
306
+ 'aliases' =>
307
+ array (
308
+ ),
309
+ 'reference' => '1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7',
310
+ ),
311
+ 'php-di/php-di' =>
312
+ array (
313
+ 'pretty_version' => '5.2.2',
314
+ 'version' => '5.2.2.0',
315
+ 'aliases' =>
316
+ array (
317
+ ),
318
+ 'reference' => 'f574bcc841201ab04587b1c6da1234d4044f67d8',
319
+ ),
320
+ 'php-di/phpdoc-reader' =>
321
+ array (
322
+ 'pretty_version' => '2.1.1',
323
+ 'version' => '2.1.1.0',
324
+ 'aliases' =>
325
+ array (
326
+ ),
327
+ 'reference' => '15678f7451c020226807f520efb867ad26fbbfcf',
328
+ ),
329
+ 'psr/container' =>
330
+ array (
331
+ 'pretty_version' => '1.0.0',
332
+ 'version' => '1.0.0.0',
333
+ 'aliases' =>
334
+ array (
335
+ ),
336
+ 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f',
337
+ ),
338
+ 'psr/log' =>
339
+ array (
340
+ 'pretty_version' => '1.1.2',
341
+ 'version' => '1.1.2.0',
342
+ 'aliases' =>
343
+ array (
344
+ ),
345
+ 'reference' => '446d54b4cb6bf489fc9d75f55843658e6f25d801',
346
+ ),
347
+ 'rebelcode/composer-cleanup-plugin' =>
348
+ array (
349
+ 'pretty_version' => 'v0.2',
350
+ 'version' => '0.2.0.0',
351
+ 'aliases' =>
352
+ array (
353
+ ),
354
+ 'reference' => '3677eb752eb8ca042ba6f725b33f419b93857a62',
355
+ ),
356
+ 'symfony/polyfill-ctype' =>
357
+ array (
358
+ 'pretty_version' => 'v1.13.1',
359
+ 'version' => '1.13.1.0',
360
+ 'aliases' =>
361
+ array (
362
+ ),
363
+ 'reference' => 'f8f0b461be3385e56d6de3dbb5a0df24c0c275e3',
364
+ ),
365
+ 'symfony/polyfill-mbstring' =>
366
+ array (
367
+ 'pretty_version' => 'v1.17.1',
368
+ 'version' => '1.17.1.0',
369
+ 'aliases' =>
370
+ array (
371
+ ),
372
+ 'reference' => '7110338d81ce1cbc3e273136e4574663627037a7',
373
+ ),
374
+ 'symfony/translation' =>
375
+ array (
376
+ 'pretty_version' => 'v2.8.52',
377
+ 'version' => '2.8.52.0',
378
+ 'aliases' =>
379
+ array (
380
+ ),
381
+ 'reference' => 'fc58c2a19e56c29f5ba2736ec40d0119a0de2089',
382
+ ),
383
+ 'twig/extensions' =>
384
+ array (
385
+ 'pretty_version' => 'v1.5.4',
386
+ 'version' => '1.5.4.0',
387
+ 'aliases' =>
388
+ array (
389
+ ),
390
+ 'reference' => '57873c8b0c1be51caa47df2cdb824490beb16202',
391
+ ),
392
+ 'twig/twig' =>
393
+ array (
394
+ 'pretty_version' => 'v1.41.0',
395
+ 'version' => '1.41.0.0',
396
+ 'aliases' =>
397
+ array (
398
+ ),
399
+ 'reference' => '575cd5028362da591facde1ef5d7b94553c375c9',
400
+ ),
401
+ 'wprss/core' =>
402
+ array (
403
+ 'pretty_version' => 'dev-develop',
404
+ 'version' => 'dev-develop',
405
+ 'aliases' =>
406
+ array (
407
+ ),
408
+ 'reference' => 'dbbd846351515ddbc9f72dc75ff1c3654e3bebf5',
409
+ ),
410
+ ),
411
+ );
412
+ private static $canGetVendors;
413
+ private static $installedByVendor = array();
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+ public static function getInstalledPackages()
422
+ {
423
+ $packages = array();
424
+ foreach (self::getInstalled() as $installed) {
425
+ $packages[] = array_keys($installed['versions']);
426
+ }
427
+
428
+
429
+ if (1 === \count($packages)) {
430
+ return $packages[0];
431
+ }
432
+
433
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
434
+ }
435
+
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+ public static function isInstalled($packageName)
445
+ {
446
+ foreach (self::getInstalled() as $installed) {
447
+ if (isset($installed['versions'][$packageName])) {
448
+ return true;
449
+ }
450
+ }
451
+
452
+ return false;
453
+ }
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+
464
+
465
+
466
+
467
+
468
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
469
+ {
470
+ $constraint = $parser->parseConstraints($constraint);
471
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
472
+
473
+ return $provided->matches($constraint);
474
+ }
475
+
476
+
477
+
478
+
479
+
480
+
481
+
482
+
483
+
484
+
485
+ public static function getVersionRanges($packageName)
486
+ {
487
+ foreach (self::getInstalled() as $installed) {
488
+ if (!isset($installed['versions'][$packageName])) {
489
+ continue;
490
+ }
491
+
492
+ $ranges = array();
493
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
494
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
495
+ }
496
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
497
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
498
+ }
499
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
500
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
501
+ }
502
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
503
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
504
+ }
505
+
506
+ return implode(' || ', $ranges);
507
+ }
508
+
509
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
510
+ }
511
+
512
+
513
+
514
+
515
+
516
+ public static function getVersion($packageName)
517
+ {
518
+ foreach (self::getInstalled() as $installed) {
519
+ if (!isset($installed['versions'][$packageName])) {
520
+ continue;
521
+ }
522
+
523
+ if (!isset($installed['versions'][$packageName]['version'])) {
524
+ return null;
525
+ }
526
+
527
+ return $installed['versions'][$packageName]['version'];
528
+ }
529
+
530
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
531
+ }
532
+
533
+
534
+
535
+
536
+
537
+ public static function getPrettyVersion($packageName)
538
+ {
539
+ foreach (self::getInstalled() as $installed) {
540
+ if (!isset($installed['versions'][$packageName])) {
541
+ continue;
542
+ }
543
+
544
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
545
+ return null;
546
+ }
547
+
548
+ return $installed['versions'][$packageName]['pretty_version'];
549
+ }
550
+
551
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
552
+ }
553
+
554
+
555
+
556
+
557
+
558
+ public static function getReference($packageName)
559
+ {
560
+ foreach (self::getInstalled() as $installed) {
561
+ if (!isset($installed['versions'][$packageName])) {
562
+ continue;
563
+ }
564
+
565
+ if (!isset($installed['versions'][$packageName]['reference'])) {
566
+ return null;
567
+ }
568
+
569
+ return $installed['versions'][$packageName]['reference'];
570
+ }
571
+
572
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
573
+ }
574
+
575
+
576
+
577
+
578
+
579
+ public static function getRootPackage()
580
+ {
581
+ $installed = self::getInstalled();
582
+
583
+ return $installed[0]['root'];
584
+ }
585
+
586
+
587
+
588
+
589
+
590
+
591
+
592
+ public static function getRawData()
593
+ {
594
+ return self::$installed;
595
+ }
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+
610
+
611
+
612
+
613
+
614
+
615
+ public static function reload($data)
616
+ {
617
+ self::$installed = $data;
618
+ self::$installedByVendor = array();
619
+ }
620
+
621
+
622
+
623
+
624
+ private static function getInstalled()
625
+ {
626
+ if (null === self::$canGetVendors) {
627
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
628
+ }
629
+
630
+ $installed = array();
631
+
632
+ if (self::$canGetVendors) {
633
+
634
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
635
+ if (isset(self::$installedByVendor[$vendorDir])) {
636
+ $installed[] = self::$installedByVendor[$vendorDir];
637
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
638
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
639
+ }
640
+ }
641
+ }
642
+
643
+ $installed[] = self::$installed;
644
+
645
+ return $installed;
646
+ }
647
+ }
vendor/composer/autoload_classmap.php CHANGED
@@ -6,6 +6,7 @@ $vendorDir = dirname(dirname(__FILE__));
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
 
9
  'DI\\Annotation\\Inject' => $vendorDir . '/php-di/php-di/src/DI/Annotation/Inject.php',
10
  'DI\\Annotation\\Injectable' => $vendorDir . '/php-di/php-di/src/DI/Annotation/Injectable.php',
11
  'DI\\Cache\\ArrayCache' => $vendorDir . '/php-di/php-di/src/DI/Cache/ArrayCache.php',
@@ -275,7 +276,6 @@ return array(
275
  'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
276
  'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
277
  'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
278
- 'Psr\\Log\\Test\\DummyTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
279
  'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
280
  'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php',
281
  'RebelCode\\Composer\\CleanupPlugin' => $vendorDir . '/rebelcode/composer-cleanup-plugin/src/CleanupPlugin.php',
@@ -429,6 +429,7 @@ return array(
429
  'RebelCode\\Wpra\\Core\\Modules\\WpModule' => $baseDir . '/src/Modules/WpModule.php',
430
  'RebelCode\\Wpra\\Core\\Plugin' => $baseDir . '/src/Plugin.php',
431
  'RebelCode\\Wpra\\Core\\Query\\AbstractWpQueryIterator' => $baseDir . '/src/Query/AbstractWpQueryIterator.php',
 
432
  'RebelCode\\Wpra\\Core\\Query\\WpQueryIterator' => $baseDir . '/src/Query/WpQueryIterator.php',
433
  'RebelCode\\Wpra\\Core\\RestApi\\Auth\\AbstractAuthValidator' => $baseDir . '/src/RestApi/Auth/AbstractAuthValidator.php',
434
  'RebelCode\\Wpra\\Core\\RestApi\\Auth\\AuthUserIsAdmin' => $baseDir . '/src/RestApi/Auth/AuthUserIsAdmin.php',
6
  $baseDir = dirname($vendorDir);
7
 
8
  return array(
9
+ 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
10
  'DI\\Annotation\\Inject' => $vendorDir . '/php-di/php-di/src/DI/Annotation/Inject.php',
11
  'DI\\Annotation\\Injectable' => $vendorDir . '/php-di/php-di/src/DI/Annotation/Injectable.php',
12
  'DI\\Cache\\ArrayCache' => $vendorDir . '/php-di/php-di/src/DI/Cache/ArrayCache.php',
276
  'Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/Psr/Log/LoggerInterface.php',
277
  'Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/Psr/Log/LoggerTrait.php',
278
  'Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/Psr/Log/NullLogger.php',
 
279
  'Psr\\Log\\Test\\LoggerInterfaceTest' => $vendorDir . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
280
  'Psr\\Log\\Test\\TestLogger' => $vendorDir . '/psr/log/Psr/Log/Test/TestLogger.php',
281
  'RebelCode\\Composer\\CleanupPlugin' => $vendorDir . '/rebelcode/composer-cleanup-plugin/src/CleanupPlugin.php',
429
  'RebelCode\\Wpra\\Core\\Modules\\WpModule' => $baseDir . '/src/Modules/WpModule.php',
430
  'RebelCode\\Wpra\\Core\\Plugin' => $baseDir . '/src/Plugin.php',
431
  'RebelCode\\Wpra\\Core\\Query\\AbstractWpQueryIterator' => $baseDir . '/src/Query/AbstractWpQueryIterator.php',
432
+ 'RebelCode\\Wpra\\Core\\Query\\DbQuery' => $baseDir . '/src/Query/DbQuery.php',
433
  'RebelCode\\Wpra\\Core\\Query\\WpQueryIterator' => $baseDir . '/src/Query/WpQueryIterator.php',
434
  'RebelCode\\Wpra\\Core\\RestApi\\Auth\\AbstractAuthValidator' => $baseDir . '/src/RestApi/Auth/AbstractAuthValidator.php',
435
  'RebelCode\\Wpra\\Core\\RestApi\\Auth\\AuthUserIsAdmin' => $baseDir . '/src/RestApi/Auth/AuthUserIsAdmin.php',
vendor/composer/autoload_real.php CHANGED
@@ -22,13 +22,15 @@ class ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60
22
  return self::$loader;
23
  }
24
 
 
 
25
  spl_autoload_register(array('ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60', 'loadClassLoader'), true, true);
26
- self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
  spl_autoload_unregister(array('ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60', 'loadClassLoader'));
28
 
29
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
30
  if ($useStaticLoader) {
31
- require_once __DIR__ . '/autoload_static.php';
32
 
33
  call_user_func(\Composer\Autoload\ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60::getInitializer($loader));
34
  } else {
22
  return self::$loader;
23
  }
24
 
25
+ require __DIR__ . '/platform_check.php';
26
+
27
  spl_autoload_register(array('ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60', 'loadClassLoader'), true, true);
28
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
  spl_autoload_unregister(array('ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60', 'loadClassLoader'));
30
 
31
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
  if ($useStaticLoader) {
33
+ require __DIR__ . '/autoload_static.php';
34
 
35
  call_user_func(\Composer\Autoload\ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60::getInitializer($loader));
36
  } else {
vendor/composer/autoload_static.php CHANGED
@@ -205,6 +205,7 @@ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
205
  );
206
 
207
  public static $classMap = array (
 
208
  'DI\\Annotation\\Inject' => __DIR__ . '/..' . '/php-di/php-di/src/DI/Annotation/Inject.php',
209
  'DI\\Annotation\\Injectable' => __DIR__ . '/..' . '/php-di/php-di/src/DI/Annotation/Injectable.php',
210
  'DI\\Cache\\ArrayCache' => __DIR__ . '/..' . '/php-di/php-di/src/DI/Cache/ArrayCache.php',
@@ -474,7 +475,6 @@ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
474
  'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
475
  'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
476
  'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
477
- 'Psr\\Log\\Test\\DummyTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
478
  'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
479
  'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php',
480
  'RebelCode\\Composer\\CleanupPlugin' => __DIR__ . '/..' . '/rebelcode/composer-cleanup-plugin/src/CleanupPlugin.php',
@@ -628,6 +628,7 @@ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
628
  'RebelCode\\Wpra\\Core\\Modules\\WpModule' => __DIR__ . '/../..' . '/src/Modules/WpModule.php',
629
  'RebelCode\\Wpra\\Core\\Plugin' => __DIR__ . '/../..' . '/src/Plugin.php',
630
  'RebelCode\\Wpra\\Core\\Query\\AbstractWpQueryIterator' => __DIR__ . '/../..' . '/src/Query/AbstractWpQueryIterator.php',
 
631
  'RebelCode\\Wpra\\Core\\Query\\WpQueryIterator' => __DIR__ . '/../..' . '/src/Query/WpQueryIterator.php',
632
  'RebelCode\\Wpra\\Core\\RestApi\\Auth\\AbstractAuthValidator' => __DIR__ . '/../..' . '/src/RestApi/Auth/AbstractAuthValidator.php',
633
  'RebelCode\\Wpra\\Core\\RestApi\\Auth\\AuthUserIsAdmin' => __DIR__ . '/../..' . '/src/RestApi/Auth/AuthUserIsAdmin.php',
205
  );
206
 
207
  public static $classMap = array (
208
+ 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
209
  'DI\\Annotation\\Inject' => __DIR__ . '/..' . '/php-di/php-di/src/DI/Annotation/Inject.php',
210
  'DI\\Annotation\\Injectable' => __DIR__ . '/..' . '/php-di/php-di/src/DI/Annotation/Injectable.php',
211
  'DI\\Cache\\ArrayCache' => __DIR__ . '/..' . '/php-di/php-di/src/DI/Cache/ArrayCache.php',
475
  'Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerInterface.php',
476
  'Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/Psr/Log/LoggerTrait.php',
477
  'Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/NullLogger.php',
 
478
  'Psr\\Log\\Test\\LoggerInterfaceTest' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/LoggerInterfaceTest.php',
479
  'Psr\\Log\\Test\\TestLogger' => __DIR__ . '/..' . '/psr/log/Psr/Log/Test/TestLogger.php',
480
  'RebelCode\\Composer\\CleanupPlugin' => __DIR__ . '/..' . '/rebelcode/composer-cleanup-plugin/src/CleanupPlugin.php',
628
  'RebelCode\\Wpra\\Core\\Modules\\WpModule' => __DIR__ . '/../..' . '/src/Modules/WpModule.php',
629
  'RebelCode\\Wpra\\Core\\Plugin' => __DIR__ . '/../..' . '/src/Plugin.php',
630
  'RebelCode\\Wpra\\Core\\Query\\AbstractWpQueryIterator' => __DIR__ . '/../..' . '/src/Query/AbstractWpQueryIterator.php',
631
+ 'RebelCode\\Wpra\\Core\\Query\\DbQuery' => __DIR__ . '/../..' . '/src/Query/DbQuery.php',
632
  'RebelCode\\Wpra\\Core\\Query\\WpQueryIterator' => __DIR__ . '/../..' . '/src/Query/WpQueryIterator.php',
633
  'RebelCode\\Wpra\\Core\\RestApi\\Auth\\AbstractAuthValidator' => __DIR__ . '/../..' . '/src/RestApi/Auth/AbstractAuthValidator.php',
634
  'RebelCode\\Wpra\\Core\\RestApi\\Auth\\AuthUserIsAdmin' => __DIR__ . '/../..' . '/src/RestApi/Auth/AuthUserIsAdmin.php',
vendor/composer/installed.json CHANGED
@@ -1,1948 +1,1994 @@
1
- [
2
- {
3
- "name": "container-interop/container-interop",
4
- "version": "1.2.0",
5
- "version_normalized": "1.2.0.0",
6
- "source": {
7
- "type": "git",
8
- "url": "https://github.com/container-interop/container-interop.git",
9
- "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
10
- },
11
- "dist": {
12
- "type": "zip",
13
- "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
14
- "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
15
- "shasum": ""
16
- },
17
- "require": {
18
- "psr/container": "^1.0"
19
- },
20
- "time": "2017-02-14T19:40:03+00:00",
21
- "type": "library",
22
- "installation-source": "dist",
23
- "autoload": {
24
- "psr-4": {
25
- "Interop\\Container\\": "src/Interop/Container/"
26
- }
27
- },
28
- "notification-url": "https://packagist.org/downloads/",
29
- "license": [
30
- "MIT"
31
- ],
32
- "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
33
- "homepage": "https://github.com/container-interop/container-interop",
34
- "abandoned": "psr/container"
35
- },
36
- {
37
- "name": "container-interop/service-provider",
38
- "version": "v0.3.0",
39
- "version_normalized": "0.3.0.0",
40
- "source": {
41
- "type": "git",
42
- "url": "https://github.com/container-interop/service-provider.git",
43
- "reference": "5cb38893b836edb00d3e1ace26c20ee1d29957cf"
44
- },
45
- "dist": {
46
- "type": "zip",
47
- "url": "https://api.github.com/repos/container-interop/service-provider/zipball/5cb38893b836edb00d3e1ace26c20ee1d29957cf",
48
- "reference": "5cb38893b836edb00d3e1ace26c20ee1d29957cf",
49
- "shasum": ""
50
- },
51
- "require": {
52
- "container-interop/container-interop": "^1.1"
53
- },
54
- "time": "2016-05-16T07:42:22+00:00",
55
- "type": "library",
56
- "installation-source": "dist",
57
- "autoload": {
58
- "psr-4": {
59
- "Interop\\Container\\": "src/"
60
- }
61
- },
62
- "notification-url": "https://packagist.org/downloads/",
63
- "license": [
64
- "MIT"
65
- ],
66
- "description": "Promoting container interoperability through standard service providers",
67
- "homepage": "https://github.com/container-interop/service-provider"
68
- },
69
- {
70
- "name": "dhii/collections-abstract",
71
- "version": "v0.1.0",
72
- "version_normalized": "0.1.0.0",
73
- "source": {
74
- "type": "git",
75
- "url": "https://github.com/Dhii/collections-abstract.git",
76
- "reference": "7c9141202af4d83b31e75efcbf481fa1cb588ad8"
77
- },
78
- "dist": {
79
- "type": "zip",
80
- "url": "https://api.github.com/repos/Dhii/collections-abstract/zipball/7c9141202af4d83b31e75efcbf481fa1cb588ad8",
81
- "reference": "7c9141202af4d83b31e75efcbf481fa1cb588ad8",
82
- "shasum": ""
83
- },
84
- "require": {
85
- "dhii/collections-abstract-base": "^0.1.0",
86
- "dhii/collections-interface": "^0.1.1",
87
- "dhii/stats-abstract": "^0.1.0"
88
- },
89
- "require-dev": {
90
- "dhii/php-cs-fixer-config": "dev-php-5.3",
91
- "phpunit/phpunit": "4.*",
92
- "ptrofimov/xpmock": "^1.1"
93
- },
94
- "time": "2016-11-10T19:29:24+00:00",
95
- "type": "library",
96
- "installation-source": "dist",
97
- "autoload": {
98
- "psr-4": {
99
- "Dhii\\Collection\\": "src/"
100
- }
101
- },
102
- "notification-url": "https://packagist.org/downloads/",
103
- "license": [
104
- "MIT"
105
- ],
106
- "authors": [
107
- {
108
- "name": "Dhii Team",
109
- "email": "development@dhii.co"
110
- }
111
- ],
112
- "description": "A collections library"
113
- },
114
- {
115
- "name": "dhii/collections-abstract-base",
116
- "version": "v0.1.0",
117
- "version_normalized": "0.1.0.0",
118
- "source": {
119
- "type": "git",
120
- "url": "https://github.com/Dhii/collections-abstract-base.git",
121
- "reference": "0ec0147451a72a13fb327ac6ff747c5e953c56f3"
122
- },
123
- "dist": {
124
- "type": "zip",
125
- "url": "https://api.github.com/repos/Dhii/collections-abstract-base/zipball/0ec0147451a72a13fb327ac6ff747c5e953c56f3",
126
- "reference": "0ec0147451a72a13fb327ac6ff747c5e953c56f3",
127
- "shasum": ""
128
- },
129
- "require": {
130
- "dhii/collections-interface": "^0.1.1"
131
- },
132
- "require-dev": {
133
- "codeclimate/php-test-reporter": "dev-master",
134
- "dhii/php-cs-fixer-config": "dev-php-5.3",
135
- "phpunit/phpunit": "^4.8",
136
- "ptrofimov/xpmock": "^1.1"
137
- },
138
- "time": "2016-11-10T15:09:37+00:00",
139
- "type": "library",
140
- "installation-source": "dist",
141
- "autoload": {
142
- "psr-4": {
143
- "Dhii\\Collection\\": "src/"
144
- }
145
- },
146
- "notification-url": "https://packagist.org/downloads/",
147
- "license": [
148
- "MIT"
149
- ],
150
- "authors": [
151
- {
152
- "name": "Dhii Team",
153
- "email": "development@dhii.co"
154
- }
155
- ],
156
- "description": "Collection base classes that do not depend on other non-collection packages, on which there is a dependency of other collection packages that depend on this package. This is done to avoid circular reference in the collection toolchain",
157
- "abandoned": "dhii/collections"
158
- },
159
- {
160
- "name": "dhii/collections-interface",
161
- "version": "v0.1.2",
162
- "version_normalized": "0.1.2.0",
163
- "source": {
164
- "type": "git",
165
- "url": "https://github.com/Dhii/collections-interface.git",
166
- "reference": "a8e9a30366a30d77bc270042a67150b3f8f6d94d"
167
- },
168
- "dist": {
169
- "type": "zip",
170
- "url": "https://api.github.com/repos/Dhii/collections-interface/zipball/a8e9a30366a30d77bc270042a67150b3f8f6d94d",
171
- "reference": "a8e9a30366a30d77bc270042a67150b3f8f6d94d",
172
- "shasum": ""
173
- },
174
- "require": {
175
- "php": "^5.3 | ^7.0"
176
- },
177
- "require-dev": {
178
- "codeclimate/php-test-reporter": "dev-master",
179
- "dhii/php-cs-fixer-config": "dev-php-5.3",
180
- "phpunit/phpunit": "^4.8"
181
- },
182
- "time": "2016-11-16T14:45:08+00:00",
183
- "type": "library",
184
- "installation-source": "dist",
185
- "autoload": {
186
- "psr-4": {
187
- "Dhii\\Collection\\": "src/"
188
- }
189
- },
190
- "notification-url": "https://packagist.org/downloads/",
191
- "license": [
192
- "MIT"
193
- ],
194
- "authors": [
195
- {
196
- "name": "Dhii Team",
197
- "email": "development@dhii.co"
198
- }
199
- ],
200
- "description": "Interfaces for collections"
201
- },
202
- {
203
- "name": "dhii/container-helper-base",
204
- "version": "v0.1-alpha8",
205
- "version_normalized": "0.1.0.0-alpha8",
206
- "source": {
207
- "type": "git",
208
- "url": "https://github.com/Dhii/container-helper-base.git",
209
- "reference": "1b8206842e06b71abcff769aaddfc51bf8f317cd"
210
- },
211
- "dist": {
212
- "type": "zip",
213
- "url": "https://api.github.com/repos/Dhii/container-helper-base/zipball/1b8206842e06b71abcff769aaddfc51bf8f317cd",
214
- "reference": "1b8206842e06b71abcff769aaddfc51bf8f317cd",
215
- "shasum": ""
216
- },
217
- "require": {
218
- "php": "^5.4 | ^7.0"
219
- },
220
- "require-dev": {
221
- "codeclimate/php-test-reporter": "<=0.3.2",
222
- "dhii/php-cs-fixer-config": "^0.1",
223
- "dhii/stringable-interface": "^0.1",
224
- "phpunit/phpunit": "^4.8",
225
- "psr/container": "^1.0",
226
- "ptrofimov/xpmock": "^1.1"
227
- },
228
- "time": "2018-07-30T09:59:15+00:00",
229
- "type": "library",
230
- "extra": {
231
- "branch-alias": {
232
- "dev-develop": "0.1.x-dev"
233
- }
234
- },
235
- "installation-source": "dist",
236
- "autoload": {
237
- "psr-4": {
238
- "Dhii\\Data\\Container\\": "src"
239
- }
240
- },
241
- "notification-url": "https://packagist.org/downloads/",
242
- "license": [
243
- "MIT"
244
- ],
245
- "authors": [
246
- {
247
- "name": "Dhii Team",
248
- "email": "development@dhii.co"
249
- }
250
- ],
251
- "description": "Helper functionality for working with container."
252
- },
253
- {
254
- "name": "dhii/di",
255
- "version": "v0.1.1",
256
- "version_normalized": "0.1.1.0",
257
- "source": {
258
- "type": "git",
259
- "url": "https://github.com/Dhii/di.git",
260
- "reference": "52efd50f1b11fcdd2f789bae483bdb858772c306"
261
- },
262
- "dist": {
263
- "type": "zip",
264
- "url": "https://api.github.com/repos/Dhii/di/zipball/52efd50f1b11fcdd2f789bae483bdb858772c306",
265
- "reference": "52efd50f1b11fcdd2f789bae483bdb858772c306",
266
- "shasum": ""
267
- },
268
- "require": {
269
- "container-interop/container-interop": "^1.1",
270
- "container-interop/service-provider": "^0.3",
271
- "dhii/di-abstract": "^0.1",
272
- "dhii/di-interface": "^0.1",
273
- "php": "^5.3 | ^7.0"
274
- },
275
- "provide": {
276
- "container-interop/container-interop-implementation": "^1.0"
277
- },
278
- "require-dev": {
279
- "codeclimate/php-test-reporter": "<=0.3.2",
280
- "dhii/php-cs-fixer-config": "dev-php-5.3",
281
- "phpunit/phpunit": "^4.8",
282
- "ptrofimov/xpmock": "^1.1"
283
- },
284
- "time": "2017-02-03T13:33:48+00:00",
285
- "type": "library",
286
- "installation-source": "dist",
287
- "autoload": {
288
- "psr-4": {
289
- "Dhii\\Di\\": "src/"
290
- }
291
- },
292
- "notification-url": "https://packagist.org/downloads/",
293
- "license": [
294
- "MIT"
295
- ],
296
- "authors": [
297
- {
298
- "name": "Dhii Team",
299
- "email": "development@dhii.co"
300
- }
301
- ],
302
- "description": "A DI container implementation",
303
- "keywords": [
304
- "container",
305
- "dependency injection",
306
- "di"
307
- ],
308
- "abandoned": "dhii/containers"
309
- },
310
- {
311
- "name": "dhii/di-abstract",
312
- "version": "v0.1",
313
- "version_normalized": "0.1.0.0",
314
- "source": {
315
- "type": "git",
316
- "url": "https://github.com/Dhii/di-abstract.git",
317
- "reference": "e87ee3782d5f4c44724e79c4b2e1a55103e5cd11"
318
- },
319
- "dist": {
320
- "type": "zip",
321
- "url": "https://api.github.com/repos/Dhii/di-abstract/zipball/e87ee3782d5f4c44724e79c4b2e1a55103e5cd11",
322
- "reference": "e87ee3782d5f4c44724e79c4b2e1a55103e5cd11",
323
- "shasum": ""
324
- },
325
- "require": {
326
- "container-interop/container-interop": "^1.1",
327
- "container-interop/service-provider": "^0.3",
328
- "dhii/di-interface": "^0.1",
329
- "php": "^5.3 | ^7.0"
330
- },
331
- "require-dev": {
332
- "codeclimate/php-test-reporter": "<=0.3.2",
333
- "dhii/php-cs-fixer-config": "dev-php-5.3",
334
- "phpunit/phpunit": "^4.8",
335
- "ptrofimov/xpmock": "^1.1"
336
- },
337
- "time": "2017-02-02T18:30:06+00:00",
338
- "type": "library",
339
- "installation-source": "dist",
340
- "autoload": {
341
- "psr-4": {
342
- "Dhii\\Di\\": "src/"
343
- }
344
- },
345
- "notification-url": "https://packagist.org/downloads/",
346
- "license": [
347
- "MIT"
348
- ],
349
- "authors": [
350
- {
351
- "name": "Dhii Team",
352
- "email": "development@dhii.co"
353
- }
354
- ],
355
- "description": "Base abstract classes for DI container implementations"
356
- },
357
- {
358
- "name": "dhii/di-interface",
359
- "version": "v0.1",
360
- "version_normalized": "0.1.0.0",
361
- "source": {
362
- "type": "git",
363
- "url": "https://github.com/Dhii/di-interface.git",
364
- "reference": "0320846a577d68b761e29acd5d4db40d88cc4f98"
365
- },
366
- "dist": {
367
- "type": "zip",
368
- "url": "https://api.github.com/repos/Dhii/di-interface/zipball/0320846a577d68b761e29acd5d4db40d88cc4f98",
369
- "reference": "0320846a577d68b761e29acd5d4db40d88cc4f98",
370
- "shasum": ""
371
- },
372
- "require": {
373
- "container-interop/container-interop": "^1.1",
374
- "container-interop/service-provider": "^0.3",
375
- "php": "^5.3 | ^7.0"
376
- },
377
- "require-dev": {
378
- "codeclimate/php-test-reporter": "<=0.3.2",
379
- "dhii/php-cs-fixer-config": "dev-php-5.3",
380
- "phpunit/phpunit": "^4.8",
381
- "ptrofimov/xpmock": "^1.1"
382
- },
383
- "time": "2017-02-02T13:12:09+00:00",
384
- "type": "library",
385
- "installation-source": "dist",
386
- "autoload": {
387
- "psr-4": {
388
- "Dhii\\Di\\": "src/"
389
- }
390
- },
391
- "notification-url": "https://packagist.org/downloads/",
392
- "license": [
393
- "MIT"
394
- ],
395
- "authors": [
396
- {
397
- "name": "Dhii Team",
398
- "email": "development@dhii.co"
399
- }
400
- ],
401
- "description": "Interfaces for DI container implementations"
402
- },
403
- {
404
- "name": "dhii/exception",
405
- "version": "v0.1-alpha5",
406
- "version_normalized": "0.1.0.0-alpha5",
407
- "source": {
408
- "type": "git",
409
- "url": "https://github.com/Dhii/exception.git",
410
- "reference": "f7afb934c970a4e167b2c7ba24fa3df50714e0fe"
411
- },
412
- "dist": {
413
- "type": "zip",
414
- "url": "https://api.github.com/repos/Dhii/exception/zipball/f7afb934c970a4e167b2c7ba24fa3df50714e0fe",
415
- "reference": "f7afb934c970a4e167b2c7ba24fa3df50714e0fe",
416
- "shasum": ""
417
- },
418
- "require": {
419
- "dhii/exception-interface": "^0.2",
420
- "dhii/i18n-helper-base": "^0.1",
421
- "dhii/normalization-helper-base": "^0.1",
422
- "php": "^5.4 | ^7.0"
423
- },
424
- "replace": {
425
- "dhii/exception-helper-base": "0.1-alpha1|0.1-alpha2"
426
- },
427
- "require-dev": {
428
- "codeclimate/php-test-reporter": "<=0.3.2",
429
- "dhii/php-cs-fixer-config": "^0.1",
430
- "dhii/stringable-interface": "^0.1",
431
- "phpunit/phpunit": "^4.8",
432
- "ptrofimov/xpmock": "^1.1"
433
- },
434
- "time": "2018-04-02T15:18:58+00:00",
435
- "type": "library",
436
- "extra": {
437
- "branch-alias": {
438
- "dev-develop": "0.1.x-dev"
439
- }
440
- },
441
- "installation-source": "dist",
442
- "autoload": {
443
- "psr-4": {
444
- "Dhii\\Exception\\": "src"
445
- }
446
- },
447
- "notification-url": "https://packagist.org/downloads/",
448
- "license": [
449
- "MIT"
450
- ],
451
- "authors": [
452
- {
453
- "name": "Dhii Team",
454
- "email": "development@dhii.co"
455
- }
456
- ],
457
- "description": "Standards-compliant exception classes"
458
- },
459
- {
460
- "name": "dhii/exception-interface",
461
- "version": "v0.2",
462
- "version_normalized": "0.2.0.0",
463
- "source": {
464
- "type": "git",
465
- "url": "https://github.com/Dhii/exception-interface.git",
466
- "reference": "b69feebf7cb2879cd43977a03342e2393b73f7fb"
467
- },
468
- "dist": {
469
- "type": "zip",
470
- "url": "https://api.github.com/repos/Dhii/exception-interface/zipball/b69feebf7cb2879cd43977a03342e2393b73f7fb",
471
- "reference": "b69feebf7cb2879cd43977a03342e2393b73f7fb",
472
- "shasum": ""
473
- },
474
- "require": {
475
- "dhii/stringable-interface": "^0.1",
476
- "php": "^5.3 | ^7.0"
477
- },
478
- "require-dev": {
479
- "codeclimate/php-test-reporter": "<=0.3.2",
480
- "dhii/php-cs-fixer-config": "dev-php-5.3",
481
- "phpunit/phpunit": "^4.8",
482
- "ptrofimov/xpmock": "^1.1"
483
- },
484
- "time": "2018-08-29T10:42:04+00:00",
485
- "type": "library",
486
- "extra": {
487
- "branch-alias": {
488
- "dev-develop": "0.2.x-dev"
489
- }
490
- },
491
- "installation-source": "dist",
492
- "autoload": {
493
- "psr-4": {
494
- "Dhii\\Exception\\": "src"
495
- }
496
- },
497
- "notification-url": "https://packagist.org/downloads/",
498
- "license": [
499
- "MIT"
500
- ],
501
- "authors": [
502
- {
503
- "name": "Dhii Team",
504
- "email": "development@dhii.co"
505
- }
506
- ],
507
- "description": "Interfaces for most common exceptions"
508
- },
509
- {
510
- "name": "dhii/factory-interface",
511
- "version": "v0.1",
512
- "version_normalized": "0.1.0.0",
513
- "source": {
514
- "type": "git",
515
- "url": "https://github.com/Dhii/factory-interface.git",
516
- "reference": "b8d217aec8838e64ccaa770cb03dc164bf6f0515"
517
- },
518
- "dist": {
519
- "type": "zip",
520
- "url": "https://api.github.com/repos/Dhii/factory-interface/zipball/b8d217aec8838e64ccaa770cb03dc164bf6f0515",
521
- "reference": "b8d217aec8838e64ccaa770cb03dc164bf6f0515",
522
- "shasum": ""
523
- },
524
- "require": {
525
- "dhii/exception-interface": "^0.1|^0.2",
526
- "php": "^5.3 | ^7.0"
527
- },
528
- "require-dev": {
529
- "codeclimate/php-test-reporter": "<=0.3.2",
530
- "dhii/php-cs-fixer-config": "dev-php-5.3",
531
- "dhii/stringable-interface": "^0.1",
532
- "phpunit/phpunit": "^4.8",
533
- "psr/container": "^1.0",
534
- "ptrofimov/xpmock": "^1.1"
535
- },
536
- "time": "2018-08-29T11:15:09+00:00",
537
- "type": "library",
538
- "extra": {
539
- "branch-alias": {
540
- "dev-develop": "0.1.x-dev"
541
- }
542
- },
543
- "installation-source": "dist",
544
- "autoload": {
545
- "psr-4": {
546
- "Dhii\\Factory\\": "src"
547
- }
548
- },
549
- "notification-url": "https://packagist.org/downloads/",
550
- "license": [
551
- "MIT"
552
- ],
553
- "authors": [
554
- {
555
- "name": "Dhii Team",
556
- "email": "development@dhii.co"
557
- }
558
- ],
559
- "description": "Interfaces for working with factories."
560
- },
561
- {
562
- "name": "dhii/i18n-helper-base",
563
- "version": "v0.1-alpha1",
564
- "version_normalized": "0.1.0.0-alpha1",
565
- "source": {
566
- "type": "git",
567
- "url": "https://github.com/Dhii/i18n-helper-base.git",
568
- "reference": "fc4c881f3e528ea918588831ebeffb92738f8dd5"
569
- },
570
- "dist": {
571
- "type": "zip",
572
- "url": "https://api.github.com/repos/Dhii/i18n-helper-base/zipball/fc4c881f3e528ea918588831ebeffb92738f8dd5",
573
- "reference": "fc4c881f3e528ea918588831ebeffb92738f8dd5",
574
- "shasum": ""
575
- },
576
- "require": {
577
- "dhii/i18n-interface": "^0.1|^0.2",
578
- "php": "^5.4 | ^7.0"
579
- },
580
- "require-dev": {
581
- "codeclimate/php-test-reporter": "<=0.3.2",
582
- "dhii/php-cs-fixer-config": "dev-php-5.3",
583
- "phpunit/phpunit": "^4.8",
584
- "ptrofimov/xpmock": "^1.1"
585
- },
586
- "time": "2018-03-07T22:38:07+00:00",
587
- "type": "library",
588
- "extra": {
589
- "branch-alias": {
590
- "dev-develop": "0.1.x-dev"
591
- }
592
- },
593
- "installation-source": "dist",
594
- "autoload": {
595
- "psr-4": {
596
- "Dhii\\I18n\\": "src"
597
- }
598
- },
599
- "notification-url": "https://packagist.org/downloads/",
600
- "license": [
601
- "MIT"
602
- ],
603
- "authors": [
604
- {
605
- "name": "Dhii Team",
606
- "email": "development@dhii.co"
607
- }
608
- ],
609
- "description": "A base for internationalization consumers",
610
- "abandoned": true
611
- },
612
- {
613
- "name": "dhii/i18n-interface",
614
- "version": "v0.2",
615
- "version_normalized": "0.2.0.0",
616
- "source": {
617
- "type": "git",
618
- "url": "https://github.com/Dhii/i18n-interface.git",
619
- "reference": "7eaf0731ba80eea37a5deea6d894a0326e10be67"
620
- },
621
- "dist": {
622
- "type": "zip",
623
- "url": "https://api.github.com/repos/Dhii/i18n-interface/zipball/7eaf0731ba80eea37a5deea6d894a0326e10be67",
624
- "reference": "7eaf0731ba80eea37a5deea6d894a0326e10be67",
625
- "shasum": ""
626
- },
627
- "require": {
628
- "php": "^5.3 | ^7.0"
629
- },
630
- "require-dev": {
631
- "codeclimate/php-test-reporter": "<=0.3.2",
632
- "dhii/data-key-value-aware-interface": "^0.1",
633
- "dhii/php-cs-fixer-config": "dev-php-5.3",
634
- "dhii/stringable-interface": "^0.1",
635
- "phpunit/phpunit": "^4.8",
636
- "ptrofimov/xpmock": "^1.1"
637
- },
638
- "time": "2017-03-15T16:01:39+00:00",
639
- "type": "library",
640
- "installation-source": "dist",
641
- "autoload": {
642
- "psr-4": {
643
- "Dhii\\I18n\\": "src/"
644
- }
645
- },
646
- "notification-url": "https://packagist.org/downloads/",
647
- "license": [
648
- "MIT"
649
- ],
650
- "authors": [
651
- {
652
- "name": "Dhii Team",
653
- "email": "development@dhii.co"
654
- }
655
- ],
656
- "description": "Interfaces for internationalization."
657
- },
658
- {
659
- "name": "dhii/iterator-helper-base",
660
- "version": "v0.1-alpha2",
661
- "version_normalized": "0.1.0.0-alpha2",
662
- "source": {
663
- "type": "git",
664
- "url": "https://github.com/Dhii/iterator-helper-base.git",
665
- "reference": "cf62fb9f8b658a82815f15a2d906d8d1ff5c52ce"
666
- },
667
- "dist": {
668
- "type": "zip",
669
- "url": "https://api.github.com/repos/Dhii/iterator-helper-base/zipball/cf62fb9f8b658a82815f15a2d906d8d1ff5c52ce",
670
- "reference": "cf62fb9f8b658a82815f15a2d906d8d1ff5c52ce",
671
- "shasum": ""
672
- },
673
- "require": {
674
- "dhii/exception": "^0.1-alpha4",
675
- "php": "^5.4 | ^7.0"
676
- },
677
- "require-dev": {
678
- "codeclimate/php-test-reporter": "<=0.3.2",
679
- "dhii/invocable-interface": "0.1-alpha1",
680
- "dhii/php-cs-fixer-config": "^0.1",
681
- "dhii/stringable-interface": "^0.1",
682
- "phpunit/phpunit": "^4.8",
683
- "ptrofimov/xpmock": "dev-master"
684
- },
685
- "suggest": {
686
- "dhii/callback-abstract": "For structural invocation of callables"
687
- },
688
- "time": "2018-03-22T11:25:07+00:00",
689
- "type": "library",
690
- "extra": {
691
- "branch-alias": {
692
- "dev-develop": "0.1.x-dev"
693
- }
694
- },
695
- "installation-source": "dist",
696
- "autoload": {
697
- "psr-4": {
698
- "Dhii\\Iterator\\": "src"
699
- }
700
- },
701
- "notification-url": "https://packagist.org/downloads/",
702
- "license": [
703
- "MIT"
704
- ],
705
- "authors": [
706
- {
707
- "name": "Dhii Team",
708
- "email": "development@dhii.co"
709
- }
710
- ],
711
- "description": "Common functionality for working with iterables"
712
- },
713
- {
714
- "name": "dhii/normalization-helper-base",
715
- "version": "v0.1-alpha4",
716
- "version_normalized": "0.1.0.0-alpha4",
717
- "source": {
718
- "type": "git",
719
- "url": "https://github.com/Dhii/normalization-helper-base.git",
720
- "reference": "1b64f0ea6b3e32f9478f854f6049500795b51da7"
721
- },
722
- "dist": {
723
- "type": "zip",
724
- "url": "https://api.github.com/repos/Dhii/normalization-helper-base/zipball/1b64f0ea6b3e32f9478f854f6049500795b51da7",
725
- "reference": "1b64f0ea6b3e32f9478f854f6049500795b51da7",
726
- "shasum": ""
727
- },
728
- "require": {
729
- "php": "^5.4 | ^7.0"
730
- },
731
- "require-dev": {
732
- "codeclimate/php-test-reporter": "<=0.3.2",
733
- "dhii/php-cs-fixer-config": "^0.1",
734
- "dhii/stringable-interface": "^0.1",
735
- "phpunit/phpunit": "^4.8",
736
- "ptrofimov/xpmock": "^1.1"
737
- },
738
- "time": "2018-06-04T08:55:31+00:00",
739
- "type": "library",
740
- "extra": {
741
- "branch-alias": {
742
- "dev-develop": "0.1.x-dev"
743
- }
744
- },
745
- "installation-source": "dist",
746
- "autoload": {
747
- "psr-4": {
748
- "Dhii\\Util\\Normalization\\": "src"
749
- }
750
- },
751
- "notification-url": "https://packagist.org/downloads/",
752
- "license": [
753
- "MIT"
754
- ],
755
- "authors": [
756
- {
757
- "name": "Dhii Team",
758
- "email": "development@dhii.co"
759
- }
760
- ],
761
- "description": "Functionality for normalizing values."
762
- },
763
- {
764
- "name": "dhii/output-renderer-abstract",
765
- "version": "v0.1-alpha2",
766
- "version_normalized": "0.1.0.0-alpha2",
767
- "source": {
768
- "type": "git",
769
- "url": "https://github.com/Dhii/output-renderer-abstract.git",
770
- "reference": "0f6e5eed940025332dd1986d6c771e10f7197b1a"
771
- },
772
- "dist": {
773
- "type": "zip",
774
- "url": "https://api.github.com/repos/Dhii/output-renderer-abstract/zipball/0f6e5eed940025332dd1986d6c771e10f7197b1a",
775
- "reference": "0f6e5eed940025332dd1986d6c771e10f7197b1a",
776
- "shasum": ""
777
- },
778
- "require": {
779
- "dhii/output-renderer-interface": "^0.2 | ^0.3",
780
- "php": "^5.4 | ^7.0",
781
- "psr/container": "^1.0"
782
- },
783
- "require-dev": {
784
- "codeclimate/php-test-reporter": "<=0.3.2",
785
- "dhii/exception-interface": "^0.2-alpha3",
786
- "dhii/invocable-interface": "^0.1-alpha1",
787
- "dhii/php-cs-fixer-config": "^0.1",
788
- "dhii/validation-interface": "^0.1 | ^0.2-alpha1",
789
- "phpunit/phpunit": "^4.8",
790
- "ptrofimov/xpmock": "^1.1"
791
- },
792
- "suggest": {
793
- "dhii/container-helper-base": "For normalizing context containers"
794
- },
795
- "time": "2018-05-10T12:31:09+00:00",
796
- "type": "library",
797
- "extra": {
798
- "branch-alias": {
799
- "dev-develop": "0.1.x-dev"
800
- }
801
- },
802
- "installation-source": "dist",
803
- "autoload": {
804
- "psr-4": {
805
- "Dhii\\Output\\": "src"
806
- }
807
- },
808
- "notification-url": "https://packagist.org/downloads/",
809
- "license": [
810
- "MIT"
811
- ],
812
- "authors": [
813
- {
814
- "name": "Dhii Team",
815
- "email": "development@dhii.co"
816
- }
817
- ],
818
- "description": "Common abstract functionality for output renderers.",
819
- "abandoned": true
820
- },
821
- {
822
- "name": "dhii/output-renderer-base",
823
- "version": "v0.1-alpha1",
824
- "version_normalized": "0.1.0.0-alpha1",
825
- "source": {
826
- "type": "git",
827
- "url": "https://github.com/Dhii/output-renderer-base.git",
828
- "reference": "700483a37016e502be2ead9580bb9258ad8bf17b"
829
- },
830
- "dist": {
831
- "type": "zip",
832
- "url": "https://api.github.com/repos/Dhii/output-renderer-base/zipball/700483a37016e502be2ead9580bb9258ad8bf17b",
833
- "reference": "700483a37016e502be2ead9580bb9258ad8bf17b",
834
- "shasum": ""
835
- },
836
- "require": {
837
- "dhii/container-helper-base": "^0.1-alpha5",
838
- "dhii/exception": "^0.1-alpha4",
839
- "dhii/i18n-helper-base": "^0.1-alpha1",
840
- "dhii/output-renderer-abstract": "^0.1-alpha1",
841
- "dhii/output-renderer-interface": "^0.2 | ^0.3-alpha1",
842
- "php": "^5.4 | ^7.0"
843
- },
844
- "require-dev": {
845
- "codeclimate/php-test-reporter": "<=0.3.2",
846
- "dhii/php-cs-fixer-config": "^0.1",
847
- "dhii/stringable-interface": "^0.1",
848
- "phpunit/phpunit": "^4.8",
849
- "psr/container": "^1.0",
850
- "ptrofimov/xpmock": "^1.1"
851
- },
852
- "time": "2018-04-05T13:32:07+00:00",
853
- "type": "library",
854
- "extra": {
855
- "branch-alias": {
856
- "dev-develop": "0.1.x-dev"
857
- }
858
- },
859
- "installation-source": "dist",
860
- "autoload": {
861
- "psr-4": {
862
- "Dhii\\Output\\": "src"
863
- }
864
- },
865
- "notification-url": "https://packagist.org/downloads/",
866
- "license": [
867
- "MIT"
868
- ],
869
- "authors": [
870
- {
871
- "name": "Dhii Team",
872
- "email": "development@dhii.co"
873
- }
874
- ],
875
- "description": "Base concrete functionality for output rendering.",
876
- "abandoned": true
877
- },
878
- {
879
- "name": "dhii/output-renderer-interface",
880
- "version": "v0.3",
881
- "version_normalized": "0.3.0.0",
882
- "source": {
883
- "type": "git",
884
- "url": "https://github.com/Dhii/output-renderer-interface.git",
885
- "reference": "407014d7fd1af0427958f2acd61aff008ee9e032"
886
- },
887
- "dist": {
888
- "type": "zip",
889
- "url": "https://api.github.com/repos/Dhii/output-renderer-interface/zipball/407014d7fd1af0427958f2acd61aff008ee9e032",
890
- "reference": "407014d7fd1af0427958f2acd61aff008ee9e032",
891
- "shasum": ""
892
- },
893
- "require": {
894
- "dhii/exception-interface": "^0.1 | ^0.2",
895
- "dhii/factory-interface": "^0.1-alpha2",
896
- "dhii/stringable-interface": "^0.1",
897
- "php": "^5.3 | ^7.0"
898
- },
899
- "require-dev": {
900
- "codeclimate/php-test-reporter": "dev-master",
901
- "dhii/php-cs-fixer-config": "dev-php-5.3",
902
- "phpunit/phpunit": "4.*",
903
- "psr/container": "^1.0",
904
- "ptrofimov/xpmock": "^1.1"
905
- },
906
- "suggest": {
907
- "dhii/container-helper-base": "Useful for reading data from different context types uniformly"
908
- },
909
- "time": "2019-11-14T11:20:00+00:00",
910
- "type": "library",
911
- "extra": {
912
- "branch-alias": {
913
- "dev-develop": "0.3.x-dev"
914
- }
915
- },
916
- "installation-source": "dist",
917
- "autoload": {
918
- "psr-4": {
919
- "Dhii\\Output\\": "src/"
920
- }
921
- },
922
- "notification-url": "https://packagist.org/downloads/",
923
- "license": [
924
- "MIT"
925
- ],
926
- "authors": [
927
- {
928
- "name": "Dhii Team",
929
- "email": "development@dhii.co"
930
- }
931
- ],
932
- "description": "An interface for objects that can perform rendering."
933
- },
934
- {
935
- "name": "dhii/stats-abstract",
936
- "version": "v0.1.0",
937
- "version_normalized": "0.1.0.0",
938
- "source": {
939
- "type": "git",
940
- "url": "https://github.com/Dhii/stats-abstract.git",
941
- "reference": "71f6702c3257c71ab3917b6d076d3c3588cc9f49"
942
- },
943
- "dist": {
944
- "type": "zip",
945
- "url": "https://api.github.com/repos/Dhii/stats-abstract/zipball/71f6702c3257c71ab3917b6d076d3c3588cc9f49",
946
- "reference": "71f6702c3257c71ab3917b6d076d3c3588cc9f49",
947
- "shasum": ""
948
- },
949
- "require": {
950
- "dhii/collections-abstract-base": "^0.1.0",
951
- "dhii/stats-interface": "^0.1.0"
952
- },
953
- "require-dev": {
954
- "dhii/php-cs-fixer-config": "dev-php-5.3",
955
- "phpunit/phpunit": "^4.8",
956
- "ptrofimov/xpmock": "^1.1"
957
- },
958
- "time": "2016-11-10T18:55:43+00:00",
959
- "type": "library",
960
- "installation-source": "dist",
961
- "autoload": {
962
- "psr-4": {
963
- "Dhii\\Stats\\": "src/"
964
- }
965
- },
966
- "notification-url": "https://packagist.org/downloads/",
967
- "license": [
968
- "MIT"
969
- ],
970
- "authors": [
971
- {
972
- "name": "Dhii Team",
973
- "email": "development@dhii.co"
974
- }
975
- ],
976
- "description": "Abstract base for stats"
977
- },
978
- {
979
- "name": "dhii/stats-interface",
980
- "version": "v0.1.0",
981
- "version_normalized": "0.1.0.0",
982
- "source": {
983
- "type": "git",
984
- "url": "https://github.com/Dhii/stats-interface.git",
985
- "reference": "36d09a8b8a3b8058214dae6eefb8ecdd98e0f0ba"
986
- },
987
- "dist": {
988
- "type": "zip",
989
- "url": "https://api.github.com/repos/Dhii/stats-interface/zipball/36d09a8b8a3b8058214dae6eefb8ecdd98e0f0ba",
990
- "reference": "36d09a8b8a3b8058214dae6eefb8ecdd98e0f0ba",
991
- "shasum": ""
992
- },
993
- "require": {
994
- "php": "^5.3 | ^7.0"
995
- },
996
- "require-dev": {
997
- "dhii/php-cs-fixer-config": "dev-php-5.3"
998
- },
999
- "time": "2016-11-10T15:38:37+00:00",
1000
- "type": "library",
1001
- "installation-source": "dist",
1002
- "autoload": {
1003
- "psr-4": {
1004
- "Dhii\\Stats\\": "src/"
1005
- }
1006
- },
1007
- "notification-url": "https://packagist.org/downloads/",
1008
- "license": [
1009
- "MIT"
1010
- ],
1011
- "authors": [
1012
- {
1013
- "name": "Dhii Team",
1014
- "email": "development@dhii.co"
1015
- }
1016
- ],
1017
- "description": "Interfaces for stats"
1018
- },
1019
- {
1020
- "name": "dhii/stringable-interface",
1021
- "version": "v0.1",
1022
- "version_normalized": "0.1.0.0",
1023
- "source": {
1024
- "type": "git",
1025
- "url": "https://github.com/Dhii/stringable-interface.git",
1026
- "reference": "b6653905eef2ebf377749feb80a6d18abbe913ef"
1027
- },
1028
- "dist": {
1029
- "type": "zip",
1030
- "url": "https://api.github.com/repos/Dhii/stringable-interface/zipball/b6653905eef2ebf377749feb80a6d18abbe913ef",
1031
- "reference": "b6653905eef2ebf377749feb80a6d18abbe913ef",
1032
- "shasum": ""
1033
- },
1034
- "require": {
1035
- "php": "^5.3 | ^7.0"
1036
- },
1037
- "require-dev": {
1038
- "codeclimate/php-test-reporter": "<=0.3.2",
1039
- "dhii/php-cs-fixer-config": "dev-php-5.3",
1040
- "phpunit/phpunit": "^4.8",
1041
- "ptrofimov/xpmock": "^1.1"
1042
- },
1043
- "time": "2017-01-23T15:08:20+00:00",
1044
- "type": "library",
1045
- "installation-source": "dist",
1046
- "autoload": {
1047
- "psr-4": {
1048
- "Dhii\\Util\\String\\": "src/"
1049
- }
1050
- },
1051
- "notification-url": "https://packagist.org/downloads/",
1052
- "license": [
1053
- "MIT"
1054
- ],
1055
- "authors": [
1056
- {
1057
- "name": "Dhii Team",
1058
- "email": "development@dhii.co"
1059
- }
1060
- ],
1061
- "description": "Interoperability interface for objects that can be cast to string"
1062
- },
1063
- {
1064
- "name": "dhii/transformer-interface",
1065
- "version": "v0.1-alpha1",
1066
- "version_normalized": "0.1.0.0-alpha1",
1067
- "source": {
1068
- "type": "git",
1069
- "url": "https://github.com/Dhii/transformer-interface.git",
1070
- "reference": "e774efef46413eb34bdafc19a6bd74fbf656235d"
1071
- },
1072
- "dist": {
1073
- "type": "zip",
1074
- "url": "https://api.github.com/repos/Dhii/transformer-interface/zipball/e774efef46413eb34bdafc19a6bd74fbf656235d",
1075
- "reference": "e774efef46413eb34bdafc19a6bd74fbf656235d",
1076
- "shasum": ""
1077
- },
1078
- "require": {
1079
- "dhii/exception-interface": "^0.1 | ^0.2-alpha1",
1080
- "dhii/factory-interface": "^0.1-alpha1",
1081
- "php": "^5.3 | ^7.0"
1082
- },
1083
- "require-dev": {
1084
- "codeclimate/php-test-reporter": "<=0.3.2",
1085
- "dhii/php-cs-fixer-config": "dev-php-5.3",
1086
- "phpunit/phpunit": "^4.8",
1087
- "ptrofimov/xpmock": "^1.1"
1088
- },
1089
- "time": "2018-05-15T16:59:05+00:00",
1090
- "type": "library",
1091
- "extra": {
1092
- "branch-alias": {
1093
- "dev-develop": "0.1.x-dev"
1094
- }
1095
- },
1096
- "installation-source": "dist",
1097
- "autoload": {
1098
- "psr-4": {
1099
- "Dhii\\Transformer\\": "src"
1100
- }
1101
- },
1102
- "notification-url": "https://packagist.org/downloads/",
1103
- "license": [
1104
- "MIT"
1105
- ],
1106
- "authors": [
1107
- {
1108
- "name": "Dhii Team",
1109
- "email": "development@dhii.co"
1110
- }
1111
- ],
1112
- "description": "Interfaces for data transformation"
1113
- },
1114
- {
1115
- "name": "dhii/validation-abstract",
1116
- "version": "v0.2-alpha1",
1117
- "version_normalized": "0.2.0.0-alpha1",
1118
- "source": {
1119
- "type": "git",
1120
- "url": "https://github.com/Dhii/validation-abstract.git",
1121
- "reference": "dff998ba3476927a0fc6d10bb022425de8f1c844"
1122
- },
1123
- "dist": {
1124
- "type": "zip",
1125
- "url": "https://api.github.com/repos/Dhii/validation-abstract/zipball/dff998ba3476927a0fc6d10bb022425de8f1c844",
1126
- "reference": "dff998ba3476927a0fc6d10bb022425de8f1c844",
1127
- "shasum": ""
1128
- },
1129
- "require": {
1130
- "dhii/validation-interface": "^0.2",
1131
- "php": "^5.3 | ^7.0"
1132
- },
1133
- "require-dev": {
1134
- "codeclimate/php-test-reporter": "<=0.3.2",
1135
- "dhii/php-cs-fixer-config": "dev-php-5.3",
1136
- "dhii/stringable-interface": "^0.1",
1137
- "phpunit/phpunit": "^4.8",
1138
- "ptrofimov/xpmock": "^1.1"
1139
- },
1140
- "suggest": {
1141
- "dhii/i18n-helper-base": "For string internationalization",
1142
- "dhii/iterator-helper-base": "For implementations of iterable-related helper functionality",
1143
- "dhii/normalization-helper-base": "For simple types normalization",
1144
- "dhii/stringable-interface": "To be able to pass stringable objects instead of strings",
1145
- "dhii/validation-interface": "Needed to be able to create exceptions that are expected to be thrown"
1146
- },
1147
- "time": "2018-03-07T21:05:39+00:00",
1148
- "type": "library",
1149
- "extra": {
1150
- "branch-alias": {
1151
- "dev-develop": "0.2.x-dev"
1152
- }
1153
- },
1154
- "installation-source": "dist",
1155
- "autoload": {
1156
- "psr-4": {
1157
- "Dhii\\Validation\\": "src/"
1158
- }
1159
- },
1160
- "notification-url": "https://packagist.org/downloads/",
1161
- "license": [
1162
- "MIT"
1163
- ],
1164
- "authors": [
1165
- {
1166
- "name": "Dhii Team",
1167
- "email": "development@dhii.co"
1168
- }
1169
- ],
1170
- "description": "Common abstract functionality for validation."
1171
- },
1172
- {
1173
- "name": "dhii/validation-base",
1174
- "version": "v0.2-alpha2",
1175
- "version_normalized": "0.2.0.0-alpha2",
1176
- "source": {
1177
- "type": "git",
1178
- "url": "https://github.com/Dhii/validation-base.git",
1179
- "reference": "9e75c5f886a2403c6989c36c2d4ffcfae158172e"
1180
- },
1181
- "dist": {
1182
- "type": "zip",
1183
- "url": "https://api.github.com/repos/Dhii/validation-base/zipball/9e75c5f886a2403c6989c36c2d4ffcfae158172e",
1184
- "reference": "9e75c5f886a2403c6989c36c2d4ffcfae158172e",
1185
- "shasum": ""
1186
- },
1187
- "require": {
1188
- "dhii/exception": "^0.1-alpha4",
1189
- "dhii/i18n-helper-base": "^0.1",
1190
- "dhii/iterator-helper-base": "^0.1",
1191
- "dhii/normalization-helper-base": "^0.1",
1192
- "dhii/validation-abstract": "^0.2",
1193
- "dhii/validation-interface": "^0.2-alpha2",
1194
- "php": "^5.4 | ^7.0"
1195
- },
1196
- "require-dev": {
1197
- "codeclimate/php-test-reporter": "<=0.3.2",
1198
- "dhii/php-cs-fixer-config": "dev-php-5.3",
1199
- "phpunit/phpunit": "^4.8",
1200
- "ptrofimov/xpmock": "^1.1"
1201
- },
1202
- "time": "2018-04-02T13:31:36+00:00",
1203
- "type": "library",
1204
- "extra": {
1205
- "branch-alias": {
1206
- "dev-develop": "0.2.x-dev"
1207
- }
1208
- },
1209
- "installation-source": "dist",
1210
- "autoload": {
1211
- "psr-4": {
1212
- "Dhii\\Validation\\": "src/"
1213
- }
1214
- },
1215
- "notification-url": "https://packagist.org/downloads/",
1216
- "license": [
1217
- "MIT"
1218
- ],
1219
- "authors": [
1220
- {
1221
- "name": "Dhii Team",
1222
- "email": "development@dhii.co"
1223
- }
1224
- ],
1225
- "description": "Base concrete functionality for validation."
1226
- },
1227
- {
1228
- "name": "dhii/validation-interface",
1229
- "version": "v0.2",
1230
- "version_normalized": "0.2.0.0",
1231
- "source": {
1232
- "type": "git",
1233
- "url": "https://github.com/Dhii/validation-interface.git",
1234
- "reference": "a26026ae5cdf0a650b3511a22dbcb9329073b82c"
1235
- },
1236
- "dist": {
1237
- "type": "zip",
1238
- "url": "https://api.github.com/repos/Dhii/validation-interface/zipball/a26026ae5cdf0a650b3511a22dbcb9329073b82c",
1239
- "reference": "a26026ae5cdf0a650b3511a22dbcb9329073b82c",
1240
- "shasum": ""
1241
- },
1242
- "require": {
1243
- "dhii/exception-interface": "^0.1|^0.2",
1244
- "dhii/factory-interface": "^0.1",
1245
- "php": "^5.3 | ^7.0"
1246
- },
1247
- "require-dev": {
1248
- "codeclimate/php-test-reporter": "<=0.3.2",
1249
- "dhii/php-cs-fixer-config": "dev-php-5.3",
1250
- "dhii/stringable-interface": "^0.1",
1251
- "phpunit/phpunit": "^4.8",
1252
- "ptrofimov/xpmock": "^1.1"
1253
- },
1254
- "time": "2018-08-29T11:39:22+00:00",
1255
- "type": "library",
1256
- "extra": {
1257
- "branch-alias": {
1258
- "dev-develop": "0.3.x-dev"
1259
- }
1260
- },
1261
- "installation-source": "dist",
1262
- "autoload": {
1263
- "psr-4": {
1264
- "Dhii\\Validation\\": "src/"
1265
- }
1266
- },
1267
- "notification-url": "https://packagist.org/downloads/",
1268
- "license": [
1269
- "MIT"
1270
- ],
1271
- "authors": [
1272
- {
1273
- "name": "Dhii Team",
1274
- "email": "development@dhii.co"
1275
- }
1276
- ],
1277
- "description": "A base interface for validators"
1278
- },
1279
- {
1280
- "name": "erusev/parsedown",
1281
- "version": "1.7.4",
1282
- "version_normalized": "1.7.4.0",
1283
- "source": {
1284
- "type": "git",
1285
- "url": "https://github.com/erusev/parsedown.git",
1286
- "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3"
1287
- },
1288
- "dist": {
1289
- "type": "zip",
1290
- "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
1291
- "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
1292
- "shasum": ""
1293
- },
1294
- "require": {
1295
- "ext-mbstring": "*",
1296
- "php": ">=5.3.0"
1297
- },
1298
- "require-dev": {
1299
- "phpunit/phpunit": "^4.8.35"
1300
- },
1301
- "time": "2019-12-30T22:54:17+00:00",
1302
- "type": "library",
1303
- "installation-source": "dist",
1304
- "autoload": {
1305
- "psr-0": {
1306
- "Parsedown": ""
1307
- }
1308
- },
1309
- "notification-url": "https://packagist.org/downloads/",
1310
- "license": [
1311
- "MIT"
1312
- ],
1313
- "authors": [
1314
- {
1315
- "name": "Emanuil Rusev",
1316
- "email": "hello@erusev.com",
1317
- "homepage": "http://erusev.com"
1318
- }
1319
- ],
1320
- "description": "Parser for Markdown.",
1321
- "homepage": "http://parsedown.org",
1322
- "keywords": [
1323
- "markdown",
1324
- "parser"
1325
- ]
1326
- },
1327
- {
1328
- "name": "php-di/invoker",
1329
- "version": "1.3.3",
1330
- "version_normalized": "1.3.3.0",
1331
- "source": {
1332
- "type": "git",
1333
- "url": "https://github.com/PHP-DI/Invoker.git",
1334
- "reference": "1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7"
1335
- },
1336
- "dist": {
1337
- "type": "zip",
1338
- "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7",
1339
- "reference": "1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7",
1340
- "shasum": ""
1341
- },
1342
- "require": {
1343
- "container-interop/container-interop": "~1.1"
1344
- },
1345
- "require-dev": {
1346
- "athletic/athletic": "~0.1.8",
1347
- "phpunit/phpunit": "~4.5"
1348
- },
1349
- "time": "2016-07-14T13:09:58+00:00",
1350
- "type": "library",
1351
- "installation-source": "dist",
1352
- "autoload": {
1353
- "psr-4": {
1354
- "Invoker\\": "src/"
1355
- }
1356
- },
1357
- "notification-url": "https://packagist.org/downloads/",
1358
- "license": [
1359
- "MIT"
1360
- ],
1361
- "description": "Generic and extensible callable invoker",
1362
- "homepage": "https://github.com/PHP-DI/Invoker",
1363
- "keywords": [
1364
- "callable",
1365
- "dependency",
1366
- "dependency-injection",
1367
- "injection",
1368
- "invoke",
1369
- "invoker"
1370
- ]
1371
- },
1372
- {
1373
- "name": "php-di/php-di",
1374
- "version": "5.2.2",
1375
- "version_normalized": "5.2.2.0",
1376
- "source": {
1377
- "type": "git",
1378
- "url": "https://github.com/PHP-DI/PHP-DI.git",
1379
- "reference": "f574bcc841201ab04587b1c6da1234d4044f67d8"
1380
- },
1381
- "dist": {
1382
- "type": "zip",
1383
- "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f574bcc841201ab04587b1c6da1234d4044f67d8",
1384
- "reference": "f574bcc841201ab04587b1c6da1234d4044f67d8",
1385
- "shasum": ""
1386
- },
1387
- "require": {
1388
- "container-interop/container-interop": "~1.0",
1389
- "php": ">=5.4.0",
1390
- "php-di/invoker": "^1.1.1",
1391
- "php-di/phpdoc-reader": "^2.0.1"
1392
- },
1393
- "replace": {
1394
- "mnapoli/php-di": "*"
1395
- },
1396
- "require-dev": {
1397
- "doctrine/annotations": "~1.2",
1398
- "doctrine/cache": "~1.4",
1399
- "mnapoli/phpunit-easymock": "~0.2.0",
1400
- "ocramius/proxy-manager": "~1.0",
1401
- "phpunit/phpunit": "~4.5"
1402
- },
1403
- "suggest": {
1404
- "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)",
1405
- "doctrine/cache": "Install it if you want to use the cache (version ~1.4)",
1406
- "ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~1.0)"
1407
- },
1408
- "time": "2016-02-09T22:00:00+00:00",
1409
- "type": "library",
1410
- "installation-source": "dist",
1411
- "autoload": {
1412
- "psr-4": {
1413
- "DI\\": "src/DI/"
1414
- },
1415
- "files": [
1416
- "src/DI/functions.php"
1417
- ]
1418
- },
1419
- "notification-url": "https://packagist.org/downloads/",
1420
- "license": [
1421
- "MIT"
1422
- ],
1423
- "description": "The dependency injection container for humans",
1424
- "homepage": "http://php-di.org/",
1425
- "keywords": [
1426
- "container",
1427
- "dependency injection",
1428
- "di"
1429
- ]
1430
- },
1431
- {
1432
- "name": "php-di/phpdoc-reader",
1433
- "version": "2.1.1",
1434
- "version_normalized": "2.1.1.0",
1435
- "source": {
1436
- "type": "git",
1437
- "url": "https://github.com/PHP-DI/PhpDocReader.git",
1438
- "reference": "15678f7451c020226807f520efb867ad26fbbfcf"
1439
- },
1440
- "dist": {
1441
- "type": "zip",
1442
- "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/15678f7451c020226807f520efb867ad26fbbfcf",
1443
- "reference": "15678f7451c020226807f520efb867ad26fbbfcf",
1444
- "shasum": ""
1445
- },
1446
- "require": {
1447
- "php": ">=5.4.0"
1448
- },
1449
- "require-dev": {
1450
- "phpunit/phpunit": "~4.6"
1451
- },
1452
- "time": "2019-09-26T11:24:58+00:00",
1453
- "type": "library",
1454
- "installation-source": "dist",
1455
- "autoload": {
1456
- "psr-4": {
1457
- "PhpDocReader\\": "src/PhpDocReader"
1458
- }
1459
- },
1460
- "notification-url": "https://packagist.org/downloads/",
1461
- "license": [
1462
- "MIT"
1463
- ],
1464
- "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)",
1465
- "keywords": [
1466
- "phpdoc",
1467
- "reflection"
1468
- ]
1469
- },
1470
- {
1471
- "name": "psr/container",
1472
- "version": "1.0.0",
1473
- "version_normalized": "1.0.0.0",
1474
- "source": {
1475
- "type": "git",
1476
- "url": "https://github.com/php-fig/container.git",
1477
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
1478
- },
1479
- "dist": {
1480
- "type": "zip",
1481
- "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
1482
- "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
1483
- "shasum": ""
1484
- },
1485
- "require": {
1486
- "php": ">=5.3.0"
1487
- },
1488
- "time": "2017-02-14T16:28:37+00:00",
1489
- "type": "library",
1490
- "extra": {
1491
- "branch-alias": {
1492
- "dev-master": "1.0.x-dev"
1493
- }
1494
- },
1495
- "installation-source": "dist",
1496
- "autoload": {
1497
- "psr-4": {
1498
- "Psr\\Container\\": "src/"
1499
- }
1500
- },
1501
- "notification-url": "https://packagist.org/downloads/",
1502
- "license": [
1503
- "MIT"
1504
- ],
1505
- "authors": [
1506
- {
1507
- "name": "PHP-FIG",
1508
- "homepage": "http://www.php-fig.org/"
1509
- }
1510
- ],
1511
- "description": "Common Container Interface (PHP FIG PSR-11)",
1512
- "homepage": "https://github.com/php-fig/container",
1513
- "keywords": [
1514
- "PSR-11",
1515
- "container",
1516
- "container-interface",
1517
- "container-interop",
1518
- "psr"
1519
- ]
1520
- },
1521
- {
1522
- "name": "psr/log",
1523
- "version": "1.1.2",
1524
- "version_normalized": "1.1.2.0",
1525
- "source": {
1526
- "type": "git",
1527
- "url": "https://github.com/php-fig/log.git",
1528
- "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
1529
- },
1530
- "dist": {
1531
- "type": "zip",
1532
- "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
1533
- "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
1534
- "shasum": ""
1535
- },
1536
- "require": {
1537
- "php": ">=5.3.0"
1538
- },
1539
- "time": "2019-11-01T11:05:21+00:00",
1540
- "type": "library",
1541
- "extra": {
1542
- "branch-alias": {
1543
- "dev-master": "1.1.x-dev"
1544
- }
1545
- },
1546
- "installation-source": "dist",
1547
- "autoload": {
1548
- "psr-4": {
1549
- "Psr\\Log\\": "Psr/Log/"
1550
- }
1551
- },
1552
- "notification-url": "https://packagist.org/downloads/",
1553
- "license": [
1554
- "MIT"
1555
- ],
1556
- "authors": [
1557
- {
1558
- "name": "PHP-FIG",
1559
- "homepage": "http://www.php-fig.org/"
1560
- }
1561
- ],
1562
- "description": "Common interface for logging libraries",
1563
- "homepage": "https://github.com/php-fig/log",
1564
- "keywords": [
1565
- "log",
1566
- "psr",
1567
- "psr-3"
1568
- ]
1569
- },
1570
- {
1571
- "name": "rebelcode/composer-cleanup-plugin",
1572
- "version": "dev-master",
1573
- "version_normalized": "9999999-dev",
1574
- "source": {
1575
- "type": "git",
1576
- "url": "https://github.com/RebelCode/composer-cleanup-plugin.git",
1577
- "reference": "d035eb045eeb88b5029c2974e14e328f250ff25a"
1578
- },
1579
- "dist": {
1580
- "type": "zip",
1581
- "url": "https://api.github.com/repos/RebelCode/composer-cleanup-plugin/zipball/d035eb045eeb88b5029c2974e14e328f250ff25a",
1582
- "reference": "d035eb045eeb88b5029c2974e14e328f250ff25a",
1583
- "shasum": ""
1584
- },
1585
- "require": {
1586
- "composer-plugin-api": "^1.0"
1587
- },
1588
- "time": "2019-05-29T12:49:11+00:00",
1589
- "type": "composer-plugin",
1590
- "extra": {
1591
- "branch-alias": {
1592
- "dev-master": "0.1-dev"
1593
  },
1594
- "class": "RebelCode\\Composer\\CleanupPlugin"
1595
- },
1596
- "installation-source": "dist",
1597
- "autoload": {
1598
- "psr-4": {
1599
- "RebelCode\\Composer\\": "src/"
1600
- }
1601
- },
1602
- "notification-url": "https://packagist.org/downloads/",
1603
- "license": [
1604
- "MIT"
1605
- ],
1606
- "authors": [
1607
- {
1608
- "name": "Barry vd. Heuvel",
1609
- "email": "barryvdh@gmail.com"
1610
- },
1611
- {
1612
- "name": "RebelCode",
1613
- "email": "dev@rebelcode.com"
1614
- }
1615
- ],
1616
- "description": "A composer cleanup plugin, to remove tests and documentation to save space"
1617
- },
1618
- {
1619
- "name": "symfony/polyfill-ctype",
1620
- "version": "v1.13.1",
1621
- "version_normalized": "1.13.1.0",
1622
- "source": {
1623
- "type": "git",
1624
- "url": "https://github.com/symfony/polyfill-ctype.git",
1625
- "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3"
1626
- },
1627
- "dist": {
1628
- "type": "zip",
1629
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
1630
- "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
1631
- "shasum": ""
1632
- },
1633
- "require": {
1634
- "php": ">=5.3.3"
1635
- },
1636
- "suggest": {
1637
- "ext-ctype": "For best performance"
1638
- },
1639
- "time": "2019-11-27T13:56:44+00:00",
1640
- "type": "library",
1641
- "extra": {
1642
- "branch-alias": {
1643
- "dev-master": "1.13-dev"
1644
- }
1645
- },
1646
- "installation-source": "dist",
1647
- "autoload": {
1648
- "psr-4": {
1649
- "Symfony\\Polyfill\\Ctype\\": ""
1650
- },
1651
- "files": [
1652
- "bootstrap.php"
1653
- ]
1654
- },
1655
- "notification-url": "https://packagist.org/downloads/",
1656
- "license": [
1657
- "MIT"
1658
- ],
1659
- "authors": [
1660
- {
1661
- "name": "Gert de Pagter",
1662
- "email": "BackEndTea@gmail.com"
1663
- },
1664
- {
1665
- "name": "Symfony Community",
1666
- "homepage": "https://symfony.com/contributors"
1667
- }
1668
- ],
1669
- "description": "Symfony polyfill for ctype functions",
1670
- "homepage": "https://symfony.com",
1671
- "keywords": [
1672
- "compatibility",
1673
- "ctype",
1674
- "polyfill",
1675
- "portable"
1676
- ]
1677
- },
1678
- {
1679
- "name": "symfony/polyfill-mbstring",
1680
- "version": "v1.17.1",
1681
- "version_normalized": "1.17.1.0",
1682
- "source": {
1683
- "type": "git",
1684
- "url": "https://github.com/symfony/polyfill-mbstring.git",
1685
- "reference": "7110338d81ce1cbc3e273136e4574663627037a7"
1686
- },
1687
- "dist": {
1688
- "type": "zip",
1689
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7",
1690
- "reference": "7110338d81ce1cbc3e273136e4574663627037a7",
1691
- "shasum": ""
1692
- },
1693
- "require": {
1694
- "php": ">=5.3.3"
1695
- },
1696
- "suggest": {
1697
- "ext-mbstring": "For best performance"
1698
- },
1699
- "time": "2020-06-06T08:46:27+00:00",
1700
- "type": "library",
1701
- "extra": {
1702
- "branch-alias": {
1703
- "dev-master": "1.17-dev"
1704
- },
1705
- "thanks": {
1706
- "name": "symfony/polyfill",
1707
- "url": "https://github.com/symfony/polyfill"
1708
- }
1709
- },
1710
- "installation-source": "dist",
1711
- "autoload": {
1712
- "psr-4": {
1713
- "Symfony\\Polyfill\\Mbstring\\": ""
1714
- },
1715
- "files": [
1716
- "bootstrap.php"
1717
- ]
1718
- },
1719
- "notification-url": "https://packagist.org/downloads/",
1720
- "license": [
1721
- "MIT"
1722
- ],
1723
- "authors": [
1724
- {
1725
- "name": "Nicolas Grekas",
1726
- "email": "p@tchwork.com"
1727
- },
1728
- {
1729
- "name": "Symfony Community",
1730
- "homepage": "https://symfony.com/contributors"
1731
- }
1732
- ],
1733
- "description": "Symfony polyfill for the Mbstring extension",
1734
- "homepage": "https://symfony.com",
1735
- "keywords": [
1736
- "compatibility",
1737
- "mbstring",
1738
- "polyfill",
1739
- "portable",
1740
- "shim"
1741
- ],
1742
- "funding": [
1743
- {
1744
- "url": "https://symfony.com/sponsor",
1745
- "type": "custom"
1746
- },
1747
- {
1748
- "url": "https://github.com/fabpot",
1749
- "type": "github"
1750
- },
1751
- {
1752
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1753
- "type": "tidelift"
1754
- }
1755
- ]
1756
- },
1757
- {
1758
- "name": "symfony/translation",
1759
- "version": "v2.8.52",
1760
- "version_normalized": "2.8.52.0",
1761
- "source": {
1762
- "type": "git",
1763
- "url": "https://github.com/symfony/translation.git",
1764
- "reference": "fc58c2a19e56c29f5ba2736ec40d0119a0de2089"
1765
- },
1766
- "dist": {
1767
- "type": "zip",
1768
- "url": "https://api.github.com/repos/symfony/translation/zipball/fc58c2a19e56c29f5ba2736ec40d0119a0de2089",
1769
- "reference": "fc58c2a19e56c29f5ba2736ec40d0119a0de2089",
1770
- "shasum": ""
1771
- },
1772
- "require": {
1773
- "php": ">=5.3.9",
1774
- "symfony/polyfill-mbstring": "~1.0"
1775
- },
1776
- "conflict": {
1777
- "symfony/config": "<2.7"
1778
- },
1779
- "require-dev": {
1780
- "psr/log": "~1.0",
1781
- "symfony/config": "~2.8",
1782
- "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
1783
- "symfony/yaml": "~2.2|~3.0.0"
1784
- },
1785
- "suggest": {
1786
- "psr/log-implementation": "To use logging capability in translator",
1787
- "symfony/config": "",
1788
- "symfony/yaml": ""
1789
- },
1790
- "time": "2018-11-24T21:16:41+00:00",
1791
- "type": "library",
1792
- "extra": {
1793
- "branch-alias": {
1794
- "dev-master": "2.8-dev"
1795
- }
1796
- },
1797
- "installation-source": "dist",
1798
- "autoload": {
1799
- "psr-4": {
1800
- "Symfony\\Component\\Translation\\": ""
1801
- },
1802
- "exclude-from-classmap": [
1803
- "/Tests/"
1804
- ]
1805
- },
1806
- "notification-url": "https://packagist.org/downloads/",
1807
- "license": [
1808
- "MIT"
1809
- ],
1810
- "authors": [
1811
- {
1812
- "name": "Fabien Potencier",
1813
- "email": "fabien@symfony.com"
1814
- },
1815
- {
1816
- "name": "Symfony Community",
1817
- "homepage": "https://symfony.com/contributors"
1818
- }
1819
- ],
1820
- "description": "Symfony Translation Component",
1821
- "homepage": "https://symfony.com"
1822
- },
1823
- {
1824
- "name": "twig/extensions",
1825
- "version": "v1.5.4",
1826
- "version_normalized": "1.5.4.0",
1827
- "source": {
1828
- "type": "git",
1829
- "url": "https://github.com/twigphp/Twig-extensions.git",
1830
- "reference": "57873c8b0c1be51caa47df2cdb824490beb16202"
1831
- },
1832
- "dist": {
1833
- "type": "zip",
1834
- "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202",
1835
- "reference": "57873c8b0c1be51caa47df2cdb824490beb16202",
1836
- "shasum": ""
1837
- },
1838
- "require": {
1839
- "twig/twig": "^1.27|^2.0"
1840
- },
1841
- "require-dev": {
1842
- "symfony/phpunit-bridge": "^3.4",
1843
- "symfony/translation": "^2.7|^3.4"
1844
- },
1845
- "suggest": {
1846
- "symfony/translation": "Allow the time_diff output to be translated"
1847
- },
1848
- "time": "2018-12-05T18:34:18+00:00",
1849
- "type": "library",
1850
- "extra": {
1851
- "branch-alias": {
1852
- "dev-master": "1.5-dev"
1853
- }
1854
- },
1855
- "installation-source": "dist",
1856
- "autoload": {
1857
- "psr-0": {
1858
- "Twig_Extensions_": "lib/"
1859
- },
1860
- "psr-4": {
1861
- "Twig\\Extensions\\": "src/"
1862
- }
1863
- },
1864
- "notification-url": "https://packagist.org/downloads/",
1865
- "license": [
1866
- "MIT"
1867
- ],
1868
- "authors": [
1869
- {
1870
- "name": "Fabien Potencier",
1871
- "email": "fabien@symfony.com"
1872
- }
1873
- ],
1874
- "description": "Common additional features for Twig that do not directly belong in core",
1875
- "keywords": [
1876
- "i18n",
1877
- "text"
1878
- ]
1879
- },
1880
- {
1881
- "name": "twig/twig",
1882
- "version": "v1.41.0",
1883
- "version_normalized": "1.41.0.0",
1884
- "source": {
1885
- "type": "git",
1886
- "url": "https://github.com/twigphp/Twig.git",
1887
- "reference": "575cd5028362da591facde1ef5d7b94553c375c9"
1888
- },
1889
- "dist": {
1890
- "type": "zip",
1891
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/575cd5028362da591facde1ef5d7b94553c375c9",
1892
- "reference": "575cd5028362da591facde1ef5d7b94553c375c9",
1893
- "shasum": ""
1894
- },
1895
- "require": {
1896
- "php": ">=5.4.0",
1897
- "symfony/polyfill-ctype": "^1.8"
1898
- },
1899
- "require-dev": {
1900
- "psr/container": "^1.0",
1901
- "symfony/debug": "^2.7",
1902
- "symfony/phpunit-bridge": "^3.4.19|^4.1.8"
1903
- },
1904
- "time": "2019-05-14T11:59:08+00:00",
1905
- "type": "library",
1906
- "extra": {
1907
- "branch-alias": {
1908
- "dev-master": "1.41-dev"
1909
- }
1910
- },
1911
- "installation-source": "dist",
1912
- "autoload": {
1913
- "psr-0": {
1914
- "Twig_": "lib/"
1915
- },
1916
- "psr-4": {
1917
- "Twig\\": "src/"
1918
- }
1919
- },
1920
- "notification-url": "https://packagist.org/downloads/",
1921
- "license": [
1922
- "BSD-3-Clause"
1923
- ],
1924
- "authors": [
1925
- {
1926
- "name": "Fabien Potencier",
1927
- "email": "fabien@symfony.com",
1928
- "homepage": "http://fabien.potencier.org",
1929
- "role": "Lead Developer"
1930
- },
1931
- {
1932
- "name": "Armin Ronacher",
1933
- "email": "armin.ronacher@active-4.com",
1934
- "role": "Project Founder"
1935
- },
1936
- {
1937
- "name": "Twig Team",
1938
- "homepage": "https://twig.symfony.com/contributors",
1939
- "role": "Contributors"
1940
- }
1941
- ],
1942
- "description": "Twig, the flexible, fast, and secure template language for PHP",
1943
- "homepage": "https://twig.symfony.com",
1944
- "keywords": [
1945
- "templating"
1946
- ]
1947
- }
1948
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "packages": [
3
+ {
4
+ "name": "container-interop/container-interop",
5
+ "version": "1.2.0",
6
+ "version_normalized": "1.2.0.0",
7
+ "source": {
8
+ "type": "git",
9
+ "url": "https://github.com/container-interop/container-interop.git",
10
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  },
12
+ "dist": {
13
+ "type": "zip",
14
+ "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
15
+ "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
16
+ "shasum": ""
17
+ },
18
+ "require": {
19
+ "psr/container": "^1.0"
20
+ },
21
+ "time": "2017-02-14T19:40:03+00:00",
22
+ "type": "library",
23
+ "installation-source": "dist",
24
+ "autoload": {
25
+ "psr-4": {
26
+ "Interop\\Container\\": "src/Interop/Container/"
27
+ }
28
+ },
29
+ "notification-url": "https://packagist.org/downloads/",
30
+ "license": [
31
+ "MIT"
32
+ ],
33
+ "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
34
+ "homepage": "https://github.com/container-interop/container-interop",
35
+ "abandoned": "psr/container",
36
+ "install-path": "../container-interop/container-interop"
37
+ },
38
+ {
39
+ "name": "container-interop/service-provider",
40
+ "version": "v0.3.0",
41
+ "version_normalized": "0.3.0.0",
42
+ "source": {
43
+ "type": "git",
44
+ "url": "https://github.com/container-interop/service-provider.git",
45
+ "reference": "5cb38893b836edb00d3e1ace26c20ee1d29957cf"
46
+ },
47
+ "dist": {
48
+ "type": "zip",
49
+ "url": "https://api.github.com/repos/container-interop/service-provider/zipball/5cb38893b836edb00d3e1ace26c20ee1d29957cf",
50
+ "reference": "5cb38893b836edb00d3e1ace26c20ee1d29957cf",
51
+ "shasum": ""
52
+ },
53
+ "require": {
54
+ "container-interop/container-interop": "^1.1"
55
+ },
56
+ "time": "2016-05-16T07:42:22+00:00",
57
+ "type": "library",
58
+ "installation-source": "dist",
59
+ "autoload": {
60
+ "psr-4": {
61
+ "Interop\\Container\\": "src/"
62
+ }
63
+ },
64
+ "notification-url": "https://packagist.org/downloads/",
65
+ "license": [
66
+ "MIT"
67
+ ],
68
+ "description": "Promoting container interoperability through standard service providers",
69
+ "homepage": "https://github.com/container-interop/service-provider",
70
+ "install-path": "../container-interop/service-provider"
71
+ },
72
+ {
73
+ "name": "dhii/collections-abstract",
74
+ "version": "v0.1.0",
75
+ "version_normalized": "0.1.0.0",
76
+ "source": {
77
+ "type": "git",
78
+ "url": "https://github.com/Dhii/collections-abstract.git",
79
+ "reference": "7c9141202af4d83b31e75efcbf481fa1cb588ad8"
80
+ },
81
+ "dist": {
82
+ "type": "zip",
83
+ "url": "https://api.github.com/repos/Dhii/collections-abstract/zipball/7c9141202af4d83b31e75efcbf481fa1cb588ad8",
84
+ "reference": "7c9141202af4d83b31e75efcbf481fa1cb588ad8",
85
+ "shasum": ""
86
+ },
87
+ "require": {
88
+ "dhii/collections-abstract-base": "^0.1.0",
89
+ "dhii/collections-interface": "^0.1.1",
90
+ "dhii/stats-abstract": "^0.1.0"
91
+ },
92
+ "require-dev": {
93
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
94
+ "phpunit/phpunit": "4.*",
95
+ "ptrofimov/xpmock": "^1.1"
96
+ },
97
+ "time": "2016-11-10T19:29:24+00:00",
98
+ "type": "library",
99
+ "installation-source": "dist",
100
+ "autoload": {
101
+ "psr-4": {
102
+ "Dhii\\Collection\\": "src/"
103
+ }
104
+ },
105
+ "notification-url": "https://packagist.org/downloads/",
106
+ "license": [
107
+ "MIT"
108
+ ],
109
+ "authors": [
110
+ {
111
+ "name": "Dhii Team",
112
+ "email": "development@dhii.co"
113
+ }
114
+ ],
115
+ "description": "A collections library",
116
+ "install-path": "../dhii/collections-abstract"
117
+ },
118
+ {
119
+ "name": "dhii/collections-abstract-base",
120
+ "version": "v0.1.0",
121
+ "version_normalized": "0.1.0.0",
122
+ "source": {
123
+ "type": "git",
124
+ "url": "https://github.com/Dhii/collections-abstract-base.git",
125
+ "reference": "0ec0147451a72a13fb327ac6ff747c5e953c56f3"
126
+ },
127
+ "dist": {
128
+ "type": "zip",
129
+ "url": "https://api.github.com/repos/Dhii/collections-abstract-base/zipball/0ec0147451a72a13fb327ac6ff747c5e953c56f3",
130
+ "reference": "0ec0147451a72a13fb327ac6ff747c5e953c56f3",
131
+ "shasum": ""
132
+ },
133
+ "require": {
134
+ "dhii/collections-interface": "^0.1.1"
135
+ },
136
+ "require-dev": {
137
+ "codeclimate/php-test-reporter": "dev-master",
138
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
139
+ "phpunit/phpunit": "^4.8",
140
+ "ptrofimov/xpmock": "^1.1"
141
+ },
142
+ "time": "2016-11-10T15:09:37+00:00",
143
+ "type": "library",
144
+ "installation-source": "dist",
145
+ "autoload": {
146
+ "psr-4": {
147
+ "Dhii\\Collection\\": "src/"
148
+ }
149
+ },
150
+ "notification-url": "https://packagist.org/downloads/",
151
+ "license": [
152
+ "MIT"
153
+ ],
154
+ "authors": [
155
+ {
156
+ "name": "Dhii Team",
157
+ "email": "development@dhii.co"
158
+ }
159
+ ],
160
+ "description": "Collection base classes that do not depend on other non-collection packages, on which there is a dependency of other collection packages that depend on this package. This is done to avoid circular reference in the collection toolchain",
161
+ "abandoned": "dhii/collections",
162
+ "install-path": "../dhii/collections-abstract-base"
163
+ },
164
+ {
165
+ "name": "dhii/collections-interface",
166
+ "version": "v0.1.2",
167
+ "version_normalized": "0.1.2.0",
168
+ "source": {
169
+ "type": "git",
170
+ "url": "https://github.com/Dhii/collections-interface.git",
171
+ "reference": "a8e9a30366a30d77bc270042a67150b3f8f6d94d"
172
+ },
173
+ "dist": {
174
+ "type": "zip",
175
+ "url": "https://api.github.com/repos/Dhii/collections-interface/zipball/a8e9a30366a30d77bc270042a67150b3f8f6d94d",
176
+ "reference": "a8e9a30366a30d77bc270042a67150b3f8f6d94d",
177
+ "shasum": ""
178
+ },
179
+ "require": {
180
+ "php": "^5.3 | ^7.0"
181
+ },
182
+ "require-dev": {
183
+ "codeclimate/php-test-reporter": "dev-master",
184
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
185
+ "phpunit/phpunit": "^4.8"
186
+ },
187
+ "time": "2016-11-16T14:45:08+00:00",
188
+ "type": "library",
189
+ "installation-source": "dist",
190
+ "autoload": {
191
+ "psr-4": {
192
+ "Dhii\\Collection\\": "src/"
193
+ }
194
+ },
195
+ "notification-url": "https://packagist.org/downloads/",
196
+ "license": [
197
+ "MIT"
198
+ ],
199
+ "authors": [
200
+ {
201
+ "name": "Dhii Team",
202
+ "email": "development@dhii.co"
203
+ }
204
+ ],
205
+ "description": "Interfaces for collections",
206
+ "install-path": "../dhii/collections-interface"
207
+ },
208
+ {
209
+ "name": "dhii/container-helper-base",
210
+ "version": "v0.1-alpha8",
211
+ "version_normalized": "0.1.0.0-alpha8",
212
+ "source": {
213
+ "type": "git",
214
+ "url": "https://github.com/Dhii/container-helper-base.git",
215
+ "reference": "1b8206842e06b71abcff769aaddfc51bf8f317cd"
216
+ },
217
+ "dist": {
218
+ "type": "zip",
219
+ "url": "https://api.github.com/repos/Dhii/container-helper-base/zipball/1b8206842e06b71abcff769aaddfc51bf8f317cd",
220
+ "reference": "1b8206842e06b71abcff769aaddfc51bf8f317cd",
221
+ "shasum": ""
222
+ },
223
+ "require": {
224
+ "php": "^5.4 | ^7.0"
225
+ },
226
+ "require-dev": {
227
+ "codeclimate/php-test-reporter": "<=0.3.2",
228
+ "dhii/php-cs-fixer-config": "^0.1",
229
+ "dhii/stringable-interface": "^0.1",
230
+ "phpunit/phpunit": "^4.8",
231
+ "psr/container": "^1.0",
232
+ "ptrofimov/xpmock": "^1.1"
233
+ },
234
+ "time": "2018-07-30T09:59:15+00:00",
235
+ "type": "library",
236
+ "extra": {
237
+ "branch-alias": {
238
+ "dev-develop": "0.1.x-dev"
239
+ }
240
+ },
241
+ "installation-source": "dist",
242
+ "autoload": {
243
+ "psr-4": {
244
+ "Dhii\\Data\\Container\\": "src"
245
+ }
246
+ },
247
+ "notification-url": "https://packagist.org/downloads/",
248
+ "license": [
249
+ "MIT"
250
+ ],
251
+ "authors": [
252
+ {
253
+ "name": "Dhii Team",
254
+ "email": "development@dhii.co"
255
+ }
256
+ ],
257
+ "description": "Helper functionality for working with container.",
258
+ "install-path": "../dhii/container-helper-base"
259
+ },
260
+ {
261
+ "name": "dhii/di",
262
+ "version": "v0.1.1",
263
+ "version_normalized": "0.1.1.0",
264
+ "source": {
265
+ "type": "git",
266
+ "url": "https://github.com/Dhii/di.git",
267
+ "reference": "52efd50f1b11fcdd2f789bae483bdb858772c306"
268
+ },
269
+ "dist": {
270
+ "type": "zip",
271
+ "url": "https://api.github.com/repos/Dhii/di/zipball/52efd50f1b11fcdd2f789bae483bdb858772c306",
272
+ "reference": "52efd50f1b11fcdd2f789bae483bdb858772c306",
273
+ "shasum": ""
274
+ },
275
+ "require": {
276
+ "container-interop/container-interop": "^1.1",
277
+ "container-interop/service-provider": "^0.3",
278
+ "dhii/di-abstract": "^0.1",
279
+ "dhii/di-interface": "^0.1",
280
+ "php": "^5.3 | ^7.0"
281
+ },
282
+ "provide": {
283
+ "container-interop/container-interop-implementation": "^1.0"
284
+ },
285
+ "require-dev": {
286
+ "codeclimate/php-test-reporter": "<=0.3.2",
287
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
288
+ "phpunit/phpunit": "^4.8",
289
+ "ptrofimov/xpmock": "^1.1"
290
+ },
291
+ "time": "2017-02-03T13:33:48+00:00",
292
+ "type": "library",
293
+ "installation-source": "dist",
294
+ "autoload": {
295
+ "psr-4": {
296
+ "Dhii\\Di\\": "src/"
297
+ }
298
+ },
299
+ "notification-url": "https://packagist.org/downloads/",
300
+ "license": [
301
+ "MIT"
302
+ ],
303
+ "authors": [
304
+ {
305
+ "name": "Dhii Team",
306
+ "email": "development@dhii.co"
307
+ }
308
+ ],
309
+ "description": "A DI container implementation",
310
+ "keywords": [
311
+ "container",
312
+ "dependency injection",
313
+ "di"
314
+ ],
315
+ "abandoned": "dhii/containers",
316
+ "install-path": "../dhii/di"
317
+ },
318
+ {
319
+ "name": "dhii/di-abstract",
320
+ "version": "v0.1",
321
+ "version_normalized": "0.1.0.0",
322
+ "source": {
323
+ "type": "git",
324
+ "url": "https://github.com/Dhii/di-abstract.git",
325
+ "reference": "e87ee3782d5f4c44724e79c4b2e1a55103e5cd11"
326
+ },
327
+ "dist": {
328
+ "type": "zip",
329
+ "url": "https://api.github.com/repos/Dhii/di-abstract/zipball/e87ee3782d5f4c44724e79c4b2e1a55103e5cd11",
330
+ "reference": "e87ee3782d5f4c44724e79c4b2e1a55103e5cd11",
331
+ "shasum": ""
332
+ },
333
+ "require": {
334
+ "container-interop/container-interop": "^1.1",
335
+ "container-interop/service-provider": "^0.3",
336
+ "dhii/di-interface": "^0.1",
337
+ "php": "^5.3 | ^7.0"
338
+ },
339
+ "require-dev": {
340
+ "codeclimate/php-test-reporter": "<=0.3.2",
341
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
342
+ "phpunit/phpunit": "^4.8",
343
+ "ptrofimov/xpmock": "^1.1"
344
+ },
345
+ "time": "2017-02-02T18:30:06+00:00",
346
+ "type": "library",
347
+ "installation-source": "dist",
348
+ "autoload": {
349
+ "psr-4": {
350
+ "Dhii\\Di\\": "src/"
351
+ }
352
+ },
353
+ "notification-url": "https://packagist.org/downloads/",
354
+ "license": [
355
+ "MIT"
356
+ ],
357
+ "authors": [
358
+ {
359
+ "name": "Dhii Team",
360
+ "email": "development@dhii.co"
361
+ }
362
+ ],
363
+ "description": "Base abstract classes for DI container implementations",
364
+ "install-path": "../dhii/di-abstract"
365
+ },
366
+ {
367
+ "name": "dhii/di-interface",
368
+ "version": "v0.1",
369
+ "version_normalized": "0.1.0.0",
370
+ "source": {
371
+ "type": "git",
372
+ "url": "https://github.com/Dhii/di-interface.git",
373
+ "reference": "0320846a577d68b761e29acd5d4db40d88cc4f98"
374
+ },
375
+ "dist": {
376
+ "type": "zip",
377
+ "url": "https://api.github.com/repos/Dhii/di-interface/zipball/0320846a577d68b761e29acd5d4db40d88cc4f98",
378
+ "reference": "0320846a577d68b761e29acd5d4db40d88cc4f98",
379
+ "shasum": ""
380
+ },
381
+ "require": {
382
+ "container-interop/container-interop": "^1.1",
383
+ "container-interop/service-provider": "^0.3",
384
+ "php": "^5.3 | ^7.0"
385
+ },
386
+ "require-dev": {
387
+ "codeclimate/php-test-reporter": "<=0.3.2",
388
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
389
+ "phpunit/phpunit": "^4.8",
390
+ "ptrofimov/xpmock": "^1.1"
391
+ },
392
+ "time": "2017-02-02T13:12:09+00:00",
393
+ "type": "library",
394
+ "installation-source": "dist",
395
+ "autoload": {
396
+ "psr-4": {
397
+ "Dhii\\Di\\": "src/"
398
+ }
399
+ },
400
+ "notification-url": "https://packagist.org/downloads/",
401
+ "license": [
402
+ "MIT"
403
+ ],
404
+ "authors": [
405
+ {
406
+ "name": "Dhii Team",
407
+ "email": "development@dhii.co"
408
+ }
409
+ ],
410
+ "description": "Interfaces for DI container implementations",
411
+ "install-path": "../dhii/di-interface"
412
+ },
413
+ {
414
+ "name": "dhii/exception",
415
+ "version": "v0.1-alpha5",
416
+ "version_normalized": "0.1.0.0-alpha5",
417
+ "source": {
418
+ "type": "git",
419
+ "url": "https://github.com/Dhii/exception.git",
420
+ "reference": "f7afb934c970a4e167b2c7ba24fa3df50714e0fe"
421
+ },
422
+ "dist": {
423
+ "type": "zip",
424
+ "url": "https://api.github.com/repos/Dhii/exception/zipball/f7afb934c970a4e167b2c7ba24fa3df50714e0fe",
425
+ "reference": "f7afb934c970a4e167b2c7ba24fa3df50714e0fe",
426
+ "shasum": ""
427
+ },
428
+ "require": {
429
+ "dhii/exception-interface": "^0.2",
430
+ "dhii/i18n-helper-base": "^0.1",
431
+ "dhii/normalization-helper-base": "^0.1",
432
+ "php": "^5.4 | ^7.0"
433
+ },
434
+ "replace": {
435
+ "dhii/exception-helper-base": "0.1-alpha1|0.1-alpha2"
436
+ },
437
+ "require-dev": {
438
+ "codeclimate/php-test-reporter": "<=0.3.2",
439
+ "dhii/php-cs-fixer-config": "^0.1",
440
+ "dhii/stringable-interface": "^0.1",
441
+ "phpunit/phpunit": "^4.8",
442
+ "ptrofimov/xpmock": "^1.1"
443
+ },
444
+ "time": "2018-04-02T15:18:58+00:00",
445
+ "type": "library",
446
+ "extra": {
447
+ "branch-alias": {
448
+ "dev-develop": "0.1.x-dev"
449
+ }
450
+ },
451
+ "installation-source": "dist",
452
+ "autoload": {
453
+ "psr-4": {
454
+ "Dhii\\Exception\\": "src"
455
+ }
456
+ },
457
+ "notification-url": "https://packagist.org/downloads/",
458
+ "license": [
459
+ "MIT"
460
+ ],
461
+ "authors": [
462
+ {
463
+ "name": "Dhii Team",
464
+ "email": "development@dhii.co"
465
+ }
466
+ ],
467
+ "description": "Standards-compliant exception classes",
468
+ "install-path": "../dhii/exception"
469
+ },
470
+ {
471
+ "name": "dhii/exception-interface",
472
+ "version": "v0.2",
473
+ "version_normalized": "0.2.0.0",
474
+ "source": {
475
+ "type": "git",
476
+ "url": "https://github.com/Dhii/exception-interface.git",
477
+ "reference": "b69feebf7cb2879cd43977a03342e2393b73f7fb"
478
+ },
479
+ "dist": {
480
+ "type": "zip",
481
+ "url": "https://api.github.com/repos/Dhii/exception-interface/zipball/b69feebf7cb2879cd43977a03342e2393b73f7fb",
482
+ "reference": "b69feebf7cb2879cd43977a03342e2393b73f7fb",
483
+ "shasum": ""
484
+ },
485
+ "require": {
486
+ "dhii/stringable-interface": "^0.1",
487
+ "php": "^5.3 | ^7.0"
488
+ },
489
+ "require-dev": {
490
+ "codeclimate/php-test-reporter": "<=0.3.2",
491
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
492
+ "phpunit/phpunit": "^4.8",
493
+ "ptrofimov/xpmock": "^1.1"
494
+ },
495
+ "time": "2018-08-29T10:42:04+00:00",
496
+ "type": "library",
497
+ "extra": {
498
+ "branch-alias": {
499
+ "dev-develop": "0.2.x-dev"
500
+ }
501
+ },
502
+ "installation-source": "dist",
503
+ "autoload": {
504
+ "psr-4": {
505
+ "Dhii\\Exception\\": "src"
506
+ }
507
+ },
508
+ "notification-url": "https://packagist.org/downloads/",
509
+ "license": [
510
+ "MIT"
511
+ ],
512
+ "authors": [
513
+ {
514
+ "name": "Dhii Team",
515
+ "email": "development@dhii.co"
516
+ }
517
+ ],
518
+ "description": "Interfaces for most common exceptions",
519
+ "install-path": "../dhii/exception-interface"
520
+ },
521
+ {
522
+ "name": "dhii/factory-interface",
523
+ "version": "v0.1",
524
+ "version_normalized": "0.1.0.0",
525
+ "source": {
526
+ "type": "git",
527
+ "url": "https://github.com/Dhii/factory-interface.git",
528
+ "reference": "b8d217aec8838e64ccaa770cb03dc164bf6f0515"
529
+ },
530
+ "dist": {
531
+ "type": "zip",
532
+ "url": "https://api.github.com/repos/Dhii/factory-interface/zipball/b8d217aec8838e64ccaa770cb03dc164bf6f0515",
533
+ "reference": "b8d217aec8838e64ccaa770cb03dc164bf6f0515",
534
+ "shasum": ""
535
+ },
536
+ "require": {
537
+ "dhii/exception-interface": "^0.1|^0.2",
538
+ "php": "^5.3 | ^7.0"
539
+ },
540
+ "require-dev": {
541
+ "codeclimate/php-test-reporter": "<=0.3.2",
542
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
543
+ "dhii/stringable-interface": "^0.1",
544
+ "phpunit/phpunit": "^4.8",
545
+ "psr/container": "^1.0",
546
+ "ptrofimov/xpmock": "^1.1"
547
+ },
548
+ "time": "2018-08-29T11:15:09+00:00",
549
+ "type": "library",
550
+ "extra": {
551
+ "branch-alias": {
552
+ "dev-develop": "0.1.x-dev"
553
+ }
554
+ },
555
+ "installation-source": "dist",
556
+ "autoload": {
557
+ "psr-4": {
558
+ "Dhii\\Factory\\": "src"
559
+ }
560
+ },
561
+ "notification-url": "https://packagist.org/downloads/",
562
+ "license": [
563
+ "MIT"
564
+ ],
565
+ "authors": [
566
+ {
567
+ "name": "Dhii Team",
568
+ "email": "development@dhii.co"
569
+ }
570
+ ],
571
+ "description": "Interfaces for working with factories.",
572
+ "install-path": "../dhii/factory-interface"
573
+ },
574
+ {
575
+ "name": "dhii/i18n-helper-base",
576
+ "version": "v0.1-alpha1",
577
+ "version_normalized": "0.1.0.0-alpha1",
578
+ "source": {
579
+ "type": "git",
580
+ "url": "https://github.com/Dhii/i18n-helper-base.git",
581
+ "reference": "fc4c881f3e528ea918588831ebeffb92738f8dd5"
582
+ },
583
+ "dist": {
584
+ "type": "zip",
585
+ "url": "https://api.github.com/repos/Dhii/i18n-helper-base/zipball/fc4c881f3e528ea918588831ebeffb92738f8dd5",
586
+ "reference": "fc4c881f3e528ea918588831ebeffb92738f8dd5",
587
+ "shasum": ""
588
+ },
589
+ "require": {
590
+ "dhii/i18n-interface": "^0.1|^0.2",
591
+ "php": "^5.4 | ^7.0"
592
+ },
593
+ "require-dev": {
594
+ "codeclimate/php-test-reporter": "<=0.3.2",
595
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
596
+ "phpunit/phpunit": "^4.8",
597
+ "ptrofimov/xpmock": "^1.1"
598
+ },
599
+ "time": "2018-03-07T22:38:07+00:00",
600
+ "type": "library",
601
+ "extra": {
602
+ "branch-alias": {
603
+ "dev-develop": "0.1.x-dev"
604
+ }
605
+ },
606
+ "installation-source": "dist",
607
+ "autoload": {
608
+ "psr-4": {
609
+ "Dhii\\I18n\\": "src"
610
+ }
611
+ },
612
+ "notification-url": "https://packagist.org/downloads/",
613
+ "license": [
614
+ "MIT"
615
+ ],
616
+ "authors": [
617
+ {
618
+ "name": "Dhii Team",
619
+ "email": "development@dhii.co"
620
+ }
621
+ ],
622
+ "description": "A base for internationalization consumers",
623
+ "abandoned": true,
624
+ "install-path": "../dhii/i18n-helper-base"
625
+ },
626
+ {
627
+ "name": "dhii/i18n-interface",
628
+ "version": "v0.2",
629
+ "version_normalized": "0.2.0.0",
630
+ "source": {
631
+ "type": "git",
632
+ "url": "https://github.com/Dhii/i18n-interface.git",
633
+ "reference": "7eaf0731ba80eea37a5deea6d894a0326e10be67"
634
+ },
635
+ "dist": {
636
+ "type": "zip",
637
+ "url": "https://api.github.com/repos/Dhii/i18n-interface/zipball/7eaf0731ba80eea37a5deea6d894a0326e10be67",
638
+ "reference": "7eaf0731ba80eea37a5deea6d894a0326e10be67",
639
+ "shasum": ""
640
+ },
641
+ "require": {
642
+ "php": "^5.3 | ^7.0"
643
+ },
644
+ "require-dev": {
645
+ "codeclimate/php-test-reporter": "<=0.3.2",
646
+ "dhii/data-key-value-aware-interface": "^0.1",
647
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
648
+ "dhii/stringable-interface": "^0.1",
649
+ "phpunit/phpunit": "^4.8",
650
+ "ptrofimov/xpmock": "^1.1"
651
+ },
652
+ "time": "2017-03-15T16:01:39+00:00",
653
+ "type": "library",
654
+ "installation-source": "dist",
655
+ "autoload": {
656
+ "psr-4": {
657
+ "Dhii\\I18n\\": "src/"
658
+ }
659
+ },
660
+ "notification-url": "https://packagist.org/downloads/",
661
+ "license": [
662
+ "MIT"
663
+ ],
664
+ "authors": [
665
+ {
666
+ "name": "Dhii Team",
667
+ "email": "development@dhii.co"
668
+ }
669
+ ],
670
+ "description": "Interfaces for internationalization.",
671
+ "install-path": "../dhii/i18n-interface"
672
+ },
673
+ {
674
+ "name": "dhii/iterator-helper-base",
675
+ "version": "v0.1-alpha2",
676
+ "version_normalized": "0.1.0.0-alpha2",
677
+ "source": {
678
+ "type": "git",
679
+ "url": "https://github.com/Dhii/iterator-helper-base.git",
680
+ "reference": "cf62fb9f8b658a82815f15a2d906d8d1ff5c52ce"
681
+ },
682
+ "dist": {
683
+ "type": "zip",
684
+ "url": "https://api.github.com/repos/Dhii/iterator-helper-base/zipball/cf62fb9f8b658a82815f15a2d906d8d1ff5c52ce",
685
+ "reference": "cf62fb9f8b658a82815f15a2d906d8d1ff5c52ce",
686
+ "shasum": ""
687
+ },
688
+ "require": {
689
+ "dhii/exception": "^0.1-alpha4",
690
+ "php": "^5.4 | ^7.0"
691
+ },
692
+ "require-dev": {
693
+ "codeclimate/php-test-reporter": "<=0.3.2",
694
+ "dhii/invocable-interface": "0.1-alpha1",
695
+ "dhii/php-cs-fixer-config": "^0.1",
696
+ "dhii/stringable-interface": "^0.1",
697
+ "phpunit/phpunit": "^4.8",
698
+ "ptrofimov/xpmock": "dev-master"
699
+ },
700
+ "suggest": {
701
+ "dhii/callback-abstract": "For structural invocation of callables"
702
+ },
703
+ "time": "2018-03-22T11:25:07+00:00",
704
+ "type": "library",
705
+ "extra": {
706
+ "branch-alias": {
707
+ "dev-develop": "0.1.x-dev"
708
+ }
709
+ },
710
+ "installation-source": "dist",
711
+ "autoload": {
712
+ "psr-4": {
713
+ "Dhii\\Iterator\\": "src"
714
+ }
715
+ },
716
+ "notification-url": "https://packagist.org/downloads/",
717
+ "license": [
718
+ "MIT"
719
+ ],
720
+ "authors": [
721
+ {
722
+ "name": "Dhii Team",
723
+ "email": "development@dhii.co"
724
+ }
725
+ ],
726
+ "description": "Common functionality for working with iterables",
727
+ "install-path": "../dhii/iterator-helper-base"
728
+ },
729
+ {
730
+ "name": "dhii/normalization-helper-base",
731
+ "version": "v0.1-alpha4",
732
+ "version_normalized": "0.1.0.0-alpha4",
733
+ "source": {
734
+ "type": "git",
735
+ "url": "https://github.com/Dhii/normalization-helper-base.git",
736
+ "reference": "1b64f0ea6b3e32f9478f854f6049500795b51da7"
737
+ },
738
+ "dist": {
739
+ "type": "zip",
740
+ "url": "https://api.github.com/repos/Dhii/normalization-helper-base/zipball/1b64f0ea6b3e32f9478f854f6049500795b51da7",
741
+ "reference": "1b64f0ea6b3e32f9478f854f6049500795b51da7",
742
+ "shasum": ""
743
+ },
744
+ "require": {
745
+ "php": "^5.4 | ^7.0"
746
+ },
747
+ "require-dev": {
748
+ "codeclimate/php-test-reporter": "<=0.3.2",
749
+ "dhii/php-cs-fixer-config": "^0.1",
750
+ "dhii/stringable-interface": "^0.1",
751
+ "phpunit/phpunit": "^4.8",
752
+ "ptrofimov/xpmock": "^1.1"
753
+ },
754
+ "time": "2018-06-04T08:55:31+00:00",
755
+ "type": "library",
756
+ "extra": {
757
+ "branch-alias": {
758
+ "dev-develop": "0.1.x-dev"
759
+ }
760
+ },
761
+ "installation-source": "dist",
762
+ "autoload": {
763
+ "psr-4": {
764
+ "Dhii\\Util\\Normalization\\": "src"
765
+ }
766
+ },
767
+ "notification-url": "https://packagist.org/downloads/",
768
+ "license": [
769
+ "MIT"
770
+ ],
771
+ "authors": [
772
+ {
773
+ "name": "Dhii Team",
774
+ "email": "development@dhii.co"
775
+ }
776
+ ],
777
+ "description": "Functionality for normalizing values.",
778
+ "install-path": "../dhii/normalization-helper-base"
779
+ },
780
+ {
781
+ "name": "dhii/output-renderer-abstract",
782
+ "version": "v0.1-alpha2",
783
+ "version_normalized": "0.1.0.0-alpha2",
784
+ "source": {
785
+ "type": "git",
786
+ "url": "https://github.com/Dhii/output-renderer-abstract.git",
787
+ "reference": "0f6e5eed940025332dd1986d6c771e10f7197b1a"
788
+ },
789
+ "dist": {
790
+ "type": "zip",
791
+ "url": "https://api.github.com/repos/Dhii/output-renderer-abstract/zipball/0f6e5eed940025332dd1986d6c771e10f7197b1a",
792
+ "reference": "0f6e5eed940025332dd1986d6c771e10f7197b1a",
793
+ "shasum": ""
794
+ },
795
+ "require": {
796
+ "dhii/output-renderer-interface": "^0.2 | ^0.3",
797
+ "php": "^5.4 | ^7.0",
798
+ "psr/container": "^1.0"
799
+ },
800
+ "require-dev": {
801
+ "codeclimate/php-test-reporter": "<=0.3.2",
802
+ "dhii/exception-interface": "^0.2-alpha3",
803
+ "dhii/invocable-interface": "^0.1-alpha1",
804
+ "dhii/php-cs-fixer-config": "^0.1",
805
+ "dhii/validation-interface": "^0.1 | ^0.2-alpha1",
806
+ "phpunit/phpunit": "^4.8",
807
+ "ptrofimov/xpmock": "^1.1"
808
+ },
809
+ "suggest": {
810
+ "dhii/container-helper-base": "For normalizing context containers"
811
+ },
812
+ "time": "2018-05-10T12:31:09+00:00",
813
+ "type": "library",
814
+ "extra": {
815
+ "branch-alias": {
816
+ "dev-develop": "0.1.x-dev"
817
+ }
818
+ },
819
+ "installation-source": "dist",
820
+ "autoload": {
821
+ "psr-4": {
822
+ "Dhii\\Output\\": "src"
823
+ }
824
+ },
825
+ "notification-url": "https://packagist.org/downloads/",
826
+ "license": [
827
+ "MIT"
828
+ ],
829
+ "authors": [
830
+ {
831
+ "name": "Dhii Team",
832
+ "email": "development@dhii.co"
833
+ }
834
+ ],
835
+ "description": "Common abstract functionality for output renderers.",
836
+ "abandoned": true,
837
+ "install-path": "../dhii/output-renderer-abstract"
838
+ },
839
+ {
840
+ "name": "dhii/output-renderer-base",
841
+ "version": "v0.1-alpha1",
842
+ "version_normalized": "0.1.0.0-alpha1",
843
+ "source": {
844
+ "type": "git",
845
+ "url": "https://github.com/Dhii/output-renderer-base.git",
846
+ "reference": "700483a37016e502be2ead9580bb9258ad8bf17b"
847
+ },
848
+ "dist": {
849
+ "type": "zip",
850
+ "url": "https://api.github.com/repos/Dhii/output-renderer-base/zipball/700483a37016e502be2ead9580bb9258ad8bf17b",
851
+ "reference": "700483a37016e502be2ead9580bb9258ad8bf17b",
852
+ "shasum": ""
853
+ },
854
+ "require": {
855
+ "dhii/container-helper-base": "^0.1-alpha5",
856
+ "dhii/exception": "^0.1-alpha4",
857
+ "dhii/i18n-helper-base": "^0.1-alpha1",
858
+ "dhii/output-renderer-abstract": "^0.1-alpha1",
859
+ "dhii/output-renderer-interface": "^0.2 | ^0.3-alpha1",
860
+ "php": "^5.4 | ^7.0"
861
+ },
862
+ "require-dev": {
863
+ "codeclimate/php-test-reporter": "<=0.3.2",
864
+ "dhii/php-cs-fixer-config": "^0.1",
865
+ "dhii/stringable-interface": "^0.1",
866
+ "phpunit/phpunit": "^4.8",
867
+ "psr/container": "^1.0",
868
+ "ptrofimov/xpmock": "^1.1"
869
+ },
870
+ "time": "2018-04-05T13:32:07+00:00",
871
+ "type": "library",
872
+ "extra": {
873
+ "branch-alias": {
874
+ "dev-develop": "0.1.x-dev"
875
+ }
876
+ },
877
+ "installation-source": "dist",
878
+ "autoload": {
879
+ "psr-4": {
880
+ "Dhii\\Output\\": "src"
881
+ }
882
+ },
883
+ "notification-url": "https://packagist.org/downloads/",
884
+ "license": [
885
+ "MIT"
886
+ ],
887
+ "authors": [
888
+ {
889
+ "name": "Dhii Team",
890
+ "email": "development@dhii.co"
891
+ }
892
+ ],
893
+ "description": "Base concrete functionality for output rendering.",
894
+ "abandoned": true,
895
+ "install-path": "../dhii/output-renderer-base"
896
+ },
897
+ {
898
+ "name": "dhii/output-renderer-interface",
899
+ "version": "v0.3",
900
+ "version_normalized": "0.3.0.0",
901
+ "source": {
902
+ "type": "git",
903
+ "url": "https://github.com/Dhii/output-renderer-interface.git",
904
+ "reference": "407014d7fd1af0427958f2acd61aff008ee9e032"
905
+ },
906
+ "dist": {
907
+ "type": "zip",
908
+ "url": "https://api.github.com/repos/Dhii/output-renderer-interface/zipball/407014d7fd1af0427958f2acd61aff008ee9e032",
909
+ "reference": "407014d7fd1af0427958f2acd61aff008ee9e032",
910
+ "shasum": ""
911
+ },
912
+ "require": {
913
+ "dhii/exception-interface": "^0.1 | ^0.2",
914
+ "dhii/factory-interface": "^0.1-alpha2",
915
+ "dhii/stringable-interface": "^0.1",
916
+ "php": "^5.3 | ^7.0"
917
+ },
918
+ "require-dev": {
919
+ "codeclimate/php-test-reporter": "dev-master",
920
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
921
+ "phpunit/phpunit": "4.*",
922
+ "psr/container": "^1.0",
923
+ "ptrofimov/xpmock": "^1.1"
924
+ },
925
+ "suggest": {
926
+ "dhii/container-helper-base": "Useful for reading data from different context types uniformly"
927
+ },
928
+ "time": "2019-11-14T11:20:00+00:00",
929
+ "type": "library",
930
+ "extra": {
931
+ "branch-alias": {
932
+ "dev-develop": "0.3.x-dev"
933
+ }
934
+ },
935
+ "installation-source": "dist",
936
+ "autoload": {
937
+ "psr-4": {
938
+ "Dhii\\Output\\": "src/"
939
+ }
940
+ },
941
+ "notification-url": "https://packagist.org/downloads/",
942
+ "license": [
943
+ "MIT"
944
+ ],
945
+ "authors": [
946
+ {
947
+ "name": "Dhii Team",
948
+ "email": "development@dhii.co"
949
+ }
950
+ ],
951
+ "description": "An interface for objects that can perform rendering.",
952
+ "install-path": "../dhii/output-renderer-interface"
953
+ },
954
+ {
955
+ "name": "dhii/stats-abstract",
956
+ "version": "v0.1.0",
957
+ "version_normalized": "0.1.0.0",
958
+ "source": {
959
+ "type": "git",
960
+ "url": "https://github.com/Dhii/stats-abstract.git",
961
+ "reference": "71f6702c3257c71ab3917b6d076d3c3588cc9f49"
962
+ },
963
+ "dist": {
964
+ "type": "zip",
965
+ "url": "https://api.github.com/repos/Dhii/stats-abstract/zipball/71f6702c3257c71ab3917b6d076d3c3588cc9f49",
966
+ "reference": "71f6702c3257c71ab3917b6d076d3c3588cc9f49",
967
+ "shasum": ""
968
+ },
969
+ "require": {
970
+ "dhii/collections-abstract-base": "^0.1.0",
971
+ "dhii/stats-interface": "^0.1.0"
972
+ },
973
+ "require-dev": {
974
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
975
+ "phpunit/phpunit": "^4.8",
976
+ "ptrofimov/xpmock": "^1.1"
977
+ },
978
+ "time": "2016-11-10T18:55:43+00:00",
979
+ "type": "library",
980
+ "installation-source": "dist",
981
+ "autoload": {
982
+ "psr-4": {
983
+ "Dhii\\Stats\\": "src/"
984
+ }
985
+ },
986
+ "notification-url": "https://packagist.org/downloads/",
987
+ "license": [
988
+ "MIT"
989
+ ],
990
+ "authors": [
991
+ {
992
+ "name": "Dhii Team",
993
+ "email": "development@dhii.co"
994
+ }
995
+ ],
996
+ "description": "Abstract base for stats",
997
+ "install-path": "../dhii/stats-abstract"
998
+ },
999
+ {
1000
+ "name": "dhii/stats-interface",
1001
+ "version": "v0.1.0",
1002
+ "version_normalized": "0.1.0.0",
1003
+ "source": {
1004
+ "type": "git",
1005
+ "url": "https://github.com/Dhii/stats-interface.git",
1006
+ "reference": "36d09a8b8a3b8058214dae6eefb8ecdd98e0f0ba"
1007
+ },
1008
+ "dist": {
1009
+ "type": "zip",
1010
+ "url": "https://api.github.com/repos/Dhii/stats-interface/zipball/36d09a8b8a3b8058214dae6eefb8ecdd98e0f0ba",
1011
+ "reference": "36d09a8b8a3b8058214dae6eefb8ecdd98e0f0ba",
1012
+ "shasum": ""
1013
+ },
1014
+ "require": {
1015
+ "php": "^5.3 | ^7.0"
1016
+ },
1017
+ "require-dev": {
1018
+ "dhii/php-cs-fixer-config": "dev-php-5.3"
1019
+ },
1020
+ "time": "2016-11-10T15:38:37+00:00",
1021
+ "type": "library",
1022
+ "installation-source": "dist",
1023
+ "autoload": {
1024
+ "psr-4": {
1025
+ "Dhii\\Stats\\": "src/"
1026
+ }
1027
+ },
1028
+ "notification-url": "https://packagist.org/downloads/",
1029
+ "license": [
1030
+ "MIT"
1031
+ ],
1032
+ "authors": [
1033
+ {
1034
+ "name": "Dhii Team",
1035
+ "email": "development@dhii.co"
1036
+ }
1037
+ ],
1038
+ "description": "Interfaces for stats",
1039
+ "install-path": "../dhii/stats-interface"
1040
+ },
1041
+ {
1042
+ "name": "dhii/stringable-interface",
1043
+ "version": "v0.1",
1044
+ "version_normalized": "0.1.0.0",
1045
+ "source": {
1046
+ "type": "git",
1047
+ "url": "https://github.com/Dhii/stringable-interface.git",
1048
+ "reference": "b6653905eef2ebf377749feb80a6d18abbe913ef"
1049
+ },
1050
+ "dist": {
1051
+ "type": "zip",
1052
+ "url": "https://api.github.com/repos/Dhii/stringable-interface/zipball/b6653905eef2ebf377749feb80a6d18abbe913ef",
1053
+ "reference": "b6653905eef2ebf377749feb80a6d18abbe913ef",
1054
+ "shasum": ""
1055
+ },
1056
+ "require": {
1057
+ "php": "^5.3 | ^7.0"
1058
+ },
1059
+ "require-dev": {
1060
+ "codeclimate/php-test-reporter": "<=0.3.2",
1061
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
1062
+ "phpunit/phpunit": "^4.8",
1063
+ "ptrofimov/xpmock": "^1.1"
1064
+ },
1065
+ "time": "2017-01-23T15:08:20+00:00",
1066
+ "type": "library",
1067
+ "installation-source": "dist",
1068
+ "autoload": {
1069
+ "psr-4": {
1070
+ "Dhii\\Util\\String\\": "src/"
1071
+ }
1072
+ },
1073
+ "notification-url": "https://packagist.org/downloads/",
1074
+ "license": [
1075
+ "MIT"
1076
+ ],
1077
+ "authors": [
1078
+ {
1079
+ "name": "Dhii Team",
1080
+ "email": "development@dhii.co"
1081
+ }
1082
+ ],
1083
+ "description": "Interoperability interface for objects that can be cast to string",
1084
+ "install-path": "../dhii/stringable-interface"
1085
+ },
1086
+ {
1087
+ "name": "dhii/transformer-interface",
1088
+ "version": "v0.1-alpha1",
1089
+ "version_normalized": "0.1.0.0-alpha1",
1090
+ "source": {
1091
+ "type": "git",
1092
+ "url": "https://github.com/Dhii/transformer-interface.git",
1093
+ "reference": "e774efef46413eb34bdafc19a6bd74fbf656235d"
1094
+ },
1095
+ "dist": {
1096
+ "type": "zip",
1097
+ "url": "https://api.github.com/repos/Dhii/transformer-interface/zipball/e774efef46413eb34bdafc19a6bd74fbf656235d",
1098
+ "reference": "e774efef46413eb34bdafc19a6bd74fbf656235d",
1099
+ "shasum": ""
1100
+ },
1101
+ "require": {
1102
+ "dhii/exception-interface": "^0.1 | ^0.2-alpha1",
1103
+ "dhii/factory-interface": "^0.1-alpha1",
1104
+ "php": "^5.3 | ^7.0"
1105
+ },
1106
+ "require-dev": {
1107
+ "codeclimate/php-test-reporter": "<=0.3.2",
1108
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
1109
+ "phpunit/phpunit": "^4.8",
1110
+ "ptrofimov/xpmock": "^1.1"
1111
+ },
1112
+ "time": "2018-05-15T16:59:05+00:00",
1113
+ "type": "library",
1114
+ "extra": {
1115
+ "branch-alias": {
1116
+ "dev-develop": "0.1.x-dev"
1117
+ }
1118
+ },
1119
+ "installation-source": "dist",
1120
+ "autoload": {
1121
+ "psr-4": {
1122
+ "Dhii\\Transformer\\": "src"
1123
+ }
1124
+ },
1125
+ "notification-url": "https://packagist.org/downloads/",
1126
+ "license": [
1127
+ "MIT"
1128
+ ],
1129
+ "authors": [
1130
+ {
1131
+ "name": "Dhii Team",
1132
+ "email": "development@dhii.co"
1133
+ }
1134
+ ],
1135
+ "description": "Interfaces for data transformation",
1136
+ "install-path": "../dhii/transformer-interface"
1137
+ },
1138
+ {
1139
+ "name": "dhii/validation-abstract",
1140
+ "version": "v0.2-alpha1",
1141
+ "version_normalized": "0.2.0.0-alpha1",
1142
+ "source": {
1143
+ "type": "git",
1144
+ "url": "https://github.com/Dhii/validation-abstract.git",
1145
+ "reference": "dff998ba3476927a0fc6d10bb022425de8f1c844"
1146
+ },
1147
+ "dist": {
1148
+ "type": "zip",
1149
+ "url": "https://api.github.com/repos/Dhii/validation-abstract/zipball/dff998ba3476927a0fc6d10bb022425de8f1c844",
1150
+ "reference": "dff998ba3476927a0fc6d10bb022425de8f1c844",
1151
+ "shasum": ""
1152
+ },
1153
+ "require": {
1154
+ "dhii/validation-interface": "^0.2",
1155
+ "php": "^5.3 | ^7.0"
1156
+ },
1157
+ "require-dev": {
1158
+ "codeclimate/php-test-reporter": "<=0.3.2",
1159
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
1160
+ "dhii/stringable-interface": "^0.1",
1161
+ "phpunit/phpunit": "^4.8",
1162
+ "ptrofimov/xpmock": "^1.1"
1163
+ },
1164
+ "suggest": {
1165
+ "dhii/i18n-helper-base": "For string internationalization",
1166
+ "dhii/iterator-helper-base": "For implementations of iterable-related helper functionality",
1167
+ "dhii/normalization-helper-base": "For simple types normalization",
1168
+ "dhii/stringable-interface": "To be able to pass stringable objects instead of strings",
1169
+ "dhii/validation-interface": "Needed to be able to create exceptions that are expected to be thrown"
1170
+ },
1171
+ "time": "2018-03-07T21:05:39+00:00",
1172
+ "type": "library",
1173
+ "extra": {
1174
+ "branch-alias": {
1175
+ "dev-develop": "0.2.x-dev"
1176
+ }
1177
+ },
1178
+ "installation-source": "dist",
1179
+ "autoload": {
1180
+ "psr-4": {
1181
+ "Dhii\\Validation\\": "src/"
1182
+ }
1183
+ },
1184
+ "notification-url": "https://packagist.org/downloads/",
1185
+ "license": [
1186
+ "MIT"
1187
+ ],
1188
+ "authors": [
1189
+ {
1190
+ "name": "Dhii Team",
1191
+ "email": "development@dhii.co"
1192
+ }
1193
+ ],
1194
+ "description": "Common abstract functionality for validation.",
1195
+ "install-path": "../dhii/validation-abstract"
1196
+ },
1197
+ {
1198
+ "name": "dhii/validation-base",
1199
+ "version": "v0.2-alpha2",
1200
+ "version_normalized": "0.2.0.0-alpha2",
1201
+ "source": {
1202
+ "type": "git",
1203
+ "url": "https://github.com/Dhii/validation-base.git",
1204
+ "reference": "9e75c5f886a2403c6989c36c2d4ffcfae158172e"
1205
+ },
1206
+ "dist": {
1207
+ "type": "zip",
1208
+ "url": "https://api.github.com/repos/Dhii/validation-base/zipball/9e75c5f886a2403c6989c36c2d4ffcfae158172e",
1209
+ "reference": "9e75c5f886a2403c6989c36c2d4ffcfae158172e",
1210
+ "shasum": ""
1211
+ },
1212
+ "require": {
1213
+ "dhii/exception": "^0.1-alpha4",
1214
+ "dhii/i18n-helper-base": "^0.1",
1215
+ "dhii/iterator-helper-base": "^0.1",
1216
+ "dhii/normalization-helper-base": "^0.1",
1217
+ "dhii/validation-abstract": "^0.2",
1218
+ "dhii/validation-interface": "^0.2-alpha2",
1219
+ "php": "^5.4 | ^7.0"
1220
+ },
1221
+ "require-dev": {
1222
+ "codeclimate/php-test-reporter": "<=0.3.2",
1223
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
1224
+ "phpunit/phpunit": "^4.8",
1225
+ "ptrofimov/xpmock": "^1.1"
1226
+ },
1227
+ "time": "2018-04-02T13:31:36+00:00",
1228
+ "type": "library",
1229
+ "extra": {
1230
+ "branch-alias": {
1231
+ "dev-develop": "0.2.x-dev"
1232
+ }
1233
+ },
1234
+ "installation-source": "dist",
1235
+ "autoload": {
1236
+ "psr-4": {
1237
+ "Dhii\\Validation\\": "src/"
1238
+ }
1239
+ },
1240
+ "notification-url": "https://packagist.org/downloads/",
1241
+ "license": [
1242
+ "MIT"
1243
+ ],
1244
+ "authors": [
1245
+ {
1246
+ "name": "Dhii Team",
1247
+ "email": "development@dhii.co"
1248
+ }
1249
+ ],
1250
+ "description": "Base concrete functionality for validation.",
1251
+ "install-path": "../dhii/validation-base"
1252
+ },
1253
+ {
1254
+ "name": "dhii/validation-interface",
1255
+ "version": "v0.2",
1256
+ "version_normalized": "0.2.0.0",
1257
+ "source": {
1258
+ "type": "git",
1259
+ "url": "https://github.com/Dhii/validation-interface.git",
1260
+ "reference": "a26026ae5cdf0a650b3511a22dbcb9329073b82c"
1261
+ },
1262
+ "dist": {
1263
+ "type": "zip",
1264
+ "url": "https://api.github.com/repos/Dhii/validation-interface/zipball/a26026ae5cdf0a650b3511a22dbcb9329073b82c",
1265
+ "reference": "a26026ae5cdf0a650b3511a22dbcb9329073b82c",
1266
+ "shasum": ""
1267
+ },
1268
+ "require": {
1269
+ "dhii/exception-interface": "^0.1|^0.2",
1270
+ "dhii/factory-interface": "^0.1",
1271
+ "php": "^5.3 | ^7.0"
1272
+ },
1273
+ "require-dev": {
1274
+ "codeclimate/php-test-reporter": "<=0.3.2",
1275
+ "dhii/php-cs-fixer-config": "dev-php-5.3",
1276
+ "dhii/stringable-interface": "^0.1",
1277
+ "phpunit/phpunit": "^4.8",
1278
+ "ptrofimov/xpmock": "^1.1"
1279
+ },
1280
+ "time": "2018-08-29T11:39:22+00:00",
1281
+ "type": "library",
1282
+ "extra": {
1283
+ "branch-alias": {
1284
+ "dev-develop": "0.3.x-dev"
1285
+ }
1286
+ },
1287
+ "installation-source": "dist",
1288
+ "autoload": {
1289
+ "psr-4": {
1290
+ "Dhii\\Validation\\": "src/"
1291
+ }
1292
+ },
1293
+ "notification-url": "https://packagist.org/downloads/",
1294
+ "license": [
1295
+ "MIT"
1296
+ ],
1297
+ "authors": [
1298
+ {
1299
+ "name": "Dhii Team",
1300
+ "email": "development@dhii.co"
1301
+ }
1302
+ ],
1303
+ "description": "A base interface for validators",
1304
+ "install-path": "../dhii/validation-interface"
1305
+ },
1306
+ {
1307
+ "name": "erusev/parsedown",
1308
+ "version": "1.7.4",
1309
+ "version_normalized": "1.7.4.0",
1310
+ "source": {
1311
+ "type": "git",
1312
+ "url": "https://github.com/erusev/parsedown.git",
1313
+ "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3"
1314
+ },
1315
+ "dist": {
1316
+ "type": "zip",
1317
+ "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
1318
+ "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
1319
+ "shasum": ""
1320
+ },
1321
+ "require": {
1322
+ "ext-mbstring": "*",
1323
+ "php": ">=5.3.0"
1324
+ },
1325
+ "require-dev": {
1326
+ "phpunit/phpunit": "^4.8.35"
1327
+ },
1328
+ "time": "2019-12-30T22:54:17+00:00",
1329
+ "type": "library",
1330
+ "installation-source": "dist",
1331
+ "autoload": {
1332
+ "psr-0": {
1333
+ "Parsedown": ""
1334
+ }
1335
+ },
1336
+ "notification-url": "https://packagist.org/downloads/",
1337
+ "license": [
1338
+ "MIT"
1339
+ ],
1340
+ "authors": [
1341
+ {
1342
+ "name": "Emanuil Rusev",
1343
+ "email": "hello@erusev.com",
1344
+ "homepage": "http://erusev.com"
1345
+ }
1346
+ ],
1347
+ "description": "Parser for Markdown.",
1348
+ "homepage": "http://parsedown.org",
1349
+ "keywords": [
1350
+ "markdown",
1351
+ "parser"
1352
+ ],
1353
+ "install-path": "../erusev/parsedown"
1354
+ },
1355
+ {
1356
+ "name": "php-di/invoker",
1357
+ "version": "1.3.3",
1358
+ "version_normalized": "1.3.3.0",
1359
+ "source": {
1360
+ "type": "git",
1361
+ "url": "https://github.com/PHP-DI/Invoker.git",
1362
+ "reference": "1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7"
1363
+ },
1364
+ "dist": {
1365
+ "type": "zip",
1366
+ "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7",
1367
+ "reference": "1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7",
1368
+ "shasum": ""
1369
+ },
1370
+ "require": {
1371
+ "container-interop/container-interop": "~1.1"
1372
+ },
1373
+ "require-dev": {
1374
+ "athletic/athletic": "~0.1.8",
1375
+ "phpunit/phpunit": "~4.5"
1376
+ },
1377
+ "time": "2016-07-14T13:09:58+00:00",
1378
+ "type": "library",
1379
+ "installation-source": "dist",
1380
+ "autoload": {
1381
+ "psr-4": {
1382
+ "Invoker\\": "src/"
1383
+ }
1384
+ },
1385
+ "notification-url": "https://packagist.org/downloads/",
1386
+ "license": [
1387
+ "MIT"
1388
+ ],
1389
+ "description": "Generic and extensible callable invoker",
1390
+ "homepage": "https://github.com/PHP-DI/Invoker",
1391
+ "keywords": [
1392
+ "callable",
1393
+ "dependency",
1394
+ "dependency-injection",
1395
+ "injection",
1396
+ "invoke",
1397
+ "invoker"
1398
+ ],
1399
+ "install-path": "../php-di/invoker"
1400
+ },
1401
+ {
1402
+ "name": "php-di/php-di",
1403
+ "version": "5.2.2",
1404
+ "version_normalized": "5.2.2.0",
1405
+ "source": {
1406
+ "type": "git",
1407
+ "url": "https://github.com/PHP-DI/PHP-DI.git",
1408
+ "reference": "f574bcc841201ab04587b1c6da1234d4044f67d8"
1409
+ },
1410
+ "dist": {
1411
+ "type": "zip",
1412
+ "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f574bcc841201ab04587b1c6da1234d4044f67d8",
1413
+ "reference": "f574bcc841201ab04587b1c6da1234d4044f67d8",
1414
+ "shasum": ""
1415
+ },
1416
+ "require": {
1417
+ "container-interop/container-interop": "~1.0",
1418
+ "php": ">=5.4.0",
1419
+ "php-di/invoker": "^1.1.1",
1420
+ "php-di/phpdoc-reader": "^2.0.1"
1421
+ },
1422
+ "replace": {
1423
+ "mnapoli/php-di": "*"
1424
+ },
1425
+ "require-dev": {
1426
+ "doctrine/annotations": "~1.2",
1427
+ "doctrine/cache": "~1.4",
1428
+ "mnapoli/phpunit-easymock": "~0.2.0",
1429
+ "ocramius/proxy-manager": "~1.0",
1430
+ "phpunit/phpunit": "~4.5"
1431
+ },
1432
+ "suggest": {
1433
+ "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)",
1434
+ "doctrine/cache": "Install it if you want to use the cache (version ~1.4)",
1435
+ "ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~1.0)"
1436
+ },
1437
+ "time": "2016-02-09T22:00:00+00:00",
1438
+ "type": "library",
1439
+ "installation-source": "dist",
1440
+ "autoload": {
1441
+ "psr-4": {
1442
+ "DI\\": "src/DI/"
1443
+ },
1444
+ "files": [
1445
+ "src/DI/functions.php"
1446
+ ]
1447
+ },
1448
+ "notification-url": "https://packagist.org/downloads/",
1449
+ "license": [
1450
+ "MIT"
1451
+ ],
1452
+ "description": "The dependency injection container for humans",
1453
+ "homepage": "http://php-di.org/",
1454
+ "keywords": [
1455
+ "container",
1456
+ "dependency injection",
1457
+ "di"
1458
+ ],
1459
+ "install-path": "../php-di/php-di"
1460
+ },
1461
+ {
1462
+ "name": "php-di/phpdoc-reader",
1463
+ "version": "2.1.1",
1464
+ "version_normalized": "2.1.1.0",
1465
+ "source": {
1466
+ "type": "git",
1467
+ "url": "https://github.com/PHP-DI/PhpDocReader.git",
1468
+ "reference": "15678f7451c020226807f520efb867ad26fbbfcf"
1469
+ },
1470
+ "dist": {
1471
+ "type": "zip",
1472
+ "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/15678f7451c020226807f520efb867ad26fbbfcf",
1473
+ "reference": "15678f7451c020226807f520efb867ad26fbbfcf",
1474
+ "shasum": ""
1475
+ },
1476
+ "require": {
1477
+ "php": ">=5.4.0"
1478
+ },
1479
+ "require-dev": {
1480
+ "phpunit/phpunit": "~4.6"
1481
+ },
1482
+ "time": "2019-09-26T11:24:58+00:00",
1483
+ "type": "library",
1484
+ "installation-source": "dist",
1485
+ "autoload": {
1486
+ "psr-4": {
1487
+ "PhpDocReader\\": "src/PhpDocReader"
1488
+ }
1489
+ },
1490
+ "notification-url": "https://packagist.org/downloads/",
1491
+ "license": [
1492
+ "MIT"
1493
+ ],
1494
+ "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)",
1495
+ "keywords": [
1496
+ "phpdoc",
1497
+ "reflection"
1498
+ ],
1499
+ "install-path": "../php-di/phpdoc-reader"
1500
+ },
1501
+ {
1502
+ "name": "psr/container",
1503
+ "version": "1.0.0",
1504
+ "version_normalized": "1.0.0.0",
1505
+ "source": {
1506
+ "type": "git",
1507
+ "url": "https://github.com/php-fig/container.git",
1508
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
1509
+ },
1510
+ "dist": {
1511
+ "type": "zip",
1512
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
1513
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
1514
+ "shasum": ""
1515
+ },
1516
+ "require": {
1517
+ "php": ">=5.3.0"
1518
+ },
1519
+ "time": "2017-02-14T16:28:37+00:00",
1520
+ "type": "library",
1521
+ "extra": {
1522
+ "branch-alias": {
1523
+ "dev-master": "1.0.x-dev"
1524
+ }
1525
+ },
1526
+ "installation-source": "dist",
1527
+ "autoload": {
1528
+ "psr-4": {
1529
+ "Psr\\Container\\": "src/"
1530
+ }
1531
+ },
1532
+ "notification-url": "https://packagist.org/downloads/",
1533
+ "license": [
1534
+ "MIT"
1535
+ ],
1536
+ "authors": [
1537
+ {
1538
+ "name": "PHP-FIG",
1539
+ "homepage": "http://www.php-fig.org/"
1540
+ }
1541
+ ],
1542
+ "description": "Common Container Interface (PHP FIG PSR-11)",
1543
+ "homepage": "https://github.com/php-fig/container",
1544
+ "keywords": [
1545
+ "PSR-11",
1546
+ "container",
1547
+ "container-interface",
1548
+ "container-interop",
1549
+ "psr"
1550
+ ],
1551
+ "install-path": "../psr/container"
1552
+ },
1553
+ {
1554
+ "name": "psr/log",
1555
+ "version": "1.1.2",
1556
+ "version_normalized": "1.1.2.0",
1557
+ "source": {
1558
+ "type": "git",
1559
+ "url": "https://github.com/php-fig/log.git",
1560
+ "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
1561
+ },
1562
+ "dist": {
1563
+ "type": "zip",
1564
+ "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
1565
+ "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
1566
+ "shasum": ""
1567
+ },
1568
+ "require": {
1569
+ "php": ">=5.3.0"
1570
+ },
1571
+ "time": "2019-11-01T11:05:21+00:00",
1572
+ "type": "library",
1573
+ "extra": {
1574
+ "branch-alias": {
1575
+ "dev-master": "1.1.x-dev"
1576
+ }
1577
+ },
1578
+ "installation-source": "dist",
1579
+ "autoload": {
1580
+ "psr-4": {
1581
+ "Psr\\Log\\": "Psr/Log/"
1582
+ }
1583
+ },
1584
+ "notification-url": "https://packagist.org/downloads/",
1585
+ "license": [
1586
+ "MIT"
1587
+ ],
1588
+ "authors": [
1589
+ {
1590
+ "name": "PHP-FIG",
1591
+ "homepage": "http://www.php-fig.org/"
1592
+ }
1593
+ ],
1594
+ "description": "Common interface for logging libraries",
1595
+ "homepage": "https://github.com/php-fig/log",
1596
+ "keywords": [
1597
+ "log",
1598
+ "psr",
1599
+ "psr-3"
1600
+ ],
1601
+ "install-path": "../psr/log"
1602
+ },
1603
+ {
1604
+ "name": "rebelcode/composer-cleanup-plugin",
1605
+ "version": "v0.2",
1606
+ "version_normalized": "0.2.0.0",
1607
+ "source": {
1608
+ "type": "git",
1609
+ "url": "https://github.com/RebelCode/composer-cleanup-plugin.git",
1610
+ "reference": "3677eb752eb8ca042ba6f725b33f419b93857a62"
1611
+ },
1612
+ "dist": {
1613
+ "type": "zip",
1614
+ "url": "https://api.github.com/repos/RebelCode/composer-cleanup-plugin/zipball/3677eb752eb8ca042ba6f725b33f419b93857a62",
1615
+ "reference": "3677eb752eb8ca042ba6f725b33f419b93857a62",
1616
+ "shasum": ""
1617
+ },
1618
+ "require": {
1619
+ "composer-plugin-api": "^2.0"
1620
+ },
1621
+ "require-dev": {
1622
+ "composer/composer": "^2.0"
1623
+ },
1624
+ "time": "2021-02-09T13:24:28+00:00",
1625
+ "type": "composer-plugin",
1626
+ "extra": {
1627
+ "branch-alias": [],
1628
+ "class": "RebelCode\\Composer\\CleanupPlugin"
1629
+ },
1630
+ "installation-source": "dist",
1631
+ "autoload": {
1632
+ "psr-4": {
1633
+ "RebelCode\\Composer\\": "src/"
1634
+ }
1635
+ },
1636
+ "notification-url": "https://packagist.org/downloads/",
1637
+ "license": [
1638
+ "MIT"
1639
+ ],
1640
+ "authors": [
1641
+ {
1642
+ "name": "RebelCode",
1643
+ "email": "dev@rebelcode.com"
1644
+ },
1645
+ {
1646
+ "name": "Barry vd. Heuvel",
1647
+ "email": "barryvdh@gmail.com"
1648
+ }
1649
+ ],
1650
+ "description": "A composer cleanup plugin, to remove tests and documentation to save space",
1651
+ "support": {
1652
+ "source": "https://github.com/RebelCode/composer-cleanup-plugin/tree/v0.2"
1653
+ },
1654
+ "install-path": "../rebelcode/composer-cleanup-plugin"
1655
+ },
1656
+ {
1657
+ "name": "symfony/polyfill-ctype",
1658
+ "version": "v1.13.1",
1659
+ "version_normalized": "1.13.1.0",
1660
+ "source": {
1661
+ "type": "git",
1662
+ "url": "https://github.com/symfony/polyfill-ctype.git",
1663
+ "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3"
1664
+ },
1665
+ "dist": {
1666
+ "type": "zip",
1667
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
1668
+ "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
1669
+ "shasum": ""
1670
+ },
1671
+ "require": {
1672
+ "php": ">=5.3.3"
1673
+ },
1674
+ "suggest": {
1675
+ "ext-ctype": "For best performance"
1676
+ },
1677
+ "time": "2019-11-27T13:56:44+00:00",
1678
+ "type": "library",
1679
+ "extra": {
1680
+ "branch-alias": {
1681
+ "dev-master": "1.13-dev"
1682
+ }
1683
+ },
1684
+ "installation-source": "dist",
1685
+ "autoload": {
1686
+ "psr-4": {
1687
+ "Symfony\\Polyfill\\Ctype\\": ""
1688
+ },
1689
+ "files": [
1690
+ "bootstrap.php"
1691
+ ]
1692
+ },
1693
+ "notification-url": "https://packagist.org/downloads/",
1694
+ "license": [
1695
+ "MIT"
1696
+ ],
1697
+ "authors": [
1698
+ {
1699
+ "name": "Gert de Pagter",
1700
+ "email": "BackEndTea@gmail.com"
1701
+ },
1702
+ {
1703
+ "name": "Symfony Community",
1704
+ "homepage": "https://symfony.com/contributors"
1705
+ }
1706
+ ],
1707
+ "description": "Symfony polyfill for ctype functions",
1708
+ "homepage": "https://symfony.com",
1709
+ "keywords": [
1710
+ "compatibility",
1711
+ "ctype",
1712
+ "polyfill",
1713
+ "portable"
1714
+ ],
1715
+ "install-path": "../symfony/polyfill-ctype"
1716
+ },
1717
+ {
1718
+ "name": "symfony/polyfill-mbstring",
1719
+ "version": "v1.17.1",
1720
+ "version_normalized": "1.17.1.0",
1721
+ "source": {
1722
+ "type": "git",
1723
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
1724
+ "reference": "7110338d81ce1cbc3e273136e4574663627037a7"
1725
+ },
1726
+ "dist": {
1727
+ "type": "zip",
1728
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7110338d81ce1cbc3e273136e4574663627037a7",
1729
+ "reference": "7110338d81ce1cbc3e273136e4574663627037a7",
1730
+ "shasum": ""
1731
+ },
1732
+ "require": {
1733
+ "php": ">=5.3.3"
1734
+ },
1735
+ "suggest": {
1736
+ "ext-mbstring": "For best performance"
1737
+ },
1738
+ "time": "2020-06-06T08:46:27+00:00",
1739
+ "type": "library",
1740
+ "extra": {
1741
+ "branch-alias": {
1742
+ "dev-master": "1.17-dev"
1743
+ },
1744
+ "thanks": {
1745
+ "name": "symfony/polyfill",
1746
+ "url": "https://github.com/symfony/polyfill"
1747
+ }
1748
+ },
1749
+ "installation-source": "dist",
1750
+ "autoload": {
1751
+ "psr-4": {
1752
+ "Symfony\\Polyfill\\Mbstring\\": ""
1753
+ },
1754
+ "files": [
1755
+ "bootstrap.php"
1756
+ ]
1757
+ },
1758
+ "notification-url": "https://packagist.org/downloads/",
1759
+ "license": [
1760
+ "MIT"
1761
+ ],
1762
+ "authors": [
1763
+ {
1764
+ "name": "Nicolas Grekas",
1765
+ "email": "p@tchwork.com"
1766
+ },
1767
+ {
1768
+ "name": "Symfony Community",
1769
+ "homepage": "https://symfony.com/contributors"
1770
+ }
1771
+ ],
1772
+ "description": "Symfony polyfill for the Mbstring extension",
1773
+ "homepage": "https://symfony.com",
1774
+ "keywords": [
1775
+ "compatibility",
1776
+ "mbstring",
1777
+ "polyfill",
1778
+ "portable",
1779
+ "shim"
1780
+ ],
1781
+ "funding": [
1782
+ {
1783
+ "url": "https://symfony.com/sponsor",
1784
+ "type": "custom"
1785
+ },
1786
+ {
1787
+ "url": "https://github.com/fabpot",
1788
+ "type": "github"
1789
+ },
1790
+ {
1791
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
1792
+ "type": "tidelift"
1793
+ }
1794
+ ],
1795
+ "install-path": "../symfony/polyfill-mbstring"
1796
+ },
1797
+ {
1798
+ "name": "symfony/translation",
1799
+ "version": "v2.8.52",
1800
+ "version_normalized": "2.8.52.0",
1801
+ "source": {
1802
+ "type": "git",
1803
+ "url": "https://github.com/symfony/translation.git",
1804
+ "reference": "fc58c2a19e56c29f5ba2736ec40d0119a0de2089"
1805
+ },
1806
+ "dist": {
1807
+ "type": "zip",
1808
+ "url": "https://api.github.com/repos/symfony/translation/zipball/fc58c2a19e56c29f5ba2736ec40d0119a0de2089",
1809
+ "reference": "fc58c2a19e56c29f5ba2736ec40d0119a0de2089",
1810
+ "shasum": ""
1811
+ },
1812
+ "require": {
1813
+ "php": ">=5.3.9",
1814
+ "symfony/polyfill-mbstring": "~1.0"
1815
+ },
1816
+ "conflict": {
1817
+ "symfony/config": "<2.7"
1818
+ },
1819
+ "require-dev": {
1820
+ "psr/log": "~1.0",
1821
+ "symfony/config": "~2.8",
1822
+ "symfony/intl": "~2.7.25|^2.8.18|~3.2.5",
1823
+ "symfony/yaml": "~2.2|~3.0.0"
1824
+ },
1825
+ "suggest": {
1826
+ "psr/log-implementation": "To use logging capability in translator",
1827
+ "symfony/config": "",
1828
+ "symfony/yaml": ""
1829
+ },
1830
+ "time": "2018-11-24T21:16:41+00:00",
1831
+ "type": "library",
1832
+ "extra": {
1833
+ "branch-alias": {
1834
+ "dev-master": "2.8-dev"
1835
+ }
1836
+ },
1837
+ "installation-source": "dist",
1838
+ "autoload": {
1839
+ "psr-4": {
1840
+ "Symfony\\Component\\Translation\\": ""
1841
+ },
1842
+ "exclude-from-classmap": [
1843
+ "/Tests/"
1844
+ ]
1845
+ },
1846
+ "notification-url": "https://packagist.org/downloads/",
1847
+ "license": [
1848
+ "MIT"
1849
+ ],
1850
+ "authors": [
1851
+ {
1852
+ "name": "Fabien Potencier",
1853
+ "email": "fabien@symfony.com"
1854
+ },
1855
+ {
1856
+ "name": "Symfony Community",
1857
+ "homepage": "https://symfony.com/contributors"
1858
+ }
1859
+ ],
1860
+ "description": "Symfony Translation Component",
1861
+ "homepage": "https://symfony.com",
1862
+ "install-path": "../symfony/translation"
1863
+ },
1864
+ {
1865
+ "name": "twig/extensions",
1866
+ "version": "v1.5.4",
1867
+ "version_normalized": "1.5.4.0",
1868
+ "source": {
1869
+ "type": "git",
1870
+ "url": "https://github.com/twigphp/Twig-extensions.git",
1871
+ "reference": "57873c8b0c1be51caa47df2cdb824490beb16202"
1872
+ },
1873
+ "dist": {
1874
+ "type": "zip",
1875
+ "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202",
1876
+ "reference": "57873c8b0c1be51caa47df2cdb824490beb16202",
1877
+ "shasum": ""
1878
+ },
1879
+ "require": {
1880
+ "twig/twig": "^1.27|^2.0"
1881
+ },
1882
+ "require-dev": {
1883
+ "symfony/phpunit-bridge": "^3.4",
1884
+ "symfony/translation": "^2.7|^3.4"
1885
+ },
1886
+ "suggest": {
1887
+ "symfony/translation": "Allow the time_diff output to be translated"
1888
+ },
1889
+ "time": "2018-12-05T18:34:18+00:00",
1890
+ "type": "library",
1891
+ "extra": {
1892
+ "branch-alias": {
1893
+ "dev-master": "1.5-dev"
1894
+ }
1895
+ },
1896
+ "installation-source": "dist",
1897
+ "autoload": {
1898
+ "psr-0": {
1899
+ "Twig_Extensions_": "lib/"
1900
+ },
1901
+ "psr-4": {
1902
+ "Twig\\Extensions\\": "src/"
1903
+ }
1904
+ },
1905
+ "notification-url": "https://packagist.org/downloads/",
1906
+ "license": [
1907
+ "MIT"
1908
+ ],
1909
+ "authors": [
1910
+ {
1911
+ "name": "Fabien Potencier",
1912
+ "email": "fabien@symfony.com"
1913
+ }
1914
+ ],
1915
+ "description": "Common additional features for Twig that do not directly belong in core",
1916
+ "keywords": [
1917
+ "i18n",
1918
+ "text"
1919
+ ],
1920
+ "install-path": "../twig/extensions"
1921
+ },
1922
+ {
1923
+ "name": "twig/twig",
1924
+ "version": "v1.41.0",
1925
+ "version_normalized": "1.41.0.0",
1926
+ "source": {
1927
+ "type": "git",
1928
+ "url": "https://github.com/twigphp/Twig.git",
1929
+ "reference": "575cd5028362da591facde1ef5d7b94553c375c9"
1930
+ },
1931
+ "dist": {
1932
+ "type": "zip",
1933
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/575cd5028362da591facde1ef5d7b94553c375c9",
1934
+ "reference": "575cd5028362da591facde1ef5d7b94553c375c9",
1935
+ "shasum": ""
1936
+ },
1937
+ "require": {
1938
+ "php": ">=5.4.0",
1939
+ "symfony/polyfill-ctype": "^1.8"
1940
+ },
1941
+ "require-dev": {
1942
+ "psr/container": "^1.0",
1943
+ "symfony/debug": "^2.7",
1944
+ "symfony/phpunit-bridge": "^3.4.19|^4.1.8"
1945
+ },
1946
+ "time": "2019-05-14T11:59:08+00:00",
1947
+ "type": "library",
1948
+ "extra": {
1949
+ "branch-alias": {
1950
+ "dev-master": "1.41-dev"
1951
+ }
1952
+ },
1953
+ "installation-source": "dist",
1954
+ "autoload": {
1955
+ "psr-0": {
1956
+ "Twig_": "lib/"
1957
+ },
1958
+ "psr-4": {
1959
+ "Twig\\": "src/"
1960
+ }
1961
+ },
1962
+ "notification-url": "https://packagist.org/downloads/",
1963
+ "license": [
1964
+ "BSD-3-Clause"
1965
+ ],
1966
+ "authors": [
1967
+ {
1968
+ "name": "Fabien Potencier",
1969
+ "email": "fabien@symfony.com",
1970
+ "homepage": "http://fabien.potencier.org",
1971
+ "role": "Lead Developer"
1972
+ },
1973
+ {
1974
+ "name": "Armin Ronacher",
1975
+ "email": "armin.ronacher@active-4.com",
1976
+ "role": "Project Founder"
1977
+ },
1978
+ {
1979
+ "name": "Twig Team",
1980
+ "homepage": "https://twig.symfony.com/contributors",
1981
+ "role": "Contributors"
1982
+ }
1983
+ ],
1984
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
1985
+ "homepage": "https://twig.symfony.com",
1986
+ "keywords": [
1987
+ "templating"
1988
+ ],
1989
+ "install-path": "../twig/twig"
1990
+ }
1991
+ ],
1992
+ "dev": false,
1993
+ "dev-package-names": []
1994
+ }
vendor/composer/installed.php ADDED
@@ -0,0 +1,387 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php return array (
2
+ 'root' =>
3
+ array (
4
+ 'pretty_version' => 'dev-develop',
5
+ 'version' => 'dev-develop',
6
+ 'aliases' =>
7
+ array (
8
+ ),
9
+ 'reference' => 'dbbd846351515ddbc9f72dc75ff1c3654e3bebf5',
10
+ 'name' => 'wprss/core',
11
+ ),
12
+ 'versions' =>
13
+ array (
14
+ 'container-interop/container-interop' =>
15
+ array (
16
+ 'pretty_version' => '1.2.0',
17
+ 'version' => '1.2.0.0',
18
+ 'aliases' =>
19
+ array (
20
+ ),
21
+ 'reference' => '79cbf1341c22ec75643d841642dd5d6acd83bdb8',
22
+ ),
23
+ 'container-interop/container-interop-implementation' =>
24
+ array (
25
+ 'provided' =>
26
+ array (
27
+ 0 => '^1.0',
28
+ ),
29
+ ),
30
+ 'container-interop/service-provider' =>
31
+ array (
32
+ 'pretty_version' => 'v0.3.0',
33
+ 'version' => '0.3.0.0',
34
+ 'aliases' =>
35
+ array (
36
+ ),
37
+ 'reference' => '5cb38893b836edb00d3e1ace26c20ee1d29957cf',
38
+ ),
39
+ 'dhii/collections-abstract' =>
40
+ array (
41
+ 'pretty_version' => 'v0.1.0',
42
+ 'version' => '0.1.0.0',
43
+ 'aliases' =>
44
+ array (
45
+ ),
46
+ 'reference' => '7c9141202af4d83b31e75efcbf481fa1cb588ad8',
47
+ ),
48
+ 'dhii/collections-abstract-base' =>
49
+ array (
50
+ 'pretty_version' => 'v0.1.0',
51
+ 'version' => '0.1.0.0',
52
+ 'aliases' =>
53
+ array (
54
+ ),
55
+ 'reference' => '0ec0147451a72a13fb327ac6ff747c5e953c56f3',
56
+ ),
57
+ 'dhii/collections-interface' =>
58
+ array (
59
+ 'pretty_version' => 'v0.1.2',
60
+ 'version' => '0.1.2.0',
61
+ 'aliases' =>
62
+ array (
63
+ ),
64
+ 'reference' => 'a8e9a30366a30d77bc270042a67150b3f8f6d94d',
65
+ ),
66
+ 'dhii/container-helper-base' =>
67
+ array (
68
+ 'pretty_version' => 'v0.1-alpha8',
69
+ 'version' => '0.1.0.0-alpha8',
70
+ 'aliases' =>
71
+ array (
72
+ ),
73
+ 'reference' => '1b8206842e06b71abcff769aaddfc51bf8f317cd',
74
+ ),
75
+ 'dhii/di' =>
76
+ array (
77
+ 'pretty_version' => 'v0.1.1',
78
+ 'version' => '0.1.1.0',
79
+ 'aliases' =>
80
+ array (
81
+ ),
82
+ 'reference' => '52efd50f1b11fcdd2f789bae483bdb858772c306',
83
+ ),
84
+ 'dhii/di-abstract' =>
85
+ array (
86
+ 'pretty_version' => 'v0.1',
87
+ 'version' => '0.1.0.0',
88
+ 'aliases' =>
89
+ array (
90
+ ),
91
+ 'reference' => 'e87ee3782d5f4c44724e79c4b2e1a55103e5cd11',
92
+ ),
93
+ 'dhii/di-interface' =>
94
+ array (
95
+ 'pretty_version' => 'v0.1',
96
+ 'version' => '0.1.0.0',
97
+ 'aliases' =>
98
+ array (
99
+ ),
100
+ 'reference' => '0320846a577d68b761e29acd5d4db40d88cc4f98',
101
+ ),
102
+ 'dhii/exception' =>
103
+ array (
104
+ 'pretty_version' => 'v0.1-alpha5',
105
+ 'version' => '0.1.0.0-alpha5',
106
+ 'aliases' =>
107
+ array (
108
+ ),
109
+ 'reference' => 'f7afb934c970a4e167b2c7ba24fa3df50714e0fe',
110
+ ),
111
+ 'dhii/exception-helper-base' =>
112
+ array (
113
+ 'replaced' =>
114
+ array (
115
+ 0 => '0.1-alpha1|0.1-alpha2',
116
+ ),
117
+ ),
118
+ 'dhii/exception-interface' =>
119
+ array (
120
+ 'pretty_version' => 'v0.2',
121
+ 'version' => '0.2.0.0',
122
+ 'aliases' =>
123
+ array (
124
+ ),
125
+ 'reference' => 'b69feebf7cb2879cd43977a03342e2393b73f7fb',
126
+ ),
127
+ 'dhii/factory-interface' =>
128
+ array (
129
+ 'pretty_version' => 'v0.1',
130
+ 'version' => '0.1.0.0',
131
+ 'aliases' =>
132
+ array (
133
+ ),
134
+ 'reference' => 'b8d217aec8838e64ccaa770cb03dc164bf6f0515',
135
+ ),
136
+ 'dhii/i18n-helper-base' =>
137
+ array (
138
+ 'pretty_version' => 'v0.1-alpha1',
139
+ 'version' => '0.1.0.0-alpha1',
140
+ 'aliases' =>
141
+ array (
142
+ ),
143
+ 'reference' => 'fc4c881f3e528ea918588831ebeffb92738f8dd5',
144
+ ),
145
+ 'dhii/i18n-interface' =>
146
+ array (
147
+ 'pretty_version' => 'v0.2',
148
+ 'version' => '0.2.0.0',
149
+ 'aliases' =>
150
+ array (
151
+ ),
152
+ 'reference' => '7eaf0731ba80eea37a5deea6d894a0326e10be67',
153
+ ),
154
+ 'dhii/iterator-helper-base' =>
155
+ array (
156
+ 'pretty_version' => 'v0.1-alpha2',
157
+ 'version' => '0.1.0.0-alpha2',
158
+ 'aliases' =>
159
+ array (
160
+ ),
161
+ 'reference' => 'cf62fb9f8b658a82815f15a2d906d8d1ff5c52ce',
162
+ ),
163
+ 'dhii/normalization-helper-base' =>
164
+ array (
165
+ 'pretty_version' => 'v0.1-alpha4',
166
+ 'version' => '0.1.0.0-alpha4',
167
+ 'aliases' =>
168
+ array (
169
+ ),
170
+ 'reference' => '1b64f0ea6b3e32f9478f854f6049500795b51da7',
171
+ ),
172
+ 'dhii/output-renderer-abstract' =>
173
+ array (
174
+ 'pretty_version' => 'v0.1-alpha2',
175
+ 'version' => '0.1.0.0-alpha2',
176
+ 'aliases' =>
177
+ array (
178
+ ),
179
+ 'reference' => '0f6e5eed940025332dd1986d6c771e10f7197b1a',
180
+ ),
181
+ 'dhii/output-renderer-base' =>
182
+ array (
183
+ 'pretty_version' => 'v0.1-alpha1',
184
+ 'version' => '0.1.0.0-alpha1',
185
+ 'aliases' =>
186
+ array (
187
+ ),
188
+ 'reference' => '700483a37016e502be2ead9580bb9258ad8bf17b',
189
+ ),
190
+ 'dhii/output-renderer-interface' =>
191
+ array (
192
+ 'pretty_version' => 'v0.3',
193
+ 'version' => '0.3.0.0',
194
+ 'aliases' =>
195
+ array (
196
+ ),
197
+ 'reference' => '407014d7fd1af0427958f2acd61aff008ee9e032',
198
+ ),
199
+ 'dhii/stats-abstract' =>
200
+ array (
201
+ 'pretty_version' => 'v0.1.0',
202
+ 'version' => '0.1.0.0',
203
+ 'aliases' =>
204
+ array (
205
+ ),
206
+ 'reference' => '71f6702c3257c71ab3917b6d076d3c3588cc9f49',
207
+ ),
208
+ 'dhii/stats-interface' =>
209
+ array (
210
+ 'pretty_version' => 'v0.1.0',
211
+ 'version' => '0.1.0.0',
212
+ 'aliases' =>
213
+ array (
214
+ ),
215
+ 'reference' => '36d09a8b8a3b8058214dae6eefb8ecdd98e0f0ba',
216
+ ),
217
+ 'dhii/stringable-interface' =>
218
+ array (
219
+ 'pretty_version' => 'v0.1',
220
+ 'version' => '0.1.0.0',
221
+ 'aliases' =>
222
+ array (
223
+ ),
224
+ 'reference' => 'b6653905eef2ebf377749feb80a6d18abbe913ef',
225
+ ),
226
+ 'dhii/transformer-interface' =>
227
+ array (
228
+ 'pretty_version' => 'v0.1-alpha1',
229
+ 'version' => '0.1.0.0-alpha1',
230
+ 'aliases' =>
231
+ array (
232
+ ),
233
+ 'reference' => 'e774efef46413eb34bdafc19a6bd74fbf656235d',
234
+ ),
235
+ 'dhii/validation-abstract' =>
236
+ array (
237
+ 'pretty_version' => 'v0.2-alpha1',
238
+ 'version' => '0.2.0.0-alpha1',
239
+ 'aliases' =>
240
+ array (
241
+ ),
242
+ 'reference' => 'dff998ba3476927a0fc6d10bb022425de8f1c844',
243
+ ),
244
+ 'dhii/validation-base' =>
245
+ array (
246
+ 'pretty_version' => 'v0.2-alpha2',
247
+ 'version' => '0.2.0.0-alpha2',
248
+ 'aliases' =>
249
+ array (
250
+ ),
251
+ 'reference' => '9e75c5f886a2403c6989c36c2d4ffcfae158172e',
252
+ ),
253
+ 'dhii/validation-interface' =>
254
+ array (
255
+ 'pretty_version' => 'v0.2',
256
+ 'version' => '0.2.0.0',
257
+ 'aliases' =>
258
+ array (
259
+ ),
260
+ 'reference' => 'a26026ae5cdf0a650b3511a22dbcb9329073b82c',
261
+ ),
262
+ 'erusev/parsedown' =>
263
+ array (
264
+ 'pretty_version' => '1.7.4',
265
+ 'version' => '1.7.4.0',
266
+ 'aliases' =>
267
+ array (
268
+ ),
269
+ 'reference' => 'cb17b6477dfff935958ba01325f2e8a2bfa6dab3',
270
+ ),
271
+ 'mnapoli/php-di' =>
272
+ array (
273
+ 'replaced' =>
274
+ array (
275
+ 0 => '*',
276
+ ),
277
+ ),
278
+ 'php-di/invoker' =>
279
+ array (
280
+ 'pretty_version' => '1.3.3',
281
+ 'version' => '1.3.3.0',
282
+ 'aliases' =>
283
+ array (
284
+ ),
285
+ 'reference' => '1f4ca63b9abc66109e53b255e465d0ddb5c2e3f7',
286
+ ),
287
+ 'php-di/php-di' =>
288
+ array (
289
+ 'pretty_version' => '5.2.2',
290
+ 'version' => '5.2.2.0',
291
+ 'aliases' =>
292
+ array (
293
+ ),
294
+ 'reference' => 'f574bcc841201ab04587b1c6da1234d4044f67d8',
295
+ ),
296
+ 'php-di/phpdoc-reader' =>
297
+ array (
298
+ 'pretty_version' => '2.1.1',
299
+ 'version' => '2.1.1.0',
300
+ 'aliases' =>
301
+ array (
302
+ ),
303
+ 'reference' => '15678f7451c020226807f520efb867ad26fbbfcf',
304
+ ),
305
+ 'psr/container' =>
306
+ array (
307
+ 'pretty_version' => '1.0.0',
308
+ 'version' => '1.0.0.0',
309
+ 'aliases' =>
310
+ array (
311
+ ),
312
+ 'reference' => 'b7ce3b176482dbbc1245ebf52b181af44c2cf55f',
313
+ ),
314
+ 'psr/log' =>
315
+ array (
316
+ 'pretty_version' => '1.1.2',
317
+ 'version' => '1.1.2.0',
318
+ 'aliases' =>
319
+ array (
320
+ ),
321
+ 'reference' => '446d54b4cb6bf489fc9d75f55843658e6f25d801',
322
+ ),
323
+ 'rebelcode/composer-cleanup-plugin' =>
324
+ array (
325
+ 'pretty_version' => 'v0.2',
326
+ 'version' => '0.2.0.0',
327
+ 'aliases' =>
328
+ array (
329
+ ),
330
+ 'reference' => '3677eb752eb8ca042ba6f725b33f419b93857a62',
331
+ ),
332
+ 'symfony/polyfill-ctype' =>
333
+ array (
334
+ 'pretty_version' => 'v1.13.1',
335
+ 'version' => '1.13.1.0',
336
+ 'aliases' =>
337
+ array (
338
+ ),
339
+ 'reference' => 'f8f0b461be3385e56d6de3dbb5a0df24c0c275e3',
340
+ ),
341
+ 'symfony/polyfill-mbstring' =>
342
+ array (
343
+ 'pretty_version' => 'v1.17.1',
344
+ 'version' => '1.17.1.0',
345
+ 'aliases' =>
346
+ array (
347
+ ),
348
+ 'reference' => '7110338d81ce1cbc3e273136e4574663627037a7',
349
+ ),
350
+ 'symfony/translation' =>
351
+ array (
352
+ 'pretty_version' => 'v2.8.52',
353
+ 'version' => '2.8.52.0',
354
+ 'aliases' =>
355
+ array (
356
+ ),
357
+ 'reference' => 'fc58c2a19e56c29f5ba2736ec40d0119a0de2089',
358
+ ),
359
+ 'twig/extensions' =>
360
+ array (
361
+ 'pretty_version' => 'v1.5.4',
362
+ 'version' => '1.5.4.0',
363
+ 'aliases' =>
364
+ array (
365
+ ),
366
+ 'reference' => '57873c8b0c1be51caa47df2cdb824490beb16202',
367
+ ),
368
+ 'twig/twig' =>
369
+ array (
370
+ 'pretty_version' => 'v1.41.0',
371
+ 'version' => '1.41.0.0',
372
+ 'aliases' =>
373
+ array (
374
+ ),
375
+ 'reference' => '575cd5028362da591facde1ef5d7b94553c375c9',
376
+ ),
377
+ 'wprss/core' =>
378
+ array (
379
+ 'pretty_version' => 'dev-develop',
380
+ 'version' => 'dev-develop',
381
+ 'aliases' =>
382
+ array (
383
+ ),
384
+ 'reference' => 'dbbd846351515ddbc9f72dc75ff1c3654e3bebf5',
385
+ ),
386
+ ),
387
+ );
vendor/composer/platform_check.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // platform_check.php @generated by Composer
4
+
5
+ $issues = array();
6
+
7
+ if (!(PHP_VERSION_ID >= 50400)) {
8
+ $issues[] = 'Your Composer dependencies require a PHP version ">= 5.4.0". You are running ' . PHP_VERSION . '.';
9
+ }
10
+
11
+ if ($issues) {
12
+ if (!headers_sent()) {
13
+ header('HTTP/1.1 500 Internal Server Error');
14
+ }
15
+ if (!ini_get('display_errors')) {
16
+ if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
17
+ fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
18
+ } elseif (!headers_sent()) {
19
+ echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
20
+ }
21
+ }
22
+ trigger_error(
23
+ 'Composer detected issues in your platform: ' . implode(' ', $issues),
24
+ E_USER_ERROR
25
+ );
26
+ }
vendor/rebelcode/composer-cleanup-plugin/composer.json CHANGED
@@ -14,7 +14,10 @@
14
  }
15
  ],
16
  "require": {
17
- "composer-plugin-api": "^1.0"
 
 
 
18
  },
19
  "autoload": {
20
  "psr-4": {
@@ -23,7 +26,7 @@
23
  },
24
  "extra": {
25
  "branch-alias": {
26
- "dev-master": "0.1-dev"
27
  },
28
  "class": "RebelCode\\Composer\\CleanupPlugin"
29
  }
14
  }
15
  ],
16
  "require": {
17
+ "composer-plugin-api": "^2.0"
18
+ },
19
+ "require-dev": {
20
+ "composer/composer": "^2.0"
21
  },
22
  "autoload": {
23
  "psr-4": {
26
  },
27
  "extra": {
28
  "branch-alias": {
29
+ "dev-master": "0.2"
30
  },
31
  "class": "RebelCode\\Composer\\CleanupPlugin"
32
  }
vendor/rebelcode/composer-cleanup-plugin/src/CleanupPlugin.php CHANGED
@@ -3,25 +3,31 @@
3
  namespace RebelCode\Composer;
4
 
5
  use Composer\Composer;
 
6
  use Composer\EventDispatcher\EventSubscriberInterface;
 
 
7
  use Composer\IO\IOInterface;
 
 
8
  use Composer\Plugin\PluginInterface;
9
- use Composer\Script\ScriptEvents;
10
- use Composer\Installer\PackageEvent;
11
- use Composer\Script\CommandEvent;
12
  use Composer\Util\Filesystem;
13
- use Composer\Package\BasePackage;
14
 
15
  class CleanupPlugin implements PluginInterface, EventSubscriberInterface
16
  {
17
- /** @var \Composer\Composer $composer */
18
  protected $composer;
19
- /** @var \Composer\IO\IOInterface $io */
 
20
  protected $io;
21
- /** @var \Composer\Config $config */
 
22
  protected $config;
23
- /** @var \Composer\Util\Filesystem $filesystem */
 
24
  protected $filesystem;
 
25
  /** @var array $rules */
26
  protected $rules;
27
 
@@ -37,25 +43,23 @@ class CleanupPlugin implements PluginInterface, EventSubscriberInterface
37
  $this->rules = CleanupRules::getRules();
38
  }
39
 
 
 
 
 
 
 
 
 
40
  /**
41
  * {@inheritDoc}
42
  */
43
  public static function getSubscribedEvents()
44
  {
45
- return array(
46
- ScriptEvents::POST_PACKAGE_INSTALL => array(
47
- array('onPostPackageInstall', 0)
48
- ),
49
- ScriptEvents::POST_PACKAGE_UPDATE => array(
50
- array('onPostPackageUpdate', 0)
51
- ),
52
- /*ScriptEvents::POST_INSTALL_CMD => array(
53
- array('onPostInstallUpdateCmd', 0)
54
- ),
55
- ScriptEvents::POST_UPDATE_CMD => array(
56
- array('onPostInstallUpdateCmd', 0)
57
- ),*/
58
- );
59
  }
60
 
61
  /**
@@ -63,7 +67,7 @@ class CleanupPlugin implements PluginInterface, EventSubscriberInterface
63
  */
64
  public function onPostPackageInstall(PackageEvent $event)
65
  {
66
- /** @var \Composer\Package\CompletePackage $package */
67
  $package = $event->getOperation()->getPackage();
68
 
69
  $this->cleanPackage($package);
@@ -74,7 +78,7 @@ class CleanupPlugin implements PluginInterface, EventSubscriberInterface
74
  */
75
  public function onPostPackageUpdate(PackageEvent $event)
76
  {
77
- /** @var \Composer\Package\CompletePackage $package */
78
  $package = $event->getOperation()->getTargetPackage();
79
 
80
  $this->cleanPackage($package);
@@ -83,15 +87,15 @@ class CleanupPlugin implements PluginInterface, EventSubscriberInterface
83
  /**
84
  * Function to run after a package has been updated
85
  *
86
- * @param CommandEvent $event
87
  */
88
- public function onPostInstallUpdateCmd(CommandEvent $event)
89
  {
90
- /** @var \Composer\Repository\WritableRepositoryInterface $repository */
91
  $repository = $this->composer->getRepositoryManager()->getLocalRepository();
92
 
93
- /** @var \Composer\Package\CompletePackage $package */
94
- foreach($repository->getPackages() as $package){
95
  if ($package instanceof BasePackage) {
96
  $this->cleanPackage($package);
97
  }
@@ -118,7 +122,7 @@ class CleanupPlugin implements PluginInterface, EventSubscriberInterface
118
 
119
  $rules = isset($this->rules[$packageName]) ? $this->rules[$packageName] : null;
120
  if(!$rules){
121
- return;
122
  }
123
 
124
  $dir = $this->filesystem->normalizePath(realpath($vendorDir . '/' . $packageDir));
3
  namespace RebelCode\Composer;
4
 
5
  use Composer\Composer;
6
+ use Composer\Config;
7
  use Composer\EventDispatcher\EventSubscriberInterface;
8
+ use Composer\Installer\PackageEvent;
9
+ use Composer\Installer\PackageEvents;
10
  use Composer\IO\IOInterface;
11
+ use Composer\Package\BasePackage;
12
+ use Composer\Package\CompletePackage;
13
  use Composer\Plugin\PluginInterface;
14
+ use Composer\Repository\WritableRepositoryInterface;
 
 
15
  use Composer\Util\Filesystem;
 
16
 
17
  class CleanupPlugin implements PluginInterface, EventSubscriberInterface
18
  {
19
+ /** @var Composer $composer */
20
  protected $composer;
21
+
22
+ /** @var IOInterface $io */
23
  protected $io;
24
+
25
+ /** @var Config $config */
26
  protected $config;
27
+
28
+ /** @var Filesystem $filesystem */
29
  protected $filesystem;
30
+
31
  /** @var array $rules */
32
  protected $rules;
33
 
43
  $this->rules = CleanupRules::getRules();
44
  }
45
 
46
+ public function deactivate(Composer $composer, IOInterface $io)
47
+ {
48
+ }
49
+
50
+ public function uninstall(Composer $composer, IOInterface $io)
51
+ {
52
+ }
53
+
54
  /**
55
  * {@inheritDoc}
56
  */
57
  public static function getSubscribedEvents()
58
  {
59
+ return [
60
+ PackageEvents::POST_PACKAGE_INSTALL => 'onPostPackageInstall',
61
+ PackageEvents::POST_PACKAGE_UPDATE => 'onPostPackageUpdate',
62
+ ];
 
 
 
 
 
 
 
 
 
 
63
  }
64
 
65
  /**
67
  */
68
  public function onPostPackageInstall(PackageEvent $event)
69
  {
70
+ /** @var CompletePackage $package */
71
  $package = $event->getOperation()->getPackage();
72
 
73
  $this->cleanPackage($package);
78
  */
79
  public function onPostPackageUpdate(PackageEvent $event)
80
  {
81
+ /** @var CompletePackage $package */
82
  $package = $event->getOperation()->getTargetPackage();
83
 
84
  $this->cleanPackage($package);
87
  /**
88
  * Function to run after a package has been updated
89
  *
90
+ * @param PackageEvent $event
91
  */
92
+ public function onPostInstallUpdateCmd(PackageEvent $event)
93
  {
94
+ /** @var WritableRepositoryInterface $repository */
95
  $repository = $this->composer->getRepositoryManager()->getLocalRepository();
96
 
97
+ /** @var CompletePackage $package */
98
+ foreach ($repository->getPackages() as $package) {
99
  if ($package instanceof BasePackage) {
100
  $this->cleanPackage($package);
101
  }
122
 
123
  $rules = isset($this->rules[$packageName]) ? $this->rules[$packageName] : null;
124
  if(!$rules){
125
+ return false;
126
  }
127
 
128
  $dir = $this->filesystem->normalizePath(realpath($vendorDir . '/' . $packageDir));
wp-rss-aggregator.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin Name: WP RSS Aggregator
5
  * Plugin URI: https://www.wprssaggregator.com/#utm_source=wpadmin&utm_medium=plugin&utm_campaign=wpraplugin
6
  * Description: Imports and aggregates multiple RSS Feeds.
7
- * Version: 4.17.10
8
  * Author: RebelCode
9
  * Author URI: https://www.wprssaggregator.com
10
  * Text Domain: wprss
@@ -76,7 +76,7 @@ use RebelCode\Wpra\Core\Plugin;
76
 
77
  // Set the version number of the plugin.
78
  if( !defined( 'WPRSS_VERSION' ) )
79
- define( 'WPRSS_VERSION', '4.17.10' );
80
 
81
  if( !defined( 'WPRSS_WP_MIN_VERSION' ) )
82
  define( 'WPRSS_WP_MIN_VERSION', '4.8' );
@@ -318,6 +318,9 @@ require_once ( WPRSS_INC . 'polyfills.php' );
318
  /* Load the youtube functionality */
319
  require_once ( WPRSS_INC . 'youtube.php' );
320
 
 
 
 
321
  /* Load the Templates v0.2.1 update path */
322
  require_once ( WPRSS_INC . 'templates-update.php' );
323
 
4
  * Plugin Name: WP RSS Aggregator
5
  * Plugin URI: https://www.wprssaggregator.com/#utm_source=wpadmin&utm_medium=plugin&utm_campaign=wpraplugin
6
  * Description: Imports and aggregates multiple RSS Feeds.
7
+ * Version: 4.18
8
  * Author: RebelCode
9
  * Author URI: https://www.wprssaggregator.com
10
  * Text Domain: wprss
76
 
77
  // Set the version number of the plugin.
78
  if( !defined( 'WPRSS_VERSION' ) )
79
+ define( 'WPRSS_VERSION', '4.18' );
80
 
81
  if( !defined( 'WPRSS_WP_MIN_VERSION' ) )
82
  define( 'WPRSS_WP_MIN_VERSION', '4.8' );
318
  /* Load the youtube functionality */
319
  require_once ( WPRSS_INC . 'youtube.php' );
320
 
321
+ /* Load the multi-media file */
322
+ require_once ( WPRSS_INC . 'multimedia.php' );
323
+
324
  /* Load the Templates v0.2.1 update path */
325
  require_once ( WPRSS_INC . 'templates-update.php' );
326