WP RSS Aggregator - Version 4.17.3

Version Description

(2020-01-23) = Changed - Updated code to fix deprecation warnings on PHP version 7.4 and later. - Updated the Twig library to version 1.41.0 to fix deprecation warnings on PHP version 7.4 and later. - Updated the default translation files to contain up-to-date text.

Fixed - Removed a false-positive error from the log. - Localization in Twig templates did not work. - When revisions are enabled, an error would prevent feed sources from being saved. - Translations were being loaded from an invalid path. - The default featured image in the New/Edit Feed Source page did not preview after saving the feed source. - Missing space between the link a tag and the href attribute on PHP 7.4

Download this release

Release Info

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

Code changes from version 4.17.2 to 4.17.3

Files changed (126) hide show
  1. CHANGELOG.md +17 -0
  2. css/src/common/index.scss +0 -3
  3. css/src/common/info-box.scss +0 -16
  4. css/src/common/notice-block.scss +0 -64
  5. css/src/gutenberg-block/index.scss +0 -14
  6. css/src/intro/animation.scss +0 -48
  7. css/src/intro/expander.scss +0 -26
  8. css/src/intro/loading.scss +0 -131
  9. css/src/intro/steps.scss +0 -647
  10. css/src/mixins.scss +0 -32
  11. css/src/pagination/index.scss +0 -10
  12. css/src/plugins/form.scss +0 -48
  13. css/src/plugins/index.scss +0 -25
  14. css/src/plugins/modal.scss +0 -173
  15. css/src/templates/bottom-panel.scss +0 -15
  16. css/src/templates/grid.scss +0 -18
  17. css/src/templates/index.scss +0 -216
  18. css/src/templates/loading.scss +0 -220
  19. css/src/templates/notifications.scss +0 -28
  20. css/src/update/index.scss +0 -149
  21. includes/Aventura/Wprss/Core/Model/AssetsAbstract.php +2 -2
  22. includes/admin-debugging.php +0 -341
  23. includes/cron-jobs.php +1 -1
  24. includes/feed-importing.php +8 -2
  25. includes/functions.php +34 -0
  26. includes/scripts.php +12 -3
  27. js/admin/tools/crons.js +467 -182
  28. js/src/components/BottomPanel.vue +0 -9
  29. js/src/components/Button.js +0 -14
  30. js/src/components/Expander.vue +0 -36
  31. js/src/components/Input.js +0 -100
  32. js/src/components/Layout.js +0 -11
  33. js/src/components/Main.js +0 -11
  34. js/src/components/MediaInput.js +0 -96
  35. js/src/components/Modal.vue +0 -114
  36. js/src/components/NoticeBlock.js +0 -143
  37. js/src/components/Postbox.vue +0 -44
  38. js/src/components/RouteLink.js +0 -27
  39. js/src/components/RouterApp.js +0 -47
  40. js/src/components/SerializedForm.vue +0 -89
  41. js/src/components/Sidebar.js +0 -11
  42. js/src/components/TransitionExpand.vue +0 -66
  43. js/src/components/index.js +0 -15
  44. js/src/libs/NotificationCenter.js +0 -45
  45. js/src/libs/Router.js +0 -122
  46. js/src/mixins/DataChangesAware.js +0 -47
  47. js/src/modules/gutenberg-block/components/MultipleSelectControl.js +0 -85
  48. js/src/modules/gutenberg-block/index.js +0 -209
  49. js/src/modules/intro/Wizard.vue +0 -440
  50. js/src/modules/intro/index.js +0 -11
  51. js/src/modules/pagination/index.js +0 -47
  52. js/src/modules/plugins/PluginDisablePoll.vue +0 -122
  53. js/src/modules/plugins/index.js +0 -10
  54. js/src/modules/templates/Edit.js +0 -491
  55. js/src/modules/templates/List.js +0 -350
  56. js/src/modules/templates/app.js +0 -117
  57. js/src/modules/templates/index.js +0 -36
  58. js/src/modules/templates/store/actions.js +0 -1
  59. js/src/modules/templates/store/getters.js +0 -7
  60. js/src/modules/templates/store/index.js +0 -12
  61. js/src/modules/templates/store/mutations.js +0 -10
  62. js/src/modules/templates/store/state.js +0 -18
  63. js/src/utils/Collection.js +0 -178
  64. js/src/utils/base64.js +0 -133
  65. js/src/utils/copy.js +0 -43
  66. js/src/utils/deepmerge.js +0 -72
  67. js/src/utils/fetch.js +0 -26
  68. js/src/utils/jsonClone.js +0 -3
  69. languages/default.mo +0 -0
  70. languages/default.po +2025 -856
  71. readme.txt +15 -1
  72. src/Handlers/FeedSources/FeedSourceSaveMetaHandler.php +5 -0
  73. src/Modules/CoreModule.php +8 -0
  74. src/Modules/I18nModule.php +14 -4
  75. src/Modules/ImagesModule.php +8 -3
  76. src/RestApi/EndPoints/Handlers/GetEntityHandler.php +9 -9
  77. src/Twig/Extensions/I18n/I18nTransNode.php +1 -1
  78. src/Twig/Extensions/WpraExtension.php +5 -2
  79. templates/admin/feeds/images-meta-box.twig +1 -1
  80. templates/admin/tools/crons.twig +105 -48
  81. test/bootstrap.php +0 -21
  82. vendor/autoload.php +1 -1
  83. vendor/composer/autoload_classmap.php +2 -0
  84. vendor/composer/autoload_psr4.php +7 -7
  85. vendor/composer/autoload_real.php +7 -7
  86. vendor/composer/autoload_static.php +23 -21
  87. vendor/composer/installed.json +32 -29
  88. vendor/dhii/output-renderer-interface/src/BlockFactoryInterface.php +3 -3
  89. vendor/dhii/output-renderer-interface/src/TemplateFactoryInterface.php +3 -3
  90. vendor/erusev/parsedown/Parsedown.php +23 -4
  91. vendor/symfony/polyfill-ctype/composer.json +1 -1
  92. vendor/twig/twig/composer.json +1 -1
  93. vendor/twig/twig/drupal_test.sh +51 -0
  94. vendor/twig/twig/src/Environment.php +4 -3
  95. vendor/twig/twig/src/Error/Error.php +0 -6
  96. vendor/twig/twig/src/ExpressionParser.php +69 -6
  97. vendor/twig/twig/src/Extension/CoreExtension.php +46 -1
  98. vendor/twig/twig/src/Extension/DebugExtension.php +1 -1
  99. vendor/twig/twig/src/Extension/StringLoaderExtension.php +3 -3
  100. vendor/twig/twig/src/Lexer.php +41 -35
  101. vendor/twig/twig/src/Loader/FilesystemLoader.php +26 -5
  102. vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php +64 -0
  103. vendor/twig/twig/src/Node/Expression/NameExpression.php +8 -1
  104. vendor/twig/twig/src/Node/ImportNode.php +1 -1
  105. vendor/twig/twig/src/Node/MacroNode.php +1 -1
  106. vendor/twig/twig/src/Node/Node.php +2 -2
  107. vendor/twig/twig/src/Node/SetNode.php +1 -1
  108. vendor/twig/twig/src/Node/SpacelessNode.php +1 -1
  109. vendor/twig/twig/src/NodeTraverser.php +5 -1
  110. vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php +3 -1
  111. vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php +1 -1
  112. vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php +1 -1
  113. vendor/twig/twig/src/Profiler/Profile.php +1 -1
  114. vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php +1 -1
  115. vendor/twig/twig/src/Template.php +16 -3
  116. vendor/twig/twig/src/TemplateWrapper.php +12 -2
  117. vendor/twig/twig/src/Test/IntegrationTestCase.php +1 -1
  118. vendor/twig/twig/src/Test/NodeTestCase.php +1 -1
  119. vendor/twig/twig/src/Token.php +6 -0
  120. vendor/twig/twig/src/TokenParser/AbstractTokenParser.php +3 -0
  121. vendor/twig/twig/src/TokenParser/ApplyTokenParser.php +58 -0
  122. vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php +3 -0
  123. vendor/twig/twig/src/TokenParser/MacroTokenParser.php +3 -0
  124. webpack/webpack.react.js +0 -145
  125. webpack/webpack.vue.js +0 -109
  126. wp-rss-aggregator.php +3 -3
CHANGELOG.md CHANGED
@@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file.
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
  and this project adheres to [Semantic Versioning](http://semver.org/).
6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  ## [4.17.2] - 2019-12-19
8
  ### Added
9
  * The error handler now includes the file and line where the error occurred.
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
  and this project adheres to [Semantic Versioning](http://semver.org/).
6
 
7
+ ## [4.17.3] - 2020-01-23
8
+ ### Changed
9
+ * Updated code to fix deprecation warnings on PHP version 7.4 and later.
10
+ * Updated the Twig library to version `1.41.0` to fix deprecation warnings on PHP version 7.4 and later.
11
+ * Updated the default translation files to contain up-to-date text.
12
+
13
+ ### Fixed
14
+ * Removed a false-positive error from the log.
15
+ * Localization in Twig templates did not work.
16
+ * When revisions are enabled, an error would prevent feed sources from being saved.
17
+ * Translations were being loaded from an invalid path.
18
+ * The default featured image in the New/Edit Feed Source page did not preview after saving the feed source.
19
+ * Missing space between the link `a` tag and the `href` attribute on PHP 7.4
20
+
21
+ ### Removed
22
+ * Removed warning when trying to blacklist a non-imported post.
23
+
24
  ## [4.17.2] - 2019-12-19
25
  ### Added
26
  * The error handler now includes the file and line where the error occurred.
css/src/common/index.scss DELETED
@@ -1,3 +0,0 @@
1
- @import "./../mixins";
2
- @import "notice-block";
3
- @import "info-box";
 
 
 
css/src/common/info-box.scss DELETED
@@ -1,16 +0,0 @@
1
- .wpra-info-box {
2
- background: #daf4ff;
3
- padding: 8px 12px;
4
- border-radius: 3px;
5
- display: flex;
6
-
7
- &__icon {
8
- opacity: .4;
9
- flex-shrink: 0;
10
- }
11
-
12
- &__text {
13
- flex-grow: 1;
14
- padding-left: 8px;
15
- }
16
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/common/notice-block.scss DELETED
@@ -1,64 +0,0 @@
1
- .wpra-notice-block {
2
- background-color: white;
3
- box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
4
- padding: 12px 16px;
5
- margin-top: .5rem;
6
- margin-bottom: .15rem;
7
- //border-left: 4px solid #ff792b;
8
-
9
- &.postbox {
10
- margin-top: 0;
11
- margin-bottom: 20px;
12
- box-shadow: 0;
13
-
14
- .wpra-notice-block__body {
15
- font-size: 14px;
16
- opacity: .8;
17
- }
18
- }
19
-
20
- &__title {
21
- font-size: 22px;
22
- padding: .5rem 0 1rem;
23
- max-width: 65rem;
24
- }
25
-
26
- &__body {
27
- line-height: 1.5;
28
- font-size: 16px;
29
- opacity: .7;
30
- max-width: 65rem;
31
- }
32
-
33
- &__buttons {
34
- padding: 1rem 0 .5rem;
35
-
36
- .button {
37
- height: 34px;
38
- line-height: 32px;
39
- padding: 0 16px 2px;
40
-
41
- .dashicons {
42
- font-size: 16px;
43
- vertical-align: middle;
44
- opacity: .75;
45
- margin-left: 2px;
46
- }
47
-
48
- &-clear {
49
- margin-left: 8px;
50
- font-weight: 500;
51
- color: #0085ba;
52
- border: none;
53
- background: none;
54
- box-shadow: none;
55
-
56
- &:hover, &:active, &:focus {
57
- border: none;
58
- background: none;
59
- box-shadow: none;
60
- }
61
- }
62
- }
63
- }
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/gutenberg-block/index.scss DELETED
@@ -1,14 +0,0 @@
1
- .wpra-gutenberg-block, [data-type="wpra-shortcode/wpra-shortcode"] {
2
- .wpra-item {
3
- // Prevent clicking on feed item links.
4
- a {
5
- pointer-events: none !important;
6
- }
7
- }
8
- }
9
-
10
- .nav-links::after {
11
- display: block;
12
- content: '';
13
- clear: both;
14
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/intro/animation.scss DELETED
@@ -1,48 +0,0 @@
1
- .wrpa-expander {
2
- will-change: height;
3
- transform: translateZ(0);
4
- backface-visibility: hidden;
5
- perspective: 1000px;
6
- }
7
-
8
- .expand-enter-active,
9
- .expand-leave-active {
10
- transition: height .35s ease;
11
- overflow: hidden;
12
- }
13
-
14
- .expand-enter,
15
- .expand-leave-to {
16
- height: 0;
17
- }
18
-
19
- .fade-enter, .fade-leave-to {
20
- opacity: 0;
21
- }
22
- .fade-enter-active, .fade-leave-active {
23
- transition: opacity .3s ease;
24
- }
25
-
26
- .slide-up-enter {
27
- transform: translateY(10px);
28
- opacity: 0;
29
- }
30
- .slide-up-leave-to {
31
- transform: translateY(-10px);
32
- opacity: 0;
33
- }
34
- .slide-up-enter-active, .slide-up-leave-active {
35
- transition: all .3s ease;
36
- }
37
-
38
- .slide-down-enter {
39
- transform: translateY(-10px);
40
- opacity: 0;
41
- }
42
- .slide-down-leave-to {
43
- transform: translateY(10px);
44
- opacity: 0;
45
- }
46
- .slide-down-enter-active, .slide-down-leave-active {
47
- transition: all .3s ease;
48
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/intro/expander.scss DELETED
@@ -1,26 +0,0 @@
1
- .wpra-expander {
2
- &__title {
3
- cursor: pointer;
4
- user-select: none;
5
- span {
6
- opacity: .5;
7
- vertical-align: bottom;
8
- transition: transform .3s ease;
9
- }
10
- }
11
- &__content {
12
- padding: 0 .5rem;
13
- opacity: 0;
14
- transition: opacity .3s ease;
15
- }
16
- &--expanded {
17
- .wpra-expander__content {
18
- opacity: 1;
19
- }
20
- .wpra-expander__title {
21
- span {
22
- transform: rotate(180deg);
23
- }
24
- }
25
- }
26
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/intro/loading.scss DELETED
@@ -1,131 +0,0 @@
1
- [v-cloak] {
2
- .vcloak {
3
- &--visible {
4
- display: block;
5
- }
6
- &--hidden {
7
- display: none;
8
- }
9
- }
10
- }
11
- .vcloak {
12
- &--visible {
13
- min-height: 60px;
14
- display: none;
15
- }
16
- }
17
-
18
- .loading-container {
19
- position: relative;
20
- &:before {
21
- display: block;
22
- content: '';
23
- position: absolute;
24
- left: calc(50% - 20px);
25
- top: calc(50% - 20px);
26
- box-sizing: border-box;
27
- height: 40px;
28
- width: 40px;
29
- border: 0px solid #d0d0d0;
30
- border-radius: 50%;
31
- box-shadow: 0 -12px 0 16px #d0d0d0 inset;
32
- animation: rotate 1s infinite linear;
33
- z-index: 3;
34
- }
35
- &:after {
36
- display: block;
37
- content: '';
38
- position: absolute;
39
- z-index: 2;
40
- background-color: rgba(241, 241, 241, 0.5);
41
- width: 100%;
42
- height: 100%;
43
- left: 0;
44
- top: 0;
45
- }
46
- &--white {
47
- &:after {
48
- background-color: white;
49
- }
50
- }
51
- }
52
-
53
-
54
- .loading-button {
55
- pointer-events: none;
56
- position: relative;
57
- &:before {
58
- display: block;
59
- content: '';
60
- position: absolute;
61
- left: calc(50% - 8px);
62
- top: calc(50% - 8px);
63
- box-sizing: border-box;
64
- height: 16px;
65
- width: 16px;
66
- border: 0px solid #fff;
67
- border-radius: 50%;
68
- box-shadow: 0 -4px 0 6px #fff inset;
69
- animation: rotate 1s infinite linear;
70
- z-index: 3;
71
- }
72
- &:after {
73
- display: block;
74
- content: '';
75
- position: absolute;
76
- z-index: 2;
77
- background-color: inherit;
78
- width: 100%;
79
- height: 100%;
80
- left: 0;
81
- top: 0;
82
- }
83
- }
84
-
85
- .button-default {
86
- &.loading-button:before {
87
- box-shadow: inset 0 -4px 0 6px #6f6f6f;
88
- }
89
- }
90
-
91
- .loading-inline {
92
- display: inline-block;
93
- pointer-events: none;
94
- position: relative;
95
- &:before {
96
- display: block;
97
- content: '';
98
- position: absolute;
99
- left: calc(50% + 1px);
100
- top: calc(50% - 11px);
101
- box-sizing: border-box;
102
- height: 14px;
103
- width: 14px;
104
- border: 0px solid #d0d0d0;
105
- border-radius: 50%;
106
- box-shadow: 0 -3px 0 5px #d0d0d0 inset;
107
- animation: rotate 1s infinite linear;
108
- z-index: 3;
109
- }
110
- &:after {
111
- display: block;
112
- content: '';
113
- position: absolute;
114
- z-index: 2;
115
- background-color: inherit;
116
- width: 100%;
117
- height: 100%;
118
- left: 0;
119
- top: 0;
120
- }
121
- }
122
-
123
-
124
- @keyframes rotate {
125
- 0% {
126
- transform: rotate(0deg);
127
- }
128
- 100% {
129
- transform: rotate(360deg);
130
- }
131
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/intro/steps.scss DELETED
@@ -1,647 +0,0 @@
1
- $dark-gray: transparentize(#000, .25);
2
- $medium-gray: transparentize(#000, .5);
3
- $deep-gray: transparentize(#000, .95);
4
- $light-gray: transparentize(#000, .95);
5
- $borderColor: transparentize(#000, .95);
6
- $white: #fff;
7
- $button-radius: 4px;
8
-
9
- $wizard-width: 42rem;
10
-
11
- $success-color: #00b479;
12
- $primary-color: #1a53e6;
13
-
14
- @import "animation";
15
- @import "expander";
16
- @import "loading";
17
-
18
- @mixin clear() {
19
- &:after {
20
- clear: both;
21
- display: block;
22
- content: '';
23
- }
24
- }
25
-
26
- @mixin breakpoint($point) {
27
- @if $point == desktop {
28
- @media (min-width: 70em) { @content ; }
29
- }
30
- @else if $point == laptop {
31
- @media (min-width: 64em) { @content ; }
32
- }
33
- @else if $point == tablet {
34
- @media (max-width: 50em) { @content ; }
35
- }
36
- @else if $point == phablet {
37
- @media (min-width: 37.5em) { @content ; }
38
- }
39
- @else if $point == mobileonly {
40
- @media (max-width: 37.5em) { @content ; }
41
-
42
- }
43
- }
44
-
45
- .wpra-wizard-head {
46
- display: flex;
47
- padding-bottom: 1.5rem;
48
- padding-top: .75rem;
49
- &__logo {
50
- flex-shrink: 0;
51
- img {
52
- width: 57px;
53
- }
54
- }
55
- &__copy {
56
- flex-grow: 1;
57
- padding-left: 1rem;
58
- display: flex;
59
- flex-direction: column;
60
- justify-content: center;
61
- }
62
- &__title {
63
- font-size: 1.25rem;
64
- font-weight: 500;
65
- padding-bottom: 12px;
66
- }
67
- &__subtitle {
68
- font-size: 1rem;
69
- opacity: .85;
70
- }
71
- }
72
-
73
- .wpra-cols {
74
- &-title {
75
- font-weight: normal;
76
- font-size: 1rem;
77
- padding-bottom: 1rem;
78
- }
79
-
80
- display: flex;
81
- margin: 0 -.5rem;
82
- border-top: 2px solid rgba(0,0,0,.05);
83
- padding-top: 1.45rem;
84
-
85
- @include breakpoint(tablet) {
86
- flex-wrap: wrap;
87
- }
88
- .col {
89
- flex-basis: 50%;
90
- padding: 0 .5rem;
91
-
92
- @include breakpoint(tablet) {
93
- flex-basis: 100%;
94
- padding-bottom: 1rem;
95
- }
96
-
97
- img {
98
- max-width: 100%;
99
- }
100
-
101
- p {
102
- font-size: 14px;
103
- line-height: 1.6;
104
- }
105
- p:first-child {
106
- margin-top: 0;
107
- }
108
- }
109
- }
110
-
111
- .wpra-feed-input {
112
- width: 26rem;
113
- padding: 6px 10px;
114
- max-width: 100%;
115
- }
116
-
117
- .wpra-feedback {
118
- display: flex;
119
- &__photo {
120
- flex-shrink: 0;
121
- img {
122
- width: 70px;
123
- border-radius: 100%;
124
- }
125
- }
126
- &__copy {
127
- padding-left: .5rem;
128
- flex-grow: 1;
129
- }
130
- &__text {
131
- font-size: 1rem;
132
- font-family: Georgia, serif;
133
- font-style: italic;
134
- line-height: 1.5;
135
- }
136
- &__rating {
137
- padding: .25rem 0 .45rem;
138
- span {
139
- color: #f8ca29;
140
- }
141
- }
142
- &__by {
143
- opacity: .85;
144
- a {
145
- color: #617181;
146
- }
147
- }
148
- }
149
-
150
- .wpra-demo-photo {
151
- margin-bottom: 1rem;
152
- border-radius: 4px;
153
- border: 1px solid rgba(0, 0, 0, 0.15);
154
- }
155
-
156
- .wpra-feed-items {
157
- padding-left: .5rem;
158
- margin-bottom: 1rem;
159
- border-left: 4px solid #ff792b;
160
- .wpra-feed-item {
161
- padding: .75rem;
162
- &__link {
163
- padding-bottom: 4px;
164
- }
165
- }
166
- }
167
-
168
- .step-items {
169
- $size: 35px;
170
-
171
- display: flex;
172
- position: relative;
173
-
174
- flex-direction: column;
175
- align-items: flex-end;
176
-
177
- .step-progress {
178
- position: absolute;
179
- width: 3px;
180
- height: 0;
181
- background-color: $success-color;
182
- left: $size / 2;
183
- top: 0;
184
- transition: height .3s ease;
185
- z-index: -1;
186
- &--1 {
187
- height: 50%;
188
- }
189
- &--2 {
190
- height: 100%;
191
- }
192
-
193
- @include breakpoint(tablet) {
194
- display: none;
195
- }
196
- }
197
-
198
- @include breakpoint(tablet) {
199
- padding: .625rem;
200
- flex-direction: row;
201
- align-items: flex-start;
202
- }
203
-
204
- .step-item {
205
- font-size: 16px;
206
- width: 15rem;
207
- margin-bottom: 2.25rem;
208
- display: flex;
209
- background-color: #f1f1f1;
210
-
211
- &:last-child {
212
- margin-bottom: 0;
213
- }
214
-
215
- @include breakpoint(tablet) {
216
- flex-direction: column;
217
- margin-bottom: 0;
218
- align-items: center;
219
- }
220
-
221
- &_active {
222
- .step-item__info {
223
- opacity: 1;
224
- }
225
- .step-item__status {
226
- opacity: 1;
227
- }
228
- opacity: 1;
229
- @include breakpoint(tablet) {
230
- flex-grow: 1;
231
- }
232
- }
233
- &__title {
234
- }
235
- &__description {
236
- //color: $dark-gray;
237
- font-size: 14px;
238
- }
239
-
240
- &__info {
241
- display: flex;
242
- align-items: center;
243
- padding-left: .75rem;
244
- opacity: .5;
245
- @include breakpoint(tablet) {
246
- padding-left: 0;
247
- padding-top: .3rem;
248
- display: none;
249
- }
250
- }
251
-
252
- &__status {
253
- width: $size;
254
- height: $size;
255
- border-radius: 50%;
256
- border: 2px dashed $medium-gray;
257
- flex-shrink: 0;
258
- opacity: .5;
259
-
260
- text-align: center;
261
- font-size: 1.25rem;
262
- line-height: 2.375rem;
263
-
264
- color: $success-color;
265
-
266
- span {
267
- display: block;
268
- margin: 0 !important;
269
- width: 100%;
270
- line-height: 35px;
271
- font-size: 26px;
272
- }
273
- }
274
-
275
- &_completed {
276
- opacity: 1;
277
- .step-item {
278
- &__status {
279
- border-style: solid;
280
- border-color: $success-color;
281
- opacity: 1;
282
-
283
- span {
284
- position: relative;
285
- }
286
- }
287
- &__info {
288
- opacity: .5;
289
- }
290
- }
291
- }
292
- }
293
- }
294
-
295
- .wizard {
296
- width: 100%;
297
- margin-left: 1rem;
298
-
299
- @include breakpoint(tablet) {
300
- margin-left: 0;
301
- }
302
-
303
- ol {
304
- margin-left: 1.5rem;
305
- line-height: 1.5;
306
- font-size: 13px;
307
- ul {
308
- margin-bottom: 1rem;
309
- }
310
- }
311
-
312
- .form-group {
313
- display: flex;
314
- align-items: center;
315
- @include breakpoint(tablet) {
316
- display: block;
317
- align-items: unset;
318
- input {
319
- margin-bottom: 8px;
320
- }
321
- }
322
- input {
323
- flex-shrink: 0;
324
- }
325
- .warning-icon {
326
- padding-left: 4px;
327
- color: #ee5a65;
328
- }
329
- a {
330
- flex-shrink: 0;
331
- margin-left: 6px;
332
- }
333
- }
334
-
335
- .button-clear {
336
- background-color: transparent;
337
- border: none;
338
- cursor: pointer;
339
- height: 30px;
340
- line-height: 28px;
341
- padding: 0 12px 2px;
342
- vertical-align: baseline;
343
-
344
- opacity: .55;
345
- &:hover {
346
- opacity: .8;
347
- }
348
- }
349
-
350
- .button {
351
- vertical-align: baseline !important;
352
- }
353
-
354
- .pad {
355
- display: flex;
356
- &-item {
357
- &--grow {
358
- flex-grow: 1;
359
- }
360
- &--no-shrink {
361
- flex-shrink: 0;
362
- }
363
- }
364
- }
365
-
366
- .wpra-success {
367
- padding-right: 1rem;
368
- font-size: 14px;
369
- }
370
-
371
- &_content {
372
- padding: 1rem;
373
- font-size: 14px;
374
- max-width: $wizard-width;
375
- min-height: 16rem;
376
- padding-top: 12px;
377
-
378
- @include breakpoint(tablet) {
379
- padding: 0;
380
- }
381
- }
382
-
383
- &-holder {
384
- width: 100%;
385
- position: relative;
386
- display: flex;
387
- //align-items: center;
388
- //justify-content: center;
389
-
390
- @include breakpoint(tablet) {
391
- flex-direction: column;
392
- }
393
-
394
- .connect-steps {
395
- flex-shrink: 0;
396
- max-width: 450px;
397
- padding: 1rem;
398
-
399
- @include breakpoint(tablet) {
400
- max-width: 100%;
401
- flex-basis: auto;
402
- padding: .5rem;
403
- }
404
- }
405
-
406
- .wizard {
407
- //background-color: #00aced;
408
-
409
- flex-grow: 1;
410
- }
411
- }
412
-
413
- &_text {
414
- padding: 0 0 25px 0;
415
- max-width: 480px;
416
- font-size: 14px;
417
- }
418
-
419
- &_more {
420
- user-select: none;
421
- display: inline-block;
422
- color: $medium-gray;
423
- font-size: 12px;
424
- margin-top: 20px;
425
-
426
- &:hover {
427
- cursor: pointer;
428
- text-decoration: underline;
429
- }
430
- }
431
-
432
- &_hello {
433
- font-size: 18px;
434
- margin: 15px 0 10px 0;
435
- img {
436
- height: 26px;
437
- vertical-align: sub;
438
- margin-right: 3px;
439
- }
440
- }
441
-
442
- &_button {
443
- min-width: 137px;
444
- margin: 0 .3rem 1rem .3rem;
445
- }
446
-
447
- &_buttons {
448
- margin: 0 -.5rem;
449
- display: flex;
450
-
451
- @include breakpoint(tablet) {
452
- flex-direction: row;
453
- flex-wrap: wrap;
454
- }
455
- }
456
- &_network {
457
- //flex-shrink: 1;
458
- //width: 33%;
459
- padding: 0 .5rem;
460
- margin-bottom: .35rem;
461
- //text-align: center;
462
-
463
- .button {
464
- min-width: 145px;
465
- text-align: center;
466
- i {
467
- margin-left: 4px;
468
- }
469
- }
470
-
471
- .button-transparent {
472
- margin-bottom: 10px;
473
- }
474
-
475
- &-icon {
476
- width: 50px;
477
- height: 50px;
478
- border-radius: 100%;
479
- background-color: lighten($light-gray, 7);
480
- margin: 0 auto .8rem auto;
481
- i {
482
- font-size: 22px;
483
- line-height: 50px;
484
- }
485
- }
486
- }
487
-
488
- &_list {
489
- padding: 10px 0;
490
- display: flex;
491
- flex-wrap: wrap;
492
- margin: 0 -0.3125rem;
493
- max-width: 49rem;
494
- }
495
-
496
- &_item {
497
- padding: 5px;
498
- margin: 5px;
499
- border: 1px solid $borderColor;
500
- display: flex;
501
-
502
- width: 31%;
503
- align-items: center;
504
-
505
- @include breakpoint(tablet) {
506
- width: 100%;
507
- margin: 0;
508
- margin-bottom: .625rem;
509
- }
510
-
511
- vertical-align: middle;
512
- border-radius: $button-radius;
513
- text-align: left;
514
-
515
- .description {
516
- font-size: 12px;
517
- color: $dark-gray;
518
- margin-top: 2px;
519
- }
520
-
521
- .account-item_picture {
522
- float: none;
523
- margin-right: 10px;
524
- flex-shrink: 0;
525
- }
526
- }
527
-
528
- /*
529
- * This is form
530
- */
531
- &_info {
532
- max-width: 20rem;
533
- text-align: left;
534
-
535
- .form-group {
536
- margin-bottom: 1rem;
537
- }
538
- }
539
-
540
- &_label {
541
- font-size: 1rem;
542
- padding-top: .2rem;
543
- padding-bottom: .75rem;
544
- }
545
- }
546
-
547
- .wrpa-shortcode {
548
- display: flex;
549
- &-form, &-preview {
550
- padding-bottom: 10px;
551
- padding-right: 75px;
552
- flex-basis: 50%;
553
- .wrpa-shortcode-label {
554
- font-size: 1rem;
555
- padding-bottom: 12px;
556
- line-height: 1.5;
557
- }
558
- .button.loading-button {
559
- &::before {
560
- box-shadow: inset 0 -4px 0 6px #797979 !important;
561
- }
562
- }
563
- }
564
- .wrpa-shortcode-form {
565
- cursor: pointer;
566
- .wrpa-shortcode-form__shortcode {
567
- display: inline-block;
568
- }
569
- .wrpa-shortcode-form__button {
570
- display: inline-block;
571
- opacity: .65;
572
- font-size: 11px;
573
- font-style: italic;
574
- padding-right: 3px;
575
- }
576
- }
577
- }
578
-
579
- .connect {
580
- &_progress {
581
- position: absolute;
582
- left: calc(50% - 22px);
583
- top: 30px;
584
-
585
- @include clear;
586
-
587
- &-point {
588
- display: block;
589
- float: left;
590
- margin-left: 5px;
591
- width: 8px;
592
- height: 8px;
593
- border-radius: 100%;
594
- background-color: transparentize($primary-color, .7);
595
-
596
- &__active {
597
- border: 1px solid $primary-color;
598
- }
599
-
600
- &__done {
601
- background-color: $primary-color;
602
- }
603
- }
604
- }
605
- }
606
-
607
- .connect-actions {
608
- width: 100%;
609
- max-width: $wizard-width;
610
- border-top: 2px solid $light-gray;
611
- padding: 1rem 0;
612
-
613
- .button {
614
- margin: 0;
615
- }
616
-
617
- @include breakpoint(tablet) {
618
- padding-bottom: 2rem;
619
- }
620
-
621
- .fa-animated {
622
- font-size: 2rem;
623
- color: transparentize($primary-color, .35);
624
- vertical-align: middle;
625
- margin-right: 5px;
626
- }
627
- }
628
-
629
- @keyframes moveRightLeftLoop {
630
- 0% {
631
- transform: translateX(-10px);
632
- }
633
-
634
- 50% {
635
- transform: translateX(0);
636
- }
637
-
638
- 100% {
639
- transform: translateX(-10px);
640
- }
641
- }
642
-
643
- .moveRightLeftLoop {
644
- animation-iteration-count: infinite;
645
- animation-name: moveRightLeftLoop;
646
- animation-duration: 1000ms;
647
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/mixins.scss DELETED
@@ -1,32 +0,0 @@
1
- // grid
2
- $breakpoint-small: 782px; // 540px
3
- $breakpoint-med: 60em; // 720px
4
- $breakpoint-large: 68em; // 960px
5
-
6
- @mixin breakpoint($point) {
7
- @if $point == desktop {
8
- @media (min-width: $breakpoint-large) { @content ; }
9
- }
10
- @else if $point == mobile {
11
- @media (max-width: $breakpoint-small) { @content ; }
12
- }
13
- @else if $point == not-mobile {
14
- @media (min-width: $breakpoint-small) { @content ; }
15
- }
16
- }
17
-
18
- .mobile-collapsed {
19
- display: inherit;
20
- }
21
- .mobile-only {
22
- display: none !important;
23
- }
24
-
25
- @include breakpoint(mobile) {
26
- .mobile-only {
27
- display: inherit !important;
28
- }
29
- .mobile-collapsed {
30
- display: none !important;
31
- }
32
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/pagination/index.scss DELETED
@@ -1,10 +0,0 @@
1
- .wpra-loading {
2
- animation: pulse 1s infinite ease-in-out;
3
- pointer-events: none;
4
- }
5
-
6
- @keyframes pulse {
7
- 0% { opacity: .25; }
8
- 50% { opacity: .6; }
9
- 100% { opacity: .25; }
10
- }
 
 
 
 
 
 
 
 
 
 
css/src/plugins/form.scss DELETED
@@ -1,48 +0,0 @@
1
- .form {
2
- &-check {
3
- input {
4
- display: inline-block !important;
5
- width: auto !important;
6
- margin: 0 4px 0 0;
7
- }
8
- label {
9
- display: inline-block !important;
10
- }
11
- padding: 4px 0;
12
- }
13
- &-group {
14
- padding-bottom: 8px;
15
- label {
16
- display: block;
17
- }
18
- & > label {
19
- margin-bottom: 2px;
20
- }
21
- input, textarea {
22
- display: block;
23
- width: 100%;
24
- }
25
- &:last-child {
26
- padding-bottom: 0;
27
- }
28
- p {
29
- &:first-child {
30
- margin-top: 0;
31
- }
32
- &:last-child {
33
- margin-bottom: 0;
34
- }
35
- }
36
- .error {
37
- margin: 0 !important;
38
- }
39
- }
40
- }
41
-
42
- .wpra-plugin-disable-poll {
43
- &__logo {
44
- img {
45
- max-height: 40px;
46
- }
47
- }
48
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/plugins/index.scss DELETED
@@ -1,25 +0,0 @@
1
- $white: #fff;
2
- $radius: 4px;
3
-
4
- @mixin breakpoint($point) {
5
- @if $point == desktop {
6
- @media (min-width: 70em) { @content ; }
7
- }
8
- @else if $point == laptop {
9
- @media (min-width: 64em) { @content ; }
10
- }
11
- @else if $point == tablet {
12
- @media (max-width: 50em) { @content ; }
13
- }
14
- @else if $point == phablet {
15
- @media (min-width: 37.5em) { @content ; }
16
- }
17
- @else if $point == mobileonly {
18
- @media (max-width: 37.5em) { @content ; }
19
-
20
- }
21
- }
22
-
23
- @import "./../intro/loading";
24
- @import "modal";
25
- @import "form";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/plugins/modal.scss DELETED
@@ -1,173 +0,0 @@
1
- .modal {
2
- &-opened {
3
- overflow: hidden;
4
- }
5
-
6
- position: fixed;
7
- background-color: rgba(0, 0, 0, 0.65);
8
- width: 100%;
9
- height: 100%;
10
- left: 0;
11
- top: 0;
12
- z-index: 9999;
13
- overflow-y: auto;
14
-
15
- @include breakpoint(mobile) {
16
- z-index: 100000;
17
- }
18
-
19
- &__body {
20
- width: 100%;
21
- max-width: 30rem;
22
- margin: 5rem auto;
23
-
24
- background-color: $white;
25
- border-radius: $radius;
26
-
27
- &--no-content-padding {
28
- .modal__content {
29
- padding: 0;
30
- }
31
- }
32
-
33
- &--wide {
34
- max-width: 50rem;
35
- }
36
-
37
- @include breakpoint(mobile) {
38
- min-height: 100vh;
39
- margin: 0;
40
- border-radius: 0;
41
- }
42
- }
43
-
44
- &__header {
45
- padding: .5rem 1rem;
46
- font-size: 20px;
47
- font-weight: bold;
48
- line-height: 1.5;
49
- border-bottom: 1px solid #eee;
50
-
51
- &.invisible-header {
52
- border: none;
53
- font-size: unset;
54
- font-weight: unset;
55
- padding-top: 12px !important;
56
- h3 {
57
- margin-top: 0;
58
- line-height: 1.5;
59
- margin-bottom: 0;
60
- }
61
- p {
62
- margin-top: .25rem;
63
- font-size: 14px;
64
- opacity: .6;
65
- margin-bottom: 0;
66
- }
67
- & + .modal__content {
68
- padding-top: 6px !important;
69
- }
70
- }
71
-
72
- @include breakpoint(mobile) {
73
- position: relative;
74
-
75
- .modal--right {
76
- position: absolute;
77
- top: 0;
78
- padding: 6px 1rem 0 1rem;
79
- right: 0;
80
- background-color: white;
81
- }
82
- }
83
-
84
- &-buttons {
85
- font-weight: normal;
86
- }
87
- }
88
-
89
- &__close {
90
- opacity: .5;
91
- cursor: pointer;
92
- &:hover {
93
- opacity: .8;
94
- }
95
- }
96
-
97
- &--right {
98
- float: right;
99
- }
100
-
101
- &__content {
102
- padding: 1rem;
103
- }
104
-
105
- &__footer {
106
- padding: 1rem;
107
- border-top: 1px solid #eee;
108
- text-align: right;
109
-
110
- .button {
111
- display: inline-block !important;
112
- margin-left: 4px !important;
113
- }
114
- .footer-confirm {
115
- margin: 0;
116
- padding: 0;
117
- display: flex;
118
- align-items: center;
119
-
120
- @include breakpoint(mobile) {
121
- display: block;
122
- &__message {
123
- padding-right: 0;
124
- padding-bottom: 10px;
125
- }
126
- }
127
-
128
- &__buttons {
129
- flex-shrink: 0;
130
-
131
- &--left {
132
- margin-right: auto;
133
- flex-grow: 1;
134
- text-align: left;
135
- }
136
- }
137
-
138
- &__message {
139
- margin-right: auto;
140
- &.__right {
141
- flex-grow: 1;
142
- padding-right: 10px;
143
- text-align: right;
144
- }
145
- }
146
- }
147
- }
148
- }
149
-
150
- .modal-transition {
151
- &-enter, &-leave-to {
152
- opacity: 0;
153
-
154
- .modal__body {
155
- opacity: 0;
156
- transform: scaleX(.8) scaleY(.7);
157
- }
158
- }
159
-
160
- &-enter-active, &-leave-active {
161
- transition: opacity 0.25s ease-out;
162
-
163
- .modal__body {
164
- transition: all .25s cubic-bezier(.665,1.65,0,.845);
165
- }
166
- }
167
- }
168
-
169
- .button-clear {
170
- border: none !important;
171
- background: transparent !important;
172
- box-shadow: none !important;
173
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/templates/bottom-panel.scss DELETED
@@ -1,15 +0,0 @@
1
- .wpra-bottom-panel {
2
- position: sticky;
3
- bottom: 0;
4
- z-index: 9;
5
- background-color: #fffce9;
6
- padding: 1rem;
7
- border: 1px solid #e5e5e5;
8
- box-shadow: 0 1px 1px rgba(0,0,0,0.04);
9
-
10
- &__title {
11
- font-size: 1rem;
12
- font-weight: 500;
13
- padding-bottom: 8px;
14
- }
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/templates/grid.scss DELETED
@@ -1,18 +0,0 @@
1
- .flex {
2
- &-row {
3
- display: flex;
4
- }
5
- &-col {
6
- box-sizing: border-box;
7
- padding: 0 10px;
8
- flex: 1 1 0;
9
-
10
- &:first-child {
11
- padding-left: 0;
12
- }
13
-
14
- &:last-child {
15
- padding-right: 0;
16
- }
17
- }
18
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/templates/index.scss DELETED
@@ -1,216 +0,0 @@
1
- @import "./../mixins";
2
- @import "bottom-panel";
3
- @import "loading";
4
- @import "notifications";
5
- @import "grid";
6
-
7
- .wpra-postbox {
8
- .hndle {
9
- cursor: unset !important;
10
- }
11
- }
12
-
13
- .wpra-shortcode-copy {
14
- font-size: 13px;
15
- background-color: #fff;
16
- margin-left: auto;
17
- padding: 9px 14px;
18
- box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
19
-
20
- border-left: 4px solid #0085ba;
21
-
22
- display: flex;
23
- align-items: center;
24
-
25
- @include breakpoint (mobile) {
26
- display: block;
27
- }
28
-
29
- &__icon {
30
- padding-left: 16px;
31
-
32
- @include breakpoint (mobile) {
33
- padding-left: 0;
34
- margin-top: 1rem;
35
- }
36
- }
37
- }
38
-
39
- .page-title {
40
- display: flex;
41
- align-items: center;
42
- padding: 9px 0 4px 0;
43
-
44
- @include breakpoint (mobile) {
45
- display: block;
46
- }
47
-
48
- a {
49
- &:focus {
50
- text-decoration: none;
51
- }
52
- }
53
-
54
- h1 {
55
- margin-left: 6px;
56
- padding: 0;
57
- }
58
- }
59
-
60
- .back-button {
61
- opacity: .75;
62
- text-decoration: none;
63
- font-size: 20px;
64
- display: flex;
65
- align-items: center;
66
- padding-right: 10px;
67
- margin-right: 4px;
68
- border-right: 1px solid #b4b4b4;
69
-
70
- @include breakpoint (mobile) {
71
- border-right: none;
72
- margin-bottom: .5rem;
73
- }
74
-
75
- .dashicons {
76
- margin-right: 8px;
77
- }
78
- }
79
-
80
- .tippy-tooltip.light-theme {
81
- font-size: 13px !important;
82
- font-family: unset !important;
83
- text-align: left !important;
84
-
85
- hr {
86
- border: none;
87
- height: 1px;
88
- background-color: #efefef;
89
- }
90
- }
91
-
92
- .form-input {
93
- display: flex;
94
- margin: .75rem 0;
95
- &--disabled {
96
- pointer-events: none;
97
- .form-input__label {
98
- *:not(.disable-ignored) {
99
- opacity: .5;
100
- user-select: none;
101
- }
102
- }
103
- }
104
- .disable-ignored {
105
- opacity: 1;
106
- }
107
- &--vertical {
108
- flex-direction: column;
109
- .form-input__label {
110
- padding-right: 0;
111
- padding-bottom: 4px;
112
- flex-basis: 100%;
113
- }
114
- }
115
-
116
- @include breakpoint(mobile) {
117
- flex-direction: column;
118
- .form-input__label {
119
- padding-right: 0;
120
- padding-bottom: 4px;
121
- flex-basis: 100%;
122
- }
123
- }
124
-
125
- &:last-child {
126
- margin-bottom: 0;
127
- }
128
- &__tip {
129
- cursor: pointer;
130
- display: inline-block;
131
- margin-left: 4px;
132
- opacity: .25;
133
- vertical-align: middle;
134
- &:hover {
135
- opacity: .85;
136
- }
137
- .dashicons {
138
- font-size: 18px;
139
- }
140
- }
141
- &__label {
142
- padding-right: 12px;
143
- flex-basis: 260px;
144
- &-description {
145
- padding-top: 2px;
146
- padding-right: 10px;
147
- line-height: 1.65;
148
- opacity: .6;
149
- font-size: 12px;
150
-
151
- a {
152
- pointer-events: auto !important;
153
- }
154
- }
155
- }
156
- &__field {
157
- flex-grow: 1;
158
- input:not([type="checkbox"]), textarea, select {
159
- width: 100%;
160
- max-width: 325px;
161
- }
162
- }
163
- }
164
-
165
- .built-in {
166
- background: #f1f1f1;
167
-
168
- [type="checkbox"] {
169
- display: none;
170
- }
171
- }
172
-
173
- .wpra-preview-link {
174
- vertical-align: middle;
175
-
176
- span.dashicons {
177
- opacity: .75;
178
- font-size: 16px;
179
- vertical-align: middle;
180
- }
181
- }
182
-
183
- .wpra-no-cb {
184
- .column-cb {
185
- input[type="checkbox"] {
186
- display: none;
187
- }
188
- }
189
- }
190
-
191
- .column.name {
192
- small {
193
- @include breakpoint (mobile) {
194
- display: block;
195
- }
196
- }
197
- }
198
-
199
- .inside {
200
- .wpra-preview-link {
201
- @include breakpoint (mobile) {
202
- float: none;
203
- }
204
- }
205
- }
206
-
207
- .wpra-postbox-container {
208
- @include breakpoint (mobile) {
209
- display: flex;
210
- flex-direction: column;
211
-
212
- .wpra-postbox-last {
213
- order: 100;
214
- }
215
- }
216
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/templates/loading.scss DELETED
@@ -1,220 +0,0 @@
1
- a.disabled {
2
- color: #9c9c9c;
3
- pointer-events: none;
4
- }
5
-
6
- [v-cloak] {
7
- .vcloak {
8
- &--visible {
9
- display: block;
10
- }
11
- &--hidden {
12
- display: none;
13
- }
14
- }
15
- }
16
- .vcloak {
17
- &--visible {
18
- min-height: 60px;
19
- display: none;
20
- }
21
- }
22
-
23
- .loading-container {
24
- min-height: 5rem;
25
- position: relative;
26
- &:before {
27
- display: block;
28
- content: '';
29
- position: absolute;
30
- left: calc(50% - 20px);
31
- top: calc(50% - 20px);
32
- box-sizing: border-box;
33
- height: 40px;
34
- width: 40px;
35
- border: 0px solid #d0d0d0;
36
- border-radius: 50%;
37
- box-shadow: 0 -12px 0 16px #d0d0d0 inset;
38
- animation: rotate 1s infinite linear;
39
- z-index: 3;
40
- }
41
- &:after {
42
- display: block;
43
- content: '';
44
- position: absolute;
45
- z-index: 2;
46
- background-color: rgba(241, 241, 241, 0.5);
47
- width: 100%;
48
- height: 100%;
49
- left: 0;
50
- top: 0;
51
- }
52
- &--white {
53
- &:after {
54
- background-color: white;
55
- }
56
- }
57
- }
58
-
59
-
60
- .loading-button {
61
- pointer-events: none;
62
- position: relative;
63
- &:before {
64
- display: block;
65
- content: '';
66
- position: absolute;
67
- left: calc(50% - 8px);
68
- top: calc(50% - 8px);
69
- box-sizing: border-box;
70
- height: 16px;
71
- width: 16px;
72
- border: 0px solid #fff;
73
- border-radius: 50%;
74
- box-shadow: 0 -4px 0 6px #fff inset;
75
- animation: rotate 1s infinite linear;
76
- z-index: 3;
77
- }
78
- &:after {
79
- display: block;
80
- content: '';
81
- position: absolute;
82
- z-index: 2;
83
- background-color: inherit;
84
- width: 100%;
85
- height: 100%;
86
- left: 0;
87
- top: 0;
88
- }
89
- }
90
-
91
- .button-default {
92
- &.loading-button:before {
93
- box-shadow: inset 0 -4px 0 6px #6f6f6f;
94
- }
95
- }
96
-
97
- .loading-inline {
98
- display: inline-block;
99
- pointer-events: none;
100
- position: relative;
101
- &:before {
102
- display: block;
103
- content: '';
104
- position: absolute;
105
- left: calc(50% + 1px);
106
- top: calc(50% - 11px);
107
- box-sizing: border-box;
108
- height: 14px;
109
- width: 14px;
110
- border: 0px solid #d0d0d0;
111
- border-radius: 50%;
112
- box-shadow: 0 -3px 0 5px #d0d0d0 inset;
113
- animation: rotate 1s infinite linear;
114
- z-index: 3;
115
- }
116
- &:after {
117
- display: block;
118
- content: '';
119
- position: absolute;
120
- z-index: 2;
121
- background-color: inherit;
122
- width: 100%;
123
- height: 100%;
124
- left: 0;
125
- top: 0;
126
- }
127
- }
128
-
129
-
130
- @keyframes rotate {
131
- 0% {
132
- transform: rotate(0deg);
133
- }
134
- 100% {
135
- transform: rotate(360deg);
136
- }
137
- }
138
-
139
- .table-loading {
140
- position: relative;
141
- }
142
- .table-loading .table-loader-wrap {
143
- position: absolute;
144
- width: 100%;
145
- height: 100%;
146
- z-index: 9;
147
- }
148
- .table-loading .table-loader-wrap .table-loader-center {
149
- position: absolute;
150
- top: 50%;
151
- transform: translateY(-50%);
152
- width: 100%;
153
- }
154
- .table-loading .wp-list-table,
155
- .table-loading .tablenav {
156
- opacity: 0.4;
157
- }
158
- .table-loader {
159
- font-size: 10px;
160
- margin: 50px auto;
161
- text-indent: -9999em;
162
- width: 11em;
163
- height: 11em;
164
- border-radius: 50%;
165
- background: #ffffff;
166
- background: -moz-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
167
- background: -webkit-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
168
- background: -o-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
169
- background: -ms-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
170
- background: linear-gradient(to right, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
171
- position: relative;
172
- -webkit-animation: tableLoading 1s infinite linear;
173
- animation: tableLoading 1s infinite linear;
174
- -webkit-transform: translateZ(0);
175
- -ms-transform: translateZ(0);
176
- transform: translateZ(0);
177
- }
178
- .table-loader:before {
179
- width: 50%;
180
- height: 50%;
181
- background: #ffffff;
182
- border-radius: 100% 0 0 0;
183
- position: absolute;
184
- top: 0;
185
- left: 0;
186
- content: '';
187
- }
188
- .table-loader:after {
189
- background: #f4f4f4;
190
- width: 75%;
191
- height: 75%;
192
- border-radius: 50%;
193
- content: '';
194
- margin: auto;
195
- position: absolute;
196
- top: 0;
197
- left: 0;
198
- bottom: 0;
199
- right: 0;
200
- }
201
- @-webkit-keyframes tableLoading {
202
- 0% {
203
- -webkit-transform: rotate(0deg);
204
- transform: rotate(0deg);
205
- }
206
- 100% {
207
- -webkit-transform: rotate(360deg);
208
- transform: rotate(360deg);
209
- }
210
- }
211
- @keyframes tableLoading {
212
- 0% {
213
- -webkit-transform: rotate(0deg);
214
- transform: rotate(0deg);
215
- }
216
- 100% {
217
- -webkit-transform: rotate(360deg);
218
- transform: rotate(360deg);
219
- }
220
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/templates/notifications.scss DELETED
@@ -1,28 +0,0 @@
1
- .toasted-container.top-center {
2
- top: 44px !important;
3
- }
4
-
5
- .toasted {
6
- background: #23282d !important;
7
- color: #e5e5e5 !important;
8
- font-size: inherit !important;
9
- font-weight: inherit !important;
10
-
11
- justify-content: start !important;
12
- border-left: none !important;
13
-
14
- &.success {}
15
-
16
- &.error {
17
- .dashicons {
18
- color: #ff7781;
19
- }
20
- }
21
-
22
- .dashicons {
23
- margin-right: 12px;
24
- margin-left: -8px;
25
- display: inline-block;
26
- opacity: .65;
27
- }
28
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/src/update/index.scss DELETED
@@ -1,149 +0,0 @@
1
- @import "./../mixins";
2
-
3
- .wrap--wpra-update {
4
- padding-top: 1rem;
5
-
6
- @include breakpoint(not-mobile) {
7
- width: 100%;
8
- max-width: 1400px;
9
- margin: 0 auto;
10
- padding-right: 20px;
11
- box-sizing: border-box;
12
- }
13
- }
14
-
15
- .wpra-text-center {
16
- text-align: center;
17
- }
18
-
19
- .wpra-updates ul {
20
- list-style: disc;
21
- padding: 0 1.25rem;
22
- }
23
-
24
- .wpra-inline-form {
25
- display: flex;
26
- align-items: baseline;
27
-
28
- button {
29
- margin-right: 12px !important;
30
- }
31
-
32
- small {
33
- font-size: 12px;
34
- opacity: .75;
35
- }
36
- }
37
-
38
-
39
- .wpra-update-head__title {
40
- font-size: 24px;
41
- font-weight: 500;
42
- padding: 1.5rem 0 1.5rem;
43
- line-height: 1.4;
44
- }
45
-
46
- .wpra-update__logo img {
47
- width: 56px;
48
- }
49
-
50
- .button-icon span {
51
- vertical-align: baseline;
52
- margin-right: -7px;
53
- opacity: .6;
54
- font-size: 16px;
55
- top: 4px;
56
- position: relative;
57
- }
58
-
59
- .wpra-links {
60
- padding-top: .5rem;
61
- }
62
-
63
- .wpra-update-head__link {
64
- font-size: 1rem;
65
- padding-bottom: 1.5rem;
66
- line-height: 1.5;
67
- }
68
-
69
- .wpra-update-feature {
70
- display: flex;
71
- padding: 0 18px 12px !important;
72
-
73
- @include breakpoint(mobile) {
74
- flex-direction: column-reverse;
75
- }
76
- }
77
-
78
- .wpra-update-feature__text {
79
- @include breakpoint(not-mobile) {
80
- padding-right: 12px;
81
- }
82
-
83
- h3 {
84
- margin-top: 8px;
85
- @include breakpoint(mobile) {
86
- margin-top: 16px;
87
- }
88
- }
89
-
90
- p {
91
- font-size: 14px;
92
- }
93
- }
94
-
95
- .wpra-update-feature__image {
96
- flex-shrink: 0;
97
- width: 30rem;
98
- overflow: hidden;
99
- min-height: 336px;
100
- position: relative;
101
- margin: -11px -18px -23px 0;
102
- cursor: pointer;
103
- transition-duration: 0.5s;
104
-
105
- &:hover {
106
- transition-duration: 0.2s;
107
- background-color: #111;
108
-
109
- img {
110
- opacity: 0.95;
111
-
112
- }
113
-
114
- &::before {
115
- content: "\f177";
116
- display: block;
117
- position: absolute;
118
- top: calc(50% - 45px);
119
- width: 100%;
120
- height: 90px;
121
- font-size: 5em;
122
- font-family: dashicons;
123
- text-align: center;
124
- z-index: 100;
125
- opacity: 0.5;
126
- }
127
- }
128
-
129
- @include breakpoint(mobile) {
130
- flex-shrink: unset;
131
- width: unset;
132
- min-height: unset;
133
-
134
- max-height: 15rem;
135
- margin: -11px -18px 0px;
136
- }
137
-
138
- img {
139
- max-height: 29rem;
140
- position: absolute;
141
-
142
- @include breakpoint(mobile) {
143
- max-height: unset;
144
- position: unset;
145
-
146
- max-width: 100%;
147
- }
148
- }
149
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/Aventura/Wprss/Core/Model/AssetsAbstract.php CHANGED
@@ -482,7 +482,7 @@ abstract class AssetsAbstract extends Core\Plugin\ComponentAbstract implements A
482
  $prefix = $this->_getHandlePrefix();
483
  return is_null($handle)
484
  ? $prefix
485
- : static::stringHadPrefix($handle) ? $handle : "{$prefix}{$handle}";
486
  }
487
 
488
  /**
@@ -607,4 +607,4 @@ abstract class AssetsAbstract extends Core\Plugin\ComponentAbstract implements A
607
  {
608
  return $this;
609
  }
610
- }
482
  $prefix = $this->_getHandlePrefix();
483
  return is_null($handle)
484
  ? $prefix
485
+ : (static::stringHadPrefix($handle) ? $handle : "{$prefix}{$handle}");
486
  }
487
 
488
  /**
607
  {
608
  return $this;
609
  }
610
+ }
includes/admin-debugging.php DELETED
@@ -1,341 +0,0 @@
1
- <?php
2
-
3
- use Interop\Container\Exception\NotFoundException as ServiceNotFoundException;
4
- use Aventura\Wprss\Core\Model\AdminAjaxNotice\NoticeInterface;
5
- use Psr\Log\LogLevel;
6
-
7
-
8
- /**
9
- * Returns the debugging operations array
10
- *
11
- * @since 3.4.6
12
- */
13
- function wprss_get_debug_operations() {
14
- $operations = apply_filters(
15
- 'wprss_debug_operations',
16
- array(
17
- 'update-feeds' => array(
18
- 'nonce' => 'wprss-update-feed-items',
19
- 'run' => 'wprss_fetch_insert_all_feed_items',
20
- 'redirect' => 'edit.php?post_type=wprss_feed&page=wprss-debugging&debug_message=1',
21
- 'render' => 'wprss_debug_update_feeds',
22
- ),
23
-
24
- 'reimport-feeds' => array(
25
- 'nonce' => 'wprss-delete-import-feed-items',
26
- 'run' => 'wprss_feed_reset',
27
- 'redirect' => 'edit.php?post_type=wprss_feed&page=wprss-debugging&debug_message=2',
28
- 'render' => 'wprss_debug_reimport_feeds',
29
- ),
30
-
31
- )
32
- );
33
-
34
- $operations ['restore-settings'] = apply_filters(
35
- 'wprss_debug_restore_settings_operation',
36
- array(
37
- 'nonce' => 'wprss-restore-settings',
38
- 'run' => 'wprss_restore_settings',
39
- 'redirect' => 'edit.php?post_type=wprss_feed&page=wprss-debugging&debug_message=4',
40
- 'render' => 'wprss_debug_restore_settings',
41
- 'pos' => 'bottom'
42
- )
43
- );
44
-
45
- return $operations;
46
- }
47
-
48
-
49
- add_action( 'admin_init', 'wprss_debug_operations' );
50
- /**
51
- * Performs debug operations, depending on the POST request.
52
- *
53
- * @since 3.3
54
- */
55
- function wprss_debug_operations(){
56
-
57
- // Define the debugging operations
58
- $debug_operations = wprss_get_debug_operations();
59
-
60
- // Check which of the operations needs to be run
61
- foreach ( $debug_operations as $id => $operation ) {
62
- // If page loading after having clicked 'Update all fields'
63
- if ( !isset($_POST[$id]) ) {
64
- continue;
65
- }
66
-
67
- $nonce = isset($operation['nonce']) ? $operation['nonce'] : null;
68
- if ( ! check_admin_referer( $nonce ) ) {
69
- continue;
70
- }
71
-
72
- $run = isset($operation['run']) ? $operation['run'] : null;
73
- if ( is_callable($run) ) {
74
- call_user_func( $run );
75
- }
76
-
77
- $redirect = isset( $operation['redirect'] )
78
- ? $operation['redirect']
79
- : 'edit.php?post_type=wprss_feed&page=wprss-debugging';
80
- wp_redirect( $redirect );
81
-
82
- break;
83
- }
84
- }
85
-
86
-
87
- /**
88
- * Build the Update Feeds section
89
- *
90
- * @since 3.4.6
91
- */
92
- function wprss_debug_update_feeds() {
93
- ?>
94
- <h3><?php _e( 'Update All Feeds Now', WPRSS_TEXT_DOMAIN ); ?></h3>
95
- <p><?php _e( 'Click the blue button to update all active feed items now. This will check all feed sources for any new feed items.', WPRSS_TEXT_DOMAIN ); ?>
96
- <br><?php _e( 'Existing feed items will not be modified.', WPRSS_TEXT_DOMAIN ); ?>
97
- </p>
98
- <p><?php _e( '<strong>Note:</strong> This might take more than a few seconds if you have many feed sources.', WPRSS_TEXT_DOMAIN ); ?></p>
99
-
100
- <form action="edit.php?post_type=wprss_feed&page=wprss-debugging" method="post">
101
-
102
- <?php wp_nonce_field( 'wprss-update-feed-items' );
103
- submit_button( __( 'Update all feeds', WPRSS_TEXT_DOMAIN ), 'primary', 'update-feeds', true ); ?>
104
-
105
- </form>
106
- <?php
107
- }
108
-
109
-
110
- /**
111
- * Build the Delete and Re-Import Feeds section
112
- *
113
- * @since 3.4.6
114
- */
115
- function wprss_debug_reimport_feeds() {
116
- ?>
117
- <h3><?php _e( 'Delete and Re-import Feeds', WPRSS_TEXT_DOMAIN ); ?></h3>
118
- <p><?php _e( 'Click the red button to delete all imported feed items and re-import them.', WPRSS_TEXT_DOMAIN ); ?></p>
119
- <p><?php _e( '<em><strong>Note:</strong> This is a server-intensive process and should only be used when instructed to by support staff.</em>', WPRSS_TEXT_DOMAIN ); ?></p>
120
-
121
- <form action="edit.php?post_type=wprss_feed&page=wprss-debugging" method="post">
122
-
123
- <?php wp_nonce_field( 'wprss-delete-import-feed-items' );
124
- submit_button( __( 'Delete and Re-import all feeds', WPRSS_TEXT_DOMAIN ), 'button-red', 'reimport-feeds', true ); ?>
125
-
126
- </form>
127
- <?php
128
- }
129
-
130
-
131
- /**
132
- * Render the restore settings button
133
- *
134
- * @since 4.4
135
- */
136
- function wprss_debug_restore_settings() {
137
- ?>
138
- <h3><?php _e( 'Restore Default Settings', WPRSS_TEXT_DOMAIN ); ?></h3>
139
- <p><?php _e( 'Click the red button to reset the plugin settings to default.', WPRSS_TEXT_DOMAIN ); ?></p>
140
- <p><?php _e( '<em><strong>Note:</strong> This cannot be undone. Once the settings have been reset, your old settings cannot be restored.</em>', WPRSS_TEXT_DOMAIN ); ?></p>
141
-
142
- <form action="edit.php?post_type=wprss_feed&page=wprss-debugging" method="post">
143
-
144
- <?php wp_nonce_field( 'wprss-restore-settings' );
145
- submit_button( __( 'Restore Default Settings', WPRSS_TEXT_DOMAIN ), 'button-red', 'restore-settings', true ); ?>
146
-
147
- </form>
148
- <?php
149
- }
150
-
151
- /**
152
- * Renders the "Clear log" button
153
- *
154
- * @since 3.9.6
155
- */
156
- function wprss_debug_clear_log_button() {
157
- $form_url = admin_url( 'edit.php?post_type=wprss_feed&page=wprss-debugging' ); ?>
158
- <form id="wprss-clear-error-log-form" action="<?php echo $form_url; ?>" method="POST" class="wprss-error-log-action">
159
- <?php wp_nonce_field( 'wprss-clear-error-log' ); ?>
160
- <button type="submit" for="wprss-clear-error-log-form" name="clear-error-log" class="button button-red">
161
- <i class="fa fa-trash-o"></i>
162
- <?php _e( 'Clear log', WPRSS_TEXT_DOMAIN ); ?>
163
- </button>
164
- </form>
165
- <?php
166
- }
167
-
168
- /**
169
- * Renders the "Download Error Log" button
170
- *
171
- * @since 4.7.8
172
- */
173
- function wprss_debug_download_log_button() {
174
- $form_url = admin_url( 'edit.php?post_type=wprss_feed&page=wprss-debugging' ); ?>
175
- <form id="wprss-download-error-log-form" action="<?php echo $form_url; ?>" method="POST" class="wprss-error-log-action">
176
- <?php wp_nonce_field( 'wprss-download-error-log' ); ?>
177
- <button type="submit" for="wprss-download-error-log-form" name="download-error-log" class="button button-primary">
178
- <i class="fa fa-download"></i>
179
- <?php _e( 'Download log', WPRSS_TEXT_DOMAIN ); ?>
180
- </button>
181
- </form>
182
- <?php
183
- }
184
-
185
-
186
- /**
187
- * Build the debugging page
188
- *
189
- * @since 3.0
190
- */
191
- function wprss_debugging_page_display() {
192
- $debug_messages = apply_filters(
193
- 'wprss_debug_messages',
194
- array(
195
- '1' => 'debug_feeds_updating',
196
- '2' => 'debug_feeds_reimporting',
197
- '4' => 'debug_settings_reset',
198
- )
199
- );
200
-
201
- ?>
202
-
203
- <div class="wrap">
204
- <h2><?php _e( 'Debugging', WPRSS_TEXT_DOMAIN ); ?></h2>
205
- <?php
206
- if ( isset( $_GET['debug_message'] )) {//&& ( check_admin_referer( 'wprss-delete-import-feed-items' ) || check_admin_referer( 'wprss-update-feed-items' ) ) ) {
207
- $message = $_GET['debug_message'];
208
-
209
- $helper = wprss()->getAdminHelper();
210
- foreach ( $debug_messages as $id => $noticeId) {
211
- if ( $message == $id ) {
212
- $noticeId = $helper->resolveValueOutput($noticeId);
213
-
214
- $component = wprss()->getAdminAjaxNotices();
215
- $collection = $component->getNoticeCollection();
216
-
217
- try {
218
- $noticeObj = $component->getNotice($noticeId);
219
-
220
- if (!$noticeObj instanceof Aventura\Wprss\Core\DataObject) {
221
- throw new Exception(
222
- sprintf(
223
- __('Expected notice to be a DataObject instance: %s given.', WPRSS_TEXT_DOMAIN),
224
- is_object($noticeObj)? get_class($noticeObj) : gettype($noticeObj)
225
- )
226
- );
227
- }
228
- } catch (ServiceNotFoundException $ex) {
229
- $content = trim(strip_tags($noticeId, '<strong><em><br><p>'));
230
- $noticeObj = $helper->createNotice(array(
231
- 'content' => $content,
232
- 'dismiss_mode' => NoticeInterface::DISMISS_MODE_FRONTEND,
233
- ));
234
- }
235
-
236
- $noticeData = $noticeObj->getData();
237
- echo $collection->render_notice($collection->normalize_notice_data($noticeData));
238
-
239
- break;
240
- }
241
- }
242
- }
243
-
244
- do_action( 'wprss_debugging_before' );
245
-
246
- $bottom = array();
247
- $debug_operations = wprss_get_debug_operations();
248
- foreach( $debug_operations as $id => $data ) {
249
- if ( !isset( $data['render'] ) ) continue;
250
- $pos = isset( $data['pos'] ) ? $data['pos'] : 'normal';
251
- if ( $pos == 'normal' ) {
252
- call_user_func( $data['render'] );
253
- } elseif( $pos == 'bottom' ) {
254
- $bottom[$id] = $data;
255
- }
256
- }
257
-
258
- do_action( 'wprss_debugging_after' );
259
-
260
- if ( count($bottom) > 0 ) {
261
- foreach( $bottom as $id => $data ) {
262
- if ( !isset( $data['render'] ) ) continue;
263
- call_user_func( $data['render'] );
264
- }
265
- }
266
-
267
- ?>
268
- </div>
269
- <?php
270
- }
271
-
272
-
273
- /**
274
- * Output admin notice that feeds have been updated successfully
275
- *
276
- * @since 3.0
277
- */
278
- function wprss_debugging_admin_notice_update_feeds() {
279
- ?><div class="updated"><p><?php _e( 'Feeds are being updated in the background.', WPRSS_TEXT_DOMAIN ) ?></p></div><?php
280
- }
281
-
282
- /**
283
- * Output admin notice that feeds have been deleted and re-imported successfully
284
- *
285
- * @since 3.0
286
- */
287
- function wprss_debugging_admin_notice_reimport_feeds() {
288
- ?><div class="updated"><p><?php _e( 'Feeds deleted and are being re-imported in the background.', WPRSS_TEXT_DOMAIN ) ?></p></div><?php
289
- }
290
-
291
-
292
- /**
293
- * Output admin notice that log has been cleard
294
- *
295
- * @since 3.9.6
296
- */
297
- function wprss_debugging_admin_notice_clear_log() {
298
- ?><div class="updated"><p><?php _e( 'The error log has been cleared.', WPRSS_TEXT_DOMAIN ) ?></p></div><?php
299
- }
300
-
301
-
302
- /**
303
- * Output admin notice that log has been cleard
304
- *
305
- * @since 4.4
306
- */
307
- function wprss_debugging_admin_notice_reset_settings() {
308
- ?><div class="updated"><p><?php _e( 'The plugin settings have been reset to default.', WPRSS_TEXT_DOMAIN ) ?></p></div><?php
309
- }
310
-
311
-
312
- /**
313
- * Resets the plugin settings to default
314
- *
315
- * @since 4.4
316
- */
317
- function wprss_restore_settings() {
318
- // Action Hook
319
- do_action( 'wprss_before_restore_settings' );
320
-
321
- // Prepare the settings to reset
322
- $settings_to_restore = apply_filters(
323
- 'wprss_settings_to_restore',
324
- array(
325
- 'wprss_settings_general',
326
- 'wprss_settings_notices',
327
- 'wprss_addon_notices',
328
- 'wprss_pwsv',
329
- 'wprss_db_version',
330
- WPRSS_INTRO_DID_INTRO_OPTION,
331
- WPRSS_UPDATE_PAGE_PREV_VERSION_OPTION
332
- )
333
- );
334
- // Delete the settings
335
- foreach( $settings_to_restore as $setting ) {
336
- delete_option( $setting );
337
- }
338
-
339
- // Action Hook
340
- do_action( 'wprss_after_restore_settings' );
341
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/cron-jobs.php CHANGED
@@ -70,7 +70,7 @@ function wprss_schedule_fetch_all_feeds_cron()
70
  /**
71
  * Gets the time of the global fetch cron.
72
  *
73
- * @since [*next-version*]
74
  *
75
  * @return false|string A time string in the form `H:i`
76
  */
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
  */
includes/feed-importing.php CHANGED
@@ -669,8 +669,14 @@ function wprss_get_feed_cache_dir()
669
  // increment the inserted counter
670
  elseif ( ( is_bool($item) && $item === TRUE ) || ( $still_update_count === TRUE && $item !== FALSE ) ) {
671
  $items_inserted++;
672
- } else {
673
- $logger->error('Failed to save item "{0}"', [$ogItem->get_title()]);
 
 
 
 
 
 
674
  }
675
  }
676
  }
669
  // increment the inserted counter
670
  elseif ( ( is_bool($item) && $item === TRUE ) || ( $still_update_count === TRUE && $item !== FALSE ) ) {
671
  $items_inserted++;
672
+ } elseif (has_filter('wprss_insert_post_item_conditionals', 'wprss_kf_check_post_item_keywords')) {
673
+ $logger->info('Item "{0}" was rejected by your keyword or tag filtering.', [
674
+ $ogItem->get_title()
675
+ ]);
676
+ } else {
677
+ $logger->notice('Item "{0}" was rejected by an add-on.', [
678
+ $ogItem->get_title()
679
+ ]);
680
  }
681
  }
682
  }
includes/functions.php CHANGED
@@ -326,3 +326,37 @@ function wpra_get_ready_cron_jobs() {
326
 
327
  return $results;
328
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
326
 
327
  return $results;
328
  }
329
+
330
+ /**
331
+ * Retrieves the translation for some text from the "wprss" domain.
332
+ *
333
+ * @since 4.17.3
334
+ *
335
+ * @param string $text The text whose translation to retrieve.
336
+ *
337
+ * @return string
338
+ */
339
+ function wprss_translate($text)
340
+ {
341
+ $translations = get_translations_for_domain('wprss');
342
+
343
+ return $translations->translate($text);
344
+ }
345
+
346
+ /**
347
+ * Retrieves the singular or plural translation for some text from the "wprss" domain.
348
+ *
349
+ * @since 4.17.3
350
+ *
351
+ * @param string $single The singular text.
352
+ * @param string $plural The plural text.
353
+ * @param int $number The amount, used to determine whether the singular or plural translation will be retrieved.
354
+ *
355
+ * @return string
356
+ */
357
+ function wprss_translate_n($single, $plural, $number)
358
+ {
359
+ $translations = get_translations_for_domain('wprss');
360
+
361
+ return $translations->translate_plural($single, $plural, $number);
362
+ }
includes/scripts.php CHANGED
@@ -81,14 +81,23 @@
81
  wp_register_script('wpra-logs-tool', WPRSS_JS . 'admin/tools/logs.js', ['jquery'], $version, true);
82
  wp_register_script('wpra-blacklist-tool', WPRSS_JS . 'admin/tools/blacklist.js', ['jquery'], $version, true);
83
 
 
 
 
 
 
 
 
 
84
  wp_register_script('wpra-crons-tool', WPRSS_JS . 'admin/tools/crons.js', ['jquery'], $version, true);
85
  wp_localize_script('wpra-crons-tool', 'WpraCronsTool', [
 
86
  'restApiNonce' => wp_create_nonce('wp_rest'),
87
- 'schedules' => wp_get_schedules(),
88
- 'globalInterval' => wprss_get_general_setting('cron_interval'),
89
  'globalTime' => wprss_get_global_update_time(),
90
  'globalWord' => __('Global', 'wprss'),
91
- 'perPage' => 25
 
92
  ]);
93
 
94
  wp_register_script('wpra-reset-tool', WPRSS_JS . 'admin/tools/reset.js', ['jquery'], $version, true);
81
  wp_register_script('wpra-logs-tool', WPRSS_JS . 'admin/tools/logs.js', ['jquery'], $version, true);
82
  wp_register_script('wpra-blacklist-tool', WPRSS_JS . 'admin/tools/blacklist.js', ['jquery'], $version, true);
83
 
84
+ $wpSchedules = wp_get_schedules();
85
+ $globSchedule = wprss_get_general_setting('cron_interval');
86
+ $customSchedule = [
87
+ 'display' => __('Use Global Cron', 'wprss'),
88
+ 'interval' => $wpSchedules[$globSchedule]['interval'],
89
+ ];
90
+ $schedules = array_merge(['global' => $customSchedule], $wpSchedules);
91
+
92
  wp_register_script('wpra-crons-tool', WPRSS_JS . 'admin/tools/crons.js', ['jquery'], $version, true);
93
  wp_localize_script('wpra-crons-tool', 'WpraCronsTool', [
94
+ 'restUrl' => rest_url(),
95
  'restApiNonce' => wp_create_nonce('wp_rest'),
96
+ 'globalInterval' => $globSchedule,
 
97
  'globalTime' => wprss_get_global_update_time(),
98
  'globalWord' => __('Global', 'wprss'),
99
+ 'perPage' => 30,
100
+ 'schedules' => $schedules
101
  ]);
102
 
103
  wp_register_script('wpra-reset-tool', WPRSS_JS . 'admin/tools/reset.js', ['jquery'], $version, true);
js/admin/tools/crons.js CHANGED
@@ -1,4 +1,7 @@
1
- (function ($, Config) {
 
 
 
2
 
3
  // Update the table only when the tool is shown
4
  $(document).on('wpra/tools/on_loaded', function (event, tool) {
@@ -17,30 +20,125 @@
17
  * Initializes the crons tool.
18
  */
19
  function init() {
 
20
  Pagination.init();
21
  Table.init();
22
  Timeline.init();
23
  Info.init();
 
 
24
  }
25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  /**
27
  * The data store.
28
  */
29
  var Store = {
30
- feeds: null,
 
31
  count: 0,
32
  isLoaded: false,
33
  page: 1,
 
34
 
35
- fetchSources: function (callback) {
36
- Pagination.showLoading();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
  $.ajax({
39
- url: 'http://dev.wpra/wp-json/wpra/v1/sources',
40
  method: 'GET',
41
  data: {
42
  num: Config.perPage,
43
- page: Store.page
44
  },
45
  beforeSend: function (request) {
46
  request.setRequestHeader("X-WP-NONCE", Config.restApiNonce);
@@ -48,15 +146,32 @@
48
  success: function (response) {
49
  if (response && response.items) {
50
  Store.count = response.count;
51
- Store.feeds = response.items.sort(function (a, b) {
52
- return Util.compareTimeObjs(Feed.getUpdateTime(a), Feed.getUpdateTime(b));
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  });
54
- }
55
 
56
- Pagination.update();
57
- Table.update();
58
- Timeline.update();
59
- Info.update();
 
 
 
 
 
60
 
61
  if (callback) {
62
  callback();
@@ -65,9 +180,6 @@
65
  error: function (response) {
66
  console.error(response);
67
  },
68
- complete: function () {
69
- Pagination.hideLoading();
70
- }
71
  });
72
  },
73
 
@@ -77,31 +189,61 @@
77
  : interval;
78
  },
79
 
80
- getGroupedFeeds: function () {
81
- var grouped = {};
82
 
83
  for (var i in Store.feeds) {
84
  var feed = Store.feeds[i];
85
  var time = Feed.getUpdateTime(feed),
86
- timeStr = Util.formatTimeObj(time);
87
 
88
- if (!grouped[timeStr]) {
89
- grouped[timeStr] = [];
90
  }
91
 
92
- grouped[timeStr].push(feed);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  }
94
 
95
  var collapsed = {};
96
- for (var timeStr in grouped) {
97
  // Get the time object and string for the previous minute
98
- var group = grouped[timeStr],
99
- time = Util.parseTimeStr(timeStr),
100
- prevTime = Util.addTime(time, {hours: 0, minutes: -1}),
101
- prevTimeStr = Util.formatTimeObj(prevTime);
102
 
103
  // The key to use - either this group's time string or a time string for 1 minute less
104
- var key = grouped.hasOwnProperty(prevTimeStr)
105
  ? prevTimeStr
106
  : timeStr;
107
 
@@ -114,7 +256,7 @@
114
  collapsed[key] = collapsed[key].concat(group);
115
  }
116
 
117
- return Object.keys(collapsed).sort().reduce((acc, key) => (acc[key] = collapsed[key], acc), {});
118
  },
119
  };
120
 
@@ -126,14 +268,12 @@
126
  return feed.active ? 'active' : 'paused';
127
  },
128
  getUpdateInterval: function (feed) {
129
- return (feed.update_interval === 'global')
130
- ? Config.globalWord
131
- : feed.update_interval;
132
  },
133
  getUpdateTime: function (feed) {
134
  return (feed.update_time)
135
- ? Util.parseTimeStr(feed.update_time)
136
- : Util.parseTimeStr(Config.globalTime);
137
  },
138
  };
139
 
@@ -143,41 +283,117 @@
143
  var Table = {
144
  element: null,
145
  body: null,
146
- hovered: null,
 
 
147
  init: function () {
148
  if (Table.element === null) {
149
  Table.element = $('#wpra-crons-tool-table');
150
  Table.body = Table.element.find('tbody');
151
  }
152
- if (Store.feeds === null) {
153
- Store.fetchSources();
154
- }
155
  },
156
  createRow: function (feed) {
157
  var id = feed.id,
158
  state = Feed.getState(feed),
159
  name = feed.name,
160
- interval = Util.getIntervalName(Feed.getUpdateInterval(feed)),
161
- timeStr = Util.formatTimeObj(Feed.getUpdateTime(feed));
162
 
163
  var elRow = $('<tr></tr>').addClass('wpra-crons-feed-' + Feed.getState(feed));
164
 
165
- $('<td></td>').appendTo(elRow).addClass('wpra-crons-feed-id-col').text('#' + id);
166
- $('<td></td>').appendTo(elRow).addClass('wpra-crons-feed-name-col').text(name);
167
- $('<td></td>').appendTo(elRow).addClass('wpra-crons-interval-col').text(interval);
168
- $('<td></td>').appendTo(elRow).addClass('wpra-crons-time-col').text(timeStr ? timeStr : '');
169
 
170
- elRow.on('click', function (e) {
171
- Table.body.find('.wpra-crons-highlighted-feed').removeClass('wpra-crons-highlighted-feed');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
172
 
173
- if (Table.hovered === id) {
174
- Table.hovered = null;
175
- } else {
176
  $(this).addClass('wpra-crons-highlighted-feed');
177
- Table.hovered = id;
178
- }
179
 
180
- Timeline.update();
 
 
 
 
 
 
 
 
181
  });
182
 
183
  return elRow;
@@ -185,8 +401,13 @@
185
  update: function () {
186
  Table.body.empty();
187
 
188
- for (var i in Store.feeds) {
189
- Table.body.append(Table.createRow(Store.feeds[i]));
 
 
 
 
 
190
  }
191
  },
192
  };
@@ -195,55 +416,67 @@
195
  * The pagination component.
196
  */
197
  var Pagination = {
 
198
  nextBtn: null,
199
  prevBtn: null,
200
- numFeeds: null,
201
- loadingText: null,
 
 
202
  // Initializes the pagination
203
  init: function () {
204
  Pagination.nextBtn = $('#wpra-crons-next-page');
205
  Pagination.prevBtn = $('#wpra-crons-prev-page');
 
 
 
 
206
  Pagination.numFeeds = $('.wpra-crons-num-feeds');
207
- Pagination.loadingText = $('#wpra-crons-loading');
208
 
209
  // Hide the feed counter until the component updates
210
  Pagination.numFeeds.parent().hide();
211
 
212
  Pagination.nextBtn.click(Pagination.nextPage);
213
  Pagination.prevBtn.click(Pagination.prevPage);
 
 
214
  },
215
  // Updates the pagination component
216
  update: function () {
217
- Pagination.nextBtn.prop('disabled', Store.page >= Pagination.getNumPages());
218
- Pagination.prevBtn.prop('disabled', Store.page <= 1);
 
 
 
 
 
 
219
 
220
  Pagination.numFeeds.text(Store.count);
221
  Pagination.numFeeds.parent().toggle(Store.count > 0);
222
  },
223
- // Calculates the number of pages
224
- getNumPages: function () {
225
- return Math.ceil(Store.count / Config.perPage);
 
 
 
226
  },
227
  // Switches to the next page
228
  nextPage: function () {
229
- Pagination.changePage(Math.min(Store.page + 1, Pagination.getNumPages()));
230
  },
231
  // Switches to the previous page
232
  prevPage: function () {
233
- Pagination.changePage(Math.max(Store.page - 1, 1));
234
- },
235
- // Switches to a specific page
236
- changePage: function (page) {
237
- Store.page = page;
238
- Store.fetchSources();
239
  },
240
- // Shows the loading text
241
- showLoading: function () {
242
- Pagination.loadingText.show();
243
  },
244
- // Hides the loading text
245
- hideLoading: function () {
246
- Pagination.loadingText.hide();
247
  },
248
  };
249
 
@@ -305,15 +538,15 @@
305
  textSpacing = 20,
306
  lineY = height - textSpacing - textHeight,
307
  lineColor = "#555",
308
- hourGuideColor = "#888",
309
- minsGuideColor = "#aaa",
310
  lineWidth = 2,
311
  evenTextColor = "#444",
312
  oddTextColor = "#888",
313
- bubbleColor = "#658c6f",
314
- bubbleWarningColor = "#b18e76",
315
- bubbleSeriousColor = "#915759",
316
- bubbleHighlightColor = "#1a83de",
317
  bubbleRadius = 12,
318
  bubbleTopOffset = 5,
319
  bubbleTop = (bubbleRadius * 2) + bubbleTopOffset;
@@ -336,18 +569,19 @@
336
 
337
  // Pad along the x-axis so that the numbers are not exactly at the edges
338
  ctx.translate(axisOffset, 0);
 
339
 
340
  // Draw the numbers and dotted lines
341
  {
342
- var hourWidth = width / 24,
343
  minFontSize = 12,
344
  maxFontSize = 18,
345
  fontSizeRatio = 0.011,
346
- fontSize = Math.max(Math.min(width * fontSizeRatio, maxFontSize), minFontSize);
347
 
348
  ctx.font = fontSize + "px sans-serif";
349
  ctx.textBaseline = "hanging";
350
- for (var hour = 0; hour < 24; ++hour) {
351
  var hourStr = (hour < 10) ? "0" + hour : hour,
352
  text = hourStr + ":00",
353
  even = (hour % 2 === 0),
@@ -357,15 +591,16 @@
357
  ty = y + 3,
358
  color = (even) ? evenTextColor : oddTextColor;
359
 
360
- ctx.save();
361
-
362
- ctx.translate(tx, ty);
363
- ctx.rotate(Math.PI / 5);
364
- ctx.fillStyle = color;
365
- ctx.textAlign = "left";
366
- ctx.fillText(text, 0, 0);
367
-
368
- ctx.restore();
 
369
 
370
  // The hour guide lines
371
  ctx.save();
@@ -395,139 +630,189 @@
395
 
396
  // Draw the indicators
397
  {
398
- if (Store.feeds && Store.feeds.length) {
399
- var minuteWidth = width / (24 * 60),
400
- fetchDuration = 5, // in minutes
401
- fetchWidth = fetchDuration * minuteWidth;
402
-
403
- var groups = Store.getGroupedFeeds();
404
- var drawLater = {};
405
-
406
- var drawFn = function (group, timeStr, highlighted) {
407
- var time = Util.parseTimeStr(timeStr),
408
- groupX = (time.hours * hourWidth) + (time.minutes / 60 * hourWidth),
409
- count = group.length,
410
- color = bubbleColor,
411
- bgColor = "#fff",
412
- textColor = color;
413
-
414
- if (highlighted) {
415
- color = bubbleHighlightColor;
416
- bgColor = color;
417
- textColor = "#fff";
418
- } else if (count > 10) {
419
- color = bubbleSeriousColor;
420
- } else if (count > 5) {
421
- color = bubbleWarningColor;
422
- }
423
 
424
- // Draw the indicator line
425
- ctx.save();
426
- ctx.beginPath();
427
- ctx.moveTo(groupX, lineY);
428
- ctx.lineTo(groupX, bubbleTop);
429
- ctx.lineCap = "square";
430
- ctx.lineWidth = 2;
431
- ctx.strokeStyle = color;
432
- ctx.stroke();
433
- ctx.restore();
434
 
435
- // Draw the bubble
436
- ctx.save();
437
- ctx.beginPath();
438
- ctx.arc(groupX, bubbleRadius + bubbleTopOffset, bubbleRadius, 0, 2 * Math.PI);
439
- ctx.fillStyle = bgColor;
440
- ctx.fill();
441
- ctx.lineWidth = 2;
442
- ctx.strokeStyle = color;
443
- ctx.stroke();
444
- ctx.restore();
445
 
446
- // Draw the feed count
447
- ctx.save();
448
- ctx.font = "12px sans-serif";
449
- ctx.textAlign = "center";
450
- ctx.textBaseline = "middle";
451
- ctx.fillStyle = textColor;
452
- ctx.fillText(count, groupX, bubbleRadius + bubbleTopOffset + 1);
453
- ctx.restore();
454
- };
 
455
 
456
- for (var timeStr in groups) {
457
- var group = groups[timeStr];
 
 
 
 
 
 
 
458
 
459
- var hasHighlightedFeed = Table.hovered !== null && group.find(function (feed) {
460
- return feed.id === Table.hovered;
461
- });
462
 
463
- if (hasHighlightedFeed) {
464
- drawLater[timeStr] = group;
465
- }
466
 
 
 
467
  drawFn(group, timeStr);
 
 
468
  }
469
 
470
- for (var timeStr in drawLater) {
471
- drawFn(drawLater[timeStr], timeStr, true);
 
 
 
 
 
 
 
 
472
  }
 
 
 
 
 
 
 
473
  }
474
  }
475
 
476
  ctx.translate(0, 0);
477
  },
478
-
479
- drawLollipop: function () {
480
-
481
- },
482
  };
483
 
 
484
  /**
485
- * Utility functions.
486
  */
487
- var Util = {
488
- getIntervalName: function (interval) {
489
- return Config.schedules[interval]
490
- ? Config.schedules[interval]['display']
491
- : interval;
 
492
  },
493
- formatTimeObj: function (obj) {
494
- if (!obj) {
495
  return "";
496
  }
497
 
498
- var hours = obj.hours < 10 ? "0" + obj.hours : obj.hours;
499
- var minutes = obj.minutes < 10 ? "0" + obj.minutes : obj.minutes;
500
 
501
  return hours + ":" + minutes;
502
  },
503
- parseTimeStr: function (timeStr) {
504
- var parts = timeStr.split(':');
505
  var hours = parseInt(parts[0]);
506
  var mins = parseInt(parts[1]);
507
 
508
- return {hours: hours, minutes: mins};
509
  },
510
- addTime: function (obj1, obj2) {
 
 
 
 
 
 
 
 
 
511
  var newObj = {
512
- hours: obj1.hours + obj2.hours,
513
- minutes: obj1.minutes + obj2.minutes
514
  };
515
 
516
- newObj.hours = (newObj.hours + Math.floor(newObj.minutes / 60)) % 23;
 
 
517
  newObj.minutes = newObj.minutes % 60;
518
 
 
 
 
 
 
519
  return newObj;
520
  },
521
- compareTimeObjs(a, b) {
522
- var an = (a.hours * 60) + a.minutes;
523
- var bn = (b.hours * 60) + b.minutes;
 
 
 
 
 
 
524
 
525
  if (an === bn) {
526
  return 0;
527
  }
528
 
529
  return (an < bn) ? -1 : 1;
530
- }
 
 
 
 
 
 
 
 
 
 
 
531
  };
532
 
533
  })(jQuery, WpraCronsTool);
1
+ (function ($, Config, undefined) {
2
+
3
+ // The length of a day in seconds
4
+ var DAY_IN_SECONDS = 24 * 60 * 60;
5
 
6
  // Update the table only when the tool is shown
7
  $(document).on('wpra/tools/on_loaded', function (event, tool) {
20
  * Initializes the crons tool.
21
  */
22
  function init() {
23
+ Loading.init();
24
  Pagination.init();
25
  Table.init();
26
  Timeline.init();
27
  Info.init();
28
+
29
+ Store.init();
30
  }
31
 
32
+ /**
33
+ * The loading component.
34
+ */
35
+ var Loading = {
36
+ element: null,
37
+ wrapper: null,
38
+ shown: false,
39
+ progress: null,
40
+ maxWidth: 100,
41
+ init: function () {
42
+ Loading.element = $('.wpra-crons-loading');
43
+ Loading.wrapper = $('.wpra-crons-wrap');
44
+ Loading.bar = Loading.element.find('.wpra-crons-loading-bar');
45
+
46
+ Loading.hide().update();
47
+ },
48
+ update: function () {
49
+ Loading.element.toggle(Loading.shown);
50
+ Loading.wrapper.toggle(!Loading.shown);
51
+
52
+ Loading.bar.css({
53
+ width: (Loading.progress * Loading.maxWidth) + '%'
54
+ });
55
+ },
56
+ setProgress: function (progress) {
57
+ Loading.progress = progress;
58
+
59
+ return Loading;
60
+ },
61
+ show: function () {
62
+ Loading.shown = true;
63
+
64
+ return Loading;
65
+ },
66
+ hide: function () {
67
+ Loading.shown = false;
68
+ Loading.progress = 0;
69
+
70
+ return Loading;
71
+ },
72
+ };
73
+
74
  /**
75
  * The data store.
76
  */
77
  var Store = {
78
+ feeds: [],
79
+ groups: {},
80
  count: 0,
81
  isLoaded: false,
82
  page: 1,
83
+ numPages: 1,
84
 
85
+ init: function () {
86
+ // Show the loading message with an empty progress bar
87
+ Loading.setProgress(0).show().update();
88
+
89
+ var currPage = 1;
90
+ var loadNextPage = function () {
91
+ // Update the loading
92
+ Loading.setProgress(currPage / Store.numPages).update();
93
+
94
+ // If reached the last page, hide the progress bar
95
+ if (currPage >= Store.numPages) {
96
+ // Generate the groups
97
+ Store.groupFeeds();
98
+
99
+ // Update the components
100
+ setTimeout(function () {
101
+ Loading.hide().update();
102
+ Pagination.update();
103
+ Table.update();
104
+ Timeline.update();
105
+ Info.update();
106
+ }, 500);
107
+
108
+ return;
109
+ }
110
+
111
+ // Increment the page
112
+ currPage++;
113
+
114
+ // Fetch the page
115
+ Store.fetchSources(currPage, loadNextPage);
116
+ };
117
+
118
+ // Load the first page
119
+ Store.fetchSources(1, loadNextPage);
120
+ },
121
+
122
+ update: function (delegateUpate) {
123
+ // Re-group the feeds
124
+ Store.groupFeeds();
125
+
126
+ // Update the table and timeline
127
+ if (delegateUpate !== false) {
128
+ Table.update();
129
+ Timeline.update();
130
+ }
131
+ },
132
+
133
+ fetchSources: function (page, callback) {
134
+ page = (page === null || page === undefined) ? Store.page : page;
135
 
136
  $.ajax({
137
+ url: Config.restUrl + '/wpra/v1/sources',
138
  method: 'GET',
139
  data: {
140
  num: Config.perPage,
141
+ page: page
142
  },
143
  beforeSend: function (request) {
144
  request.setRequestHeader("X-WP-NONCE", Config.restApiNonce);
146
  success: function (response) {
147
  if (response && response.items) {
148
  Store.count = response.count;
149
+ Store.feeds = Store.feeds.concat(response.items);
150
+
151
+ if (!Store.isLoaded) {
152
+ Store.numPages = Math.ceil(Store.count / Store.feeds.length);
153
+ }
154
+
155
+ // Save the original cron information
156
+ Store.feeds = Store.feeds.map(function (feed) {
157
+ feed.original = {
158
+ active: feed.active,
159
+ update_time: feed.update_time,
160
+ update_interval: feed.update_interval,
161
+ };
162
+
163
+ return feed;
164
  });
 
165
 
166
+ // Sort the feeds
167
+ Store.feeds = Store.feeds.sort(function (a, b) {
168
+ return Time.compare(Feed.getUpdateTime(a), Feed.getUpdateTime(b));
169
+ });
170
+
171
+ Store.isLoaded = true;
172
+
173
+ Store.update();
174
+ }
175
 
176
  if (callback) {
177
  callback();
180
  error: function (response) {
181
  console.error(response);
182
  },
 
 
 
183
  });
184
  },
185
 
189
  : interval;
190
  },
191
 
192
+ groupFeeds: function () {
193
+ Store.groups = {};
194
 
195
  for (var i in Store.feeds) {
196
  var feed = Store.feeds[i];
197
  var time = Feed.getUpdateTime(feed),
198
+ timeStr = Time.format(time);
199
 
200
+ if (!Store.groups[timeStr]) {
201
+ Store.groups[timeStr] = [];
202
  }
203
 
204
+ Store.groups[timeStr].push(feed);
205
+
206
+ // Get the interval time in seconds
207
+ var interval = Config.schedules[Feed.getUpdateInterval(feed)]['interval'];
208
+ var intervalObj = Time.fromSeconds(interval);
209
+
210
+ // Add recurrences for feeds that fetch more than once a day
211
+ if (interval < DAY_IN_SECONDS) {
212
+ var t = {
213
+ hours: time.hours,
214
+ minutes: time.minutes,
215
+ };
216
+
217
+ var numRepeats = Math.floor(DAY_IN_SECONDS / interval) - 1;
218
+ for (var i = 0; i < numRepeats; ++i) {
219
+ // Add the interval to the temporary time
220
+ t = Time.add(t, intervalObj);
221
+
222
+ // Convert to seconds, clamp to 24 hours and convert back to an object
223
+ // This lets us format it into a time string without having 24+ hours
224
+ var t2 = Time.fromSeconds(Time.toSeconds(t) % DAY_IN_SECONDS);
225
+ // Get the time string for the clamped time
226
+ var str = Time.format(t2);
227
+
228
+ // Add the recurrence to the groups
229
+ if (!Store.groups[str]) {
230
+ Store.groups[str] = [];
231
+ }
232
+ Store.groups[str].push(feed);
233
+ }
234
+ }
235
  }
236
 
237
  var collapsed = {};
238
+ for (var timeStr in Store.groups) {
239
  // Get the time object and string for the previous minute
240
+ var group = Store.groups[timeStr],
241
+ time = Time.parse(timeStr),
242
+ prevTime = Time.add(time, {hours: 0, minutes: -1}),
243
+ prevTimeStr = Time.format(prevTime);
244
 
245
  // The key to use - either this group's time string or a time string for 1 minute less
246
+ var key = Store.groups.hasOwnProperty(prevTimeStr)
247
  ? prevTimeStr
248
  : timeStr;
249
 
256
  collapsed[key] = collapsed[key].concat(group);
257
  }
258
 
259
+ Store.groups = Object.keys(collapsed).sort().reduce((acc, key) => (acc[key] = collapsed[key], acc), {});
260
  },
261
  };
262
 
268
  return feed.active ? 'active' : 'paused';
269
  },
270
  getUpdateInterval: function (feed) {
271
+ return feed.update_interval;
 
 
272
  },
273
  getUpdateTime: function (feed) {
274
  return (feed.update_time)
275
+ ? Time.parse(feed.update_time)
276
+ : Time.parse(Config.globalTime);
277
  },
278
  };
279
 
283
  var Table = {
284
  element: null,
285
  body: null,
286
+ page: 1,
287
+ numPerPage: Config.perPage,
288
+ highlighted: null,
289
  init: function () {
290
  if (Table.element === null) {
291
  Table.element = $('#wpra-crons-tool-table');
292
  Table.body = Table.element.find('tbody');
293
  }
 
 
 
294
  },
295
  createRow: function (feed) {
296
  var id = feed.id,
297
  state = Feed.getState(feed),
298
  name = feed.name,
299
+ interval = Feed.getUpdateInterval(feed),
300
+ timeStr = Time.format(Feed.getUpdateTime(feed));
301
 
302
  var elRow = $('<tr></tr>').addClass('wpra-crons-feed-' + Feed.getState(feed));
303
 
304
+ var idCol = $('<td></td>').appendTo(elRow).addClass('wpra-crons-feed-id-col').text('#' + id);
305
+ var nameCol = $('<td></td>').appendTo(elRow).addClass('wpra-crons-feed-name-col').text(name);
306
+ var intervalCol = $('<td></td>').appendTo(elRow).addClass('wpra-crons-interval-col');
307
+ var timeCol = $('<td></td>').appendTo(elRow).addClass('wpra-crons-time-col');
308
 
309
+ {
310
+ // The interval selector
311
+ var intervalSelect = $('<select>').appendTo(intervalCol);
312
+ // The reset time button
313
+ var resetIntervalBtn = $('<a>').appendTo(intervalCol)
314
+ .attr('href', 'javascript:void(0)')
315
+ .addClass('wpra-crons-reset-interval')
316
+ .text('Reset')
317
+ .toggle(feed.update_interval !== feed.original.update_interval);
318
+
319
+ // Add the options to the interval selector
320
+ for (var i in Config.schedules) {
321
+ var option = $('<option>')
322
+ .val(i)
323
+ .text(Config.schedules[i]['display'])
324
+ .prop('selected', i === interval);
325
+
326
+ intervalSelect.append(option);
327
+ }
328
+
329
+ // Event for when the selected interval changes
330
+ intervalSelect.on('change', function () {
331
+ var newInterval = $(this).val();
332
+
333
+ // Show the reset button if the value is different from the original
334
+ resetIntervalBtn.toggle(newInterval !== feed.original.update_interval);
335
+
336
+ // Update the time in the store
337
+ feed.update_interval = newInterval;
338
+ Store.update(false);
339
+ Timeline.update();
340
+ });
341
+
342
+ // Event for when the reset interval button is clicked
343
+ resetIntervalBtn.click(function () {
344
+ feed.update_interval = feed.original.update_interval;
345
+ Store.update();
346
+ });
347
+ }
348
+
349
+ {
350
+ // The time field
351
+ var timeField = $('<input />').appendTo(timeCol).attr({type: 'time', value: timeStr});
352
+ // The reset time button
353
+ var resetTimeBtn = $('<a>').appendTo(timeCol)
354
+ .attr('href', 'javascript:void(0)')
355
+ .addClass('wpra-crons-reset-time')
356
+ .text('Reset')
357
+ .toggle(feed.update_time !== feed.original.update_time);
358
+
359
+
360
+ // When the time field's value changes, update the store and timeline
361
+ // (But not the table, otherwise the field will lose focus)
362
+ timeField.on('change', function (e) {
363
+ var newTime = $(this).val();
364
+
365
+ // Show the reset button if the value is different from the original
366
+ resetTimeBtn.toggle(newTime !== feed.original.update_time);
367
+
368
+ // Update the time in the store
369
+ feed.update_time = newTime;
370
+ Store.update(false);
371
+ Timeline.update();
372
+ });
373
+
374
+ // Event for when the reset time button is clicked
375
+ resetTimeBtn.click(function () {
376
+ feed.update_time = feed.original.update_time;
377
+ Store.update();
378
+ });
379
+ }
380
+
381
+ elRow.on('hover', function (e) {
382
+ if (e.type === "mouseenter") {
383
+ Table.body.find('.wpra-crons-highlighted-feed').removeClass('wpra-crons-highlighted-feed');
384
 
 
 
 
385
  $(this).addClass('wpra-crons-highlighted-feed');
386
+ Table.highlighted = id;
 
387
 
388
+ Timeline.update();
389
+ } else {
390
+ if (Table.highlighted === id) {
391
+ $(this).removeClass('wpra-crons-highlighted-feed');
392
+ Table.highlighted = null;
393
+
394
+ Timeline.update();
395
+ }
396
+ }
397
  });
398
 
399
  return elRow;
401
  update: function () {
402
  Table.body.empty();
403
 
404
+ var pagedFeeds = Store.feeds.slice(
405
+ Table.numPerPage * (Table.page - 1),
406
+ Table.numPerPage * Table.page
407
+ );
408
+
409
+ for (var i in pagedFeeds) {
410
+ Table.body.append(Table.createRow(pagedFeeds[i]));
411
  }
412
  },
413
  };
416
  * The pagination component.
417
  */
418
  var Pagination = {
419
+ numFeeds: null,
420
  nextBtn: null,
421
  prevBtn: null,
422
+ firstPageBtn: null,
423
+ lastPageBtn: null,
424
+ currPageSpan: null,
425
+ numPagesSpan: null,
426
  // Initializes the pagination
427
  init: function () {
428
  Pagination.nextBtn = $('#wpra-crons-next-page');
429
  Pagination.prevBtn = $('#wpra-crons-prev-page');
430
+ Pagination.firstPageBtn = $('#wpra-crons-first-page');
431
+ Pagination.lastPageBtn = $('#wpra-crons-last-page');
432
+ Pagination.currPageSpan = $('.wpra-crons-curr-page');
433
+ Pagination.numPagesSpan = $('.wpra-crons-num-pages');
434
  Pagination.numFeeds = $('.wpra-crons-num-feeds');
 
435
 
436
  // Hide the feed counter until the component updates
437
  Pagination.numFeeds.parent().hide();
438
 
439
  Pagination.nextBtn.click(Pagination.nextPage);
440
  Pagination.prevBtn.click(Pagination.prevPage);
441
+ Pagination.firstPageBtn.click(Pagination.firstPage);
442
+ Pagination.lastPageBtn.click(Pagination.lastPage);
443
  },
444
  // Updates the pagination component
445
  update: function () {
446
+ Pagination.currPageSpan.text(Table.page);
447
+ Pagination.numPagesSpan.text(Store.numPages);
448
+
449
+ Pagination.nextBtn.prop('disabled', Table.page >= Store.numPages);
450
+ Pagination.prevBtn.prop('disabled', Table.page <= 1);
451
+
452
+ Pagination.firstPageBtn.prop('disabled', Table.page <= 1);
453
+ Pagination.lastPageBtn.prop('disabled', Table.page === Store.numPages);
454
 
455
  Pagination.numFeeds.text(Store.count);
456
  Pagination.numFeeds.parent().toggle(Store.count > 0);
457
  },
458
+ // Switches to a specific page
459
+ changePage: function (page) {
460
+ Table.page = page;
461
+
462
+ Table.update();
463
+ Pagination.update();
464
  },
465
  // Switches to the next page
466
  nextPage: function () {
467
+ Pagination.changePage(Math.min(Table.page + 1, Store.numPages));
468
  },
469
  // Switches to the previous page
470
  prevPage: function () {
471
+ Pagination.changePage(Math.max(Table.page - 1, 1));
 
 
 
 
 
472
  },
473
+ // Switches to the first page
474
+ firstPage: function () {
475
+ Pagination.changePage(1);
476
  },
477
+ // Switches to the last page
478
+ lastPage: function () {
479
+ Pagination.changePage(Store.numPages);
480
  },
481
  };
482
 
538
  textSpacing = 20,
539
  lineY = height - textSpacing - textHeight,
540
  lineColor = "#555",
541
+ hourGuideColor = "#666",
542
+ minsGuideColor = "#999",
543
  lineWidth = 2,
544
  evenTextColor = "#444",
545
  oddTextColor = "#888",
546
+ bubbleColor = "#317596",
547
+ bubbleWarningColor = "#b97d50",
548
+ bubbleSeriousColor = "#9b3832",
549
+ bubbleBlurColor = "#ccc",
550
  bubbleRadius = 12,
551
  bubbleTopOffset = 5,
552
  bubbleTop = (bubbleRadius * 2) + bubbleTopOffset;
569
 
570
  // Pad along the x-axis so that the numbers are not exactly at the edges
571
  ctx.translate(axisOffset, 0);
572
+ var availWidth = width - (axisOffset * 2);
573
 
574
  // Draw the numbers and dotted lines
575
  {
576
+ var hourWidth = availWidth / 24,
577
  minFontSize = 12,
578
  maxFontSize = 18,
579
  fontSizeRatio = 0.011,
580
+ fontSize = Math.max(Math.min(availWidth * fontSizeRatio, maxFontSize), minFontSize);
581
 
582
  ctx.font = fontSize + "px sans-serif";
583
  ctx.textBaseline = "hanging";
584
+ for (var hour = 0; hour <= 24; ++hour) {
585
  var hourStr = (hour < 10) ? "0" + hour : hour,
586
  text = hourStr + ":00",
587
  even = (hour % 2 === 0),
591
  ty = y + 3,
592
  color = (even) ? evenTextColor : oddTextColor;
593
 
594
+ // Do not draw the hour text for 24:00 or later
595
+ if (hour < 24) {
596
+ ctx.save();
597
+ ctx.translate(tx, ty);
598
+ ctx.rotate(Math.PI / 5);
599
+ ctx.fillStyle = color;
600
+ ctx.textAlign = "left";
601
+ ctx.fillText(text, 0, 0);
602
+ ctx.restore();
603
+ }
604
 
605
  // The hour guide lines
606
  ctx.save();
630
 
631
  // Draw the indicators
632
  {
633
+ var minuteWidth = availWidth / (24 * 60),
634
+ fetchDuration = 5, // in minutes
635
+ fetchWidth = fetchDuration * minuteWidth;
636
+
637
+ // The function for drawing a group
638
+ var drawFn = function (group, timeStr, highlighted) {
639
+ var time = Time.parse(timeStr),
640
+ groupX = (time.hours * hourWidth) + (time.minutes / 60 * hourWidth),
641
+ count = group.length,
642
+ color = bubbleColor,
643
+ bgColor = "#fff",
644
+ textColor = color;
645
+
646
+ if (count > 10) {
647
+ textColor = color = bubbleSeriousColor;
648
+ } else if (count > 5) {
649
+ textColor = color = bubbleWarningColor;
650
+ }
 
 
 
 
 
 
 
651
 
652
+ // If highlighted is `true`, draw highlighted group
653
+ // If highlighted is `false`, draw blurred group
654
+ // If highlighted is anything else, draw normally
655
+ if (highlighted === true) {
656
+ bgColor = color;
657
+ textColor = "#fff";
658
+ } else if (highlighted === false) {
659
+ color = bubbleBlurColor;
660
+ textColor = bubbleBlurColor;
661
+ }
662
 
663
+ // Draw the indicator line
664
+ ctx.save();
665
+ ctx.beginPath();
666
+ ctx.moveTo(groupX, lineY);
667
+ ctx.lineTo(groupX, bubbleTop);
668
+ ctx.lineCap = "square";
669
+ ctx.lineWidth = 2;
670
+ ctx.strokeStyle = color;
671
+ ctx.stroke();
672
+ ctx.restore();
673
 
674
+ // Draw the bubble
675
+ ctx.save();
676
+ ctx.beginPath();
677
+ ctx.arc(groupX, bubbleRadius + bubbleTopOffset, bubbleRadius, 0, 2 * Math.PI);
678
+ ctx.fillStyle = bgColor;
679
+ ctx.fill();
680
+ ctx.lineWidth = 2;
681
+ ctx.strokeStyle = color;
682
+ ctx.stroke();
683
+ ctx.restore();
684
 
685
+ // Draw the feed count
686
+ ctx.save();
687
+ ctx.font = "12px sans-serif";
688
+ ctx.textAlign = "center";
689
+ ctx.textBaseline = "middle";
690
+ ctx.fillStyle = textColor;
691
+ ctx.fillText(count, groupX, bubbleRadius + bubbleTopOffset + 1);
692
+ ctx.restore();
693
+ };
694
 
695
+ // Stores groups to be drawn later, for a higher "z index"
696
+ var drawLater = {};
 
697
 
698
+ // Draw the groups
699
+ for (var timeStr in Store.groups) {
700
+ var group = Store.groups[timeStr];
701
 
702
+ // If no group is highlighted, draw normally
703
+ if (Table.highlighted === null) {
704
  drawFn(group, timeStr);
705
+
706
+ continue;
707
  }
708
 
709
+ // Check if the group contains the highlighted feed
710
+ var hasHighlightedFeed = group.find(function (feed) {
711
+ return feed.id === Table.highlighted;
712
+ });
713
+
714
+ // If so, draw it later
715
+ if (hasHighlightedFeed) {
716
+ drawLater[timeStr] = group;
717
+
718
+ continue;
719
  }
720
+
721
+ // If not, draw it as blurred
722
+ drawFn(group, timeStr, false);
723
+ }
724
+
725
+ for (var timeStr in drawLater) {
726
+ drawFn(drawLater[timeStr], timeStr, true);
727
  }
728
  }
729
 
730
  ctx.translate(0, 0);
731
  },
 
 
 
 
732
  };
733
 
734
+
735
  /**
736
+ * Time related functions.
737
  */
738
+ var Time = {
739
+ create: function (h, m) {
740
+ return {
741
+ hours: h,
742
+ minutes: m
743
+ };
744
  },
745
+ format: function (time) {
746
+ if (!time) {
747
  return "";
748
  }
749
 
750
+ var hours = time.hours < 10 ? "0" + time.hours : time.hours;
751
+ var minutes = time.minutes < 10 ? "0" + time.minutes : time.minutes;
752
 
753
  return hours + ":" + minutes;
754
  },
755
+ parse: function (str) {
756
+ var parts = str.split(':');
757
  var hours = parseInt(parts[0]);
758
  var mins = parseInt(parts[1]);
759
 
760
+ return Time.create(hours, mins);
761
  },
762
+ toSeconds: function (time) {
763
+ return time.hours * 3600 + time.minutes * 60;
764
+ },
765
+ fromSeconds: function (seconds) {
766
+ var hours = Math.floor(seconds / 3600);
767
+ var minutes = (seconds - (hours * 3600)) / 60;
768
+
769
+ return Time.create(hours, minutes);
770
+ },
771
+ add: function (time1, time2, clamp) {
772
  var newObj = {
773
+ hours: time1.hours + time2.hours,
774
+ minutes: time1.minutes + time2.minutes
775
  };
776
 
777
+ // Add overflowing minutes to the hours
778
+ newObj.hours += Math.floor(newObj.minutes / 60);
779
+ // Clamp the minutes
780
  newObj.minutes = newObj.minutes % 60;
781
 
782
+ // If clamping is on, clamp the hours to 24
783
+ if (clamp !== false) {
784
+ newObj.hours = newObj.hours % 24;
785
+ }
786
+
787
  return newObj;
788
  },
789
+ diff: function (time1, time2, clamp) {
790
+ return Time.add(time1, {
791
+ hours: -(time2.hours),
792
+ minutes: -(time2.minutes),
793
+ }, clamp);
794
+ },
795
+ compare(a, b) {
796
+ var an = Time.toSeconds(a);
797
+ var bn = Time.toSeconds(b);
798
 
799
  if (an === bn) {
800
  return 0;
801
  }
802
 
803
  return (an < bn) ? -1 : 1;
804
+ },
805
+ };
806
+
807
+ /**
808
+ * Utility functions.
809
+ */
810
+ var Util = {
811
+ getIntervalName: function (interval) {
812
+ return Config.schedules[interval]
813
+ ? Config.schedules[interval]['display']
814
+ : interval;
815
+ },
816
  };
817
 
818
  })(jQuery, WpraCronsTool);
js/src/components/BottomPanel.vue DELETED
@@ -1,9 +0,0 @@
1
- <template>
2
- <div class="wpra-bottom-panel">
3
- <slot></slot>
4
- </div>
5
- </template>
6
-
7
- <script>
8
- export default {}
9
- </script>
 
 
 
 
 
 
 
 
 
js/src/components/Button.js DELETED
@@ -1,14 +0,0 @@
1
- export default {
2
- props: {
3
- loading: {
4
- type: Boolean,
5
- default: false,
6
- }
7
- },
8
- render () {
9
- return <button
10
- disabled={this.loading}
11
- class={{'button': true, 'loading-button': this.loading}}
12
- >{ this.$slots.default }</button>
13
- }
14
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/Expander.vue DELETED
@@ -1,36 +0,0 @@
1
- <template>
2
- <div class="wpra-expander" :class="{'wpra-expander--expanded':isExpanded}">
3
- <div class="wpra-expander__title" @click="isExpanded = !isExpanded">
4
- {{ title }}
5
- <span class="dashicons dashicons-arrow-down-alt2"></span>
6
- </div>
7
- <transition-expand>
8
- <div v-if="isExpanded">
9
- <div class="wpra-expander__content">
10
- <slot></slot>
11
- </div>
12
- </div>
13
- </transition-expand>
14
- </div>
15
- </template>
16
-
17
- <script>
18
- import TransitionExpand from './TransitionExpand'
19
-
20
- export default {
21
- data () {
22
- return {
23
- isExpanded: this.defaultExpanded
24
- }
25
- },
26
- props: {
27
- title: {},
28
- defaultExpanded: {
29
- value: false
30
- }
31
- },
32
- components: {
33
- TransitionExpand
34
- }
35
- }
36
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/Input.js DELETED
@@ -1,100 +0,0 @@
1
- import MediaInput from './MediaInput'
2
-
3
- export default {
4
- mixins: [
5
- MediaInput
6
- ],
7
- props: {
8
- id: {
9
- type: String,
10
- default () {
11
- return Math.random().toString(36).substr(0, 12)
12
- }
13
- },
14
- label: {},
15
- description: {},
16
- after: {},
17
- type: {},
18
- value: {},
19
- placeholder: {},
20
- title: {},
21
- inputDisabled: {},
22
- options: {
23
- default () {
24
- return {}
25
- }
26
- },
27
- },
28
- methods: {
29
- inputNode () {
30
- if (this.type === 'media') {
31
- return this.mediaNode()
32
- }
33
-
34
- if (this.type === 'checkbox') {
35
- return <input type="checkbox"
36
- id={this.id}
37
- checked={!!this.value}
38
- onChange={() => this.$emit('input', !this.value)}
39
- placeholder={this.placeholder}
40
- disabled={this.$attrs.disabled || this.inputDisabled}
41
- {...{attrs: this.$attrs}}
42
- />
43
- }
44
-
45
- if (this.type !== 'select') {
46
- return <input type={this.type}
47
- value={this.value}
48
- id={this.id}
49
- onInput={(e) => this.$emit('input', e.target.value)}
50
- placeholder={this.placeholder}
51
- disabled={this.$attrs.disabled || this.inputDisabled}
52
- {...{attrs: this.$attrs}}
53
- />
54
- }
55
- return this.selectNode()
56
- },
57
-
58
- selectNode () {
59
- let options = Object.keys(this.options)
60
- .map(key => <option value={key} selected={ this.value === key }>{ this.options[key] }</option>)
61
-
62
- return <select
63
- {...{attrs: this.$attrs}}
64
- id={this.id}
65
- disabled={this.$attrs.disabled || this.inputDisabled}
66
- onChange={(e) => this.$emit('input', e.target.value)}
67
- >{ options }</select>
68
- },
69
- },
70
- render () {
71
- let directives = []
72
-
73
- if (this.title) {
74
- directives.push({
75
- name: 'tippy',
76
- })
77
- }
78
-
79
- return <div class={{'form-input': true, 'form-input--disabled': this.$attrs.disabled || false}}>
80
- { this.label ? (
81
- <label class="form-input__label" for={this.id}>
82
- <div>
83
- {this.label}
84
- {
85
- this.title ? (
86
- <div class="form-input__tip" {...{directives}} title={this.title}>
87
- <span class="dashicons dashicons-editor-help"/>
88
- </div>
89
- ) : null
90
- }
91
- </div>
92
- {this.description ? <div class="form-input__label-description" {...{domProps: {innerHTML: this.description}}}/> : ''}
93
- </label>
94
- ) : null }
95
- <div class="form-input__field">
96
- { this.inputNode() }{ this.after }
97
- </div>
98
- </div>
99
- }
100
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/Layout.js DELETED
@@ -1,11 +0,0 @@
1
- export default {
2
- render () {
3
- return (
4
- <div id="post-body">
5
- {
6
- this.$slots.default
7
- }
8
- </div>
9
- )
10
- }
11
- }
 
 
 
 
 
 
 
 
 
 
 
js/src/components/Main.js DELETED
@@ -1,11 +0,0 @@
1
- export default {
2
- render () {
3
- return (
4
- <div id="postbox-container-2" class="postbox-container">
5
- {
6
- this.$slots.default
7
- }
8
- </div>
9
- )
10
- }
11
- }
 
 
 
 
 
 
 
 
 
 
 
js/src/components/MediaInput.js DELETED
@@ -1,96 +0,0 @@
1
- let imageFrame = null
2
-
3
- /**
4
- * @see https://core.trac.wordpress.org/browser/tags/5.1.1/src/js/_enqueues/wp/media?order=name
5
- *
6
- * @var {{media: Function}} wp
7
- *
8
- * @property {{}} value
9
- */
10
- export default {
11
- props: {
12
- mediaType: {
13
- type: String,
14
- default: 'image'
15
- },
16
- mediaTitle: {
17
- type: String,
18
- default: 'Select Media'
19
- },
20
- /**
21
- * Property to use as a value for the media. Can be `id` or `url`.
22
- *
23
- * @property {string} mediaValueProperty
24
- */
25
- mediaValueProperty: {
26
- type: String,
27
- default: 'id',
28
- },
29
- },
30
- methods: {
31
- mediaNode () {
32
- this.assertMediaLoaded()
33
-
34
- return <div>
35
- <input type="text" value={this.value}/>
36
- <button class="button" onClick={this.openFrame}>Choose image</button>
37
- </div>
38
- },
39
-
40
- openFrame () {
41
- if (!imageFrame) {
42
- imageFrame = this.createFrame()
43
- }
44
- imageFrame.open()
45
- },
46
-
47
- createFrame () {
48
- imageFrame = wp.media({
49
- title: this.mediaTitle,
50
- multiple: false,
51
- library: {
52
- type: this.mediaType,
53
- }
54
- })
55
-
56
- imageFrame.on('close', () => {
57
- const selection = imageFrame.state().get('selection')
58
- let selectedAttachment = null
59
- selection.each((attachment) => {
60
- console.info({attachment})
61
- selectedAttachment = attachment
62
- })
63
- if (!selectedAttachment || !selectedAttachment.id) {
64
- return
65
- }
66
- this.$emit('input', ({
67
- id: selectedAttachment.id,
68
- url: selectedAttachment.attributes.url
69
- })[this.mediaValueProperty])
70
- })
71
-
72
- imageFrame.on('open', () => {
73
- const selection = imageFrame.state().get('selection')
74
-
75
- if (this.mediaValueProperty === 'id' && this.value) {
76
- const attachment = wp.media.attachment(this.value)
77
- attachment.fetch()
78
- selection.add(attachment ? [attachment] : [])
79
- }
80
- })
81
-
82
- return imageFrame
83
- },
84
-
85
- /**
86
- * Check whether wp.media is loaded. If not - throw an error.
87
- *
88
- * @throws Error When wp.media is not loaded.
89
- */
90
- assertMediaLoaded () {
91
- if (!window.wp.media) {
92
- throw Error('[MediaInput] wp.media dependency is not loaded')
93
- }
94
- }
95
- },
96
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/Modal.vue DELETED
@@ -1,114 +0,0 @@
1
- <template>
2
- <transition name="modal-transition">
3
- <div class="modal" v-if="active" @click.self="$emit('close')">
4
- <div :class="['modal__body', this.modalBodyClass]">
5
- <div class="modal__header" :class="headerClass">
6
- <slot name="header"></slot>
7
- </div>
8
- <div class="modal__content">
9
- <slot name="body"></slot>
10
- </div>
11
- <div class="modal__footer">
12
- <slot name="footer"></slot>
13
- </div>
14
- </div>
15
- </div>
16
- </transition>
17
- </template>
18
-
19
- <script>
20
- /**
21
- * Abstract dialog component, solid foundation for
22
- * any modals and dialogs that opened over the rest page content.
23
- *
24
- * @param Vue
25
- */
26
- export default {
27
- props: {
28
- /**
29
- * Determines dialog visibility. This property is passed
30
- * from outside and cannot be changed inside dialog.
31
- * Dialog's consumer is responsible for manipulating dialog's visibility.
32
- *
33
- * @property {bool}
34
- */
35
- active: {
36
- type: Boolean
37
- },
38
-
39
- /**
40
- * Modal title
41
- *
42
- * @property {string}
43
- */
44
- title: {
45
- type: String
46
- },
47
-
48
- /**
49
- * Additional class modifier for modal customization.
50
- *
51
- * @property {string}
52
- */
53
- modalBodyClass: {
54
- type: String,
55
- default: ''
56
- },
57
-
58
- /**
59
- * Additional classes for modal header.
60
- *
61
- * @property {object|Array}
62
- */
63
- headerClass: {
64
- default () {
65
- return {}
66
- }
67
- },
68
-
69
- /**
70
- * Class that applies to the body and used
71
- * to prevent body's scroll catch, so long dialog can be scrolled
72
- * without interfering with body scroll.
73
- *
74
- * @property {string}
75
- */
76
- dialogOpenedClass: {
77
- type: String,
78
- default: 'modal-opened'
79
- }
80
- },
81
-
82
- watch: {
83
- /**
84
- * Watch for "active" property change and emit corresponding
85
- * event when it changed.
86
- *
87
- * @param isDialogActive {bool}
88
- */
89
- active (isDialogActive) {
90
- this.$emit(isDialogActive ? 'open' : 'close')
91
- }
92
- },
93
-
94
- mounted () {
95
- /*
96
- * Add body "frozen" class to the body when dialog is opened.
97
- */
98
- this.$on('open', () => {
99
- document.querySelector('body')
100
- .classList
101
- .add(this.dialogOpenedClass);
102
- });
103
-
104
- /*
105
- * Remove body "frozen" class from the body when dialog is closed.
106
- */
107
- this.$on('close', () => {
108
- document.querySelector('body')
109
- .classList
110
- .remove(this.dialogOpenedClass);
111
- });
112
- },
113
- }
114
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/NoticeBlock.js DELETED
@@ -1,143 +0,0 @@
1
- import Button from './Button'
2
-
3
- /**
4
- * Big notice block that is used to provide some information for users.
5
- * Also can display "learn more" button to allow users to read more about
6
- * the announce.
7
- */
8
- export default {
9
- data () {
10
- return {
11
- shouldBeVisible: true,
12
- }
13
- },
14
-
15
- props: {
16
- /**
17
- * Unique identifier of the notice block.
18
- *
19
- * @property {string}
20
- */
21
- id: {
22
- type: String,
23
- required: true,
24
- },
25
-
26
- /**
27
- * Visible title on top of the block.
28
- *
29
- * @property {string}
30
- */
31
- title: {
32
- type: String,
33
- },
34
-
35
- /**
36
- * The notice's block body. Can be HTML with text formatting, links and so on.
37
- *
38
- * @property {string}
39
- */
40
- body: {
41
- type: String,
42
- },
43
-
44
- /**
45
- * The link to a "learn more" article. Will be opened in a new tab.
46
- * If value is empty, "learn more" button won't be rendered.
47
- *
48
- * @property {string|boolean}
49
- */
50
- learnMore: {
51
- default: false,
52
- },
53
-
54
- /**
55
- * Text on the button that will hide the message.
56
- *
57
- * @property {string}
58
- */
59
- okayText: {
60
- type: String,
61
- default: 'Got it'
62
- },
63
-
64
- /**
65
- * Text on the button that will open a "learn more" article.
66
- *
67
- * @property {string}
68
- */
69
- learnMoreText: {
70
- type: String,
71
- default: 'Learn more'
72
- },
73
-
74
- /**
75
- * Whether the notice block is visible in UI.
76
- *
77
- * @property {boolean}
78
- */
79
- visible: {
80
- type: Boolean,
81
- default: true,
82
- },
83
- },
84
-
85
- computed: {
86
- isVisible () {
87
- return this.visible
88
- && this.shouldBeVisible
89
- && JSON.parse(localStorage.getItem(this.getBlockKey()) || 'true')
90
- }
91
- },
92
-
93
- methods: {
94
- /**
95
- * Hide the block.
96
- */
97
- onOkayClick () {
98
- this.shouldBeVisible = false
99
- localStorage.setItem(this.getBlockKey(), JSON.stringify(false))
100
- },
101
-
102
- /**
103
- * Open learn more link in a new tab when user clicks on the "learn more" button.
104
- */
105
- onLearnMoreClick () {
106
- window.open(this.learnMore, '_blank').focus()
107
- },
108
-
109
- /**
110
- * Notice's block key in local storage.
111
- *
112
- * @return {string}
113
- */
114
- getBlockKey () {
115
- return `wpra-${this.id}-visible`
116
- }
117
- },
118
-
119
- render () {
120
- /*
121
- * Template is not rendered when it was hidden by user, or server.
122
- */
123
- if (!this.isVisible) {
124
- return null
125
- }
126
-
127
- let learnMoreButton = this.learnMore ?
128
- <Button class="button-clear" nativeOnClick={this.onLearnMoreClick}>
129
- {this.learnMoreText} <span class="dashicons dashicons-external"/>
130
- </Button> : null
131
-
132
- return (
133
- <div class="wpra-notice-block">
134
- <div class="wpra-notice-block__title">{this.title}</div>
135
- <div class="wpra-notice-block__body" {...{domProps: {innerHTML: this.body}}}/>
136
- <div class="wpra-notice-block__buttons">
137
- <Button class="brand button-primary" nativeOnClick={this.onOkayClick}>{this.okayText}</Button>
138
- {learnMoreButton}
139
- </div>
140
- </div>
141
- )
142
- }
143
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/Postbox.vue DELETED
@@ -1,44 +0,0 @@
1
- <script>
2
- export default {
3
- inject: ['hooks'],
4
- data () {
5
- return {
6
- expanded: true,
7
- }
8
- },
9
- props: {
10
- title: {},
11
- id: {},
12
- submit: {
13
- type: Boolean,
14
- default: false,
15
- },
16
- context: {},
17
- },
18
- methods: {
19
- toggle () {
20
- this.expanded = !this.expanded
21
- }
22
- },
23
- render (h) {
24
- return this.hooks.apply('postbox-' + this.id, this.context || this, (
25
- <div class="postbox wpra-postbox" id={ this.submit ? 'submitdiv' : ''}>
26
- <button type="button" class="handlediv" aria-expanded="true" onClick={this.toggle}>
27
- <span class="screen-reader-text">Toggle panel: { this.title }</span>
28
- <span class="toggle-indicator" aria-hidden="true"></span>
29
- </button>
30
- <h2 class="hndle ui-sortable-handle"
31
- onClick={this.toggle}
32
- ><span>{ this.title }</span></h2>
33
- <div class="inside">
34
- {
35
- this.hooks.apply('postbox-content-' + this.id, this.context || this, [
36
- this.$slots.default
37
- ], {h})
38
- }
39
- </div>
40
- </div>
41
- ), {h})
42
- }
43
- }
44
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/RouteLink.js DELETED
@@ -1,27 +0,0 @@
1
- export default {
2
- props: {
3
- path: {},
4
- gate: {}
5
- },
6
- inject: [
7
- 'router'
8
- ],
9
- methods: {
10
- getPath () {
11
- return this.router.buildRoute(this.path)
12
- },
13
- navigate (e) {
14
- const allowed = !this.gate || this.gate()
15
-
16
- e.preventDefault()
17
-
18
- if (allowed) {
19
- this.router.navigate(this.path)
20
- }
21
- }
22
- },
23
- render () {
24
- const path = this.getPath()
25
- return <a href={path} onClick={this.navigate}>{ this.$slots.default }</a>
26
- }
27
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/RouterApp.js DELETED
@@ -1,47 +0,0 @@
1
- export default function ({ store, router }) {
2
- return {
3
- store,
4
- data () {
5
- return {
6
- afterNavigate: () => {},
7
- params: {},
8
- currentRoute: null,
9
- }
10
- },
11
- created () {
12
- router.setApp(this)
13
- this.currentRoute = router.parseLocation(window.location)
14
- this.navigated()
15
- },
16
- mounted () {
17
- window.addEventListener('popstate', () => {
18
- this.currentRoute = router.parseLocation(window.location)
19
- this.navigated()
20
- })
21
- },
22
- methods: {
23
- ViewComponent () {
24
- const matchingView = router.findRoute(this.currentRoute)
25
- return matchingView.component
26
- },
27
- navigated () {
28
- this.$nextTick(() => {
29
- const main = this.$refs.main
30
- if (!main || !main.navigated) {
31
- return
32
- }
33
- main.navigated({
34
- route: router.findRoute(this.currentRoute),
35
- })
36
- })
37
- }
38
- },
39
- render (h) {
40
- const content = h(this.ViewComponent(), {
41
- ref: 'main'
42
- })
43
- this.afterNavigate()
44
- return content
45
- }
46
- }
47
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/SerializedForm.vue DELETED
@@ -1,89 +0,0 @@
1
- <template>
2
- <div class="form">
3
- <div class="form-group"
4
- v-for="datum of form"
5
- v-if="satisfiesCondition(datum)"
6
- >
7
- <template v-if="datum.type === 'radio'">
8
- <label :for="datum.name" v-html="datum.label" v-if="datum.label"></label>
9
- <div class="form-check" v-for="(radio, $i) of datum.options">
10
- <input type="radio"
11
- :name="datum.name"
12
- :id="datum.name + '_' + $i"
13
- :value="radio.value"
14
- v-model="model[datum.name]"
15
- >
16
- <label :for="datum.name + '_' + $i">
17
- {{ radio.label || radio.value }}
18
- </label>
19
- </div>
20
- </template>
21
-
22
- <template v-if="datum.type === 'textarea'">
23
- <label :for="datum.name" v-html="datum.label" v-if="datum.label"></label>
24
- <textarea v-model="model[datum.name]" :id="datum.name"></textarea>
25
- </template>
26
-
27
- <template v-if="datum.type === 'content'">
28
- <div :class="datum.className">
29
- <p v-html="datum.label"></p>
30
- </div>
31
- </template>
32
- </div>
33
- </div>
34
- </template>
35
-
36
- <script>
37
- export default {
38
- props: {
39
- /*
40
- * Form, described by object containing information
41
- * about each field.
42
- */
43
- form: {
44
- type: Array,
45
- },
46
-
47
- /*
48
- * Form model.
49
- */
50
- value: {
51
- type: Object,
52
- }
53
- },
54
- computed: {
55
- model: {
56
- get () {
57
- return this.value
58
- },
59
- set (value) {
60
- this.$emit('input', value)
61
- }
62
- }
63
- },
64
- methods: {
65
- satisfiesCondition (datum) {
66
- if (!datum.condition) {
67
- return true
68
- }
69
- let compareFunction = this.getConditionFunction(datum.condition.operator);
70
- if (!compareFunction) {
71
- return false
72
- }
73
- return compareFunction(datum.condition.field, datum.condition.value)
74
- },
75
-
76
- getConditionFunction (operator) {
77
- const fns = {
78
- '=': (field, value) => {
79
- return this.model[field] === value
80
- }
81
- }
82
- if (!fns[operator]) {
83
- return null
84
- }
85
- return fns[operator]
86
- }
87
- }
88
- }
89
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/Sidebar.js DELETED
@@ -1,11 +0,0 @@
1
- export default {
2
- render () {
3
- return (
4
- <div id="postbox-container-1" class="wpra-postbox-container postbox-container">
5
- {
6
- this.$slots.default
7
- }
8
- </div>
9
- )
10
- }
11
- }
 
 
 
 
 
 
 
 
 
 
 
js/src/components/TransitionExpand.vue DELETED
@@ -1,66 +0,0 @@
1
- <script>
2
- export default {
3
- name: `TransitionExpand`,
4
- functional: true,
5
- render (createElement, context) {
6
- const data = {
7
- props: {
8
- name: `expand`,
9
- },
10
- on: {
11
- afterEnter (element) {
12
- // eslint-disable-next-line no-param-reassign
13
- element.style.height = `auto`
14
- },
15
- enter (element) {
16
- const {width} = getComputedStyle(element)
17
-
18
- /* eslint-disable no-param-reassign */
19
- element.style.width = width
20
- element.style.position = `absolute`
21
- element.style.visibility = `hidden`
22
- element.style.height = `auto`
23
- /* eslint-enable */
24
-
25
- const {height} = getComputedStyle(element)
26
-
27
- /* eslint-disable no-param-reassign */
28
- element.style.width = null
29
- element.style.position = null
30
- element.style.visibility = null
31
- element.style.height = 0
32
- /* eslint-enable */
33
-
34
- // Force repaint to make sure the
35
- // animation is triggered correctly.
36
- // eslint-disable-next-line no-unused-expressions
37
- getComputedStyle(element).height
38
-
39
- setTimeout(() => {
40
- // eslint-disable-next-line no-param-reassign
41
- element.style.height = height
42
- })
43
- },
44
- leave (element) {
45
- const {height} = getComputedStyle(element)
46
-
47
- // eslint-disable-next-line no-param-reassign
48
- element.style.height = height
49
-
50
- // Force repaint to make sure the
51
- // animation is triggered correctly.
52
- // eslint-disable-next-line no-unused-expressions
53
- getComputedStyle(element).height
54
-
55
- setTimeout(() => {
56
- // eslint-disable-next-line no-param-reassign
57
- element.style.height = 0
58
- })
59
- },
60
- },
61
- }
62
-
63
- return createElement(`transition`, data, context.children)
64
- },
65
- }
66
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/components/index.js DELETED
@@ -1,15 +0,0 @@
1
- import Input from './Input'
2
- import NoticeBlock from './NoticeBlock'
3
- import Postbox from './Postbox'
4
- import RouteLink from './RouteLink'
5
- import TransitionExpand from './TransitionExpand'
6
- import Button from './Button'
7
-
8
- export default {
9
- Input,
10
- NoticeBlock,
11
- Postbox,
12
- RouteLink,
13
- TransitionExpand,
14
- Button,
15
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/libs/NotificationCenter.js DELETED
@@ -1,45 +0,0 @@
1
- /**
2
- * Library agnostic wrapper for notifications.
3
- *
4
- * @since 4.14
5
- *
6
- * @class NotificationsCenter
7
- */
8
- export default class NotificationsCenter {
9
- /**
10
- * NotificationsCenter constructor.
11
- *
12
- * @since 4.14
13
- *
14
- * @param {Function} show Function implementation for displaying messages.
15
- * @param {Function} error Function implementation for displaying errors.
16
- */
17
- constructor (show, error) {
18
- this.showMethod = show
19
- this.errorMethod = error
20
- }
21
-
22
- /**
23
- * Display informational message.
24
- *
25
- * @since 4.14
26
- *
27
- * @param {string} msg Message for displaying
28
- * @param {object} options Options for notification.
29
- */
30
- show (msg, options = {}) {
31
- this.showMethod(msg, options)
32
- }
33
-
34
- /**
35
- * Display error message.
36
- *
37
- * @since 4.14
38
- *
39
- * @param {string} msg Message for displaying
40
- * @param {object} options Options for notification.
41
- */
42
- error (msg, options = {}) {
43
- this.errorMethod(msg, options)
44
- }
45
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/libs/Router.js DELETED
@@ -1,122 +0,0 @@
1
- const getJsonFromUrl = (url) => {
2
- if (!url) url = location.href
3
- var question = url.indexOf('?')
4
- var hash = url.indexOf('#')
5
- if (hash == -1 && question == -1) return {}
6
- if (hash == -1) hash = url.length
7
- var query = question == -1 || hash == question + 1 ? url.substring(hash) :
8
- url.substring(question + 1, hash)
9
- var result = {}
10
- query.split('&').forEach(function (part) {
11
- if (!part) return
12
- part = part.split('+').join(' ') // replace every + with space, regexp-free version
13
- var eq = part.indexOf('=')
14
- var key = eq > -1 ? part.substr(0, eq) : part
15
- var val = eq > -1 ? decodeURIComponent(part.substr(eq + 1)) : ''
16
- var from = key.indexOf('[')
17
- if (from == -1) result[decodeURIComponent(key)] = val
18
- else {
19
- var to = key.indexOf(']', from)
20
- var index = decodeURIComponent(key.substring(from + 1, to))
21
- key = decodeURIComponent(key.substring(0, from))
22
- if (!result[key]) result[key] = []
23
- if (!index) result[key].push(val)
24
- else result[key][index] = val
25
- }
26
- })
27
- return result
28
- }
29
-
30
- export default class Router {
31
- constructor (routes, options) {
32
- this.routes = routes
33
- this.options = options
34
- this.baseParams = options.baseParams || ['post_type', 'page', 'action', 'id']
35
- }
36
-
37
- get params () {
38
- return this.app ? this.app.params : {}
39
- }
40
-
41
- setApp (app) {
42
- this.app = app
43
- this.app.afterNavigate = this.options.afterNavigating || (() => {})
44
- }
45
-
46
- findRoute (location) {
47
- return this.routes.find(({route}) => {
48
- return location.indexOf(route) !== -1
49
- })
50
- }
51
-
52
- updateParams (params) {
53
- this.app.$set(this.app, 'params', params)
54
- }
55
-
56
- mergeParams (paramsPart) {
57
- let currentParams = Object.keys(this.params).filter(key => {
58
- return this.baseParams.indexOf(key) !== -1 || paramsPart.hasOwnProperty(key)
59
- }).reduce((acc, key) => {
60
- acc[key] = this.params[key]
61
- return acc
62
- }, {})
63
-
64
- let params = Object.assign({}, currentParams, paramsPart)
65
-
66
- this.updateParams(params)
67
-
68
- window.history.pushState(
69
- null,
70
- null,
71
- this.routeFromParams()
72
- )
73
-
74
- this.app.navigated()
75
- }
76
-
77
- routeFromParams () {
78
- const hasParams = !!Object.keys(this.params).length
79
- return location.pathname + (hasParams ? '?' + this.buildParams(this.params) : '')
80
- }
81
-
82
- buildRoute (route) {
83
- if (route.name) {
84
- let routeObject = this.routes.find(r => r.name === route.name)
85
- if (!routeObject) {
86
- return null
87
- }
88
- const routeStr = routeObject.route
89
- const join = routeStr.indexOf('?') !== -1 ? '&' : '?'
90
-
91
- return routeStr + (route.params ? join + this.buildParams(route.params ? route.params : {}) : '')
92
- }
93
- }
94
-
95
- buildParams (params) {
96
- return Object.keys(params).map(param => {
97
- return `${param}=${params[param]}`
98
- }).join('&')
99
- }
100
-
101
- parseLocation (location) {
102
- this.updateParams(getJsonFromUrl(location.search))
103
- console.info('ROUTE PARSE LOCATION PARAMS', getJsonFromUrl(location.search))
104
- return location.pathname + location.search
105
- }
106
-
107
- navigate (route) {
108
- if (this.app) {
109
- this.app.currentRoute = this.buildRoute(route)
110
- }
111
-
112
- this.updateParams(Object.assign({}, route.params || {}, getJsonFromUrl(this.buildRoute(route))))
113
-
114
- window.history.pushState(
115
- null,
116
- null,
117
- this.buildRoute(route)
118
- )
119
-
120
- this.app.navigated()
121
- }
122
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/mixins/DataChangesAware.js DELETED
@@ -1,47 +0,0 @@
1
- import jsonClone from 'app/utils/jsonClone'
2
- import equal from 'fast-deep-equal'
3
-
4
- /**
5
- * Mixing for functionality that allows to track down and revert changes made on
6
- * the primary editing data model.
7
- *
8
- * `model` property on base object is required for using this mixin.
9
- */
10
- export default {
11
- data () {
12
- return {
13
- changes: {
14
- model: {},
15
- }
16
- }
17
- },
18
- methods: {
19
- /**
20
- * Whether the model has been changed after last model "remembering".
21
- *
22
- * @return {boolean}
23
- */
24
- isChanged () {
25
- return !equal(this.model, this.changes.model)
26
- },
27
-
28
- /**
29
- * Remember current data model, but without any references to main model
30
- * properties. It is important to clean any additional observers from object
31
- * otherwise "memorized" model clone will be changed when model get changed.
32
- */
33
- rememberModel () {
34
- this.$set(this.changes, 'model', jsonClone(this.model))
35
- },
36
-
37
- /**
38
- * Cancel any changes on main model object.
39
- */
40
- cancelChanges () {
41
- if (!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.')) {
42
- return
43
- }
44
- this.$set(this, 'model', jsonClone(this.changes.model))
45
- },
46
- }
47
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/gutenberg-block/components/MultipleSelectControl.js DELETED
@@ -1,85 +0,0 @@
1
- import { Component } from '@wordpress/element'
2
- import {
3
- FormTokenField,
4
- Placeholder,
5
- Spinner,
6
- BaseControl,
7
- } from '@wordpress/components'
8
-
9
- export default class MultipleSelectControl extends Component {
10
- constructor (props) {
11
- super(...arguments)
12
- this.props = props
13
- this.state = {
14
- tokens: [],
15
- loading: false,
16
- items: []
17
- }
18
- }
19
-
20
- componentDidMount () {
21
- this.setState({loading: true})
22
-
23
- jQuery.post(WPRA_BLOCK.ajax_url, {
24
- action: 'wprss_fetch_items',
25
- }, (data) => {
26
- data = JSON.parse(data)
27
- this.setState({
28
- loading: false,
29
- items: data.items
30
- })
31
- })
32
- }
33
-
34
- render () {
35
- const setState = this.setState.bind(this)
36
- const onChange = this.props.onChange
37
- const items = this.state.items
38
-
39
- if (this.state.loading) {
40
- return <Placeholder>
41
- <Spinner/>
42
- </Placeholder>
43
- }
44
- return <BaseControl
45
- help={this.props.help || ''}
46
- >
47
- <FormTokenField
48
- label={this.props.label || ''}
49
- placeholder={this.props.placeholder || ''}
50
- value={this.props.value.map(function (id) {
51
- return items.find(item => item.value === id)
52
- }).filter(item => !!item)}
53
- suggestions={this.state.items.map(function (item) {
54
- item.toLocaleLowerCase = function () {
55
- return item.title.toLocaleLowerCase()
56
- }
57
- item.toString = function () {
58
- return item.title
59
- }
60
- return item
61
- })}
62
- displayTransform={function (item) {
63
- if ('number' === typeof item) {
64
- item = items.find(function (iteratedItem) {
65
- return iteratedItem.value === item
66
- })
67
- }
68
- if ('object' === typeof item) {
69
- return item.title
70
- }
71
- return item
72
- }}
73
- saveTransform={function (token) {
74
- return token
75
- }}
76
- onChange={function (tokens) {
77
- setState({tokens})
78
- onChange(tokens.map(function (item) {
79
- return item.value
80
- }))
81
- }}
82
- />
83
- </BaseControl>
84
- }
85
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/gutenberg-block/index.js DELETED
@@ -1,209 +0,0 @@
1
- require('css/src/gutenberg-block/index.scss')
2
-
3
- import { __ } from '@wordpress/i18n'
4
- import { registerBlockType } from '@wordpress/blocks'
5
- import { InspectorControls } from '@wordpress/editor'
6
- import {
7
- ToggleControl,
8
- ServerSideRender,
9
- TextControl,
10
- TextareaControl,
11
- BaseControl,
12
- PanelBody,
13
- PanelRow,
14
- Spinner,
15
- Placeholder,
16
- FormTokenField,
17
- SelectControl,
18
- } from '@wordpress/components'
19
- import { addFilter, applyFilters } from '@wordpress/hooks'
20
-
21
- import MultipleSelectControl from './components/MultipleSelectControl'
22
-
23
- // Default template is selected by default.
24
- let selectedTemplate = WPRA_BLOCK.templates[0]
25
-
26
- // Selected template field getter. Additional function can be passed.
27
- const getTemplateDefault = (field, wrapper = val => val, def = 0) => selectedTemplate[field] ? wrapper(selectedTemplate[field]) : def
28
-
29
- // Helps to not override attributes that selected manually by user.
30
- let templateLock = {}
31
-
32
- // Whether the block is loaded initial information.
33
- let _isLoaded = false
34
-
35
- registerBlockType('wpra-shortcode/wpra-shortcode', {
36
- title: __('WP RSS Aggregator Feeds'),
37
- description: __('Display feed items imported using WP RSS Aggregator.'),
38
- icon: 'rss',
39
- category: 'widgets',
40
-
41
- // Remove to make block editable in HTML mode.
42
- supportHTML: false,
43
-
44
- attributes: applyFilters('wpra.gutenbergBlock.attributes', {
45
- isAll: {
46
- type: 'boolean',
47
- default: true
48
- },
49
- template: {
50
- type: 'string',
51
- default: 'default'
52
- },
53
- pagination: {
54
- type: 'boolean',
55
- default: true
56
- },
57
- limit: {
58
- type: 'number',
59
- },
60
- page: {
61
- type: 'number',
62
- },
63
- exclude: {
64
- type: 'string'
65
- },
66
- source: {
67
- type: 'string'
68
- }
69
- }),
70
-
71
- /**
72
- * Called when Gutenberg initially loads the block.
73
- */
74
- edit: function (props) {
75
- /*
76
- * If block is not loaded, check whether we should block auto limit selection.
77
- * It will be blocked if user selected entered limit value different from template's default.
78
- */
79
- if (!_isLoaded && props.attributes.template) {
80
- selectedTemplate = WPRA_BLOCK.templates.find(item => item.value === (props.attributes.template || 'default'))
81
-
82
- if (parseInt(props.attributes.limit) !== getTemplateDefault('limit', parseInt)) {
83
- templateLock['limit'] = true
84
- }
85
-
86
- if (!!props.attributes.pagination !== getTemplateDefault('pagination', v => !!v, false)) {
87
- templateLock['pagination'] = true
88
- }
89
-
90
- _isLoaded = true
91
- }
92
-
93
- const etWarning = WPRA_BLOCK.is_et_active ? <p style={{fontStyle: 'italic'}}>
94
- Excerpts & Thumbnails is incompatible with the WP RSS Aggregator Feeds block. <a
95
- href="https://kb.wprssaggregator.com/article/459-using-excerpts-thumbnails-with-templates" target={'_blank'}>Learn
96
- more</a>.
97
- </p> : null
98
-
99
- const panels = applyFilters('wpra.gutenbergBlock.panels', [
100
- <PanelBody
101
- title={__('Feed Sources')}
102
- initialOpen={true}
103
- >
104
- {applyFilters('wpra.gutenbergBlock.panelItems', [
105
- <ToggleControl
106
- label={__('Show all Feed Sources ')}
107
- checked={props.attributes.isAll}
108
- onChange={(value) => {
109
- props.setAttributes({isAll: value})
110
- props.setAttributes({exclude: ''})
111
- props.setAttributes({source: ''})
112
- }}
113
- />,
114
- <MultipleSelectControl
115
- label={props.attributes.isAll ? __('Feed Sources to Exclude') : __('Feed Sources to Show')}
116
- key={'select'}
117
- help={__('Start typing to search feed sources by name')}
118
- value={((props.attributes.isAll ? props.attributes.exclude : props.attributes.source) || '').split(',').map(item => parseInt(item))}
119
- onChange={(selected) => {
120
- selected = selected.join(',')
121
- if (props.attributes.isAll) {
122
- props.setAttributes({exclude: selected})
123
- props.setAttributes({source: ''})
124
- return
125
- }
126
- props.setAttributes({exclude: ''})
127
- props.setAttributes({source: selected})
128
- }}
129
- />
130
- ], 'feedSources', {props})}
131
- </PanelBody>,
132
- <PanelBody
133
- title={__('Display Options')}
134
- initialOpen={false}
135
- >
136
- {applyFilters('wpra.gutenbergBlock.panelItems', [
137
- <SelectControl
138
- label={__('Select Template')}
139
- value={props.attributes.template}
140
- onChange={(template) => {
141
- selectedTemplate = WPRA_BLOCK.templates.find(item => item.value === template)
142
- props.setAttributes({template: template || ''})
143
- if (!templateLock['limit']) {
144
- props.setAttributes({limit: getTemplateDefault('limit', parseInt, 15)})
145
- }
146
- if (!templateLock['pagination']) {
147
- props.setAttributes({pagination: getTemplateDefault('pagination', v => !!v, false)})
148
- }
149
- }}
150
- options={WPRA_BLOCK.templates}
151
- />,
152
- <TextControl
153
- label={__('Feed Limit')}
154
- help={__('Number of feed items to display')}
155
- placeholder={getTemplateDefault('limit', parseInt)}
156
- type={'number'}
157
- min={1}
158
- value={props.attributes.limit || getTemplateDefault('limit', parseInt)}
159
- onChange={(value) => {
160
- templateLock['limit'] = true
161
- props.setAttributes({limit: parseInt(value) || getTemplateDefault('limit', parseInt)})
162
- }}
163
- />,
164
- <ToggleControl
165
- label={__('Show Pagination ')}
166
- checked={props.attributes.pagination}
167
- onChange={(value) => {
168
- templateLock['pagination'] = true
169
- props.setAttributes({pagination: value})
170
- }}
171
- />,
172
- <TextControl
173
- label={__('Page')}
174
- placeholder={__('1')}
175
- type={'number'}
176
- min={1}
177
- value={props.attributes.page || 1}
178
- onChange={(value) => {
179
- props.setAttributes({page: parseInt(value) || 1})
180
- }}
181
- />,
182
- etWarning
183
- ], 'displayOptions', {props})}
184
- </PanelBody>,
185
- ], {props})
186
-
187
- console.warn({panels})
188
-
189
- return <div>
190
- <ServerSideRender
191
- block={'wpra-shortcode/wpra-shortcode'}
192
- attributes={props.attributes}
193
- className={'wpra-gutenberg-block'}
194
- />
195
- {applyFilters('wpra.gutenbergBlock.before', [], {props})}
196
- <InspectorControls>
197
- {panels}
198
- </InspectorControls>
199
- {applyFilters('wpra.gutenbergBlock.after', [], {props})}
200
- </div>
201
- },
202
-
203
- /**
204
- * Called when Gutenberg "saves" the block to post_content
205
- */
206
- save: function (props) {
207
- return null
208
- }
209
- })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/intro/Wizard.vue DELETED
@@ -1,440 +0,0 @@
1
- <template>
2
- <div class="wizard-holder animated fadeIn">
3
- <div class="connect-steps">
4
- <div class="step-items">
5
- <div class="step-progress" :class="'step-progress--' + activeScreenIndex"></div>
6
- <div class="step-item"
7
- :class="{ 'step-item_active': active(screen.id), 'step-item_completed' : screen.completed() && index < activeScreenIndex }"
8
- v-for="(screen, index) of screens"
9
- >
10
- <div class="step-item__status">
11
- <span class="dashicons dashicons-yes" v-if="screen.completed() && index < activeScreenIndex"></span>
12
- </div>
13
- <div class="step-item__info">
14
- <div class="step-item__title">{{ screen.title }}</div>
15
- <div class="step-item__description" v-if="screen.description">{{ screen.description }}</div>
16
- </div>
17
- </div>
18
- </div>
19
- </div>
20
- <div class="wizard">
21
- <transition :name="transition" mode="out-in">
22
- <div class="wizard_content" :key="activeScreen" v-if="active('feed')">
23
- <div class="wizard_hello">
24
- Enter your first RSS Feed URL
25
- </div>
26
-
27
- <form id="feedForm" @submit.prevent="next" class="wizard_info">
28
- <div class="form-group">
29
- <input type="text" placeholder="https://www.sourcedomain.com/feed/" v-model="form.feedSourceUrl"
30
- class="wpra-feed-input"
31
- >
32
- <span class="dashicons dashicons-warning warning-icon" v-if="isFeedError"></span>
33
- <a :href="validateLink" target="_blank" v-if="isFeedError">Validate feed</a>
34
- </div>
35
- </form>
36
-
37
- <div class="wizard_error" v-if="isFeedError">
38
- <p>This RSS feed URL appears to be invalid. Here are a couple of things you can try:</p>
39
- <ol>
40
- <li>Check whether the URL you entered is the correct one by trying one of the options when clicking on "How do I find an RSS feed URL?" below.</li>
41
- <li>
42
- Test out this other RSS feed URL to make sure the plugin is working correctly - https://www.wpmayor.com/feed/ - If it works, you may <a :href="supportUrl" target="_blank">contact us here</a> to help you with your source.
43
- </li>
44
- <li>Test the URL's validity by W3C standards, the standards we use in our plugins, using the “Validate feed” link above.</li>
45
- </ol>
46
- </div>
47
-
48
- <expander title="How do I find an RSS feed URL?">
49
- <p>WP RSS Aggregator fetches feed items through RSS feeds. Almost every website in the world provides an RSS feed. Here's how to find it:</p>
50
- <p>Option 1: Add /feed to the website's homepage URL </p>
51
- <p>Many sites have their RSS feed at the same URL. For instance, if the website's URL is www.thiswebsite.com, then the RSS feed could be at www.thiswebsite.com/feed.</p>
52
- <p>Option 2: Look for the RSS share icon</p>
53
- <p>Many websites have share icons on their pages for Facebook, Twitter and more. Many times, there will also be an orange RSS icon. Click on that to access the RSS feed URL.</p>
54
- <p>Option 3: Browser RSS Auto-Discovery</p>
55
- <p>Most browsers either include an RSS auto-discovery tool by default or they allow you to add extensions for it. Firefox shows an RSS icon above the website, in the address bar, which you can click on directly. Chrome offers extensions such as this one.</p>
56
- <p>Option 4: Look at the Page Source</p>
57
- <p>When on any page of the website you're looking to import feed items from, right click and press "View Page Source". Once the new window opens, use the “Find” feature (Ctrl-F on PC, Command-F on Mac) and search for " RSS". This should take you to a line that reads like this (or similar):</p>
58
- <p>
59
- <code>
60
- &#x3C;link rel=&#x22;alternate&#x22; type=&#x22;application/rss+xml&#x22; title=&#x22;RSS Feed&#x22; href=&#x22;https://www.sourcedomain.com/feed/&#x22; /&#x3E;
61
- </code>
62
- </p>
63
- <p>The RSS feed’s URL is found between the quotes after href=. In the above case, it would be https://www.sourcedomain.com/feed/.</p>
64
- <p><a :href="knowledgeBaseUrl" target="_blank">Browse our Knowledge Base for more information.</a></p>
65
- </expander>
66
- </div>
67
-
68
- <div class="wizard_content" :key="activeScreen" v-if="active('feedItems')">
69
- <div class="wizard_hello">
70
- Latest feed items from your selected feed source:
71
- </div>
72
-
73
- <div class="wpra-feed-items">
74
- <div class="wpra-feed-item" v-for="item of feed.items">
75
- <div class="wpra-feed-item__link">
76
- <a :href="item.permalink" target="_blank">{{ item.title }}</a>
77
- </div>
78
- <div class="wpra-feed-item__info">
79
- <template v-if="item.date || item.author">
80
- <template v-if="item.date">
81
- Published on {{ item.date }}
82
- </template>
83
- <template v-if="item.date && item.author">|</template>
84
- <template v-if="item.author">
85
- By {{ item.author }}
86
- </template>
87
- </template>
88
- </div>
89
- </div>
90
- </div>
91
-
92
- <div class="wrpa-shortcode">
93
- <div class="wrpa-shortcode-preview">
94
- <div class="wrpa-shortcode-label">
95
- Create a draft page to preview these feed items on your site:
96
- </div>
97
- <a :href="previewUrl" target="_blank" class="button"
98
- @click="preparePreview"
99
- :class="{'button-primary': isPrepared, 'loading-button': isPreparing}"
100
- >
101
- {{ isPrepared ? 'Preview the Page' : 'Create Draft Page' }}
102
- </a>
103
- </div>
104
- <div class="wrpa-shortcode-form" @click="copyToClipboard()">
105
- <div class="wrpa-shortcode-label">
106
- Copy the shortcode to any page or post on your site:
107
- </div>
108
- <input class="wrpa-shortcode-form__shortcode"
109
- type="text"
110
- readonly
111
- value="[wp-rss-aggregator]"
112
- ref="selected"
113
- />
114
- <div class="wrpa-shortcode-form__button">
115
- {{ isCopied ? 'Copied!' : 'Click to copy' }}
116
- </div>
117
- </div>
118
- </div>
119
- </div>
120
-
121
- <div class="wizard_content" :key="activeScreen" v-if="active('finish')">
122
- <div class="wizard_hello">
123
- You’ve successfully set up your first feed source 😄
124
- </div>
125
-
126
- <div class="wpra-cols-title">
127
- Do more with WP RSS Aggregator - here is what we did at CryptoHeadlines.com.
128
- </div>
129
-
130
- <div class="wpra-cols">
131
- <div class="col">
132
- <p>CryptoHeadlines.com displays latest news, Youtube videos, podcasts, jobs and more from the Cryptocurrency industry.</p>
133
- <p>It uses Feed to Post to import articles, Youtube videos, and podcast links.</p>
134
- <p>Full Text RSS Feeds is used to fetch the full content of the job listings to present more information to the potential applicant.</p>
135
- <p>Keyword Filtering is used to filter out content that contains profanity and keywords or phrases deemed as inappropriate.</p>
136
- <div style="margin-bottom: .5rem">
137
- <a :href="addOnsUrl" class="button" target="_blank">
138
- Browse Add-ons ⭐️
139
- </a>
140
- </div>
141
- <div>
142
- <a :href="supportUrl" target="_blank" style="font-size: .9em">Contact support for more information.</a>
143
- </div>
144
- </div>
145
- <div class="col">
146
- <img :src="demoImageUrl"
147
- class="img wpra-demo-photo">
148
-
149
- <div class="wpra-feedback">
150
- <!--<div class="wpra-feedback__photo">-->
151
- <!--<img src="https://www.wprssaggregator.com/wp-content/themes/wp_rss_theme/assets/images/review2.jpg">-->
152
- <!--</div>-->
153
- <div class="wpra-feedback__copy">
154
- <div class="wpra-feedback__text">
155
- This plugin has made my life a lot easier, and the support has been great as well.
156
- </div>
157
- <div class="wpra-feedback__rating">
158
- <span class="dashicons dashicons-star-filled"></span>
159
- <span class="dashicons dashicons-star-filled"></span>
160
- <span class="dashicons dashicons-star-filled"></span>
161
- <span class="dashicons dashicons-star-filled"></span>
162
- <span class="dashicons dashicons-star-filled"></span>
163
- </div>
164
- <div class="wpra-feedback__by">
165
- <a :href="feedbackUrl" target="_blank">
166
- Review by officeinnovator
167
- </a>
168
- </div>
169
- </div>
170
- </div>
171
- </div>
172
- </div>
173
- </div>
174
- </transition>
175
-
176
- <div class="connect-actions pad">
177
- <div class="pad-item--grow">
178
- <button v-if="!active('finish')"
179
- class="button-clear"
180
- @click="finish"
181
- >
182
- Skip the introduction
183
- </button>
184
- </div>
185
- <div class="pad-item--no-shrink">
186
- <button class="button-clear"
187
- @click="back"
188
- v-if="isBackAvailable"
189
- >
190
- Back
191
- </button>
192
- <button @click="next"
193
- class="button button-primary button-large"
194
- :class="{'loading-button': isLoading}"
195
- >
196
- {{ active('finish') ? 'Continue to Plugin' : 'Next' }}
197
- </button>
198
- </div>
199
- </div>
200
- </div>
201
- </div>
202
- </template>
203
-
204
- <script>
205
- import Expander from 'app/components/Expander'
206
- import { post } from 'app/utils/fetch'
207
- import { copyToClipboard } from 'app/utils/copy'
208
-
209
- const _ = (str) => str
210
-
211
- const CONFIG = window.wprssWizardConfig
212
-
213
- export default {
214
- data () {
215
- return {
216
- prevHeight: 0,
217
- screens: [{
218
- id: 'feed',
219
- title: _('Add feed source URL'),
220
- description: false,
221
- next: this.submitFeed,
222
- completed: () => {
223
- return this.feed.items.length
224
- },
225
- entered: () => {
226
- this.focusOnInput('feed')
227
- }
228
- }, {
229
- id: 'feedItems',
230
- title: _('Display feed items'),
231
- description: false,
232
- next: this.continueItems,
233
- completed: () => {
234
- return this.feed.items.length && this.itemsPassed
235
- }
236
- }, {
237
- id: 'finish',
238
- title: _('Complete introduction'),
239
- description: false,
240
- next: this.completeIntroduction,
241
- completed: () => {
242
- return this.feed.items.length && this.itemsPassed
243
- }
244
- }],
245
- isCopied: false,
246
-
247
- isPreparing: false,
248
- isPrepared: false,
249
-
250
- transition: 'slide-up', // 'slide-down',
251
-
252
- activeScreen: 'feed',
253
- form: {
254
- feedSourceUrl: null,
255
- },
256
- itemsPassed: false,
257
-
258
- stepLoading: false,
259
- isLoading: false,
260
-
261
- isFeedError: false,
262
-
263
- feed: {
264
- items: [],
265
- },
266
- previewUrl: CONFIG.previewUrl,
267
- addOnsUrl: CONFIG.addOnsUrl,
268
- supportUrl: CONFIG.supportUrl,
269
- demoImageUrl: CONFIG.demoImageUrl,
270
- feedbackUrl: CONFIG.feedbackUrl,
271
- knowledgeBaseUrl: CONFIG.knowledgeBaseUrl,
272
- }
273
- },
274
- computed: {
275
- validateLink () {
276
- return 'https://validator.w3.org/feed/check.cgi?url=' + encodeURI(this.form.feedSourceUrl)
277
- },
278
-
279
- activeScreenIndex () {
280
- return this.screens.findIndex(screen => screen.id === this.activeScreen)
281
- },
282
- currentScreen () {
283
- return this.screens.find(screen => screen.id === this.activeScreen)
284
- },
285
- actionCompleted () {
286
- return this.currentScreen.completed()
287
- },
288
- isBackAvailable () {
289
- return this.activeScreenIndex > 0 && this.activeScreenIndex < this.screens.length
290
- },
291
- },
292
- mounted () {
293
- this.onScreenEnter()
294
- },
295
- methods: {
296
- preparePreview (e) {
297
- if (this.isPreparing) {
298
- e.preventDefault()
299
- return
300
- }
301
- if (!this.isPrepared) {
302
- e.preventDefault()
303
- this.isPreparing = true
304
- fetch(this.previewUrl).then(() => {
305
- this.isPreparing = false
306
- this.isPrepared = true
307
- })
308
- }
309
- },
310
-
311
- /**
312
- * Submits first feed step.
313
- *
314
- * @return {Promise<any>}
315
- */
316
- submitFeed () {
317
- const data = Object.assign(CONFIG.feedEndpoint.defaultPayload, {
318
- wprss_intro_feed_url: this.form.feedSourceUrl
319
- })
320
- this.isLoading = true
321
- this.isFeedError = false
322
- return post(CONFIG.feedEndpoint.url, data).then((responseData) => {
323
- this.feed.items = responseData.data.feed_items.slice(0, 3)
324
- this.isLoading = false
325
- return {}
326
- }).catch((resp) => {
327
- this.isLoading = false
328
- this.isFeedError = true
329
- throw resp
330
- })
331
- },
332
-
333
- /**
334
- * Continue from items step.
335
- *
336
- * @return {Promise<any>}
337
- */
338
- continueItems () {
339
- this.itemsPassed = true
340
- return Promise.resolve({})
341
- },
342
-
343
- /**
344
- * Complete the introduction and proceed to sources list.
345
- *
346
- * @return {Promise<any>}
347
- */
348
- completeIntroduction () {
349
- return Promise.resolve({})
350
- },
351
-
352
- /**
353
- * Go to the next screen in this wizard.
354
- */
355
- next () {
356
- this.transition = 'slide-up'
357
- const nextTransistor = this.currentScreen.next ? this.currentScreen.next : () => Promise.resolve(false)
358
- this.stepLoading = true
359
- nextTransistor().then(result => {
360
- this.stepLoading = false
361
- }, (err) => {
362
- throw err
363
- }).then(() => {
364
- const nextStepIndex = this.activeScreenIndex + 1
365
- if (nextStepIndex >= this.screens.length) {
366
- this.finish()
367
- }
368
- else {
369
- this.activeScreen = this.screens[nextStepIndex].id
370
- this.onScreenEnter()
371
- }
372
- }).catch((err) => {
373
- console.error(err)
374
- })
375
- },
376
-
377
- /**
378
- * Run on screen event.
379
- */
380
- onScreenEnter () {
381
- this.$nextTick(() => {
382
- if (this.currentScreen.entered) {
383
- this.currentScreen.entered()
384
- }
385
- })
386
- },
387
-
388
- /**
389
- * Focus on some ref input.
390
- */
391
- focusOnInput (refName) {
392
- if (!this.$refs[refName] || !this.$refs[refName].focus) {
393
- return false
394
- }
395
- this.$refs[refName].focus()
396
- },
397
-
398
- /**
399
- * Go back in the wizard on one step.
400
- */
401
- back () {
402
- this.transition = 'slide-down'
403
- this.activeScreen = this.screens[this.activeScreenIndex - 1].id
404
- },
405
-
406
- /**
407
- * Finish this wizard.
408
- */
409
- finish (confirmFinish = false) {
410
- const visitList = () => window.location.href = CONFIG.feedListUrl
411
- if (confirmFinish) {
412
- if (confirm('Are you sure you want to skip the introduction?')) {
413
- visitList()
414
- }
415
- return
416
- }
417
- visitList()
418
- // redirect to the URL.
419
- },
420
-
421
- active (pageName) {
422
- return this.activeScreen === pageName
423
- },
424
-
425
- copyToClipboard () {
426
- if (this.isCopied) {
427
- return
428
- }
429
- copyToClipboard('[wp-rss-aggregator]')
430
- this.isCopied = true
431
- setTimeout(() => {
432
- this.isCopied = false
433
- }, 1000)
434
- }
435
- },
436
- components: {
437
- Expander
438
- }
439
- }
440
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/intro/index.js DELETED
@@ -1,11 +0,0 @@
1
- require('css/src/intro/steps.scss')
2
-
3
- import Vue from 'vue'
4
- import Wizard from './Wizard'
5
- import 'whatwg-fetch'
6
-
7
- new Vue({
8
- el: '#wpra-wizard-app',
9
- template: '<Wizard/>',
10
- components: { Wizard }
11
- })
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/pagination/index.js DELETED
@@ -1,47 +0,0 @@
1
- require('css/src/pagination/index.scss')
2
-
3
- jQuery(document).ready(($) => {
4
- const fetchList = function ($targetEl, params) {
5
- $targetEl.addClass('wpra-loading')
6
-
7
- $([document.documentElement, document.body]).animate({
8
- scrollTop: $targetEl.offset().top - 50
9
- }, 500);
10
-
11
- const template = params.template
12
- delete params.template
13
-
14
- let tmp = template.length? template : '0'
15
- let url = WpraPagination.baseUri.replace('%s', tmp)
16
-
17
- $.ajax({
18
- type: 'POST',
19
- url,
20
- data: JSON.stringify(params),
21
- contentType: 'application/json',
22
- }).done((data) => {
23
- $newEl = $(data.html)
24
- $newEl.find('.colorbox').colorbox({iframe:true, width:'80%', height:'80%'})
25
- $targetEl.replaceWith($newEl)
26
- })
27
- }
28
-
29
- const handleClick = function ($link) {
30
- const $targetEl = $link.closest('[data-template-ctx]')
31
-
32
- const template = $targetEl.data('wpra-template')
33
- const templateOptions = $targetEl.data('template-ctx')
34
-
35
- let options = Object.assign({}, {
36
- template
37
- }, JSON.parse(atob(templateOptions)))
38
- options['page'] = $link.data('wpra-page')
39
-
40
- fetchList($targetEl, options)
41
- }
42
-
43
- $('body').on('click', 'a[data-wpra-page]', function (e) {
44
- e.preventDefault()
45
- handleClick($(this))
46
- });
47
- })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/plugins/PluginDisablePoll.vue DELETED
@@ -1,122 +0,0 @@
1
- <template>
2
- <div class="wpra-plugin-disable-poll">
3
- <modal :active="isModalVisible"
4
- @close="closeModal"
5
- :header-class="'invisible-header'"
6
- >
7
- <div slot="header">
8
- <div class="wpra-plugin-disable-poll__logo">
9
- <img :src="image('light-line-logo.png')" alt="">
10
- </div>
11
- <h3>
12
- Do you have a moment to share why you are deactivating WP RSS Aggregator?
13
- </h3>
14
- <p>
15
- Your feedback will help us to improve our plugins and service.
16
- </p>
17
- </div>
18
-
19
- <div slot="body">
20
- <SerializedForm :form="form" v-model="model"/>
21
- </div>
22
-
23
- <div slot="footer">
24
- <div class="footer-confirm__buttons">
25
- <button class="button button-clear" @click="deactivate">
26
- Skip & Deactivate
27
- </button>
28
- <button class="button button-primary"
29
- :class="{'loading-button': isDeactivating}"
30
- @click="submit">
31
- Submit & Deactivate
32
- </button>
33
- </div>
34
- </div>
35
- </modal>
36
- </div>
37
- </template>
38
-
39
- <script>
40
- import Modal from 'app/components/Modal'
41
- import SerializedForm from 'app/components/SerializedForm'
42
- import axios from 'axios'
43
-
44
- /**
45
- * Selector string for plugin's deactivation link.
46
- *
47
- * @type {string}
48
- */
49
- const deactivateSelector = '[data-slug="wp-rss-aggregator"] .deactivate a'
50
- const deactivateLink = document.querySelector(deactivateSelector)
51
-
52
- export default {
53
- components: {
54
- Modal,
55
- SerializedForm,
56
- },
57
- data () {
58
- return {
59
- isDeactivating: false,
60
- deactivateUrl: null,
61
- submitUrl: WrpaDisablePoll.url,
62
- model: WrpaDisablePoll.model,
63
- form: WrpaDisablePoll.form,
64
- audience: WrpaDisablePoll.audience || 100,
65
- isModalVisible: false
66
- }
67
- },
68
- watch: {
69
- 'model.reason' () {
70
- this.model.follow_up = null
71
- }
72
- },
73
- mounted () {
74
- const isVisible = this.getRandomInt(0, 100) < this.audience
75
- if (isVisible) {
76
- deactivateLink.addEventListener('click', this.handleDeactivateClick)
77
- }
78
- },
79
- methods: {
80
- getRandomInt (min, max) {
81
- min = Math.ceil(min);
82
- max = Math.floor(max);
83
- return Math.floor(Math.random() * (max - min + 1)) + min;
84
- },
85
-
86
- image (path) {
87
- return WrpaDisablePoll.image + path
88
- },
89
-
90
- handleDeactivateClick (e) {
91
- if (this.isModalVisible) {
92
- return
93
- }
94
-
95
- e.preventDefault()
96
- this.isModalVisible = true
97
- },
98
-
99
- closeModal () {
100
- this.isModalVisible = false
101
- this.deactivateUrl = null
102
- },
103
-
104
- submit () {
105
- this.isDeactivating = true
106
- axios.post(this.submitUrl, this.model, {
107
- headers: {
108
- 'Content-Type': 'application/x-www-form-urlencoded'
109
- }
110
- }).then(() => {
111
- this.deactivate()
112
- }).finally(() => {
113
- this.isDeactivating = false
114
- })
115
- },
116
-
117
- deactivate () {
118
- deactivateLink.click()
119
- }
120
- }
121
- }
122
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/plugins/index.js DELETED
@@ -1,10 +0,0 @@
1
- require('css/src/plugins/index.scss')
2
-
3
- import Vue from 'vue'
4
- import PluginDisablePoll from './PluginDisablePoll'
5
-
6
- new Vue({
7
- el: '#wpra-plugins-app',
8
- template: '<PluginDisablePoll/>',
9
- components: { PluginDisablePoll }
10
- })
 
 
 
 
 
 
 
 
 
 
js/src/modules/templates/Edit.js DELETED
@@ -1,491 +0,0 @@
1
- import Postbox from 'app/components/Postbox'
2
- import Main from 'app/components/Main'
3
- import Sidebar from 'app/components/Sidebar'
4
- import Layout from 'app/components/Layout'
5
- import RouteLink from 'app/components/RouteLink'
6
- import Input from 'app/components/Input'
7
- import Button from 'app/components/Button'
8
- import NoticeBlock from 'app/components/NoticeBlock'
9
- import deepmerge from 'app/utils/deepmerge'
10
- import DataChangesAware from 'app/mixins/DataChangesAware'
11
- import jsonClone from 'app/utils/jsonClone'
12
- import base64 from 'app/utils/base64'
13
- import { copyToClipboard } from 'app/utils/copy'
14
-
15
- export default {
16
- mixins: [DataChangesAware],
17
- data () {
18
- return {
19
- typeOptions: Object.keys(WpraTemplates.options.type)
20
- .filter(key => key[0] !== '_')
21
- .reduce((acc, key) => {
22
- acc[key] = WpraTemplates.options.type[key]
23
- return acc
24
- }, {}),
25
-
26
- model: jsonClone(WpraTemplates.model_schema),
27
- validation: jsonClone(WpraTemplates.model_schema),
28
- tooltips: jsonClone(WpraTemplates.model_tooltips),
29
-
30
- baseUrl: WpraTemplates.base_url,
31
- isSaving: false,
32
- isLoading: false,
33
- }
34
- },
35
- inject: [
36
- 'hooks',
37
- 'http',
38
- 'router',
39
- 'notification',
40
- ],
41
- mounted () {
42
- this.resolveEditingItem()
43
- },
44
- computed: {
45
- previewUrl () {
46
- let options = base64.encode(JSON.stringify(this.model.options))
47
-
48
- return `${WpraGlobal.admin_base_url}?wpra_preview_template=${this.router.params.id}&wpra_template_options=${options}`
49
- }
50
- },
51
- methods: {
52
- resolveEditingItem () {
53
- let modelDefault = deepmerge(jsonClone(WpraTemplates.model_schema), this.$store.state.templates.preset)
54
-
55
- this.isLoading = true
56
- const loadItem = () => {
57
- const id = this.router.params.id
58
- if (!id) {
59
- return Promise.resolve(null)
60
- }
61
- let item = this.$store.getters['templates/item'](id)
62
- if (item) {
63
- return Promise.resolve(item)
64
- }
65
- return this.http.get(`${this.baseUrl}/${id}`).then(response => {
66
- return response.data
67
- })
68
- }
69
-
70
- loadItem().then(item => {
71
- this.isLoading = false
72
- if (!item) {
73
- this.$set(this, 'model', modelDefault)
74
- this.rememberModel()
75
- return
76
- }
77
- item = Object.assign({}, item)
78
- this.model = deepmerge(this.model, item)
79
- this.rememberModel()
80
- })
81
- },
82
- save () {
83
- const isNew = !this.model.id
84
- this.isSaving = true
85
- this.runRequest().then(response => {
86
- this.model = deepmerge(this.model, response.data)
87
- this.rememberModel()
88
-
89
- this.notification.show('Template saved!', {
90
- type: 'success',
91
- icon (el) {
92
- el.classList.add('dashicons', 'dashicons-yes')
93
- return el
94
- },
95
- })
96
-
97
- if (!isNew) {
98
- return
99
- }
100
- this.router.navigate({
101
- name: 'templates',
102
- params: {
103
- action: 'edit',
104
- id: response.data.id
105
- }
106
- })
107
- }, response => {
108
- this.notification.show('Something went wrong. Template is not saved!', {
109
- type: 'error',
110
- icon (el) {
111
- el.classList.add('dashicons', 'dashicons-warning')
112
- return el
113
- },
114
- })
115
- }).finally(() => {
116
- this.isSaving = false
117
- })
118
- },
119
- runRequest () {
120
- const method = this.model.id ? 'put' : 'post'
121
- const url = this.model.id ? `${this.baseUrl}/${this.model.id}` : this.baseUrl
122
- return this.http[method](url, this.prepareModel())
123
- },
124
- prepareModel () {
125
- const availableKeys = Object.keys(WpraTemplates.model_schema)
126
-
127
- return Object.keys(this.model)
128
- .filter(key => {
129
- /*
130
- * Only keys from model_schema can be saved.
131
- */
132
- if (!availableKeys.includes(key)) {
133
- return false
134
- }
135
-
136
- /*
137
- * Name and type shouldn't be passed for default template.
138
- */
139
- if (this.model.type === '__built_in' && ['name', 'type'].includes(key)) {
140
- return false
141
- }
142
-
143
- /*
144
- * Slug and ID fields are always ignored and not sent in the request body.
145
- */
146
- return !['slug', 'id'].includes(key)
147
- })
148
- .reduce((acc, key) => {
149
- acc[key] = this.model[key]
150
- return acc
151
- }, {})
152
- },
153
- getShortcode () {
154
- return `[wp-rss-aggregator template="${this.model.slug}"]`
155
- },
156
- preventLoosingNotSavedData () {
157
- 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?')
158
- },
159
- copyShortcode (e) {
160
- copyToClipboard(this.getShortcode())
161
-
162
- const text = e.target.innerText
163
-
164
- e.target.style.width = e.target.getBoundingClientRect().width + 'px'
165
- e.target.disabled = true
166
- e.target.innerText = 'Copied!'
167
-
168
- setTimeout(() => {
169
- e.target.style.width = null
170
- e.target.innerText = text
171
- e.target.disabled = false
172
- }, 5000)
173
- },
174
- },
175
- render () {
176
- let back = {
177
- name: 'templates'
178
- }
179
-
180
- let minorActions = null,
181
- shortcode = null,
182
- noticeBlock = <NoticeBlock
183
- class={'postbox'}
184
- id={'templates-usage'}
185
- title={'Setting up your Templates'}
186
- body={'Templates are used to display the items imported using WP RSS Aggregator. Choose the preferred options ' +
187
- '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> ' +
188
- 'or our <a href="https://kb.wprssaggregator.com/article/454-displaying-imported-items-block-gutenberg" target="_blank">block</a>.'}
189
- learnMore={'https://kb.wprssaggregator.com/article/457-templates'}
190
- />
191
-
192
- if (this.router.params.id) {
193
- minorActions = <div id="" style={{padding: '6px 0'}}>
194
- <div class="misc-pub-section misc-pub-visibility">
195
- <a href={this.previewUrl}
196
- class="wpra-preview-link"
197
- role="button"
198
- target="wpra-preview-template"
199
- style={{marginLeft: '4px', textDecoration: 'none'}}
200
- >
201
- Open preview
202
- <span class="dashicons dashicons-external"/>
203
- </a>
204
- </div>
205
- </div>
206
- }
207
-
208
- if (this.model.id) {
209
- shortcode = <div class="wpra-shortcode-copy" title={'Copy chortcode'}>
210
- <div class="wpra-shortcode-copy__content">
211
- <strong>Shortcode: </strong>
212
- <code>{ this.getShortcode() }</code>
213
- </div>
214
- <div class="wpra-shortcode-copy__icon">
215
- <button class="button" onClick={this.copyShortcode}>Copy Shortcode</button>
216
- </div>
217
- </div>
218
- }
219
-
220
- let content = <div>
221
- <div class="page-title">
222
- <RouteLink class="back-button" path={back} gate={this.preventLoosingNotSavedData}>
223
- <span class="dashicons dashicons-arrow-left-alt"></span>
224
- Templates
225
- </RouteLink>
226
- <h1>
227
- {this.router.params.id ? (this.changes.model.name || this.changes.model.slug) : 'Create a New Template'}
228
- </h1>
229
- {shortcode}
230
- </div>
231
- <div id="poststuff">
232
- {
233
- this.isLoading ? <div class="loading-container"/> : <Layout class="metabox-holder columns-2">
234
- <Main>
235
- {noticeBlock}
236
- <Postbox id="template-details" title="Template Details" context={this}>
237
- <Input type="text"
238
- label={'Template name'}
239
- value={this.model.name}
240
- onInput={(e) => this.model.name = e}
241
- disabled={this.model.type === '__built_in'}
242
- />
243
- <Input type="select"
244
- label={'Template type'}
245
- value={this.model.type}
246
- options={this.typeOptions}
247
- onInput={(e) => this.model.type = e}
248
- disabled={this.model.type === '__built_in'}
249
- inputDisabled={!WpraTemplates.options.is_type_enabled}
250
- description={
251
- 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>'
252
- }
253
- />
254
- {
255
- (this.model.type === '__built_in') ?
256
- <div class="wpra-info-box">
257
- <div class="wpra-info-box__icon">
258
- <span class="dashicons dashicons-info"/>
259
- </div>
260
- <div class="wpra-info-box__text">
261
- 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.
262
- </div>
263
- </div>
264
- :
265
- null
266
- }
267
- </Postbox>
268
- <Postbox id="template-options" title="Template Options" context={this}>
269
- <Input type="checkbox"
270
- label={'Link title to original article'}
271
- value={this.model.options.title_is_link}
272
- onInput={(e) => this.model.options.title_is_link = e}
273
- title={this.tooltips.options.title_is_link}
274
- />
275
- <Input type="number"
276
- label={'Title maximum length'}
277
- value={this.model.options.title_max_length || ''}
278
- placeholder={'No limit'}
279
- onInput={(e) => this.model.options.title_max_length = e}
280
- title={this.tooltips.options.title_max_length}
281
- />
282
- <Input type="number"
283
- label={'Number of items to show'}
284
- value={this.model.options.limit || ''}
285
- onInput={(e) => this.model.options.limit = (e === '') ? 0 : e}
286
- title={this.tooltips.options.limit}
287
- placeholder={"Show all items"}
288
- min="0"
289
- />
290
-
291
- <div id={'wpra-list-template-publish-date'} style={{paddingTop: '10px'}}>
292
- <Input type="checkbox"
293
- label={'Show publish date'}
294
- value={this.model.options.date_enabled}
295
- onInput={(e) => this.model.options.date_enabled = e}
296
- style={{fontWeight: 'bold'}}
297
- title={this.tooltips.options.date_enabled}
298
- />
299
- <Input type="text"
300
- label={'Date prefix'}
301
- value={this.model.options.date_prefix}
302
- onInput={(e) => this.model.options.date_prefix = e}
303
- disabled={!this.model.options.date_enabled}
304
- title={this.tooltips.options.date_prefix}
305
- />
306
- <Input type="text"
307
- label={'Date format'}
308
- value={this.model.options.date_format}
309
- onInput={(e) => this.model.options.date_format = e}
310
- disabled={this.model.options.date_use_time_ago || !this.model.options.date_enabled}
311
- title={this.tooltips.options.date_format}
312
- />
313
- <Input type="checkbox"
314
- label={'Use "time ago" format'}
315
- description={'Example: 20 minutes ago'}
316
- value={this.model.options.date_use_time_ago}
317
- onInput={(e) => this.model.options.date_use_time_ago = e}
318
- disabled={!this.model.options.date_enabled}
319
- title={this.tooltips.options.date_use_time_ago}
320
- />
321
- </div>
322
-
323
- <div id={'wpra-list-template-source'} style={{paddingTop: '10px'}}>
324
- <Input type="checkbox"
325
- label={'Show source name'}
326
- value={this.model.options.source_enabled}
327
- onInput={(e) => this.model.options.source_enabled = e}
328
- style={{fontWeight: 'bold'}}
329
- title={this.tooltips.options.source_enabled}
330
- />
331
- <Input type="text"
332
- label={'Source prefix'}
333
- value={this.model.options.source_prefix}
334
- onInput={(e) => this.model.options.source_prefix = e}
335
- disabled={!this.model.options.source_enabled}
336
- title={this.tooltips.options.source_prefix}
337
- />
338
- <Input type="checkbox"
339
- label={'Link source name'}
340
- value={this.model.options.source_is_link}
341
- onInput={(e) => this.model.options.source_is_link = e}
342
- disabled={!this.model.options.source_enabled}
343
- title={this.tooltips.options.source_is_link}
344
- />
345
- </div>
346
-
347
- <div id={'wpra-list-template-author'} style={{paddingTop: '10px'}}>
348
- <Input type="checkbox"
349
- label={'Show author name'}
350
- value={this.model.options.author_enabled}
351
- onInput={(e) => this.model.options.author_enabled = e}
352
- style={{fontWeight: 'bold'}}
353
- title={this.tooltips.options.author_enabled}
354
- />
355
- <Input type="text"
356
- label={'Author prefix'}
357
- value={this.model.options.author_prefix}
358
- onInput={(e) => this.model.options.author_prefix = e}
359
- disabled={!this.model.options.author_enabled}
360
- title={this.tooltips.options.author_prefix}
361
- />
362
- </div>
363
-
364
- <div id={'wpra-list-template-pagination'} style={{paddingTop: '10px'}}>
365
- <Input type="checkbox"
366
- label={'Pagination'}
367
- value={this.model.options.pagination}
368
- onInput={(e) => this.model.options.pagination = e}
369
- style={{fontWeight: 'bold'}}
370
- title={this.tooltips.options.pagination}
371
- disabled={parseInt(this.model.options.limit) < 1 || !this.model.options.limit}
372
- />
373
- <Input type="select"
374
- label={'Pagination style'}
375
- options={WpraTemplates.options.pagination_type}
376
- value={this.model.options.pagination_type}
377
- onInput={(e) => this.model.options.pagination_type = e}
378
- disabled={!this.model.options.pagination || parseInt(this.model.options.limit) < 1 || !this.model.options.limit}
379
- title={this.tooltips.options.pagination_type}
380
- />
381
- </div>
382
-
383
- <div id={'wpra-list-template-bullets'} style={{paddingTop: '10px'}}>
384
- <Input type="checkbox"
385
- label={'Show bullets'}
386
- value={this.model.options.bullets_enabled}
387
- onInput={(e) => this.model.options.bullets_enabled = e}
388
- style={{fontWeight: 'bold'}}
389
- title={this.tooltips.options.bullets_enabled}
390
- />
391
- <Input type="select"
392
- label={'Bullet style'}
393
- options={WpraTemplates.options.bullet_type}
394
- value={this.model.options.bullet_type}
395
- onInput={(e) => this.model.options.bullet_type = e}
396
- disabled={!this.model.options.bullets_enabled}
397
- title={this.tooltips.options.bullet_type}
398
- />
399
- </div>
400
- </Postbox>
401
- </Main>
402
- <Sidebar>
403
- <Postbox id="template-create"
404
- title={this.model.id ? 'Update Template' : 'Create Template'}
405
- submit={true}
406
- class={'wpra-postbox-last'}
407
- context={this}
408
- >
409
- <div class="submitbox" id="submitpost">
410
- {minorActions}
411
-
412
- <div id="major-publishing-actions">
413
- <div id="delete-action">
414
- {
415
- this.isChanged() ? <a href="#" class="submitdelete" onClick={(e) => {
416
- e.preventDefault()
417
- this.cancelChanges()
418
- }}>
419
- Cancel Changes
420
- </a> : null
421
- }
422
- </div>
423
-
424
- <div id="publishing-action">
425
- <Button class="button-primary button-large"
426
- loading={this.isSaving}
427
- nativeOnClick={this.save}
428
- >
429
- {this.model.id ? 'Save' : 'Publish'}
430
- </Button>
431
- </div>
432
- <div class="clear"></div>
433
- </div>
434
- </div>
435
- </Postbox>
436
- <Postbox id="template-link-preferences" title="Link Preferences" context={this}>
437
- <p style={{opacity: .65}}>
438
- These options apply to all links within this template.
439
- </p>
440
- <Input type="checkbox"
441
- label={'Set links as nofollow'}
442
- value={this.model.options.links_nofollow}
443
- onInput={(e) => this.model.options.links_nofollow = e}
444
- title={this.tooltips.options.links_nofollow}
445
- />
446
- <Input type="select"
447
- label={'Open links behaviour'}
448
- class="form-input--vertical"
449
- value={this.model.options.links_behavior}
450
- options={WpraTemplates.options.links_behavior}
451
- onInput={(e) => this.model.options.links_behavior = e}
452
- title={this.tooltips.options.links_behavior}
453
- />
454
- {
455
- (this.model.options.links_behavior === 'lightbox' )?
456
- <div class="notice notice-info notice-alt">
457
- <p>Some sites may not allow their content to be shown in a lightbox.</p>
458
- <p>Embedded content usually works. Try ticking the below checkbox.</p>
459
- <p>
460
- <a href="https://kb.wprssaggregator.com/article/471-q-why-wont-some-of-my-feed-items-work-with-the-lightbox-link-behaviour-for-templates"
461
- target="_blank">
462
- {'Learn more'}
463
- </a>
464
- </p>
465
- </div>
466
- : null
467
- }
468
- <Input type="checkbox"
469
- label={'Set links to open embeds'}
470
- value={this.model.options.link_to_embed}
471
- onInput={(e) => this.model.options.link_to_embed = e}
472
- title={this.tooltips.options.link_to_embed}
473
- />
474
- </Postbox>
475
- <Postbox id="template-custom-css" title="Custom Style" context={this}>
476
- <Input type="text"
477
- class="form-input--vertical"
478
- label={'Custom HTML class name'}
479
- value={this.model.options.custom_css_classname}
480
- onInput={(e) => this.model.options.custom_css_classname = e}
481
- title={this.tooltips.options.custom_css_classname}
482
- />
483
- </Postbox>
484
- </Sidebar>
485
- </Layout>
486
- }
487
- </div>
488
- </div>
489
- return this.hooks.apply('wpra-templates-form', this, content)
490
- }
491
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/templates/List.js DELETED
@@ -1,350 +0,0 @@
1
- import VueTable from '@rebelcode/vue-wp-list-table/dist/vue-wp-list-table.common'
2
- import RouteLink from 'app/components/RouteLink'
3
- import Input from 'app/components/Input'
4
- import BottomPanel from 'app/components/BottomPanel'
5
- import jsonClone from 'app/utils/jsonClone'
6
- import collect from 'app/utils/Collection'
7
-
8
- export default {
9
- data () {
10
- return {
11
- loading: false,
12
-
13
- columns: {
14
- name: {
15
- label: ('Template Name'),
16
- class: 'column-primary'
17
- },
18
- style: {
19
- label: ('Template Type'),
20
- },
21
- previewTemplate: {
22
- label: ('Preview')
23
- }
24
- },
25
-
26
- filters: WpraTemplates.options.type,
27
-
28
- checked: [],
29
-
30
- filter: {
31
- paged: parseInt(this.router.params.paged || 1),
32
- type: this.router.params.type || '',
33
- s: this.router.params.s || '',
34
- },
35
-
36
- baseUrl: WpraTemplates.base_url,
37
-
38
- total: 0,
39
- }
40
- },
41
- inject: [
42
- 'hooks',
43
- 'http',
44
- 'router',
45
- ],
46
- computed: {
47
- totalPages () {
48
- return Math.ceil(this.total / 20)
49
- },
50
- list: {
51
- get () {
52
- return this.$store.state.templates.items
53
- },
54
- set (value) {
55
- this.$store.commit('templates/set', value)
56
- },
57
- }
58
- },
59
- methods: {
60
- navigated () {
61
- Object.keys(this.filter).forEach(key => {
62
- this.filter[key] = this.router.params[key] || ''
63
- })
64
- this.filter.paged = parseInt(this.filter.paged || 1)
65
- this.fetchList()
66
- },
67
-
68
- fetchList () {
69
- this.loading = true
70
-
71
- let params = this.getParams()
72
-
73
- let paged = parseInt(params.paged)
74
- delete params.paged
75
- if (!!paged && paged !== 1) {
76
- params['page'] = paged
77
- }
78
-
79
- return this.http.get(this.baseUrl, {
80
- params
81
- }).then((response) => {
82
- this.list = response.data.items
83
- this.total = response.data.count
84
- }).finally(() => {
85
- this.loading = false
86
- })
87
- },
88
-
89
- deleteTemplate (id) {
90
- 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.')) {
91
- return
92
- }
93
- this.loading = true
94
- return this.http.delete(`${this.baseUrl}/${id}`).then(() => {
95
- return this.fetchList()
96
- }).then(() => {
97
- this.loading = false
98
- })
99
- },
100
-
101
- bulkDelete () {
102
- 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.')) {
103
- return
104
- }
105
- this.loading = true
106
- return this.http.delete(this.baseUrl, {
107
- params: {
108
- ids: this.checked
109
- }
110
- }).then(() => {
111
- this.checked = []
112
- this.$refs.table.checkedItems = []
113
- return this.fetchList()
114
- }).then(() => {
115
- this.loading = false
116
- })
117
- },
118
-
119
- duplicateTemplate (row) {
120
- let template = jsonClone(row)
121
-
122
- delete template.id
123
-
124
- if (template.type === '__built_in') {
125
- delete template.type
126
- }
127
-
128
- // add copy to the title so it is mor obvious for the user that this is duplicate.
129
- template.name = `${template.name} (Copy)`
130
-
131
- this.$store.commit('templates/updatePreset', template)
132
- this.router.navigate({
133
- name: 'templates',
134
- params: {
135
- action: 'new',
136
- }
137
- })
138
- },
139
-
140
- getPreviewLink (row) {
141
- return `${WpraGlobal.admin_base_url}?wpra_preview_template=${row.id}`
142
- },
143
-
144
- createTemplate () {
145
- this.$store.commit('templates/updatePreset', {})
146
- this.router.navigate({
147
- name: 'templates',
148
- params: {
149
- action: 'new',
150
- }
151
- })
152
- },
153
-
154
- setChecked (values) {
155
- this.checked = values.filter(id => {
156
- return collect(this.list).find(id, {}).type !== '__built_in'
157
- })
158
- },
159
-
160
- getParams () {
161
- return Object.keys(this.filter).filter(key => {
162
- return !!this.filter[key] && this.filter[key] !== 'all'
163
- }).reduce((acc, key) => {
164
- acc[key] = this.filter[key]
165
- return acc
166
- }, {})
167
- },
168
-
169
- setFilter (name, value) {
170
- this.filter[name] = value
171
- },
172
-
173
- submitFilter () {
174
- this.router.mergeParams(this.getParams())
175
- },
176
-
177
- getRowClass (row) {
178
- return row.type === '__built_in' ? 'built-in' : ''
179
- }
180
- },
181
- render () {
182
- const editPath = (id) => {
183
- return {
184
- name: 'templates',
185
- params: {
186
- action: 'edit',
187
- id,
188
- }
189
- }
190
- }
191
-
192
- let cells = this.hooks.apply('wpra-templates-list-cells', this, {
193
- name: ({row}) => {
194
- return [
195
- <div>
196
- <strong><RouteLink path={editPath(row.id)}>{row.name}</RouteLink></strong>
197
- <small style={{paddingLeft: '4px', opacity: '0.6'}}>{row.slug}</small>
198
- {
199
- (row.type === '__built_in') ?
200
- <span style={{opacity: '0.6', display: 'block'}}>
201
- This is the default feed template. To create your own, either duplicate it or click "Add New" above.
202
- </span>
203
- :
204
- null
205
- }
206
- </div>,
207
- <div class="row-actions">
208
- <span className="edit">
209
- <RouteLink path={editPath(row.id)}>Edit</RouteLink> |
210
- </span>
211
- <span class="inline" style={{paddingLeft: '4px'}}>
212
- <a href="#"
213
- onClick={(e) => {
214
- e.preventDefault()
215
- this.duplicateTemplate(row)
216
- }}
217
- >Duplicate</a> {row.type !== '__built_in' ? '|' : ''}
218
- </span>
219
- {
220
- (row.type !== '__built_in')
221
- ?
222
- <span class="trash" style={{paddingLeft: '4px'}} onClick={(e) => {
223
- e.preventDefault()
224
- this.deleteTemplate(row.id)
225
- }}>
226
- <a href="#" class="submitdelete" aria-label="Delete Item">Delete</a>
227
- </span>
228
- :
229
- null
230
- }
231
- </div>
232
- ]
233
- },
234
- style: ({row}) => {
235
- if (this.filters[row.type]) {
236
- return [
237
- <div>{this.filters[row.type]}</div>
238
- ]
239
- }
240
-
241
- return [
242
- <div>
243
- {this.filters.list}
244
- &nbsp;
245
- <span style={{opacity: 0.7, fontSize: '90%'}}>
246
- (Missing type: <code>{row.type}</code>)
247
- </span>
248
- </div>
249
- ];
250
- },
251
- previewTemplate: ({row}) => {
252
- return [
253
- <div>
254
- <a href={this.getPreviewLink(row)}
255
- target="wpra-preview-template"
256
- class="wpra-preview-link"
257
- >
258
- Open preview <span class="dashicons dashicons-external"></span>
259
- </a>
260
- </div>
261
- ]
262
- },
263
- filters: () => {
264
- let templateTypes = Object.keys(WpraTemplates.options.type)
265
- .filter(key => key[0] !== '_')
266
- .reduce((carry, key) => {
267
- carry[key] = WpraTemplates.options.type[key]
268
- return carry
269
- }, {
270
- 'all': 'Select Template Type',
271
- })
272
- return [
273
- <Input type="select"
274
- style={{margin: 0}}
275
- options={templateTypes}
276
- value={this.filter.type}
277
- onInput={(value) => {
278
- this.filter.type = value
279
- this.submitFilter()
280
- }}
281
- />
282
- ]
283
- }
284
- })
285
-
286
- let content = <div>
287
- <h1 class="wp-heading-inline">Templates</h1>
288
- <a class="page-title-action"
289
- href="#"
290
- onClick={e => {
291
- e.preventDefault()
292
- this.createTemplate()
293
- }}
294
- >Add New</a>
295
-
296
- <p class="search-box" style={{padding: '10px 0'}}>
297
- <label class="screen-reader-text" for="post-search-input">Search Templates:</label>
298
- <input type="search"
299
- id="post-search-input"
300
- name="s"
301
- value={this.filter.s}
302
- onInput={e => this.filter.s = e.target.value}
303
- onKeyup:enter={this.submitFilter}
304
- />
305
- <input type="submit" id="search-submit" class="button" value="Search Templates"
306
- onClick={this.submitFilter}
307
- />
308
- </p>
309
-
310
- <VueTable
311
- onChecked={this.setChecked}
312
- onPagination={page => {
313
- this.filter.paged = page
314
- this.submitFilter()
315
- }}
316
- columns={this.columns}
317
- rows={this.list}
318
- loading={this.loading}
319
- totalItems={this.total}
320
- perPage={20}
321
- totalPages={this.totalPages}
322
- currentPage={this.filter.paged}
323
- ref="table"
324
- notFound="No templates found."
325
- rowClass={this.getRowClass}
326
- class={{
327
- 'wpra-no-cb': this.list.length === 0 || (this.list.length === 1 && this.list[0].type === '__built_in')
328
- }}
329
- scopedSlots={
330
- cells
331
- }
332
- />
333
-
334
- {
335
- this.checked.length ? <BottomPanel>
336
- <div class="flex-row">
337
- <div class="flex-col">
338
- <div class="wpra-bottom-panel__title">Bulk Actions</div>
339
- <a href="#" onClick={(e) => {
340
- e.preventDefault()
341
- this.bulkDelete()
342
- }}>Delete</a>
343
- </div>
344
- </div>
345
- </BottomPanel> : null
346
- }
347
- </div>
348
- return this.hooks.apply('wpra-templates-list', this, content)
349
- }
350
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/templates/app.js DELETED
@@ -1,117 +0,0 @@
1
- import axios from 'axios'
2
- import toasted from 'vue-toasted'
3
- import VueTippy from 'vue-tippy'
4
-
5
- import Vuex from 'vuex'
6
- import List from './List'
7
- import Edit from './Edit'
8
-
9
- import makeRouterApp from 'app/components/RouterApp'
10
- import Router from 'app/libs/Router'
11
- import templates from './store'
12
- import NotificationCenter from 'app/libs/NotificationCenter'
13
-
14
- import components from 'app/components'
15
-
16
- /**
17
- * Main application's container.
18
- */
19
- export default {
20
- register (services) {
21
- /*
22
- * Component for editing templates.
23
- */
24
- services['TemplateEdit'] = () => Edit
25
-
26
- /*
27
- * Component for managing templates.
28
- */
29
- services['TemplateList'] = () => List
30
-
31
- /*
32
- * Application router instance.
33
- */
34
- services['router'] = ({ document, TemplateEdit, TemplateList }) => {
35
- return new Router([{
36
- route: WpraGlobal.templates_url_base + '&action',
37
- name: 'templates-form',
38
- component: TemplateEdit,
39
- }, {
40
- route: WpraGlobal.templates_url_base,
41
- name: 'templates',
42
- component: TemplateList,
43
- }], {
44
- afterNavigating: () => {
45
- document.querySelector('html').scrollTop = 0
46
- }
47
- })
48
- }
49
-
50
- /*
51
- * Application with client side routes.
52
- */
53
- services['App'] = (container) => {
54
- return makeRouterApp(container)
55
- }
56
-
57
- /*
58
- * Setup and register central storage management.
59
- */
60
- services['vuex'] = ({ vue }) => {
61
- vue.use(Vuex)
62
- return Vuex
63
- }
64
-
65
- services['notification'] = ({ vue }) => {
66
- vue.use(toasted, {
67
- position: 'top-center',
68
- duration: 4000,
69
- iconPack: 'callback'
70
- })
71
- return new NotificationCenter(vue.toasted.show, vue.toasted.error)
72
- }
73
-
74
- services['store'] = ({ vuex }) => {
75
- return new vuex.Store({
76
- modules: {
77
- templates
78
- },
79
- state: {}
80
- })
81
- }
82
-
83
- services['http'] = () => {
84
- /*
85
- * Create authorized client for requests when nonce
86
- * exists in global WPRA variable.
87
- */
88
- let httpClientOptions = !!WpraGlobal && !!WpraGlobal.nonce ? {
89
- headers: {
90
- 'X-WP-Nonce': WpraGlobal.nonce,
91
- }
92
- } : {}
93
- return axios.create(httpClientOptions)
94
- }
95
-
96
- /*
97
- * Register components.
98
- */
99
- for(const [name, definition] of Object.entries(components)) {
100
- services[name] = () => definition
101
- }
102
-
103
- return services
104
- },
105
- run ({ container }) {
106
- /*
107
- * Enable tippy.js tooltips.
108
- */
109
- container.vue.use(VueTippy, {
110
- theme: 'light',
111
- animation: 'fade',
112
- arrow: true,
113
- arrowTransform: 'scale(0)',
114
- placement: 'right'
115
- })
116
- },
117
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/templates/index.js DELETED
@@ -1,36 +0,0 @@
1
- require('css/src/templates/index.scss')
2
-
3
- import * as UiFramework from '@rebelcode/ui-framework'
4
- import Bottle from 'bottlejs'
5
- import TemplatesApplication from './app'
6
- import Vue from 'vue'
7
-
8
- const { Container, Core, Services } = UiFramework
9
-
10
- /*
11
- * Extend UI framework object.
12
- */
13
- if (window.UiFramework) {
14
- window.UiFramework = Object.assign({}, window.UiFramework, Core.UiFramework)
15
- }
16
-
17
- let services = {
18
- uiFramework: UiFramework,
19
- hooks: new Services.HookService,
20
- document: document,
21
- vue: function (container) {
22
- Vue.use(container.uiFramework.Core.InjectedComponents, {
23
- container
24
- })
25
- return Vue
26
- }
27
- }
28
- const containerFactory = new Container.ContainerFactory(Bottle)
29
- const app = new Core.UiFramework.App(containerFactory, services)
30
-
31
- window.UiFramework.registerPlugin('templates-app', TemplatesApplication)
32
-
33
- app.use(WpraTemplates.modules || ['templates-app'])
34
- app.init({
35
- '#wpra-templates-app': 'App',
36
- })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/templates/store/actions.js DELETED
@@ -1 +0,0 @@
1
- export default {}
 
js/src/modules/templates/store/getters.js DELETED
@@ -1,7 +0,0 @@
1
- import collect from 'app/utils/Collection'
2
-
3
- export default {
4
- item: state => id => {
5
- return collect(state.items).find(id)
6
- }
7
- }
 
 
 
 
 
 
 
js/src/modules/templates/store/index.js DELETED
@@ -1,12 +0,0 @@
1
- import mutations from './mutations'
2
- import actions from './actions'
3
- import state from './state'
4
- import getters from './getters'
5
-
6
- export default {
7
- namespaced: true,
8
- mutations,
9
- actions,
10
- state,
11
- getters,
12
- }
 
 
 
 
 
 
 
 
 
 
 
 
js/src/modules/templates/store/mutations.js DELETED
@@ -1,10 +0,0 @@
1
- export default {
2
- set (state, items = []) {
3
- state.isInitialized = true
4
- state.items = items
5
- },
6
-
7
- updatePreset (state, preset = null) {
8
- state.preset = preset
9
- }
10
- }
 
 
 
 
 
 
 
 
 
 
js/src/modules/templates/store/state.js DELETED
@@ -1,18 +0,0 @@
1
- export default {
2
- /*
3
- * Whether the templates was initialized.
4
- *
5
- * @todo: remove it. This is trick to not handle proper route params watcher.
6
- */
7
- isInitialized: false,
8
-
9
- /*
10
- * All loaded template items.
11
- */
12
- items: [],
13
-
14
- /*
15
- * Predefined template value. Used for items duplication.
16
- */
17
- preset: {},
18
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/utils/Collection.js DELETED
@@ -1,178 +0,0 @@
1
- class Collection {
2
- constructor (data, primaryField = 'id') {
3
- this.data = data
4
- this.primaryField = primaryField
5
- return this
6
- }
7
-
8
- /**
9
- * Find element by params
10
- *
11
- * @param params
12
- * @param _default
13
- * @returns {*}
14
- */
15
- find (params, _default = null) {
16
- if (typeof params !== 'object' && params !== null) {
17
- params = {
18
- [this.primaryField]: params
19
- }
20
- }
21
- for (let i in this.data) {
22
- if (this._isMatching(this.data[i], params)) {
23
- return this.data[i]
24
- }
25
- }
26
-
27
- return _default
28
- }
29
-
30
- /**
31
- * Get and left only one column
32
- *
33
- * @param field
34
- * @returns {*}
35
- */
36
- pluck (field) {
37
- return this.data.map((item) => {
38
- return item[field]
39
- })
40
- }
41
-
42
- /**
43
- * Remove all elements matching given params
44
- *
45
- * @param params
46
- */
47
- remove (params) {
48
- for (let i in this.data) {
49
- if (this._isMatching(this.data[i], params)) {
50
- this.data.splice(i, 1)
51
- }
52
- }
53
- return this
54
- }
55
-
56
- /**
57
- * Add data from parameter array that not in
58
- * collection;
59
- *
60
- * @param data
61
- */
62
- appendDiff (data) {
63
- for (let el of data) {
64
- if (!this.contains(el)) {
65
- this.data.push(el)
66
- }
67
- }
68
- }
69
-
70
- /**
71
- * Add data from parameter array that not in
72
- * collection;
73
- *
74
- * @param data
75
- */
76
- prependDiff (data) {
77
- for (let el of data.slice().reverse()) {
78
- if (!this.contains(el)) {
79
- this.data.unshift(el)
80
- }
81
- }
82
- }
83
-
84
- contains (element) {
85
- for (let el of this.data) {
86
- if (el['id'] == element['id'])
87
- return true
88
- }
89
- return false
90
- }
91
-
92
- filterValues (callback) {
93
- return Object.keys(this.data).filter(key => {
94
- return callback(this.data[key], key)
95
- }).reduce((filteredResult, key) => {
96
- filteredResult[key] = this.data[key]
97
- return filteredResult
98
- }, {})
99
- }
100
-
101
- filter (params) {
102
- return this.data.filter((item) => {
103
- return this._isMatching(item, params)
104
- })
105
- }
106
-
107
- /**
108
- * Select all items where value of column in given array
109
- *
110
- * @param data
111
- * @param key
112
- * @returns {Array}
113
- */
114
- whereIn (data, key = 'id') {
115
- let newCollection = [],
116
- param = {}
117
-
118
- param[key] = null
119
-
120
- for (let val of data) {
121
- param[key] = val
122
-
123
- let item = this.find(param)
124
- if (item) {
125
- newCollection.push(item)
126
- }
127
- }
128
-
129
- return newCollection
130
- }
131
-
132
- key (field) {
133
- const data = this.data.slice().reduce((obj, item) => {
134
- obj[item[field]] = item
135
- return obj
136
- }, {})
137
- return new Collection(data)
138
- }
139
-
140
- mapValues (callback) {
141
- Object.keys(this.data).map((key) => {
142
- this.data[key] = callback(this.data[key], key)
143
- })
144
- return this
145
- }
146
-
147
- values () {
148
- return this.data
149
- }
150
-
151
- /**
152
- * Check element is matching params.
153
- *
154
- * @param element
155
- * @param params
156
- * @return {boolean}
157
- * @private
158
- */
159
- _isMatching (element, params) {
160
- if (!(element instanceof Object) && !(params instanceof Object)) {
161
- return element == params
162
- }
163
-
164
- let match = true
165
- for (let key of Object.keys(params)) {
166
- let keyMatch = element.hasOwnProperty(key) && (element[key] == params[key])
167
- match = match && (keyMatch)
168
- }
169
- return match
170
- }
171
-
172
- }
173
-
174
- function collect (data) {
175
- return new Collection(data)
176
- }
177
-
178
- export default collect
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/utils/base64.js DELETED
@@ -1,133 +0,0 @@
1
- let Base64 = {
2
-
3
- // private property
4
- _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
5
-
6
- // public method for encoding
7
- encode: function (input) {
8
- var output = "";
9
- var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
10
- var i = 0;
11
-
12
- input = Base64._utf8_encode(input);
13
-
14
- while (i < input.length) {
15
-
16
- chr1 = input.charCodeAt(i++);
17
- chr2 = input.charCodeAt(i++);
18
- chr3 = input.charCodeAt(i++);
19
-
20
- enc1 = chr1 >> 2;
21
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
22
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
23
- enc4 = chr3 & 63;
24
-
25
- if (isNaN(chr2)) {
26
- enc3 = enc4 = 64;
27
- } else if (isNaN(chr3)) {
28
- enc4 = 64;
29
- }
30
-
31
- output = output +
32
- this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
33
- this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
34
-
35
- }
36
-
37
- return output;
38
- },
39
-
40
- // public method for decoding
41
- decode: function (input) {
42
- var output = "";
43
- var chr1, chr2, chr3;
44
- var enc1, enc2, enc3, enc4;
45
- var i = 0;
46
-
47
- input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
48
-
49
- while (i < input.length) {
50
-
51
- enc1 = this._keyStr.indexOf(input.charAt(i++));
52
- enc2 = this._keyStr.indexOf(input.charAt(i++));
53
- enc3 = this._keyStr.indexOf(input.charAt(i++));
54
- enc4 = this._keyStr.indexOf(input.charAt(i++));
55
-
56
- chr1 = (enc1 << 2) | (enc2 >> 4);
57
- chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
58
- chr3 = ((enc3 & 3) << 6) | enc4;
59
-
60
- output = output + String.fromCharCode(chr1);
61
-
62
- if (enc3 != 64) {
63
- output = output + String.fromCharCode(chr2);
64
- }
65
- if (enc4 != 64) {
66
- output = output + String.fromCharCode(chr3);
67
- }
68
-
69
- }
70
-
71
- output = Base64._utf8_decode(output);
72
-
73
- return output;
74
-
75
- },
76
-
77
- // private method for UTF-8 encoding
78
- _utf8_encode: function (string) {
79
- string = string.replace(/\r\n/g, "\n");
80
- var utftext = "";
81
-
82
- for (var n = 0; n < string.length; n++) {
83
-
84
- var c = string.charCodeAt(n);
85
-
86
- if (c < 128) {
87
- utftext += String.fromCharCode(c);
88
- } else if ((c > 127) && (c < 2048)) {
89
- utftext += String.fromCharCode((c >> 6) | 192);
90
- utftext += String.fromCharCode((c & 63) | 128);
91
- } else {
92
- utftext += String.fromCharCode((c >> 12) | 224);
93
- utftext += String.fromCharCode(((c >> 6) & 63) | 128);
94
- utftext += String.fromCharCode((c & 63) | 128);
95
- }
96
-
97
- }
98
-
99
- return utftext;
100
- },
101
-
102
- // private method for UTF-8 decoding
103
- _utf8_decode: function (utftext) {
104
- var string = "";
105
- var i = 0;
106
- var c = 0, c1 = 0, c2 = 0;
107
-
108
- while (i < utftext.length) {
109
-
110
- c = utftext.charCodeAt(i);
111
-
112
- if (c < 128) {
113
- string += String.fromCharCode(c);
114
- i++;
115
- } else if ((c > 191) && (c < 224)) {
116
- c2 = utftext.charCodeAt(i + 1);
117
- string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
118
- i += 2;
119
- } else {
120
- c2 = utftext.charCodeAt(i + 1);
121
- c3 = utftext.charCodeAt(i + 2);
122
- string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
123
- i += 3;
124
- }
125
-
126
- }
127
-
128
- return string;
129
- }
130
-
131
- }
132
-
133
- export default Base64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/utils/copy.js DELETED
@@ -1,43 +0,0 @@
1
- /**
2
- * Helper functions to copy text to clipboard.
3
- *
4
- * @see https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript
5
- *
6
- * @param text
7
- */
8
-
9
- const fallbackCopyToClipboard = function (text, scrollContainer = null) {
10
- scrollContainer = scrollContainer || document.body.parentElement
11
- var textArea = document.createElement('textarea')
12
- textArea.value = text
13
-
14
- var currentScrollTop = scrollContainer.scrollTop
15
-
16
- document.body.appendChild(textArea)
17
- textArea.focus()
18
- textArea.select()
19
-
20
- try {
21
- var successful = document.execCommand('copy')
22
- var msg = successful ? 'successful' : 'unsuccessful'
23
- console.log('Fallback: Copying text command was ' + msg)
24
- } catch (err) {
25
- console.error('Fallback: Oops, unable to copy', err)
26
- }
27
-
28
- document.body.removeChild(textArea)
29
-
30
- scrollContainer.scrollTop = currentScrollTop
31
- }
32
-
33
- export function copyToClipboard (text, scrollContainer = null) {
34
- if (!navigator.clipboard) {
35
- fallbackCopyToClipboard(text, scrollContainer)
36
- return
37
- }
38
- navigator.clipboard.writeText(text).then(function () {
39
- console.log('Async: Copying to clipboard was successful!')
40
- }, function (err) {
41
- console.error('Async: Could not copy text: ', err)
42
- })
43
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/utils/deepmerge.js DELETED
@@ -1,72 +0,0 @@
1
- function isMergeableObject (val) {
2
- var nonNullObject = val && typeof val === 'object'
3
-
4
- return nonNullObject
5
- && Object.prototype.toString.call(val) !== '[object RegExp]'
6
- && Object.prototype.toString.call(val) !== '[object Date]'
7
- }
8
-
9
- function emptyTarget (val) {
10
- return Array.isArray(val) ? [] : {}
11
- }
12
-
13
- function cloneIfNecessary (value, optionsArgument) {
14
- var clone = optionsArgument && optionsArgument.clone === true
15
- return (clone && isMergeableObject(value)) ? deepmerge(emptyTarget(value), value, optionsArgument) : value
16
- }
17
-
18
- function defaultArrayMerge (target, source, optionsArgument) {
19
- var destination = target.slice()
20
- source.forEach(function (e, i) {
21
- if (typeof destination[i] === 'undefined') {
22
- destination[i] = cloneIfNecessary(e, optionsArgument)
23
- } else if (isMergeableObject(e)) {
24
- destination[i] = deepmerge(target[i], e, optionsArgument)
25
- } else if (target.indexOf(e) === -1) {
26
- destination.push(cloneIfNecessary(e, optionsArgument))
27
- }
28
- })
29
- return destination
30
- }
31
-
32
- function mergeObject (target, source, optionsArgument) {
33
- var destination = {}
34
- if (isMergeableObject(target)) {
35
- Object.keys(target).forEach(function (key) {
36
- destination[key] = cloneIfNecessary(target[key], optionsArgument)
37
- })
38
- }
39
- Object.keys(source).forEach(function (key) {
40
- if (!isMergeableObject(source[key]) || !target[key]) {
41
- destination[key] = cloneIfNecessary(source[key], optionsArgument)
42
- } else {
43
- destination[key] = deepmerge(target[key], source[key], optionsArgument)
44
- }
45
- })
46
- return destination
47
- }
48
-
49
- function deepmerge (target, source, optionsArgument) {
50
- var array = Array.isArray(source)
51
- var options = optionsArgument || {arrayMerge: defaultArrayMerge}
52
- var arrayMerge = options.arrayMerge || defaultArrayMerge
53
-
54
- if (array) {
55
- return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument)
56
- } else {
57
- return mergeObject(target, source, optionsArgument)
58
- }
59
- }
60
-
61
- deepmerge.all = function deepmergeAll (array, optionsArgument) {
62
- if (!Array.isArray(array) || array.length < 2) {
63
- throw new Error('first argument should be an array with at least two elements')
64
- }
65
-
66
- // we are sure there are at least 2 values, so it is safe to have no initial value
67
- return array.reduce(function (prev, next) {
68
- return deepmerge(prev, next, optionsArgument)
69
- })
70
- }
71
-
72
- export default deepmerge
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/utils/fetch.js DELETED
@@ -1,26 +0,0 @@
1
- /**
2
- * Make fetch request and parse response JSON.
3
- *
4
- * @param url
5
- * @param data
6
- * @param config
7
- *
8
- * @return {Promise<Response>}
9
- */
10
- export function post (url, data, config = {}) {
11
- const preparedData = new FormData()
12
- for (let key of Object.keys(data)) {
13
- preparedData.set(key, data[key])
14
- }
15
- return fetch(url, {
16
- method: 'post',
17
- body: preparedData
18
- }).then(response => {
19
- return response.json()
20
- }).then(data => {
21
- if (data.status !== 200) {
22
- throw data
23
- }
24
- return data
25
- })
26
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/src/utils/jsonClone.js DELETED
@@ -1,3 +0,0 @@
1
- export default function (data) {
2
- return JSON.parse(JSON.stringify(data))
3
- }
 
 
 
languages/default.mo CHANGED
Binary file
languages/default.po CHANGED
@@ -1,1745 +1,2914 @@
1
  msgid ""
2
  msgstr ""
3
- "Project-Id-Version: wprss\n"
4
- "POT-Creation-Date: 2015-03-04 19:09+0700\n"
5
- "PO-Revision-Date: 2015-03-04 19:09+0700\n"
6
  "Last-Translator: \n"
7
- "Language-Team: \n"
 
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
11
- "X-Generator: Poedit 1.7.1\n"
12
- "X-Poedit-KeywordsList: _;__;_e\n"
13
- "X-Poedit-Basepath: ../\n"
 
 
 
 
 
 
14
  "X-Poedit-SearchPath-0: .\n"
15
-
16
- #: includes/OPML.php:42
17
- msgid ""
18
- "An error occured: The file might not be a valid OPML file or is corrrupt. "
 
 
 
 
 
 
19
  msgstr ""
20
 
21
- #: includes/admin-addons.php:13
22
- msgid "Excerpts & Thumbnails"
23
  msgstr ""
24
 
25
- #: includes/admin-addons.php:14
26
- msgid ""
27
- "Adds the ability to display thumbnails and excerpts. Perfect for adding some "
28
- "life and color to your feed item display. For more flexibility Feed to Post "
29
- "is a better option."
30
  msgstr ""
31
 
32
- #: includes/admin-addons.php:20 includes/admin-welcome.php:105
33
- msgid "Categories"
34
  msgstr ""
35
 
36
- #: includes/admin-addons.php:21
37
- msgid ""
38
- "Assign categories to your feed sources. Then display a particular category "
39
- "or multiple categories on a post or page via shortcodes."
40
  msgstr ""
41
 
42
- #: includes/admin-addons.php:27 includes/admin-welcome.php:106
43
- msgid "Keyword Filtering"
44
  msgstr ""
45
 
46
- #: includes/admin-addons.php:28
47
- msgid ""
48
- "Import feeds that contain specific keywords in either the title or their "
49
- "content. Control what gets imported to your blog. You can use keywords, "
50
- "keyphrases and categories."
51
  msgstr ""
52
 
53
- #: includes/admin-addons.php:34 includes/admin-welcome.php:103
54
- msgid "Feed to Post"
55
  msgstr ""
56
 
57
- #: includes/admin-addons.php:35
58
- msgid ""
59
- "Allows you to import feed items into posts or any other custom post type "
60
- "that you have created. Takes WP RSS Aggregator to a whole new level of "
61
- "flexibility."
62
  msgstr ""
63
 
64
- #: includes/admin-addons.php:41 includes/admin-welcome.php:107
65
- msgid "Full Text RSS Feeds"
66
  msgstr ""
67
 
68
- #: includes/admin-addons.php:42
69
- msgid ""
70
- "This add-ons provides the connectivity to our Full Text Premium service, "
71
- "which gives you unlimited feed items returned per feed source."
72
  msgstr ""
73
 
74
- #: includes/admin-addons.php:48 includes/admin-welcome.php:108
75
- msgid "WordAi"
76
  msgstr ""
77
 
78
- #: includes/admin-addons.php:49
79
  msgid ""
80
- "Allows you to spin the content for posts imported by Feed to Post using "
81
- "WordAi. Cleverly rewrite your posts without changing their meaning and "
82
- "maintaining human readability."
83
  msgstr ""
84
 
85
- #: includes/admin-addons.php:59 includes/admin.php:43
86
- msgid "Add-Ons"
87
  msgstr ""
88
 
89
- #: includes/admin-addons.php:60
90
- msgid ""
91
- "The following Add-ons are available to increase the functionality of the WP "
92
- "RSS Aggregator plugin."
93
  msgstr ""
94
 
95
- #: includes/admin-addons.php:61
96
- msgid ""
97
- "Each Add-on can be installed as a separate plugin. Note that activating the "
98
- "Feed to Post plugin will deactivate the Categories and Excerpts & Thumbnails "
99
- "add-ons."
100
  msgstr ""
101
 
102
- #: includes/admin-addons.php:77
103
- msgid "Installed"
104
  msgstr ""
105
 
106
- #: includes/admin-addons.php:79
107
- msgid "Purchase & Install"
 
 
108
  msgstr ""
109
 
110
- #: includes/admin-ajax-notice.php:34
111
  msgid ""
112
  "Did you know that you can get more RSS features? Excerpts, thumbnails, "
113
  "keyword filtering, importing into posts and more... "
114
  msgstr ""
115
 
116
- #: includes/admin-ajax-notice.php:35
117
- msgid "Check out the"
 
118
  msgstr ""
119
 
120
- #: includes/admin-ajax-notice.php:35
121
- msgid "extensions"
 
122
  msgstr ""
123
 
124
- #: includes/admin-ajax-notice.php:35
125
- msgid "page."
126
  msgstr ""
127
 
128
- #: includes/admin-ajax-notice.php:36 includes/licensing.php:315
129
- msgid "Dismiss this notification"
130
  msgstr ""
131
 
132
- #: includes/admin-dashboard.php:25 includes/admin-dashboard.php:26
133
- msgid "Welcome to WP RSS Aggregator"
134
  msgstr ""
135
 
136
- #: includes/admin-debugging.php:103
137
- msgid "Update All Feeds Now"
138
  msgstr ""
139
 
140
- #: includes/admin-debugging.php:104
141
- msgid ""
142
- "Click the blue button to update all active feed items now. This will check "
143
- "all feed sources for any new feed items."
144
  msgstr ""
145
 
146
- #: includes/admin-debugging.php:105
147
- msgid "Existing feed items will not be modified."
 
148
  msgstr ""
149
 
150
- #: includes/admin-debugging.php:107
151
- msgid ""
152
- "<strong>Note:</strong> This might take more than a few seconds if you have "
153
- "many feed sources."
154
  msgstr ""
155
 
156
- #: includes/admin-debugging.php:112
157
- msgid "Update all feeds"
158
  msgstr ""
159
 
160
- #: includes/admin-debugging.php:126
161
- msgid "Delete and Re-import Feeds"
162
  msgstr ""
163
 
164
- #: includes/admin-debugging.php:127
 
165
  msgid ""
166
- "Click the red button to delete all imported feed items and re-import them."
 
167
  msgstr ""
168
 
169
- #: includes/admin-debugging.php:128
 
170
  msgid ""
171
- "<em><strong>Note:</strong> This is a server-intensive process and should "
172
- "only be used when instructed to by support staff.</em>"
 
173
  msgstr ""
174
 
175
- #: includes/admin-debugging.php:133
176
- msgid "Delete and Re-import all feeds"
 
 
 
 
177
  msgstr ""
178
 
179
- #: includes/admin-debugging.php:147 includes/admin-debugging.php:154
180
- msgid "Restore Default Settings"
181
  msgstr ""
182
 
183
- #: includes/admin-debugging.php:148
184
- msgid "Click the red button to reset the plugin settings to default."
185
  msgstr ""
186
 
187
- #: includes/admin-debugging.php:149
188
- msgid ""
189
- "<em><strong>Note:</strong> This cannot be undone. Once the settings have "
190
- "been reset, your old settings cannot be restored.</em>"
191
  msgstr ""
192
 
193
- #: includes/admin-debugging.php:168
194
- msgid "Error Log"
195
  msgstr ""
196
 
197
- #: includes/admin-debugging.php:174
198
- msgid "Clear log"
199
  msgstr ""
200
 
201
- #: includes/admin-debugging.php:202 includes/admin.php:42
202
- msgid "Debugging"
203
  msgstr ""
204
 
205
- #: includes/admin-debugging.php:252
206
- msgid "Feeds are being updated in the background."
207
  msgstr ""
208
 
209
- #: includes/admin-debugging.php:261
210
- msgid "Feeds deleted and are being re-imported in the background."
211
  msgstr ""
212
 
213
- #: includes/admin-debugging.php:271
214
- msgid "The error log has been cleared."
 
215
  msgstr ""
216
 
217
- #: includes/admin-debugging.php:281
218
- msgid "The plugin settings have been reset to default."
219
  msgstr ""
220
 
221
- #: includes/admin-display.php:20 includes/admin-display.php:212
222
- msgid "Name"
223
  msgstr ""
224
 
225
- #: includes/admin-display.php:27
226
- msgid "State"
 
227
  msgstr ""
228
 
229
- #: includes/admin-display.php:28
230
  msgid "Updates"
231
  msgstr ""
232
 
233
- #: includes/admin-display.php:48
234
- msgid ""
235
- "This feed source experienced an error during the last feed fetch or "
236
- "validation check. Re-check the feed source URL or check the Error Log in the "
237
- "Debugging page for more details."
 
 
 
 
 
238
  msgstr ""
239
 
240
- #: includes/admin-display.php:89 includes/admin-heartbeat.php:53
241
  msgid "None"
242
  msgstr ""
243
 
244
- #: includes/admin-display.php:91 includes/admin-heartbeat.php:50
245
- #: includes/admin-metaboxes.php:467
246
- msgid "Paused"
247
  msgstr ""
248
 
249
- #: includes/admin-display.php:98
250
- msgid "Next update:"
251
  msgstr ""
252
 
253
- #: includes/admin-display.php:106
254
- msgid "Last updated:"
 
255
  msgstr ""
256
 
257
- #: includes/admin-display.php:107 includes/feed-display.php:153
258
  #, php-format
259
  msgid "%1$s ago"
260
  msgstr ""
261
 
262
- #: includes/admin-display.php:109
263
- #, php-format
 
 
 
 
264
  msgid ""
265
- "Last update imported: <code class=\"last-update-imported\">%1$d</code> items"
 
 
266
  msgstr ""
267
 
268
- #: includes/admin-display.php:124 includes/admin-metaboxes.php:242
269
- msgid "Updating feed source"
 
 
 
 
 
 
 
 
 
 
 
 
270
  msgstr ""
271
 
272
- #: includes/admin-display.php:213 includes/feed-blacklist.php:322
273
  msgid "Permalink"
274
  msgstr ""
275
 
276
- #: includes/admin-display.php:214
277
  msgid "Date published"
278
  msgstr ""
279
 
280
- #: includes/admin-display.php:215
281
  msgid "Source"
282
  msgstr ""
283
 
284
- #: includes/admin-display.php:304
285
  msgid "Feed source updated. "
286
  msgstr ""
287
 
288
- #: includes/admin-display.php:305
289
  msgid "Custom field updated."
290
  msgstr ""
291
 
292
- #: includes/admin-display.php:306
293
  msgid "Custom field deleted."
294
  msgstr ""
295
 
296
- #: includes/admin-display.php:307 includes/admin-display.php:313
297
  msgid "Feed source updated."
298
  msgstr ""
299
 
300
- #: includes/admin-display.php:309 includes/admin-display.php:310
301
  msgid "Feed source saved."
302
  msgstr ""
303
 
304
- #: includes/admin-display.php:311
305
  msgid "Feed source submitted."
306
  msgstr ""
307
 
308
- #: includes/admin-display.php:338
309
  #, php-format
310
  msgid "ID: %1$s"
311
  msgstr ""
312
 
313
- #: includes/admin-display.php:352
314
- msgid "View Items"
315
- msgstr ""
316
-
317
- #: includes/admin-display.php:355
318
- msgid "Fetch Items"
319
  msgstr ""
320
 
321
- #: includes/admin-display.php:358
322
- msgid "Delete Items"
323
  msgstr ""
324
 
325
- #: includes/admin-display.php:359
326
- msgid "Delete feed items imported by this feed source"
327
  msgstr ""
328
 
329
- #: includes/admin-display.php:529
330
  msgid "Publish Feed"
331
  msgstr ""
332
 
333
- #: includes/admin-editor.php:87
334
  msgid ""
335
- "Hold Ctrl or Mac Command key when clicking to select more than one feed "
336
- "source."
 
337
  msgstr ""
338
 
339
- #: includes/admin-editor.php:97 includes/custom-post-types.php:21
340
- #: includes/custom-post-types.php:24
341
- msgid "Feed Sources"
342
  msgstr ""
343
 
344
- #: includes/admin-editor.php:99
 
 
 
 
345
  msgid "All feed sources"
346
  msgstr ""
347
 
348
- #: includes/admin-editor.php:101
349
- msgid "Choose the feed source to display:"
 
 
 
 
 
 
 
 
 
 
 
 
350
  msgstr ""
351
 
352
- #: includes/admin-editor.php:122
353
- msgid "Exclude:"
 
354
  msgstr ""
355
 
356
- #: includes/admin-editor.php:124
357
- msgid "Choose the feed sources to exclude:"
358
  msgstr ""
359
 
360
- #: includes/admin-editor.php:130
361
- msgid "Feed Limit:"
362
  msgstr ""
363
 
364
- #: includes/admin-editor.php:131
365
- msgid "Ignore"
366
  msgstr ""
367
 
368
- #: includes/admin-editor.php:139
 
 
 
 
 
 
 
 
369
  msgid "Add shortcode"
370
  msgstr ""
371
 
372
- #: includes/admin-help-metaboxes.php:14
 
 
 
 
 
373
  msgid ""
374
  "The URL of the feed source. In most cases, the URL of the site will also "
375
  "work, but for best results we recommend trying to find the URL of the RSS "
376
  "feed.\n"
377
  "\n"
378
- " Also include the <code>http://</"
379
- "code> prefix in the URL."
380
  msgstr ""
381
 
382
- #: includes/admin-help-metaboxes.php:18
383
  msgid ""
384
  "The maximum number of imported items from this feed to keep stored.\n"
385
  "\n"
386
- " When new items are imported and the "
387
- "limit is exceeded, the oldest feed items will be deleted to make room for "
388
- "new ones.\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
389
  "\n"
390
- " If you already have items imported "
391
- "from this feed source, setting this option now may delete some of your "
392
- "items, in order to comply with the limit."
 
393
  msgstr ""
394
 
395
- #: includes/admin-help-metaboxes.php:24
396
  msgid ""
397
- "Tick this box to make feed items link to the URL in the enclosure tag, "
398
- "rather than link to the original article.\n"
399
  "\n"
400
- " Enclosure tags are RSS tags that may "
401
- "be included with a feed items. These tags typically contain links to images, "
402
- "audio, videos, attachment files or even flash content.\n"
403
  "\n"
404
- " If you are not sure leave this "
405
- "setting blank."
406
  msgstr ""
407
 
408
- #: includes/admin-help-metaboxes.php:35
409
  msgid ""
410
  "State of the feed, active or paused.\n"
411
  "\n"
412
- " If active, the feed source will "
413
- "fetch items periodically, according to the settings below.\n"
414
  "\n"
415
- " If paused, the feed source will not "
416
- "fetch feed items periodically."
417
  msgstr ""
418
 
419
- #: includes/admin-help-metaboxes.php:41
420
  msgid ""
421
  "You can set a time, in UTC, in the future when the feed source will become "
422
  "active, if it is paused.\n"
423
  "\n"
424
- " Leave blank to activate immediately."
425
  msgstr ""
426
 
427
- #: includes/admin-help-metaboxes.php:45
428
  msgid ""
429
  "You can set a time, in UTC, in the future when the feed source will become "
430
  "paused, if it is active.\n"
431
  "\n"
432
- " Leave blank to never pause."
433
  msgstr ""
434
 
435
- #: includes/admin-help-metaboxes.php:49
436
  msgid ""
437
  "How frequently the feed source should check for new items and fetch if "
438
  "needed.\n"
439
  "\n"
440
- " If left as <em>Default</em>, the "
441
- "interval in the global settings is used."
442
  msgstr ""
443
 
444
- #: includes/admin-help-metaboxes.php:53
445
  msgid ""
446
  "The maximum age allowed for feed items. Very useful if you are only "
447
  "concerned with, say, last week's news.\n"
448
  "\n"
449
- " Items already imported will be "
450
- "deleted if they eventually exceed this age limit.\n"
451
  "\n"
452
- " Also, items in the RSS feed that are "
453
- "already older than this age will not be imported at all.\n"
454
  "\n"
455
- " Leaving empty to use the <em>Limit "
456
- "feed items by age</em> option in the general settings."
457
  msgstr ""
458
 
459
- #: includes/admin-help-metaboxes.php:66
460
  msgid ""
461
  "Use this option if you are seeing an <q>Invalid feed URL</q> error in the "
462
  "Feed Preview above, but you are sure that the URL is correct.\n"
463
  "\n"
464
- " Note, however, that this will disable "
465
- "auto-discovery, meaning that the given URL must be an RSS feed URL. Using "
466
- "the site's URL will not work."
467
  msgstr ""
468
 
469
- #: includes/admin-help-settings.php:13
470
  msgid ""
471
  "The maximum age allowed for feed items.\n"
472
- " <hr/>\n"
473
  "\n"
474
- " Items already imported will be "
475
- "deleted if they eventually exceed this age limit.\n"
476
  "\n"
477
- " Also, items in the RSS feed that "
478
- "are already older than this age will not be imported at all.\n"
479
- " <hr/>\n"
480
  "\n"
481
- " <em>Leave empty for no limit.</"
482
- "em>"
483
  msgstr ""
484
 
485
- #: includes/admin-help-settings.php:23
486
  msgid ""
487
  "The maximum number of imported items to keep stored, for feed sources that "
488
  "do not have their own limit.\n"
489
- " <hr/>\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
490
  "\n"
491
- " When new items are imported and "
492
- "the limit for a feed source is exceeded, the oldest feed items for that feed "
493
- "source will be deleted to make room for the new ones.\n"
 
 
494
  "\n"
495
- " If you already have items "
496
- "imported from this feed source, setting this option now may delete some of "
497
- "your items, in order to comply with the limit.\n"
498
- " <hr/>\n"
499
- " \n"
500
- " <em>Use 0 or leave empty for no "
501
- "limit.</em>"
 
 
 
 
 
502
  msgstr ""
503
 
504
- #: includes/admin-help-settings.php:33
505
  msgid ""
506
  "How frequently should the feed sources (that do not have their own update "
507
  "interval) check for updates and fetch items accordingly.\n"
508
  "\n"
509
- " It is recommended to not have "
510
- "more than 20 feed sources that use this global update interval. Having too "
511
- "many feed sources updating precisely at the same time can cause the WP Cron "
512
- "System to crash."
513
  msgstr ""
514
 
515
- #: includes/admin-help-settings.php:37
516
  msgid ""
517
- "The URL of the custom feed, located at <code>http://yoursite.com/[custom "
 
 
 
 
 
 
 
 
 
 
 
 
 
 
518
  "feed url]</code>.\n"
519
- " <hr/>\n"
520
  "\n"
521
- " WP RSS Aggregator allows you to "
522
- "create a custom RSS feed, that contains all of your imported feed items. "
523
- "This setting allows you to change the URL of this custom feed.\n"
524
  "\n"
525
- " <hr/>\n"
526
  "\n"
527
- " <strong>Note:</strong> You may "
528
- "be required to refresh you Permalinks after you change this setting, by "
529
- "going to <em>Settings <i class=\"fa fa-angle-right\"></i> Permalinks</e> and "
530
- "clicking <em>Save</em>."
531
  msgstr ""
532
 
533
- #: includes/admin-help-settings.php:46
534
  msgid ""
535
  "The title of the custom feed.\n"
536
  "\n"
537
- " This title will be included in "
538
- "the RSS source of the custom feed, in a <code>&lt;title&gt;</code> tag."
539
  msgstr ""
540
 
541
- #: includes/admin-help-settings.php:50
542
  msgid "The maximum number of feed items in the custom feed."
543
  msgstr ""
544
 
545
- #: includes/admin-help-settings.php:56
546
  msgid ""
547
  "Check this box to make the feed item titles link to the original article."
548
  msgstr ""
549
 
550
- #: includes/admin-help-settings.php:58
551
  msgid ""
552
  "Set the maximum number of characters to show for feed item titles.\n"
553
- " <hr/>\n"
554
  "\n"
555
- " <em>Leave empty for no limit.</"
556
- "em>"
557
  msgstr ""
558
 
559
- #: includes/admin-help-settings.php:63
560
  msgid ""
561
  "Check this box to show the author for each feed item, if it is available."
562
  msgstr ""
563
 
564
- #: includes/admin-help-settings.php:65
565
  msgid ""
566
  "For feed items from YouTube, Vimeo or Dailymotion, you can choose whether "
567
  "you want to have the items link to the original page link, or a link to the "
568
  "embedded video player only."
569
  msgstr ""
570
 
571
- #: includes/admin-help-settings.php:67
572
  msgid ""
573
  "The type of pagination to use when showing feed items on multiple pages.\n"
574
  "\n"
575
- " The first shows two links, "
576
- "\"Older\" and \"Newer\", which allow you to navigate through the pages.\n"
577
  "\n"
578
- " The second shows links for all "
579
- "the pages, together with links for the next and previous pages."
580
  msgstr ""
581
 
582
- #: includes/admin-help-settings.php:73
583
  msgid ""
584
  "The maximum number of feed items to display when using the shortcode.\n"
585
  "\n"
586
- " This enables pagination if set "
587
- "to a number smaller than the number of items to be displayed."
588
  msgstr ""
589
 
590
- #: includes/admin-help-settings.php:77
591
  msgid ""
592
  "Choose how you want links to be opened. This applies to the feed item title "
593
  "and the source link."
594
  msgstr ""
595
 
596
- #: includes/admin-help-settings.php:79
597
  msgid ""
598
  "Enable this option to set all links displayed as \"NoFollow\".\n"
599
- " <hr/>\n"
600
  "\n"
601
- " \"Nofollow\" provides a way to "
602
- "tell search engines to <em>not</em> follow certain links, such as links to "
603
- "feed items in this case."
604
  msgstr ""
605
 
606
- #: includes/admin-help-settings.php:88
607
  msgid "Enable this option to show the feed source name for each feed item."
608
  msgstr ""
609
 
610
- #: includes/admin-help-settings.php:90
611
  msgid ""
612
  "Enter the text that you want to show before the source name. A space is "
613
  "automatically added between this text and the feed source name."
614
  msgstr ""
615
 
616
- #: includes/admin-help-settings.php:92
617
  msgid ""
618
  "Enable this option to link the feed source name to the RSS feed's source "
619
  "site."
620
  msgstr ""
621
 
622
- #: includes/admin-help-settings.php:98
623
  msgid "Enable this to show the feed item's date."
624
  msgstr ""
625
 
626
- #: includes/admin-help-settings.php:100
627
  msgid ""
628
  "Enter the text that you want to show before the feed item date. A space is "
629
  "automatically added between this text and the date."
630
  msgstr ""
631
 
632
- #: includes/admin-help-settings.php:102
633
  msgid "The format to use for the feed item dates, as a PHP date format."
634
  msgstr ""
635
 
636
- #: includes/admin-help-settings.php:104
637
  msgid ""
638
  "Enable this option to show the elapsed time from the feed item's date and "
639
  "time to the present time.\n"
640
- " <em>Eg. 2 hours ago</em>"
641
  msgstr ""
642
 
643
- #: includes/admin-help-settings.php:111
644
  msgid ""
645
  "Check this box to disable all plugin styles used for displaying feed items.\n"
646
  "\n"
647
- " This will allow you to provide "
648
- "your own custom CSS styles for displaying the feed items."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
649
  msgstr ""
650
 
651
- #: includes/admin-help.php:13 includes/admin.php:44
652
  msgid "Help & Support"
653
  msgstr ""
654
 
655
- #: includes/admin-help.php:14 includes/admin.php:112
656
- msgid "Documentation"
657
  msgstr ""
658
 
659
- #: includes/admin-help.php:15
 
660
  msgid ""
661
- "In the <a href=\"http://www.wprssaggregator.com/documentation/"
662
- "\">documentation area</a> on the WP RSS Aggregator website you will find "
663
- "comprehensive details on how to use the core plugin and all the add-ons.\n"
664
- "\t\t\t\t\n"
665
- "\t\t\t\tThere are also some videos to help you make a quick start to setting "
666
- "up and enjoying this plugin."
667
  msgstr ""
668
 
669
- #: includes/admin-help.php:18
670
  msgid "Frequently Asked Questions (FAQ)"
671
  msgstr ""
672
 
673
- #: includes/admin-help.php:19
 
674
  msgid ""
675
- "If after going through the documentation you still have questions, please "
676
- "take a look at the <a href=\"http://www.wprssaggregator.com/faq/\">FAQ page</"
677
- "a> on the site, we set this up purposely to answer the most commonly asked "
678
- "questions by our users."
679
  msgstr ""
680
 
681
- #: includes/admin-help.php:21
682
- msgid "Support Forums - Core (free version) Plugin Users Only"
683
  msgstr ""
684
 
685
- #: includes/admin-help.php:22
686
  msgid ""
687
- "If you're using the free version of the plugin found on WordPress.org, you "
688
- "can ask questions on the <a href=\"http://wordpress.org/support/plugin/wp-"
689
- "rss-aggregator\">support forum</a>."
690
  msgstr ""
691
 
692
- #: includes/admin-help.php:23
693
- msgid "Email Ticketing System - Premium Add-on Users Only"
 
 
694
  msgstr ""
695
 
696
- #: includes/admin-help.php:24
697
  msgid ""
698
- "If you still can't find an answer to your query after reading the "
699
- "documentation and going through the FAQ, just <a href=\"http://www."
700
- "wprssaggregator.com/contact/\">open a support request ticket</a>.\n"
701
- "\t\t\t\t\tWe'll be happy to help you out."
702
  msgstr ""
703
 
704
- #: includes/admin-help.php:717
705
  msgid ""
706
- "Could not enqueue tooltip content: the queue method is not a valid callable."
 
707
  msgstr ""
708
 
709
- #: includes/admin-import-export.php:60
710
- #, php-format
711
- msgid "Successfully imported <code>%1$s</code> feed sources."
712
  msgstr ""
713
 
714
- #: includes/admin-import-export.php:116
715
- msgid "All options are exported successfully."
716
  msgstr ""
717
 
718
- #: includes/admin-import-export.php:127
719
- msgid "All options are restored successfully."
 
720
  msgstr ""
721
 
722
- #: includes/admin-import-export.php:138
723
- msgid "Invalid file or file size too big."
724
  msgstr ""
725
 
726
- #: includes/admin-import-export.php:192
727
- msgid "Bulk Feed Import"
728
  msgstr ""
729
 
730
- #: includes/admin-import-export.php:193
 
731
  msgid ""
732
- "Import multiple feed sources at once, by entering the name and URLs of your "
733
- "feeds below."
734
  msgstr ""
735
 
736
- #: includes/admin-import-export.php:194
737
- msgid "Separate the name and the URL using a comma on each line:"
738
  msgstr ""
739
 
740
- #: includes/admin-import-export.php:195
741
- msgid "Feed Name, http://www.myfeed.com"
 
 
 
742
  msgstr ""
743
 
744
- #: includes/admin-import-export.php:201
745
- msgid "Bulk Import"
746
  msgstr ""
747
 
748
- #: includes/admin-import-export.php:206
749
- msgid "Import & Export Settings"
750
  msgstr ""
751
 
752
- #: includes/admin-import-export.php:208 includes/admin-import-export.php:215
753
- msgid "Export Settings"
754
  msgstr ""
755
 
756
- #: includes/admin-import-export.php:209
757
- msgid ""
758
- "Click the <strong>Export Settings</strong> button to generate a file "
759
- "containing all the settings used by WP RSS Aggregator"
760
  msgstr ""
761
 
762
- #: includes/admin-import-export.php:210
763
- msgid ""
764
- "After exporting, you can either use the backup file to restore your settings "
765
- "to this site or to another WordPress site."
766
  msgstr ""
767
 
768
- #: includes/admin-import-export.php:219 includes/admin-import-export.php:227
769
- msgid "Import Settings"
770
  msgstr ""
771
 
772
- #: includes/admin-import-export.php:220
773
- msgid "Click the <strong>Choose file</strong> button and choose a backup file."
774
  msgstr ""
775
 
776
- #: includes/admin-import-export.php:221
 
777
  msgid ""
778
- "Press the <strong>Import Settings</strong> button, and WordPress will do the "
779
- "rest for you."
780
  msgstr ""
781
 
782
- #: includes/admin-import-export.php:231
783
- msgid "Importing/Exporting Feed Sources"
 
 
 
784
  msgstr ""
785
 
786
- #: includes/admin-import-export.php:232
787
  #, php-format
788
  msgid ""
789
- "To import/export your feed sources, please use the standard WordPress <a "
790
- "href=\"%1$simport.php\">Import</a> and <a href=\"%1$sexport.php\">Export</a> "
791
- "functionality."
792
  msgstr ""
793
 
794
- #: includes/admin-import-export.php:233
795
- #, php-format
 
 
 
796
  msgid ""
797
- "On the <a href=\"%1$sexport.php\">Export</a> page, check the <strong>Feed "
798
- "Sources</strong> radio button and click the <strong>Download Export File</"
799
- "strong> button. WordPress will then create an XML file containing all the "
800
- "feed sources."
 
801
  msgstr ""
802
 
803
- #: includes/admin-import-export.php:234
804
  #, php-format
805
- msgid ""
806
- "On the <a href=\"%1$simport.php\">Import</a> page, choose the previously "
807
- "created file and click the <strong>Upload file and import</strong> button."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
808
  msgstr ""
809
 
810
- #: includes/admin-log.php:236
811
- msgid "Log level threshold"
 
812
  msgstr ""
813
 
814
- #: includes/admin-metaboxes.php:20
815
  msgid "Save Feed Source"
816
  msgstr ""
817
 
818
- #: includes/admin-metaboxes.php:29
819
  msgid "Feed Preview"
820
  msgstr ""
821
 
822
- #: includes/admin-metaboxes.php:38
823
  msgid "Feed Processing"
824
  msgstr ""
825
 
826
- #: includes/admin-metaboxes.php:48
827
- msgid "Like This Plugin?"
828
  msgstr ""
829
 
830
- #: includes/admin-metaboxes.php:58
831
  msgid "Feed Source Details"
832
  msgstr ""
833
 
834
- #: includes/admin-metaboxes.php:91 includes/opml-importer.php:196
835
- #: includes/opml-importer.php:227
836
  msgid "URL"
837
  msgstr ""
838
 
839
- #: includes/admin-metaboxes.php:99
840
  msgid "Limit"
841
  msgstr ""
842
 
843
- #: includes/admin-metaboxes.php:105
844
  msgid "Link to enclosure"
845
  msgstr ""
846
 
847
- #: includes/admin-metaboxes.php:217 includes/admin-metaboxes.php:471
848
- #: includes/admin-options.php:809 includes/admin-options.php:911
 
 
 
 
 
 
 
 
 
 
 
 
 
 
849
  msgid "Default"
850
  msgstr ""
851
 
852
- #: includes/admin-metaboxes.php:385
 
 
 
 
853
  #, php-format
854
  msgid "Latest %1$s feed items out of %2$s available from %3$s"
855
  msgstr ""
856
 
857
- #: includes/admin-metaboxes.php:392 includes/scripts.php:81
858
  msgid "ago"
859
  msgstr ""
860
 
861
- #: includes/admin-metaboxes.php:394
862
  msgid "No Date"
863
  msgstr ""
864
 
865
- #: includes/admin-metaboxes.php:415
866
  msgid ""
867
  "<strong>Invalid feed URL</strong> - Double check the feed source URL setting "
868
  "above."
869
  msgstr ""
870
 
871
- #: includes/admin-metaboxes.php:419
872
  #, php-format
873
  msgid ""
874
  "Not sure where to find the RSS feed on a website? <a target=\"_blank\" href="
875
  "\"%1$s\">Click here</a> for a visual guide. "
876
  msgstr ""
877
 
878
- #: includes/admin-metaboxes.php:427
879
- msgid "Force the feed"
880
  msgstr ""
881
 
882
- #: includes/admin-metaboxes.php:436
883
- msgid "No feed URL defined yet"
884
  msgstr ""
885
 
886
- #: includes/admin-metaboxes.php:466
887
  msgid "Active"
888
  msgstr ""
889
 
890
- #: includes/admin-metaboxes.php:591
891
- msgid "Need help?"
892
  msgstr ""
893
 
894
- #: includes/admin-metaboxes.php:593
895
- msgid "Check out the support forum"
896
  msgstr ""
897
 
898
- #: includes/admin-metaboxes.php:596
899
- msgid "Suggest a new feature"
900
  msgstr ""
901
 
902
- #: includes/admin-metaboxes.php:609
903
- msgid "Give it a 5 star rating on WordPress.org"
904
  msgstr ""
905
 
906
- #: includes/admin-metaboxes.php:610
907
- msgid "Donate a token of your appreciation"
908
  msgstr ""
909
 
910
- #: includes/admin-metaboxes.php:614
911
- msgid "Check out the Premium Extensions:"
912
  msgstr ""
913
 
914
- #: includes/admin-metaboxes.php:635
915
  msgid "Follow WP Mayor on Twitter."
916
  msgstr ""
917
 
918
- #: includes/admin-metaboxes.php:636
919
  msgid "Like WP Mayor on Facebook."
920
  msgstr ""
921
 
922
- #: includes/admin-options.php:56
923
- msgid "General plugin settings"
924
  msgstr ""
925
 
926
- #: includes/admin-options.php:57
927
- msgid "General display settings"
928
  msgstr ""
929
 
930
- #: includes/admin-options.php:58
931
- msgid "Source display settings"
932
  msgstr ""
933
 
934
- #: includes/admin-options.php:59
935
- msgid "Date display settings"
936
  msgstr ""
937
 
938
- #: includes/admin-options.php:60
939
- msgid "Styles"
940
  msgstr ""
941
 
942
- #: includes/admin-options.php:70
943
- msgid "Limit feed items by age"
944
  msgstr ""
945
 
946
- #: includes/admin-options.php:74
947
- msgid "Limit feed items stored"
948
  msgstr ""
949
 
950
- #: includes/admin-options.php:78
951
- msgid "Limit feed items per feed"
952
  msgstr ""
953
 
954
- #: includes/admin-options.php:82
955
- msgid "Feed processing interval"
956
  msgstr ""
957
 
958
- #: includes/admin-options.php:86
959
- msgid "Custom feed URL"
960
  msgstr ""
961
 
962
- #: includes/admin-options.php:90
963
- msgid "Custom feed Title"
964
  msgstr ""
965
 
966
- #: includes/admin-options.php:94
967
- msgid "Custom feed limit"
968
  msgstr ""
969
 
970
- #: includes/admin-options.php:98
971
- msgid "Anonymous tracking"
972
  msgstr ""
973
 
974
- #: includes/admin-options.php:106
975
- msgid "Link title"
976
  msgstr ""
977
 
978
- #: includes/admin-options.php:110
979
- msgid "Title maximum length"
980
  msgstr ""
981
 
982
- #: includes/admin-options.php:118
983
- msgid "Show authors"
984
  msgstr ""
985
 
986
- #: includes/admin-options.php:122
987
- msgid "For video feed items use"
988
  msgstr ""
989
 
990
- #: includes/admin-options.php:126
991
- msgid "Pagination type"
 
 
992
  msgstr ""
993
 
994
- #: includes/admin-options.php:130
995
- msgid "Feed display limit"
996
  msgstr ""
997
 
998
- #: includes/admin-options.php:134
999
- msgid "Open links behaviour"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1000
  msgstr ""
1001
 
1002
- #: includes/admin-options.php:138
1003
- msgid "Set links as nofollow"
1004
  msgstr ""
1005
 
1006
- #: includes/admin-options.php:146
1007
- msgid "Show source"
1008
  msgstr ""
1009
 
1010
- #: includes/admin-options.php:150
1011
- msgid "Text preceding source"
1012
  msgstr ""
1013
 
1014
- #: includes/admin-options.php:154
1015
- msgid "Link source"
 
1016
  msgstr ""
1017
 
1018
- #: includes/admin-options.php:162
1019
- msgid "Show date"
1020
  msgstr ""
1021
 
1022
- #: includes/admin-options.php:166
1023
- msgid "Text preceding date"
1024
  msgstr ""
1025
 
1026
- #: includes/admin-options.php:170
1027
- msgid "Date format"
1028
  msgstr ""
1029
 
1030
- #: includes/admin-options.php:174
1031
- msgid "Time ago format"
 
 
 
 
1032
  msgstr ""
1033
 
1034
- #: includes/admin-options.php:181
1035
- msgid "Disable Styles"
1036
  msgstr ""
1037
 
1038
- #: includes/admin-options.php:343 includes/admin.php:41
1039
- msgid "WP RSS Aggregator Settings"
1040
  msgstr ""
1041
 
1042
- #: includes/admin-options.php:353
1043
- msgid "General"
1044
  msgstr ""
1045
 
1046
- #: includes/admin-options.php:357
1047
- msgid "Licenses"
1048
  msgstr ""
1049
 
1050
- #: includes/admin-options.php:397
1051
- msgid "Save Settings"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1052
  msgstr ""
1053
 
1054
- #: includes/admin-options.php:411
1055
- msgid "These are the general settings for WP RSS Aggregator."
 
1056
  msgstr ""
1057
 
1058
- #: includes/admin-options.php:420
1059
  msgid ""
1060
- "In this section you can find some general options that control how the feed "
1061
- "items are displayed."
 
1062
  msgstr ""
1063
 
1064
- #: includes/admin-options.php:430
1065
- msgid "Options that control how the feed item's source is displayed."
 
 
1066
  msgstr ""
1067
 
1068
- #: includes/admin-options.php:439
1069
- msgid "Options that control how the feed item's date is displayed."
1070
  msgstr ""
1071
 
1072
- #: includes/admin-options.php:448
1073
  msgid ""
1074
- "If you would like to disable all styles used in this plugin, tick the "
1075
- "checkbox."
 
 
1076
  msgstr ""
1077
 
1078
- #: includes/admin-options.php:457
1079
- msgid "Set your security reset code, in case of any errors."
 
 
1080
  msgstr ""
1081
 
1082
- #: includes/admin-options.php:466
1083
- msgid "Participate in helping us make the plugin better."
 
 
1084
  msgstr ""
1085
 
1086
- #: includes/admin-options.php:493
1087
- msgid "Original page link"
 
 
 
1088
  msgstr ""
1089
 
1090
- #: includes/admin-options.php:494
1091
- msgid "Embedded video player link"
 
 
 
1092
  msgstr ""
1093
 
1094
- #: includes/admin-options.php:508
1095
- msgid "This will not affect already imported feed items."
1096
  msgstr ""
1097
 
1098
- #: includes/admin-options.php:523
1099
- msgid "Lightbox"
1100
  msgstr ""
1101
 
1102
- #: includes/admin-options.php:524 includes/update.php:195
1103
- msgid "New window"
 
 
 
1104
  msgstr ""
1105
 
1106
- #: includes/admin-options.php:525
1107
- msgid "Self"
 
1108
  msgstr ""
1109
 
1110
- #: includes/admin-options.php:563
1111
- msgid "PHP Date Format Reference"
1112
  msgstr ""
1113
 
1114
- #: includes/admin-options.php:591 includes/admin-options.php:702
1115
- msgid "No limit"
1116
  msgstr ""
1117
 
1118
- #: includes/admin-options.php:673
1119
- msgid "\"Older posts\" and \"Newer posts\" links"
1120
  msgstr ""
1121
 
1122
- #: includes/admin-options.php:674
1123
- msgid "Page numbers with \"Next\" and \"Previous\" page links"
1124
  msgstr ""
1125
 
1126
- #: includes/admin-options.php:736
1127
- msgid "No Limit"
1128
  msgstr ""
1129
 
1130
- #: includes/admin-options.php:835
1131
- msgid "Generate Random Code"
1132
  msgstr ""
1133
 
1134
- #: includes/admin-options.php:840
1135
- msgid ""
1136
- "Enter the code to use to securely reset the plugin and deactivate it. Be "
1137
- "sure to save this code somewhere safe."
1138
  msgstr ""
1139
 
1140
- #: includes/admin-options.php:846
 
 
 
 
 
 
 
 
1141
  msgid ""
1142
- "Leave this empty to disable the secure reset function.<br/>\n"
1143
- " You use this code by adding any of the following to any URL on "
1144
- "your site."
 
 
 
 
1145
  msgstr ""
1146
 
1147
- #: includes/admin-options.php:849
1148
- msgid "Resets your WP RSS Aggregator settings"
1149
  msgstr ""
1150
 
1151
- #: includes/admin-options.php:850
1152
- msgid "Deactivates WP RSS Aggregator"
1153
  msgstr ""
1154
 
1155
- #: includes/admin-options.php:851
1156
- msgid "Does both of the above"
1157
  msgstr ""
1158
 
1159
- #: includes/admin-options.php:855
1160
- msgid ""
1161
- "Use the above actions only when absolutely necessary, or when instructed to "
1162
- "by support staff."
1163
  msgstr ""
1164
 
1165
- #: includes/admin-options.php:871
1166
- msgid ""
1167
- "Please help us improve WP RSS Aggregator by allowing us to gather anonymous "
1168
- "usage statistics. No sensitive data is collected."
1169
  msgstr ""
1170
 
1171
- #: includes/admin-options.php:926
1172
- msgid "now"
1173
  msgstr ""
1174
 
1175
- #: includes/admin-statistics.php:149
1176
- msgid "<b>WP RSS Aggregator:</b> Data report sent!"
1177
  msgstr ""
1178
 
1179
- #: includes/admin-welcome.php:32
1180
- #, php-format
1181
- msgid "Welcome to WP RSS Aggregator %1$s!"
1182
  msgstr ""
1183
 
1184
- #: includes/admin-welcome.php:34
1185
- msgid "Thank you for upgrading to the latest version!"
1186
  msgstr ""
1187
 
1188
- #: includes/admin-welcome.php:42
1189
- msgid "What's New?"
1190
  msgstr ""
1191
 
1192
- #: includes/admin-welcome.php:66
1193
- msgid "Bulk Adding Feed Sources"
1194
  msgstr ""
1195
 
1196
- #: includes/admin-welcome.php:69
1197
- #, php-format
1198
- msgid ""
1199
- "The new bulk adding option saves you time by allowing you to enter your feed "
1200
- "names and URLs all at once.\n"
1201
- "\t\t\t\t\t\t\t\t\t\tSimply type in or paste your feed sources, and with the "
1202
- "press of a button, your feed sources will instantly be created!\n"
1203
- "\t\t\t\t\t\t\t\t\t\tTry it now from the <a href=\"%1$s\">Import &amp; "
1204
- "Export</a> page."
1205
  msgstr ""
1206
 
1207
- #: includes/admin-welcome.php:74
1208
- msgid "Feed Item Blacklist"
 
 
 
1209
  msgstr ""
1210
 
1211
- #: includes/admin-welcome.php:78
1212
- msgid "Trash undesired items"
 
 
 
 
1213
  msgstr ""
1214
 
1215
- #: includes/admin-welcome.php:79
1216
  msgid ""
1217
- "Did a feed import an item that you do not wish to keep? Up till now, "
1218
- "<strong>WP RSS Aggregator</strong>only allowed you to trash the item and "
1219
- "keep it in your trash."
1220
  msgstr ""
1221
 
1222
- #: includes/admin-welcome.php:84
1223
- msgid "Blacklist Trashed Items"
 
 
 
1224
  msgstr ""
1225
 
1226
- #: includes/admin-welcome.php:85
1227
  msgid ""
1228
- "Permanently deleting the item will cause it to be re-imported. Using the new "
1229
- "<strong>Delete Permanently &amp; Blacklist</strong> option, the feed item is "
1230
- "deleted and added to the <strong>Blacklist</strong>."
1231
  msgstr ""
1232
 
1233
- #: includes/admin-welcome.php:91
1234
- msgid "The Blacklist"
 
 
 
1235
  msgstr ""
1236
 
1237
- #: includes/admin-welcome.php:92
1238
  msgid ""
1239
- "This is your list of unwanted feed item links. Any item in this list will be "
1240
- "ignored by <strong>WP RSS Aggregator</strong> in the future, meaning it "
1241
- "won't be imported from any of your feed sources.and added to the "
1242
- "<strong>Blacklist</strong>."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1243
  msgstr ""
1244
 
1245
- #: includes/admin-welcome.php:100
1246
- msgid "Check out our add-ons:"
1247
  msgstr ""
1248
 
1249
- #: includes/admin-welcome.php:104
1250
- msgid "Excerpts &amp; Thumbnails"
1251
  msgstr ""
1252
 
1253
- #: includes/admin-welcome.php:111
 
1254
  #, php-format
 
 
 
 
 
 
 
 
 
1255
  msgid ""
1256
- "More information about add-ons can be found on our website <a href=\"%1$s\">"
1257
- "%2$s</a>"
1258
  msgstr ""
1259
 
1260
- #: includes/admin-welcome.php:117
1261
- #, php-format
1262
- msgid "Changelog for v%1$s"
1263
  msgstr ""
1264
 
1265
- #: includes/admin-welcome.php:123
 
 
 
 
1266
  #, php-format
1267
- msgid ""
1268
- "Need functionality not already available in core or the add-ons? You can <a "
1269
- "href=\"%1$s\">suggest new features</a>!"
1270
  msgstr ""
1271
 
1272
- #: includes/admin-welcome.php:134
1273
- msgid ""
1274
- "Fetch RSS feed excerpts to your blog and add thumbnails! Perfect for adding "
1275
- "some life and color to your feeds."
 
 
 
 
 
 
1276
  msgstr ""
1277
 
1278
- #: includes/admin-welcome.php:144
 
 
 
 
 
 
 
 
1279
  msgid ""
1280
- "Organize your feeds into custom categories. Filter feed items by category "
1281
- "and make custom WordPress feeds for specific categories."
 
 
 
 
 
 
 
 
1282
  msgstr ""
1283
 
1284
- #: includes/admin-welcome.php:154
1285
  msgid ""
1286
- "Import and store feeds that contain specific keywords in either the title or "
1287
- "their content. Control what gets imported to your blog."
 
 
 
 
1288
  msgstr ""
1289
 
1290
- #: includes/admin-welcome.php:164
1291
- msgid "Go to WP RSS Aggregator settings"
1292
  msgstr ""
1293
 
1294
- #: includes/admin.php:40
1295
- msgid "Export & Import Settings"
1296
  msgstr ""
1297
 
1298
- #: includes/admin.php:40
1299
- msgid "Import & Export"
1300
  msgstr ""
1301
 
1302
- #: includes/admin.php:41 includes/admin.php:111
1303
- msgid "Settings"
1304
  msgstr ""
1305
 
1306
- #: includes/admin.php:94
1307
- msgid "Name this feed (e.g. WP Mayor)"
1308
  msgstr ""
1309
 
1310
- #: includes/admin.php:139
1311
- #, php-format
1312
  msgid ""
1313
- "<b>WP RSS Aggregator</b>: There are saved licenses that have not yet been "
1314
- "activated. Go to the <a href=\"%1$s\">License page</a> to activate them."
 
1315
  msgstr ""
1316
 
1317
- #: includes/cpt-feeds.php:82
1318
  #, php-format
1319
- msgid "%1$s &raquo; %2$s Feed"
 
 
 
 
1320
  msgstr ""
1321
 
1322
- #: includes/cpt-feeds.php:83
1323
- #, php-format
1324
- msgid "<link rel=\"%1$s\" type=\"%2$s\" title=\"%3$s\" href=\"%4$s\" />\n"
1325
  msgstr ""
1326
 
1327
- #: includes/cron-jobs.php:64
1328
- msgid "Once every five minutes"
1329
  msgstr ""
1330
 
1331
- #: includes/cron-jobs.php:68
1332
- msgid "Once every ten minutes"
 
 
 
1333
  msgstr ""
1334
 
1335
- #: includes/cron-jobs.php:72
1336
- msgid "Once every fifteen minutes"
 
 
1337
  msgstr ""
1338
 
1339
- #: includes/cron-jobs.php:76
1340
- msgid "Once every thirty minutes"
 
 
 
 
1341
  msgstr ""
1342
 
1343
- #: includes/cron-jobs.php:80
1344
- msgid "Once every two hours"
1345
  msgstr ""
1346
 
1347
- #: includes/custom-post-types.php:22
1348
- msgid "Feed Source"
 
1349
  msgstr ""
1350
 
1351
- #: includes/custom-post-types.php:23
1352
- msgid "Add New"
 
 
1353
  msgstr ""
1354
 
1355
- #: includes/custom-post-types.php:25
1356
- msgid "Add New Feed Source"
1357
  msgstr ""
1358
 
1359
- #: includes/custom-post-types.php:26
1360
- msgid "Edit Feed Source"
1361
  msgstr ""
1362
 
1363
- #: includes/custom-post-types.php:27
1364
- msgid "New Feed Source"
1365
  msgstr ""
1366
 
1367
- #: includes/custom-post-types.php:28
1368
- msgid "View Feed Source"
1369
  msgstr ""
1370
 
1371
- #: includes/custom-post-types.php:29
1372
- msgid "Search Feeds"
1373
  msgstr ""
1374
 
1375
- #: includes/custom-post-types.php:30
1376
- msgid "No Feed Sources Found"
1377
  msgstr ""
1378
 
1379
- #: includes/custom-post-types.php:31
1380
- msgid "No Feed Sources Found In Trash"
1381
  msgstr ""
1382
 
1383
- #: includes/custom-post-types.php:32
1384
- msgid "RSS Aggregator"
1385
  msgstr ""
1386
 
1387
- #: includes/custom-post-types.php:72 includes/custom-post-types.php:74
1388
- msgid "Feed Items"
1389
  msgstr ""
1390
 
1391
- #: includes/custom-post-types.php:73
1392
- msgid "Feed Item"
1393
  msgstr ""
1394
 
1395
- #: includes/custom-post-types.php:75
1396
- msgid "View Feed Items"
1397
  msgstr ""
1398
 
1399
- #: includes/custom-post-types.php:76
1400
- msgid "Search Feed Items"
1401
  msgstr ""
1402
 
1403
- #: includes/custom-post-types.php:77
1404
- msgid "No Feed Items Found"
1405
  msgstr ""
1406
 
1407
- #: includes/custom-post-types.php:78
1408
- msgid "No Feed Items Found In Trash"
1409
  msgstr ""
1410
 
1411
- #: includes/feed-blacklist.php:129
1412
- msgid "The item you are trying to blacklist does not exist"
1413
  msgstr ""
1414
 
1415
- #: includes/feed-blacklist.php:134
1416
- msgid "The item you are trying to blacklist is not valid!"
1417
  msgstr ""
1418
 
1419
- #: includes/feed-blacklist.php:196 includes/feed-blacklist.php:197
1420
- #: includes/feed-blacklist.php:198
1421
- msgid "Blacklist"
1422
  msgstr ""
1423
 
1424
- #: includes/feed-blacklist.php:199
1425
- msgid "Search Blacklist"
1426
  msgstr ""
1427
 
1428
- #: includes/feed-blacklist.php:200
1429
- msgid "You do not have any items blacklisted yet!"
1430
  msgstr ""
1431
 
1432
- #: includes/feed-blacklist.php:242
1433
- msgid "Delete Permanently & Blacklist"
1434
  msgstr ""
1435
 
1436
- #: includes/feed-blacklist.php:248
1437
- msgid ""
1438
- "The item will be deleted permanently, and its permalink will be recorded in "
1439
- "the blacklist"
1440
  msgstr ""
1441
 
1442
- #: includes/feed-blacklist.php:261
1443
- msgid "Remove from blacklist"
 
 
 
1444
  msgstr ""
1445
 
1446
- #: includes/feed-blacklist.php:321 includes/opml-importer.php:195
1447
- #: includes/opml-importer.php:226
1448
- msgid "Title"
1449
  msgstr ""
1450
 
1451
- #: includes/feed-display.php:355
1452
- msgid "No feed items found."
1453
  msgstr ""
1454
 
1455
- #: includes/feed-display.php:405
1456
- msgid "Older posts"
1457
  msgstr ""
1458
 
1459
- #: includes/feed-display.php:406
1460
- msgid "Newer posts"
1461
  msgstr ""
1462
 
1463
- #: includes/feed-importing.php:265
1464
- #, php-format
1465
- msgid "Failed to fetch the RSS feed. Error: %s"
1466
  msgstr ""
1467
 
1468
- #: includes/feed-importing.php:654
1469
- #, php-format
1470
  msgid ""
1471
- "The PHP script timed out while importing an item from this feed, after %d "
1472
- "seconds."
1473
  msgstr ""
1474
 
1475
- #: includes/feed-states.php:110
1476
- msgid "The feed sources have been activated!"
1477
  msgstr ""
1478
 
1479
- #: includes/feed-states.php:124
1480
- msgid "The feed sources have been paused!!"
1481
  msgstr ""
1482
 
1483
- #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:154
1484
- #, php-format
1485
- msgid ""
1486
- "There is a new version of %1$s available. <a target=\"_blank\" class="
1487
- "\"thickbox\" href=\"%2$s\">View version %3$s details</a>."
1488
  msgstr ""
1489
 
1490
- #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:161
1491
- #, php-format
1492
- msgid ""
1493
- "There is a new version of %1$s available. <a target=\"_blank\" class="
1494
- "\"thickbox\" href=\"%2$s\">View version %3$s details</a> or <a href=\"%4$s"
1495
- "\">update now</a>."
1496
  msgstr ""
1497
 
1498
- #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:301
1499
- msgid "You do not have permission to install plugin updates"
 
 
1500
  msgstr ""
1501
 
1502
- #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:301
1503
- msgid "Error"
1504
  msgstr ""
1505
 
1506
- #: includes/licensing.php:282
1507
- #, php-format
1508
  msgid ""
1509
- "Remember to <a href=\"%s\">enter your plugin license code</a> for the WP RSS "
1510
- "Aggregator <b>%s</b> add-on to benefit from updates and support."
1511
  msgstr ""
1512
 
1513
- #: includes/licensing.php:308
1514
- #, php-format
1515
- msgid ""
1516
- "<a href=\"%s\">Save 30%% on your license renewal</a> for the WP RSS "
1517
- "Aggregator <b>%s</b> add-on and continue receiving updates and support."
1518
  msgstr ""
1519
 
1520
- #: includes/licensing.php:343 includes/licensing.php:429
1521
- msgid "No addon ID"
1522
  msgstr ""
1523
 
1524
- #: includes/licensing.php:351 includes/licensing.php:393
1525
- msgid "Invalid event specified"
1526
  msgstr ""
1527
 
1528
- #: includes/licensing.php:354
1529
- msgid "No event specified"
1530
  msgstr ""
1531
 
1532
- #: includes/licensing.php:361
1533
- msgid "No license"
1534
  msgstr ""
1535
 
1536
- #: includes/licensing.php:370
1537
- msgid "Bad nonce"
1538
  msgstr ""
1539
 
1540
- #: includes/licensing.php:373
1541
- msgid "No nonce"
1542
  msgstr ""
1543
 
1544
- #: includes/licensing.php:469
1545
- msgid "License"
1546
  msgstr ""
1547
 
1548
- #: includes/licensing.php:476
1549
- msgid "License Key"
1550
  msgstr ""
1551
 
1552
- #: includes/licensing.php:485
1553
- msgid "Activate License"
1554
  msgstr ""
1555
 
1556
- #: includes/licensing.php:519
1557
- msgid "Enter your license key"
1558
  msgstr ""
1559
 
1560
- #: includes/licensing.php:544
1561
- msgid "Status"
1562
  msgstr ""
1563
 
1564
- #: includes/licensing.php:575
1565
  msgid ""
1566
- "No activations left. Click here to manage the sites you've activated "
1567
- "licenses on."
1568
  msgstr ""
1569
 
1570
- #: includes/licensing.php:580
1571
- msgid "Renew your license to continue receiving updates and support."
 
 
1572
  msgstr ""
1573
 
1574
- #: includes/licensing.php:583
1575
- msgid "Activations"
1576
  msgstr ""
1577
 
1578
- #: includes/licensing.php:586
1579
- msgid "Expires on"
1580
  msgstr ""
1581
 
1582
- #: includes/licensing.php:589
1583
- msgid "Registered to"
1584
  msgstr ""
1585
 
1586
- #: includes/licensing.php:594
1587
- msgid ""
1588
- "Failed to get license information. This is a temporary problem. Check your "
1589
- "internet connection and try again later."
1590
  msgstr ""
1591
 
1592
- #: includes/misc-functions.php:269
1593
- msgid "&hellip;"
1594
  msgstr ""
1595
 
1596
- #: includes/opml-importer.php:65
1597
- msgid "Import OPML"
1598
  msgstr ""
1599
 
1600
- #: includes/opml-importer.php:75
1601
- msgid "Howdy! Import your feeds here from an OPML (.xml) export file."
1602
  msgstr ""
1603
 
1604
- #: includes/opml-importer.php:76
1605
- msgid "Click the button below, choose your file, and click 'Upload'."
1606
  msgstr ""
1607
 
1608
- #: includes/opml-importer.php:77
1609
- msgid "We will take care of the rest."
1610
  msgstr ""
1611
 
1612
- #: includes/opml-importer.php:108
1613
- msgid "Sorry, an error has been encountered."
1614
  msgstr ""
1615
 
1616
- #: includes/opml-importer.php:113
1617
- msgid "Sorry, it seems your uploaded file has been misplaced!"
1618
  msgstr ""
1619
 
1620
- #: includes/opml-importer.php:114
1621
- msgid "The uploaded file could not be found at "
1622
  msgstr ""
1623
 
1624
- #: includes/opml-importer.php:115
1625
- msgid "It is likely that this was caused by a permissions problem."
1626
  msgstr ""
1627
 
1628
- #: includes/opml-importer.php:187
1629
- msgid "Feeds were imported successfully!"
1630
  msgstr ""
1631
 
1632
- #: includes/opml-importer.php:194 includes/opml-importer.php:225
1633
- msgid "ID"
1634
  msgstr ""
1635
 
1636
- #: includes/opml-importer.php:257
1637
- msgid "WP RSS OPML"
1638
  msgstr ""
1639
 
1640
- #: includes/opml-importer.php:258
1641
- msgid "Import Feeds from an OPML file into WP RSS Aggregator"
1642
  msgstr ""
1643
 
1644
- #: includes/scripts.php:31 includes/scripts.php:54
1645
- msgid "Please wait ..."
1646
  msgstr ""
1647
 
1648
- #: includes/scripts.php:52
1649
- msgid "Failed to import"
1650
  msgstr ""
1651
 
1652
- #: includes/scripts.php:53
1653
- msgid "Items are importing"
1654
  msgstr ""
1655
 
1656
- #: includes/scripts.php:55
1657
- msgid "Bulk Add"
1658
  msgstr ""
1659
 
1660
- #: includes/scripts.php:56
1661
- msgid "OK"
 
 
1662
  msgstr ""
1663
 
1664
- #: includes/scripts.php:57
1665
- msgid "Cancel"
1666
  msgstr ""
1667
 
1668
- #: includes/scripts.php:58
 
 
 
 
1669
  msgid ""
1670
- "The feed items listed here will be disregarded when importing new items from "
1671
- "your feed sources."
1672
  msgstr ""
1673
 
1674
- #: includes/scripts.php:59
1675
- msgid "Remove selected from Blacklist"
1676
  msgstr ""
1677
 
1678
- #: includes/scripts.php:72
1679
- msgid "Activate"
 
 
1680
  msgstr ""
1681
 
1682
- #: includes/scripts.php:73
1683
- msgid "Pause"
1684
  msgstr ""
1685
 
1686
- #: includes/scripts.php:101
1687
- msgid "Activating..."
1688
  msgstr ""
1689
 
1690
- #: includes/scripts.php:102
1691
- msgid "Deactivating..."
 
 
 
 
 
 
 
1692
  msgstr ""
1693
 
1694
- #: includes/system-info.php:27
1695
- msgid "System Information"
 
 
 
 
 
 
1696
  msgstr ""
1697
 
1698
- #: includes/system-info.php:33
1699
  msgid ""
1700
- "To copy the system info, click below then press Ctrl + C (PC) or Cmd + C "
1701
- "(Mac)."
 
 
1702
  msgstr ""
1703
 
1704
- #: includes/system-info.php:79
1705
- msgid "Your server supports fsockopen."
1706
  msgstr ""
1707
 
1708
- #: includes/system-info.php:79
1709
- msgid "Your server does not support fsockopen."
1710
  msgstr ""
1711
 
1712
- #: includes/system-info.php:152
1713
- msgid "Download System Info File"
1714
  msgstr ""
1715
 
1716
- #: includes/update.php:67
1717
- msgid "No Follow"
1718
  msgstr ""
1719
 
1720
- #: includes/update.php:69
1721
- msgid "Follow"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1722
  msgstr ""
1723
 
1724
- #: wp-rss-aggregator.php:263
1725
- msgid "Help improve WP RSS Aggregator"
1726
  msgstr ""
1727
 
1728
- #: wp-rss-aggregator.php:263
1729
  msgid ""
1730
- "You've just installed WP RSS Aggregator. Please helps us improve it by "
1731
- "allowing us to gather anonymous usage stats so we know which configurations, "
1732
- "plugins and themes to test with."
1733
  msgstr ""
1734
 
1735
- #: wp-rss-aggregator.php:270
1736
- msgid "Do not allow tracking"
1737
  msgstr ""
1738
 
1739
- #: wp-rss-aggregator.php:271
1740
- msgid "Allow tracking"
1741
  msgstr ""
1742
 
1743
- #: wp-rss-aggregator.php:397
1744
- msgid "This plugin requires WordPress version 3.3 or higher."
1745
  msgstr ""
1
  msgid ""
2
  msgstr ""
3
+ "Project-Id-Version: WP RSS Aggregator\n"
4
+ "POT-Creation-Date: 2020-01-20 11:05+0100\n"
5
+ "PO-Revision-Date: 2020-01-20 11:06+0100\n"
6
  "Last-Translator: \n"
7
+ "Language-Team: RebelCode\n"
8
+ "Language: en_US\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 2.2.4\n"
13
+ "X-Poedit-Basepath: ..\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-Flags-xgettext: --add-comments=translators:\n"
16
+ "X-Poedit-WPHeader: wp-rss-aggregator.php\n"
17
+ "X-Poedit-SourceCharset: UTF-8\n"
18
+ "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
19
+ "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
20
+ "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
21
  "X-Poedit-SearchPath-0: .\n"
22
+ "X-Poedit-SearchPathExcluded-0: vendor\n"
23
+ "X-Poedit-SearchPathExcluded-1: node_modules\n"
24
+ "X-Poedit-SearchPathExcluded-2: js\n"
25
+ "X-Poedit-SearchPathExcluded-3: css\n"
26
+ "X-Poedit-SearchPathExcluded-4: fonts\n"
27
+ "X-Poedit-SearchPathExcluded-5: webpack\n"
28
+ "X-Poedit-SearchPathExcluded-6: test\n"
29
+
30
+ #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:93
31
+ msgid "No nonce"
32
  msgstr ""
33
 
34
+ #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:98
35
+ msgid "Bad nonce"
36
  msgstr ""
37
 
38
+ #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:102
39
+ #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:156
40
+ msgid "No addon ID"
 
 
41
  msgstr ""
42
 
43
+ #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:103
44
+ msgid "No event specified"
45
  msgstr ""
46
 
47
+ #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:104
48
+ msgid "No license"
 
 
49
  msgstr ""
50
 
51
+ #: includes/Aventura/Wprss/Core/Licensing/AjaxController.php:130
52
+ msgid "Invalid event specified"
53
  msgstr ""
54
 
55
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:176
56
+ msgid "License"
 
 
 
57
  msgstr ""
58
 
59
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:183
60
+ msgid "License Key"
61
  msgstr ""
62
 
63
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:192
64
+ msgid "Activate License"
 
 
 
65
  msgstr ""
66
 
67
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:221
68
+ msgid "Enter your license key"
69
  msgstr ""
70
 
71
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:307
72
+ msgid "Status"
 
 
73
  msgstr ""
74
 
75
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:335
76
+ msgid "never"
77
  msgstr ""
78
 
79
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:343
80
  msgid ""
81
+ "No activations left. Click here to manage the sites you've activated "
82
+ "licenses on."
 
83
  msgstr ""
84
 
85
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:348
86
+ msgid "Renew your license to continue receiving updates and support."
87
  msgstr ""
88
 
89
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:351
90
+ msgid "Activations"
 
 
91
  msgstr ""
92
 
93
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:355
94
+ msgid "Expires"
 
 
 
95
  msgstr ""
96
 
97
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:359
98
+ msgid "Registered to"
99
  msgstr ""
100
 
101
+ #: includes/Aventura/Wprss/Core/Licensing/Settings.php:364
102
+ msgid ""
103
+ "Failed to get license information. This is a temporary problem. Check your "
104
+ "internet connection and try again later."
105
  msgstr ""
106
 
107
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:137
108
  msgid ""
109
  "Did you know that you can get more RSS features? Excerpts, thumbnails, "
110
  "keyword filtering, importing into posts and more... "
111
  msgstr ""
112
 
113
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:159
114
+ msgid ""
115
+ "The feed items for this feed source are being deleted in the background."
116
  msgstr ""
117
 
118
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:185
119
+ #, php-format
120
+ msgid "Successfully imported <code>%1$s</code> feed sources."
121
  msgstr ""
122
 
123
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:210
124
+ msgid "Your settings were imported successfully"
125
  msgstr ""
126
 
127
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:233
128
+ msgid "Invalid file or file size too big."
129
  msgstr ""
130
 
131
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:255
132
+ msgid "Feeds are being updated in the background."
133
  msgstr ""
134
 
135
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:277
136
+ msgid "Feeds deleted and are being re-imported in the background."
137
  msgstr ""
138
 
139
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:299
140
+ msgid "The error log has been cleared."
 
 
141
  msgstr ""
142
 
143
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:321
144
+ #: src/Modules/ResetToolModule.php:101
145
+ msgid "The plugin settings have been reset to default."
146
  msgstr ""
147
 
148
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:342
149
+ msgid "The item was deleted successfully and added to the blacklist."
 
 
150
  msgstr ""
151
 
152
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:365
153
+ msgid "The feed sources have been activated!"
154
  msgstr ""
155
 
156
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:388
157
+ msgid "The feed sources have been paused!"
158
  msgstr ""
159
 
160
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:427
161
+ #, php-format
162
  msgid ""
163
+ "Remember to <a href=\"%1$s\">enter your license key</a> for the <strong>WP "
164
+ "RSS Aggregator - %2$s</strong> add-on to benefit from updates and support."
165
  msgstr ""
166
 
167
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:471
168
+ #, php-format
169
  msgid ""
170
+ "The license key for the <strong>WP RSS Aggregator - %2$s</strong> add-on is "
171
+ "saved but not activated. In order to benefit from updates and support, it "
172
+ "must be <a href=\"%1$s\">activated</a>."
173
  msgstr ""
174
 
175
+ #: includes/Aventura/Wprss/Core/Model/AdminAjaxNotice/ServiceProvider.php:518
176
+ #, php-format
177
+ msgid ""
178
+ "The license for the <strong>WP RSS Aggregator - %2$s</strong> add-on is "
179
+ "about to expire. <a href=\"%1$s\">Please renew it</a> to keep receiving "
180
+ "updates and benefit from support."
181
  msgstr ""
182
 
183
+ #: includes/Aventura/Wprss/Core/Model/BulkSourceImport/AbstractImporter.php:119
184
+ msgid "A source must have at least two data members"
185
  msgstr ""
186
 
187
+ #: includes/Aventura/Wprss/Core/Model/BulkSourceImport/AbstractImporter.php:123
188
+ msgid "Source title is missing"
189
  msgstr ""
190
 
191
+ #: includes/Aventura/Wprss/Core/Model/BulkSourceImport/AbstractImporter.php:127
192
+ msgid "Source title must not be empty"
 
 
193
  msgstr ""
194
 
195
+ #: includes/Aventura/Wprss/Core/Model/BulkSourceImport/AbstractImporter.php:131
196
+ msgid "Source URL is missing"
197
  msgstr ""
198
 
199
+ #: includes/Aventura/Wprss/Core/Model/BulkSourceImport/AbstractImporter.php:135
200
+ msgid "Source URL must not be empty"
201
  msgstr ""
202
 
203
+ #: includes/Aventura/Wprss/Core/Model/BulkSourceImport/AbstractImporter.php:153
204
+ msgid "Feed source representation is invalid"
205
  msgstr ""
206
 
207
+ #: includes/Aventura/Wprss/Core/Plugin.php:74
208
+ msgid "Getting Started"
209
  msgstr ""
210
 
211
+ #: includes/Aventura/Wprss/Core/Plugin.php:78
212
+ msgid "Extensions"
213
  msgstr ""
214
 
215
+ #: includes/OPML.php:42
216
+ msgid ""
217
+ "An error occurred: The file might not be a valid OPML file or is corrupt. "
218
  msgstr ""
219
 
220
+ #: includes/admin-ajax-notice.php:492
221
+ msgid "Dismiss this notification"
222
  msgstr ""
223
 
224
+ #: includes/admin-display.php:38
225
+ msgid "State"
226
  msgstr ""
227
 
228
+ #: includes/admin-display.php:41 includes/admin-display.php:281
229
+ #: src/Ui/BlacklistTable.php:73
230
+ msgid "Name"
231
  msgstr ""
232
 
233
+ #: includes/admin-display.php:46
234
  msgid "Updates"
235
  msgstr ""
236
 
237
+ #: includes/admin-display.php:64
238
+ msgid "Activate or pause auto importing for this feed"
239
+ msgstr ""
240
+
241
+ #: includes/admin-display.php:81
242
+ msgid "Normal RSS Feed"
243
+ msgstr ""
244
+
245
+ #: includes/admin-display.php:86
246
+ msgid "YouTube Feed"
247
  msgstr ""
248
 
249
+ #: includes/admin-display.php:114 includes/admin-heartbeat.php:58
250
  msgid "None"
251
  msgstr ""
252
 
253
+ #: includes/admin-display.php:116 includes/admin-heartbeat.php:55
254
+ msgid "..."
 
255
  msgstr ""
256
 
257
+ #: includes/admin-display.php:124
258
+ msgid "Next update in"
259
  msgstr ""
260
 
261
+ #: includes/admin-display.php:133
262
+ msgctxt "Example: \"Updated 2 days ago\""
263
+ msgid "Updated"
264
  msgstr ""
265
 
266
+ #: includes/admin-display.php:135 includes/legacy-feed-display.php:188
267
  #, php-format
268
  msgid "%1$s ago"
269
  msgstr ""
270
 
271
+ #: includes/admin-display.php:139
272
+ msgctxt "Example: \"15 new\""
273
+ msgid "items"
274
+ msgstr ""
275
+
276
+ #: includes/admin-display.php:152
277
  msgid ""
278
+ "This feed source experienced an error during the last feed fetch or "
279
+ "validation check. Re-check the feed source URL or check the Error Log in the "
280
+ "Debugging page for more details."
281
  msgstr ""
282
 
283
+ #: includes/admin-display.php:165
284
+ msgid "View the imported items for this feed source"
285
+ msgstr ""
286
+
287
+ #: includes/admin-display.php:168
288
+ msgid "items"
289
+ msgstr ""
290
+
291
+ #: includes/admin-display.php:180
292
+ msgid "Fetch"
293
+ msgstr ""
294
+
295
+ #: includes/admin-display.php:189
296
+ msgid "Delete items"
297
  msgstr ""
298
 
299
+ #: includes/admin-display.php:282
300
  msgid "Permalink"
301
  msgstr ""
302
 
303
+ #: includes/admin-display.php:283
304
  msgid "Date published"
305
  msgstr ""
306
 
307
+ #: includes/admin-display.php:284
308
  msgid "Source"
309
  msgstr ""
310
 
311
+ #: includes/admin-display.php:373
312
  msgid "Feed source updated. "
313
  msgstr ""
314
 
315
+ #: includes/admin-display.php:374
316
  msgid "Custom field updated."
317
  msgstr ""
318
 
319
+ #: includes/admin-display.php:375
320
  msgid "Custom field deleted."
321
  msgstr ""
322
 
323
+ #: includes/admin-display.php:376 includes/admin-display.php:382
324
  msgid "Feed source updated."
325
  msgstr ""
326
 
327
+ #: includes/admin-display.php:378 includes/admin-display.php:379
328
  msgid "Feed source saved."
329
  msgstr ""
330
 
331
+ #: includes/admin-display.php:380
332
  msgid "Feed source submitted."
333
  msgstr ""
334
 
335
+ #: includes/admin-display.php:409
336
  #, php-format
337
  msgid "ID: %1$s"
338
  msgstr ""
339
 
340
+ #: includes/admin-display.php:481
341
+ msgid "Could not schedule fetch: source ID must be specified"
 
 
 
 
342
  msgstr ""
343
 
344
+ #: includes/admin-display.php:519 includes/admin-display.php:568
345
+ msgid "Failed to schedule cron"
346
  msgstr ""
347
 
348
+ #: includes/admin-display.php:550 includes/admin-display.php:601
349
+ msgid "Source ID was not specified"
350
  msgstr ""
351
 
352
+ #: includes/admin-display.php:698
353
  msgid "Publish Feed"
354
  msgstr ""
355
 
356
+ #: includes/admin-editor.php:117
357
  msgid ""
358
+ "To select more than one feed source, click and drag with your mouse pointer "
359
+ "or click individual feed sources while holding down the Ctrl (Windows) or "
360
+ "Command (Mac) key."
361
  msgstr ""
362
 
363
+ #: includes/admin-editor.php:127 src/Modules/FeedTemplatesModule.php:131
364
+ msgid "Template"
 
365
  msgstr ""
366
 
367
+ #: includes/admin-editor.php:136
368
+ msgid "Sources"
369
+ msgstr ""
370
+
371
+ #: includes/admin-editor.php:141
372
  msgid "All feed sources"
373
  msgstr ""
374
 
375
+ #: includes/admin-editor.php:149
376
+ msgid "Exclude"
377
+ msgstr ""
378
+
379
+ #: includes/admin-editor.php:154
380
+ msgid "You may choose to exclude some feed sources:"
381
+ msgstr ""
382
+
383
+ #: includes/admin-editor.php:159
384
+ msgid "Choose which feed sources to show:"
385
+ msgstr ""
386
+
387
+ #: includes/admin-editor.php:181
388
+ msgid "Number of items"
389
  msgstr ""
390
 
391
+ #: includes/admin-editor.php:186 includes/admin-editor.php:197
392
+ #: includes/admin-editor.php:215
393
+ msgid "Use template setting"
394
  msgstr ""
395
 
396
+ #: includes/admin-editor.php:193
397
+ msgid "Pagination"
398
  msgstr ""
399
 
400
+ #: includes/admin-editor.php:198
401
+ msgid "Enabled"
402
  msgstr ""
403
 
404
+ #: includes/admin-editor.php:199
405
+ msgid "Disabled"
406
  msgstr ""
407
 
408
+ #: includes/admin-editor.php:203
409
+ msgid "Choose whether to show or hide pagination controls"
410
+ msgstr ""
411
+
412
+ #: includes/admin-editor.php:210
413
+ msgid "Starting page"
414
+ msgstr ""
415
+
416
+ #: includes/admin-editor.php:227
417
  msgid "Add shortcode"
418
  msgstr ""
419
 
420
+ #: includes/admin-heartbeat.php:66
421
+ msgctxt "Next update: now"
422
+ msgid "now"
423
+ msgstr ""
424
+
425
+ #: includes/admin-help-metaboxes.php:17
426
  msgid ""
427
  "The URL of the feed source. In most cases, the URL of the site will also "
428
  "work, but for best results we recommend trying to find the URL of the RSS "
429
  "feed.\n"
430
  "\n"
431
+ "Also include the <code>http://</code> or <code>https://</code> prefix in the "
432
+ "URL."
433
  msgstr ""
434
 
435
+ #: includes/admin-help-metaboxes.php:21
436
  msgid ""
437
  "The maximum number of imported items from this feed to keep stored.\n"
438
  "\n"
439
+ "When new items are imported and the limit is exceeded, the oldest feed items "
440
+ "will be deleted to make room for new ones.\n"
441
+ "\n"
442
+ "If you already have items imported from this feed source, setting this "
443
+ "option now may delete some of your items, in order to comply with the limit."
444
+ msgstr ""
445
+
446
+ #: includes/admin-help-metaboxes.php:27
447
+ msgid ""
448
+ "Tick this box to make imported items link to their enclosure, rather than to "
449
+ "the original article.\n"
450
+ "\n"
451
+ "Enclosures are typically links to attachments, such as images, audio, "
452
+ "videos, documents or flash content.\n"
453
+ "\n"
454
+ "If you are not sure, leave this option unticked"
455
+ msgstr ""
456
+
457
+ #: includes/admin-help-metaboxes.php:33
458
+ msgid ""
459
+ "Whether to allow multiple feed items to have the same title. When checked, "
460
+ "if a feed item has the same title as a previously-imported feed item, it "
461
+ "will not be imported.\n"
462
+ "\n"
463
+ "This can be useful in cases where permalinks change, or where multiple "
464
+ "permalinks refer to the same item."
465
+ msgstr ""
466
+
467
+ #: includes/admin-help-metaboxes.php:37
468
+ msgid ""
469
+ "Enable this option to link the feed source name to the RSS feed's source "
470
+ "site.\n"
471
  "\n"
472
+ "Selecting \"Default\" will cause the value chosen in the general Source "
473
+ "Display Settings to be used.\n"
474
+ "\n"
475
+ "This option only applies when using the shortcode to output feed items."
476
  msgstr ""
477
 
478
+ #: includes/admin-help-metaboxes.php:43
479
  msgid ""
480
+ "Tick this box to get the site name and URL from the RSS feed, for each item "
481
+ "individually.\n"
482
  "\n"
483
+ "This option is useful when importing from aggregated RSS feeds that have "
484
+ "items from different sources.\n"
 
485
  "\n"
486
+ "If the RSS feed does not provide source information for its items, the name "
487
+ "and URL that you have given for the feed source will be used instead."
488
  msgstr ""
489
 
490
+ #: includes/admin-help-metaboxes.php:55
491
  msgid ""
492
  "State of the feed, active or paused.\n"
493
  "\n"
494
+ "If active, the feed source will fetch items periodically, according to the "
495
+ "settings below.\n"
496
  "\n"
497
+ "If paused, the feed source will not fetch feed items periodically."
 
498
  msgstr ""
499
 
500
+ #: includes/admin-help-metaboxes.php:61
501
  msgid ""
502
  "You can set a time, in UTC, in the future when the feed source will become "
503
  "active, if it is paused.\n"
504
  "\n"
505
+ "Leave blank to activate immediately."
506
  msgstr ""
507
 
508
+ #: includes/admin-help-metaboxes.php:65
509
  msgid ""
510
  "You can set a time, in UTC, in the future when the feed source will become "
511
  "paused, if it is active.\n"
512
  "\n"
513
+ "Leave blank to never pause."
514
  msgstr ""
515
 
516
+ #: includes/admin-help-metaboxes.php:69
517
  msgid ""
518
  "How frequently the feed source should check for new items and fetch if "
519
  "needed.\n"
520
  "\n"
521
+ "If left as <em>Default</em>, the interval in the global settings is used."
 
522
  msgstr ""
523
 
524
+ #: includes/admin-help-metaboxes.php:73
525
  msgid ""
526
  "The maximum age allowed for feed items. Very useful if you are only "
527
  "concerned with, say, last week's news.\n"
528
  "\n"
529
+ "Items already imported will be deleted if they eventually exceed this age "
530
+ "limit.\n"
531
  "\n"
532
+ "Also, items in the RSS feed that are already older than this age will not be "
533
+ "imported at all.\n"
534
  "\n"
535
+ "Leave empty to use the <em>Limit feed items by age</em> option in the "
536
+ "general settings."
537
  msgstr ""
538
 
539
+ #: includes/admin-help-metaboxes.php:86
540
  msgid ""
541
  "Use this option if you are seeing an <q>Invalid feed URL</q> error in the "
542
  "Feed Preview above, but you are sure that the URL is correct.\n"
543
  "\n"
544
+ "Note, however, that this will disable auto-discovery, meaning that the given "
545
+ "URL must be an RSS feed URL. Using the site's URL will not work."
 
546
  msgstr ""
547
 
548
+ #: includes/admin-help-settings.php:16
549
  msgid ""
550
  "The maximum age allowed for feed items.\n"
551
+ "<hr/>\n"
552
  "\n"
553
+ "Items already imported will be deleted if they eventually exceed this age "
554
+ "limit.\n"
555
  "\n"
556
+ "Also, items in the RSS feed that are already older than this age will not be "
557
+ "imported at all.\n"
558
+ "<hr/>\n"
559
  "\n"
560
+ "<em>Leave empty for no limit.</em>"
 
561
  msgstr ""
562
 
563
+ #: includes/admin-help-settings.php:26
564
  msgid ""
565
  "The maximum number of imported items to keep stored, for feed sources that "
566
  "do not have their own limit.\n"
567
+ "<hr/>\n"
568
+ "\n"
569
+ "When new items are imported and the limit for a feed source is exceeded, the "
570
+ "oldest feed items for that feed source will be deleted to make room for the "
571
+ "new ones.\n"
572
+ "\n"
573
+ "If you already have items imported from this feed source, setting this "
574
+ "option now may delete some of your items, in order to comply with the "
575
+ "limit.\n"
576
+ "<hr/>\n"
577
+ "\n"
578
+ "<em>Use 0 or leave empty for no limit.</em>"
579
+ msgstr ""
580
+
581
+ #: includes/admin-help-settings.php:36
582
+ msgid ""
583
+ "The maximum amount of items to process per import.\n"
584
+ "<hr />\n"
585
+ "\n"
586
+ "Will not process more than this amount of items every time the feed source "
587
+ "updates, regardless of other settings.\n"
588
+ "The frequency of updates is determined by the feed processing interval.\n"
589
+ "<hr />\n"
590
+ "\n"
591
+ "<em>Leave empty for no limit.</em>"
592
+ msgstr ""
593
+
594
+ #: includes/admin-help-settings.php:46
595
+ msgid ""
596
+ "The order in which feed items will be imported.\n"
597
+ "<hr />\n"
598
  "\n"
599
+ "<strong>Latest items first</strong> will import the most recent items in the "
600
+ "feed first.\n"
601
+ "<strong>Oldest items first</strong> will import the oldest items in the feed "
602
+ "first.\n"
603
+ "<strong>Original feed order</strong> only works well on PHP7 or later.\n"
604
  "\n"
605
+ "This setting is very useful in combination with the per-import limit.\n"
606
+ "<hr />\n"
607
+ "\n"
608
+ "Default: <em>Latest items first</em>"
609
+ msgstr ""
610
+
611
+ #: includes/admin-help-settings.php:59
612
+ msgid ""
613
+ "If ticked, items with future dates will be scheduled to be published later. "
614
+ "Leave unticked to always publish items immediately.\n"
615
+ " <hr/>\n"
616
+ " Default: <em>Off</em>"
617
  msgstr ""
618
 
619
+ #: includes/admin-help-settings.php:64
620
  msgid ""
621
  "How frequently should the feed sources (that do not have their own update "
622
  "interval) check for updates and fetch items accordingly.\n"
623
  "\n"
624
+ "It is recommended to not have more than 20 feed sources that use this global "
625
+ "update interval. Having too many feed sources updating precisely at the same "
626
+ "time can cause the WP Cron System to crash."
 
627
  msgstr ""
628
 
629
+ #: includes/admin-help-settings.php:68
630
  msgid ""
631
+ "Whether to allow multiple feed items to have the same title. When checked, "
632
+ "if a feed item has the same title as a previously-imported feed item from "
633
+ "any feed source, it will not be imported.\n"
634
+ "\n"
635
+ "This can be useful in cases where permalinks change, or where multiple "
636
+ "permalinks refer to the same item.\n"
637
+ "\n"
638
+ "Since this feature requires checking every post title, WordPress installs "
639
+ "with a significant amount of posts may notice a slight slowdown of the post "
640
+ "import process."
641
+ msgstr ""
642
+
643
+ #: includes/admin-help-settings.php:74
644
+ msgid ""
645
+ "The URL of the custom feed, located at <code>https://yoursite.com/[custom "
646
  "feed url]</code>.\n"
647
+ "<hr/>\n"
648
  "\n"
649
+ "WP RSS Aggregator allows you to create a custom RSS feed, that contains all "
650
+ "of your imported feed items. This setting allows you to change the URL of "
651
+ "this custom feed.\n"
652
  "\n"
653
+ "<hr/>\n"
654
  "\n"
655
+ "<strong>Note:</strong> You may be required to refresh you Permalinks after "
656
+ "you change this setting, by going to <em>Settings <i class=\"fa fa-angle-"
657
+ "right\"></i> Permalinks</e> and clicking <em>Save</em>."
 
658
  msgstr ""
659
 
660
+ #: includes/admin-help-settings.php:83
661
  msgid ""
662
  "The title of the custom feed.\n"
663
  "\n"
664
+ "This title will be included in the RSS source of the custom feed, in a "
665
+ "<code>&lt;title&gt;</code> tag."
666
  msgstr ""
667
 
668
+ #: includes/admin-help-settings.php:87
669
  msgid "The maximum number of feed items in the custom feed."
670
  msgstr ""
671
 
672
+ #: includes/admin-help-settings.php:93 src/Modules/FeedTemplatesModule.php:467
673
  msgid ""
674
  "Check this box to make the feed item titles link to the original article."
675
  msgstr ""
676
 
677
+ #: includes/admin-help-settings.php:95
678
  msgid ""
679
  "Set the maximum number of characters to show for feed item titles.\n"
680
+ "<hr/>\n"
681
  "\n"
682
+ "<em>Leave empty for no limit.</em>"
 
683
  msgstr ""
684
 
685
+ #: includes/admin-help-settings.php:100 src/Modules/FeedTemplatesModule.php:473
686
  msgid ""
687
  "Check this box to show the author for each feed item, if it is available."
688
  msgstr ""
689
 
690
+ #: includes/admin-help-settings.php:102
691
  msgid ""
692
  "For feed items from YouTube, Vimeo or Dailymotion, you can choose whether "
693
  "you want to have the items link to the original page link, or a link to the "
694
  "embedded video player only."
695
  msgstr ""
696
 
697
+ #: includes/admin-help-settings.php:104
698
  msgid ""
699
  "The type of pagination to use when showing feed items on multiple pages.\n"
700
  "\n"
701
+ "The first shows two links, \"Older\" and \"Newer\", which allow you to "
702
+ "navigate through the pages.\n"
703
  "\n"
704
+ "The second shows links for all the pages, together with links for the next "
705
+ "and previous pages."
706
  msgstr ""
707
 
708
+ #: includes/admin-help-settings.php:110
709
  msgid ""
710
  "The maximum number of feed items to display when using the shortcode.\n"
711
  "\n"
712
+ "This enables pagination if set to a number smaller than the number of items "
713
+ "to be displayed."
714
  msgstr ""
715
 
716
+ #: includes/admin-help-settings.php:114 src/Modules/FeedTemplatesModule.php:479
717
  msgid ""
718
  "Choose how you want links to be opened. This applies to the feed item title "
719
  "and the source link."
720
  msgstr ""
721
 
722
+ #: includes/admin-help-settings.php:116
723
  msgid ""
724
  "Enable this option to set all links displayed as \"NoFollow\".\n"
725
+ "<hr/>\n"
726
  "\n"
727
+ "\"Nofollow\" provides a way to tell search engines to <em>not</em> follow "
728
+ "certain links, such as links to feed items in this case."
 
729
  msgstr ""
730
 
731
+ #: includes/admin-help-settings.php:125 src/Modules/FeedTemplatesModule.php:470
732
  msgid "Enable this option to show the feed source name for each feed item."
733
  msgstr ""
734
 
735
+ #: includes/admin-help-settings.php:127 src/Modules/FeedTemplatesModule.php:471
736
  msgid ""
737
  "Enter the text that you want to show before the source name. A space is "
738
  "automatically added between this text and the feed source name."
739
  msgstr ""
740
 
741
+ #: includes/admin-help-settings.php:129 src/Modules/FeedTemplatesModule.php:472
742
  msgid ""
743
  "Enable this option to link the feed source name to the RSS feed's source "
744
  "site."
745
  msgstr ""
746
 
747
+ #: includes/admin-help-settings.php:135 src/Modules/FeedTemplatesModule.php:475
748
  msgid "Enable this to show the feed item's date."
749
  msgstr ""
750
 
751
+ #: includes/admin-help-settings.php:137 src/Modules/FeedTemplatesModule.php:476
752
  msgid ""
753
  "Enter the text that you want to show before the feed item date. A space is "
754
  "automatically added between this text and the date."
755
  msgstr ""
756
 
757
+ #: includes/admin-help-settings.php:139 src/Modules/FeedTemplatesModule.php:477
758
  msgid "The format to use for the feed item dates, as a PHP date format."
759
  msgstr ""
760
 
761
+ #: includes/admin-help-settings.php:141
762
  msgid ""
763
  "Enable this option to show the elapsed time from the feed item's date and "
764
  "time to the present time.\n"
765
+ "<em>Eg. 2 hours ago</em>"
766
  msgstr ""
767
 
768
+ #: includes/admin-help-settings.php:148
769
  msgid ""
770
  "Check this box to disable all plugin styles used for displaying feed items.\n"
771
  "\n"
772
+ "This will allow you to provide your own custom CSS styles for displaying the "
773
+ "feed items."
774
+ msgstr ""
775
+
776
+ #: includes/admin-help-settings.php:157
777
+ msgid ""
778
+ "Path to the file containing one or more certificates.\n"
779
+ "\n"
780
+ "These will be used to verify certificates over secure connection, such as "
781
+ "when fetching a remote resource over HTTPS.\n"
782
+ "\n"
783
+ "Relative path will be relative to the WordPress root.\n"
784
+ "\n"
785
+ "<strong>Default:</strong> path to certificate file bundled with WordPress."
786
+ msgstr ""
787
+
788
+ #: includes/admin-help-settings.php:166
789
+ msgid ""
790
+ "The string to be used as the useragent for feed requests.\n"
791
+ "\n"
792
+ "If non-empty, this exact string will be sent with every request made by WP "
793
+ "RSS Aggregator for a feed source XML document.\n"
794
+ "\n"
795
+ "Some servers react in unexpected ways to the default value. In such cases, "
796
+ "try changing this to something else.\n"
797
+ "\n"
798
+ "The default value is the useragent that the Chrome Browser uses."
799
+ msgstr ""
800
+
801
+ #: includes/admin-help-settings.php:173
802
+ msgid ""
803
+ "Tick this box to enable caching for a small performance gain.\n"
804
+ "\n"
805
+ "When enabled, websites may ignore the plugin if their RSS feed did not "
806
+ "change. So we suggest testing it out first to ensure that your RSS feeds "
807
+ "work well with this option enabled.\n"
808
+ "\n"
809
+ "If you encounter problems or weird behavior, we suggest turning this option "
810
+ "off."
811
  msgstr ""
812
 
813
+ #: includes/admin-help.php:25 includes/admin.php:32
814
  msgid "Help & Support"
815
  msgstr ""
816
 
817
+ #: includes/admin-help.php:27
818
+ msgid "Knowledge Base"
819
  msgstr ""
820
 
821
+ #: includes/admin-help.php:31
822
+ #, php-format
823
  msgid ""
824
+ "In the <a href=\"%s\">WP RSS Aggregator knowledge base</a> you will find "
825
+ "comprehensive details and tutorials on how to use the core plugin and all "
826
+ "the add-ons.\n"
827
+ "\n"
828
+ "\t\t\t\t\t\t\tThere are also some videos to help you make a quick start to "
829
+ "setting up and enjoying this plugin."
830
  msgstr ""
831
 
832
+ #: includes/admin-help.php:40
833
  msgid "Frequently Asked Questions (FAQ)"
834
  msgstr ""
835
 
836
+ #: includes/admin-help.php:44
837
+ #, php-format
838
  msgid ""
839
+ "If after going through the knowledge base you still have questions, please "
840
+ "take a look at the <a href=\"%s\">FAQ section</a>. We set this up purposely "
841
+ "to answer the most commonly asked questions from our users."
 
842
  msgstr ""
843
 
844
+ #: includes/admin-help.php:59
845
+ msgid "Built-in Help Beacon"
846
  msgstr ""
847
 
848
+ #: includes/admin-help.php:62
849
  msgid ""
850
+ "The help beacon is an interactive button that appears on the bottom-right "
851
+ "section of WP RSS Aggregator admin pages."
 
852
  msgstr ""
853
 
854
+ #: includes/admin-help.php:63
855
+ msgid ""
856
+ "It provides access to our documentation and (if you have a valid license for "
857
+ "any of our add-ons) you can also contact our support team directly."
858
  msgstr ""
859
 
860
+ #: includes/admin-help.php:66
861
  msgid ""
862
+ "The beacon tracks what pages you were on before clicking it. This helps it "
863
+ "provide relevant help results and also helps the support team better "
864
+ "understand the problem you are facing."
 
865
  msgstr ""
866
 
867
+ #: includes/admin-help.php:67
868
  msgid ""
869
+ "The beacon only works on WP RSS Aggregator admin pages and does not track "
870
+ "your mouse clicks and keyboard input."
871
  msgstr ""
872
 
873
+ #: includes/admin-help.php:70
874
+ msgid "The support beacon is currently <b>enabled</b>."
 
875
  msgstr ""
876
 
877
+ #: includes/admin-help.php:72
878
+ msgid "Disable support beacon"
879
  msgstr ""
880
 
881
+ #: includes/admin-help.php:75
882
+ msgid ""
883
+ "By enabling the help beacon, you are consenting to this data collection."
884
  msgstr ""
885
 
886
+ #: includes/admin-help.php:77
887
+ msgid "Enable support beacon"
888
  msgstr ""
889
 
890
+ #: includes/admin-help.php:108
891
+ msgid "Premium Support"
892
  msgstr ""
893
 
894
+ #: includes/admin-help.php:111
895
+ #, php-format
896
  msgid ""
897
+ "Contact us <a href=\"%s\" target=\"%s=\">here</a> for pre-sales and premium "
898
+ "support."
899
  msgstr ""
900
 
901
+ #: includes/admin-help.php:168
902
+ msgid "Email Support"
903
  msgstr ""
904
 
905
+ #: includes/admin-help.php:169
906
+ msgid ""
907
+ "If you still can't find an answer to your query after reading the "
908
+ "documentation and going through the FAQ, just fill out the support request "
909
+ "form below. We'll be happy to help you out."
910
  msgstr ""
911
 
912
+ #: includes/admin-help.php:176
913
+ msgid "From: "
914
  msgstr ""
915
 
916
+ #: includes/admin-help.php:181
917
+ msgid "Replies will be sent to this email address."
918
  msgstr ""
919
 
920
+ #: includes/admin-help.php:190
921
+ msgid "Attachments"
922
  msgstr ""
923
 
924
+ #: includes/admin-help.php:193
925
+ msgid "WP RSS Aggregator log file"
 
 
926
  msgstr ""
927
 
928
+ #: includes/admin-help.php:196
929
+ msgid "WordPress debugging information"
 
 
930
  msgstr ""
931
 
932
+ #: includes/admin-help.php:201
933
+ msgid "Send Message"
934
  msgstr ""
935
 
936
+ #: includes/admin-help.php:214
937
+ msgid "Support Forums"
938
  msgstr ""
939
 
940
+ #: includes/admin-help.php:217
941
+ #, php-format
942
  msgid ""
943
+ "Users of the free version of WP RSS Aggregator can ask questions on the <a "
944
+ "href=\"%s\">support forum</a>."
945
  msgstr ""
946
 
947
+ #: includes/admin-help.php:253
948
+ #, php-format
949
+ msgid ""
950
+ "There was an error sending the form. Please use the <a href=\"%s\" target="
951
+ "\"_blank\">contact form on our site.</a>"
952
  msgstr ""
953
 
954
+ #: includes/admin-help.php:283
955
  #, php-format
956
  msgid ""
957
+ "Please fill out all the fields in the form, including the <strong>%s</"
958
+ "strong> field."
 
959
  msgstr ""
960
 
961
+ #: includes/admin-help.php:291
962
+ msgid "Please enter a valid email address."
963
+ msgstr ""
964
+
965
+ #: includes/admin-help.php:1078
966
  msgid ""
967
+ "Could not enqueue tooltip content: the queue method is not a valid callable."
968
+ msgstr ""
969
+
970
+ #: includes/admin-intro-page.php:28 includes/admin-intro-page.php:29
971
+ msgid "Welcome to WP RSS Aggregator"
972
  msgstr ""
973
 
974
+ #: includes/admin-intro-page.php:93
975
  #, php-format
976
+ msgid "Missing intro step param \"%s\""
977
+ msgstr ""
978
+
979
+ #: includes/admin-intro-page.php:120
980
+ msgid "Missing feed URL parameter"
981
+ msgstr ""
982
+
983
+ #: includes/admin-intro-page.php:125
984
+ msgid "The given feed URL is invalid"
985
+ msgstr ""
986
+
987
+ #: includes/admin-intro-page.php:196
988
+ msgid "Failed to retrieve items"
989
+ msgstr ""
990
+
991
+ #: includes/admin-intro-page.php:279
992
+ #, php-format
993
+ msgid "Failed to import the feed source \"%s\" with URL \"%s\""
994
  msgstr ""
995
 
996
+ #: includes/admin-intro-page.php:373
997
+ msgctxt "default name of shortcode page"
998
+ msgid "Feeds"
999
  msgstr ""
1000
 
1001
+ #: includes/admin-metaboxes.php:12
1002
  msgid "Save Feed Source"
1003
  msgstr ""
1004
 
1005
+ #: includes/admin-metaboxes.php:31
1006
  msgid "Feed Preview"
1007
  msgstr ""
1008
 
1009
+ #: includes/admin-metaboxes.php:40
1010
  msgid "Feed Processing"
1011
  msgstr ""
1012
 
1013
+ #: includes/admin-metaboxes.php:50
1014
+ msgid "Share The Love"
1015
  msgstr ""
1016
 
1017
+ #: includes/admin-metaboxes.php:60
1018
  msgid "Feed Source Details"
1019
  msgstr ""
1020
 
1021
+ #: includes/admin-metaboxes.php:93 includes/opml-importer.php:196
1022
+ #: includes/opml-importer.php:227 src/Ui/BlacklistTable.php:74
1023
  msgid "URL"
1024
  msgstr ""
1025
 
1026
+ #: includes/admin-metaboxes.php:101
1027
  msgid "Limit"
1028
  msgstr ""
1029
 
1030
+ #: includes/admin-metaboxes.php:107
1031
  msgid "Link to enclosure"
1032
  msgstr ""
1033
 
1034
+ #: includes/admin-metaboxes.php:113 includes/admin-options.php:136
1035
+ msgid "Unique titles only"
1036
+ msgstr ""
1037
+
1038
+ #: includes/admin-metaboxes.php:120 includes/admin-options-legacy.php:70
1039
+ msgid "Link source"
1040
+ msgstr ""
1041
+
1042
+ #: includes/admin-metaboxes.php:127
1043
+ msgid "Use source info"
1044
+ msgstr ""
1045
+
1046
+ #: includes/admin-metaboxes.php:267 includes/admin-metaboxes.php:557
1047
+ #: includes/admin-metaboxes.php:653 includes/admin-options.php:565
1048
+ #: includes/admin-options.php:694 includes/admin-options.php:801
1049
+ #: includes/feed-access.php:263 src/Modules/FeedTemplatesModule.php:391
1050
  msgid "Default"
1051
  msgstr ""
1052
 
1053
+ #: includes/admin-metaboxes.php:292
1054
+ msgid "Updating feed source"
1055
+ msgstr ""
1056
+
1057
+ #: includes/admin-metaboxes.php:451
1058
  #, php-format
1059
  msgid "Latest %1$s feed items out of %2$s available from %3$s"
1060
  msgstr ""
1061
 
1062
+ #: includes/admin-metaboxes.php:460 includes/scripts.php:56
1063
  msgid "ago"
1064
  msgstr ""
1065
 
1066
+ #: includes/admin-metaboxes.php:462
1067
  msgid "No Date"
1068
  msgstr ""
1069
 
1070
+ #: includes/admin-metaboxes.php:484
1071
  msgid ""
1072
  "<strong>Invalid feed URL</strong> - Double check the feed source URL setting "
1073
  "above."
1074
  msgstr ""
1075
 
1076
+ #: includes/admin-metaboxes.php:488
1077
  #, php-format
1078
  msgid ""
1079
  "Not sure where to find the RSS feed on a website? <a target=\"_blank\" href="
1080
  "\"%1$s\">Click here</a> for a visual guide. "
1081
  msgstr ""
1082
 
1083
+ #: includes/admin-metaboxes.php:493
1084
+ msgid "No feed URL defined yet"
1085
  msgstr ""
1086
 
1087
+ #: includes/admin-metaboxes.php:518
1088
+ msgid "Force the feed"
1089
  msgstr ""
1090
 
1091
+ #: includes/admin-metaboxes.php:552
1092
  msgid "Active"
1093
  msgstr ""
1094
 
1095
+ #: includes/admin-metaboxes.php:553
1096
+ msgid "Paused"
1097
  msgstr ""
1098
 
1099
+ #: includes/admin-metaboxes.php:650
1100
+ msgid "Limit items by age:"
1101
  msgstr ""
1102
 
1103
+ #: includes/admin-metaboxes.php:684
1104
+ msgid "Need help?"
1105
  msgstr ""
1106
 
1107
+ #: includes/admin-metaboxes.php:686
1108
+ msgid "Check out the support forum"
1109
  msgstr ""
1110
 
1111
+ #: includes/admin-metaboxes.php:689
1112
+ msgid "Suggest a new feature"
1113
  msgstr ""
1114
 
1115
+ #: includes/admin-metaboxes.php:703
1116
+ msgid "Give it a 5 star rating on WordPress.org"
1117
  msgstr ""
1118
 
1119
+ #: includes/admin-metaboxes.php:719
1120
  msgid "Follow WP Mayor on Twitter."
1121
  msgstr ""
1122
 
1123
+ #: includes/admin-metaboxes.php:720
1124
  msgid "Like WP Mayor on Facebook."
1125
  msgstr ""
1126
 
1127
+ #: includes/admin-options-legacy.php:21
1128
+ msgid "Display settings"
1129
  msgstr ""
1130
 
1131
+ #: includes/admin-options-legacy.php:24
1132
+ msgid "Link title"
1133
  msgstr ""
1134
 
1135
+ #: includes/admin-options-legacy.php:28
1136
+ msgid "Title maximum length"
1137
  msgstr ""
1138
 
1139
+ #: includes/admin-options-legacy.php:32
1140
+ msgid "Show authors"
1141
  msgstr ""
1142
 
1143
+ #: includes/admin-options-legacy.php:36
1144
+ msgid "For video feed items use"
1145
  msgstr ""
1146
 
1147
+ #: includes/admin-options-legacy.php:40
1148
+ msgid "Pagination type"
1149
  msgstr ""
1150
 
1151
+ #: includes/admin-options-legacy.php:44
1152
+ msgid "Feed display limit"
1153
  msgstr ""
1154
 
1155
+ #: includes/admin-options-legacy.php:48
1156
+ msgid "Open links behaviour"
1157
  msgstr ""
1158
 
1159
+ #: includes/admin-options-legacy.php:52
1160
+ msgid "Set links as nofollow"
1161
  msgstr ""
1162
 
1163
+ #: includes/admin-options-legacy.php:59
1164
+ msgid "Source Display settings"
1165
  msgstr ""
1166
 
1167
+ #: includes/admin-options-legacy.php:62
1168
+ msgid "Show source"
1169
  msgstr ""
1170
 
1171
+ #: includes/admin-options-legacy.php:66
1172
+ msgid "Text preceding source"
1173
  msgstr ""
1174
 
1175
+ #: includes/admin-options-legacy.php:77
1176
+ msgid "Date Display settings"
1177
  msgstr ""
1178
 
1179
+ #: includes/admin-options-legacy.php:80
1180
+ msgid "Show date"
1181
  msgstr ""
1182
 
1183
+ #: includes/admin-options-legacy.php:84
1184
+ msgid "Text preceding date"
1185
  msgstr ""
1186
 
1187
+ #: includes/admin-options-legacy.php:88
1188
+ msgid "Date format"
1189
  msgstr ""
1190
 
1191
+ #: includes/admin-options-legacy.php:92
1192
+ msgid "Time ago format"
1193
  msgstr ""
1194
 
1195
+ #: includes/admin-options-legacy.php:110
1196
+ msgid ""
1197
+ "In this section you can find some general options that control how the feed "
1198
+ "items are displayed."
1199
  msgstr ""
1200
 
1201
+ #: includes/admin-options-legacy.php:123
1202
+ msgid "Options that control how the feed item's source is displayed."
1203
  msgstr ""
1204
 
1205
+ #: includes/admin-options-legacy.php:136
1206
+ msgid "Options that control how the feed item's date is displayed."
1207
+ msgstr ""
1208
+
1209
+ #: includes/admin-options-legacy.php:177 includes/admin-options.php:430
1210
+ msgid "No limit"
1211
+ msgstr ""
1212
+
1213
+ #: includes/admin-options-legacy.php:215
1214
+ #: src/Modules/FeedTemplatesModule.php:536
1215
+ msgid "Original page link"
1216
+ msgstr ""
1217
+
1218
+ #: includes/admin-options-legacy.php:216
1219
+ #: src/Modules/FeedTemplatesModule.php:537
1220
+ msgid "Embedded video player link"
1221
+ msgstr ""
1222
+
1223
+ #: includes/admin-options-legacy.php:224
1224
+ msgid "This will not affect already imported feed items."
1225
+ msgstr ""
1226
+
1227
+ #: includes/admin-options-legacy.php:239
1228
+ msgid "\"Older posts\" and \"Newer posts\" links"
1229
+ msgstr ""
1230
+
1231
+ #: includes/admin-options-legacy.php:240
1232
+ msgid "Page numbers with \"Next\" and \"Previous\" page links"
1233
+ msgstr ""
1234
+
1235
+ #: includes/admin-options-legacy.php:273 includes/update.php:133
1236
+ msgid "Lightbox"
1237
+ msgstr ""
1238
+
1239
+ #: includes/admin-options-legacy.php:274 includes/update.php:131
1240
+ msgid "New window"
1241
+ msgstr ""
1242
+
1243
+ #: includes/admin-options-legacy.php:275 includes/update.php:135
1244
+ msgid "Self"
1245
+ msgstr ""
1246
+
1247
+ #: includes/admin-options-legacy.php:421
1248
+ msgid "PHP Date Format Reference"
1249
+ msgstr ""
1250
+
1251
+ #: includes/admin-options.php:45 includes/admin.php:28
1252
+ msgid "WP RSS Aggregator Settings"
1253
+ msgstr ""
1254
+
1255
+ #: includes/admin-options.php:55
1256
+ msgid "General"
1257
+ msgstr ""
1258
+
1259
+ #: includes/admin-options.php:59
1260
+ msgid "Custom Feed"
1261
+ msgstr ""
1262
+
1263
+ #: includes/admin-options.php:67
1264
+ msgid "Advanced"
1265
+ msgstr ""
1266
+
1267
+ #: includes/admin-options.php:73
1268
+ msgid "Licenses"
1269
+ msgstr ""
1270
+
1271
+ #: includes/admin-options.php:116
1272
+ msgid "Save Settings"
1273
+ msgstr ""
1274
+
1275
+ #: includes/admin-options.php:132
1276
+ msgid "Update interval"
1277
+ msgstr ""
1278
+
1279
+ #: includes/admin-options.php:140
1280
+ msgid "Import order"
1281
+ msgstr ""
1282
+
1283
+ #: includes/admin-options.php:144
1284
+ msgid "Limit items by age"
1285
+ msgstr ""
1286
+
1287
+ #: includes/admin-options.php:148
1288
+ msgid "Limit feed items stored per feed"
1289
+ msgstr ""
1290
+
1291
+ #: includes/admin-options.php:152
1292
+ msgid "Limit feed items stored"
1293
+ msgstr ""
1294
+
1295
+ #: includes/admin-options.php:156
1296
+ msgid "Limit feed items per import"
1297
+ msgstr ""
1298
+
1299
+ #: includes/admin-options.php:160
1300
+ msgid "Schedule future items"
1301
+ msgstr ""
1302
+
1303
+ #: includes/admin-options.php:167
1304
+ msgid "Custom feed URL"
1305
+ msgstr ""
1306
+
1307
+ #: includes/admin-options.php:171
1308
+ msgid "Custom feed title"
1309
+ msgstr ""
1310
+
1311
+ #: includes/admin-options.php:175
1312
+ msgid "Custom feed limit"
1313
+ msgstr ""
1314
+
1315
+ #: includes/admin-options.php:188
1316
+ msgid "Disable Styles"
1317
+ msgstr ""
1318
+
1319
+ #: includes/admin-options.php:219 templates/admin/tools/import.twig:1
1320
+ #: templates/admin/tools/import.twig:13
1321
+ msgid "Import Settings"
1322
+ msgstr ""
1323
+
1324
+ #: includes/admin-options.php:230
1325
+ msgid "Custom RSS Feed"
1326
+ msgstr ""
1327
+
1328
+ #: includes/admin-options.php:240
1329
+ msgid "Advanced Settings"
1330
+ msgstr ""
1331
+
1332
+ #: includes/admin-options.php:244
1333
+ msgid "Styles"
1334
+ msgstr ""
1335
+
1336
+ #: includes/admin-options.php:385
1337
+ msgid "Configure how WP RSS Aggregator imports RSS feed items."
1338
+ msgstr ""
1339
+
1340
+ #: includes/admin-options.php:395
1341
+ msgid ""
1342
+ "WP RSS Aggregator creates a custom RSS feed on your site that includes all "
1343
+ "of your imported items. Use the below options to set it up."
1344
+ msgstr ""
1345
+
1346
+ #: includes/admin-options.php:404
1347
+ msgid "Only change these options if you know what you are doing!"
1348
+ msgstr ""
1349
+
1350
+ #: includes/admin-options.php:413
1351
+ msgid ""
1352
+ "If you would like to disable all styles used in this plugin, tick the "
1353
+ "checkbox."
1354
+ msgstr ""
1355
+
1356
+ #: includes/admin-options.php:464 includes/admin-options.php:594
1357
+ msgid "No Limit"
1358
+ msgstr ""
1359
+
1360
+ #: includes/admin-options.php:541
1361
+ msgid "Open custom feed"
1362
+ msgstr ""
1363
+
1364
+ #: includes/admin-options.php:629
1365
+ msgid "Latest items first"
1366
+ msgstr ""
1367
+
1368
+ #: includes/admin-options.php:630
1369
+ msgid "Oldest items first"
1370
+ msgstr ""
1371
+
1372
+ #: includes/admin-options.php:631
1373
+ msgid "Original feed order"
1374
+ msgstr ""
1375
+
1376
+ #: includes/admin-options.php:656
1377
+ msgid "Generate Random Code"
1378
+ msgstr ""
1379
+
1380
+ #: includes/admin-options.php:661
1381
+ msgid ""
1382
+ "Enter the code to use to securely reset the plugin and deactivate it. Be "
1383
+ "sure to save this code somewhere safe."
1384
+ msgstr ""
1385
+
1386
+ #: includes/admin-options.php:667
1387
+ msgid ""
1388
+ "Leave this empty to disable the secure reset function.<br/>\n"
1389
+ " You use this code by adding any of the following to any URL on "
1390
+ "your site."
1391
+ msgstr ""
1392
+
1393
+ #: includes/admin-options.php:670
1394
+ msgid "Resets your WP RSS Aggregator settings"
1395
+ msgstr ""
1396
+
1397
+ #: includes/admin-options.php:671
1398
+ msgid "Deactivates WP RSS Aggregator"
1399
+ msgstr ""
1400
+
1401
+ #: includes/admin-options.php:672
1402
+ msgid "Does both of the above"
1403
+ msgstr ""
1404
+
1405
+ #: includes/admin-options.php:676
1406
+ msgid ""
1407
+ "Use the above actions only when absolutely necessary, or when instructed to "
1408
+ "by support staff."
1409
+ msgstr ""
1410
+
1411
+ #: includes/admin-options.php:692
1412
+ msgid "On"
1413
+ msgstr ""
1414
+
1415
+ #: includes/admin-options.php:693
1416
+ msgid "Off"
1417
+ msgstr ""
1418
+
1419
+ #: includes/admin-options.php:805
1420
+ #, php-format
1421
+ msgid "%s year"
1422
+ msgid_plural "%s years"
1423
+ msgstr[0] ""
1424
+ msgstr[1] ""
1425
+
1426
+ #: includes/admin-options.php:806
1427
+ #, php-format
1428
+ msgid "%s month"
1429
+ msgid_plural "%s months"
1430
+ msgstr[0] ""
1431
+ msgstr[1] ""
1432
+
1433
+ #: includes/admin-options.php:807
1434
+ #, php-format
1435
+ msgid "%s week"
1436
+ msgid_plural "%s weeks"
1437
+ msgstr[0] ""
1438
+ msgstr[1] ""
1439
+
1440
+ #: includes/admin-options.php:808
1441
+ #, php-format
1442
+ msgid "%s day"
1443
+ msgid_plural "%s days"
1444
+ msgstr[0] ""
1445
+ msgstr[1] ""
1446
+
1447
+ #: includes/admin-options.php:809
1448
+ #, php-format
1449
+ msgid "%s hour"
1450
+ msgid_plural "%s hours"
1451
+ msgstr[0] ""
1452
+ msgstr[1] ""
1453
+
1454
+ #: includes/admin-options.php:810
1455
+ #, php-format
1456
+ msgid "%s minute"
1457
+ msgid_plural "%s minutes"
1458
+ msgstr[0] ""
1459
+ msgstr[1] ""
1460
+
1461
+ #: includes/admin-options.php:811
1462
+ #, php-format
1463
+ msgid "%s second"
1464
+ msgid_plural "%s seconds"
1465
+ msgstr[0] ""
1466
+ msgstr[1] ""
1467
+
1468
+ #: includes/admin-options.php:816
1469
+ msgid "now"
1470
+ msgstr ""
1471
+
1472
+ #: includes/admin-plugins.php:46
1473
+ msgid "I no longer need the plugin"
1474
+ msgstr ""
1475
+
1476
+ #: includes/admin-plugins.php:50
1477
+ msgid "I found a better alternative"
1478
+ msgstr ""
1479
+
1480
+ #: includes/admin-plugins.php:54
1481
+ msgid "I couldn't get the plugin to work"
1482
+ msgstr ""
1483
+
1484
+ #: includes/admin-plugins.php:58
1485
+ msgid "I'm temporarily deactivating the plugin, but I'll be back"
1486
+ msgstr ""
1487
+
1488
+ #: includes/admin-plugins.php:62
1489
+ msgid "I have a WP RSS Aggregator add-on"
1490
+ msgstr ""
1491
+
1492
+ #: includes/admin-plugins.php:66
1493
+ msgid "Other"
1494
+ msgstr ""
1495
+
1496
+ #: includes/admin-plugins.php:71
1497
+ msgid "Would you mind sharing its name?"
1498
+ msgstr ""
1499
+
1500
+ #: includes/admin-plugins.php:83
1501
+ msgid ""
1502
+ "Have you <a target=\"_blank\" href=\"https://wordpress.org/support/plugin/wp-"
1503
+ "rss-aggregator/\">contacted our support team</a> or checked out our <a href="
1504
+ "\"https://kb.wprssaggregator.com/\" target=\"_blank\">Knowledge Base</a>?"
1505
+ msgstr ""
1506
+
1507
+ #: includes/admin-plugins.php:94
1508
+ msgid ""
1509
+ "This core plugin is required for all our premium add-ons. Please don't "
1510
+ "deactivate it if you currently have premium add-ons installed and activated."
1511
+ msgstr ""
1512
+
1513
+ #: includes/admin-plugins.php:103
1514
+ msgid "Please share your reason..."
1515
+ msgstr ""
1516
+
1517
+ #: includes/admin-update-page.php:14 includes/admin-update-page.php:15
1518
+ msgid "Thank you for updating WP RSS Aggregator"
1519
+ msgstr ""
1520
+
1521
+ #: includes/admin-update-page.php:43
1522
+ msgid "What's new in WP RSS Aggregator"
1523
+ msgstr ""
1524
+
1525
+ #: includes/admin.php:28 includes/admin.php:112
1526
+ msgid "Settings"
1527
+ msgstr ""
1528
+
1529
+ #: includes/admin.php:92
1530
+ msgid "Name this feed"
1531
+ msgstr ""
1532
+
1533
+ #: includes/admin.php:113
1534
+ msgid "Documentation"
1535
+ msgstr ""
1536
+
1537
+ #: includes/admin.php:184
1538
+ #, php-format
1539
+ msgid ""
1540
+ "Thank you for using <a href=\"%1$s\" target=\"_blank\">WP RSS Aggregator</a>."
1541
+ msgstr ""
1542
+
1543
+ #: includes/admin.php:188
1544
+ #, php-format
1545
+ msgid "Please <a href=\"%1$s\" target=\"_blank\">rate us</a>!"
1546
+ msgstr ""
1547
+
1548
+ #: includes/cpt-feeds.php:82
1549
+ #, php-format
1550
+ msgid "%1$s &raquo; %2$s Feed"
1551
+ msgstr ""
1552
+
1553
+ #: includes/cpt-feeds.php:83
1554
+ #, php-format
1555
+ msgid "<link rel=\"%1$s\" type=\"%2$s\" title=\"%3$s\" href=\"%4$s\" />\n"
1556
+ msgstr ""
1557
+
1558
+ #: includes/cron-jobs.php:222
1559
+ msgid "Once every 5 minutes"
1560
+ msgstr ""
1561
+
1562
+ #: includes/cron-jobs.php:226
1563
+ msgid "Once every 10 minutes"
1564
+ msgstr ""
1565
+
1566
+ #: includes/cron-jobs.php:230
1567
+ msgid "Once every 15 minutes"
1568
+ msgstr ""
1569
+
1570
+ #: includes/cron-jobs.php:234
1571
+ msgid "Once every 30 minutes"
1572
+ msgstr ""
1573
+
1574
+ #: includes/cron-jobs.php:238
1575
+ msgid "Once every 2 hours"
1576
+ msgstr ""
1577
+
1578
+ #: includes/cron-jobs.php:242
1579
+ msgid "Once weekly"
1580
+ msgstr ""
1581
+
1582
+ #: includes/feed-access.php:201
1583
+ msgid "Certificate path"
1584
+ msgstr ""
1585
+
1586
+ #: includes/feed-access.php:206
1587
+ msgid "Feed request useragent"
1588
+ msgstr ""
1589
+
1590
+ #: includes/feed-access.php:211
1591
+ msgid "Enable feed cache"
1592
+ msgstr ""
1593
+
1594
+ #: includes/feed-access.php:231
1595
+ msgid "Feed Request Useragent"
1596
+ msgstr ""
1597
+
1598
+ #: includes/feed-access.php:232
1599
+ msgid "Leave blank to inherit general setting"
1600
+ msgstr ""
1601
+
1602
+ #: includes/feed-blacklist.php:94
1603
+ msgid "The item you are trying to blacklist does not exist"
1604
+ msgstr ""
1605
+
1606
+ #: includes/feed-blacklist.php:99
1607
+ msgid "The item you are trying to blacklist is not valid!"
1608
+ msgstr ""
1609
+
1610
+ #: includes/feed-blacklist.php:178
1611
+ msgid "Delete Permanently & Blacklist"
1612
+ msgstr ""
1613
+
1614
+ #: includes/feed-blacklist.php:184
1615
+ msgid ""
1616
+ "The item will be deleted permanently, and its permalink will be recorded in "
1617
+ "the blacklist"
1618
+ msgstr ""
1619
+
1620
+ #: includes/feed-importing.php:380
1621
+ #, php-format
1622
+ msgid "Failed to fetch the RSS feed. Error: %s"
1623
+ msgstr ""
1624
+
1625
+ #: includes/feed-importing.php:827
1626
+ #, php-format
1627
+ msgid "The importing process failed after %d seconds with the message: \"%s\""
1628
+ msgstr ""
1629
+
1630
+ #: includes/feed-processing.php:467
1631
+ msgid "The plugin failed to schedule a fetch for this feed. Please try again."
1632
+ msgstr ""
1633
+
1634
+ #: includes/image-caching.php:514
1635
+ #, php-format
1636
+ msgid "Invalid URL provided: \"%1$s\""
1637
+ msgstr ""
1638
+
1639
+ #: includes/image-caching.php:538
1640
+ #, php-format
1641
+ msgid "Could not create directory: \"%1$s\". Filename: \"%2$s\""
1642
+ msgstr ""
1643
+
1644
+ #: includes/image-caching.php:544
1645
+ #, php-format
1646
+ msgid "The file library cannot be read from %1$s"
1647
+ msgstr ""
1648
+
1649
+ #: includes/legacy-feed-display.php:398 templates/feeds/list/feed-list.twig:15
1650
+ msgid "No feed items found."
1651
+ msgstr ""
1652
+
1653
+ #: includes/legacy-feed-display.php:448
1654
+ #: templates/feeds/list/default-pagination.twig:7
1655
+ msgid "Older posts"
1656
+ msgstr ""
1657
+
1658
+ #: includes/legacy-feed-display.php:449
1659
+ #: templates/feeds/list/default-pagination.twig:14
1660
+ msgid "Newer posts"
1661
+ msgstr ""
1662
+
1663
+ #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:186
1664
+ #, php-format
1665
+ msgid ""
1666
+ "There is a new version of %1$s available. %2$sView version %3$s details%4$s."
1667
+ msgstr ""
1668
+
1669
+ #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:194
1670
+ #, php-format
1671
+ msgid ""
1672
+ "There is a new version of %1$s available. %2$sView version %3$s details%4$s "
1673
+ "or %5$supdate now%6$s."
1674
+ msgstr ""
1675
+
1676
+ #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:337
1677
+ msgid "You do not have permission to install plugin updates"
1678
+ msgstr ""
1679
+
1680
+ #: includes/libraries/EDD_licensing/EDD_SL_Plugin_Updater.php:337
1681
+ msgid "Error"
1682
+ msgstr ""
1683
+
1684
+ #: includes/misc-functions.php:312
1685
+ msgid "&hellip;"
1686
+ msgstr ""
1687
+
1688
+ #. translators: If your word count is based on single characters (East Asian characters),
1689
+ #. enter 'characters'. Otherwise, enter 'words'. Do not translate into your own language.
1690
+ #: includes/misc-functions.php:317
1691
+ msgctxt "word count: words or characters?"
1692
+ msgid "words"
1693
+ msgstr ""
1694
+
1695
+ #: includes/opml-importer.php:65
1696
+ msgid "Import OPML"
1697
+ msgstr ""
1698
+
1699
+ #: includes/opml-importer.php:75
1700
+ msgid "Howdy! Import your feeds here from an OPML (.xml) export file."
1701
+ msgstr ""
1702
+
1703
+ #: includes/opml-importer.php:76
1704
+ msgid "Click the button below, choose your file, and click 'Upload'."
1705
+ msgstr ""
1706
+
1707
+ #: includes/opml-importer.php:77
1708
+ msgid "We will take care of the rest."
1709
+ msgstr ""
1710
+
1711
+ #: includes/opml-importer.php:108
1712
+ msgid "Sorry, an error has been encountered."
1713
+ msgstr ""
1714
+
1715
+ #: includes/opml-importer.php:113
1716
+ msgid "Sorry, it seems your uploaded file has been misplaced!"
1717
+ msgstr ""
1718
+
1719
+ #: includes/opml-importer.php:114
1720
+ msgid "The uploaded file could not be found at "
1721
+ msgstr ""
1722
+
1723
+ #: includes/opml-importer.php:115
1724
+ msgid "It is likely that this was caused by a permissions problem."
1725
+ msgstr ""
1726
+
1727
+ #: includes/opml-importer.php:187
1728
+ msgid "Feeds were imported successfully!"
1729
+ msgstr ""
1730
+
1731
+ #: includes/opml-importer.php:194 includes/opml-importer.php:225
1732
+ msgid "ID"
1733
+ msgstr ""
1734
+
1735
+ #: includes/opml-importer.php:195 includes/opml-importer.php:226
1736
+ msgid "Title"
1737
+ msgstr ""
1738
+
1739
+ #: includes/opml-importer.php:257
1740
+ msgid "WP RSS OPML"
1741
+ msgstr ""
1742
+
1743
+ #: includes/opml-importer.php:258
1744
+ msgid "Import Feeds from an OPML file into WP RSS Aggregator"
1745
+ msgstr ""
1746
+
1747
+ #: includes/scripts.php:22 includes/scripts.php:34
1748
+ msgid "Please wait ..."
1749
+ msgstr ""
1750
+
1751
+ #: includes/scripts.php:31
1752
+ msgid "Failed to import"
1753
+ msgstr ""
1754
+
1755
+ #: includes/scripts.php:32
1756
+ msgid "Importing!"
1757
+ msgstr ""
1758
+
1759
+ #: includes/scripts.php:33
1760
+ msgid "Deleting!"
1761
+ msgstr ""
1762
+
1763
+ #: includes/scripts.php:35
1764
+ msgid "Bulk Add"
1765
+ msgstr ""
1766
+
1767
+ #: includes/scripts.php:36
1768
+ msgid "OK"
1769
+ msgstr ""
1770
+
1771
+ #: includes/scripts.php:37
1772
+ msgid "Cancel"
1773
+ msgstr ""
1774
+
1775
+ #: includes/scripts.php:38
1776
+ msgid ""
1777
+ "The feed items listed here will be disregarded when importing new items from "
1778
+ "your feed sources."
1779
+ msgstr ""
1780
+
1781
+ #: includes/scripts.php:39
1782
+ msgid "Remove selected from Blacklist"
1783
+ msgstr ""
1784
+
1785
+ #: includes/scripts.php:50
1786
+ #: templates/admin/upsell/more-features-page/add-on.twig:22
1787
+ msgid "Activate"
1788
+ msgstr ""
1789
+
1790
+ #: includes/scripts.php:51
1791
+ msgid "Pause"
1792
+ msgstr ""
1793
+
1794
+ #: includes/scripts.php:62
1795
+ msgid "Activating..."
1796
+ msgstr ""
1797
+
1798
+ #: includes/scripts.php:63
1799
+ msgid "Deactivating..."
1800
+ msgstr ""
1801
+
1802
+ #: includes/scripts.php:68
1803
+ msgid "Sending..."
1804
+ msgstr ""
1805
+
1806
+ #: includes/scripts.php:69
1807
+ #, php-format
1808
+ msgid ""
1809
+ "There was an error sending the form. Please use the <a href=\"%s\">contact "
1810
+ "form on our site.</a>"
1811
+ msgstr ""
1812
+
1813
+ #: includes/scripts.php:70
1814
+ msgid ""
1815
+ "Your message has been sent and we'll send you a confirmation e-mail when we "
1816
+ "receive it."
1817
+ msgstr ""
1818
+
1819
+ #: includes/scripts.php:87
1820
+ msgid "Use Global Cron"
1821
+ msgstr ""
1822
+
1823
+ #: includes/scripts.php:98
1824
+ msgid "Global"
1825
+ msgstr ""
1826
+
1827
+ #: includes/scripts.php:105
1828
+ msgid "Are you sure you want to do this? This operation cannot be undone."
1829
+ msgstr ""
1830
+
1831
+ #: includes/system-info.php:60
1832
+ msgid "Could not determine database driver version"
1833
+ msgstr ""
1834
+
1835
+ #: includes/system-info.php:94
1836
+ msgid "Your server supports fsockopen."
1837
+ msgstr ""
1838
+
1839
+ #: includes/system-info.php:94
1840
+ msgid "Your server does not support fsockopen."
1841
+ msgstr ""
1842
+
1843
+ #: includes/system-info.php:268
1844
+ msgid ""
1845
+ "The mysql extension is deprecated since PHP 5.5 and removed since PHP 7.0; "
1846
+ "Use mysqli instead"
1847
+ msgstr ""
1848
+
1849
+ #: includes/update.php:67
1850
+ msgid "No Follow"
1851
+ msgstr ""
1852
+
1853
+ #: includes/update.php:69
1854
+ msgid "Follow"
1855
+ msgstr ""
1856
+
1857
+ #: src/Container/ModuleContainer.php:68
1858
+ #, php-format
1859
+ msgid "Service \"%s\" was not found"
1860
+ msgstr ""
1861
+
1862
+ #: src/Data/ChangelogDataSet.php:122
1863
+ #, php-format
1864
+ msgid "No changelog entry found for version %s"
1865
+ msgstr ""
1866
+
1867
+ #: src/Data/Collections/TwigTemplateCollection.php:91
1868
+ msgid "Cannot modify Twig templates"
1869
+ msgstr ""
1870
+
1871
+ #: src/Data/Collections/TwigTemplateCollection.php:101
1872
+ msgid "Cannot delete Twig templates"
1873
+ msgstr ""
1874
+
1875
+ #: src/Data/Wp/WpPostArrayMetaDataSet.php:72
1876
+ #, php-format
1877
+ msgid "Meta data \"%s\" for post %d does not have a \"%s\" key"
1878
+ msgstr ""
1879
+
1880
+ #: src/Data/Wp/WpPostMetaDataSet.php:51
1881
+ #: src/Util/NormalizeWpPostCapableTrait.php:32
1882
+ #, php-format
1883
+ msgid "Post with ID %s does not exist"
1884
+ msgstr ""
1885
+
1886
+ #: src/Database/WpdbTable.php:113
1887
+ #, php-format
1888
+ msgid "Cannot find record with key \"%s\""
1889
+ msgstr ""
1890
+
1891
+ #: src/Database/WpdbTable.php:234
1892
+ #, php-format
1893
+ msgid "Failed to create the \"%s\" database table. Reason: %s"
1894
+ msgstr ""
1895
+
1896
+ #: src/Entities/Collections/WpEntityCollection.php:129
1897
+ #, php-format
1898
+ msgid "Post \"%s\" was not found"
1899
+ msgstr ""
1900
+
1901
+ #: src/Handlers/FeedTemplates/PreviewTemplateRedirectHandler.php:75
1902
+ msgid "You do not have sufficient privileges!"
1903
+ msgstr ""
1904
+
1905
+ #: src/Handlers/FeedTemplates/PreviewTemplateRedirectHandler.php:81
1906
+ msgid "Invalid template ID"
1907
+ msgstr ""
1908
+
1909
+ #: src/Handlers/Images/RenderItemsImageColumnHandler.php:63
1910
+ msgid "Feed item image"
1911
+ msgstr ""
1912
+
1913
+ #: src/Importer/Images/ImageContainer.php:57
1914
+ msgid "Image URL cannot be empty"
1915
+ msgstr ""
1916
+
1917
+ #: src/Modules/BlacklistToolModule.php:33 src/Ui/BlacklistTable.php:37
1918
+ #: src/Ui/BlacklistTable.php:38 templates/admin/tools/blacklist.twig:2
1919
+ msgid "Blacklist"
1920
+ msgstr ""
1921
+
1922
+ #: src/Modules/BlacklistToolModule.php:71
1923
+ msgid "The blacklist item URL is empty. Please enter the URL to blacklist."
1924
+ msgstr ""
1925
+
1926
+ #: src/Modules/BlacklistToolModule.php:82
1927
+ msgid "Added to blacklist."
1928
+ msgstr ""
1929
+
1930
+ #: src/Modules/BulkAddToolModule.php:33 templates/admin/tools/bulk_add.twig:1
1931
+ msgid "Bulk Add Sources"
1932
+ msgstr ""
1933
+
1934
+ #: src/Modules/CronsToolModule.php:30
1935
+ msgid "Crons"
1936
+ msgstr ""
1937
+
1938
+ #: src/Modules/FeedBlacklistModule.php:44
1939
+ #: src/Modules/FeedBlacklistModule.php:47
1940
+ msgid "Blacklisted Items"
1941
+ msgstr ""
1942
+
1943
+ #: src/Modules/FeedBlacklistModule.php:45
1944
+ msgid "Blacklisted Item"
1945
+ msgstr ""
1946
+
1947
+ #: src/Modules/FeedBlacklistModule.php:46
1948
+ #: src/Modules/FeedBlacklistModule.php:48
1949
+ #: src/Modules/FeedBlacklistModule.php:50
1950
+ msgid "Blacklist An Item"
1951
+ msgstr ""
1952
+
1953
+ #: src/Modules/FeedBlacklistModule.php:49
1954
+ msgid "Edit Blacklisted Item"
1955
+ msgstr ""
1956
+
1957
+ #: src/Modules/FeedBlacklistModule.php:51
1958
+ msgid "View Blacklisted Items"
1959
+ msgstr ""
1960
+
1961
+ #: src/Modules/FeedBlacklistModule.php:52
1962
+ msgid "Search Blacklisted Items"
1963
+ msgstr ""
1964
+
1965
+ #: src/Modules/FeedBlacklistModule.php:53
1966
+ msgid "No Blacklisted Items"
1967
+ msgstr ""
1968
+
1969
+ #: src/Modules/FeedBlacklistModule.php:54
1970
+ msgid "No blacklisted items found in the trash"
1971
+ msgstr ""
1972
+
1973
+ #: src/Modules/FeedItemsModule.php:144 src/Modules/FeedItemsModule.php:146
1974
+ msgid "Feed Items"
1975
+ msgstr ""
1976
+
1977
+ #: src/Modules/FeedItemsModule.php:145
1978
+ msgid "Feed Item"
1979
+ msgstr ""
1980
+
1981
+ #: src/Modules/FeedItemsModule.php:147
1982
+ msgid "View Feed Items"
1983
+ msgstr ""
1984
+
1985
+ #: src/Modules/FeedItemsModule.php:148
1986
+ msgid "Search Feed Items"
1987
+ msgstr ""
1988
+
1989
+ #: src/Modules/FeedItemsModule.php:149
1990
+ msgid "No Feed Items Found"
1991
+ msgstr ""
1992
+
1993
+ #: src/Modules/FeedItemsModule.php:150
1994
+ msgid "No Feed Items Found In Trash"
1995
+ msgstr ""
1996
+
1997
+ #: src/Modules/FeedSourcesModule.php:168 src/Modules/FeedSourcesModule.php:171
1998
+ msgid "Feed Sources"
1999
+ msgstr ""
2000
+
2001
+ #: src/Modules/FeedSourcesModule.php:169
2002
+ msgid "Feed Source"
2003
+ msgstr ""
2004
+
2005
+ #: src/Modules/FeedSourcesModule.php:170
2006
+ #: src/Modules/FeedTemplatesModule.php:132
2007
+ msgid "Add New"
2008
+ msgstr ""
2009
+
2010
+ #: src/Modules/FeedSourcesModule.php:172
2011
+ msgid "Add New Feed Source"
2012
  msgstr ""
2013
 
2014
+ #: src/Modules/FeedSourcesModule.php:173
2015
+ msgid "Edit Feed Source"
2016
  msgstr ""
2017
 
2018
+ #: src/Modules/FeedSourcesModule.php:174
2019
+ msgid "New Feed Source"
2020
  msgstr ""
2021
 
2022
+ #: src/Modules/FeedSourcesModule.php:175
2023
+ msgid "View Feed Source"
2024
  msgstr ""
2025
 
2026
+ #: src/Modules/FeedSourcesModule.php:176
2027
+ #: src/Modules/FeedTemplatesModule.php:138
2028
+ msgid "Search Feeds"
2029
  msgstr ""
2030
 
2031
+ #: src/Modules/FeedSourcesModule.php:177
2032
+ msgid "No Feed Sources Found"
2033
  msgstr ""
2034
 
2035
+ #: src/Modules/FeedSourcesModule.php:178
2036
+ msgid "No Feed Sources Found In Trash"
2037
  msgstr ""
2038
 
2039
+ #: src/Modules/FeedSourcesModule.php:179
2040
+ msgid "RSS Aggregator"
2041
  msgstr ""
2042
 
2043
+ #: src/Modules/FeedTemplatesModule.php:130
2044
+ #: src/Modules/FeedTemplatesModule.php:133
2045
+ #: src/Modules/FeedTemplatesModule.php:141
2046
+ #: src/Modules/FeedTemplatesModule.php:230
2047
+ #: src/Modules/FeedTemplatesModule.php:231
2048
+ msgid "Templates"
2049
  msgstr ""
2050
 
2051
+ #: src/Modules/FeedTemplatesModule.php:134
2052
+ msgid "Add New Template"
2053
  msgstr ""
2054
 
2055
+ #: src/Modules/FeedTemplatesModule.php:135
2056
+ msgid "Edit Template"
2057
  msgstr ""
2058
 
2059
+ #: src/Modules/FeedTemplatesModule.php:136
2060
+ msgid "New Template"
2061
  msgstr ""
2062
 
2063
+ #: src/Modules/FeedTemplatesModule.php:137
2064
+ msgid "View Template"
2065
  msgstr ""
2066
 
2067
+ #: src/Modules/FeedTemplatesModule.php:139
2068
+ msgid "No Templates Found"
2069
+ msgstr ""
2070
+
2071
+ #: src/Modules/FeedTemplatesModule.php:140
2072
+ msgid "No Templates Found In Trash"
2073
+ msgstr ""
2074
+
2075
+ #: src/Modules/FeedTemplatesModule.php:438
2076
+ #: src/Templates/Feeds/Types/ListTemplateType.php:99
2077
+ msgid "Source:"
2078
+ msgstr ""
2079
+
2080
+ #: src/Modules/FeedTemplatesModule.php:441
2081
+ #: src/Templates/Feeds/Types/ListTemplateType.php:111
2082
+ msgid "By"
2083
  msgstr ""
2084
 
2085
+ #: src/Modules/FeedTemplatesModule.php:443
2086
+ #: src/Templates/Feeds/Types/ListTemplateType.php:119
2087
+ msgid "Published on:"
2088
  msgstr ""
2089
 
2090
+ #: src/Modules/FeedTemplatesModule.php:465
2091
  msgid ""
2092
+ "The maximum number of feed items to display when using the shortcode. This "
2093
+ "enables pagination if set to a number smaller than the number of items to be "
2094
+ "displayed."
2095
  msgstr ""
2096
 
2097
+ #: src/Modules/FeedTemplatesModule.php:466
2098
+ msgid ""
2099
+ "Set the maximum number of characters to show for feed item titles.<hr/"
2100
+ "><em>Leave empty for no limit.</em>"
2101
  msgstr ""
2102
 
2103
+ #: src/Modules/FeedTemplatesModule.php:468
2104
+ msgid "Enable this option to show the pagination beneath feed items."
2105
  msgstr ""
2106
 
2107
+ #: src/Modules/FeedTemplatesModule.php:469
2108
  msgid ""
2109
+ "The type of pagination to use when showing feed items on multiple pages. The "
2110
+ "first shows two links, \"Older\" and \"Newer\", which allow you to navigate "
2111
+ "through the pages. The second shows links for all the pages, together with "
2112
+ "links for the next and previous pages."
2113
  msgstr ""
2114
 
2115
+ #: src/Modules/FeedTemplatesModule.php:474
2116
+ msgid ""
2117
+ "Enter the text that you want to show before the author name. A space is "
2118
+ "automatically added between this text and the author name."
2119
  msgstr ""
2120
 
2121
+ #: src/Modules/FeedTemplatesModule.php:478
2122
+ msgid ""
2123
+ "Enable this option to show the elapsed time from the feed item's date and "
2124
+ "time to the present time. <em>Eg. 2 hours ago</em>"
2125
  msgstr ""
2126
 
2127
+ #: src/Modules/FeedTemplatesModule.php:480
2128
+ msgid ""
2129
+ "Enable this option to set all links displayed as \"NoFollow\".<hr/>\"Nofollow"
2130
+ "\" provides a way to tell search engines to <em>not</em> follow certain "
2131
+ "links, such as links to feed items in this case."
2132
  msgstr ""
2133
 
2134
+ #: src/Modules/FeedTemplatesModule.php:481
2135
+ msgid ""
2136
+ "Tick this box to have feed items link to their embedded content, if they "
2137
+ "have any. This works especially well when links are set to <em>\"Open in a "
2138
+ "lightbox\"</em>."
2139
  msgstr ""
2140
 
2141
+ #: src/Modules/FeedTemplatesModule.php:482
2142
+ msgid "Enable this option to show bullets next to feed items."
2143
  msgstr ""
2144
 
2145
+ #: src/Modules/FeedTemplatesModule.php:483
2146
+ msgid "The bullet type to use for feed items."
2147
  msgstr ""
2148
 
2149
+ #: src/Modules/FeedTemplatesModule.php:484
2150
+ msgid ""
2151
+ "You can add your own HTML class name to the template output. This lets you "
2152
+ "customize your template further using custom CSS styling or custom JS "
2153
+ "functionality."
2154
  msgstr ""
2155
 
2156
+ #: src/Modules/FeedTemplatesModule.php:496
2157
+ #: src/Templates/Feeds/Types/ListTemplateType.php:29
2158
+ msgid "List"
2159
  msgstr ""
2160
 
2161
+ #: src/Modules/FeedTemplatesModule.php:523
2162
+ msgid "Open in same tab/window"
2163
  msgstr ""
2164
 
2165
+ #: src/Modules/FeedTemplatesModule.php:524
2166
+ msgid "Open in a new tab"
2167
  msgstr ""
2168
 
2169
+ #: src/Modules/FeedTemplatesModule.php:525
2170
+ msgid "Open in a lightbox"
2171
  msgstr ""
2172
 
2173
+ #: src/Modules/FeedTemplatesModule.php:528
2174
+ msgid "Older/Newer"
2175
  msgstr ""
2176
 
2177
+ #: src/Modules/FeedTemplatesModule.php:529
2178
+ msgid "Numbered"
2179
  msgstr ""
2180
 
2181
+ #: src/Modules/FeedTemplatesModule.php:532
2182
+ msgid "Bullets"
2183
  msgstr ""
2184
 
2185
+ #: src/Modules/FeedTemplatesModule.php:533
2186
+ msgid "Numbers"
 
 
2187
  msgstr ""
2188
 
2189
+ #: src/Modules/ImagesModule.php:150
2190
+ msgid "Image"
2191
+ msgstr ""
2192
+
2193
+ #: src/Modules/ImagesModule.php:191 src/Modules/ImagesModule.php:288
2194
+ msgid "Images"
2195
+ msgstr ""
2196
+
2197
+ #: src/Modules/ImagesModule.php:270
2198
  msgid ""
2199
+ "This option allows you to select which feed item image to use as the "
2200
+ "featured image. Automatic best image detection will attempt to find the "
2201
+ "largest image with the best aspect ratio.\n"
2202
+ "\n"
2203
+ " WordPress requires that featured images exist in the "
2204
+ "media library, so WP RSS Aggregator will always download and save featured "
2205
+ "images."
2206
  msgstr ""
2207
 
2208
+ #: src/Modules/ImportExportToolsModule.php:30
2209
+ msgid "Export"
2210
  msgstr ""
2211
 
2212
+ #: src/Modules/ImportExportToolsModule.php:43
2213
+ msgid "Import"
2214
  msgstr ""
2215
 
2216
+ #: src/Modules/ImportExportToolsModule.php:105
2217
+ msgid "No file was uploaded. Please select a file."
2218
  msgstr ""
2219
 
2220
+ #: src/Modules/ImportExportToolsModule.php:109
2221
+ msgid "Upload file is too large."
 
 
2222
  msgstr ""
2223
 
2224
+ #: src/Modules/ImportExportToolsModule.php:112
2225
+ msgid "The file was not fully uploaded."
 
 
2226
  msgstr ""
2227
 
2228
+ #: src/Modules/ImportExportToolsModule.php:115
2229
+ msgid "The file upload failed. Please try again."
2230
  msgstr ""
2231
 
2232
+ #: src/Modules/ImportExportToolsModule.php:119
2233
+ msgid "Upload error"
2234
  msgstr ""
2235
 
2236
+ #: src/Modules/LogsToolModule.php:33
2237
+ msgid "Logs"
 
2238
  msgstr ""
2239
 
2240
+ #: src/Modules/ResetToolModule.php:30
2241
+ msgid "Reset"
2242
  msgstr ""
2243
 
2244
+ #: src/Modules/ResetToolModule.php:90
2245
+ msgid "The items are being deleted in the background."
2246
  msgstr ""
2247
 
2248
+ #: src/Modules/SysInfoToolModule.php:30 templates/admin/tools/sys_info.twig:2
2249
+ msgid "System Info"
2250
  msgstr ""
2251
 
2252
+ #: src/Modules/ToolsModule.php:41 src/Modules/ToolsModule.php:52
2253
+ #: templates/admin/tools/main.twig:2
2254
+ msgid "Tools"
 
 
 
 
 
 
2255
  msgstr ""
2256
 
2257
+ #: src/Modules/UpsellModule.php:65
2258
+ msgid ""
2259
+ "An advanced importer that lets you import RSS feed items as WordPress posts "
2260
+ "or any other custom post type. You can use it to populate a website in "
2261
+ "minutes (auto-blog). This is the most popular and feature-filled extension."
2262
  msgstr ""
2263
 
2264
+ #: src/Modules/UpsellModule.php:77
2265
+ msgid ""
2266
+ "An extension for Feed to Post that adds connectivity to our premium full "
2267
+ "text service, which allows you to import the full post content for an "
2268
+ "unlimited number of feed items per feed source, even when the feed itself "
2269
+ "doesn't provide it"
2270
  msgstr ""
2271
 
2272
+ #: src/Modules/UpsellModule.php:89
2273
  msgid ""
2274
+ "Premium templates to display images and excerpts in various ways. It "
2275
+ "includes a fully customisable grid template and a list template that "
2276
+ "includes excerpts & thumbnails, both of which will spruce up your site!"
2277
  msgstr ""
2278
 
2279
+ #: src/Modules/UpsellModule.php:101
2280
+ msgid ""
2281
+ "Filters the feed items to be imported based on your own keywords, key "
2282
+ "phrases, or tags; you only get the items you're interested in. It is "
2283
+ "compatible with all other add-ons."
2284
  msgstr ""
2285
 
2286
+ #: src/Modules/UpsellModule.php:113
2287
  msgid ""
2288
+ "Categorises your feed sources and allows you to display feed items from a "
2289
+ "particular category within your site using the shortcode parameters."
 
2290
  msgstr ""
2291
 
2292
+ #: src/Modules/UpsellModule.php:125
2293
+ msgid ""
2294
+ "An extension for Feed to Post that allows you to integrate the WordAi "
2295
+ "article spinner so that the imported content is both completely unique and "
2296
+ "completely readable."
2297
  msgstr ""
2298
 
2299
+ #: src/Modules/UpsellModule.php:137
2300
  msgid ""
2301
+ "An extension for Feed to Post that allows you to integrate the SpinnerChief "
2302
+ "article spinner so that the imported content is both completely unique and "
2303
+ "completely readable."
2304
+ msgstr ""
2305
+
2306
+ #: src/Modules/UpsellModule.php:184
2307
+ msgid "More Features"
2308
+ msgstr ""
2309
+
2310
+ #: src/RestApi/Auth/AuthUserIsAdmin.php:24
2311
+ msgid "Not a user or not logged in"
2312
+ msgstr ""
2313
+
2314
+ #: src/RestApi/Auth/AuthUserIsAdmin.php:33
2315
+ msgid "User is not an administrator"
2316
+ msgstr ""
2317
+
2318
+ #: src/RestApi/Auth/AuthVerifyNonce.php:55
2319
+ msgid "Invalid request"
2320
+ msgstr ""
2321
+
2322
+ #: src/RestApi/Auth/AuthVerifyNonce.php:64
2323
+ msgid "Request nonce is invalid or has expired"
2324
+ msgstr ""
2325
+
2326
+ #: src/RestApi/EndPointManager.php:92
2327
+ msgid "Unauthorized"
2328
  msgstr ""
2329
 
2330
+ #: src/RestApi/EndPoints/FeedTemplates/CreateUpdateTemplateEndPoint.php:63
2331
+ msgid "Missing template ID or slug name"
2332
  msgstr ""
2333
 
2334
+ #: src/RestApi/EndPoints/FeedTemplates/DeleteTemplateEndPoint.php:60
2335
+ msgid "Missing template ID or set of IDs in the request"
2336
  msgstr ""
2337
 
2338
+ #: src/RestApi/EndPoints/FeedTemplates/DeleteTemplateEndPoint.php:79
2339
+ #: src/RestApi/EndPoints/FeedTemplates/PatchTemplateEndPoint.php:55
2340
  #, php-format
2341
+ msgid "Template \"%s\" does not exist"
2342
+ msgstr ""
2343
+
2344
+ #: src/Templates/Feeds/MasterFeedsTemplate.php:259
2345
+ #: src/Templates/Feeds/TemplateTypeTemplate.php:179
2346
+ msgid "The \"items\" must be a collection instance"
2347
+ msgstr ""
2348
+
2349
+ #: src/Templates/Feeds/MasterFeedsTemplate.php:287
2350
  msgid ""
2351
+ "Template \"{0}\" does not exist or could not be loaded. The \"{1}\" template "
2352
+ "was used is instead."
2353
  msgstr ""
2354
 
2355
+ #: src/Templates/Feeds/Types/AbstractFeedTemplateType.php:85
2356
+ msgid "Items is not a collection instance"
 
2357
  msgstr ""
2358
 
2359
+ #: src/Templates/TwigTemplate.php:70
2360
+ msgid "Could not load template"
2361
+ msgstr ""
2362
+
2363
+ #: src/Templates/TwigTemplate.php:75
2364
  #, php-format
2365
+ msgid "Syntax error in template at line %d: %s"
 
 
2366
  msgstr ""
2367
 
2368
+ #: src/Templates/TwigTemplate.php:83
2369
+ msgid "Could not render twig template: "
2370
+ msgstr ""
2371
+
2372
+ #: src/Ui/BlacklistTable.php:52
2373
+ msgid "There are no blacklisted items"
2374
+ msgstr ""
2375
+
2376
+ #: src/Ui/BlacklistTable.php:130
2377
+ msgid "Edit"
2378
  msgstr ""
2379
 
2380
+ #: src/Ui/BlacklistTable.php:134 src/Ui/BlacklistTable.php:171
2381
+ msgid "Delete"
2382
+ msgstr ""
2383
+
2384
+ #: wp-rss-aggregator.php:470
2385
+ msgid "Attempted to load an invalid WP RSS Aggregator module"
2386
+ msgstr ""
2387
+
2388
+ #: wp-rss-aggregator.php:491
2389
  msgid ""
2390
+ "<b>WP RSS Aggregator</b> has encountered an error. If this problem persists, "
2391
+ "kindly contact customer support and provide the following details:"
2392
+ msgstr ""
2393
+
2394
+ #: wp-rss-aggregator.php:524
2395
+ msgid "Deactivate WP RSS Aggregator and its addons"
2396
+ msgstr ""
2397
+
2398
+ #: wp-rss-aggregator.php:525
2399
+ msgid "Deactivate WP RSS Aggregator"
2400
  msgstr ""
2401
 
2402
+ #: wp-rss-aggregator.php:533
2403
  msgid ""
2404
+ "<b>WP RSS Aggregator</b> has encountered a critical error. The safest course "
2405
+ "of action is to deactivate the plugin and any of its add-ons on this site "
2406
+ "using the button below. Once you’ve done that, you may reactivate them and "
2407
+ "start using the plugins again. If the problem persists, please copy the "
2408
+ "below error and send it to our support team with an explanation of when and "
2409
+ "how it happened."
2410
  msgstr ""
2411
 
2412
+ #: wp-rss-aggregator.php:542
2413
+ msgid "WP RSS Aggregator Error"
2414
  msgstr ""
2415
 
2416
+ #: wp-rss-aggregator.php:566
2417
+ msgid "Click to show error details"
2418
  msgstr ""
2419
 
2420
+ #: wp-rss-aggregator.php:569
2421
+ msgid "Error Message:"
2422
  msgstr ""
2423
 
2424
+ #: wp-rss-aggregator.php:573
2425
+ msgid "Occurred at:"
2426
  msgstr ""
2427
 
2428
+ #: wp-rss-aggregator.php:577
2429
+ msgid "Stack trace:"
2430
  msgstr ""
2431
 
2432
+ #: wp-rss-aggregator.php:696 wp-rss-aggregator.php:790
 
2433
  msgid ""
2434
+ "As of version 4.13, WP RSS Aggregator will stop supporting PHP 5.3 and will "
2435
+ "require PHP 5.4 or later. Kindly contact your site's hosting provider for "
2436
+ "PHP version update options."
2437
  msgstr ""
2438
 
2439
+ #: wp-rss-aggregator.php:718
2440
  #, php-format
2441
+ msgid ""
2442
+ "<p><strong>%2$s requires WordPress to be of version %1$s or higher.</"
2443
+ "strong></br>Older versions of WordPress are no longer supported by %2$s. "
2444
+ "Please upgrade your WordPress core to continue benefiting from %2$s support "
2445
+ "services.</p>"
2446
  msgstr ""
2447
 
2448
+ #: wp-rss-aggregator.php:740
2449
+ msgid "WP RSS Aggregator cannot be activated."
 
2450
  msgstr ""
2451
 
2452
+ #: wp-rss-aggregator.php:741
2453
+ msgid "WP RSS Aggregator has been deactivated."
2454
  msgstr ""
2455
 
2456
+ #: wp-rss-aggregator.php:746
2457
+ msgctxt ""
2458
+ "Used like \"Kindly contact your hosting provider or contact support for more "
2459
+ "information.\""
2460
+ msgid "contact support"
2461
  msgstr ""
2462
 
2463
+ #: wp-rss-aggregator.php:753
2464
+ #, php-format
2465
+ msgid ""
2466
+ "The plugin requires version %s or later and your site's PHP version is %s."
2467
  msgstr ""
2468
 
2469
+ #: wp-rss-aggregator.php:759
2470
+ #, php-format
2471
+ msgctxt "the \"%s\" part is a link with text = \"contact support\""
2472
+ msgid ""
2473
+ "Kindly contact your hosting provider to upgrade your PHP version or %s for "
2474
+ "more information."
2475
  msgstr ""
2476
 
2477
+ #: wp-rss-aggregator.php:768
2478
+ msgid "WP RSS Aggregator - PHP version error"
2479
  msgstr ""
2480
 
2481
+ #: wp-rss-aggregator.php:808
2482
+ #, php-format
2483
+ msgid "%2$s requires WordPress version %1$s or higher."
2484
  msgstr ""
2485
 
2486
+ #: wp-rss-aggregator.php:1017
2487
+ msgid ""
2488
+ "The Excerpts & Thumbnails addon has been discontinued in favor of the "
2489
+ "Templates addon."
2490
  msgstr ""
2491
 
2492
+ #: wp-rss-aggregator.php:1018
2493
+ msgid "Click here to learn more."
2494
  msgstr ""
2495
 
2496
+ #: templates/admin/blacklist-metabox.twig:3
2497
+ msgid "The URL to blacklist"
2498
  msgstr ""
2499
 
2500
+ #: templates/admin/feeds/images-meta-box.twig:9
2501
+ msgid "Featured Image"
2502
  msgstr ""
2503
 
2504
+ #: templates/admin/feeds/images-meta-box.twig:15
2505
+ msgid "No featured image"
2506
  msgstr ""
2507
 
2508
+ #: templates/admin/feeds/images-meta-box.twig:18
2509
+ msgid "Auto detect best image"
2510
  msgstr ""
2511
 
2512
+ #: templates/admin/feeds/images-meta-box.twig:21
2513
+ msgid "Media thumbnail image"
2514
  msgstr ""
2515
 
2516
+ #: templates/admin/feeds/images-meta-box.twig:24
2517
+ msgid "Enclosure image"
2518
  msgstr ""
2519
 
2520
+ #: templates/admin/feeds/images-meta-box.twig:27
2521
+ msgid "iTunes image"
2522
  msgstr ""
2523
 
2524
+ #: templates/admin/feeds/images-meta-box.twig:30
2525
+ msgid "First image in content/excerpt"
2526
  msgstr ""
2527
 
2528
+ #: templates/admin/feeds/images-meta-box.twig:33
2529
+ msgid "Always use default image"
2530
  msgstr ""
2531
 
2532
+ #: templates/admin/feeds/images-meta-box.twig:48
2533
+ msgid "Items must have a featured image"
2534
  msgstr ""
2535
 
2536
+ #: templates/admin/feeds/images-meta-box.twig:64
2537
+ msgid "Remove the featured image from the content"
2538
  msgstr ""
2539
 
2540
+ #: templates/admin/feeds/images-meta-box.twig:76
2541
+ msgid "Default Featured Image"
2542
  msgstr ""
2543
 
2544
+ #: templates/admin/feeds/images-meta-box.twig:84
2545
+ msgid "Click the image to edit or update"
2546
  msgstr ""
2547
 
2548
+ #: templates/admin/feeds/images-meta-box.twig:88
2549
+ msgid "Set default featured image"
2550
  msgstr ""
2551
 
2552
+ #: templates/admin/feeds/images-meta-box.twig:91
2553
+ msgid "Remove default featured image"
2554
  msgstr ""
2555
 
2556
+ #: templates/admin/feeds/images-meta-box.twig:103
2557
+ msgid "Download other images"
 
2558
  msgstr ""
2559
 
2560
+ #: templates/admin/feeds/images-meta-box.twig:115
2561
+ msgid "Tick this box to save feed item images to your WordPress Gallery."
2562
  msgstr ""
2563
 
2564
+ #: templates/admin/feeds/images-meta-box.twig:126
2565
+ msgid "Minimum Image Size"
2566
  msgstr ""
2567
 
2568
+ #: templates/admin/feeds/images-meta-box.twig:131
2569
+ msgid "Width:"
2570
  msgstr ""
2571
 
2572
+ #: templates/admin/feeds/images-meta-box.twig:141
2573
+ msgid "Height:"
 
 
2574
  msgstr ""
2575
 
2576
+ #: templates/admin/feeds/images-meta-box.twig:150
2577
+ msgid ""
2578
+ "Images that are smaller than the given size will not be downloaded. Leave "
2579
+ "empty to download all images without restriction. This also applies to "
2580
+ "featured images."
2581
  msgstr ""
2582
 
2583
+ #: templates/admin/feeds/save-meta-box.twig:4
2584
+ msgid "Slug:"
 
2585
  msgstr ""
2586
 
2587
+ #: templates/admin/feeds/save-meta-box.twig:9
2588
+ msgid "Auto Generate"
2589
  msgstr ""
2590
 
2591
+ #: templates/admin/feeds/shortcode.twig:4
2592
+ msgid "Shortcode:"
2593
  msgstr ""
2594
 
2595
+ #: templates/admin/items/images-meta-box.twig:1
2596
+ msgid "Found images:"
2597
  msgstr ""
2598
 
2599
+ #: templates/admin/tools/blacklist.twig:7
2600
+ msgid "Blacklist a URL"
 
2601
  msgstr ""
2602
 
2603
+ #: templates/admin/tools/blacklist.twig:11
 
2604
  msgid ""
2605
+ "The blacklist is a list of feed item URLs. Any items with a URL from this "
2606
+ "list will be not be imported."
2607
  msgstr ""
2608
 
2609
+ #: templates/admin/tools/blacklist.twig:18
2610
+ msgid "Add to Blacklist"
2611
  msgstr ""
2612
 
2613
+ #: templates/admin/tools/blacklist.twig:21
2614
+ msgid "Give it a name"
2615
  msgstr ""
2616
 
2617
+ #: templates/admin/tools/blacklist.twig:27
2618
+ msgid "URL to blacklist"
 
 
 
2619
  msgstr ""
2620
 
2621
+ #: templates/admin/tools/blacklist.twig:32
2622
+ msgid "Add to blacklist"
 
 
 
 
2623
  msgstr ""
2624
 
2625
+ #: templates/admin/tools/bulk_add.twig:2
2626
+ msgid ""
2627
+ "Create multiple feed sources at once, by entering the name and URLs of your "
2628
+ "feeds below."
2629
  msgstr ""
2630
 
2631
+ #: templates/admin/tools/bulk_add.twig:3
2632
+ msgid "The feed sources will be created using your global settings."
2633
  msgstr ""
2634
 
2635
+ #: templates/admin/tools/bulk_add.twig:5
 
2636
  msgid ""
2637
+ "Put each feed on its own line, and separate the name and the URL using a "
2638
+ "comma. For example:"
2639
  msgstr ""
2640
 
2641
+ #: templates/admin/tools/bulk_add.twig:6
2642
+ msgid "Feed Name, http://www.myfeed.com"
 
 
 
2643
  msgstr ""
2644
 
2645
+ #: templates/admin/tools/bulk_add.twig:14
2646
+ msgid "Add Feeds"
2647
  msgstr ""
2648
 
2649
+ #: templates/admin/tools/crons.twig:20
2650
+ msgid "{number} feeds"
2651
  msgstr ""
2652
 
2653
+ #: templates/admin/tools/crons.twig:28
2654
+ msgid "{page} of {pages}"
2655
  msgstr ""
2656
 
2657
+ #: templates/admin/tools/crons.twig:36
2658
+ msgid "Loading"
2659
  msgstr ""
2660
 
2661
+ #: templates/admin/tools/crons.twig:41
2662
+ msgid "Global Interval:"
2663
  msgstr ""
2664
 
2665
+ #: templates/admin/tools/crons.twig:45
2666
+ msgid "Global Time:"
2667
  msgstr ""
2668
 
2669
+ #: templates/admin/tools/crons.twig:51
2670
+ msgid "Download Timeline Image"
2671
  msgstr ""
2672
 
2673
+ #: templates/admin/tools/crons.twig:62
2674
+ msgid "Feed"
2675
  msgstr ""
2676
 
2677
+ #: templates/admin/tools/crons.twig:63
2678
+ msgid "Interval"
2679
  msgstr ""
2680
 
2681
+ #: templates/admin/tools/crons.twig:64
2682
+ msgid "Time"
2683
  msgstr ""
2684
 
2685
+ #: templates/admin/tools/export.twig:1 templates/admin/tools/export.twig:13
2686
+ msgid "Export Settings"
2687
  msgstr ""
2688
 
2689
+ #: templates/admin/tools/export.twig:3
2690
  msgid ""
2691
+ "Create a file that contains all of your settings for WP RSS Aggregator and "
2692
+ "its add-ons."
2693
  msgstr ""
2694
 
2695
+ #: templates/admin/tools/import.twig:2
2696
+ msgid ""
2697
+ "Upload an exported settings file to import your settings for WP RSS "
2698
+ "Aggregator and its add-ons"
2699
  msgstr ""
2700
 
2701
+ #: templates/admin/tools/logs.twig:2
2702
+ msgid "Debug Log"
2703
  msgstr ""
2704
 
2705
+ #: templates/admin/tools/logs.twig:13 templates/admin/tools/sys_info.twig:11
2706
+ msgid "Download"
2707
  msgstr ""
2708
 
2709
+ #: templates/admin/tools/logs.twig:23
2710
+ msgid "Logging is disabled"
2711
  msgstr ""
2712
 
2713
+ #: templates/admin/tools/logs.twig:30
2714
+ msgid "The log is empty"
 
 
2715
  msgstr ""
2716
 
2717
+ #: templates/admin/tools/logs.twig:36
2718
+ msgid "Showing the most recent %d log messages."
2719
  msgstr ""
2720
 
2721
+ #: templates/admin/tools/logs.twig:41
2722
+ msgid "Filters:"
2723
  msgstr ""
2724
 
2725
+ #: templates/admin/tools/logs.twig:44
2726
+ msgid "All"
2727
  msgstr ""
2728
 
2729
+ #: templates/admin/tools/logs.twig:47
2730
+ msgid "Errors"
2731
  msgstr ""
2732
 
2733
+ #: templates/admin/tools/logs.twig:50
2734
+ msgid "Info"
2735
  msgstr ""
2736
 
2737
+ #: templates/admin/tools/logs.twig:53
2738
+ msgid "Notice"
2739
  msgstr ""
2740
 
2741
+ #: templates/admin/tools/logs.twig:56
2742
+ msgid "Warnings"
2743
  msgstr ""
2744
 
2745
+ #: templates/admin/tools/logs.twig:59
2746
+ msgid "Debug"
2747
  msgstr ""
2748
 
2749
+ #: templates/admin/tools/logs.twig:66
2750
+ msgid "Clear log"
2751
  msgstr ""
2752
 
2753
+ #: templates/admin/tools/logs.twig:93
2754
+ msgid "Log Options"
2755
  msgstr ""
2756
 
2757
+ #: templates/admin/tools/logs.twig:95
2758
+ msgid "Enable logging"
2759
  msgstr ""
2760
 
2761
+ #: templates/admin/tools/logs.twig:102
2762
+ msgid "Auto delete logs older than"
2763
  msgstr ""
2764
 
2765
+ #: templates/admin/tools/logs.twig:106
2766
+ msgid "days"
2767
  msgstr ""
2768
 
2769
+ #: templates/admin/tools/logs.twig:107
2770
+ msgid "(Once per day, logs older than the set amount of days are deleted)"
2771
  msgstr ""
2772
 
2773
+ #: templates/admin/tools/logs.twig:113
2774
+ msgid "Save Log Options"
2775
  msgstr ""
2776
 
2777
+ #: templates/admin/tools/reset.twig:1 templates/admin/tools/reset.twig:14
2778
+ msgid "Delete all imported items"
2779
  msgstr ""
2780
 
2781
+ #: templates/admin/tools/reset.twig:2
2782
+ msgid "Click the button below to delete all imported items and posts."
2783
  msgstr ""
2784
 
2785
+ #: templates/admin/tools/reset.twig:4
2786
+ msgid ""
2787
+ "Kindly note that old items may no longer be present in their respective RSS "
2788
+ "feeds, meaning that you may be unable to re-import them later."
2789
  msgstr ""
2790
 
2791
+ #: templates/admin/tools/reset.twig:18
2792
+ msgid "Restore Default Settings"
2793
  msgstr ""
2794
 
2795
+ #: templates/admin/tools/reset.twig:20
2796
+ msgid "Click the red button to reset the plugin settings to default."
2797
+ msgstr ""
2798
+
2799
+ #: templates/admin/tools/reset.twig:21
2800
  msgid ""
2801
+ "It is recommended to export your settings before resetting them, in case you "
2802
+ "need to rollback."
2803
  msgstr ""
2804
 
2805
+ #: templates/admin/tools/reset.twig:30
2806
+ msgid "Reset Settings to Default"
2807
  msgstr ""
2808
 
2809
+ #: templates/admin/tools/sys_info.twig:17
2810
+ msgid ""
2811
+ "To copy the system info, double click it and then press Ctrl + C (PC) or Cmd "
2812
+ "+ C (Mac)."
2813
  msgstr ""
2814
 
2815
+ #: templates/admin/update-page.twig:10
2816
+ msgid "Skip the update details and get back to the plugin."
2817
  msgstr ""
2818
 
2819
+ #: templates/admin/update-page.twig:25
2820
+ msgid "Introducing Lorem: A New WP RSS Aggregator Partner"
2821
  msgstr ""
2822
 
2823
+ #: templates/admin/update-page.twig:28
2824
+ msgid ""
2825
+ "Over the years we have partnered up with a few trusted companies to offer "
2826
+ "customisations that go beyond\n"
2827
+ " our premium support services. Being a small "
2828
+ "team, we don’t always have the time to offer the level\n"
2829
+ " of customisation that some of you may need or "
2830
+ "want. That’s why partnering up with others who excel\n"
2831
+ " in this area was the logical next step."
2832
  msgstr ""
2833
 
2834
+ #: templates/admin/update-page.twig:36
2835
+ msgid ""
2836
+ "Lorem is a platform through which you can hire expert designers, developers, "
2837
+ "marketers and more at\n"
2838
+ " affordable rates. They have a dedicated team "
2839
+ "that guides you from the moment you start a\n"
2840
+ " conversation to the moment that a project is "
2841
+ "delivered."
2842
  msgstr ""
2843
 
2844
+ #: templates/admin/update-page.twig:43
2845
  msgid ""
2846
+ "We chose to work with Lorem in order to provide customisation works as well "
2847
+ "as support in terms of\n"
2848
+ " setting up WP RSS Aggregator to meet your exact "
2849
+ "needs."
2850
  msgstr ""
2851
 
2852
+ #: templates/admin/update-page.twig:49
2853
+ msgid "Learn more"
2854
  msgstr ""
2855
 
2856
+ #: templates/admin/update-page.twig:58
2857
+ msgid "Full Changelog"
2858
  msgstr ""
2859
 
2860
+ #: templates/admin/upsell/add-on-list.twig:1
2861
+ msgid "Add functionality with our premium extensions:"
2862
  msgstr ""
2863
 
2864
+ #: templates/admin/upsell/more-features-page/add-on.twig:18
2865
+ msgid "Installed!"
2866
  msgstr ""
2867
 
2868
+ #: templates/admin/upsell/more-features-page/add-on.twig:27
2869
+ msgid "Purchase & Install"
2870
+ msgstr ""
2871
+
2872
+ #: templates/admin/upsell/more-features-page/main.twig:2
2873
+ msgid "More Features With Our Premium Add-Ons"
2874
+ msgstr ""
2875
+
2876
+ #: templates/admin/upsell/more-features-page/main.twig:5
2877
+ msgid ""
2878
+ "The following addons are available to increase the functionality of the WP "
2879
+ "RSS Aggregator plugin."
2880
+ msgstr ""
2881
+
2882
+ #: templates/admin/upsell/more-features-page/main.twig:10
2883
+ msgid "Check out our pricing plans for bigger savings!"
2884
+ msgstr ""
2885
+
2886
+ #: templates/feeds/list/numbered-pagination.twig:13
2887
+ msgid "Previous"
2888
+ msgstr ""
2889
+
2890
+ #: templates/feeds/list/numbered-pagination.twig:39
2891
+ msgid "Next"
2892
  msgstr ""
2893
 
2894
+ #. Plugin Name of the plugin/theme
2895
+ msgid "WP RSS Aggregator"
2896
  msgstr ""
2897
 
2898
+ #. Plugin URI of the plugin/theme
2899
  msgid ""
2900
+ "https://www.wprssaggregator.com/"
2901
+ "#utm_source=wpadmin&utm_medium=plugin&utm_campaign=wpraplugin"
 
2902
  msgstr ""
2903
 
2904
+ #. Description of the plugin/theme
2905
+ msgid "Imports and aggregates multiple RSS Feeds."
2906
  msgstr ""
2907
 
2908
+ #. Author of the plugin/theme
2909
+ msgid "RebelCode"
2910
  msgstr ""
2911
 
2912
+ #. Author URI of the plugin/theme
2913
+ msgid "https://www.wprssaggregator.com"
2914
  msgstr ""
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: RSS import, RSS aggregator, feed import, content curation, feed to post
5
  Requires at least: 4.0 or higher
6
  Tested up to: 5.3
7
  Requires PHP: 5.4
8
- Stable tag: 4.17.2
9
  License: GPLv3
10
 
11
  WP RSS Aggregator is the original & most popular WordPress solution for importing RSS feeds, auto-blogging, content curation & aggregation.
@@ -259,6 +259,20 @@ Our complete Knowledge Base with FAQs can be found [here](https://kb.wprssaggreg
259
 
260
  == Changelog ==
261
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  = 4.17.2 (2019-12-19) =
263
  **Added**
264
  - The error handler now includes the file and line where the error occurred.
5
  Requires at least: 4.0 or higher
6
  Tested up to: 5.3
7
  Requires PHP: 5.4
8
+ Stable tag: 4.17.3
9
  License: GPLv3
10
 
11
  WP RSS Aggregator is the original & most popular WordPress solution for importing RSS feeds, auto-blogging, content curation & aggregation.
259
 
260
  == Changelog ==
261
 
262
+ = 4.17.3 (2020-01-23) =
263
+ **Changed**
264
+ - Updated code to fix deprecation warnings on PHP version 7.4 and later.
265
+ - Updated the Twig library to version `1.41.0` to fix deprecation warnings on PHP version 7.4 and later.
266
+ - Updated the default translation files to contain up-to-date text.
267
+
268
+ **Fixed**
269
+ - Removed a false-positive error from the log.
270
+ - Localization in Twig templates did not work.
271
+ - When revisions are enabled, an error would prevent feed sources from being saved.
272
+ - Translations were being loaded from an invalid path.
273
+ - The default featured image in the New/Edit Feed Source page did not preview after saving the feed source.
274
+ - Missing space between the link `a` tag and the `href` attribute on PHP 7.4
275
+
276
  = 4.17.2 (2019-12-19) =
277
  **Added**
278
  - The error handler now includes the file and line where the error occurred.
src/Handlers/FeedSources/FeedSourceSaveMetaHandler.php CHANGED
@@ -65,6 +65,11 @@ class FeedSourceSaveMetaHandler
65
  // Get the post type object.
66
  $post_type = get_post_type_object($post->post_type);
67
 
 
 
 
 
 
68
  // Check if the current user has permission to edit the post.
69
  if (!current_user_can($post_type->cap->edit_post, $postId)) {
70
  return;
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;
src/Modules/CoreModule.php CHANGED
@@ -78,6 +78,14 @@ class CoreModule implements ModuleInterface
78
  'wpra/core/plugin_dir_path' => function (ContainerInterface $c) {
79
  return plugin_dir_path($c->get('wpra/core/plugin_file_path'));
80
  },
 
 
 
 
 
 
 
 
81
  /*
82
  * The URL to the WP RSS Aggregator plugin directory.
83
  *
78
  'wpra/core/plugin_dir_path' => function (ContainerInterface $c) {
79
  return plugin_dir_path($c->get('wpra/core/plugin_file_path'));
80
  },
81
+ /*
82
+ * The name of the WP RSS Aggregator plugin directory.
83
+ *
84
+ * @since 4.17.3
85
+ */
86
+ 'wpra/core/plugin_dir_name' => function (ContainerInterface $c) {
87
+ return basename(plugin_dir_path($c->get('wpra/core/plugin_file_path')));
88
+ },
89
  /*
90
  * The URL to the WP RSS Aggregator plugin directory.
91
  *
src/Modules/I18nModule.php CHANGED
@@ -28,13 +28,23 @@ class I18nModule implements ModuleInterface
28
  'wpra/i18n/domain' => function () {
29
  return WPRSS_TEXT_DOMAIN;
30
  },
 
 
 
 
 
 
 
 
 
 
31
  /*
32
  * The path to the languages directory.
33
  *
34
  * @since 4.13
35
  */
36
- 'wpra/i18n/languages_dir_path' => function () {
37
- return WPRSS_LANG;
38
  },
39
  /*
40
  * The handler that loads the plugin's text domain.
@@ -44,9 +54,9 @@ class I18nModule implements ModuleInterface
44
  'wpra/i18n/load_text_domain_handler' => function (ContainerInterface $c) {
45
  return new LoadTextDomainHandler(
46
  $c->get('wpra/i18n/domain'),
47
- $c->get('wpra/i18n/languages_dir_path')
48
  );
49
- }
50
  ];
51
  }
52
 
28
  'wpra/i18n/domain' => function () {
29
  return WPRSS_TEXT_DOMAIN;
30
  },
31
+ /*
32
+ * The name of the languages' parent directory.
33
+ *
34
+ * @since 4.17.3
35
+ */
36
+ 'wpra/i18n/languages/parent_dir' => function (ContainerInterface $c) {
37
+ return $c->has('wpra/core/plugin_dir_name')
38
+ ? $c->get('wpra/core/plugin_dir_name')
39
+ : '';
40
+ },
41
  /*
42
  * The path to the languages directory.
43
  *
44
  * @since 4.13
45
  */
46
+ 'wpra/i18n/languages_rel_dir' => function (ContainerInterface $c) {
47
+ return $c->get('wpra/i18n/languages/parent_dir') . '/languages';
48
  },
49
  /*
50
  * The handler that loads the plugin's text domain.
54
  'wpra/i18n/load_text_domain_handler' => function (ContainerInterface $c) {
55
  return new LoadTextDomainHandler(
56
  $c->get('wpra/i18n/domain'),
57
+ $c->get('wpra/i18n/languages_rel_dir')
58
  );
59
+ },
60
  ];
61
  }
62
 
src/Modules/ImagesModule.php CHANGED
@@ -223,12 +223,17 @@ class ImagesModule implements ModuleInterface
223
  global $post;
224
 
225
  $collection = $c->get('wpra/feeds/sources/collection');
226
- $feed = isset($collection[$post->ID])
227
- ? $collection[$post->ID]
228
  : [];
229
 
 
 
 
 
 
230
  return [
231
- 'feed' => $feed,
232
  'options' => $c->get('wpra/images/feeds/meta_box/template/enabled_options'),
233
  ];
234
  };
223
  global $post;
224
 
225
  $collection = $c->get('wpra/feeds/sources/collection');
226
+ $info = isset($collection[$post->ID])
227
+ ? $collection[$post->ID]->export()
228
  : [];
229
 
230
+ // Get the URL for the default ft. image and add it to the info
231
+ if (array_key_exists('def_ft_image', $info)) {
232
+ $info['def_ft_image_url'] = wp_get_attachment_url($info['def_ft_image']);
233
+ }
234
+
235
  return [
236
+ 'feed' => $info,
237
  'options' => $c->get('wpra/images/feeds/meta_box/template/enabled_options'),
238
  ];
239
  };
src/RestApi/EndPoints/Handlers/GetEntityHandler.php CHANGED
@@ -12,33 +12,33 @@ use WP_REST_Response;
12
  /**
13
  * A generic endpoint handler for entity collections.
14
  *
15
- * @since [*next-version*]
16
  */
17
  class GetEntityHandler extends AbstractRestApiEndPoint
18
  {
19
  /**
20
- * @since [*next-version*]
21
  *
22
  * @var CollectionInterface
23
  */
24
  protected $collection;
25
 
26
  /**
27
- * @since [*next-version*]
28
  *
29
  * @var string
30
  */
31
  protected $idKey;
32
 
33
  /**
34
- * @since [*next-version*]
35
  *
36
  * @var callable[]
37
  */
38
  protected $filters;
39
 
40
  /**
41
- * @since [*next-version*]
42
  *
43
  * @var int
44
  */
@@ -47,7 +47,7 @@ class GetEntityHandler extends AbstractRestApiEndPoint
47
  /**
48
  * Constructor.
49
  *
50
- * @since [*next-version*]
51
  *
52
  * @param CollectionInterface $collection The entity collection.
53
  * @param string $idKey The key in requests for IDs, for responding with single entities.
@@ -67,7 +67,7 @@ class GetEntityHandler extends AbstractRestApiEndPoint
67
  /**
68
  * @inheritDoc
69
  *
70
- * @since [*next-version*]
71
  */
72
  protected function handle(WP_REST_Request $request)
73
  {
@@ -89,7 +89,7 @@ class GetEntityHandler extends AbstractRestApiEndPoint
89
  /**
90
  * Applies filters to the collection based on the request.
91
  *
92
- * @since [*next-version*]
93
  *
94
  * @param WP_REST_Request $request The request.
95
  * @param CollectionInterface $collection The collection to filter.
@@ -112,7 +112,7 @@ class GetEntityHandler extends AbstractRestApiEndPoint
112
  /**
113
  * Paginates the collection.
114
  *
115
- * @since [*next-version*]
116
  *
117
  * @param WP_REST_Request $request The request.
118
  * @param CollectionInterface $collection The collection to paginate.
12
  /**
13
  * A generic endpoint handler for entity collections.
14
  *
15
+ * @since 4.17.2
16
  */
17
  class GetEntityHandler extends AbstractRestApiEndPoint
18
  {
19
  /**
20
+ * @since 4.17.2
21
  *
22
  * @var CollectionInterface
23
  */
24
  protected $collection;
25
 
26
  /**
27
+ * @since 4.17.2
28
  *
29
  * @var string
30
  */
31
  protected $idKey;
32
 
33
  /**
34
+ * @since 4.17.2
35
  *
36
  * @var callable[]
37
  */
38
  protected $filters;
39
 
40
  /**
41
+ * @since 4.17.2
42
  *
43
  * @var int
44
  */
47
  /**
48
  * Constructor.
49
  *
50
+ * @since 4.17.2
51
  *
52
  * @param CollectionInterface $collection The entity collection.
53
  * @param string $idKey The key in requests for IDs, for responding with single entities.
67
  /**
68
  * @inheritDoc
69
  *
70
+ * @since 4.17.2
71
  */
72
  protected function handle(WP_REST_Request $request)
73
  {
89
  /**
90
  * Applies filters to the collection based on the request.
91
  *
92
+ * @since 4.17.2
93
  *
94
  * @param WP_REST_Request $request The request.
95
  * @param CollectionInterface $collection The collection to filter.
112
  /**
113
  * Paginates the collection.
114
  *
115
+ * @since 4.17.2
116
  *
117
  * @param WP_REST_Request $request The request.
118
  * @param CollectionInterface $collection The collection to paginate.
src/Twig/Extensions/I18n/I18nTransNode.php CHANGED
@@ -18,6 +18,6 @@ class I18nTransNode extends Twig_Extensions_Node_Trans
18
  */
19
  protected function getTransFunction($plural)
20
  {
21
- return $plural ? '_n' : '__';
22
  }
23
  }
18
  */
19
  protected function getTransFunction($plural)
20
  {
21
+ return ($plural) ? 'wprss_translate_n' : 'wprss_translate';
22
  }
23
  }
src/Twig/Extensions/WpraExtension.php CHANGED
@@ -158,10 +158,13 @@ class WpraExtension extends AbstractExtension
158
  protected function getWpraLinkAttrsFunction()
159
  {
160
  $name = 'wpra_link_attrs';
 
 
 
161
 
162
  return new TwigFunction($name, function ($url, $options, $className = '') {
163
- return $this->prepareLinkAttrs($url, $options, $className);
164
- });
165
  }
166
 
167
  /**
158
  protected function getWpraLinkAttrsFunction()
159
  {
160
  $name = 'wpra_link_attrs';
161
+ $options = [
162
+ 'is_safe' => ['html'],
163
+ ];
164
 
165
  return new TwigFunction($name, function ($url, $options, $className = '') {
166
+ return ' ' . $this->prepareLinkAttrs($url, $options, $className);
167
+ }, $options);
168
  }
169
 
170
  /**
templates/admin/feeds/images-meta-box.twig CHANGED
@@ -77,7 +77,7 @@
77
  </label>
78
  </th>
79
  <td>
80
- <input type="hidden" id="wprss-feed-def-ft-image" name="wpra_feed_def_ft_image" value="{{ feed.def_ft_image_id }}" />
81
 
82
  <img src="{{ feed.def_ft_image_url }}" id="wprss-feed-def-ft-image-preview" />
83
  <p id="wprss-feed-def-ft-image-preview-hint" class="howto">
77
  </label>
78
  </th>
79
  <td>
80
+ <input type="hidden" id="wprss-feed-def-ft-image" name="wpra_feed_def_ft_image" value="{{ feed.def_ft_image }}" />
81
 
82
  <img src="{{ feed.def_ft_image_url }}" id="wprss-feed-def-ft-image-preview" />
83
  <p id="wprss-feed-def-ft-image-preview-hint" class="howto">
templates/admin/tools/crons.twig CHANGED
@@ -1,82 +1,130 @@
1
- <h3>{% trans "Crons" %}</h3>
2
-
3
  <div id="wpra-crons">
4
-
5
- {# the timeline diagram #}
6
- <div id="wpra-crons-timeline">
7
- <canvas id="wpra-crons-timeline-canvas" height="150"></canvas>
 
8
  </div>
9
 
10
- {# Toolbar #}
11
- <div id="wpra-crons-toolbar">
12
- {# Pagination #}
13
- <div class="wpra-crons-pagination">
14
- <div class="wpra-crons-pagination-info">
15
- {{ "{number} feeds"|trans|replace({'{number}': '<span class="wpra-crons-num-feeds"></span>'})|raw }}
16
- </div>
17
- <div class="wpra-crons-pagination-buttons">
18
- <button id="wpra-crons-first-page" class="button" disabled>&laquo;</button>
19
- <button id="wpra-crons-prev-page" class="button" disabled>&lsaquo;</button>
20
- <span class="wpra-crons-page-indicator">
21
- <span class="wpra-crons-curr-page">1</span>
22
- {% trans "of" %}
23
- <span class="wpra-crons-num-pages">2</span>
 
 
 
 
 
 
24
  </span>
25
- <button id="wpra-crons-next-page" class="button" disabled>&rsaquo;</button>
26
- <button id="wpra-crons-last-page" class="button" disabled>&raquo;</button>
 
27
  </div>
28
- </div>
29
 
30
- {# Loading text #}
31
- <span id="wpra-crons-loading">{% trans "Loading" %}</span>
32
 
33
- {# Info panel #}
34
- <div class="wpra-crons-info">
35
  <span>
36
  <strong>{% trans "Global Interval:" %}</strong>
37
  <code class="wpra-crons-global-interval"></code>
38
  </span>
39
- <span>
40
  <strong>{% trans "Global Time:" %}</strong>
41
  <code class="wpra-crons-global-time"></code>
42
  </span>
43
 
44
- <span>
45
  <a class="button wpra-crons-download-timeline">
46
  {% trans "Download Timeline Image" %}
47
  </a>
48
  </span>
 
49
  </div>
50
- </div>
51
 
52
- {# The table #}
53
- <table id="wpra-crons-tool-table" class="widefat fixed striped">
54
- <thead>
55
- <tr>
56
- <th class="wpra-crons-feed-id-col"></th>
57
- <th class="wpra-crons-feed-name-col">{% trans "Feed" %}</th>
58
- <th class="wpra-crons-interval-col">{% trans "Interval" %}</th>
59
- <th class="wpra-crons-time-col">{% trans "Time" %}</th>
60
- </tr>
61
- </thead>
62
- <tbody>
63
- </tbody>
64
- </table>
 
65
  </div>
66
 
67
  <style type="text/css">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  #wpra-crons-toolbar {
69
  display: block;
70
- position: sticky;
71
- top: 32px;
72
  width: 100%;
73
- padding: 10px 10px 0;
74
- margin-bottom: 5px;
75
  line-height: 30px;
76
  box-sizing: border-box;
77
  }
78
 
79
  #wpra-crons-timeline {
 
 
80
  display: block;
81
  width: 100%;
82
  overflow-x: auto;
@@ -85,8 +133,9 @@
85
  padding: 10px 0;
86
  background: #fff;
87
  border: 1px solid #ccd0d4;
88
- box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
89
  box-sizing: border-box;
 
90
  }
91
 
92
  #wpra-crons-timeline-canvas {
@@ -96,6 +145,7 @@
96
  #wpra-crons-tool-table tbody tr {
97
  cursor: pointer;
98
  }
 
99
  #wpra-crons-tool-table tbody tr td {
100
  border-width: 1px 0;
101
  border-style: solid;
@@ -142,14 +192,21 @@
142
  color: #999;
143
  }
144
 
 
 
 
 
 
145
  .wpra-crons-pagination {
146
  display: inline-block;
147
  float: right;
148
  }
 
149
  .wpra-crons-pagination-info,
150
  .wpra-crons-pagination-buttons {
151
  display: inline-block;
152
  }
 
153
  .wpra-crons-pagination-buttons {
154
  margin-left: 5px;
155
  }
 
 
1
  <div id="wpra-crons">
2
+ <div class="wpra-crons-loading">
3
+ <span class="wpra-crons-loading-text">Loading</span>
4
+ <div class="wpra-crons-loading-bar-container">
5
+ <div class="wpra-crons-loading-bar"></div>
6
+ </div>
7
  </div>
8
 
9
+ <div class="wpra-crons-wrap">
10
+ {# the timeline diagram #}
11
+ <div id="wpra-crons-timeline">
12
+ <canvas id="wpra-crons-timeline-canvas" height="150"></canvas>
13
+ </div>
14
+
15
+ {# Toolbar #}
16
+ <div id="wpra-crons-toolbar">
17
+ {# Pagination #}
18
+ <div class="wpra-crons-pagination">
19
+ <div class="wpra-crons-pagination-info">
20
+ {{ "{number} feeds"|trans|replace({'{number}': '<span class="wpra-crons-num-feeds"></span>'})|raw }}
21
+ </div>
22
+ <div class="wpra-crons-pagination-buttons">
23
+ <button id="wpra-crons-first-page" class="button" disabled>&laquo;</button>
24
+ <button id="wpra-crons-prev-page" class="button" disabled>&lsaquo;</button>
25
+ <span class="wpra-crons-page-indicator">
26
+ {% set currPageSpan = '<span class="wpra-crons-curr-page">1</span>' %}
27
+ {% set numPagesSpan = '<span class="wpra-crons-num-pages">1</span>' %}
28
+ {{ "{page} of {pages}"|trans|replace({'{page}': currPageSpan, '{pages}': numPagesSpan})|raw }}
29
  </span>
30
+ <button id="wpra-crons-next-page" class="button" disabled>&rsaquo;</button>
31
+ <button id="wpra-crons-last-page" class="button" disabled>&raquo;</button>
32
+ </div>
33
  </div>
 
34
 
35
+ {# Loading text #}
36
+ <span id="wpra-crons-loading">{% trans "Loading" %}</span>
37
 
38
+ {# Info panel #}
39
+ <div class="wpra-crons-info">
40
  <span>
41
  <strong>{% trans "Global Interval:" %}</strong>
42
  <code class="wpra-crons-global-interval"></code>
43
  </span>
44
+ <span>
45
  <strong>{% trans "Global Time:" %}</strong>
46
  <code class="wpra-crons-global-time"></code>
47
  </span>
48
 
49
+ <span>
50
  <a class="button wpra-crons-download-timeline">
51
  {% trans "Download Timeline Image" %}
52
  </a>
53
  </span>
54
+ </div>
55
  </div>
 
56
 
57
+ {# The table #}
58
+ <table id="wpra-crons-tool-table" class="widefat fixed striped">
59
+ <thead>
60
+ <tr>
61
+ <th class="wpra-crons-feed-id-col"></th>
62
+ <th class="wpra-crons-feed-name-col">{% trans "Feed" %}</th>
63
+ <th class="wpra-crons-interval-col">{% trans "Interval" %}</th>
64
+ <th class="wpra-crons-time-col">{% trans "Time" %}</th>
65
+ </tr>
66
+ </thead>
67
+ <tbody>
68
+ </tbody>
69
+ </table>
70
+ </div>
71
  </div>
72
 
73
  <style type="text/css">
74
+ #wpra-crons {
75
+ position: relative;
76
+ }
77
+
78
+ .wpra-crons-loading {
79
+ display: none;
80
+ position: relative;
81
+ width: 30%;
82
+ margin: 30px auto 20px;
83
+ text-align: center;
84
+ }
85
+
86
+ .wpra-crons-loading-text {
87
+ font-size: 20px;
88
+ color: #999;
89
+ font-weight: bold;
90
+ text-shadow: 0 1px 0 #fff;
91
+ }
92
+
93
+ .wpra-crons-loading-bar-container,
94
+ .wpra-crons-loading-bar {
95
+ display: block;
96
+ width: 100%;
97
+ height: 6px;
98
+ margin: 10px auto;
99
+ border-radius: 3px;
100
+ }
101
+
102
+ .wpra-crons-loading-bar-container {
103
+ background-color: #ccc;
104
+ }
105
+
106
+ .wpra-crons-loading-bar {
107
+ background-color: #0073AA;
108
+ transition: 0.1s linear width;
109
+ }
110
+
111
+ .wpra-crons-loading-text,
112
+ .wpra-crons-loading-bar {
113
+ animation: 0.8s ease-in-out infinite wpra-crons-loading-anim;
114
+ }
115
+
116
  #wpra-crons-toolbar {
117
  display: block;
 
 
118
  width: 100%;
119
+ padding: 0;
120
+ margin: 10px 0 5px;
121
  line-height: 30px;
122
  box-sizing: border-box;
123
  }
124
 
125
  #wpra-crons-timeline {
126
+ position: sticky;
127
+ top: 32px;
128
  display: block;
129
  width: 100%;
130
  overflow-x: auto;
133
  padding: 10px 0;
134
  background: #fff;
135
  border: 1px solid #ccd0d4;
136
+ box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1);
137
  box-sizing: border-box;
138
+ z-index: 100;
139
  }
140
 
141
  #wpra-crons-timeline-canvas {
145
  #wpra-crons-tool-table tbody tr {
146
  cursor: pointer;
147
  }
148
+
149
  #wpra-crons-tool-table tbody tr td {
150
  border-width: 1px 0;
151
  border-style: solid;
192
  color: #999;
193
  }
194
 
195
+ .wpra-crons-reset-interval,
196
+ .wpra-crons-reset-time {
197
+ margin-left: 8px;
198
+ }
199
+
200
  .wpra-crons-pagination {
201
  display: inline-block;
202
  float: right;
203
  }
204
+
205
  .wpra-crons-pagination-info,
206
  .wpra-crons-pagination-buttons {
207
  display: inline-block;
208
  }
209
+
210
  .wpra-crons-pagination-buttons {
211
  margin-left: 5px;
212
  }
test/bootstrap.php DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
-
3
- global $vendorDir;
4
- $vendorDir = __DIR__ . '/../vendor/';
5
-
6
- require_once $vendorDir . 'autoload.php';
7
-
8
- /**
9
- * Loads a WordPress file.
10
- *
11
- * @since [*next-version*]
12
- *
13
- * @param string $relPath The path relative to a WordPress installation's root directory.
14
- */
15
- function wpraTestLoadWpFile($relPath)
16
- {
17
- global $vendorDir;
18
-
19
- require_once $vendorDir . 'johnpbloch/wordpress-core/' . $relPath;
20
- }
21
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit1ed1f237c7c03e77bb8213b884aea306::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60::getLoader();
vendor/composer/autoload_classmap.php CHANGED
@@ -539,6 +539,7 @@ return array(
539
  'Twig\\Node\\EmbedNode' => $vendorDir . '/twig/twig/src/Node/EmbedNode.php',
540
  'Twig\\Node\\Expression\\AbstractExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AbstractExpression.php',
541
  'Twig\\Node\\Expression\\ArrayExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrayExpression.php',
 
542
  'Twig\\Node\\Expression\\AssignNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
543
  'Twig\\Node\\Expression\\Binary\\AbstractBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
544
  'Twig\\Node\\Expression\\Binary\\AddBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
@@ -638,6 +639,7 @@ return array(
638
  'Twig\\Test\\NodeTestCase' => $vendorDir . '/twig/twig/src/Test/NodeTestCase.php',
639
  'Twig\\Token' => $vendorDir . '/twig/twig/src/Token.php',
640
  'Twig\\TokenParser\\AbstractTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
 
641
  'Twig\\TokenParser\\AutoEscapeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
642
  'Twig\\TokenParser\\BlockTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/BlockTokenParser.php',
643
  'Twig\\TokenParser\\DeprecatedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php',
539
  'Twig\\Node\\EmbedNode' => $vendorDir . '/twig/twig/src/Node/EmbedNode.php',
540
  'Twig\\Node\\Expression\\AbstractExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AbstractExpression.php',
541
  'Twig\\Node\\Expression\\ArrayExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrayExpression.php',
542
+ 'Twig\\Node\\Expression\\ArrowFunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php',
543
  'Twig\\Node\\Expression\\AssignNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
544
  'Twig\\Node\\Expression\\Binary\\AbstractBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
545
  'Twig\\Node\\Expression\\Binary\\AddBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
639
  'Twig\\Test\\NodeTestCase' => $vendorDir . '/twig/twig/src/Test/NodeTestCase.php',
640
  'Twig\\Token' => $vendorDir . '/twig/twig/src/Token.php',
641
  'Twig\\TokenParser\\AbstractTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
642
+ 'Twig\\TokenParser\\ApplyTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ApplyTokenParser.php',
643
  'Twig\\TokenParser\\AutoEscapeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
644
  'Twig\\TokenParser\\BlockTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/BlockTokenParser.php',
645
  'Twig\\TokenParser\\DeprecatedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php',
vendor/composer/autoload_psr4.php CHANGED
@@ -17,18 +17,18 @@ return array(
17
  'PhpDocReader\\' => array($vendorDir . '/php-di/phpdoc-reader/src/PhpDocReader'),
18
  'Invoker\\' => array($vendorDir . '/php-di/invoker/src'),
19
  'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container', $vendorDir . '/container-interop/service-provider/src'),
20
- 'Dhii\\Validation\\' => array($vendorDir . '/dhii/validation-interface/src', $vendorDir . '/dhii/validation-abstract/src', $vendorDir . '/dhii/validation-base/src'),
21
  'Dhii\\Util\\String\\' => array($vendorDir . '/dhii/stringable-interface/src'),
22
  'Dhii\\Util\\Normalization\\' => array($vendorDir . '/dhii/normalization-helper-base/src'),
23
  'Dhii\\Transformer\\' => array($vendorDir . '/dhii/transformer-interface/src'),
24
- 'Dhii\\Stats\\' => array($vendorDir . '/dhii/stats-interface/src', $vendorDir . '/dhii/stats-abstract/src'),
25
- 'Dhii\\Output\\' => array($vendorDir . '/dhii/output-renderer-interface/src', $vendorDir . '/dhii/output-renderer-abstract/src', $vendorDir . '/dhii/output-renderer-base/src'),
26
  'Dhii\\Iterator\\' => array($vendorDir . '/dhii/iterator-helper-base/src'),
27
- 'Dhii\\I18n\\' => array($vendorDir . '/dhii/i18n-interface/src', $vendorDir . '/dhii/i18n-helper-base/src'),
28
  'Dhii\\Factory\\' => array($vendorDir . '/dhii/factory-interface/src'),
29
- 'Dhii\\Exception\\' => array($vendorDir . '/dhii/exception-interface/src', $vendorDir . '/dhii/exception/src'),
30
- 'Dhii\\Di\\' => array($vendorDir . '/dhii/di-interface/src', $vendorDir . '/dhii/di-abstract/src', $vendorDir . '/dhii/di/src'),
31
  'Dhii\\Data\\Container\\' => array($vendorDir . '/dhii/container-helper-base/src'),
32
- 'Dhii\\Collection\\' => array($vendorDir . '/dhii/collections-interface/src', $vendorDir . '/dhii/collections-abstract-base/src', $vendorDir . '/dhii/collections-abstract/src'),
33
  'DI\\' => array($vendorDir . '/php-di/php-di/src/DI'),
34
  );
17
  'PhpDocReader\\' => array($vendorDir . '/php-di/phpdoc-reader/src/PhpDocReader'),
18
  'Invoker\\' => array($vendorDir . '/php-di/invoker/src'),
19
  'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container', $vendorDir . '/container-interop/service-provider/src'),
20
+ 'Dhii\\Validation\\' => array($vendorDir . '/dhii/validation-abstract/src', $vendorDir . '/dhii/validation-base/src', $vendorDir . '/dhii/validation-interface/src'),
21
  'Dhii\\Util\\String\\' => array($vendorDir . '/dhii/stringable-interface/src'),
22
  'Dhii\\Util\\Normalization\\' => array($vendorDir . '/dhii/normalization-helper-base/src'),
23
  'Dhii\\Transformer\\' => array($vendorDir . '/dhii/transformer-interface/src'),
24
+ 'Dhii\\Stats\\' => array($vendorDir . '/dhii/stats-abstract/src', $vendorDir . '/dhii/stats-interface/src'),
25
+ 'Dhii\\Output\\' => array($vendorDir . '/dhii/output-renderer-abstract/src', $vendorDir . '/dhii/output-renderer-base/src', $vendorDir . '/dhii/output-renderer-interface/src'),
26
  'Dhii\\Iterator\\' => array($vendorDir . '/dhii/iterator-helper-base/src'),
27
+ 'Dhii\\I18n\\' => array($vendorDir . '/dhii/i18n-helper-base/src', $vendorDir . '/dhii/i18n-interface/src'),
28
  'Dhii\\Factory\\' => array($vendorDir . '/dhii/factory-interface/src'),
29
+ 'Dhii\\Exception\\' => array($vendorDir . '/dhii/exception/src', $vendorDir . '/dhii/exception-interface/src'),
30
+ 'Dhii\\Di\\' => array($vendorDir . '/dhii/di/src', $vendorDir . '/dhii/di-abstract/src', $vendorDir . '/dhii/di-interface/src'),
31
  'Dhii\\Data\\Container\\' => array($vendorDir . '/dhii/container-helper-base/src'),
32
+ 'Dhii\\Collection\\' => array($vendorDir . '/dhii/collections-abstract/src', $vendorDir . '/dhii/collections-abstract-base/src', $vendorDir . '/dhii/collections-interface/src'),
33
  'DI\\' => array($vendorDir . '/php-di/php-di/src/DI'),
34
  );
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit1ed1f237c7c03e77bb8213b884aea306
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit1ed1f237c7c03e77bb8213b884aea306
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit1ed1f237c7c03e77bb8213b884aea306', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit1ed1f237c7c03e77bb8213b884aea306', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInit1ed1f237c7c03e77bb8213b884aea306
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequire1ed1f237c7c03e77bb8213b884aea306($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequire1ed1f237c7c03e77bb8213b884aea306($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit46c8b76c439f86ad826af1a4d36b4e60', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequire46c8b76c439f86ad826af1a4d36b4e60($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
+ function composerRequire46c8b76c439f86ad826af1a4d36b4e60($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
8
  {
9
  public static $files = array (
10
  '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
@@ -105,9 +105,9 @@ class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
105
  ),
106
  'Dhii\\Validation\\' =>
107
  array (
108
- 0 => __DIR__ . '/..' . '/dhii/validation-interface/src',
109
- 1 => __DIR__ . '/..' . '/dhii/validation-abstract/src',
110
- 2 => __DIR__ . '/..' . '/dhii/validation-base/src',
111
  ),
112
  'Dhii\\Util\\String\\' =>
113
  array (
@@ -123,14 +123,14 @@ class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
123
  ),
124
  'Dhii\\Stats\\' =>
125
  array (
126
- 0 => __DIR__ . '/..' . '/dhii/stats-interface/src',
127
- 1 => __DIR__ . '/..' . '/dhii/stats-abstract/src',
128
  ),
129
  'Dhii\\Output\\' =>
130
  array (
131
- 0 => __DIR__ . '/..' . '/dhii/output-renderer-interface/src',
132
- 1 => __DIR__ . '/..' . '/dhii/output-renderer-abstract/src',
133
- 2 => __DIR__ . '/..' . '/dhii/output-renderer-base/src',
134
  ),
135
  'Dhii\\Iterator\\' =>
136
  array (
@@ -138,8 +138,8 @@ class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
138
  ),
139
  'Dhii\\I18n\\' =>
140
  array (
141
- 0 => __DIR__ . '/..' . '/dhii/i18n-interface/src',
142
- 1 => __DIR__ . '/..' . '/dhii/i18n-helper-base/src',
143
  ),
144
  'Dhii\\Factory\\' =>
145
  array (
@@ -147,14 +147,14 @@ class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
147
  ),
148
  'Dhii\\Exception\\' =>
149
  array (
150
- 0 => __DIR__ . '/..' . '/dhii/exception-interface/src',
151
- 1 => __DIR__ . '/..' . '/dhii/exception/src',
152
  ),
153
  'Dhii\\Di\\' =>
154
  array (
155
- 0 => __DIR__ . '/..' . '/dhii/di-interface/src',
156
  1 => __DIR__ . '/..' . '/dhii/di-abstract/src',
157
- 2 => __DIR__ . '/..' . '/dhii/di/src',
158
  ),
159
  'Dhii\\Data\\Container\\' =>
160
  array (
@@ -162,9 +162,9 @@ class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
162
  ),
163
  'Dhii\\Collection\\' =>
164
  array (
165
- 0 => __DIR__ . '/..' . '/dhii/collections-interface/src',
166
  1 => __DIR__ . '/..' . '/dhii/collections-abstract-base/src',
167
- 2 => __DIR__ . '/..' . '/dhii/collections-abstract/src',
168
  ),
169
  'DI\\' =>
170
  array (
@@ -727,6 +727,7 @@ class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
727
  'Twig\\Node\\EmbedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmbedNode.php',
728
  'Twig\\Node\\Expression\\AbstractExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AbstractExpression.php',
729
  'Twig\\Node\\Expression\\ArrayExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrayExpression.php',
 
730
  'Twig\\Node\\Expression\\AssignNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
731
  'Twig\\Node\\Expression\\Binary\\AbstractBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
732
  'Twig\\Node\\Expression\\Binary\\AddBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
@@ -826,6 +827,7 @@ class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
826
  'Twig\\Test\\NodeTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/NodeTestCase.php',
827
  'Twig\\Token' => __DIR__ . '/..' . '/twig/twig/src/Token.php',
828
  'Twig\\TokenParser\\AbstractTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
 
829
  'Twig\\TokenParser\\AutoEscapeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
830
  'Twig\\TokenParser\\BlockTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/BlockTokenParser.php',
831
  'Twig\\TokenParser\\DeprecatedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php',
@@ -1079,10 +1081,10 @@ class ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306
1079
  public static function getInitializer(ClassLoader $loader)
1080
  {
1081
  return \Closure::bind(function () use ($loader) {
1082
- $loader->prefixLengthsPsr4 = ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306::$prefixLengthsPsr4;
1083
- $loader->prefixDirsPsr4 = ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306::$prefixDirsPsr4;
1084
- $loader->prefixesPsr0 = ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306::$prefixesPsr0;
1085
- $loader->classMap = ComposerStaticInit1ed1f237c7c03e77bb8213b884aea306::$classMap;
1086
 
1087
  }, null, ClassLoader::class);
1088
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60
8
  {
9
  public static $files = array (
10
  '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
105
  ),
106
  'Dhii\\Validation\\' =>
107
  array (
108
+ 0 => __DIR__ . '/..' . '/dhii/validation-abstract/src',
109
+ 1 => __DIR__ . '/..' . '/dhii/validation-base/src',
110
+ 2 => __DIR__ . '/..' . '/dhii/validation-interface/src',
111
  ),
112
  'Dhii\\Util\\String\\' =>
113
  array (
123
  ),
124
  'Dhii\\Stats\\' =>
125
  array (
126
+ 0 => __DIR__ . '/..' . '/dhii/stats-abstract/src',
127
+ 1 => __DIR__ . '/..' . '/dhii/stats-interface/src',
128
  ),
129
  'Dhii\\Output\\' =>
130
  array (
131
+ 0 => __DIR__ . '/..' . '/dhii/output-renderer-abstract/src',
132
+ 1 => __DIR__ . '/..' . '/dhii/output-renderer-base/src',
133
+ 2 => __DIR__ . '/..' . '/dhii/output-renderer-interface/src',
134
  ),
135
  'Dhii\\Iterator\\' =>
136
  array (
138
  ),
139
  'Dhii\\I18n\\' =>
140
  array (
141
+ 0 => __DIR__ . '/..' . '/dhii/i18n-helper-base/src',
142
+ 1 => __DIR__ . '/..' . '/dhii/i18n-interface/src',
143
  ),
144
  'Dhii\\Factory\\' =>
145
  array (
147
  ),
148
  'Dhii\\Exception\\' =>
149
  array (
150
+ 0 => __DIR__ . '/..' . '/dhii/exception/src',
151
+ 1 => __DIR__ . '/..' . '/dhii/exception-interface/src',
152
  ),
153
  'Dhii\\Di\\' =>
154
  array (
155
+ 0 => __DIR__ . '/..' . '/dhii/di/src',
156
  1 => __DIR__ . '/..' . '/dhii/di-abstract/src',
157
+ 2 => __DIR__ . '/..' . '/dhii/di-interface/src',
158
  ),
159
  'Dhii\\Data\\Container\\' =>
160
  array (
162
  ),
163
  'Dhii\\Collection\\' =>
164
  array (
165
+ 0 => __DIR__ . '/..' . '/dhii/collections-abstract/src',
166
  1 => __DIR__ . '/..' . '/dhii/collections-abstract-base/src',
167
+ 2 => __DIR__ . '/..' . '/dhii/collections-interface/src',
168
  ),
169
  'DI\\' =>
170
  array (
727
  'Twig\\Node\\EmbedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmbedNode.php',
728
  'Twig\\Node\\Expression\\AbstractExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AbstractExpression.php',
729
  'Twig\\Node\\Expression\\ArrayExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrayExpression.php',
730
+ 'Twig\\Node\\Expression\\ArrowFunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php',
731
  'Twig\\Node\\Expression\\AssignNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
732
  'Twig\\Node\\Expression\\Binary\\AbstractBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
733
  'Twig\\Node\\Expression\\Binary\\AddBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
827
  'Twig\\Test\\NodeTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/NodeTestCase.php',
828
  'Twig\\Token' => __DIR__ . '/..' . '/twig/twig/src/Token.php',
829
  'Twig\\TokenParser\\AbstractTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
830
+ 'Twig\\TokenParser\\ApplyTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ApplyTokenParser.php',
831
  'Twig\\TokenParser\\AutoEscapeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
832
  'Twig\\TokenParser\\BlockTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/BlockTokenParser.php',
833
  'Twig\\TokenParser\\DeprecatedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php',
1081
  public static function getInitializer(ClassLoader $loader)
1082
  {
1083
  return \Closure::bind(function () use ($loader) {
1084
+ $loader->prefixLengthsPsr4 = ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60::$prefixLengthsPsr4;
1085
+ $loader->prefixDirsPsr4 = ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60::$prefixDirsPsr4;
1086
+ $loader->prefixesPsr0 = ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60::$prefixesPsr0;
1087
+ $loader->classMap = ComposerStaticInit46c8b76c439f86ad826af1a4d36b4e60::$classMap;
1088
 
1089
  }, null, ClassLoader::class);
1090
  }
vendor/composer/installed.json CHANGED
@@ -30,7 +30,8 @@
30
  "MIT"
31
  ],
32
  "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
33
- "homepage": "https://github.com/container-interop/container-interop"
 
34
  },
35
  {
36
  "name": "container-interop/service-provider",
@@ -812,7 +813,8 @@
812
  "email": "development@dhii.co"
813
  }
814
  ],
815
- "description": "Common abstract functionality for output renderers."
 
816
  },
817
  {
818
  "name": "dhii/output-renderer-base",
@@ -868,21 +870,22 @@
868
  "email": "development@dhii.co"
869
  }
870
  ],
871
- "description": "Base concrete functionality for output rendering."
 
872
  },
873
  {
874
  "name": "dhii/output-renderer-interface",
875
- "version": "v0.3-alpha2",
876
- "version_normalized": "0.3.0.0-alpha2",
877
  "source": {
878
  "type": "git",
879
  "url": "https://github.com/Dhii/output-renderer-interface.git",
880
- "reference": "de48ea589e5e1caa1191f588a3aea7623ccbaf44"
881
  },
882
  "dist": {
883
  "type": "zip",
884
- "url": "https://api.github.com/repos/Dhii/output-renderer-interface/zipball/de48ea589e5e1caa1191f588a3aea7623ccbaf44",
885
- "reference": "de48ea589e5e1caa1191f588a3aea7623ccbaf44",
886
  "shasum": ""
887
  },
888
  "require": {
@@ -901,7 +904,7 @@
901
  "suggest": {
902
  "dhii/container-helper-base": "Useful for reading data from different context types uniformly"
903
  },
904
- "time": "2018-06-02T18:49:35+00:00",
905
  "type": "library",
906
  "extra": {
907
  "branch-alias": {
@@ -1273,17 +1276,17 @@
1273
  },
1274
  {
1275
  "name": "erusev/parsedown",
1276
- "version": "1.7.3",
1277
- "version_normalized": "1.7.3.0",
1278
  "source": {
1279
  "type": "git",
1280
  "url": "https://github.com/erusev/parsedown.git",
1281
- "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7"
1282
  },
1283
  "dist": {
1284
  "type": "zip",
1285
- "url": "https://api.github.com/repos/erusev/parsedown/zipball/6d893938171a817f4e9bc9e86f2da1e370b7bcd7",
1286
- "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7",
1287
  "shasum": ""
1288
  },
1289
  "require": {
@@ -1293,7 +1296,7 @@
1293
  "require-dev": {
1294
  "phpunit/phpunit": "^4.8.35"
1295
  },
1296
- "time": "2019-03-17T18:48:37+00:00",
1297
  "type": "library",
1298
  "installation-source": "dist",
1299
  "autoload": {
@@ -1612,17 +1615,17 @@
1612
  },
1613
  {
1614
  "name": "symfony/polyfill-ctype",
1615
- "version": "v1.12.0",
1616
- "version_normalized": "1.12.0.0",
1617
  "source": {
1618
  "type": "git",
1619
  "url": "https://github.com/symfony/polyfill-ctype.git",
1620
- "reference": "550ebaac289296ce228a706d0867afc34687e3f4"
1621
  },
1622
  "dist": {
1623
  "type": "zip",
1624
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4",
1625
- "reference": "550ebaac289296ce228a706d0867afc34687e3f4",
1626
  "shasum": ""
1627
  },
1628
  "require": {
@@ -1631,11 +1634,11 @@
1631
  "suggest": {
1632
  "ext-ctype": "For best performance"
1633
  },
1634
- "time": "2019-08-06T08:03:45+00:00",
1635
  "type": "library",
1636
  "extra": {
1637
  "branch-alias": {
1638
- "dev-master": "1.12-dev"
1639
  }
1640
  },
1641
  "installation-source": "dist",
@@ -1729,17 +1732,17 @@
1729
  },
1730
  {
1731
  "name": "twig/twig",
1732
- "version": "v1.39.0",
1733
- "version_normalized": "1.39.0.0",
1734
  "source": {
1735
  "type": "git",
1736
  "url": "https://github.com/twigphp/Twig.git",
1737
- "reference": "44890db076c3f0db2bb627a81b246b617bd2413a"
1738
  },
1739
  "dist": {
1740
  "type": "zip",
1741
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/44890db076c3f0db2bb627a81b246b617bd2413a",
1742
- "reference": "44890db076c3f0db2bb627a81b246b617bd2413a",
1743
  "shasum": ""
1744
  },
1745
  "require": {
@@ -1751,11 +1754,11 @@
1751
  "symfony/debug": "^2.7",
1752
  "symfony/phpunit-bridge": "^3.4.19|^4.1.8"
1753
  },
1754
- "time": "2019-04-16T12:35:10+00:00",
1755
  "type": "library",
1756
  "extra": {
1757
  "branch-alias": {
1758
- "dev-master": "1.39-dev"
1759
  }
1760
  },
1761
  "installation-source": "dist",
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",
813
  "email": "development@dhii.co"
814
  }
815
  ],
816
+ "description": "Common abstract functionality for output renderers.",
817
+ "abandoned": true
818
  },
819
  {
820
  "name": "dhii/output-renderer-base",
870
  "email": "development@dhii.co"
871
  }
872
  ],
873
+ "description": "Base concrete functionality for output rendering.",
874
+ "abandoned": true
875
  },
876
  {
877
  "name": "dhii/output-renderer-interface",
878
+ "version": "v0.3",
879
+ "version_normalized": "0.3.0.0",
880
  "source": {
881
  "type": "git",
882
  "url": "https://github.com/Dhii/output-renderer-interface.git",
883
+ "reference": "407014d7fd1af0427958f2acd61aff008ee9e032"
884
  },
885
  "dist": {
886
  "type": "zip",
887
+ "url": "https://api.github.com/repos/Dhii/output-renderer-interface/zipball/407014d7fd1af0427958f2acd61aff008ee9e032",
888
+ "reference": "407014d7fd1af0427958f2acd61aff008ee9e032",
889
  "shasum": ""
890
  },
891
  "require": {
904
  "suggest": {
905
  "dhii/container-helper-base": "Useful for reading data from different context types uniformly"
906
  },
907
+ "time": "2019-11-14T11:20:00+00:00",
908
  "type": "library",
909
  "extra": {
910
  "branch-alias": {
1276
  },
1277
  {
1278
  "name": "erusev/parsedown",
1279
+ "version": "1.7.4",
1280
+ "version_normalized": "1.7.4.0",
1281
  "source": {
1282
  "type": "git",
1283
  "url": "https://github.com/erusev/parsedown.git",
1284
+ "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3"
1285
  },
1286
  "dist": {
1287
  "type": "zip",
1288
+ "url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
1289
+ "reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
1290
  "shasum": ""
1291
  },
1292
  "require": {
1296
  "require-dev": {
1297
  "phpunit/phpunit": "^4.8.35"
1298
  },
1299
+ "time": "2019-12-30T22:54:17+00:00",
1300
  "type": "library",
1301
  "installation-source": "dist",
1302
  "autoload": {
1615
  },
1616
  {
1617
  "name": "symfony/polyfill-ctype",
1618
+ "version": "v1.13.1",
1619
+ "version_normalized": "1.13.1.0",
1620
  "source": {
1621
  "type": "git",
1622
  "url": "https://github.com/symfony/polyfill-ctype.git",
1623
+ "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3"
1624
  },
1625
  "dist": {
1626
  "type": "zip",
1627
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
1628
+ "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
1629
  "shasum": ""
1630
  },
1631
  "require": {
1634
  "suggest": {
1635
  "ext-ctype": "For best performance"
1636
  },
1637
+ "time": "2019-11-27T13:56:44+00:00",
1638
  "type": "library",
1639
  "extra": {
1640
  "branch-alias": {
1641
+ "dev-master": "1.13-dev"
1642
  }
1643
  },
1644
  "installation-source": "dist",
1732
  },
1733
  {
1734
  "name": "twig/twig",
1735
+ "version": "v1.41.0",
1736
+ "version_normalized": "1.41.0.0",
1737
  "source": {
1738
  "type": "git",
1739
  "url": "https://github.com/twigphp/Twig.git",
1740
+ "reference": "575cd5028362da591facde1ef5d7b94553c375c9"
1741
  },
1742
  "dist": {
1743
  "type": "zip",
1744
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/575cd5028362da591facde1ef5d7b94553c375c9",
1745
+ "reference": "575cd5028362da591facde1ef5d7b94553c375c9",
1746
  "shasum": ""
1747
  },
1748
  "require": {
1754
  "symfony/debug": "^2.7",
1755
  "symfony/phpunit-bridge": "^3.4.19|^4.1.8"
1756
  },
1757
+ "time": "2019-05-14T11:59:08+00:00",
1758
  "type": "library",
1759
  "extra": {
1760
  "branch-alias": {
1761
+ "dev-master": "1.41-dev"
1762
  }
1763
  },
1764
  "installation-source": "dist",
vendor/dhii/output-renderer-interface/src/BlockFactoryInterface.php CHANGED
@@ -7,21 +7,21 @@ use Dhii\Factory\FactoryInterface;
7
  /**
8
  * Something that can create blocks.
9
  *
10
- * @since [*next-version*]
11
  */
12
  interface BlockFactoryInterface extends FactoryInterface
13
  {
14
  /**
15
  * The make config key that holds the content of the block.
16
  *
17
- * @since [*next-version*]
18
  */
19
  const K_CONTENT = 'content';
20
 
21
  /**
22
  * {@inheritdoc}
23
  *
24
- * @since [*next-version*]
25
  *
26
  * @return BlockInterface The new block
27
  */
7
  /**
8
  * Something that can create blocks.
9
  *
10
+ * @since 0.3
11
  */
12
  interface BlockFactoryInterface extends FactoryInterface
13
  {
14
  /**
15
  * The make config key that holds the content of the block.
16
  *
17
+ * @since 0.3
18
  */
19
  const K_CONTENT = 'content';
20
 
21
  /**
22
  * {@inheritdoc}
23
  *
24
+ * @since 0.3
25
  *
26
  * @return BlockInterface The new block
27
  */
vendor/dhii/output-renderer-interface/src/TemplateFactoryInterface.php CHANGED
@@ -7,21 +7,21 @@ use Dhii\Factory\FactoryInterface;
7
  /**
8
  * Something that can create templates.
9
  *
10
- * @since [*next-version*]
11
  */
12
  interface TemplateFactoryInterface extends FactoryInterface
13
  {
14
  /**
15
  * The make config key that holds the template, which the new instance will represent.
16
  *
17
- * @since [*next-version*]
18
  */
19
  const K_TEMPLATE = 'template';
20
 
21
  /**
22
  * {@inheritdoc}
23
  *
24
- * @since [*next-version*]
25
  *
26
  * @return TemplateInterface The new template.
27
  */
7
  /**
8
  * Something that can create templates.
9
  *
10
+ * @since 0.3
11
  */
12
  interface TemplateFactoryInterface extends FactoryInterface
13
  {
14
  /**
15
  * The make config key that holds the template, which the new instance will represent.
16
  *
17
+ * @since 0.3
18
  */
19
  const K_TEMPLATE = 'template';
20
 
21
  /**
22
  * {@inheritdoc}
23
  *
24
+ * @since 0.3
25
  *
26
  * @return TemplateInterface The new template.
27
  */
vendor/erusev/parsedown/Parsedown.php CHANGED
@@ -17,7 +17,7 @@ class Parsedown
17
  {
18
  # ~
19
 
20
- const version = '1.7.3';
21
 
22
  # ~
23
 
@@ -1489,22 +1489,41 @@ class Parsedown
1489
  }
1490
  }
1491
 
 
 
1492
  if (isset($Element['text']))
 
 
 
 
 
 
 
 
 
 
 
 
 
1493
  {
1494
  $markup .= '>';
1495
 
1496
- if (!isset($Element['nonNestables']))
1497
  {
1498
  $Element['nonNestables'] = array();
1499
  }
1500
 
1501
  if (isset($Element['handler']))
1502
  {
1503
- $markup .= $this->{$Element['handler']}($Element['text'], $Element['nonNestables']);
 
 
 
 
1504
  }
1505
  else
1506
  {
1507
- $markup .= self::escape($Element['text'], true);
1508
  }
1509
 
1510
  $markup .= '</'.$Element['name'].'>';
17
  {
18
  # ~
19
 
20
+ const version = '1.7.4';
21
 
22
  # ~
23
 
1489
  }
1490
  }
1491
 
1492
+ $permitRawHtml = false;
1493
+
1494
  if (isset($Element['text']))
1495
+ {
1496
+ $text = $Element['text'];
1497
+ }
1498
+ // very strongly consider an alternative if you're writing an
1499
+ // extension
1500
+ elseif (isset($Element['rawHtml']))
1501
+ {
1502
+ $text = $Element['rawHtml'];
1503
+ $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode'];
1504
+ $permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode;
1505
+ }
1506
+
1507
+ if (isset($text))
1508
  {
1509
  $markup .= '>';
1510
 
1511
+ if (!isset($Element['nonNestables']))
1512
  {
1513
  $Element['nonNestables'] = array();
1514
  }
1515
 
1516
  if (isset($Element['handler']))
1517
  {
1518
+ $markup .= $this->{$Element['handler']}($text, $Element['nonNestables']);
1519
+ }
1520
+ elseif (!$permitRawHtml)
1521
+ {
1522
+ $markup .= self::escape($text, true);
1523
  }
1524
  else
1525
  {
1526
+ $markup .= $text;
1527
  }
1528
 
1529
  $markup .= '</'.$Element['name'].'>';
vendor/symfony/polyfill-ctype/composer.json CHANGED
@@ -28,7 +28,7 @@
28
  "minimum-stability": "dev",
29
  "extra": {
30
  "branch-alias": {
31
- "dev-master": "1.12-dev"
32
  }
33
  }
34
  }
28
  "minimum-stability": "dev",
29
  "extra": {
30
  "branch-alias": {
31
+ "dev-master": "1.13-dev"
32
  }
33
  }
34
  }
vendor/twig/twig/composer.json CHANGED
@@ -42,7 +42,7 @@
42
  },
43
  "extra": {
44
  "branch-alias": {
45
- "dev-master": "1.39-dev"
46
  }
47
  }
48
  }
42
  },
43
  "extra": {
44
  "branch-alias": {
45
+ "dev-master": "1.41-dev"
46
  }
47
  }
48
  }
vendor/twig/twig/drupal_test.sh ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ set -x
4
+ set -e
5
+
6
+ REPO=`pwd`
7
+ cd /tmp
8
+ rm -rf drupal-twig-test
9
+ composer create-project --no-interaction drupal-composer/drupal-project:8.x-dev drupal-twig-test
10
+ cd drupal-twig-test
11
+ (cd vendor/twig && rm -rf twig && ln -sf $REPO twig)
12
+ echo '$config["system.logging"]["error_level"] = "verbose";' >> web/sites/default/settings.php
13
+ php ./web/core/scripts/drupal install --no-interaction demo_umami > output
14
+ perl -p -i -e 's/^([A-Za-z]+)\: (.+)$/export DRUPAL_\1=\2/' output
15
+ source output
16
+
17
+ wget https://get.symfony.com/cli/installer -O - | bash
18
+ export PATH="$HOME/.symfony/bin:$PATH"
19
+ symfony server:start -d --no-tls
20
+ ENDPOINT=`symfony server:status -no-ansi | sed -E 's/^.+ http/http/'`
21
+
22
+ curl -OLsS https://get.blackfire.io/blackfire-player.phar
23
+ chmod +x blackfire-player.phar
24
+ cat > drupal-tests.bkf <<EOF
25
+ name "Drupal tests"
26
+
27
+ scenario
28
+ name "homepage"
29
+ set name "admin"
30
+ set pass "pass"
31
+
32
+ visit url('/')
33
+ expect status_code() == 200
34
+ click link('Articles')
35
+ expect status_code() == 200
36
+ click link('Dairy-free and delicious milk chocolate')
37
+ expect body() matches "/Dairy\-free milk chocolate is made in largely the same way as regular chocolate/"
38
+ expect status_code() == 200
39
+ click link('Log in')
40
+ expect status_code() == 200
41
+ submit button("Log in")
42
+ param name name
43
+ param pass pass
44
+ expect status_code() == 303
45
+ follow
46
+ expect status_code() == 200
47
+ click link('Structure')
48
+ expect status_code() == 200
49
+ EOF
50
+ ./blackfire-player.phar run drupal-tests.bkf --endpoint=$ENDPOINT --variable name=$DRUPAL_Username --variable pass=$DRUPAL_Password
51
+ symfony server:stop
vendor/twig/twig/src/Environment.php CHANGED
@@ -41,10 +41,10 @@ use Twig\TokenParser\TokenParserInterface;
41
  */
42
  class Environment
43
  {
44
- const VERSION = '1.39.0';
45
- const VERSION_ID = 13900;
46
  const MAJOR_VERSION = 1;
47
- const MINOR_VERSION = 39;
48
  const RELEASE_VERSION = 0;
49
  const EXTRA_VERSION = '';
50
 
@@ -470,6 +470,7 @@ class Environment
470
  $this->cache->load($key);
471
  }
472
 
 
473
  if (!class_exists($cls, false)) {
474
  $loader = $this->getLoader();
475
  if (!$loader instanceof SourceContextLoaderInterface) {
41
  */
42
  class Environment
43
  {
44
+ const VERSION = '1.41.0';
45
+ const VERSION_ID = 14100;
46
  const MAJOR_VERSION = 1;
47
+ const MINOR_VERSION = 41;
48
  const RELEASE_VERSION = 0;
49
  const EXTRA_VERSION = '';
50
 
470
  $this->cache->load($key);
471
  }
472
 
473
+ $source = null;
474
  if (!class_exists($cls, false)) {
475
  $loader = $this->getLoader();
476
  if (!$loader instanceof SourceContextLoaderInterface) {
vendor/twig/twig/src/Error/Error.php CHANGED
@@ -49,15 +49,9 @@ class Error extends \Exception
49
  /**
50
  * Constructor.
51
  *
52
- * Set both the line number and the name to false to
53
- * disable automatic guessing of the original template name
54
- * and line number.
55
- *
56
  * Set the line number to -1 to enable its automatic guessing.
57
  * Set the name to null to enable its automatic guessing.
58
  *
59
- * By default, automatic guessing is enabled.
60
- *
61
  * @param string $message The error message
62
  * @param int $lineno The template line where the error occurred
63
  * @param Source|string|null $source The source context where the error occurred
49
  /**
50
  * Constructor.
51
  *
 
 
 
 
52
  * Set the line number to -1 to enable its automatic guessing.
53
  * Set the name to null to enable its automatic guessing.
54
  *
 
 
55
  * @param string $message The error message
56
  * @param int $lineno The template line where the error occurred
57
  * @param Source|string|null $source The source context where the error occurred
vendor/twig/twig/src/ExpressionParser.php CHANGED
@@ -14,6 +14,7 @@ namespace Twig;
14
 
15
  use Twig\Error\SyntaxError;
16
  use Twig\Node\Expression\ArrayExpression;
 
17
  use Twig\Node\Expression\AssignNameExpression;
18
  use Twig\Node\Expression\Binary\ConcatBinary;
19
  use Twig\Node\Expression\BlockReferenceExpression;
@@ -68,8 +69,12 @@ class ExpressionParser
68
  }
69
  }
70
 
71
- public function parseExpression($precedence = 0)
72
  {
 
 
 
 
73
  $expr = $this->getPrimary();
74
  $token = $this->parser->getCurrentToken();
75
  while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) {
@@ -98,6 +103,64 @@ class ExpressionParser
98
  return $expr;
99
  }
100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  protected function getPrimary()
102
  {
103
  $token = $this->parser->getCurrentToken();
@@ -499,7 +562,7 @@ class ExpressionParser
499
  if (!$this->parser->getStream()->test(Token::PUNCTUATION_TYPE, '(')) {
500
  $arguments = new Node();
501
  } else {
502
- $arguments = $this->parseArguments(true);
503
  }
504
 
505
  $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine());
@@ -526,7 +589,7 @@ class ExpressionParser
526
  *
527
  * @throws SyntaxError
528
  */
529
- public function parseArguments($namedArguments = false, $definition = false)
530
  {
531
  $args = [];
532
  $stream = $this->parser->getStream();
@@ -541,7 +604,7 @@ class ExpressionParser
541
  $token = $stream->expect(Token::NAME_TYPE, null, 'An argument must be a name');
542
  $value = new NameExpression($token->getValue(), $this->parser->getCurrentToken()->getLine());
543
  } else {
544
- $value = $this->parseExpression();
545
  }
546
 
547
  $name = null;
@@ -558,7 +621,7 @@ class ExpressionParser
558
  throw new SyntaxError(sprintf('A default value for an argument must be a constant (a boolean, a string, a number, or an array).'), $token->getLine(), $stream->getSourceContext());
559
  }
560
  } else {
561
- $value = $this->parseExpression();
562
  }
563
  }
564
 
@@ -627,7 +690,7 @@ class ExpressionParser
627
  $class = $this->getTestNodeClass($test);
628
  $arguments = null;
629
  if ($stream->test(Token::PUNCTUATION_TYPE, '(')) {
630
- $arguments = $this->parser->getExpressionParser()->parseArguments(true);
631
  }
632
 
633
  return new $class($node, $name, $arguments, $this->parser->getCurrentToken()->getLine());
14
 
15
  use Twig\Error\SyntaxError;
16
  use Twig\Node\Expression\ArrayExpression;
17
+ use Twig\Node\Expression\ArrowFunctionExpression;
18
  use Twig\Node\Expression\AssignNameExpression;
19
  use Twig\Node\Expression\Binary\ConcatBinary;
20
  use Twig\Node\Expression\BlockReferenceExpression;
69
  }
70
  }
71
 
72
+ public function parseExpression($precedence = 0, $allowArrow = false)
73
  {
74
+ if ($allowArrow && $arrow = $this->parseArrow()) {
75
+ return $arrow;
76
+ }
77
+
78
  $expr = $this->getPrimary();
79
  $token = $this->parser->getCurrentToken();
80
  while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) {
103
  return $expr;
104
  }
105
 
106
+ /**
107
+ * @return ArrowFunctionExpression|null
108
+ */
109
+ private function parseArrow()
110
+ {
111
+ $stream = $this->parser->getStream();
112
+
113
+ // short array syntax (one argument, no parentheses)?
114
+ if ($stream->look(1)->test(Token::ARROW_TYPE)) {
115
+ $line = $stream->getCurrent()->getLine();
116
+ $token = $stream->expect(Token::NAME_TYPE);
117
+ $names = [new AssignNameExpression($token->getValue(), $token->getLine())];
118
+ $stream->expect(Token::ARROW_TYPE);
119
+
120
+ return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line);
121
+ }
122
+
123
+ // first, determine if we are parsing an arrow function by finding => (long form)
124
+ $i = 0;
125
+ if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, '(')) {
126
+ return null;
127
+ }
128
+ ++$i;
129
+ while (true) {
130
+ // variable name
131
+ ++$i;
132
+ if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, ',')) {
133
+ break;
134
+ }
135
+ ++$i;
136
+ }
137
+ if (!$stream->look($i)->test(Token::PUNCTUATION_TYPE, ')')) {
138
+ return null;
139
+ }
140
+ ++$i;
141
+ if (!$stream->look($i)->test(Token::ARROW_TYPE)) {
142
+ return null;
143
+ }
144
+
145
+ // yes, let's parse it properly
146
+ $token = $stream->expect(Token::PUNCTUATION_TYPE, '(');
147
+ $line = $token->getLine();
148
+
149
+ $names = [];
150
+ while (true) {
151
+ $token = $stream->expect(Token::NAME_TYPE);
152
+ $names[] = new AssignNameExpression($token->getValue(), $token->getLine());
153
+
154
+ if (!$stream->nextIf(Token::PUNCTUATION_TYPE, ',')) {
155
+ break;
156
+ }
157
+ }
158
+ $stream->expect(Token::PUNCTUATION_TYPE, ')');
159
+ $stream->expect(Token::ARROW_TYPE);
160
+
161
+ return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line);
162
+ }
163
+
164
  protected function getPrimary()
165
  {
166
  $token = $this->parser->getCurrentToken();
562
  if (!$this->parser->getStream()->test(Token::PUNCTUATION_TYPE, '(')) {
563
  $arguments = new Node();
564
  } else {
565
+ $arguments = $this->parseArguments(true, false, true);
566
  }
567
 
568
  $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine());
589
  *
590
  * @throws SyntaxError
591
  */
592
+ public function parseArguments($namedArguments = false, $definition = false, $allowArrow = false)
593
  {
594
  $args = [];
595
  $stream = $this->parser->getStream();
604
  $token = $stream->expect(Token::NAME_TYPE, null, 'An argument must be a name');
605
  $value = new NameExpression($token->getValue(), $this->parser->getCurrentToken()->getLine());
606
  } else {
607
+ $value = $this->parseExpression(0, $allowArrow);
608
  }
609
 
610
  $name = null;
621
  throw new SyntaxError(sprintf('A default value for an argument must be a constant (a boolean, a string, a number, or an array).'), $token->getLine(), $stream->getSourceContext());
622
  }
623
  } else {
624
+ $value = $this->parseExpression(0, $allowArrow);
625
  }
626
  }
627
 
690
  $class = $this->getTestNodeClass($test);
691
  $arguments = null;
692
  if ($stream->test(Token::PUNCTUATION_TYPE, '(')) {
693
+ $arguments = $this->parseArguments(true);
694
  }
695
 
696
  return new $class($node, $name, $arguments, $this->parser->getCurrentToken()->getLine());
vendor/twig/twig/src/Extension/CoreExtension.php CHANGED
@@ -11,6 +11,7 @@
11
 
12
  namespace Twig\Extension {
13
  use Twig\ExpressionParser;
 
14
  use Twig\TokenParser\BlockTokenParser;
15
  use Twig\TokenParser\DeprecatedTokenParser;
16
  use Twig\TokenParser\DoTokenParser;
@@ -139,6 +140,7 @@ class CoreExtension extends AbstractExtension
139
  public function getTokenParsers()
140
  {
141
  return [
 
142
  new ForTokenParser(),
143
  new IfTokenParser(),
144
  new ExtendsTokenParser(),
@@ -192,6 +194,9 @@ class CoreExtension extends AbstractExtension
192
  new TwigFilter('sort', 'twig_sort_filter'),
193
  new TwigFilter('merge', 'twig_array_merge'),
194
  new TwigFilter('batch', 'twig_array_batch'),
 
 
 
195
 
196
  // string/array filters
197
  new TwigFilter('reverse', 'twig_reverse_filter', ['needs_environment' => true]),
@@ -935,6 +940,10 @@ function twig_sort_filter($array)
935
  */
936
  function twig_in_filter($value, $compare)
937
  {
 
 
 
 
938
  if (\is_array($compare)) {
939
  return \in_array($value, $compare, \is_object($value) || \is_resource($value));
940
  } elseif (\is_string($compare) && (\is_string($value) || \is_int($value) || \is_float($value))) {
@@ -1658,7 +1667,7 @@ function twig_constant_is_defined($constant, $object = null)
1658
  function twig_array_batch($items, $size, $fill = null, $preserveKeys = true)
1659
  {
1660
  if (!twig_test_iterable($items)) {
1661
- throw new RuntimeError(sprintf('The "batch" filter expects an array or "Traversable", got "%s".', \is_object($from) ? \get_class($from) : \gettype($from)));
1662
  }
1663
 
1664
  $size = ceil($size);
@@ -1676,4 +1685,40 @@ function twig_array_batch($items, $size, $fill = null, $preserveKeys = true)
1676
 
1677
  return $result;
1678
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1679
  }
11
 
12
  namespace Twig\Extension {
13
  use Twig\ExpressionParser;
14
+ use Twig\TokenParser\ApplyTokenParser;
15
  use Twig\TokenParser\BlockTokenParser;
16
  use Twig\TokenParser\DeprecatedTokenParser;
17
  use Twig\TokenParser\DoTokenParser;
140
  public function getTokenParsers()
141
  {
142
  return [
143
+ new ApplyTokenParser(),
144
  new ForTokenParser(),
145
  new IfTokenParser(),
146
  new ExtendsTokenParser(),
194
  new TwigFilter('sort', 'twig_sort_filter'),
195
  new TwigFilter('merge', 'twig_array_merge'),
196
  new TwigFilter('batch', 'twig_array_batch'),
197
+ new TwigFilter('filter', 'twig_array_filter'),
198
+ new TwigFilter('map', 'twig_array_map'),
199
+ new TwigFilter('reduce', 'twig_array_reduce'),
200
 
201
  // string/array filters
202
  new TwigFilter('reverse', 'twig_reverse_filter', ['needs_environment' => true]),
940
  */
941
  function twig_in_filter($value, $compare)
942
  {
943
+ if ($value instanceof Markup) {
944
+ $value = (string) $value;
945
+ }
946
+
947
  if (\is_array($compare)) {
948
  return \in_array($value, $compare, \is_object($value) || \is_resource($value));
949
  } elseif (\is_string($compare) && (\is_string($value) || \is_int($value) || \is_float($value))) {
1667
  function twig_array_batch($items, $size, $fill = null, $preserveKeys = true)
1668
  {
1669
  if (!twig_test_iterable($items)) {
1670
+ throw new RuntimeError(sprintf('The "batch" filter expects an array or "Traversable", got "%s".', \is_object($items) ? \get_class($items) : \gettype($items)));
1671
  }
1672
 
1673
  $size = ceil($size);
1685
 
1686
  return $result;
1687
  }
1688
+
1689
+ function twig_array_filter($array, $arrow)
1690
+ {
1691
+ if (\is_array($array)) {
1692
+ if (\PHP_VERSION_ID >= 50600) {
1693
+ return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);
1694
+ }
1695
+
1696
+ return array_filter($array, $arrow);
1697
+ }
1698
+
1699
+ while ($array instanceof \IteratorAggregate) {
1700
+ $array = $array->getIterator();
1701
+ }
1702
+
1703
+ return new \CallbackFilterIterator($array, $arrow);
1704
+ }
1705
+
1706
+ function twig_array_map($array, $arrow)
1707
+ {
1708
+ $r = [];
1709
+ foreach ($array as $k => $v) {
1710
+ $r[$k] = $arrow($v, $k);
1711
+ }
1712
+
1713
+ return $r;
1714
+ }
1715
+
1716
+ function twig_array_reduce($array, $arrow, $initial = null)
1717
+ {
1718
+ if (!\is_array($array)) {
1719
+ $array = iterator_to_array($array);
1720
+ }
1721
+
1722
+ return array_reduce($array, $arrow, $initial);
1723
+ }
1724
  }
vendor/twig/twig/src/Extension/DebugExtension.php CHANGED
@@ -54,7 +54,7 @@ function twig_var_dump(Environment $env, $context, array $vars = [])
54
  return;
55
  }
56
 
57
- ob_start();
58
 
59
  if (!$vars) {
60
  $vars = [];
54
  return;
55
  }
56
 
57
+ ob_start(function () { return ''; });
58
 
59
  if (!$vars) {
60
  $vars = [];
vendor/twig/twig/src/Extension/StringLoaderExtension.php CHANGED
@@ -35,7 +35,7 @@ class_alias('Twig\Extension\StringLoaderExtension', 'Twig_Extension_StringLoader
35
 
36
  namespace {
37
  use Twig\Environment;
38
- use Twig\Template;
39
 
40
  /**
41
  * Loads a template from a string.
@@ -43,9 +43,9 @@ use Twig\Template;
43
  * {{ include(template_from_string("Hello {{ name }}")) }}
44
  *
45
  * @param string $template A template as a string or object implementing __toString()
46
- * @param string $name An optional name of the template to be used in error messages
47
  *
48
- * @return Template
49
  */
50
  function twig_template_from_string(Environment $env, $template, $name = null)
51
  {
35
 
36
  namespace {
37
  use Twig\Environment;
38
+ use Twig\TemplateWrapper;
39
 
40
  /**
41
  * Loads a template from a string.
43
  * {{ include(template_from_string("Hello {{ name }}")) }}
44
  *
45
  * @param string $template A template as a string or object implementing __toString()
46
+ * @param string $name An optional name of the template to be used in error messages
47
  *
48
+ * @return TemplateWrapper
49
  */
50
  function twig_template_from_string(Environment $env, $template, $name = null)
51
  {
vendor/twig/twig/src/Lexer.php CHANGED
@@ -67,16 +67,17 @@ class Lexer implements \Twig_LexerInterface
67
  'interpolation' => ['#{', '}'],
68
  ], $options);
69
 
 
70
  $this->regexes = [
71
  // }}
72
  'lex_var' => '{
73
  \s*
74
  (?:'.
75
- preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1]).'\s*'. // -}}\s*
76
  '|'.
77
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_variable'][1]).'['.$this->options['whitespace_line_chars'].']*'. // ~}}[ \t\0\x0B]*
78
  '|'.
79
- preg_quote($this->options['tag_variable'][1]). // }}
80
  ')
81
  }Ax',
82
 
@@ -84,17 +85,17 @@ class Lexer implements \Twig_LexerInterface
84
  'lex_block' => '{
85
  \s*
86
  (?:'.
87
- preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1]).'\s*\n?'. // -%}\s*\n?
88
  '|'.
89
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1]).'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
90
  '|'.
91
- preg_quote($this->options['tag_block'][1]).'\n?'. // %}\n?
92
  ')
93
  }Ax',
94
 
95
  // {% endverbatim %}
96
  'lex_raw_data' => '{'.
97
- preg_quote($this->options['tag_block'][0]). // {%
98
  '('.
99
  $this->options['whitespace_trim']. // -
100
  '|'.
@@ -103,11 +104,11 @@ class Lexer implements \Twig_LexerInterface
103
  '(?:end%s)'. // endraw or endverbatim
104
  '\s*'.
105
  '(?:'.
106
- preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1]).'\s*'. // -%}
107
  '|'.
108
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1]).'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
109
  '|'.
110
- preg_quote($this->options['tag_block'][1]). // %}
111
  ')
112
  }sx',
113
 
@@ -130,32 +131,32 @@ class Lexer implements \Twig_LexerInterface
130
  (raw|verbatim)
131
  \s*
132
  (?:'.
133
- preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1]).'\s*'. // -%}\s*
134
  '|'.
135
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1]).'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
136
  '|'.
137
- preg_quote($this->options['tag_block'][1]). // %}
138
  ')
139
  }Asx',
140
 
141
- 'lex_block_line' => '{\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1]).'}As',
142
 
143
  // {{ or {% or {#
144
  'lex_tokens_start' => '{
145
  ('.
146
- preg_quote($this->options['tag_variable'][0]). // {{
147
  '|'.
148
- preg_quote($this->options['tag_block'][0]). // {%
149
  '|'.
150
  preg_quote($this->options['tag_comment'][0], '#'). // {#
151
  ')('.
152
- preg_quote($this->options['whitespace_trim']). // -
153
  '|'.
154
- preg_quote($this->options['whitespace_line_trim']). // ~
155
  ')?
156
  }sx',
157
- 'interpolation_start' => '{'.preg_quote($this->options['interpolation'][0]).'\s*}A',
158
- 'interpolation_end' => '{\s*'.preg_quote($this->options['interpolation'][1]).'}A',
159
  ];
160
  }
161
 
@@ -261,7 +262,7 @@ class Lexer implements \Twig_LexerInterface
261
  if ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0]) {
262
  // whitespace_trim detected ({%-, {{- or {#-)
263
  $text = rtrim($text);
264
- } else {
265
  // whitespace_line_trim detected ({%~, {{~ or {#~)
266
  // don't trim \r and \n
267
  $text = rtrim($text, " \t\0\x0B");
@@ -277,11 +278,11 @@ class Lexer implements \Twig_LexerInterface
277
 
278
  case $this->options['tag_block'][0]:
279
  // raw data?
280
- if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, null, $this->cursor)) {
281
  $this->moveCursor($match[0]);
282
  $this->lexRawData($match[1]);
283
  // {% line \d+ %}
284
- } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, null, $this->cursor)) {
285
  $this->moveCursor($match[0]);
286
  $this->lineno = (int) $match[1];
287
  } else {
@@ -301,7 +302,7 @@ class Lexer implements \Twig_LexerInterface
301
 
302
  protected function lexBlock()
303
  {
304
- if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, null, $this->cursor)) {
305
  $this->pushToken(Token::BLOCK_END_TYPE);
306
  $this->moveCursor($match[0]);
307
  $this->popState();
@@ -312,7 +313,7 @@ class Lexer implements \Twig_LexerInterface
312
 
313
  protected function lexVar()
314
  {
315
- if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, null, $this->cursor)) {
316
  $this->pushToken(Token::VAR_END_TYPE);
317
  $this->moveCursor($match[0]);
318
  $this->popState();
@@ -324,7 +325,7 @@ class Lexer implements \Twig_LexerInterface
324
  protected function lexExpression()
325
  {
326
  // whitespace
327
- if (preg_match('/\s+/A', $this->code, $match, null, $this->cursor)) {
328
  $this->moveCursor($match[0]);
329
 
330
  if ($this->cursor >= $this->end) {
@@ -332,18 +333,23 @@ class Lexer implements \Twig_LexerInterface
332
  }
333
  }
334
 
 
 
 
 
 
335
  // operators
336
- if (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) {
337
  $this->pushToken(Token::OPERATOR_TYPE, preg_replace('/\s+/', ' ', $match[0]));
338
  $this->moveCursor($match[0]);
339
  }
340
  // names
341
- elseif (preg_match(self::REGEX_NAME, $this->code, $match, null, $this->cursor)) {
342
  $this->pushToken(Token::NAME_TYPE, $match[0]);
343
  $this->moveCursor($match[0]);
344
  }
345
  // numbers
346
- elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) {
347
  $number = (float) $match[0]; // floats
348
  if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
349
  $number = (int) $match[0]; // integers lower than the maximum
@@ -373,12 +379,12 @@ class Lexer implements \Twig_LexerInterface
373
  ++$this->cursor;
374
  }
375
  // strings
376
- elseif (preg_match(self::REGEX_STRING, $this->code, $match, null, $this->cursor)) {
377
  $this->pushToken(Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1)));
378
  $this->moveCursor($match[0]);
379
  }
380
  // opening double quoted string
381
- elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
382
  $this->brackets[] = ['"', $this->lineno];
383
  $this->pushState(self::STATE_STRING);
384
  $this->moveCursor($match[0]);
@@ -428,15 +434,15 @@ class Lexer implements \Twig_LexerInterface
428
 
429
  protected function lexString()
430
  {
431
- if (preg_match($this->regexes['interpolation_start'], $this->code, $match, null, $this->cursor)) {
432
  $this->brackets[] = [$this->options['interpolation'][0], $this->lineno];
433
  $this->pushToken(Token::INTERPOLATION_START_TYPE);
434
  $this->moveCursor($match[0]);
435
  $this->pushState(self::STATE_INTERPOLATION);
436
- } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, null, $this->cursor) && \strlen($match[0]) > 0) {
437
  $this->pushToken(Token::STRING_TYPE, stripcslashes($match[0]));
438
  $this->moveCursor($match[0]);
439
- } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
440
  list($expect, $lineno) = array_pop($this->brackets);
441
  if ('"' != $this->code[$this->cursor]) {
442
  throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
@@ -453,7 +459,7 @@ class Lexer implements \Twig_LexerInterface
453
  protected function lexInterpolation()
454
  {
455
  $bracket = end($this->brackets);
456
- if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, null, $this->cursor)) {
457
  array_pop($this->brackets);
458
  $this->pushToken(Token::INTERPOLATION_END_TYPE);
459
  $this->moveCursor($match[0]);
67
  'interpolation' => ['#{', '}'],
68
  ], $options);
69
 
70
+ // when PHP 7.3 is the min version, we will be able to remove the '#' part in preg_quote as it's part of the default
71
  $this->regexes = [
72
  // }}
73
  'lex_var' => '{
74
  \s*
75
  (?:'.
76
+ preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '#').'\s*'. // -}}\s*
77
  '|'.
78
+ preg_quote($this->options['whitespace_line_trim'].$this->options['tag_variable'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~}}[ \t\0\x0B]*
79
  '|'.
80
+ preg_quote($this->options['tag_variable'][1], '#'). // }}
81
  ')
82
  }Ax',
83
 
85
  'lex_block' => '{
86
  \s*
87
  (?:'.
88
+ preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*\n?'. // -%}\s*\n?
89
  '|'.
90
+ preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
91
  '|'.
92
+ preg_quote($this->options['tag_block'][1], '#').'\n?'. // %}\n?
93
  ')
94
  }Ax',
95
 
96
  // {% endverbatim %}
97
  'lex_raw_data' => '{'.
98
+ preg_quote($this->options['tag_block'][0], '#'). // {%
99
  '('.
100
  $this->options['whitespace_trim']. // -
101
  '|'.
104
  '(?:end%s)'. // endraw or endverbatim
105
  '\s*'.
106
  '(?:'.
107
+ preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*'. // -%}
108
  '|'.
109
+ preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
110
  '|'.
111
+ preg_quote($this->options['tag_block'][1], '#'). // %}
112
  ')
113
  }sx',
114
 
131
  (raw|verbatim)
132
  \s*
133
  (?:'.
134
+ preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*'. // -%}\s*
135
  '|'.
136
+ preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
137
  '|'.
138
+ preg_quote($this->options['tag_block'][1], '#'). // %}
139
  ')
140
  }Asx',
141
 
142
+ 'lex_block_line' => '{\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '#').'}As',
143
 
144
  // {{ or {% or {#
145
  'lex_tokens_start' => '{
146
  ('.
147
+ preg_quote($this->options['tag_variable'][0], '#'). // {{
148
  '|'.
149
+ preg_quote($this->options['tag_block'][0], '#'). // {%
150
  '|'.
151
  preg_quote($this->options['tag_comment'][0], '#'). // {#
152
  ')('.
153
+ preg_quote($this->options['whitespace_trim'], '#'). // -
154
  '|'.
155
+ preg_quote($this->options['whitespace_line_trim'], '#'). // ~
156
  ')?
157
  }sx',
158
+ 'interpolation_start' => '{'.preg_quote($this->options['interpolation'][0], '#').'\s*}A',
159
+ 'interpolation_end' => '{\s*'.preg_quote($this->options['interpolation'][1], '#').'}A',
160
  ];
161
  }
162
 
262
  if ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0]) {
263
  // whitespace_trim detected ({%-, {{- or {#-)
264
  $text = rtrim($text);
265
+ } elseif ($this->options['whitespace_line_trim'] === $this->positions[2][$this->position][0]) {
266
  // whitespace_line_trim detected ({%~, {{~ or {#~)
267
  // don't trim \r and \n
268
  $text = rtrim($text, " \t\0\x0B");
278
 
279
  case $this->options['tag_block'][0]:
280
  // raw data?
281
+ if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, 0, $this->cursor)) {
282
  $this->moveCursor($match[0]);
283
  $this->lexRawData($match[1]);
284
  // {% line \d+ %}
285
+ } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, 0, $this->cursor)) {
286
  $this->moveCursor($match[0]);
287
  $this->lineno = (int) $match[1];
288
  } else {
302
 
303
  protected function lexBlock()
304
  {
305
+ if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, 0, $this->cursor)) {
306
  $this->pushToken(Token::BLOCK_END_TYPE);
307
  $this->moveCursor($match[0]);
308
  $this->popState();
313
 
314
  protected function lexVar()
315
  {
316
+ if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, 0, $this->cursor)) {
317
  $this->pushToken(Token::VAR_END_TYPE);
318
  $this->moveCursor($match[0]);
319
  $this->popState();
325
  protected function lexExpression()
326
  {
327
  // whitespace
328
+ if (preg_match('/\s+/A', $this->code, $match, 0, $this->cursor)) {
329
  $this->moveCursor($match[0]);
330
 
331
  if ($this->cursor >= $this->end) {
333
  }
334
  }
335
 
336
+ // arrow function
337
+ if ('=' === $this->code[$this->cursor] && '>' === $this->code[$this->cursor + 1]) {
338
+ $this->pushToken(Token::ARROW_TYPE, '=>');
339
+ $this->moveCursor('=>');
340
+ }
341
  // operators
342
+ elseif (preg_match($this->regexes['operator'], $this->code, $match, 0, $this->cursor)) {
343
  $this->pushToken(Token::OPERATOR_TYPE, preg_replace('/\s+/', ' ', $match[0]));
344
  $this->moveCursor($match[0]);
345
  }
346
  // names
347
+ elseif (preg_match(self::REGEX_NAME, $this->code, $match, 0, $this->cursor)) {
348
  $this->pushToken(Token::NAME_TYPE, $match[0]);
349
  $this->moveCursor($match[0]);
350
  }
351
  // numbers
352
+ elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, 0, $this->cursor)) {
353
  $number = (float) $match[0]; // floats
354
  if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
355
  $number = (int) $match[0]; // integers lower than the maximum
379
  ++$this->cursor;
380
  }
381
  // strings
382
+ elseif (preg_match(self::REGEX_STRING, $this->code, $match, 0, $this->cursor)) {
383
  $this->pushToken(Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1)));
384
  $this->moveCursor($match[0]);
385
  }
386
  // opening double quoted string
387
+ elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, 0, $this->cursor)) {
388
  $this->brackets[] = ['"', $this->lineno];
389
  $this->pushState(self::STATE_STRING);
390
  $this->moveCursor($match[0]);
434
 
435
  protected function lexString()
436
  {
437
+ if (preg_match($this->regexes['interpolation_start'], $this->code, $match, 0, $this->cursor)) {
438
  $this->brackets[] = [$this->options['interpolation'][0], $this->lineno];
439
  $this->pushToken(Token::INTERPOLATION_START_TYPE);
440
  $this->moveCursor($match[0]);
441
  $this->pushState(self::STATE_INTERPOLATION);
442
+ } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, 0, $this->cursor) && \strlen($match[0]) > 0) {
443
  $this->pushToken(Token::STRING_TYPE, stripcslashes($match[0]));
444
  $this->moveCursor($match[0]);
445
+ } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, 0, $this->cursor)) {
446
  list($expect, $lineno) = array_pop($this->brackets);
447
  if ('"' != $this->code[$this->cursor]) {
448
  throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
459
  protected function lexInterpolation()
460
  {
461
  $bracket = end($this->brackets);
462
+ if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, 0, $this->cursor)) {
463
  array_pop($this->brackets);
464
  $this->pushToken(Token::INTERPOLATION_END_TYPE);
465
  $this->moveCursor($match[0]);
vendor/twig/twig/src/Loader/FilesystemLoader.php CHANGED
@@ -140,19 +140,27 @@ class FilesystemLoader implements LoaderInterface, ExistsLoaderInterface, Source
140
  {
141
  @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', \get_class($this)), E_USER_DEPRECATED);
142
 
143
- return file_get_contents($this->findTemplate($name));
 
 
 
 
144
  }
145
 
146
  public function getSourceContext($name)
147
  {
148
- $path = $this->findTemplate($name);
 
 
149
 
150
  return new Source(file_get_contents($path), $name, $path);
151
  }
152
 
153
  public function getCacheKey($name)
154
  {
155
- $path = $this->findTemplate($name);
 
 
156
  $len = \strlen($this->rootPath);
157
  if (0 === strncmp($this->rootPath, $path, $len)) {
158
  return substr($path, $len);
@@ -170,7 +178,7 @@ class FilesystemLoader implements LoaderInterface, ExistsLoaderInterface, Source
170
  }
171
 
172
  try {
173
- return false !== $this->findTemplate($name, false);
174
  } catch (LoaderError $e) {
175
  @trigger_error(sprintf('In %s::findTemplate(), you must accept a second argument that when set to "false" returns "false" instead of throwing an exception. Not supporting this argument is deprecated since version 1.27.', \get_class($this)), E_USER_DEPRECATED);
176
 
@@ -180,9 +188,22 @@ class FilesystemLoader implements LoaderInterface, ExistsLoaderInterface, Source
180
 
181
  public function isFresh($name, $time)
182
  {
183
- return filemtime($this->findTemplate($name)) < $time;
 
 
 
 
 
184
  }
185
 
 
 
 
 
 
 
 
 
186
  protected function findTemplate($name)
187
  {
188
  $throw = \func_num_args() > 1 ? func_get_arg(1) : true;
140
  {
141
  @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', \get_class($this)), E_USER_DEPRECATED);
142
 
143
+ if (null === ($path = $this->findTemplate($name)) || false === $path) {
144
+ return '';
145
+ }
146
+
147
+ return file_get_contents($path);
148
  }
149
 
150
  public function getSourceContext($name)
151
  {
152
+ if (null === ($path = $this->findTemplate($name)) || false === $path) {
153
+ return new Source('', $name, '');
154
+ }
155
 
156
  return new Source(file_get_contents($path), $name, $path);
157
  }
158
 
159
  public function getCacheKey($name)
160
  {
161
+ if (null === ($path = $this->findTemplate($name)) || false === $path) {
162
+ return '';
163
+ }
164
  $len = \strlen($this->rootPath);
165
  if (0 === strncmp($this->rootPath, $path, $len)) {
166
  return substr($path, $len);
178
  }
179
 
180
  try {
181
+ return null !== ($path = $this->findTemplate($name, false)) && false !== $path;
182
  } catch (LoaderError $e) {
183
  @trigger_error(sprintf('In %s::findTemplate(), you must accept a second argument that when set to "false" returns "false" instead of throwing an exception. Not supporting this argument is deprecated since version 1.27.', \get_class($this)), E_USER_DEPRECATED);
184
 
188
 
189
  public function isFresh($name, $time)
190
  {
191
+ // false support to be removed in 3.0
192
+ if (null === ($path = $this->findTemplate($name)) || false === $path) {
193
+ return false;
194
+ }
195
+
196
+ return filemtime($path) < $time;
197
  }
198
 
199
+ /**
200
+ * Checks if the template can be found.
201
+ *
202
+ * @param string $name The template name
203
+ *
204
+ * @return string|false The template name or false
205
+ * @return string|false|null The template name or false/null
206
+ */
207
  protected function findTemplate($name)
208
  {
209
  $throw = \func_num_args() > 1 ? func_get_arg(1) : true;
vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Twig.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Twig\Node\Expression;
13
+
14
+ use Twig\Compiler;
15
+ use Twig\Node\Node;
16
+
17
+ /**
18
+ * Represents an arrow function.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ */
22
+ class ArrowFunctionExpression extends AbstractExpression
23
+ {
24
+ public function __construct(AbstractExpression $expr, Node $names, $lineno, $tag = null)
25
+ {
26
+ parent::__construct(['expr' => $expr, 'names' => $names], [], $lineno, $tag);
27
+ }
28
+
29
+ public function compile(Compiler $compiler)
30
+ {
31
+ $compiler
32
+ ->addDebugInfo($this)
33
+ ->raw('function (')
34
+ ;
35
+ foreach ($this->getNode('names') as $i => $name) {
36
+ if ($i) {
37
+ $compiler->raw(', ');
38
+ }
39
+
40
+ $compiler
41
+ ->raw('$__')
42
+ ->raw($name->getAttribute('name'))
43
+ ->raw('__')
44
+ ;
45
+ }
46
+ $compiler
47
+ ->raw(') use ($context) { ')
48
+ ;
49
+ foreach ($this->getNode('names') as $name) {
50
+ $compiler
51
+ ->raw('$context["')
52
+ ->raw($name->getAttribute('name'))
53
+ ->raw('"] = $__')
54
+ ->raw($name->getAttribute('name'))
55
+ ->raw('__; ')
56
+ ;
57
+ }
58
+ $compiler
59
+ ->raw('return ')
60
+ ->subcompile($this->getNode('expr'))
61
+ ->raw('; }')
62
+ ;
63
+ }
64
+ }
vendor/twig/twig/src/Node/Expression/NameExpression.php CHANGED
@@ -36,13 +36,20 @@ class NameExpression extends AbstractExpression
36
  if ($this->getAttribute('is_defined_test')) {
37
  if ($this->isSpecial()) {
38
  $compiler->repr(true);
 
 
 
 
 
 
39
  } else {
40
  $compiler
41
  ->raw('(isset($context[')
42
  ->string($name)
43
  ->raw(']) || array_key_exists(')
44
  ->string($name)
45
- ->raw(', $context))');
 
46
  }
47
  } elseif ($this->isSpecial()) {
48
  $compiler->raw($this->specialVars[$name]);
36
  if ($this->getAttribute('is_defined_test')) {
37
  if ($this->isSpecial()) {
38
  $compiler->repr(true);
39
+ } elseif (\PHP_VERSION_ID >= 700400) {
40
+ $compiler
41
+ ->raw('array_key_exists(')
42
+ ->string($name)
43
+ ->raw(', $context)')
44
+ ;
45
  } else {
46
  $compiler
47
  ->raw('(isset($context[')
48
  ->string($name)
49
  ->raw(']) || array_key_exists(')
50
  ->string($name)
51
+ ->raw(', $context))')
52
+ ;
53
  }
54
  } elseif ($this->isSpecial()) {
55
  $compiler->raw($this->specialVars[$name]);
vendor/twig/twig/src/Node/ImportNode.php CHANGED
@@ -46,7 +46,7 @@ class ImportNode extends Node
46
  ->repr($this->getTemplateName())
47
  ->raw(', ')
48
  ->repr($this->getTemplateLine())
49
- ->raw(')')
50
  ;
51
  }
52
 
46
  ->repr($this->getTemplateName())
47
  ->raw(', ')
48
  ->repr($this->getTemplateLine())
49
+ ->raw(')->unwrap()')
50
  ;
51
  }
52
 
vendor/twig/twig/src/Node/MacroNode.php CHANGED
@@ -104,7 +104,7 @@ class MacroNode extends Node
104
  ->outdent()
105
  ->write("]);\n\n")
106
  ->write("\$blocks = [];\n\n")
107
- ->write("ob_start();\n")
108
  ->write("try {\n")
109
  ->indent()
110
  ->subcompile($this->getNode('body'))
104
  ->outdent()
105
  ->write("]);\n\n")
106
  ->write("\$blocks = [];\n\n")
107
+ ->write("ob_start(function () { return ''; });\n")
108
  ->write("try {\n")
109
  ->indent()
110
  ->subcompile($this->getNode('body'))
vendor/twig/twig/src/Node/Node.php CHANGED
@@ -40,7 +40,7 @@ class Node implements \Twig_NodeInterface
40
  {
41
  foreach ($nodes as $name => $node) {
42
  if (!$node instanceof \Twig_NodeInterface) {
43
- @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', \is_object($node) ? \get_class($node) : null === $node ? 'null' : \gettype($node), $name, \get_class($this)), E_USER_DEPRECATED);
44
  }
45
  }
46
  $this->nodes = $nodes;
@@ -196,7 +196,7 @@ class Node implements \Twig_NodeInterface
196
  public function setNode($name, $node = null)
197
  {
198
  if (!$node instanceof \Twig_NodeInterface) {
199
- @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', \is_object($node) ? \get_class($node) : null === $node ? 'null' : \gettype($node), $name, \get_class($this)), E_USER_DEPRECATED);
200
  }
201
 
202
  $this->nodes[$name] = $node;
40
  {
41
  foreach ($nodes as $name => $node) {
42
  if (!$node instanceof \Twig_NodeInterface) {
43
+ @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, \get_class($this)), E_USER_DEPRECATED);
44
  }
45
  }
46
  $this->nodes = $nodes;
196
  public function setNode($name, $node = null)
197
  {
198
  if (!$node instanceof \Twig_NodeInterface) {
199
+ @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, \get_class($this)), E_USER_DEPRECATED);
200
  }
201
 
202
  $this->nodes[$name] = $node;
vendor/twig/twig/src/Node/SetNode.php CHANGED
@@ -58,7 +58,7 @@ class SetNode extends Node implements NodeCaptureInterface
58
  } else {
59
  if ($this->getAttribute('capture')) {
60
  $compiler
61
- ->write("ob_start();\n")
62
  ->subcompile($this->getNode('values'))
63
  ;
64
  }
58
  } else {
59
  if ($this->getAttribute('capture')) {
60
  $compiler
61
+ ->write("ob_start(function () { return ''; });\n")
62
  ->subcompile($this->getNode('values'))
63
  ;
64
  }
vendor/twig/twig/src/Node/SpacelessNode.php CHANGED
@@ -31,7 +31,7 @@ class SpacelessNode extends Node
31
  {
32
  $compiler
33
  ->addDebugInfo($this)
34
- ->write("ob_start();\n")
35
  ->subcompile($this->getNode('body'))
36
  ->write("echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));\n")
37
  ;
31
  {
32
  $compiler
33
  ->addDebugInfo($this)
34
+ ->write("ob_start(function () { return ''; });\n")
35
  ->subcompile($this->getNode('body'))
36
  ->write("echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));\n")
37
  ;
vendor/twig/twig/src/NodeTraverser.php CHANGED
@@ -69,7 +69,11 @@ class NodeTraverser
69
  $node = $visitor->enterNode($node, $this->env);
70
 
71
  foreach ($node as $k => $n) {
72
- if (false !== $m = $this->traverseForVisitor($visitor, $n)) {
 
 
 
 
73
  if ($m !== $n) {
74
  $node->setNode($k, $m);
75
  }
69
  $node = $visitor->enterNode($node, $this->env);
70
 
71
  foreach ($node as $k => $n) {
72
+ if (null === $n) {
73
+ continue;
74
+ }
75
+
76
+ if (false !== ($m = $this->traverseForVisitor($visitor, $n)) && null !== $m) {
77
  if ($m !== $n) {
78
  $node->setNode($k, $m);
79
  }
vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php CHANGED
@@ -17,6 +17,8 @@ use Twig\Node\Node;
17
  /**
18
  * Used to make node visitors compatible with Twig 1.x and 2.x.
19
  *
 
 
20
  * @author Fabien Potencier <fabien@symfony.com>
21
  */
22
  abstract class AbstractNodeVisitor implements NodeVisitorInterface
@@ -49,7 +51,7 @@ abstract class AbstractNodeVisitor implements NodeVisitorInterface
49
  /**
50
  * Called after child nodes are visited.
51
  *
52
- * @return Node|false The modified node or false if the node must be removed
53
  */
54
  abstract protected function doLeaveNode(Node $node, Environment $env);
55
  }
17
  /**
18
  * Used to make node visitors compatible with Twig 1.x and 2.x.
19
  *
20
+ * To be removed in Twig 3.1.
21
+ *
22
  * @author Fabien Potencier <fabien@symfony.com>
23
  */
24
  abstract class AbstractNodeVisitor implements NodeVisitorInterface
51
  /**
52
  * Called after child nodes are visited.
53
  *
54
+ * @return Node|false|null The modified node or null if the node must be removed
55
  */
56
  abstract protected function doLeaveNode(Node $node, Environment $env);
57
  }
vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php CHANGED
@@ -108,7 +108,7 @@ class EscaperNodeVisitor extends AbstractNodeVisitor
108
  $expr2 = $this->escapeInlinePrintNode(new InlinePrint($expr2, $expr2->getTemplateLine()), $env, $type);
109
  }
110
  $expr3 = $expression->getNode('expr3');
111
- if ($expr3 instanceof ConditionalExpression && $this->shouldUnwrapConditional($expr2, $env, $type)) {
112
  $expr3 = $this->unwrapConditional($expr3, $env, $type);
113
  } else {
114
  $expr3 = $this->escapeInlinePrintNode(new InlinePrint($expr3, $expr3->getTemplateLine()), $env, $type);
108
  $expr2 = $this->escapeInlinePrintNode(new InlinePrint($expr2, $expr2->getTemplateLine()), $env, $type);
109
  }
110
  $expr3 = $expression->getNode('expr3');
111
+ if ($expr3 instanceof ConditionalExpression && $this->shouldUnwrapConditional($expr3, $env, $type)) {
112
  $expr3 = $this->unwrapConditional($expr3, $env, $type);
113
  } else {
114
  $expr3 = $this->escapeInlinePrintNode(new InlinePrint($expr3, $expr3->getTemplateLine()), $env, $type);
vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php CHANGED
@@ -30,7 +30,7 @@ interface NodeVisitorInterface
30
  /**
31
  * Called after child nodes are visited.
32
  *
33
- * @return \Twig_NodeInterface|false The modified node or false if the node must be removed
34
  */
35
  public function leaveNode(\Twig_NodeInterface $node, Environment $env);
36
 
30
  /**
31
  * Called after child nodes are visited.
32
  *
33
+ * @return \Twig_NodeInterface|false|null The modified node or null if the node must be removed
34
  */
35
  public function leaveNode(\Twig_NodeInterface $node, Environment $env);
36
 
vendor/twig/twig/src/Profiler/Profile.php CHANGED
@@ -86,7 +86,7 @@ class Profile implements \IteratorAggregate, \Serializable
86
  /**
87
  * Returns the duration in microseconds.
88
  *
89
- * @return int
90
  */
91
  public function getDuration()
92
  {
86
  /**
87
  * Returns the duration in microseconds.
88
  *
89
+ * @return float
90
  */
91
  public function getDuration()
92
  {
vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php CHANGED
@@ -12,7 +12,7 @@
12
  namespace Twig\Sandbox;
13
 
14
  /**
15
- * Interfaces that all security policy classes must implements.
16
  *
17
  * @author Fabien Potencier <fabien@symfony.com>
18
  */
12
  namespace Twig\Sandbox;
13
 
14
  /**
15
+ * Interface that all security policy classes must implements.
16
  *
17
  * @author Fabien Potencier <fabien@symfony.com>
18
  */
vendor/twig/twig/src/Template.php CHANGED
@@ -253,7 +253,7 @@ abstract class Template implements \Twig_TemplateInterface
253
  */
254
  public function renderParentBlock($name, array $context, array $blocks = [])
255
  {
256
- ob_start();
257
  $this->displayParentBlock($name, $context, $blocks);
258
 
259
  return ob_get_clean();
@@ -274,7 +274,7 @@ abstract class Template implements \Twig_TemplateInterface
274
  */
275
  public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true)
276
  {
277
- ob_start();
278
  $this->displayBlock($name, $context, $blocks, $useBlocks);
279
 
280
  return ob_get_clean();
@@ -343,6 +343,9 @@ abstract class Template implements \Twig_TemplateInterface
343
  return array_unique($names);
344
  }
345
 
 
 
 
346
  protected function loadTemplate($template, $templateName = null, $line = null, $index = null)
347
  {
348
  try {
@@ -383,6 +386,16 @@ abstract class Template implements \Twig_TemplateInterface
383
  }
384
  }
385
 
 
 
 
 
 
 
 
 
 
 
386
  /**
387
  * Returns all blocks.
388
  *
@@ -404,7 +417,7 @@ abstract class Template implements \Twig_TemplateInterface
404
  public function render(array $context)
405
  {
406
  $level = ob_get_level();
407
- ob_start();
408
  try {
409
  $this->display($context);
410
  } catch (\Exception $e) {
253
  */
254
  public function renderParentBlock($name, array $context, array $blocks = [])
255
  {
256
+ ob_start(function () { return ''; });
257
  $this->displayParentBlock($name, $context, $blocks);
258
 
259
  return ob_get_clean();
274
  */
275
  public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true)
276
  {
277
+ ob_start(function () { return ''; });
278
  $this->displayBlock($name, $context, $blocks, $useBlocks);
279
 
280
  return ob_get_clean();
343
  return array_unique($names);
344
  }
345
 
346
+ /**
347
+ * @return Template|TemplateWrapper
348
+ */
349
  protected function loadTemplate($template, $templateName = null, $line = null, $index = null)
350
  {
351
  try {
386
  }
387
  }
388
 
389
+ /**
390
+ * @internal
391
+ *
392
+ * @return Template
393
+ */
394
+ protected function unwrap()
395
+ {
396
+ return $this;
397
+ }
398
+
399
  /**
400
  * Returns all blocks.
401
  *
417
  public function render(array $context)
418
  {
419
  $level = ob_get_level();
420
+ ob_start(function () { return ''; });
421
  try {
422
  $this->display($context);
423
  } catch (\Exception $e) {
vendor/twig/twig/src/TemplateWrapper.php CHANGED
@@ -96,7 +96,7 @@ final class TemplateWrapper
96
  {
97
  $context = $this->env->mergeGlobals($context);
98
  $level = ob_get_level();
99
- ob_start();
100
  try {
101
  $this->template->displayBlock($name, $context);
102
  } catch (\Exception $e) {
@@ -138,10 +138,20 @@ final class TemplateWrapper
138
  /**
139
  * @return string
140
  */
141
- public function getTemplatename()
142
  {
143
  return $this->template->getTemplateName();
144
  }
 
 
 
 
 
 
 
 
 
 
145
  }
146
 
147
  class_alias('Twig\TemplateWrapper', 'Twig_TemplateWrapper');
96
  {
97
  $context = $this->env->mergeGlobals($context);
98
  $level = ob_get_level();
99
+ ob_start(function () { return ''; });
100
  try {
101
  $this->template->displayBlock($name, $context);
102
  } catch (\Exception $e) {
138
  /**
139
  * @return string
140
  */
141
+ public function getTemplateName()
142
  {
143
  return $this->template->getTemplateName();
144
  }
145
+
146
+ /**
147
+ * @internal
148
+ *
149
+ * @return Template
150
+ */
151
+ public function unwrap()
152
+ {
153
+ return $this->template;
154
+ }
155
  }
156
 
157
  class_alias('Twig\TemplateWrapper', 'Twig_TemplateWrapper');
vendor/twig/twig/src/Test/IntegrationTestCase.php CHANGED
@@ -194,7 +194,7 @@ abstract class IntegrationTestCase extends TestCase
194
  $message = $e->getMessage();
195
  $this->assertSame(trim($exception), trim(sprintf('%s: %s', \get_class($e), $message)));
196
  $last = substr($message, \strlen($message) - 1);
197
- $this->assertTrue('.' === $last || '?' === $last, $message, 'Exception message must end with a dot or a question mark.');
198
 
199
  return;
200
  }
194
  $message = $e->getMessage();
195
  $this->assertSame(trim($exception), trim(sprintf('%s: %s', \get_class($e), $message)));
196
  $last = substr($message, \strlen($message) - 1);
197
+ $this->assertTrue('.' === $last || '?' === $last, 'Exception message must end with a dot or a question mark.');
198
 
199
  return;
200
  }
vendor/twig/twig/src/Test/NodeTestCase.php CHANGED
@@ -56,7 +56,7 @@ abstract class NodeTestCase extends TestCase
56
  $line = $line > 0 ? "// line {$line}\n" : '';
57
 
58
  if (\PHP_VERSION_ID >= 70000) {
59
- return sprintf('%s($context["%s"] ?? null)', $line, $name, $name);
60
  }
61
 
62
  if (\PHP_VERSION_ID >= 50400) {
56
  $line = $line > 0 ? "// line {$line}\n" : '';
57
 
58
  if (\PHP_VERSION_ID >= 70000) {
59
+ return sprintf('%s($context["%s"] ?? null)', $line, $name);
60
  }
61
 
62
  if (\PHP_VERSION_ID >= 50400) {
vendor/twig/twig/src/Token.php CHANGED
@@ -38,6 +38,7 @@ class Token
38
  const PUNCTUATION_TYPE = 9;
39
  const INTERPOLATION_START_TYPE = 10;
40
  const INTERPOLATION_END_TYPE = 11;
 
41
 
42
  /**
43
  * @param int $type The type of the token
@@ -157,6 +158,9 @@ class Token
157
  case self::INTERPOLATION_END_TYPE:
158
  $name = 'INTERPOLATION_END_TYPE';
159
  break;
 
 
 
160
  default:
161
  throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type));
162
  }
@@ -200,6 +204,8 @@ class Token
200
  return 'begin of string interpolation';
201
  case self::INTERPOLATION_END_TYPE:
202
  return 'end of string interpolation';
 
 
203
  default:
204
  throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type));
205
  }
38
  const PUNCTUATION_TYPE = 9;
39
  const INTERPOLATION_START_TYPE = 10;
40
  const INTERPOLATION_END_TYPE = 11;
41
+ const ARROW_TYPE = 12;
42
 
43
  /**
44
  * @param int $type The type of the token
158
  case self::INTERPOLATION_END_TYPE:
159
  $name = 'INTERPOLATION_END_TYPE';
160
  break;
161
+ case self::ARROW_TYPE:
162
+ $name = 'ARROW_TYPE';
163
+ break;
164
  default:
165
  throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type));
166
  }
204
  return 'begin of string interpolation';
205
  case self::INTERPOLATION_END_TYPE:
206
  return 'end of string interpolation';
207
+ case self::ARROW_TYPE:
208
+ return 'arrow function';
209
  default:
210
  throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type));
211
  }
vendor/twig/twig/src/TokenParser/AbstractTokenParser.php CHANGED
@@ -20,6 +20,9 @@ use Twig\Parser;
20
  */
21
  abstract class AbstractTokenParser implements TokenParserInterface
22
  {
 
 
 
23
  protected $parser;
24
 
25
  public function setParser(Parser $parser)
20
  */
21
  abstract class AbstractTokenParser implements TokenParserInterface
22
  {
23
+ /**
24
+ * @var Parser
25
+ */
26
  protected $parser;
27
 
28
  public function setParser(Parser $parser)
vendor/twig/twig/src/TokenParser/ApplyTokenParser.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of Twig.
5
+ *
6
+ * (c) Fabien Potencier
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Twig\TokenParser;
13
+
14
+ use Twig\Node\Expression\TempNameExpression;
15
+ use Twig\Node\Node;
16
+ use Twig\Node\PrintNode;
17
+ use Twig\Node\SetNode;
18
+ use Twig\Token;
19
+
20
+ /**
21
+ * Applies filters on a section of a template.
22
+ *
23
+ * {% apply upper %}
24
+ * This text becomes uppercase
25
+ * {% endapplys %}
26
+ */
27
+ final class ApplyTokenParser extends AbstractTokenParser
28
+ {
29
+ public function parse(Token $token)
30
+ {
31
+ $lineno = $token->getLine();
32
+ $name = $this->parser->getVarName();
33
+
34
+ $ref = new TempNameExpression($name, $lineno);
35
+ $ref->setAttribute('always_defined', true);
36
+
37
+ $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag());
38
+
39
+ $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
40
+ $body = $this->parser->subparse([$this, 'decideApplyEnd'], true);
41
+ $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
42
+
43
+ return new Node([
44
+ new SetNode(true, $ref, $body, $lineno, $this->getTag()),
45
+ new PrintNode($filter, $lineno, $this->getTag()),
46
+ ]);
47
+ }
48
+
49
+ public function decideApplyEnd(Token $token)
50
+ {
51
+ return $token->test('endapply');
52
+ }
53
+
54
+ public function getTag()
55
+ {
56
+ return 'apply';
57
+ }
58
+ }
vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php CHANGED
@@ -13,6 +13,7 @@
13
  namespace Twig\TokenParser;
14
 
15
  use Twig\Error\SyntaxError;
 
16
  use Twig\Token;
17
 
18
  /**
@@ -38,6 +39,8 @@ class ExtendsTokenParser extends AbstractTokenParser
38
  $this->parser->setParent($this->parser->getExpressionParser()->parseExpression());
39
 
40
  $stream->expect(Token::BLOCK_END_TYPE);
 
 
41
  }
42
 
43
  public function getTag()
13
  namespace Twig\TokenParser;
14
 
15
  use Twig\Error\SyntaxError;
16
+ use Twig\Node\Node;
17
  use Twig\Token;
18
 
19
  /**
39
  $this->parser->setParent($this->parser->getExpressionParser()->parseExpression());
40
 
41
  $stream->expect(Token::BLOCK_END_TYPE);
42
+
43
+ return new Node();
44
  }
45
 
46
  public function getTag()
vendor/twig/twig/src/TokenParser/MacroTokenParser.php CHANGED
@@ -14,6 +14,7 @@ namespace Twig\TokenParser;
14
  use Twig\Error\SyntaxError;
15
  use Twig\Node\BodyNode;
16
  use Twig\Node\MacroNode;
 
17
  use Twig\Token;
18
 
19
  /**
@@ -49,6 +50,8 @@ class MacroTokenParser extends AbstractTokenParser
49
  $stream->expect(Token::BLOCK_END_TYPE);
50
 
51
  $this->parser->setMacro($name, new MacroNode($name, new BodyNode([$body]), $arguments, $lineno, $this->getTag()));
 
 
52
  }
53
 
54
  public function decideBlockEnd(Token $token)
14
  use Twig\Error\SyntaxError;
15
  use Twig\Node\BodyNode;
16
  use Twig\Node\MacroNode;
17
+ use Twig\Node\Node;
18
  use Twig\Token;
19
 
20
  /**
50
  $stream->expect(Token::BLOCK_END_TYPE);
51
 
52
  $this->parser->setMacro($name, new MacroNode($name, new BodyNode([$body]), $arguments, $lineno, $this->getTag()));
53
+
54
+ return new Node();
55
  }
56
 
57
  public function decideBlockEnd(Token $token)
webpack/webpack.react.js DELETED
@@ -1,145 +0,0 @@
1
- var debug = process.env.NODE_ENV !== 'production'
2
- var webpack = require('webpack')
3
- var path = require('path')
4
- var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
5
- var ExtractTextPlugin = require('extract-text-webpack-plugin')
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- const camelCaseDash = (string) => {
11
- return string.replace(
12
- /-([a-z])/g,
13
- (match, letter) => letter.toUpperCase()
14
- )
15
- }
16
-
17
- /**
18
- * Converts @wordpress/* string request into request object.
19
- *
20
- * Note this isn't the same as camel case because of the
21
- * way that numbers don't trigger the capitalized next letter.
22
- *
23
- * @example
24
- * formatRequest( '@wordpress/api-fetch' );
25
- * // { this: [ 'wp', 'apiFetch' ] }
26
- * formatRequest( '@wordpress/i18n' );
27
- * // { this: [ 'wp', 'i18n' ] }
28
- *
29
- * @param {string} request Request name from import statement.
30
- * @return {Object} Request object formatted for further processing.
31
- */
32
- const formatRequest = (request) => {
33
- // '@wordpress/api-fetch' -> [ '@wordpress', 'api-fetch' ]
34
- const [, name] = request.split('/')
35
-
36
- // { this: [ 'wp', 'apiFetch' ] }
37
- return {
38
- this: ['wp', camelCaseDash(name)],
39
- }
40
- }
41
-
42
- const wordpressExternals = (context, request, callback) => {
43
- if (/^@wordpress\//.test(request)) {
44
- callback(null, formatRequest(request), 'this')
45
- } else {
46
- callback()
47
- }
48
- }
49
-
50
- const externals = [
51
- {
52
- react: 'React',
53
- 'react-dom': 'ReactDOM',
54
- moment: 'moment',
55
- jquery: 'jQuery',
56
- lodash: 'lodash',
57
- 'lodash-es': 'lodash',
58
-
59
- // Distributed NPM packages may depend on Babel's runtime regenerator.
60
- // In a WordPress context, the regenerator is assigned to the global
61
- // scope via the `wp-polyfill` script. It is reassigned here as an
62
- // externals to reduce the size of generated bundles.
63
- //
64
- // See: https://github.com/WordPress/gutenberg/issues/13890
65
- '@babel/runtime/regenerator': 'regeneratorRuntime',
66
- },
67
- wordpressExternals,
68
- ]
69
-
70
- const dir = __dirname + '/../'
71
-
72
- let config = {
73
- context: dir,
74
- entry: {
75
- 'gutenberg-block': './js/src/modules/gutenberg-block/index.js',
76
- },
77
- output: {
78
- path: dir + 'js/build',
79
- filename: '[name].min.js',
80
- },
81
- devtool: debug ? 'inline-sourcemap' : false,
82
- module: {
83
- rules: [
84
- {
85
- test: /\.(scss|sass)$/,
86
- use: ExtractTextPlugin.extract({
87
- fallback: 'style-loader',
88
- use: [
89
- {loader: 'css-loader', options: {minimize: true}},
90
- 'fast-sass-loader'
91
- ]
92
- })
93
- },
94
- {
95
- test: /\.js$/,
96
- loader: 'babel-loader',
97
- exclude: /(node_modules|bower_components)/,
98
- options: {
99
- babelrc: false,
100
- "plugins": [
101
- ["transform-react-jsx", {
102
- pragma: "wp.element.createElement"
103
- }]
104
- ],
105
- "presets": [
106
- ["env", {"loose": true, "modules": false}],
107
- ["es2015", {"loose": true, "modules": false}],
108
- "stage-2"
109
- ],
110
- }
111
- }
112
- ]
113
- },
114
- resolve: {
115
- alias: {
116
- '@rebelcode/std-lib': '@rebelcode/std-lib/dist/std-lib.umd.js',
117
- 'lodash-es': 'lodash',
118
- app: path.resolve(dir, 'js/src'),
119
- css: path.resolve(dir, 'css'),
120
- },
121
- extensions: ['*', '.js', '.json']
122
- },
123
- externals,
124
- plugins: [
125
- new ExtractTextPlugin(debug ? './../../css/build/[name].min.css' : { // define where to save the file
126
- filename: './../../css/build/[name].min.css',
127
- allChunks: true
128
- }),
129
- new webpack.optimize.ModuleConcatenationPlugin(),
130
- !debug && new webpack.optimize.UglifyJsPlugin({
131
- sourcemap: false,
132
- compress: {
133
- warnings: false,
134
- pure_funcs: [
135
- 'console.log', 'console.info', 'console.warn'
136
- ]
137
- },
138
- }),
139
- !debug && new webpack.LoaderOptionsPlugin({
140
- minimize: true
141
- })
142
- ].filter( Boolean )
143
- }
144
-
145
- module.exports = config
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
webpack/webpack.vue.js DELETED
@@ -1,109 +0,0 @@
1
- var debug = process.env.NODE_ENV !== 'production'
2
- var webpack = require('webpack')
3
- var path = require('path')
4
- var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
5
- var ExtractTextPlugin = require('extract-text-webpack-plugin')
6
- var VueLoaderPlugin = require('vue-loader/lib/plugin')
7
-
8
- const dir = __dirname + '/../'
9
-
10
- function makePlugins (plugins) {
11
- let base = [
12
- new webpack.optimize.CommonsChunkPlugin({
13
- name: 'wpra-vendor',
14
- filename: 'wpra-vendor.min.js',
15
- minChunks: function(module){
16
- return module.context && module.context.includes('node_modules');
17
- }
18
- }),
19
- new webpack.optimize.CommonsChunkPlugin({
20
- name: 'wpra-manifest',
21
- filename: 'wpra-manifest.min.js',
22
- minChunks: Infinity
23
- }),
24
- ]
25
- return base.concat(plugins)
26
- }
27
-
28
- let config = {
29
- context: dir,
30
- entry: {
31
- intro: './js/src/modules/intro/index.js',
32
- plugins: './js/src/modules/plugins/index.js',
33
- templates: './js/src/modules/templates/index.js',
34
- pagination: './js/src/modules/pagination/index.js',
35
- common: './css/src/common/index.scss',
36
- update: './css/src/update/index.scss',
37
- },
38
- output: {
39
- path: dir + 'js/build',
40
- filename: '[name].min.js',
41
- library: 'WPRA',
42
- libraryTarget: 'umd'
43
- },
44
- devtool: debug ? 'inline-sourcemap' : false,
45
- module: {
46
- rules: [
47
- {
48
- test: /\.(scss|sass)$/,
49
- use: ExtractTextPlugin.extract({
50
- fallback: 'style-loader',
51
- use: [
52
- {loader: 'css-loader', options: {minimize: true}},
53
- 'fast-sass-loader'
54
- ]
55
- })
56
- },
57
- {
58
- test: /\.vue$/,
59
- loader: 'vue-loader',
60
- },
61
- {
62
- test: /\.html$/,
63
- loader: 'vue-template-compiler-loader'
64
- },
65
- {
66
- test: /\.js$/,
67
- loader: 'babel-loader',
68
- exclude: /(node_modules|bower_components)/,
69
- }
70
- ]
71
- },
72
- resolve: {
73
- alias: {
74
- 'vue$': 'vue/dist/vue.esm.js',
75
- '@rebelcode/std-lib': '@rebelcode/std-lib/dist/std-lib.umd.js',
76
- app: path.resolve(dir, 'js/src'),
77
- css: path.resolve(dir, 'css'),
78
- },
79
- extensions: ['*', '.js', '.vue', '.json']
80
- },
81
- plugins: debug ? makePlugins([
82
- new ExtractTextPlugin('./../../css/build/[name].min.css'),
83
- new VueLoaderPlugin(),
84
- ]) : makePlugins([
85
- new ExtractTextPlugin({ // define where to save the file
86
- filename: './../../css/build/[name].min.css',
87
- allChunks: true
88
- }),
89
- new VueLoaderPlugin(),
90
- new webpack.optimize.ModuleConcatenationPlugin(),
91
- // new webpack.optimize.OccurrenceOrderPlugin(),
92
- new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
93
- // new BundleAnalyzerPlugin(),
94
- new webpack.optimize.UglifyJsPlugin({
95
- sourcemap: false,
96
- compress: {
97
- warnings: false,
98
- pure_funcs: [
99
- 'console.log', 'console.info', 'console.warn'
100
- ]
101
- },
102
- }),
103
- new webpack.LoaderOptionsPlugin({
104
- minimize: true
105
- })
106
- ])
107
- }
108
-
109
- module.exports = config
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.2
8
  * Author: RebelCode
9
  * Author URI: https://www.wprssaggregator.com
10
  * Text Domain: wprss
@@ -78,7 +78,7 @@ use RebelCode\Wpra\Core\Plugin;
78
 
79
  // Set the version number of the plugin.
80
  if( !defined( 'WPRSS_VERSION' ) )
81
- define( 'WPRSS_VERSION', '4.17.2' );
82
 
83
  if( !defined( 'WPRSS_WP_MIN_VERSION' ) )
84
  define( 'WPRSS_WP_MIN_VERSION', '4.8' );
@@ -248,7 +248,7 @@ require_once ( WPRSS_INC . 'admin-options.php' );
248
  /* Load the legacy admin options functions file. */
249
  require_once ( WPRSS_INC . 'admin-options-legacy.php' );
250
 
251
- /* Load the debugging file */
252
  require_once ( WPRSS_INC . 'system-info.php' );
253
 
254
  /* Load the miscellaneous functions file */
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.3
8
  * Author: RebelCode
9
  * Author URI: https://www.wprssaggregator.com
10
  * Text Domain: wprss
78
 
79
  // Set the version number of the plugin.
80
  if( !defined( 'WPRSS_VERSION' ) )
81
+ define( 'WPRSS_VERSION', '4.17.3' );
82
 
83
  if( !defined( 'WPRSS_WP_MIN_VERSION' ) )
84
  define( 'WPRSS_WP_MIN_VERSION', '4.8' );
248
  /* Load the legacy admin options functions file. */
249
  require_once ( WPRSS_INC . 'admin-options-legacy.php' );
250
 
251
+ /* Load the system info file */
252
  require_once ( WPRSS_INC . 'system-info.php' );
253
 
254
  /* Load the miscellaneous functions file */