Version Description
- Re-designed Admin UI especially the Admin Links UI including links listing, adding new links and editing links
- Added an Insert Pretty Link button for Gutenberg Paragraph Blocks
- Security fixes and hardening
- Fixed Slug is not Available Error
- Removed Pretty Links Groups (lite users will still be able to access legacy groups on the links listing page but pro users & lite users who upgrade to pro will have their groups migrated to become link categories)
- PRO ONLY: Added Pretty Link Categories
- PRO ONLY: Added Pretty Link Tags
- PRO ONLY: Fixed some issues with Pretty Link Imports and Exports
- Many other small fixes and enhancements
Download this release
Release Info
Developer | supercleanse |
Plugin | Shortlinks by Pretty Links – Best WordPress Link Tracking Plugin |
Version | 3.0.0 |
Comparing to | |
See all releases |
Code changes from version 2.1.10 to 3.0.0
- LICENSE +339 -0
- app/controllers/PrliAppController.php +400 -112
- app/controllers/PrliClicksController.php +21 -34
- app/controllers/PrliGroupsController.php +0 -253
- app/controllers/PrliLinksController.php +560 -374
- app/controllers/PrliLocalApiController.php +18 -18
- app/controllers/PrliOnboardingController.php +61 -0
- app/controllers/PrliOptionsController.php +5 -5
- app/controllers/PrliPopupController.php +27 -30
- app/controllers/PrliPostsController.php +56 -13
- app/controllers/PrliReportsController.php +1 -1
- app/controllers/PrliToolsController.php +9 -4
- app/controllers/PrliUpdateController.php +6 -7
- app/helpers/PrliAppHelper.php +11 -21
- app/helpers/PrliClicksHelper.php +1 -1
- app/helpers/PrliLinksHelper.php +130 -71
- app/models/PrliClick.php +12 -15
- app/models/PrliDb.php +27 -30
- app/models/PrliGroup.php +13 -18
- app/models/PrliLink.php +411 -316
- app/models/PrliOptions.php +5 -5
- app/models/PrliUtils.php +154 -237
- app/views/admin/errors.php +2 -2
- app/views/admin/onboarding/update.php +148 -0
- app/views/admin/onboarding/welcome.php +120 -0
- app/views/admin/popups/rating.php +37 -11
- app/views/admin/popups/upgrade.php +13 -15
- app/views/admin/update/activation_warning.php +55 -9
- app/views/admin/update/addon_popup.php +19 -10
- app/views/admin/update/addons.php +11 -11
- app/views/admin/update/edge_updates.php +2 -2
- app/views/admin/update/license.php +59 -29
- app/views/admin/update/ui.php +3 -3
- app/views/clicks/csv_download.php +5 -5
- app/views/clicks/list.php +47 -49
- app/views/groups/edit.php +35 -17
- app/views/groups/list.php +33 -21
- app/views/groups/new.php +30 -17
- app/views/links/edit.php +0 -19
- app/views/links/form.php +37 -233
- app/views/links/form_advanced.php +92 -0
- app/views/links/form_basic.php +70 -0
- app/views/links/form_pro.php +104 -0
- app/views/links/list.php +0 -163
- app/views/links/new.php +0 -18
- app/views/options/form.php +856 -51
- app/views/shared/errors.php +1 -1
- app/views/shared/jsredirect.php +0 -7
- app/views/shared/link-table-nav.php +20 -21
- app/views/shared/nav.php +5 -5
- app/views/shared/public_link.php +21 -30
- app/views/shared/table-nav.php +17 -14
- app/views/shared/tinymce_form_popup.php +41 -70
- app/views/shared/title_text.php +1 -2
- app/views/tools/form.php +49 -27
- app/views/widgets/widget.php +17 -18
- css/admin_shared.css +187 -2
- css/cloaked-redirect.css +16 -0
- css/menu-styles.css +2 -2
- css/prli-admin-links.css +115 -26
- css/settings_table.css +45 -1
- i18n/pretty-link.pot +2972 -2579
- images/dark_add_twitter_account.png +0 -0
- images/pbar_grad.png +0 -0
- images/pl-logo-horiz-RGB.png +0 -0
- images/pretty-links-logo-color-white.svg +76 -0
- images/pretty-links-plugin-header.jpg +0 -0
- images/twitter.png +0 -0
- images/update-3-0.png +0 -0
- images/update-all-new-link-listing.png +0 -0
- images/update-categories-tags.png +0 -0
- images/update-gutenberg-editor.png +0 -0
- images/update-new-link-editor-1.png +0 -0
- images/update-new-link-editor-2.png +0 -0
- images/welcome-add-new.png +0 -0
- images/welcome-advanced-redirects.png +0 -0
- images/welcome-categories.png +0 -0
- images/welcome-click-update.png +0 -0
- images/welcome-copy-url.png +0 -0
- images/welcome-customize-slug.png +0 -0
- images/welcome-desk.png +0 -0
- images/welcome-dynamic-redirects.png +0 -0
- images/welcome-enter-url.png +0 -0
- images/welcome-import-export.png +0 -0
- images/welcome-link.png +0 -0
- js/admin_link_form.js +65 -0
- js/admin_popup.js +25 -1
- js/admin_shared.js +16 -0
- js/editor.deps.json +1 -0
- js/editor.js +12 -0
- js/editor.js.map +1 -0
- js/editor/components/index.js +1 -0
- js/editor/components/link-editor/index.js +409 -0
- js/editor/components/link-editor/style.scss +8 -0
- js/editor/components/link-editor/utils.js +110 -0
- js/editor/components/url-input/index.js +316 -0
- js/editor/formats/pretty-link/index.js +118 -0
- js/prli-admin-links.js +18 -125
- js/quick_create.js +44 -0
- js/tinymce_form_popup.js +14 -14
- js/vendor/jquery.form-validator.min.js +10 -0
- pretty-link.php +5 -5
- readme.txt +13 -3
- vendor/lib/bootstrap/bootstrap-theme.min.css +5 -0
- vendor/lib/bootstrap/bootstrap.min.css +5 -0
LICENSE
ADDED
@@ -0,0 +1,339 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
GNU GENERAL PUBLIC LICENSE
|
2 |
+
Version 2, June 1991
|
3 |
+
|
4 |
+
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
5 |
+
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
6 |
+
Everyone is permitted to copy and distribute verbatim copies
|
7 |
+
of this license document, but changing it is not allowed.
|
8 |
+
|
9 |
+
Preamble
|
10 |
+
|
11 |
+
The licenses for most software are designed to take away your
|
12 |
+
freedom to share and change it. By contrast, the GNU General Public
|
13 |
+
License is intended to guarantee your freedom to share and change free
|
14 |
+
software--to make sure the software is free for all its users. This
|
15 |
+
General Public License applies to most of the Free Software
|
16 |
+
Foundation's software and to any other program whose authors commit to
|
17 |
+
using it. (Some other Free Software Foundation software is covered by
|
18 |
+
the GNU Lesser General Public License instead.) You can apply it to
|
19 |
+
your programs, too.
|
20 |
+
|
21 |
+
When we speak of free software, we are referring to freedom, not
|
22 |
+
price. Our General Public Licenses are designed to make sure that you
|
23 |
+
have the freedom to distribute copies of free software (and charge for
|
24 |
+
this service if you wish), that you receive source code or can get it
|
25 |
+
if you want it, that you can change the software or use pieces of it
|
26 |
+
in new free programs; and that you know you can do these things.
|
27 |
+
|
28 |
+
To protect your rights, we need to make restrictions that forbid
|
29 |
+
anyone to deny you these rights or to ask you to surrender the rights.
|
30 |
+
These restrictions translate to certain responsibilities for you if you
|
31 |
+
distribute copies of the software, or if you modify it.
|
32 |
+
|
33 |
+
For example, if you distribute copies of such a program, whether
|
34 |
+
gratis or for a fee, you must give the recipients all the rights that
|
35 |
+
you have. You must make sure that they, too, receive or can get the
|
36 |
+
source code. And you must show them these terms so they know their
|
37 |
+
rights.
|
38 |
+
|
39 |
+
We protect your rights with two steps: (1) copyright the software, and
|
40 |
+
(2) offer you this license which gives you legal permission to copy,
|
41 |
+
distribute and/or modify the software.
|
42 |
+
|
43 |
+
Also, for each author's protection and ours, we want to make certain
|
44 |
+
that everyone understands that there is no warranty for this free
|
45 |
+
software. If the software is modified by someone else and passed on, we
|
46 |
+
want its recipients to know that what they have is not the original, so
|
47 |
+
that any problems introduced by others will not reflect on the original
|
48 |
+
authors' reputations.
|
49 |
+
|
50 |
+
Finally, any free program is threatened constantly by software
|
51 |
+
patents. We wish to avoid the danger that redistributors of a free
|
52 |
+
program will individually obtain patent licenses, in effect making the
|
53 |
+
program proprietary. To prevent this, we have made it clear that any
|
54 |
+
patent must be licensed for everyone's free use or not licensed at all.
|
55 |
+
|
56 |
+
The precise terms and conditions for copying, distribution and
|
57 |
+
modification follow.
|
58 |
+
|
59 |
+
GNU GENERAL PUBLIC LICENSE
|
60 |
+
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
61 |
+
|
62 |
+
0. This License applies to any program or other work which contains
|
63 |
+
a notice placed by the copyright holder saying it may be distributed
|
64 |
+
under the terms of this General Public License. The "Program", below,
|
65 |
+
refers to any such program or work, and a "work based on the Program"
|
66 |
+
means either the Program or any derivative work under copyright law:
|
67 |
+
that is to say, a work containing the Program or a portion of it,
|
68 |
+
either verbatim or with modifications and/or translated into another
|
69 |
+
language. (Hereinafter, translation is included without limitation in
|
70 |
+
the term "modification".) Each licensee is addressed as "you".
|
71 |
+
|
72 |
+
Activities other than copying, distribution and modification are not
|
73 |
+
covered by this License; they are outside its scope. The act of
|
74 |
+
running the Program is not restricted, and the output from the Program
|
75 |
+
is covered only if its contents constitute a work based on the
|
76 |
+
Program (independent of having been made by running the Program).
|
77 |
+
Whether that is true depends on what the Program does.
|
78 |
+
|
79 |
+
1. You may copy and distribute verbatim copies of the Program's
|
80 |
+
source code as you receive it, in any medium, provided that you
|
81 |
+
conspicuously and appropriately publish on each copy an appropriate
|
82 |
+
copyright notice and disclaimer of warranty; keep intact all the
|
83 |
+
notices that refer to this License and to the absence of any warranty;
|
84 |
+
and give any other recipients of the Program a copy of this License
|
85 |
+
along with the Program.
|
86 |
+
|
87 |
+
You may charge a fee for the physical act of transferring a copy, and
|
88 |
+
you may at your option offer warranty protection in exchange for a fee.
|
89 |
+
|
90 |
+
2. You may modify your copy or copies of the Program or any portion
|
91 |
+
of it, thus forming a work based on the Program, and copy and
|
92 |
+
distribute such modifications or work under the terms of Section 1
|
93 |
+
above, provided that you also meet all of these conditions:
|
94 |
+
|
95 |
+
a) You must cause the modified files to carry prominent notices
|
96 |
+
stating that you changed the files and the date of any change.
|
97 |
+
|
98 |
+
b) You must cause any work that you distribute or publish, that in
|
99 |
+
whole or in part contains or is derived from the Program or any
|
100 |
+
part thereof, to be licensed as a whole at no charge to all third
|
101 |
+
parties under the terms of this License.
|
102 |
+
|
103 |
+
c) If the modified program normally reads commands interactively
|
104 |
+
when run, you must cause it, when started running for such
|
105 |
+
interactive use in the most ordinary way, to print or display an
|
106 |
+
announcement including an appropriate copyright notice and a
|
107 |
+
notice that there is no warranty (or else, saying that you provide
|
108 |
+
a warranty) and that users may redistribute the program under
|
109 |
+
these conditions, and telling the user how to view a copy of this
|
110 |
+
License. (Exception: if the Program itself is interactive but
|
111 |
+
does not normally print such an announcement, your work based on
|
112 |
+
the Program is not required to print an announcement.)
|
113 |
+
|
114 |
+
These requirements apply to the modified work as a whole. If
|
115 |
+
identifiable sections of that work are not derived from the Program,
|
116 |
+
and can be reasonably considered independent and separate works in
|
117 |
+
themselves, then this License, and its terms, do not apply to those
|
118 |
+
sections when you distribute them as separate works. But when you
|
119 |
+
distribute the same sections as part of a whole which is a work based
|
120 |
+
on the Program, the distribution of the whole must be on the terms of
|
121 |
+
this License, whose permissions for other licensees extend to the
|
122 |
+
entire whole, and thus to each and every part regardless of who wrote it.
|
123 |
+
|
124 |
+
Thus, it is not the intent of this section to claim rights or contest
|
125 |
+
your rights to work written entirely by you; rather, the intent is to
|
126 |
+
exercise the right to control the distribution of derivative or
|
127 |
+
collective works based on the Program.
|
128 |
+
|
129 |
+
In addition, mere aggregation of another work not based on the Program
|
130 |
+
with the Program (or with a work based on the Program) on a volume of
|
131 |
+
a storage or distribution medium does not bring the other work under
|
132 |
+
the scope of this License.
|
133 |
+
|
134 |
+
3. You may copy and distribute the Program (or a work based on it,
|
135 |
+
under Section 2) in object code or executable form under the terms of
|
136 |
+
Sections 1 and 2 above provided that you also do one of the following:
|
137 |
+
|
138 |
+
a) Accompany it with the complete corresponding machine-readable
|
139 |
+
source code, which must be distributed under the terms of Sections
|
140 |
+
1 and 2 above on a medium customarily used for software interchange; or,
|
141 |
+
|
142 |
+
b) Accompany it with a written offer, valid for at least three
|
143 |
+
years, to give any third party, for a charge no more than your
|
144 |
+
cost of physically performing source distribution, a complete
|
145 |
+
machine-readable copy of the corresponding source code, to be
|
146 |
+
distributed under the terms of Sections 1 and 2 above on a medium
|
147 |
+
customarily used for software interchange; or,
|
148 |
+
|
149 |
+
c) Accompany it with the information you received as to the offer
|
150 |
+
to distribute corresponding source code. (This alternative is
|
151 |
+
allowed only for noncommercial distribution and only if you
|
152 |
+
received the program in object code or executable form with such
|
153 |
+
an offer, in accord with Subsection b above.)
|
154 |
+
|
155 |
+
The source code for a work means the preferred form of the work for
|
156 |
+
making modifications to it. For an executable work, complete source
|
157 |
+
code means all the source code for all modules it contains, plus any
|
158 |
+
associated interface definition files, plus the scripts used to
|
159 |
+
control compilation and installation of the executable. However, as a
|
160 |
+
special exception, the source code distributed need not include
|
161 |
+
anything that is normally distributed (in either source or binary
|
162 |
+
form) with the major components (compiler, kernel, and so on) of the
|
163 |
+
operating system on which the executable runs, unless that component
|
164 |
+
itself accompanies the executable.
|
165 |
+
|
166 |
+
If distribution of executable or object code is made by offering
|
167 |
+
access to copy from a designated place, then offering equivalent
|
168 |
+
access to copy the source code from the same place counts as
|
169 |
+
distribution of the source code, even though third parties are not
|
170 |
+
compelled to copy the source along with the object code.
|
171 |
+
|
172 |
+
4. You may not copy, modify, sublicense, or distribute the Program
|
173 |
+
except as expressly provided under this License. Any attempt
|
174 |
+
otherwise to copy, modify, sublicense or distribute the Program is
|
175 |
+
void, and will automatically terminate your rights under this License.
|
176 |
+
However, parties who have received copies, or rights, from you under
|
177 |
+
this License will not have their licenses terminated so long as such
|
178 |
+
parties remain in full compliance.
|
179 |
+
|
180 |
+
5. You are not required to accept this License, since you have not
|
181 |
+
signed it. However, nothing else grants you permission to modify or
|
182 |
+
distribute the Program or its derivative works. These actions are
|
183 |
+
prohibited by law if you do not accept this License. Therefore, by
|
184 |
+
modifying or distributing the Program (or any work based on the
|
185 |
+
Program), you indicate your acceptance of this License to do so, and
|
186 |
+
all its terms and conditions for copying, distributing or modifying
|
187 |
+
the Program or works based on it.
|
188 |
+
|
189 |
+
6. Each time you redistribute the Program (or any work based on the
|
190 |
+
Program), the recipient automatically receives a license from the
|
191 |
+
original licensor to copy, distribute or modify the Program subject to
|
192 |
+
these terms and conditions. You may not impose any further
|
193 |
+
restrictions on the recipients' exercise of the rights granted herein.
|
194 |
+
You are not responsible for enforcing compliance by third parties to
|
195 |
+
this License.
|
196 |
+
|
197 |
+
7. If, as a consequence of a court judgment or allegation of patent
|
198 |
+
infringement or for any other reason (not limited to patent issues),
|
199 |
+
conditions are imposed on you (whether by court order, agreement or
|
200 |
+
otherwise) that contradict the conditions of this License, they do not
|
201 |
+
excuse you from the conditions of this License. If you cannot
|
202 |
+
distribute so as to satisfy simultaneously your obligations under this
|
203 |
+
License and any other pertinent obligations, then as a consequence you
|
204 |
+
may not distribute the Program at all. For example, if a patent
|
205 |
+
license would not permit royalty-free redistribution of the Program by
|
206 |
+
all those who receive copies directly or indirectly through you, then
|
207 |
+
the only way you could satisfy both it and this License would be to
|
208 |
+
refrain entirely from distribution of the Program.
|
209 |
+
|
210 |
+
If any portion of this section is held invalid or unenforceable under
|
211 |
+
any particular circumstance, the balance of the section is intended to
|
212 |
+
apply and the section as a whole is intended to apply in other
|
213 |
+
circumstances.
|
214 |
+
|
215 |
+
It is not the purpose of this section to induce you to infringe any
|
216 |
+
patents or other property right claims or to contest validity of any
|
217 |
+
such claims; this section has the sole purpose of protecting the
|
218 |
+
integrity of the free software distribution system, which is
|
219 |
+
implemented by public license practices. Many people have made
|
220 |
+
generous contributions to the wide range of software distributed
|
221 |
+
through that system in reliance on consistent application of that
|
222 |
+
system; it is up to the author/donor to decide if he or she is willing
|
223 |
+
to distribute software through any other system and a licensee cannot
|
224 |
+
impose that choice.
|
225 |
+
|
226 |
+
This section is intended to make thoroughly clear what is believed to
|
227 |
+
be a consequence of the rest of this License.
|
228 |
+
|
229 |
+
8. If the distribution and/or use of the Program is restricted in
|
230 |
+
certain countries either by patents or by copyrighted interfaces, the
|
231 |
+
original copyright holder who places the Program under this License
|
232 |
+
may add an explicit geographical distribution limitation excluding
|
233 |
+
those countries, so that distribution is permitted only in or among
|
234 |
+
countries not thus excluded. In such case, this License incorporates
|
235 |
+
the limitation as if written in the body of this License.
|
236 |
+
|
237 |
+
9. The Free Software Foundation may publish revised and/or new versions
|
238 |
+
of the General Public License from time to time. Such new versions will
|
239 |
+
be similar in spirit to the present version, but may differ in detail to
|
240 |
+
address new problems or concerns.
|
241 |
+
|
242 |
+
Each version is given a distinguishing version number. If the Program
|
243 |
+
specifies a version number of this License which applies to it and "any
|
244 |
+
later version", you have the option of following the terms and conditions
|
245 |
+
either of that version or of any later version published by the Free
|
246 |
+
Software Foundation. If the Program does not specify a version number of
|
247 |
+
this License, you may choose any version ever published by the Free Software
|
248 |
+
Foundation.
|
249 |
+
|
250 |
+
10. If you wish to incorporate parts of the Program into other free
|
251 |
+
programs whose distribution conditions are different, write to the author
|
252 |
+
to ask for permission. For software which is copyrighted by the Free
|
253 |
+
Software Foundation, write to the Free Software Foundation; we sometimes
|
254 |
+
make exceptions for this. Our decision will be guided by the two goals
|
255 |
+
of preserving the free status of all derivatives of our free software and
|
256 |
+
of promoting the sharing and reuse of software generally.
|
257 |
+
|
258 |
+
NO WARRANTY
|
259 |
+
|
260 |
+
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
261 |
+
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
262 |
+
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
263 |
+
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
264 |
+
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
265 |
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
266 |
+
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
267 |
+
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
268 |
+
REPAIR OR CORRECTION.
|
269 |
+
|
270 |
+
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
271 |
+
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
272 |
+
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
273 |
+
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
274 |
+
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
275 |
+
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
276 |
+
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
277 |
+
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
278 |
+
POSSIBILITY OF SUCH DAMAGES.
|
279 |
+
|
280 |
+
END OF TERMS AND CONDITIONS
|
281 |
+
|
282 |
+
How to Apply These Terms to Your New Programs
|
283 |
+
|
284 |
+
If you develop a new program, and you want it to be of the greatest
|
285 |
+
possible use to the public, the best way to achieve this is to make it
|
286 |
+
free software which everyone can redistribute and change under these terms.
|
287 |
+
|
288 |
+
To do so, attach the following notices to the program. It is safest
|
289 |
+
to attach them to the start of each source file to most effectively
|
290 |
+
convey the exclusion of warranty; and each file should have at least
|
291 |
+
the "copyright" line and a pointer to where the full notice is found.
|
292 |
+
|
293 |
+
<one line to give the program's name and a brief idea of what it does.>
|
294 |
+
Copyright (C) <year> <name of author>
|
295 |
+
|
296 |
+
This program is free software; you can redistribute it and/or modify
|
297 |
+
it under the terms of the GNU General Public License as published by
|
298 |
+
the Free Software Foundation; either version 2 of the License, or
|
299 |
+
(at your option) any later version.
|
300 |
+
|
301 |
+
This program is distributed in the hope that it will be useful,
|
302 |
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
303 |
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
304 |
+
GNU General Public License for more details.
|
305 |
+
|
306 |
+
You should have received a copy of the GNU General Public License along
|
307 |
+
with this program; if not, write to the Free Software Foundation, Inc.,
|
308 |
+
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
309 |
+
|
310 |
+
Also add information on how to contact you by electronic and paper mail.
|
311 |
+
|
312 |
+
If the program is interactive, make it output a short notice like this
|
313 |
+
when it starts in an interactive mode:
|
314 |
+
|
315 |
+
Gnomovision version 69, Copyright (C) year name of author
|
316 |
+
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
317 |
+
This is free software, and you are welcome to redistribute it
|
318 |
+
under certain conditions; type `show c' for details.
|
319 |
+
|
320 |
+
The hypothetical commands `show w' and `show c' should show the appropriate
|
321 |
+
parts of the General Public License. Of course, the commands you use may
|
322 |
+
be called something other than `show w' and `show c'; they could even be
|
323 |
+
mouse-clicks or menu items--whatever suits your program.
|
324 |
+
|
325 |
+
You should also get your employer (if you work as a programmer) or your
|
326 |
+
school, if any, to sign a "copyright disclaimer" for the program, if
|
327 |
+
necessary. Here is a sample; alter the names:
|
328 |
+
|
329 |
+
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
330 |
+
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
331 |
+
|
332 |
+
<signature of Ty Coon>, 1 April 1989
|
333 |
+
Ty Coon, President of Vice
|
334 |
+
|
335 |
+
This General Public License does not permit incorporating your program into
|
336 |
+
proprietary programs. If your program is a subroutine library, you may
|
337 |
+
consider it more useful to permit linking proprietary applications with the
|
338 |
+
library. If this is what you want to do, use the GNU Lesser General
|
339 |
+
Public License instead of this License.
|
app/controllers/PrliAppController.php
CHANGED
@@ -1,16 +1,37 @@
|
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
2 |
|
3 |
class PrliAppController extends PrliBaseController {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
public function load_hooks() {
|
5 |
global $prli_options;
|
6 |
|
7 |
-
add_action('init', array($this, 'parse_standalone_request'));
|
8 |
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
9 |
add_action('admin_menu', array($this, 'menu'), 3); //Hooking in earlier - there's a plugin out there somewhere breaking this action for later plugins
|
10 |
|
|
|
|
|
|
|
|
|
11 |
//Where the magic happens when not in wp-admin nor !GET request
|
12 |
if($_SERVER["REQUEST_METHOD"] == 'GET' && !is_admin()) {
|
13 |
-
add_action('
|
14 |
}
|
15 |
|
16 |
// Hook into the 'wp_dashboard_setup' action to register our other functions
|
@@ -23,88 +44,218 @@ class PrliAppController extends PrliBaseController {
|
|
23 |
add_action('init', array($this, 'install'));
|
24 |
|
25 |
add_filter( 'plugin_action_links_' . PRLI_PLUGIN_SLUG, array($this,'add_plugin_action_links') );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
26 |
}
|
27 |
|
28 |
public function menu() {
|
29 |
global $prli_options, $plp_options, $plp_update;
|
30 |
|
|
|
|
|
31 |
$role = 'manage_options';
|
32 |
-
if(isset($plp_options->min_role))
|
33 |
$role = $plp_options->min_role;
|
|
|
34 |
|
35 |
-
$
|
36 |
-
__('Pretty Links | Manage Pretty Links', 'pretty-link'),
|
37 |
-
__('Pretty Links', 'pretty-link'),
|
38 |
-
$role, 'pretty-link',
|
39 |
-
'PrliLinksController::route',
|
40 |
-
PRLI_IMAGES_URL.'/pretty-link-small.png'
|
41 |
-
);
|
42 |
-
|
43 |
-
$prli_menu_hook = add_submenu_page(
|
44 |
-
'pretty-link',
|
45 |
-
__('Pretty Links | Manage Pretty Links', 'pretty-link'),
|
46 |
-
__('Pretty Links', 'pretty-link'),
|
47 |
-
$role, 'pretty-link',
|
48 |
-
'PrliLinksController::route'
|
49 |
-
);
|
50 |
-
|
51 |
-
$prli_add_links_menu_hook = add_submenu_page(
|
52 |
-
'pretty-link',
|
53 |
-
__('Pretty Links | Add New Link', 'pretty-link'),
|
54 |
-
__('Add New Link', 'pretty-link'),
|
55 |
-
$role, 'add-new-pretty-link',
|
56 |
-
'PrliLinksController::new_link'
|
57 |
-
);
|
58 |
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
|
68 |
if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking != 'count' ) {
|
69 |
$clicks_ctrl = new PrliClicksController();
|
70 |
-
add_submenu_page(
|
71 |
-
'pretty-link',
|
72 |
-
__('Pretty Links | Clicks', 'pretty-link'),
|
73 |
-
__('Clicks', 'pretty-link'),
|
74 |
-
$role, 'pretty-link-clicks',
|
75 |
-
array( $clicks_ctrl, 'route' )
|
76 |
-
);
|
77 |
}
|
78 |
|
79 |
$routes_ctrl = new PrliToolsController();
|
80 |
-
add_submenu_page(
|
81 |
-
'pretty-link',
|
82 |
-
__('Pretty Links | Tools', 'pretty-link'),
|
83 |
-
__('Tools', 'pretty-link'),
|
84 |
-
$role, 'pretty-link-tools',
|
85 |
-
array($routes_ctrl,'route')
|
86 |
-
);
|
87 |
|
88 |
$options_ctrl = new PrliOptionsController();
|
89 |
-
add_submenu_page(
|
90 |
-
'pretty-link',
|
91 |
-
__('Pretty Links | Options', 'pretty-link'),
|
92 |
-
__('Options', 'pretty-link'),
|
93 |
-
$role, 'pretty-link-options',
|
94 |
-
array( $options_ctrl, 'route' )
|
95 |
-
);
|
96 |
|
97 |
if(!defined('PRETTYLINK_LICENSE_KEY') && class_exists('PrliUpdateController')) {
|
98 |
if($plp_update->is_installed_and_activated()) {
|
99 |
-
add_submenu_page(
|
100 |
}
|
101 |
else if($plp_update->is_installed()) {
|
102 |
-
add_submenu_page(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
103 |
}
|
104 |
else {
|
105 |
-
|
106 |
}
|
107 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
108 |
}
|
109 |
|
110 |
public function add_plugin_action_links($links) {
|
@@ -113,32 +264,43 @@ class PrliAppController extends PrliBaseController {
|
|
113 |
$pllinks = array();
|
114 |
|
115 |
if($plp_update->is_installed_and_activated()) {
|
116 |
-
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/activated/docs" target="_blank">'.
|
117 |
-
$pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'">'.
|
118 |
}
|
119 |
else if($plp_update->is_installed()) {
|
120 |
-
$pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'" class="prli-menu-green">'.
|
121 |
-
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/installed/buy" target="_blank" class="prli-menu-red">'.
|
122 |
-
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/installed/docs" target="_blank">'.
|
123 |
}
|
124 |
else {
|
125 |
-
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/lite/upgrade" class="prli-menu-red" target="_blank">'.
|
126 |
-
$pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'" class="prli-menu-green">'.
|
127 |
-
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/lite/docs" target="_blank">'.
|
128 |
}
|
129 |
|
130 |
return array_merge($pllinks, $links);
|
131 |
}
|
132 |
|
133 |
public function enqueue_admin_scripts($hook) {
|
134 |
-
global $wp_version;
|
135 |
|
136 |
-
wp_enqueue_style( 'prli-fontello-animation',
|
137 |
-
PRLI_VENDOR_LIB_URL.'/fontello/css/animation.css',
|
138 |
-
array(), PRLI_VERSION );
|
139 |
wp_enqueue_style( 'prli-fontello-pretty-link',
|
140 |
PRLI_VENDOR_LIB_URL.'/fontello/css/pretty-link.css',
|
141 |
-
array(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
142 |
|
143 |
// If we're in 3.8 now then use a font for the admin image
|
144 |
if( version_compare( $wp_version, '3.8', '>=' ) ) {
|
@@ -146,23 +308,34 @@ class PrliAppController extends PrliBaseController {
|
|
146 |
array('prli-fontello-pretty-link'), PRLI_VERSION );
|
147 |
}
|
148 |
|
149 |
-
$
|
150 |
-
$
|
151 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
152 |
|
153 |
-
if(strstr($hook, 'pretty-link') !== false) {
|
154 |
-
wp_register_style('pl-ui-smoothness', $url);
|
155 |
-
wp_register_style('prli-simplegrid', PRLI_CSS_URL.'/simplegrid.css', array(), PRLI_VERSION);
|
156 |
-
wp_register_style('prli-social', PRLI_CSS_URL.'/social_buttons.css', array(), PRLI_VERSION);
|
157 |
wp_enqueue_style(
|
158 |
'prli-admin-shared',
|
159 |
PRLI_CSS_URL.'/admin_shared.css',
|
160 |
-
|
161 |
-
'pl-ui-smoothness',
|
162 |
-
'wp-pointer',
|
163 |
-
'prli-simplegrid',
|
164 |
-
'prli-social',
|
165 |
-
),
|
166 |
PRLI_VERSION
|
167 |
);
|
168 |
|
@@ -191,9 +364,25 @@ class PrliAppController extends PrliBaseController {
|
|
191 |
),
|
192 |
PRLI_VERSION
|
193 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
194 |
}
|
195 |
|
196 |
-
if(
|
197 |
wp_enqueue_style( 'prli-admin-links', PRLI_CSS_URL . '/prli-admin-links.css', array(), PRLI_VERSION );
|
198 |
//wp_enqueue_script( 'jquery-clippy', PRLI_JS_URL . '/jquery.clippy.js', array('jquery'), PRLI_VERSION );
|
199 |
wp_enqueue_script( 'clipboard-js', PRLI_JS_URL . '/clipboard.min.js', null, PRLI_VERSION );
|
@@ -204,37 +393,35 @@ class PrliAppController extends PrliBaseController {
|
|
204 |
wp_enqueue_script( 'prli-admin-links', PRLI_JS_URL . '/prli-admin-links.js', array('jquery','clipboard-js','jquery-tooltipster'), PRLI_VERSION );
|
205 |
|
206 |
wp_enqueue_script( 'prli-admin-link-list', PRLI_JS_URL . '/admin_link_list.js', array('jquery','clipboard-js','jquery-tooltipster'), PRLI_VERSION );
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
wp_enqueue_script('pl-groups', PRLI_JS_URL.'/admin_groups.js', array('jquery'), PRLI_VERSION);
|
213 |
}
|
214 |
|
215 |
-
if(
|
216 |
wp_enqueue_style('pl-options', PRLI_CSS_URL.'/admin_options.css', null, PRLI_VERSION);
|
217 |
wp_enqueue_script('pl-options', PRLI_JS_URL.'/admin_options.js', array('jquery'), PRLI_VERSION);
|
218 |
}
|
219 |
|
220 |
-
if(
|
221 |
-
'
|
222 |
-
|
223 |
-
'pretty-links_page_pretty-link-tools',
|
224 |
-
'pretty-links_page_pretty-link-options'
|
225 |
-
))) {
|
226 |
wp_enqueue_style('pl-settings-table', PRLI_CSS_URL.'/settings_table.css', null, PRLI_VERSION);
|
227 |
wp_enqueue_script('pl-settings-table', PRLI_JS_URL.'/settings_table.js', array('jquery'), PRLI_VERSION);
|
228 |
}
|
229 |
|
230 |
-
if(
|
231 |
wp_enqueue_script('google-visualization-api', 'https://www.gstatic.com/charts/loader.js', null, PRLI_VERSION);
|
232 |
wp_enqueue_style('pl-reports', PRLI_CSS_URL.'/admin_reports.css', null, PRLI_VERSION);
|
233 |
wp_enqueue_script('pl-reports', PRLI_JS_URL.'/admin_reports.js', array('jquery','google-visualization-api'), PRLI_VERSION);
|
234 |
wp_localize_script('pl-reports', 'PrliReport', PrliReportsController::chart_data());
|
235 |
}
|
236 |
|
237 |
-
|
|
|
|
|
238 |
}
|
239 |
|
240 |
public function parse_standalone_request() {
|
@@ -259,16 +446,22 @@ class PrliAppController extends PrliBaseController {
|
|
259 |
$prli_db = new PrliDb();
|
260 |
|
261 |
if($prli_db->should_install()) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
262 |
@ignore_user_abort(true);
|
263 |
@set_time_limit(0);
|
264 |
$prli_db->prli_install();
|
265 |
-
}
|
266 |
|
267 |
-
|
268 |
-
if($plp_update->is_installed() && $prli_utils->should_install_pro_db()) {
|
269 |
-
@ignore_user_abort(true);
|
270 |
-
@set_time_limit(0);
|
271 |
-
$prli_utils->install_pro_db();
|
272 |
}
|
273 |
}
|
274 |
|
@@ -281,14 +474,28 @@ class PrliAppController extends PrliBaseController {
|
|
281 |
$reinstall_url = wp_nonce_url('update.php?action=upgrade-plugin&plugin=pretty-link/pretty-link.php', 'upgrade-plugin_pretty-link/pretty-link.php');
|
282 |
?>
|
283 |
|
284 |
-
<div class="updated notice notice-success"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
285 |
<?php
|
286 |
}
|
287 |
|
288 |
if(isset($_GET['action']) and $_GET['action'] == 'pro-uninstall') {
|
289 |
$prli_utils->uninstall_pro();
|
290 |
?>
|
291 |
-
<div class="updated notice notice-success is-dismissible"><p><strong><?php
|
292 |
<?php
|
293 |
}
|
294 |
|
@@ -330,10 +537,16 @@ class PrliAppController extends PrliBaseController {
|
|
330 |
|
331 |
/********* DASHBOARD WIDGET ***********/
|
332 |
public function dashboard_widget_function() {
|
333 |
-
global $
|
|
|
|
|
334 |
|
335 |
-
|
336 |
-
|
|
|
|
|
|
|
|
|
337 |
|
338 |
require_once(PRLI_VIEWS_PATH . '/widgets/widget.php');
|
339 |
}
|
@@ -349,7 +562,7 @@ class PrliAppController extends PrliBaseController {
|
|
349 |
}
|
350 |
|
351 |
if(current_user_can($role)) {
|
352 |
-
wp_add_dashboard_widget('prli_dashboard_widget',
|
353 |
|
354 |
// Globalize the metaboxes array, this holds all the widgets for wp-admin
|
355 |
global $wp_meta_boxes;
|
@@ -437,4 +650,79 @@ class PrliAppController extends PrliBaseController {
|
|
437 |
public static function close_about_notice() {
|
438 |
update_option('prli_about_notice_version',PRLI_VERSION);
|
439 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
440 |
}
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
2 |
|
3 |
class PrliAppController extends PrliBaseController {
|
4 |
+
public $screens;
|
5 |
+
|
6 |
+
public function __construct() {
|
7 |
+
$this->screens = array(
|
8 |
+
'add-edit' => 'pretty-link',
|
9 |
+
'list' => 'edit-pretty-link',
|
10 |
+
'category' => 'edit-pretty-link-category',
|
11 |
+
'tag' => 'edit-pretty-link-tag',
|
12 |
+
'clicks' => 'pretty-links_page_pretty-link-clicks',
|
13 |
+
'reports' => 'pretty-links_page_plp-reports',
|
14 |
+
'tools' => 'pretty-links_page_pretty-link-tools',
|
15 |
+
'options' => 'pretty-links_page_pretty-link-options',
|
16 |
+
'imp-exp' => 'pretty-links_page_plp-import-export',
|
17 |
+
'activate' => 'pretty-links_page_pretty-link-updates'
|
18 |
+
);
|
19 |
+
}
|
20 |
+
|
21 |
public function load_hooks() {
|
22 |
global $prli_options;
|
23 |
|
24 |
+
add_action('init', array($this, 'parse_standalone_request'), 15); // Later so that the category taxonomy exists for the custom bookmarklet
|
25 |
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
|
26 |
add_action('admin_menu', array($this, 'menu'), 3); //Hooking in earlier - there's a plugin out there somewhere breaking this action for later plugins
|
27 |
|
28 |
+
add_action('custom_menu_order', array($this,'admin_menu_order'));
|
29 |
+
add_action('menu_order', array($this,'admin_menu_order'));
|
30 |
+
add_action('menu_order', array($this,'admin_submenu_order'));
|
31 |
+
|
32 |
//Where the magic happens when not in wp-admin nor !GET request
|
33 |
if($_SERVER["REQUEST_METHOD"] == 'GET' && !is_admin()) {
|
34 |
+
add_action('init', array($this, 'redirect'), 1); // Redirect
|
35 |
}
|
36 |
|
37 |
// Hook into the 'wp_dashboard_setup' action to register our other functions
|
44 |
add_action('init', array($this, 'install'));
|
45 |
|
46 |
add_filter( 'plugin_action_links_' . PRLI_PLUGIN_SLUG, array($this,'add_plugin_action_links') );
|
47 |
+
|
48 |
+
add_action('in_admin_header', array($this,'pl_admin_header'), 0);
|
49 |
+
|
50 |
+
// Admin footer text.
|
51 |
+
add_filter( 'admin_footer_text', array( $this, 'admin_footer' ), 1, 2 );
|
52 |
+
}
|
53 |
+
|
54 |
+
public function pl_admin_header() {
|
55 |
+
global $current_screen;
|
56 |
+
|
57 |
+
if($this->on_pretty_link_page()) {
|
58 |
+
?>
|
59 |
+
<div id="pl-admin-header"><img class="pl-logo" src="<?php echo PRLI_IMAGES_URL . '/pretty-links-logo-color-white.svg'; ?>" /></div>
|
60 |
+
<?php
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
private function on_pretty_link_page() {
|
65 |
+
global $current_screen;
|
66 |
+
return (isset($current_screen->id) && strpos($current_screen->id,'pretty-link') !== false);
|
67 |
}
|
68 |
|
69 |
public function menu() {
|
70 |
global $prli_options, $plp_options, $plp_update;
|
71 |
|
72 |
+
$this->admin_separator();
|
73 |
+
|
74 |
$role = 'manage_options';
|
75 |
+
if(isset($plp_options->min_role)) {
|
76 |
$role = $plp_options->min_role;
|
77 |
+
}
|
78 |
|
79 |
+
$pl_link_cpt = PrliLink::$cpt;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
|
81 |
+
if(!$plp_update->is_installed()) {
|
82 |
+
add_submenu_page(
|
83 |
+
"edit.php?post_type={$pl_link_cpt}",
|
84 |
+
esc_html__('Link Categories [Pro Only]', 'pretty-link'),
|
85 |
+
esc_html__('Categories [Pro]', 'pretty-link'),
|
86 |
+
$role,
|
87 |
+
"https://prettylinks.com/pl/main-menu/upgrade?categories",
|
88 |
+
false
|
89 |
+
);
|
90 |
+
add_submenu_page(
|
91 |
+
"edit.php?post_type={$pl_link_cpt}",
|
92 |
+
esc_html__('Link Tags [Pro Only]', 'pretty-link'),
|
93 |
+
esc_html__('Tags [Pro]', 'pretty-link'),
|
94 |
+
$role,
|
95 |
+
"https://prettylinks.com/pl/main-menu/upgrade?tags",
|
96 |
+
false
|
97 |
+
);
|
98 |
+
add_submenu_page(
|
99 |
+
"edit.php?post_type={$pl_link_cpt}",
|
100 |
+
esc_html__('Link Reports [Pro Only]', 'pretty-link'),
|
101 |
+
esc_html__('Reports [Pro]', 'pretty-link'),
|
102 |
+
$role,
|
103 |
+
"https://prettylinks.com/pl/main-menu/upgrade?reports",
|
104 |
+
false
|
105 |
+
);
|
106 |
+
add_submenu_page(
|
107 |
+
"edit.php?post_type={$pl_link_cpt}",
|
108 |
+
esc_html__('Import / Export [Pro Only]', 'pretty-link'),
|
109 |
+
esc_html__('Import / Export [Pro]', 'pretty-link'),
|
110 |
+
$role,
|
111 |
+
"https://prettylinks.com/pl/main-menu/upgrade?import-export",
|
112 |
+
false
|
113 |
+
);
|
114 |
+
}
|
115 |
|
116 |
if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking != 'count' ) {
|
117 |
$clicks_ctrl = new PrliClicksController();
|
118 |
+
add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Pretty Links | Clicks', 'pretty-link'), esc_html__('Clicks', 'pretty-link'), $role, 'pretty-link-clicks', array( $clicks_ctrl, 'route' ) );
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
}
|
120 |
|
121 |
$routes_ctrl = new PrliToolsController();
|
122 |
+
add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Pretty Links | Tools', 'pretty-link'), esc_html__('Tools', 'pretty-link'), $role, 'pretty-link-tools', array($routes_ctrl,'route') );
|
|
|
|
|
|
|
|
|
|
|
|
|
123 |
|
124 |
$options_ctrl = new PrliOptionsController();
|
125 |
+
add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Pretty Links | Options', 'pretty-link'), esc_html__('Options', 'pretty-link'), $role, 'pretty-link-options', array( $options_ctrl, 'route' ));
|
|
|
|
|
|
|
|
|
|
|
|
|
126 |
|
127 |
if(!defined('PRETTYLINK_LICENSE_KEY') && class_exists('PrliUpdateController')) {
|
128 |
if($plp_update->is_installed_and_activated()) {
|
129 |
+
add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Activate', 'pretty-link'), esc_html__('Activate', 'pretty-link'), $role, 'pretty-link-updates', array($plp_update, 'route'));
|
130 |
}
|
131 |
else if($plp_update->is_installed()) {
|
132 |
+
add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Activate', 'pretty-link'), '<span class="prli-menu-red"><b>'.esc_html__('Activate', 'pretty-link').'</b></span>', $role, 'pretty-link-updates', array($plp_update, 'route'));
|
133 |
+
}
|
134 |
+
else {
|
135 |
+
add_submenu_page( "edit.php?post_type={$pl_link_cpt}", esc_html__('Upgrade', 'pretty-link'), '<span class="prli-menu-red"><b>'.esc_html__('Upgrade', 'pretty-link').'</b></span>', $role, 'pretty-link-updates', array($plp_update, 'route'));
|
136 |
+
}
|
137 |
+
}
|
138 |
+
|
139 |
+
$onboarding_ctrl = new PrliOnboardingController();
|
140 |
+
add_submenu_page('options.php', __('Welcome', 'pretty-link'), null, $role, 'pretty-link-welcome', array($onboarding_ctrl, 'welcome_route'));
|
141 |
+
add_submenu_page('options.php', __("What's New", 'pretty-link'), null, $role, 'pretty-link-update', array($onboarding_ctrl, 'update_route'));
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Add a separator to the WordPress admin menus
|
146 |
+
*/
|
147 |
+
public function admin_separator()
|
148 |
+
{
|
149 |
+
global $menu;
|
150 |
+
|
151 |
+
// Prevent duplicate separators when no core menu items exist
|
152 |
+
if(!PrliUtils::is_admin()) { return; }
|
153 |
+
|
154 |
+
$menu[] = array('', 'read', 'separator-pretty-link', '', 'wp-menu-separator pretty-link');
|
155 |
+
}
|
156 |
+
|
157 |
+
/*
|
158 |
+
* Move our custom separator above our admin menu
|
159 |
+
*
|
160 |
+
* @param array $menu_order Menu Order
|
161 |
+
* @return array Modified menu order
|
162 |
+
*/
|
163 |
+
public function admin_menu_order($menu_order) {
|
164 |
+
if(!$menu_order) {
|
165 |
+
return true;
|
166 |
+
}
|
167 |
+
|
168 |
+
if(!is_array($menu_order)) {
|
169 |
+
return $menu_order;
|
170 |
+
}
|
171 |
+
|
172 |
+
// Initialize our custom order array
|
173 |
+
$new_menu_order = array();
|
174 |
+
|
175 |
+
// Menu values
|
176 |
+
$second_sep = 'separator2';
|
177 |
+
$pl_link_cpt = PrliLink::$cpt;
|
178 |
+
$custom_menus = array('separator-pretty-link', "edit.php?post_type={$pl_link_cpt}");
|
179 |
+
|
180 |
+
// Loop through menu order and do some rearranging
|
181 |
+
foreach($menu_order as $item) {
|
182 |
+
// Position Pretty Links menu above appearance
|
183 |
+
if($second_sep == $item) {
|
184 |
+
// Add our custom menus
|
185 |
+
foreach($custom_menus as $custom_menu) {
|
186 |
+
if(array_search($custom_menu, $menu_order)) {
|
187 |
+
$new_menu_order[] = $custom_menu;
|
188 |
+
}
|
189 |
+
}
|
190 |
+
// Add the appearance separator
|
191 |
+
$new_menu_order[] = $second_sep;
|
192 |
+
// Skip our menu items down below
|
193 |
+
}
|
194 |
+
elseif(!in_array($item, $custom_menus)) {
|
195 |
+
$new_menu_order[] = $item;
|
196 |
+
}
|
197 |
+
}
|
198 |
+
|
199 |
+
// Return our custom order
|
200 |
+
return $new_menu_order;
|
201 |
+
}
|
202 |
+
|
203 |
+
//Organize the CPT's in our submenu
|
204 |
+
public function admin_submenu_order($menu_order) {
|
205 |
+
global $submenu;
|
206 |
+
|
207 |
+
static $run = false;
|
208 |
+
|
209 |
+
//no sense in running this everytime the hook gets called
|
210 |
+
if($run) { return $menu_order; }
|
211 |
+
|
212 |
+
$pl_link_cpt = PrliLink::$cpt;
|
213 |
+
$slug = "edit.php?post_type={$pl_link_cpt}";
|
214 |
+
|
215 |
+
//just return if there's no pretty-link menu available for the current screen
|
216 |
+
if(!isset($submenu[$slug])) { return $menu_order; }
|
217 |
+
|
218 |
+
$run = true;
|
219 |
+
$new_order = array();
|
220 |
+
|
221 |
+
$categories_ctax = class_exists('PlpLinkCategoriesController') ? PlpLinkCategoriesController::$ctax : 'pretty-link-category';
|
222 |
+
$tags_ctax = class_exists('PlpLinkTagsController') ? PlpLinkTagsController::$ctax : 'pretty-link-tag';
|
223 |
+
|
224 |
+
$include_array = array(
|
225 |
+
$slug,
|
226 |
+
"post-new.php?post_type={$pl_link_cpt}",
|
227 |
+
"edit-tags.php?taxonomy={$categories_ctax}&post_type={$pl_link_cpt}",
|
228 |
+
'https://prettylinks.com/pl/main-menu/upgrade?categories',
|
229 |
+
"edit-tags.php?taxonomy={$tags_ctax}&post_type={$pl_link_cpt}",
|
230 |
+
'https://prettylinks.com/pl/main-menu/upgrade?tags',
|
231 |
+
'pretty-link-clicks',
|
232 |
+
'plp-reports',
|
233 |
+
'https://prettylinks.com/pl/main-menu/upgrade?reports',
|
234 |
+
'pretty-link-tools',
|
235 |
+
'pretty-link-options',
|
236 |
+
'plp-import-export',
|
237 |
+
'https://prettylinks.com/pl/main-menu/upgrade?import-export',
|
238 |
+
'pretty-link-updates'
|
239 |
+
);
|
240 |
+
|
241 |
+
$i = (count($include_array) - 1);
|
242 |
+
|
243 |
+
foreach($submenu[$slug] as $sub) {
|
244 |
+
$include_order = array_search($sub[2], $include_array);
|
245 |
+
|
246 |
+
if(false !== $include_order) {
|
247 |
+
$new_order[$include_order] = $sub;
|
248 |
}
|
249 |
else {
|
250 |
+
$new_order[$i++] = $sub;
|
251 |
}
|
252 |
}
|
253 |
+
|
254 |
+
ksort($new_order);
|
255 |
+
|
256 |
+
$submenu[$slug] = $new_order;
|
257 |
+
|
258 |
+
return $menu_order;
|
259 |
}
|
260 |
|
261 |
public function add_plugin_action_links($links) {
|
264 |
$pllinks = array();
|
265 |
|
266 |
if($plp_update->is_installed_and_activated()) {
|
267 |
+
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/activated/docs" target="_blank">'.esc_html__('Docs', 'pretty-link').'</a>';
|
268 |
+
$pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'">'.esc_html__('Activate', 'pretty-link').'</a>';
|
269 |
}
|
270 |
else if($plp_update->is_installed()) {
|
271 |
+
$pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'" class="prli-menu-green">'.esc_html__('Activate Pro License', 'pretty-link').'</a>';
|
272 |
+
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/installed/buy" target="_blank" class="prli-menu-red">'.esc_html__('Buy', 'pretty-link').'</a>';
|
273 |
+
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/installed/docs" target="_blank">'.esc_html__('Docs', 'pretty-link').'</a>';
|
274 |
}
|
275 |
else {
|
276 |
+
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/lite/upgrade" class="prli-menu-red" target="_blank">'.esc_html__('Upgrade to Pro', 'pretty-link').'</a>';
|
277 |
+
$pllinks[] = '<a href="'. esc_url( get_admin_url(null, 'admin.php?page=pretty-link-updates') ) .'" class="prli-menu-green">'.esc_html__('Activate Pro License', 'pretty-link').'</a>';
|
278 |
+
$pllinks[] = '<a href="https://prettylinks.com/pl/plugin-actions/lite/docs" target="_blank">'.esc_html__('Docs', 'pretty-link').'</a>';
|
279 |
}
|
280 |
|
281 |
return array_merge($pllinks, $links);
|
282 |
}
|
283 |
|
284 |
public function enqueue_admin_scripts($hook) {
|
285 |
+
global $wp_version, $current_screen;
|
286 |
|
|
|
|
|
|
|
287 |
wp_enqueue_style( 'prli-fontello-pretty-link',
|
288 |
PRLI_VENDOR_LIB_URL.'/fontello/css/pretty-link.css',
|
289 |
+
array(), PRLI_VERSION );
|
290 |
+
|
291 |
+
if (version_compare($wp_version, '5.2', '>=')) {
|
292 |
+
wp_enqueue_script(
|
293 |
+
'pretty-link-richtext-format',
|
294 |
+
PRLI_JS_URL . '/editor.js',
|
295 |
+
['wp-editor', 'wp-i18n', 'wp-element', 'wp-compose', 'wp-components'],
|
296 |
+
PRLI_VERSION,
|
297 |
+
true
|
298 |
+
);
|
299 |
+
|
300 |
+
wp_localize_script('pretty-link-richtext-format', 'plEditor', array(
|
301 |
+
'homeUrl' => trailingslashit(get_home_url())
|
302 |
+
));
|
303 |
+
}
|
304 |
|
305 |
// If we're in 3.8 now then use a font for the admin image
|
306 |
if( version_compare( $wp_version, '3.8', '>=' ) ) {
|
308 |
array('prli-fontello-pretty-link'), PRLI_VERSION );
|
309 |
}
|
310 |
|
311 |
+
$is_pl_page = $this->is_pretty_link_page();
|
312 |
+
$is_link_page = $this->is_pretty_link_link_page();
|
313 |
+
$is_link_listing_page = $this->is_pretty_link_listing_page();
|
314 |
+
$is_link_edit_page = $this->is_pretty_link_edit_page();
|
315 |
+
$is_link_new_page = $this->is_pretty_link_new_page();
|
316 |
+
|
317 |
+
if( $is_pl_page || $is_link_page ) {
|
318 |
+
$prli_admin_shared_prereqs = array( 'wp-pointer' );
|
319 |
+
|
320 |
+
if(!$is_link_listing_page) {
|
321 |
+
wp_register_style('pl-ui-smoothness', PRLI_VENDOR_LIB_URL.'/jquery-ui/jquery-ui.min.css', array(), '1.11.4');
|
322 |
+
wp_register_style('prli-simplegrid', PRLI_CSS_URL.'/simplegrid.css', array(), PRLI_VERSION);
|
323 |
+
wp_register_style('prli-social', PRLI_CSS_URL.'/social_buttons.css', array(), PRLI_VERSION);
|
324 |
+
|
325 |
+
$prli_admin_shared_prereqs = array_merge(
|
326 |
+
$prli_admin_shared_prereqs,
|
327 |
+
array(
|
328 |
+
'pl-ui-smoothness',
|
329 |
+
'prli-simplegrid',
|
330 |
+
'prli-social',
|
331 |
+
)
|
332 |
+
);
|
333 |
+
}
|
334 |
|
|
|
|
|
|
|
|
|
335 |
wp_enqueue_style(
|
336 |
'prli-admin-shared',
|
337 |
PRLI_CSS_URL.'/admin_shared.css',
|
338 |
+
$prli_admin_shared_prereqs,
|
|
|
|
|
|
|
|
|
|
|
339 |
PRLI_VERSION
|
340 |
);
|
341 |
|
364 |
),
|
365 |
PRLI_VERSION
|
366 |
);
|
367 |
+
|
368 |
+
if($is_link_edit_page || $is_link_new_page) {
|
369 |
+
global $prli_link, $post;
|
370 |
+
|
371 |
+
$link_id = $prli_link->get_link_from_cpt($post->ID);
|
372 |
+
|
373 |
+
$args = array( 'args' => array(
|
374 |
+
'id' => $link_id,
|
375 |
+
'action' => 'validate_pretty_link',
|
376 |
+
'security' => wp_create_nonce( 'validate_pretty_link' ),
|
377 |
+
'update' => __('Update', 'pretty-link') // Use default text domain
|
378 |
+
) );
|
379 |
+
|
380 |
+
wp_enqueue_script( 'prli-link-form', PRLI_JS_URL . '/admin_link_form.js', array(), PRLI_VERSION);
|
381 |
+
wp_localize_script( 'prli-link-form', 'PrliLinkValidation', $args );
|
382 |
+
}
|
383 |
}
|
384 |
|
385 |
+
if($current_screen->post_type == PrliLink::$cpt) {
|
386 |
wp_enqueue_style( 'prli-admin-links', PRLI_CSS_URL . '/prli-admin-links.css', array(), PRLI_VERSION );
|
387 |
//wp_enqueue_script( 'jquery-clippy', PRLI_JS_URL . '/jquery.clippy.js', array('jquery'), PRLI_VERSION );
|
388 |
wp_enqueue_script( 'clipboard-js', PRLI_JS_URL . '/clipboard.min.js', null, PRLI_VERSION );
|
393 |
wp_enqueue_script( 'prli-admin-links', PRLI_JS_URL . '/prli-admin-links.js', array('jquery','clipboard-js','jquery-tooltipster'), PRLI_VERSION );
|
394 |
|
395 |
wp_enqueue_script( 'prli-admin-link-list', PRLI_JS_URL . '/admin_link_list.js', array('jquery','clipboard-js','jquery-tooltipster'), PRLI_VERSION );
|
396 |
+
$links_js_obj = array(
|
397 |
+
'reset_str' => __('Are you sure you want to reset your Pretty Link? This will delete all of the statistical data about this Pretty Link in your database.', 'pretty-link'),
|
398 |
+
'reset_security' => wp_create_nonce('reset_pretty_link')
|
399 |
+
);
|
400 |
+
wp_localize_script( 'prli-admin-link-list', 'PrliLinkList', $links_js_obj );
|
|
|
401 |
}
|
402 |
|
403 |
+
if( preg_match('/_page_pretty-link-options$/', $hook) ) {
|
404 |
wp_enqueue_style('pl-options', PRLI_CSS_URL.'/admin_options.css', null, PRLI_VERSION);
|
405 |
wp_enqueue_script('pl-options', PRLI_JS_URL.'/admin_options.js', array('jquery'), PRLI_VERSION);
|
406 |
}
|
407 |
|
408 |
+
if( preg_match('/_page_pretty-link-tools$/', $hook) ||
|
409 |
+
preg_match('/_page_pretty-link-options$/', $hook) ||
|
410 |
+
$current_screen->post_type == PrliLink::$cpt ) {
|
|
|
|
|
|
|
411 |
wp_enqueue_style('pl-settings-table', PRLI_CSS_URL.'/settings_table.css', null, PRLI_VERSION);
|
412 |
wp_enqueue_script('pl-settings-table', PRLI_JS_URL.'/settings_table.js', array('jquery'), PRLI_VERSION);
|
413 |
}
|
414 |
|
415 |
+
if( preg_match('/_page_pretty-link-clicks$/', $hook) ) {
|
416 |
wp_enqueue_script('google-visualization-api', 'https://www.gstatic.com/charts/loader.js', null, PRLI_VERSION);
|
417 |
wp_enqueue_style('pl-reports', PRLI_CSS_URL.'/admin_reports.css', null, PRLI_VERSION);
|
418 |
wp_enqueue_script('pl-reports', PRLI_JS_URL.'/admin_reports.js', array('jquery','google-visualization-api'), PRLI_VERSION);
|
419 |
wp_localize_script('pl-reports', 'PrliReport', PrliReportsController::chart_data());
|
420 |
}
|
421 |
|
422 |
+
|
423 |
+
$page_vars = compact('is_pl_page', 'is_link_page', 'is_link_listing_page', 'is_link_edit_page', 'is_link_new_page');
|
424 |
+
do_action('prli_load_admin_scripts', $hook, $page_vars);
|
425 |
}
|
426 |
|
427 |
public function parse_standalone_request() {
|
446 |
$prli_db = new PrliDb();
|
447 |
|
448 |
if($prli_db->should_install()) {
|
449 |
+
// For some reason, install gets called multiple times so we're basically
|
450 |
+
// adding a mutex here (ala a transient) to ensure this only gets run once
|
451 |
+
$is_installing = get_transient('prli_installing');
|
452 |
+
if($is_installing) {
|
453 |
+
return;
|
454 |
+
}
|
455 |
+
else {
|
456 |
+
// 30 minutes
|
457 |
+
set_transient('prli_installing', 1, 60*30);
|
458 |
+
}
|
459 |
+
|
460 |
@ignore_user_abort(true);
|
461 |
@set_time_limit(0);
|
462 |
$prli_db->prli_install();
|
|
|
463 |
|
464 |
+
delete_transient('prli_installing');
|
|
|
|
|
|
|
|
|
465 |
}
|
466 |
}
|
467 |
|
474 |
$reinstall_url = wp_nonce_url('update.php?action=upgrade-plugin&plugin=pretty-link/pretty-link.php', 'upgrade-plugin_pretty-link/pretty-link.php');
|
475 |
?>
|
476 |
|
477 |
+
<div class="updated notice notice-success">
|
478 |
+
<p>
|
479 |
+
<strong>
|
480 |
+
<?php
|
481 |
+
printf(
|
482 |
+
// translators: %1$s: br tag, %2$s: open link tag, %3$s: close link tag
|
483 |
+
esc_html__('You\'re almost done!%1$s%2$sFinish your Re-Install of Pretty Links Pro%3$s', 'pretty-link'),
|
484 |
+
'<br>',
|
485 |
+
'<a href="'.esc_url($reinstall_url).'">',
|
486 |
+
'</a>'
|
487 |
+
);
|
488 |
+
?>
|
489 |
+
</strong>
|
490 |
+
</p>
|
491 |
+
</div>
|
492 |
<?php
|
493 |
}
|
494 |
|
495 |
if(isset($_GET['action']) and $_GET['action'] == 'pro-uninstall') {
|
496 |
$prli_utils->uninstall_pro();
|
497 |
?>
|
498 |
+
<div class="updated notice notice-success is-dismissible"><p><strong><?php esc_html_e('Pretty Links Pro Successfully Uninstalled.' , 'pretty-link'); ?></strong></p></div>
|
499 |
<?php
|
500 |
}
|
501 |
|
537 |
|
538 |
/********* DASHBOARD WIDGET ***********/
|
539 |
public function dashboard_widget_function() {
|
540 |
+
global $prli_link, $prli_blogurl;
|
541 |
+
|
542 |
+
wp_enqueue_script('prli-quick-create', PRLI_JS_URL . '/quick_create.js', array('jquery'), PRLI_VERSION, true);
|
543 |
|
544 |
+
wp_localize_script('prli-quick-create', 'PrliQuickCreate', array(
|
545 |
+
'nonce' => wp_create_nonce('prli_quick_create'),
|
546 |
+
'ajaxUrl' => admin_url('admin-ajax.php'),
|
547 |
+
'invalidServerResponse' => __('Invalid server response', 'pretty-link'),
|
548 |
+
'ajaxError' => __('Ajax error', 'pretty-link')
|
549 |
+
));
|
550 |
|
551 |
require_once(PRLI_VIEWS_PATH . '/widgets/widget.php');
|
552 |
}
|
562 |
}
|
563 |
|
564 |
if(current_user_can($role)) {
|
565 |
+
wp_add_dashboard_widget('prli_dashboard_widget', esc_html__('Pretty Link Quick Add', 'pretty-link'), array($this,'dashboard_widget_function'));
|
566 |
|
567 |
// Globalize the metaboxes array, this holds all the widgets for wp-admin
|
568 |
global $wp_meta_boxes;
|
650 |
public static function close_about_notice() {
|
651 |
update_option('prli_about_notice_version',PRLI_VERSION);
|
652 |
}
|
653 |
+
|
654 |
+
/**
|
655 |
+
* When user is on a Pretty Links related admin page, display footer text
|
656 |
+
* that graciously asks them to rate us.
|
657 |
+
*
|
658 |
+
* @since 1.4.0
|
659 |
+
*
|
660 |
+
* @param string $text
|
661 |
+
*
|
662 |
+
* @return string
|
663 |
+
*/
|
664 |
+
public function admin_footer($text) {
|
665 |
+
global $current_screen;
|
666 |
+
|
667 |
+
if(!empty($current_screen->id) && $this->is_pretty_link_page()) {
|
668 |
+
$url = 'https://prettylinks.com/pl/footer/review';
|
669 |
+
$text = sprintf(
|
670 |
+
wp_kses(
|
671 |
+
/* translators: $1$s - Pretty Links plugin name; $2$s - WP.org review link; $3$s - WP.org review link. */
|
672 |
+
__('Enjoying %1$s? Please rate <a href="%2$s" target="_blank" rel="noopener noreferrer">★★★★★</a> on <a href="%3$s" target="_blank" rel="noopener">WordPress.org</a> to help us spread the word. Thanks from the Pretty Links team!', 'pretty-link'),
|
673 |
+
array(
|
674 |
+
'a' => array(
|
675 |
+
'href' => array(),
|
676 |
+
'target' => array(),
|
677 |
+
'rel' => array(),
|
678 |
+
),
|
679 |
+
)
|
680 |
+
),
|
681 |
+
'<strong>Pretty Links</strong>',
|
682 |
+
$url,
|
683 |
+
$url
|
684 |
+
);
|
685 |
+
}
|
686 |
+
|
687 |
+
return $text;
|
688 |
+
}
|
689 |
+
|
690 |
+
private function get_screen_id($hook=null) {
|
691 |
+
if(is_null($hook)) {
|
692 |
+
$screen = get_current_screen();
|
693 |
+
$hook = $screen->id;
|
694 |
+
}
|
695 |
+
|
696 |
+
return $hook;
|
697 |
+
}
|
698 |
+
|
699 |
+
public function is_pretty_link_page() {
|
700 |
+
$hook = $this->get_screen_id();
|
701 |
+
return (strstr($hook, 'pretty-link') !== false);
|
702 |
+
}
|
703 |
+
|
704 |
+
public function is_pretty_link_link_page() {
|
705 |
+
$hook = $this->get_screen_id();
|
706 |
+
return in_array($hook, array($this->screens['add-edit'],$this->screens['list']));
|
707 |
+
}
|
708 |
+
|
709 |
+
public function is_pretty_link_listing_page() {
|
710 |
+
$hook = $this->get_screen_id();
|
711 |
+
return ($hook == $this->screens['list']);
|
712 |
+
}
|
713 |
+
|
714 |
+
public function is_pretty_link_edit_page() {
|
715 |
+
$hook = $this->get_screen_id();
|
716 |
+
return ($hook == $this->screens['add-edit']);
|
717 |
+
}
|
718 |
+
|
719 |
+
public function is_pretty_link_edit_tags() {
|
720 |
+
$hook = $this->get_screen_id();
|
721 |
+
return ($hook == $this->screens['tag']);
|
722 |
+
}
|
723 |
+
|
724 |
+
public function is_pretty_link_new_page() {
|
725 |
+
$hook = $this->get_screen_id();
|
726 |
+
return ($hook == $this->screens['add-edit']);
|
727 |
+
}
|
728 |
}
|
app/controllers/PrliClicksController.php
CHANGED
@@ -44,12 +44,12 @@ class PrliClicksController extends PrliBaseController {
|
|
44 |
}
|
45 |
|
46 |
public function admin_page() {
|
47 |
-
global $wpdb, $prli_options, $prli_click, $
|
48 |
|
49 |
$page_params = '';
|
50 |
|
51 |
$params = $prli_click->get_params_array();
|
52 |
-
$page_size = (isset($_REQUEST['size']) && is_numeric($_REQUEST['size']) && !empty($_REQUEST['size']))
|
53 |
$current_page = $params['paged'];
|
54 |
|
55 |
$start_timestamp = $prli_utils->get_start_date($params);
|
@@ -95,12 +95,6 @@ class PrliClicksController extends PrliBaseController {
|
|
95 |
$where_clause .= $wpdb->prepare(" AND cl.vuid=%s",$params['vuid']);
|
96 |
$page_params .= "&vuid={$params['vuid']}";
|
97 |
}
|
98 |
-
else if(!empty($params['group'])) {
|
99 |
-
$group = $prli_group->getOne($params['group']);
|
100 |
-
$link_name = __('Group: ', 'pretty-link') . esc_html($group->name);
|
101 |
-
$where_clause .= $wpdb->prepare(" AND cl.link_id IN (SELECT id FROM {$prli_link->table_name} WHERE group_id=%d)",$params['group']);
|
102 |
-
$page_params .= "&group={$params['group']}";
|
103 |
-
}
|
104 |
else {
|
105 |
$link_name = __('All Links', 'pretty-link');
|
106 |
$where_clause .= "";
|
@@ -133,30 +127,27 @@ class PrliClicksController extends PrliBaseController {
|
|
133 |
}
|
134 |
|
135 |
public function click_report() {
|
136 |
-
global $wpdb, $prli_click, $
|
137 |
|
138 |
if(isset($_GET['l'])) {
|
139 |
-
$l =
|
140 |
$where_clause = $wpdb->prepare(" link_id=%d",$l );
|
141 |
$link_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}prli_links WHERE id=%d",$l));
|
142 |
$link_slug = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->prefix}prli_links WHERE id=%d",$l));
|
143 |
}
|
144 |
else if(isset($_GET['ip'])) {
|
145 |
-
$ip =
|
146 |
-
$
|
147 |
-
|
|
|
|
|
|
|
148 |
}
|
149 |
else if(isset($_GET['vuid'])) {
|
150 |
-
$vuid =
|
151 |
$link_name = "visitor_{$vuid}";
|
152 |
$where_clause = $wpdb->prepare(" cl.vuid=%s",$vuid);
|
153 |
}
|
154 |
-
else if(isset($_GET['group'])) {
|
155 |
-
$group_val = PrliClicksHelper::esc_spreadsheet_cell( $_GET['group'] );
|
156 |
-
$group = $prli_group->getOne($group_val);
|
157 |
-
$link_name = "group_{$group->name}";
|
158 |
-
$where_clause .= $wpdb->prepare(" cl.link_id IN (SELECT id FROM {$prli_link->table_name} WHERE group_id=%d)", $group_val);
|
159 |
-
}
|
160 |
else {
|
161 |
$link_name = "all_links";
|
162 |
$where_clause = "";
|
@@ -167,7 +158,7 @@ class PrliClicksController extends PrliBaseController {
|
|
167 |
|
168 |
$record_count = $prli_click->getRecordCount($where_clause);
|
169 |
$page_count = (int)ceil($record_count / $this->max_rows_per_file);
|
170 |
-
$prli_page =
|
171 |
$hmin = 0;
|
172 |
|
173 |
if($prli_page) {
|
@@ -193,31 +184,27 @@ class PrliClicksController extends PrliBaseController {
|
|
193 |
$param_string = $where_clause = '';
|
194 |
|
195 |
if(isset($_GET['l'])) {
|
196 |
-
$l =
|
197 |
$where_clause = $wpdb->prepare(' link_id=%d', $l);
|
198 |
$link_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}prli_links WHERE id=%d", $l));
|
199 |
$link_slug = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->prefix}prli_links WHERE id=%d", $l));
|
200 |
$param_string .= "l={$l}";
|
201 |
}
|
202 |
else if(isset($_GET['ip'])) {
|
203 |
-
$ip =
|
204 |
-
$
|
205 |
-
|
206 |
-
|
|
|
|
|
|
|
207 |
}
|
208 |
else if(isset($_GET['vuid'])) {
|
209 |
-
$vuid =
|
210 |
$link_name = "visitor_{$vuid}";
|
211 |
$where_clause = $wpdb->prepare(' cl.vuid=%s', $vuid);
|
212 |
$param_string .= "vuid={$vuid}";
|
213 |
}
|
214 |
-
else if(isset($_GET['group'])) {
|
215 |
-
$group_val = PrliClicksHelper::esc_spreadsheet_cell( $_GET['group'] );
|
216 |
-
$group = $prli_group->getOne($group_val);
|
217 |
-
$link_name = "group_{$group->name}";
|
218 |
-
$where_clause .= $wpdb->prepare(" cl.link_id IN (SELECT id FROM {$prli_link->table_name} WHERE group_id=%d)", $group_val);
|
219 |
-
$param_string .= "group={$group_val}";
|
220 |
-
}
|
221 |
else {
|
222 |
$link_name = 'all_links';
|
223 |
}
|
44 |
}
|
45 |
|
46 |
public function admin_page() {
|
47 |
+
global $wpdb, $prli_options, $prli_click, $prli_link, $prli_utils, $page_size;
|
48 |
|
49 |
$page_params = '';
|
50 |
|
51 |
$params = $prli_click->get_params_array();
|
52 |
+
$page_size = (isset($_REQUEST['size']) && is_numeric($_REQUEST['size']) && !empty($_REQUEST['size']))?(int)$_REQUEST['size']:10;
|
53 |
$current_page = $params['paged'];
|
54 |
|
55 |
$start_timestamp = $prli_utils->get_start_date($params);
|
95 |
$where_clause .= $wpdb->prepare(" AND cl.vuid=%s",$params['vuid']);
|
96 |
$page_params .= "&vuid={$params['vuid']}";
|
97 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
98 |
else {
|
99 |
$link_name = __('All Links', 'pretty-link');
|
100 |
$where_clause .= "";
|
127 |
}
|
128 |
|
129 |
public function click_report() {
|
130 |
+
global $wpdb, $prli_click, $prli_link;
|
131 |
|
132 |
if(isset($_GET['l'])) {
|
133 |
+
$l = (int) $_GET['l'];
|
134 |
$where_clause = $wpdb->prepare(" link_id=%d",$l );
|
135 |
$link_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}prli_links WHERE id=%d",$l));
|
136 |
$link_slug = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->prefix}prli_links WHERE id=%d",$l));
|
137 |
}
|
138 |
else if(isset($_GET['ip'])) {
|
139 |
+
$ip = stripslashes($_GET['ip']);
|
140 |
+
if (filter_var($ip, FILTER_VALIDATE_IP)) {
|
141 |
+
$ip = PrliClicksHelper::esc_spreadsheet_cell($ip);
|
142 |
+
$link_name = "ip_addr_{$ip}";
|
143 |
+
$where_clause = $wpdb->prepare(" cl.ip=%s", $ip);
|
144 |
+
}
|
145 |
}
|
146 |
else if(isset($_GET['vuid'])) {
|
147 |
+
$vuid = sanitize_key(stripslashes($_GET['vuid']));
|
148 |
$link_name = "visitor_{$vuid}";
|
149 |
$where_clause = $wpdb->prepare(" cl.vuid=%s",$vuid);
|
150 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
151 |
else {
|
152 |
$link_name = "all_links";
|
153 |
$where_clause = "";
|
158 |
|
159 |
$record_count = $prli_click->getRecordCount($where_clause);
|
160 |
$page_count = (int)ceil($record_count / $this->max_rows_per_file);
|
161 |
+
$prli_page = isset($_GET['prli_page']) ? (int) $_GET['prli_page'] : 1;
|
162 |
$hmin = 0;
|
163 |
|
164 |
if($prli_page) {
|
184 |
$param_string = $where_clause = '';
|
185 |
|
186 |
if(isset($_GET['l'])) {
|
187 |
+
$l = (int) $_GET['l'];
|
188 |
$where_clause = $wpdb->prepare(' link_id=%d', $l);
|
189 |
$link_name = $wpdb->get_var($wpdb->prepare("SELECT name FROM {$wpdb->prefix}prli_links WHERE id=%d", $l));
|
190 |
$link_slug = $wpdb->get_var($wpdb->prepare("SELECT slug FROM {$wpdb->prefix}prli_links WHERE id=%d", $l));
|
191 |
$param_string .= "l={$l}";
|
192 |
}
|
193 |
else if(isset($_GET['ip'])) {
|
194 |
+
$ip = stripslashes($_GET['ip']);
|
195 |
+
if (filter_var($ip, FILTER_VALIDATE_IP)) {
|
196 |
+
$ip = PrliClicksHelper::esc_spreadsheet_cell($_GET['ip']);
|
197 |
+
$link_name = "ip_addr_{$ip}";
|
198 |
+
$where_clause = $wpdb->prepare(' cl.ip=%s', $ip);
|
199 |
+
$param_string .= "ip={$ip}";
|
200 |
+
}
|
201 |
}
|
202 |
else if(isset($_GET['vuid'])) {
|
203 |
+
$vuid = sanitize_key(stripslashes($_GET['vuid']));
|
204 |
$link_name = "visitor_{$vuid}";
|
205 |
$where_clause = $wpdb->prepare(' cl.vuid=%s', $vuid);
|
206 |
$param_string .= "vuid={$vuid}";
|
207 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
208 |
else {
|
209 |
$link_name = 'all_links';
|
210 |
}
|
app/controllers/PrliGroupsController.php
DELETED
@@ -1,253 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
3 |
-
|
4 |
-
// We'll do a full refactor later -- for now we'll just implement the add group ajax method
|
5 |
-
class PrliGroupsController extends PrliBaseController {
|
6 |
-
public function load_hooks() {
|
7 |
-
add_action('wp_ajax_add_new_prli_group', array($this,'ajax_new_group'));
|
8 |
-
}
|
9 |
-
|
10 |
-
public function route() {
|
11 |
-
global $prli_group;
|
12 |
-
|
13 |
-
$params = $prli_group->get_params_array();
|
14 |
-
|
15 |
-
if($params['action'] == 'list') {
|
16 |
-
$this->display_list($params);
|
17 |
-
}
|
18 |
-
else if($params['action'] == 'new') {
|
19 |
-
$this->display_new($params);
|
20 |
-
}
|
21 |
-
else if($params['action'] == 'create') {
|
22 |
-
$this->create($params);
|
23 |
-
}
|
24 |
-
else if($params['action'] == 'edit') {
|
25 |
-
$this->display_edit($params);
|
26 |
-
}
|
27 |
-
else if($params['action'] == 'update') {
|
28 |
-
$this->update($params);
|
29 |
-
}
|
30 |
-
else if($params['action'] == 'destroy') {
|
31 |
-
$this->destroy($params);
|
32 |
-
}
|
33 |
-
}
|
34 |
-
|
35 |
-
public function ajax_new_group() {
|
36 |
-
global $prli_group;
|
37 |
-
|
38 |
-
if(!PrliUtils::is_authorized()) {
|
39 |
-
return json_encode( array( 'status' => 'failure',
|
40 |
-
'message' => __('Cannot add group because current user is not authorized.', 'pretty-link') ) );
|
41 |
-
}
|
42 |
-
|
43 |
-
// Default response
|
44 |
-
$response = json_encode( array( 'status' => 'failure',
|
45 |
-
'message' => __('An unknown error occurred when creating your group.', 'pretty-link') ) );
|
46 |
-
|
47 |
-
if(isset($_REQUEST['_prli_nonce']) and wp_verify_nonce($_REQUEST['_prli_nonce'], 'prli-add-new-group')) {
|
48 |
-
if(isset($_REQUEST['new_group_name'])) {
|
49 |
-
$new_group_name = stripslashes($_REQUEST['new_group_name']);
|
50 |
-
$group_id = $prli_group->create( array( 'name' => $new_group_name, 'description' => '' ) );
|
51 |
-
|
52 |
-
if( $group_id ) {
|
53 |
-
$response = json_encode( array( 'status' => 'success',
|
54 |
-
'message' => __('Group Created', 'pretty-link'),
|
55 |
-
'group_id' => $group_id,
|
56 |
-
'group_option' => "<option value=\"{$group_id}\">{$new_group_name}</option>" ) );
|
57 |
-
}
|
58 |
-
}
|
59 |
-
else {
|
60 |
-
$response = json_encode( array( 'status' => 'failure',
|
61 |
-
'message' => __('A name must be specified for your new group name', 'pretty-link') ) );
|
62 |
-
}
|
63 |
-
}
|
64 |
-
else {
|
65 |
-
$response = json_encode( array( 'status' => 'failure',
|
66 |
-
'message' => __('Cannot add group because security nonce failed', 'pretty-link') ) );
|
67 |
-
}
|
68 |
-
|
69 |
-
header( "Content-Type: application/json" );
|
70 |
-
echo $response;
|
71 |
-
|
72 |
-
exit;
|
73 |
-
}
|
74 |
-
|
75 |
-
public function display_list($params) {
|
76 |
-
$this->display_groups_list($params, __('Create a group and use it to organize your Pretty Links.', 'pretty-link'));
|
77 |
-
}
|
78 |
-
|
79 |
-
public function display_new($params) {
|
80 |
-
global $prli_link;
|
81 |
-
$links = $prli_link->getAll('',' ORDER BY li.name');
|
82 |
-
require_once(PRLI_VIEWS_PATH.'/groups/new.php');
|
83 |
-
}
|
84 |
-
|
85 |
-
public function create($params) {
|
86 |
-
global $prli_group, $prli_link;
|
87 |
-
|
88 |
-
$errors = $prli_group->validate($_POST);
|
89 |
-
if( count($errors) > 0 ) {
|
90 |
-
$links = $prli_link->getAll('',' ORDER BY li.name');
|
91 |
-
require_once(PRLI_VIEWS_PATH.'/groups/new.php');
|
92 |
-
}
|
93 |
-
else {
|
94 |
-
$insert_id = $prli_group->create($_POST);
|
95 |
-
|
96 |
-
if(isset($_POST['link'])) {
|
97 |
-
$this->update_groups($insert_id, $_POST['link']);
|
98 |
-
}
|
99 |
-
|
100 |
-
$this->display_groups_list($params, __("Your Pretty Link Group was Successfully Created", 'pretty-link'), '', 1);
|
101 |
-
}
|
102 |
-
}
|
103 |
-
|
104 |
-
public function display_edit($params) {
|
105 |
-
global $prli_group, $prli_link;
|
106 |
-
|
107 |
-
$record = $prli_group->getOne( $params['id'] );
|
108 |
-
$id = $params['id'];
|
109 |
-
$links = $prli_link->getAll('',' ORDER BY li.name');
|
110 |
-
|
111 |
-
require_once(PRLI_VIEWS_PATH.'/groups/edit.php');
|
112 |
-
}
|
113 |
-
|
114 |
-
public function update($params) {
|
115 |
-
global $prli_group, $prli_link;
|
116 |
-
|
117 |
-
$errors = $prli_group->validate($_POST);
|
118 |
-
$id = $_POST['id'];
|
119 |
-
if( count($errors) > 0 ) {
|
120 |
-
$links = $prli_link->getAll('',' ORDER BY li.name');
|
121 |
-
require_once(PRLI_VIEWS_PATH.'/groups/edit.php');
|
122 |
-
}
|
123 |
-
else {
|
124 |
-
$record = $prli_group->update( $_POST['id'], $_POST );
|
125 |
-
|
126 |
-
if(isset($_POST['link'])) {
|
127 |
-
$this->update_groups($_POST['id'],$_POST['link']);
|
128 |
-
}
|
129 |
-
|
130 |
-
$this->display_groups_list($params, __('Your Pretty Link Group was Successfully Updated', 'pretty-link'), '', 1);
|
131 |
-
}
|
132 |
-
}
|
133 |
-
|
134 |
-
public function destroy($params) {
|
135 |
-
global $prli_group;
|
136 |
-
|
137 |
-
$prli_group->destroy( $params['id'] );
|
138 |
-
|
139 |
-
$this->display_groups_list($params, __("Your Pretty Link Group was Successfully Deleted", 'pretty-link'), '', 1);
|
140 |
-
}
|
141 |
-
|
142 |
-
public function update_groups($group_id, $values) {
|
143 |
-
global $prli_link;
|
144 |
-
|
145 |
-
$links = $prli_link->getAll();
|
146 |
-
|
147 |
-
foreach($links as $link) {
|
148 |
-
// Only update a group if the user's pulling it from another group
|
149 |
-
if($link->group_id != $group_id and empty($values[$link->id])) {
|
150 |
-
continue;
|
151 |
-
}
|
152 |
-
|
153 |
-
$prli_link->update_group($link->id, $values[$link->id], $group_id);
|
154 |
-
}
|
155 |
-
}
|
156 |
-
|
157 |
-
// Helpers
|
158 |
-
public function display_groups_list($params, $prli_message, $page_params_ov = false, $current_page_ov = false) {
|
159 |
-
global $wpdb, $prli_utils, $prli_group, $prli_click, $prli_link, $page_size;
|
160 |
-
|
161 |
-
$controller_file = basename(__FILE__);
|
162 |
-
$group_vars = $this->get_group_sort_vars($params);
|
163 |
-
|
164 |
-
if($current_page_ov) {
|
165 |
-
$current_page = $current_page_ov;
|
166 |
-
}
|
167 |
-
else {
|
168 |
-
$current_page = $params['paged'];
|
169 |
-
}
|
170 |
-
|
171 |
-
if($page_params_ov) {
|
172 |
-
$page_params = $page_params_ov;
|
173 |
-
}
|
174 |
-
else {
|
175 |
-
$page_params = $group_vars['page_params'];
|
176 |
-
}
|
177 |
-
|
178 |
-
$sort_str = $group_vars['sort_str'];
|
179 |
-
$sdir_str = $group_vars['sdir_str'];
|
180 |
-
$search_str = $group_vars['search_str'];
|
181 |
-
|
182 |
-
$record_count = $prli_group->getRecordCount($group_vars['where_clause']);
|
183 |
-
$page_count = $prli_group->getPageCount($page_size,$group_vars['where_clause']);
|
184 |
-
$groups = $prli_group->getPage($current_page,$page_size,$group_vars['where_clause'],$group_vars['order_by']);
|
185 |
-
$page_last_record = $prli_utils->getLastRecordNum($record_count,$current_page,$page_size);
|
186 |
-
$page_first_record = $prli_utils->getFirstRecordNum($record_count,$current_page,$page_size);
|
187 |
-
|
188 |
-
require_once(PRLI_VIEWS_PATH.'/groups/list.php');
|
189 |
-
}
|
190 |
-
|
191 |
-
public function get_group_sort_vars($params,$where_clause = '') {
|
192 |
-
$order_by = '';
|
193 |
-
$page_params = '';
|
194 |
-
|
195 |
-
// These will have to work with both get and post
|
196 |
-
$sort_str = $params['sort'];
|
197 |
-
$sdir_str = $params['sdir'];
|
198 |
-
$search_str = $params['search'];
|
199 |
-
|
200 |
-
// Insert search string
|
201 |
-
if(!empty($search_str)) {
|
202 |
-
$search_params = explode(" ", $search_str);
|
203 |
-
|
204 |
-
foreach($search_params as $search_param) {
|
205 |
-
if(!empty($where_clause))
|
206 |
-
$where_clause .= " AND";
|
207 |
-
|
208 |
-
$where_clause .= " (name like '%$search_param%' OR description like '%$search_param%' OR created_at like '%$search_param%')";
|
209 |
-
}
|
210 |
-
|
211 |
-
$page_params .="&search=$search_str";
|
212 |
-
}
|
213 |
-
|
214 |
-
// make sure page params stay correct
|
215 |
-
if(!empty($sort_str)) {
|
216 |
-
$page_params .="&sort=$sort_str";
|
217 |
-
}
|
218 |
-
|
219 |
-
if(!empty($sdir_str)) {
|
220 |
-
$page_params .= "&sdir=$sdir_str";
|
221 |
-
}
|
222 |
-
|
223 |
-
// Add order by clause
|
224 |
-
switch($sort_str) {
|
225 |
-
case "name":
|
226 |
-
case "link_count":
|
227 |
-
case "click_count":
|
228 |
-
case "description":
|
229 |
-
$order_by .= " ORDER BY $sort_str";
|
230 |
-
break;
|
231 |
-
default:
|
232 |
-
$order_by .= " ORDER BY created_at";
|
233 |
-
}
|
234 |
-
|
235 |
-
// Toggle ascending / descending
|
236 |
-
if((empty($sort_str) and empty($sdir_str)) or $sdir_str == 'desc') {
|
237 |
-
$order_by .= ' DESC';
|
238 |
-
$sdir_str = 'desc';
|
239 |
-
}
|
240 |
-
else {
|
241 |
-
$sdir_str = 'asc';
|
242 |
-
}
|
243 |
-
|
244 |
-
return array(
|
245 |
-
'order_by' => $order_by,
|
246 |
-
'sort_str' => $sort_str,
|
247 |
-
'sdir_str' => $sdir_str,
|
248 |
-
'search_str' => $search_str,
|
249 |
-
'where_clause' => $where_clause,
|
250 |
-
'page_params' => $page_params
|
251 |
-
);
|
252 |
-
}
|
253 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/controllers/PrliLinksController.php
CHANGED
@@ -2,528 +2,714 @@
|
|
2 |
|
3 |
class PrliLinksController extends PrliBaseController {
|
4 |
public function load_hooks() {
|
5 |
-
|
6 |
add_filter( 'cron_schedules', array($this,'intervals') );
|
7 |
add_action( 'prli_cleanup_visitor_locks_worker', array($this,'cleanup_visitor_locks') );
|
8 |
add_action( 'admin_init', array($this,'maybe_cleanup_visitor_locks') );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
if(!($snapshot_timestamp = wp_next_scheduled('prli_cleanup_visitor_locks_worker'))) {
|
11 |
wp_schedule_event( time(), 'prli_cleanup_visitor_locks_interval', 'prli_cleanup_visitor_locks_worker' );
|
12 |
}
|
13 |
}
|
14 |
|
15 |
-
public
|
16 |
-
$
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
}
|
43 |
-
}
|
44 |
|
45 |
-
|
46 |
-
|
47 |
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
$prli_message = __("Links in Group: ", 'pretty-link') . $wpdb->get_var("SELECT name FROM " . $prli_group->table_name . " WHERE id=".$params['group']);
|
54 |
|
55 |
-
|
|
|
|
|
|
|
|
|
56 |
}
|
57 |
|
58 |
-
public
|
59 |
-
global $
|
60 |
-
$groups = $prli_group->getAll('',' ORDER BY name');
|
61 |
-
$values = self::setup_new_vars($groups);
|
62 |
|
63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
}
|
65 |
|
66 |
-
public
|
67 |
-
global $prli_link, $
|
68 |
|
69 |
-
if
|
70 |
-
|
|
|
|
|
|
|
|
|
|
|
71 |
}
|
|
|
|
|
72 |
|
73 |
-
|
74 |
-
|
75 |
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
}
|
82 |
-
else
|
83 |
-
{
|
84 |
-
unset($_POST['param_forwarding']);
|
85 |
|
86 |
-
|
87 |
-
|
88 |
-
$_POST['description'] = '';
|
89 |
-
if( $prli_options->link_track_me )
|
90 |
-
$_POST['track_me'] = 'on';
|
91 |
-
if( $prli_options->link_nofollow )
|
92 |
-
$_POST['nofollow'] = 'on';
|
93 |
|
94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
|
96 |
-
|
|
|
97 |
|
98 |
-
|
99 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
}
|
|
|
|
|
101 |
}
|
102 |
|
103 |
-
public
|
104 |
-
global $prli_link, $
|
105 |
|
106 |
-
|
107 |
-
|
108 |
-
|
|
|
|
|
|
|
|
|
|
|
109 |
|
110 |
-
$
|
111 |
|
112 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
|
114 |
-
if(
|
115 |
-
$
|
116 |
-
$values = self::setup_new_vars($groups);
|
117 |
-
require_once PRLI_VIEWS_PATH . '/links/new.php';
|
118 |
}
|
119 |
else {
|
120 |
-
$
|
121 |
-
|
122 |
-
do_action('prli_update_link', $record);
|
123 |
|
124 |
-
|
125 |
-
|
|
|
|
|
|
|
126 |
}
|
|
|
|
|
127 |
}
|
128 |
|
129 |
-
public static function
|
130 |
-
global $
|
131 |
|
132 |
-
|
|
|
|
|
|
|
133 |
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
}
|
139 |
|
140 |
-
|
141 |
-
|
|
|
|
|
142 |
|
143 |
-
|
144 |
-
|
|
|
145 |
}
|
146 |
|
147 |
-
$
|
148 |
-
$id = $_POST['id'];
|
149 |
|
150 |
-
$
|
|
|
151 |
|
152 |
-
if(
|
153 |
-
$
|
154 |
-
$record = $prli_link->getOne( $params['id'] );
|
155 |
-
$values = self::setup_edit_vars($groups,$record);
|
156 |
-
require_once(PRLI_VIEWS_PATH . '/links/edit.php');
|
157 |
}
|
158 |
else {
|
159 |
-
$
|
160 |
-
|
161 |
-
do_action('prli_update_link', $id);
|
162 |
-
|
163 |
-
$prli_message = __('Your Pretty Link was Successfully Updated', 'pretty-link');
|
164 |
-
self::display_links_list($params, $prli_message, '', 1);
|
165 |
}
|
|
|
|
|
166 |
}
|
167 |
|
168 |
-
public
|
169 |
global $prli_link;
|
170 |
-
if(wp_verify_nonce($_REQUEST['_wpnonce'],'prli_bulk_update') and isset($_REQUEST['ids'])) {
|
171 |
|
172 |
-
|
173 |
-
$
|
174 |
|
175 |
-
|
176 |
-
do_action('prli-bulk-action-update',$ids,$params);
|
177 |
|
178 |
-
$
|
179 |
|
180 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
181 |
|
182 |
-
|
183 |
-
|
184 |
|
185 |
-
|
186 |
-
$request_uri = preg_replace( '#\&(message|action|_wpnonce|ids|bu\[[^\]]*?\])=[^\&]*#', '', $_SERVER['REQUEST_URI'] );
|
187 |
|
188 |
-
|
189 |
-
$request_uri .= '&message=' . urlencode($message);
|
190 |
-
$redirect_url = 'http' . (empty($_SERVER['HTTPS'])?'':'s') . '://' . $_SERVER['HTTP_HOST'] . $request_uri;
|
191 |
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
196 |
}
|
197 |
}
|
198 |
|
199 |
-
|
200 |
-
|
|
|
201 |
|
202 |
-
|
203 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
204 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
205 |
|
206 |
-
|
207 |
-
$prli_message = __("Your Pretty Link was Successfully Reset", 'pretty-link');
|
208 |
-
self::display_links_list($params, $prli_message, '', 1);
|
209 |
}
|
210 |
|
211 |
-
public
|
212 |
global $prli_link;
|
213 |
|
214 |
-
|
215 |
-
|
|
|
|
|
216 |
}
|
217 |
|
218 |
-
$
|
219 |
-
$
|
220 |
-
self::display_links_list($params, $prli_message, '', 1);
|
221 |
-
}
|
222 |
|
223 |
-
|
224 |
-
global $prli_link;
|
225 |
-
if(wp_verify_nonce($_REQUEST['_wpnonce'],'prli_bulk_update') and isset($_REQUEST['ids'])) {
|
226 |
-
$ids = explode(',', $_REQUEST['ids']);
|
227 |
|
228 |
-
|
229 |
-
|
|
|
|
|
|
|
230 |
}
|
|
|
|
|
231 |
|
232 |
-
|
|
|
|
|
|
|
233 |
|
234 |
-
|
235 |
-
|
236 |
-
$request_uri = preg_replace( '#\&(message|action|_wpnonce|ids|bu\[[^\]]*?\])=[^\&]*#', '', $_SERVER['REQUEST_URI'] );
|
237 |
|
238 |
-
|
239 |
-
|
240 |
-
|
|
|
241 |
|
242 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
243 |
}
|
244 |
-
|
245 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
246 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
}
|
248 |
|
249 |
-
public
|
250 |
-
global $
|
251 |
|
252 |
-
$
|
|
|
253 |
|
254 |
-
|
255 |
-
$
|
256 |
-
$group_param = '';
|
257 |
|
258 |
-
$
|
|
|
259 |
|
260 |
-
if(!empty($
|
261 |
-
|
262 |
-
|
263 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
264 |
}
|
|
|
265 |
|
266 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
267 |
|
268 |
-
if($
|
269 |
-
$
|
270 |
-
|
271 |
-
$current_page = $params['paged'];
|
272 |
|
273 |
-
|
274 |
-
$page_params .= $page_params_ov;
|
275 |
-
else
|
276 |
-
$page_params .= $link_vars['page_params'];
|
277 |
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
|
|
287 |
|
288 |
-
|
289 |
-
}
|
290 |
|
291 |
-
|
292 |
-
|
293 |
-
$order_by = '';
|
294 |
-
$page_params = '';
|
295 |
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
|
301 |
-
|
302 |
-
if(!empty($search_str))
|
303 |
-
{
|
304 |
-
$search_params = explode(" ", $search_str);
|
305 |
|
306 |
-
|
307 |
-
|
308 |
-
if(!empty($where_clause))
|
309 |
-
$where_clause .= " AND";
|
310 |
|
311 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
312 |
}
|
313 |
|
314 |
-
$
|
|
|
315 |
}
|
316 |
|
317 |
-
|
318 |
-
|
319 |
-
$page_params .="&sort=$sort_str";
|
320 |
|
321 |
-
|
322 |
-
|
323 |
|
324 |
-
|
325 |
-
switch($sort_str)
|
326 |
-
{
|
327 |
-
case "name":
|
328 |
-
case "clicks":
|
329 |
-
case "group_name":
|
330 |
-
case "slug":
|
331 |
-
$order_by .= " ORDER BY $sort_str";
|
332 |
-
break;
|
333 |
-
default:
|
334 |
-
$order_by .= " ORDER BY created_at";
|
335 |
-
}
|
336 |
|
337 |
-
|
338 |
-
|
339 |
-
{
|
340 |
-
$order_by .= ' DESC';
|
341 |
-
$sdir_str = 'desc';
|
342 |
}
|
343 |
-
else
|
344 |
-
$sdir_str = 'asc';
|
345 |
|
346 |
-
|
347 |
-
'sort_str' => $sort_str,
|
348 |
-
'sdir_str' => $sdir_str,
|
349 |
-
'search_str' => $search_str,
|
350 |
-
'where_clause' => $where_clause,
|
351 |
-
'page_params' => $page_params);
|
352 |
-
}
|
353 |
|
354 |
-
|
355 |
-
|
356 |
-
return array(
|
357 |
-
'action' => (isset($_REQUEST['action'])?$_REQUEST['action']:'list'),
|
358 |
-
'regenerate' => (isset($_REQUEST['regenerate'])?$_REQUEST['regenerate']:'false'),
|
359 |
-
'id' => (isset($_REQUEST['id'])?$_REQUEST['id']:''),
|
360 |
-
'group_name' => (isset($_REQUEST['group_name'])?$_REQUEST['group_name']:''),
|
361 |
-
'paged' => (isset($_REQUEST['paged'])?$_REQUEST['paged']:1),
|
362 |
-
'group' => (isset($_REQUEST['group'])?(int)$_REQUEST['group']:''),
|
363 |
-
'search' => (isset($_REQUEST['search'])?$_REQUEST['search']:''),
|
364 |
-
'sort' => (isset($_REQUEST['sort'])?$_REQUEST['sort']:''),
|
365 |
-
'sdir' => (isset($_REQUEST['sdir'])?$_REQUEST['sdir']:''),
|
366 |
-
'message' => (isset($_REQUEST['message'])?sanitize_text_field($_REQUEST['message']):'')
|
367 |
);
|
|
|
|
|
368 |
}
|
369 |
|
370 |
-
public
|
371 |
-
|
|
|
|
|
372 |
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
$values['name'] = htmlspecialchars((isset($_REQUEST['name'])?stripslashes($_REQUEST['name']):''));
|
377 |
-
$values['description'] = htmlspecialchars((isset($_REQUEST['description'])?stripslashes($_REQUEST['description']):''));
|
378 |
|
379 |
-
|
380 |
-
|
|
|
381 |
|
382 |
-
$
|
383 |
-
$values['redirect_type']['307'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '307') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '307'))?'selected="selected"':'');
|
384 |
-
$values['redirect_type']['302'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '302') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '302'))?'selected="selected"':'');
|
385 |
-
$values['redirect_type']['301'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '301') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '301'))?'selected="selected"':'');
|
386 |
-
$values['redirect_type']['prettybar'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'prettybar') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'prettybar'))?'selected="selected"':'');
|
387 |
-
$values['redirect_type']['cloak'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'cloak') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'cloak'))?'selected="selected"':'');
|
388 |
-
$values['redirect_type']['pixel'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'pixel') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'pixel'))?'selected="selected"':'');
|
389 |
-
$values['redirect_type']['metarefresh'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'metarefresh') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'metarefresh'))?'selected="selected"':'');
|
390 |
-
$values['redirect_type']['javascript'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'javascript') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'javascript'))?'selected="selected"':'');
|
391 |
|
392 |
-
$
|
393 |
|
394 |
-
if(
|
395 |
-
|
396 |
-
$values['groups'][] = array(
|
397 |
-
'id' => $group->id,
|
398 |
-
'value' => ((isset($_REQUEST['group_id']) && $_REQUEST['group_id'] == $group->id)?' selected="true"':''),
|
399 |
-
'name' => $group->name
|
400 |
-
);
|
401 |
-
}
|
402 |
}
|
403 |
|
404 |
-
$
|
405 |
-
$values['delay'] = (isset($_REQUEST['delay']) ? $_REQUEST['delay'] : 0);
|
406 |
|
407 |
-
if(
|
408 |
-
$
|
409 |
}
|
410 |
-
|
411 |
-
|
412 |
-
|
413 |
-
global $plp_options;
|
414 |
-
$values['google_tracking'] = $plp_options->google_tracking?' checked=checked':'';
|
415 |
-
}
|
416 |
-
else {
|
417 |
-
$values['google_tracking'] = '';
|
418 |
-
}
|
419 |
}
|
420 |
|
421 |
-
|
422 |
-
|
423 |
|
424 |
-
|
425 |
-
|
|
|
426 |
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
$values['description'] = htmlspecialchars(stripslashes(((isset($_REQUEST['description']) and $record == null)?$_REQUEST['description']:$record->description)));
|
432 |
-
$values['track_me'] = (((isset($_REQUEST['track_me']) or $record->track_me) and ((isset($_REQUEST['track_me']) and $_REQUEST['track_me'] == 'on') or $record->track_me == 1))?'checked="true"':'');
|
433 |
-
$values['nofollow'] = (((isset($_REQUEST['nofollow']) and $_REQUEST['nofollow'] == 'on') or (isset($record->nofollow) && $record->nofollow == 1))?'checked="true"':'');
|
434 |
|
435 |
-
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
|
|
|
|
441 |
|
442 |
-
$
|
|
|
443 |
|
444 |
-
|
445 |
-
$values['redirect_type']['307'] = ((!isset($_REQUEST['redirect_type']) or (isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '307') or (isset($record->redirect_type) and $record->redirect_type == '307'))?' selected="selected"':'');
|
446 |
-
$values['redirect_type']['302'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '302') or (isset($record->redirect_type) and $record->redirect_type == '302'))?' selected="selected"':'');
|
447 |
-
$values['redirect_type']['301'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '301') or (isset($record->redirect_type) and $record->redirect_type == '301'))?' selected="selected"':'');
|
448 |
-
$values['redirect_type']['prettybar'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'prettybar') or (isset($record->redirect_type) and $record->redirect_type == 'prettybar'))?' selected="selected"':'');
|
449 |
-
$values['redirect_type']['cloak'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'cloak') or (isset($record->redirect_type) and $record->redirect_type == 'cloak'))?' selected="selected"':'');
|
450 |
-
$values['redirect_type']['pixel'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'pixel') or (isset($record->redirect_type) and $record->redirect_type == 'pixel'))?' selected="selected"':'');
|
451 |
-
$values['redirect_type']['metarefresh'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'metarefresh') or (isset($record->redirect_type) and $record->redirect_type == 'metarefresh'))?' selected="selected"':'');
|
452 |
-
$values['redirect_type']['javascript'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'javascript') or (isset($record->redirect_type) and $record->redirect_type == 'javascript'))?' selected="selected"':'');
|
453 |
|
454 |
-
|
455 |
-
$
|
456 |
-
|
457 |
-
|
458 |
-
$values['delay'] = $prli_link_meta->get_link_meta($record->id, 'delay', true);
|
459 |
-
}
|
460 |
|
461 |
-
|
462 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
463 |
}
|
464 |
-
|
465 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
466 |
}
|
467 |
|
468 |
-
return $
|
469 |
}
|
470 |
|
471 |
-
|
472 |
-
|
|
|
473 |
|
474 |
-
if(
|
475 |
-
|
476 |
-
|
|
|
|
|
|
|
477 |
}
|
|
|
|
|
478 |
}
|
479 |
|
480 |
-
|
481 |
-
public function
|
482 |
-
|
|
|
483 |
|
484 |
-
|
485 |
-
|
|
|
|
|
|
|
486 |
|
487 |
-
|
488 |
-
|
489 |
-
FROM {$wpdb->options}
|
490 |
-
WHERE option_name LIKE %s
|
491 |
-
AND option_value < %s
|
492 |
-
ORDER BY option_value
|
493 |
-
",
|
494 |
-
'_transient_timeout_prli_visitor_%',
|
495 |
-
time()
|
496 |
-
);
|
497 |
|
498 |
-
|
|
|
|
|
499 |
|
500 |
-
|
501 |
-
|
502 |
-
$transient_key = preg_replace(
|
503 |
-
'/^_transient_timeout_prli_visitor_/',
|
504 |
-
'_transient_prli_visitor_',
|
505 |
-
$timeout_key
|
506 |
-
);
|
507 |
|
508 |
-
$
|
509 |
-
DELETE FROM {$wpdb->options}
|
510 |
-
WHERE option_name IN (%s,%s)
|
511 |
-
",
|
512 |
-
$timeout_key,
|
513 |
-
$transient_key
|
514 |
-
);
|
515 |
|
516 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
517 |
}
|
518 |
-
}
|
519 |
-
|
520 |
-
public function intervals( $schedules ) {
|
521 |
-
$schedules['prli_cleanup_visitor_locks_interval'] = array(
|
522 |
-
'interval' => HOUR_IN_SECONDS,
|
523 |
-
'display' => __('Pretty Link Cleanup Visitor Locks', 'pretty-link'),
|
524 |
-
);
|
525 |
|
526 |
-
return $
|
527 |
}
|
|
|
528 |
}
|
529 |
|
2 |
|
3 |
class PrliLinksController extends PrliBaseController {
|
4 |
public function load_hooks() {
|
5 |
+
add_action( 'init', array($this, 'register_post_type'), 0);
|
6 |
add_filter( 'cron_schedules', array($this,'intervals') );
|
7 |
add_action( 'prli_cleanup_visitor_locks_worker', array($this,'cleanup_visitor_locks') );
|
8 |
add_action( 'admin_init', array($this,'maybe_cleanup_visitor_locks') );
|
9 |
+
add_action( 'pre_get_posts', array($this, 'set_custom_post_types_admin_order') );
|
10 |
+
add_action( 'save_post', array($this, 'save_cpt_link') );
|
11 |
+
add_action( 'deleted_post', array($this, 'delete_cpt_link') );
|
12 |
+
add_action( 'transition_post_status', array($this, 'transition_cpt_status'), 10, 3 );
|
13 |
+
add_action( 'transition_post_status', array($this, 'transition_cpt_status'), 10, 3 );
|
14 |
+
add_action( 'wp_ajax_validate_pretty_link', array($this,'ajax_validate_pretty_link') );
|
15 |
+
add_action( 'wp_ajax_reset_pretty_link', array($this,'ajax_reset_pretty_link') );
|
16 |
+
add_action( 'wp_ajax_prli_quick_create', array($this, 'ajax_quick_create'));
|
17 |
+
|
18 |
+
// Legacy Groups Filter
|
19 |
+
add_action( 'restrict_manage_posts', array($this,'filter_links_by_legacy_groups') );
|
20 |
+
add_filter( 'posts_join', array($this,'join_links_to_posts') );
|
21 |
+
add_filter( 'posts_where', array($this,'where_links_belong_to_legacy_group') );
|
22 |
+
|
23 |
+
// Alter Quick Links Menu (subsubsub)
|
24 |
+
add_filter( 'views_edit-'.PrliLink::$cpt, array($this,'modify_quick_links') );
|
25 |
+
|
26 |
+
// Sort links by custom columns
|
27 |
+
add_action( 'posts_orderby', array($this, 'custom_link_sort_orderby') );
|
28 |
+
|
29 |
+
add_action('manage_'.PrliLink::$cpt.'_posts_custom_column', array($this,'custom_columns'), 10, 2);
|
30 |
+
add_filter('manage_edit-'.PrliLink::$cpt.'_columns', array($this,'columns'));
|
31 |
+
add_filter('manage_edit-'.PrliLink::$cpt.'_sortable_columns', array($this,'sortable_columns'));
|
32 |
+
|
33 |
+
add_filter('post_row_actions', array($this, 'add_row_actions'), 10, 2);
|
34 |
|
35 |
if(!($snapshot_timestamp = wp_next_scheduled('prli_cleanup_visitor_locks_worker'))) {
|
36 |
wp_schedule_event( time(), 'prli_cleanup_visitor_locks_interval', 'prli_cleanup_visitor_locks_worker' );
|
37 |
}
|
38 |
}
|
39 |
|
40 |
+
public function register_post_type() {
|
41 |
+
$args = array(
|
42 |
+
'labels' => array(
|
43 |
+
'name' => esc_html__('Pretty Links', 'pretty-link'),
|
44 |
+
'singular_name' => esc_html__('Pretty Link', 'pretty-link'),
|
45 |
+
'add_new_item' => esc_html__('Add New Pretty Link', 'pretty-link'),
|
46 |
+
'edit_item' => esc_html__('Edit Pretty Link', 'pretty-link'),
|
47 |
+
'new_item' => esc_html__('New Pretty Link', 'pretty-link'),
|
48 |
+
'view_item' => esc_html__('View Pretty Link', 'pretty-link'),
|
49 |
+
'search_items' => esc_html__('Search Pretty Links', 'pretty-link'),
|
50 |
+
'not_found' => esc_html__('No Pretty Links found', 'pretty-link'),
|
51 |
+
'not_found_in_trash' => esc_html__('No Pretty Links found in Trash', 'pretty-link'),
|
52 |
+
'parent_item_colon' => esc_html__('Parent Pretty Link:', 'pretty-link')
|
53 |
+
),
|
54 |
+
'public' => false,
|
55 |
+
'menu_position' => 55,
|
56 |
+
'show_ui' => true,
|
57 |
+
'show_in_admin_bar' => true,
|
58 |
+
'exclude_from_search' => true,
|
59 |
+
'can_export' => false,
|
60 |
+
'capability_type' => 'page',
|
61 |
+
'hierarchical' => false,
|
62 |
+
'register_meta_box_cb' => array($this, 'add_meta_boxes'),
|
63 |
+
'rewrite' => false,
|
64 |
+
'supports' => array('title')
|
65 |
+
);
|
66 |
+
|
67 |
+
$plp_update = new PrliUpdateController();
|
68 |
+
|
69 |
+
if($plp_update->is_installed()) {
|
70 |
+
$args['taxonomies'] = array(
|
71 |
+
PlpLinkCategoriesController::$ctax,
|
72 |
+
PlpLinkTagsController::$ctax,
|
73 |
+
);
|
74 |
}
|
|
|
75 |
|
76 |
+
register_post_type( PrliLink::$cpt, $args );
|
77 |
+
}
|
78 |
|
79 |
+
/** Ensures that the CPT Links will list properly by post_date DESC */
|
80 |
+
public function set_custom_post_types_admin_order($wp_query) {
|
81 |
+
if( is_admin() && isset($wp_query->query['post_type']) ) {
|
82 |
+
// Get the post type from the query
|
83 |
+
$post_type = $wp_query->query['post_type'];
|
|
|
84 |
|
85 |
+
if( $post_type == PrliLink::$cpt ) {
|
86 |
+
$wp_query->set( 'orderby', 'post_date' );
|
87 |
+
$wp_query->set( 'order', 'DESC' );
|
88 |
+
}
|
89 |
+
}
|
90 |
}
|
91 |
|
92 |
+
public function add_meta_boxes() {
|
93 |
+
global $post_id, $prli_link;
|
|
|
|
|
94 |
|
95 |
+
add_meta_box(
|
96 |
+
'pretty-link-settings',
|
97 |
+
esc_html__('Pretty Link Settings', 'pretty-link'),
|
98 |
+
array($this, 'link_meta_box'), PrliLink::$cpt,
|
99 |
+
'normal', 'high'
|
100 |
+
);
|
101 |
+
|
102 |
+
remove_meta_box('slugdiv', PrliLink::$cpt, 'normal');
|
103 |
}
|
104 |
|
105 |
+
public function link_meta_box($post, $args) {
|
106 |
+
global $prli_link, $pagenow;
|
107 |
|
108 |
+
if($pagenow==='post-new.php') {
|
109 |
+
$values = $this->setup_new_vars();
|
110 |
+
}
|
111 |
+
else {
|
112 |
+
$id = $prli_link->get_link_from_cpt($post->ID);
|
113 |
+
$link = $prli_link->getOne($id);
|
114 |
+
$values = $this->setup_edit_vars($link);
|
115 |
}
|
116 |
+
require PRLI_VIEWS_PATH . '/links/form.php';
|
117 |
+
}
|
118 |
|
119 |
+
public function setup_new_vars() {
|
120 |
+
global $prli_link, $prli_options;
|
121 |
|
122 |
+
$values = array();
|
123 |
+
$values['url'] = (isset($_REQUEST['url'])?esc_url_raw(trim(stripslashes($_REQUEST['url']))):'');
|
124 |
+
$values['slug'] = (isset($_REQUEST['slug'])?sanitize_text_field(stripslashes($_REQUEST['slug'])):$prli_link->generateValidSlug());
|
125 |
+
$values['name'] = (isset($_REQUEST['name'])?sanitize_text_field(stripslashes($_REQUEST['name'])):'');
|
126 |
+
$values['description'] = (isset($_REQUEST['description'])?sanitize_textarea_field(stripslashes($_REQUEST['description'])):'');
|
|
|
|
|
|
|
|
|
127 |
|
128 |
+
$values['track_me'] = ((isset($_REQUEST['track_me']) and $_REQUEST['track_me'] == 'on') or (!isset($_REQUEST['track_me']) and $prli_options->link_track_me == '1'));
|
129 |
+
$values['nofollow'] = ((isset($_REQUEST['nofollow']) and $_REQUEST['nofollow'] == 'on') or (!isset($_REQUEST['nofollow']) and $prli_options->link_nofollow == '1'));
|
|
|
|
|
|
|
|
|
|
|
130 |
|
131 |
+
$values['redirect_type'] = array();
|
132 |
+
$values['redirect_type']['307'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '307') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '307'))?' selected="selected"':'');
|
133 |
+
$values['redirect_type']['302'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '302') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '302'))?' selected="selected"':'');
|
134 |
+
$values['redirect_type']['301'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '301') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == '301'))?' selected="selected"':'');
|
135 |
+
$values['redirect_type']['prettybar'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'prettybar') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'prettybar'))?' selected="selected"':'');
|
136 |
+
$values['redirect_type']['cloak'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'cloak') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'cloak'))?' selected="selected"':'');
|
137 |
+
$values['redirect_type']['pixel'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'pixel') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'pixel'))?' selected="selected"':'');
|
138 |
+
$values['redirect_type']['metarefresh'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'metarefresh') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'metarefresh'))?' selected="selected"':'');
|
139 |
+
$values['redirect_type']['javascript'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'javascript') or (!isset($_REQUEST['redirect_type']) and $prli_options->link_redirect_type == 'javascript'))?' selected="selected"':'');
|
140 |
+
|
141 |
+
$values['groups'] = array();
|
142 |
|
143 |
+
$values['param_forwarding'] = isset($_REQUEST['param_forwarding']);
|
144 |
+
$values['delay'] = (isset($_REQUEST['delay']) ? (int) $_REQUEST['delay'] : 0);
|
145 |
|
146 |
+
if(isset($_REQUEST['google_tracking'])) {
|
147 |
+
$values['google_tracking'] = true;
|
148 |
+
}
|
149 |
+
else {
|
150 |
+
global $plp_update;
|
151 |
+
if( $plp_update->is_installed() ) {
|
152 |
+
global $plp_options;
|
153 |
+
$values['google_tracking'] = $plp_options->google_tracking?true:false;
|
154 |
+
}
|
155 |
+
else {
|
156 |
+
$values['google_tracking'] = false;
|
157 |
+
}
|
158 |
}
|
159 |
+
|
160 |
+
return $values;
|
161 |
}
|
162 |
|
163 |
+
public function setup_edit_vars($record) {
|
164 |
+
global $prli_link, $prli_link_meta;
|
165 |
|
166 |
+
$values = array();
|
167 |
+
$values['link_id'] = $record->id;
|
168 |
+
$values['url'] = ((isset($_REQUEST['url']) and $record == null)?esc_url_raw(trim(stripslashes($_REQUEST['url']))):stripslashes($record->url));
|
169 |
+
$values['slug'] = ((isset($_REQUEST['slug']) and $record == null)?sanitize_text_field(stripslashes($_REQUEST['slug'])):stripslashes($record->slug));
|
170 |
+
$values['name'] = ((isset($_REQUEST['name']) and $record == null)?sanitize_text_field(stripslashes($_REQUEST['name'])):stripslashes($record->name));
|
171 |
+
$values['description'] = ((isset($_REQUEST['description']) and $record == null)?sanitize_textarea_field(stripslashes($_REQUEST['description'])):stripslashes($record->description));
|
172 |
+
$values['track_me'] = ((isset($_REQUEST['track_me']) or $record->track_me) and ((isset($_REQUEST['track_me']) and $_REQUEST['track_me'] == 'on') or $record->track_me == 1));
|
173 |
+
$values['nofollow'] = ((isset($_REQUEST['nofollow']) and $_REQUEST['nofollow'] == 'on') or (isset($record->nofollow) && $record->nofollow == 1));
|
174 |
|
175 |
+
$values['groups'] = array();
|
176 |
|
177 |
+
$values['param_forwarding'] = (isset($_REQUEST['param_forwarding']) || !(empty($record->param_forwarding) || $record->param_forwarding=='off'));
|
178 |
+
|
179 |
+
$values['redirect_type'] = array();
|
180 |
+
$values['redirect_type']['307'] = ((!isset($_REQUEST['redirect_type']) or (isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '307') or (isset($record->redirect_type) and $record->redirect_type == '307'))?' selected="selected"':'');
|
181 |
+
$values['redirect_type']['302'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '302') or (isset($record->redirect_type) and $record->redirect_type == '302'))?' selected="selected"':'');
|
182 |
+
$values['redirect_type']['301'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == '301') or (isset($record->redirect_type) and $record->redirect_type == '301'))?' selected="selected"':'');
|
183 |
+
$values['redirect_type']['prettybar'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'prettybar') or (isset($record->redirect_type) and $record->redirect_type == 'prettybar'))?' selected="selected"':'');
|
184 |
+
$values['redirect_type']['cloak'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'cloak') or (isset($record->redirect_type) and $record->redirect_type == 'cloak'))?' selected="selected"':'');
|
185 |
+
$values['redirect_type']['pixel'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'pixel') or (isset($record->redirect_type) and $record->redirect_type == 'pixel'))?' selected="selected"':'');
|
186 |
+
$values['redirect_type']['metarefresh'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'metarefresh') or (isset($record->redirect_type) and $record->redirect_type == 'metarefresh'))?' selected="selected"':'');
|
187 |
+
$values['redirect_type']['javascript'] = (((isset($_REQUEST['redirect_type']) and $_REQUEST['redirect_type'] == 'javascript') or (isset($record->redirect_type) and $record->redirect_type == 'javascript'))?' selected="selected"':'');
|
188 |
|
189 |
+
if(isset($_REQUEST['delay'])) {
|
190 |
+
$values['delay'] = (int) $_REQUEST['delay'];
|
|
|
|
|
191 |
}
|
192 |
else {
|
193 |
+
$values['delay'] = $prli_link_meta->get_link_meta($record->id, 'delay', true);
|
194 |
+
}
|
|
|
195 |
|
196 |
+
if(isset($_REQUEST['google_tracking'])) {
|
197 |
+
$values['google_tracking'] = true;
|
198 |
+
}
|
199 |
+
else {
|
200 |
+
$values['google_tracking'] = (($prli_link_meta->get_link_meta($record->id, 'google_tracking', true) == 1)?true:false);
|
201 |
}
|
202 |
+
|
203 |
+
return $values;
|
204 |
}
|
205 |
|
206 |
+
public static function save_cpt_link() {
|
207 |
+
global $post, $post_id, $typenow, $prli_link, $prli_group;
|
208 |
|
209 |
+
# Skip ajax
|
210 |
+
if(defined('DOING_AJAX')) {
|
211 |
+
return $post_id;
|
212 |
+
}
|
213 |
|
214 |
+
# Skip non-post requests & non-admin requests
|
215 |
+
if(!PrliUtils::is_post_request() || !PrliUtils::is_admin()) {
|
216 |
+
return $post_id;
|
217 |
+
}
|
|
|
218 |
|
219 |
+
# Please only run this code when we're dealing with a Link CPT
|
220 |
+
if($typenow !== PrliLink::$cpt) {
|
221 |
+
return $post_id;
|
222 |
+
}
|
223 |
|
224 |
+
# Verify nonce
|
225 |
+
if(!wp_verify_nonce(isset($_POST[PrliLink::$nonce_str]) ? $_POST[PrliLink::$nonce_str] : '', PrliLink::$nonce_str . wp_salt())) {
|
226 |
+
return $post_id;
|
227 |
}
|
228 |
|
229 |
+
$link_id = isset($_POST['link_id']) ? (int) $_POST['link_id'] : 0;
|
|
|
230 |
|
231 |
+
$_POST['name'] = $_POST['post_title'];
|
232 |
+
$_POST['link_cpt_id'] = $post->ID;
|
233 |
|
234 |
+
if($link_id) {
|
235 |
+
$link_id = $prli_link->update( $link_id, $_POST );
|
|
|
|
|
|
|
236 |
}
|
237 |
else {
|
238 |
+
$link_id = $prli_link->create( $_POST );
|
|
|
|
|
|
|
|
|
|
|
239 |
}
|
240 |
+
|
241 |
+
do_action('prli_update_link', $link_id);
|
242 |
}
|
243 |
|
244 |
+
public function transition_cpt_status( $new_status, $old_status, $post ) {
|
245 |
global $prli_link;
|
|
|
246 |
|
247 |
+
if( $new_status != $old_status ) {
|
248 |
+
$link_id = $prli_link->get_link_from_cpt($post->ID);
|
249 |
|
250 |
+
if(empty($link_id)) { return; }
|
|
|
251 |
|
252 |
+
$link = $prli_link->getOne($link_id);
|
253 |
|
254 |
+
if( $new_status == 'publish' ) {
|
255 |
+
$prli_link->enable_link($link_id);
|
256 |
+
}
|
257 |
+
else {
|
258 |
+
$prli_link->disable_link($link_id);
|
259 |
+
}
|
260 |
+
}
|
261 |
+
}
|
262 |
|
263 |
+
public static function delete_cpt_link($post_id) {
|
264 |
+
global $prli_link;
|
265 |
|
266 |
+
$link_id = $prli_link->get_link_from_cpt($post_id);
|
|
|
267 |
|
268 |
+
if(empty($link_id)) { return; }
|
|
|
|
|
269 |
|
270 |
+
// CPT is already deleted by now so don't try again
|
271 |
+
return $prli_link->destroy($link_id, 'dont_delete_cpt');
|
272 |
+
}
|
273 |
+
|
274 |
+
public function maybe_cleanup_visitor_locks() {
|
275 |
+
$cleanup = get_transient('prli_cleanup_visitor_locks');
|
276 |
+
|
277 |
+
if(empty($cleanup)) {
|
278 |
+
set_transient('prli_cleanup_visitor_locks', 1, DAY_IN_SECONDS);
|
279 |
+
$this->cleanup_visitor_locks();
|
280 |
}
|
281 |
}
|
282 |
|
283 |
+
/** Delete visitor locks so we don't explode the size of peoples' databases */
|
284 |
+
public function cleanup_visitor_locks() {
|
285 |
+
global $wpdb;
|
286 |
|
287 |
+
//| 1127004 | _transient_timeout_prli_visitor_58b12712690d5 | 1488004892 | no |
|
288 |
+
//| 1127005 | _transient_prli_visitor_58b12712690d5 | 58b12712690d5 | no |
|
289 |
+
|
290 |
+
$q = $wpdb->prepare("
|
291 |
+
SELECT option_name
|
292 |
+
FROM {$wpdb->options}
|
293 |
+
WHERE option_name LIKE %s
|
294 |
+
AND option_value < %s
|
295 |
+
ORDER BY option_value
|
296 |
+
",
|
297 |
+
'_transient_timeout_prli_visitor_%',
|
298 |
+
time()
|
299 |
+
);
|
300 |
+
|
301 |
+
$timeouts = $wpdb->get_col($q);
|
302 |
+
|
303 |
+
foreach($timeouts as $i => $timeout_key) {
|
304 |
+
// figure out the transient_key from the timeout_key
|
305 |
+
$transient_key = preg_replace(
|
306 |
+
'/^_transient_timeout_prli_visitor_/',
|
307 |
+
'_transient_prli_visitor_',
|
308 |
+
$timeout_key
|
309 |
+
);
|
310 |
+
|
311 |
+
$tq = $wpdb->prepare("
|
312 |
+
DELETE FROM {$wpdb->options}
|
313 |
+
WHERE option_name IN (%s,%s)
|
314 |
+
",
|
315 |
+
$timeout_key,
|
316 |
+
$transient_key
|
317 |
+
);
|
318 |
+
|
319 |
+
$res = $wpdb->query($tq);
|
320 |
}
|
321 |
+
}
|
322 |
+
|
323 |
+
public function intervals( $schedules ) {
|
324 |
+
$schedules['prli_cleanup_visitor_locks_interval'] = array(
|
325 |
+
'interval' => HOUR_IN_SECONDS,
|
326 |
+
'display' => esc_html__('Pretty Link Cleanup Visitor Locks', 'pretty-link'),
|
327 |
+
);
|
328 |
|
329 |
+
return $schedules;
|
|
|
|
|
330 |
}
|
331 |
|
332 |
+
public function ajax_validate_pretty_link() {
|
333 |
global $prli_link;
|
334 |
|
335 |
+
check_ajax_referer('validate_pretty_link','security');
|
336 |
+
|
337 |
+
if(!PrliUtils::is_post_request()) {
|
338 |
+
PrliUtils::exit_with_status(403,esc_html__('Forbidden', 'pretty-link'));
|
339 |
}
|
340 |
|
341 |
+
$id = isset($_POST['id']) ? (int) $_POST['id'] : 0;
|
342 |
+
$errors = $prli_link->validate($_POST, $id);
|
|
|
|
|
343 |
|
344 |
+
$errors = apply_filters('prli_validate_link', $errors);
|
|
|
|
|
|
|
345 |
|
346 |
+
$message = esc_html__('Success!', 'pretty-link');
|
347 |
+
if(!empty($errors)) {
|
348 |
+
$message = '<div>' . esc_html__('Fix the following errors:', 'pretty-link') . '</div><ul>';
|
349 |
+
foreach($errors as $error) {
|
350 |
+
$message .= "<li>{$error}</li>";
|
351 |
}
|
352 |
+
$message .= '</ul>';
|
353 |
+
}
|
354 |
|
355 |
+
$response = array(
|
356 |
+
'valid' => empty($errors),
|
357 |
+
'message' => $message
|
358 |
+
);
|
359 |
|
360 |
+
PrliUtils::exit_with_status(200,json_encode($response));
|
361 |
+
}
|
|
|
362 |
|
363 |
+
public function columns($columns) {
|
364 |
+
if(isset($_REQUEST['post_status']) && $_REQUEST['post_status'] == 'trash') {
|
365 |
+
return $columns;
|
366 |
+
}
|
367 |
|
368 |
+
global $plp_update;
|
369 |
+
|
370 |
+
$categories_label = esc_html__('Categories', 'pretty-link');
|
371 |
+
$tags_label = esc_html__('Tags', 'pretty-link');
|
372 |
+
$keywords_label = esc_html__('Keywords', 'pretty-link');
|
373 |
+
|
374 |
+
if ($plp_update->is_installed()) {
|
375 |
+
$category_key = 'taxonomy-pretty-link-category';
|
376 |
+
$tag_key = 'taxonomy-pretty-link-tag';
|
377 |
+
} else {
|
378 |
+
$category_key = 'pro-pretty-link-category';
|
379 |
+
$tag_key = 'pro-pretty-link-tag';
|
380 |
+
$categories_label = $categories_label . ' ' .
|
381 |
+
PrliAppHelper::pro_only_feature_indicator(
|
382 |
+
'link-list-categories-column-header',
|
383 |
+
__('Pro', 'pretty-link'),
|
384 |
+
__('Upgrade to a Pretty Links premium plan to get Link Categories', 'pretty-link')
|
385 |
+
);
|
386 |
+
$tags_label = $tags_label . ' ' .
|
387 |
+
PrliAppHelper::pro_only_feature_indicator(
|
388 |
+
'link-list-tags-column-header',
|
389 |
+
__('Pro', 'pretty-link'),
|
390 |
+
__('Upgrade to a Pretty Links premium plan to get Link Tags', 'pretty-link')
|
391 |
+
);
|
392 |
+
$keywords_label = $keywords_label . ' ' .
|
393 |
+
PrliAppHelper::pro_only_feature_indicator(
|
394 |
+
'link-list-keywords-column-header',
|
395 |
+
__('Pro', 'pretty-link'),
|
396 |
+
__('Upgrade to a Pretty Links premium plan to get Keyword Replacements', 'pretty-link')
|
397 |
+
);
|
398 |
}
|
399 |
+
|
400 |
+
$columns = array(
|
401 |
+
'cb' => '<input type="checkbox" />',
|
402 |
+
'settings' => esc_html__('Settings', 'pretty-link'),
|
403 |
+
'title' => esc_html__('Link Title', 'pretty-link'),
|
404 |
+
//'slug' => esc_html__('Slug', 'pretty-link'),
|
405 |
+
//'target' => esc_html__('Target', 'pretty-link'),
|
406 |
+
$category_key => $categories_label,
|
407 |
+
$tag_key => $tags_label,
|
408 |
+
'keywords' => $keywords_label,
|
409 |
+
'clicks' => esc_html__('Clicks', 'pretty-link'),
|
410 |
+
'date' => esc_html__('Date', 'pretty-link'),
|
411 |
+
'links' => esc_html__('Pretty Links', 'pretty-link')
|
412 |
+
);
|
413 |
+
|
414 |
+
return $columns;
|
415 |
+
}
|
416 |
+
|
417 |
+
public function sortable_columns($columns) {
|
418 |
+
if(isset($_REQUEST['post_status']) && $_REQUEST['post_status'] == 'trash') {
|
419 |
+
return $columns;
|
420 |
}
|
421 |
+
|
422 |
+
$columns['title'] = 'title';
|
423 |
+
$columns['slug'] = 'slug';
|
424 |
+
$columns['date'] = 'date';
|
425 |
+
|
426 |
+
return $columns;
|
427 |
}
|
428 |
|
429 |
+
public function custom_columns($column, $post_id) {
|
430 |
+
global $prli_link, $prli_blogurl;
|
431 |
|
432 |
+
$link_id = $prli_link->get_link_from_cpt($post_id);
|
433 |
+
$link = $prli_link->getOne($link_id, OBJECT, true);
|
434 |
|
435 |
+
// This will happen if the link is trashed
|
436 |
+
if(empty($link)) { return $column; }
|
|
|
437 |
|
438 |
+
$struct = PrliUtils::get_permalink_pre_slug_uri();
|
439 |
+
$pretty_link_url = "{$prli_blogurl}{$struct}{$link->slug}";
|
440 |
|
441 |
+
if(!empty($link)) {
|
442 |
+
if('settings' == $column) {
|
443 |
+
PrliLinksHelper::link_list_icons($link);
|
444 |
+
}
|
445 |
+
elseif('keywords' == $column) {
|
446 |
+
$pro_only = apply_filters(
|
447 |
+
'prli_link_column_keywords',
|
448 |
+
'—',
|
449 |
+
$link_id
|
450 |
+
);
|
451 |
+
echo $pro_only;
|
452 |
+
}
|
453 |
+
elseif('pro-pretty-link-category' == $column) {
|
454 |
+
$pro_only = apply_filters(
|
455 |
+
'prli_link_column_categories',
|
456 |
+
'—',
|
457 |
+
$link_id
|
458 |
+
);
|
459 |
+
echo $pro_only;
|
460 |
+
}
|
461 |
+
elseif('pro-pretty-link-tag' == $column) {
|
462 |
+
$pro_only = apply_filters(
|
463 |
+
'prli_link_column_tags',
|
464 |
+
'—',
|
465 |
+
$link_id
|
466 |
+
);
|
467 |
+
echo $pro_only;
|
468 |
+
}
|
469 |
+
elseif('clicks' == $column) {
|
470 |
+
PrliLinksHelper::link_list_clicks($link);
|
471 |
+
}
|
472 |
+
elseif('links' == $column) {
|
473 |
+
PrliLinksHelper::link_list_url_clipboard($link);
|
474 |
+
}
|
475 |
+
elseif('slug' == $column) {
|
476 |
+
echo esc_html(stripslashes($link->slug));
|
477 |
+
}
|
478 |
+
elseif('target' == $column) {
|
479 |
+
echo esc_url($link->url);
|
480 |
+
}
|
481 |
}
|
482 |
+
}
|
483 |
|
484 |
+
/**
|
485 |
+
* Append row actions to list page
|
486 |
+
* @see add_filter('post_row_actions')
|
487 |
+
* @param array $actions Current row actions
|
488 |
+
* @param WP_Post current Post
|
489 |
+
* @return array filtered row actions
|
490 |
+
*/
|
491 |
+
public function add_row_actions($actions, $post) {
|
492 |
+
global $prli_link;
|
493 |
|
494 |
+
if($post->post_type === PrliLink::$cpt) {
|
495 |
+
$id = $prli_link->get_link_from_cpt($post->ID);
|
496 |
+
$link = $prli_link->getOne($id);
|
|
|
497 |
|
498 |
+
if(empty($link)) { return $actions; }
|
|
|
|
|
|
|
499 |
|
500 |
+
$new_actions = array();
|
501 |
+
$new_actions['edit'] = $actions['edit'];
|
502 |
+
$new_actions['reset'] = PrliLinksHelper::link_action_reset($link, __('Reset', 'pretty-link'));
|
503 |
|
504 |
+
if( $link->redirect_type !== 'pixel' ) {
|
505 |
+
$new_actions['tweet'] = PrliLinksHelper::link_action_tweet($link, __('Tweet', 'pretty-link'));
|
506 |
+
$new_actions['email'] = PrliLinksHelper::link_action_email($link, __('Email', 'pretty-link'));
|
507 |
+
$new_actions['url'] = PrliLinksHelper::link_action_visit_target($link, __('Target »', 'pretty-link'));
|
508 |
+
$new_actions['pl'] = PrliLinksHelper::link_action_visit_pretty_link($link, __('Pretty Link »', 'pretty-link'));
|
509 |
+
}
|
510 |
|
511 |
+
$plp_update = new PrliUpdateController();
|
|
|
512 |
|
513 |
+
if($plp_update->is_installed()) {
|
514 |
+
global $plp_options, $prli_link_meta;
|
|
|
|
|
515 |
|
516 |
+
if ($plp_options->generate_qr_codes) {
|
517 |
+
$plp_links_ctrl = new PlpLinksController();
|
518 |
+
$new_actions['qr'] = $plp_links_ctrl->qr_code_link($link->id);
|
519 |
+
}
|
520 |
|
521 |
+
$dynamic_redirection = $prli_link_meta->get_link_meta($link->id, 'prli_dynamic_redirection', true);
|
|
|
|
|
|
|
522 |
|
523 |
+
if ($dynamic_redirection == 'rotate') {
|
524 |
+
$enable_split_test = $prli_link_meta->get_link_meta($link->id, 'prli-enable-split-test', true);
|
|
|
|
|
525 |
|
526 |
+
if ($enable_split_test) {
|
527 |
+
$new_actions['report'] = sprintf(
|
528 |
+
'<a href="%s" title="%s">%s</a>',
|
529 |
+
esc_url(admin_url('admin.php?page=plp-reports&action=display-split-test-report&id=') . $link->id),
|
530 |
+
esc_attr__('View Split Test Report', 'pretty-link'),
|
531 |
+
esc_html__('View Split Test Report', 'pretty-link')
|
532 |
+
);
|
533 |
+
}
|
534 |
+
}
|
535 |
}
|
536 |
|
537 |
+
$new_actions['trash'] = $actions['trash'];
|
538 |
+
$actions = $new_actions;
|
539 |
}
|
540 |
|
541 |
+
return $actions;
|
542 |
+
}
|
|
|
543 |
|
544 |
+
public function ajax_reset_pretty_link() {
|
545 |
+
global $prli_link;
|
546 |
|
547 |
+
check_ajax_referer('reset_pretty_link','security');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
548 |
|
549 |
+
if(!PrliUtils::is_post_request()) {
|
550 |
+
PrliUtils::exit_with_status(403,esc_html__('Forbidden', 'pretty-link'));
|
|
|
|
|
|
|
551 |
}
|
|
|
|
|
552 |
|
553 |
+
$prli_link->reset( $_POST['id'] );
|
|
|
|
|
|
|
|
|
|
|
|
|
554 |
|
555 |
+
$response = array(
|
556 |
+
'message' => esc_html__("Your Pretty Link was Successfully Reset", 'pretty-link')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
557 |
);
|
558 |
+
|
559 |
+
PrliUtils::exit_with_status(200,json_encode($response));
|
560 |
}
|
561 |
|
562 |
+
public function ajax_quick_create() {
|
563 |
+
if (!PrliUtils::is_post_request() || !isset($_POST['url'], $_POST['slug']) || !is_string($_POST['url']) || !is_string($_POST['slug'])) {
|
564 |
+
wp_send_json_error(array('message' => __('Bad request', 'pretty-link')));
|
565 |
+
}
|
566 |
|
567 |
+
if (!PrliUtils::is_authorized()) {
|
568 |
+
wp_send_json_error(array('message' => __('Insufficient permissions', 'pretty-link')));
|
569 |
+
}
|
|
|
|
|
570 |
|
571 |
+
if (!check_ajax_referer('prli_quick_create', false, false)) {
|
572 |
+
wp_send_json_error(array('message' => __('Security check failed', 'pretty-link')));
|
573 |
+
}
|
574 |
|
575 |
+
global $prli_link, $prli_options;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
576 |
|
577 |
+
$errors = $prli_link->validate($_POST);
|
578 |
|
579 |
+
if (count($errors)) {
|
580 |
+
wp_send_json_error(array('message' => $errors[0]));
|
|
|
|
|
|
|
|
|
|
|
|
|
581 |
}
|
582 |
|
583 |
+
$_POST['redirect_type'] = $prli_options->link_redirect_type;
|
|
|
584 |
|
585 |
+
if ($prli_options->link_track_me) {
|
586 |
+
$_POST['track_me'] = 'on';
|
587 |
}
|
588 |
+
|
589 |
+
if ($prli_options->link_nofollow) {
|
590 |
+
$_POST['nofollow'] = 'on';
|
|
|
|
|
|
|
|
|
|
|
|
|
591 |
}
|
592 |
|
593 |
+
$link_id = $prli_link->create($_POST);
|
594 |
+
$link = $prli_link->getOne($link_id);
|
595 |
|
596 |
+
if (!$link) {
|
597 |
+
wp_send_json_error(array('message' => __('An error occurred creating the link', 'pretty-link')));
|
598 |
+
}
|
599 |
|
600 |
+
wp_send_json_success([
|
601 |
+
'redirect' => esc_url_raw(sprintf(admin_url('post.php?post=%d&action=edit'), $link->link_cpt_id))
|
602 |
+
]);
|
603 |
+
}
|
|
|
|
|
|
|
604 |
|
605 |
+
/**
|
606 |
+
* Filter groups if the user is running the free version of Pretty Links
|
607 |
+
*
|
608 |
+
* @since 1.1.0
|
609 |
+
* @return void
|
610 |
+
*/
|
611 |
+
public function filter_links_by_legacy_groups() {
|
612 |
+
global $typenow, $wp_query, $prli_link, $plp_update;
|
613 |
|
614 |
+
if( $typenow == PrliLink::$cpt && !$plp_update->is_installed() ) {
|
615 |
+
$groups = $prli_link->get_all_legacy_groups();
|
616 |
|
617 |
+
if(empty($groups)) { return; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
618 |
|
619 |
+
$current_group = 'all';
|
620 |
+
if( isset( $_GET['group'] ) && is_numeric( $_GET['group'] ) ) {
|
621 |
+
$current_group = (int) $_GET['group']; // Check if option has been selected
|
622 |
+
}
|
|
|
|
|
623 |
|
624 |
+
?>
|
625 |
+
<select name="group" id="group">
|
626 |
+
<option
|
627 |
+
value="all"
|
628 |
+
<?php selected( 'all', $current_group ); ?>>
|
629 |
+
<?php esc_html_e( 'All Groups (Legacy)', 'pretty-link' ); ?>
|
630 |
+
</option>
|
631 |
+
<?php foreach( $groups as $group ): ?>
|
632 |
+
<option
|
633 |
+
value="<?php echo esc_attr( $group->id ); ?>"
|
634 |
+
<?php selected( $group->id, $current_group ); ?>>
|
635 |
+
<?php echo esc_html( stripslashes($group->name) ); ?>
|
636 |
+
</option>
|
637 |
+
<?php endforeach; ?>
|
638 |
+
</select>
|
639 |
+
<?php
|
640 |
}
|
641 |
+
}
|
642 |
+
|
643 |
+
// Join for searching link groups
|
644 |
+
public function join_links_to_posts($join) {
|
645 |
+
global $wp_query, $wpdb, $typenow;
|
646 |
+
|
647 |
+
if( $typenow == PrliLink::$cpt &&
|
648 |
+
( ( isset($_GET['orderby']) && isset($_GET['order']) ) ||
|
649 |
+
empty($wp_query->query_vars['s']) ) ) {
|
650 |
+
$join .= "JOIN {$wpdb->prefix}prli_links AS li ON {$wpdb->posts}.ID = li.link_cpt_id ";
|
651 |
}
|
652 |
|
653 |
+
return $join;
|
654 |
}
|
655 |
|
656 |
+
// Where clause for searching link groups
|
657 |
+
public function where_links_belong_to_legacy_group( $where ) {
|
658 |
+
global $wp_query, $wpdb, $typenow;
|
659 |
|
660 |
+
if( $typenow == PrliLink::$cpt &&
|
661 |
+
isset($_GET['group']) &&
|
662 |
+
is_numeric($_GET['group']) &&
|
663 |
+
empty($wp_query->query_vars['s']) ) {
|
664 |
+
// possible because we've already joined the links to posts
|
665 |
+
$where .= $wpdb->prepare(" AND li.group_id=%d", (int) $_GET['group']);
|
666 |
}
|
667 |
+
|
668 |
+
return $where;
|
669 |
}
|
670 |
|
671 |
+
// Only keep the All & Trash quick links
|
672 |
+
public function modify_quick_links($views) {
|
673 |
+
$view_keys = array_keys($views);
|
674 |
+
$keep_keys = array('all','trash');
|
675 |
|
676 |
+
foreach($view_keys as $view_key) {
|
677 |
+
if(!in_array($view_key,$keep_keys)) {
|
678 |
+
unset($views[$view_key]);
|
679 |
+
}
|
680 |
+
}
|
681 |
|
682 |
+
return $views;
|
683 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
684 |
|
685 |
+
// Add custom sort orderbys
|
686 |
+
public function custom_link_sort_orderby($orderby) {
|
687 |
+
global $wp_query, $wpdb, $typenow;
|
688 |
|
689 |
+
if( $typenow == PrliLink::$cpt &&
|
690 |
+
isset($_GET['orderby']) && isset($_GET['order']) ) {
|
|
|
|
|
|
|
|
|
|
|
691 |
|
692 |
+
$order = strtoupper($_GET['order'])=='ASC' ? 'ASC' : 'DESC';
|
|
|
|
|
|
|
|
|
|
|
|
|
693 |
|
694 |
+
if($_GET['orderby']=='slug') {
|
695 |
+
$orderby = "
|
696 |
+
li.slug {$order}
|
697 |
+
";
|
698 |
+
}
|
699 |
+
elseif($_GET['orderby']=='date') {
|
700 |
+
$orderby = "
|
701 |
+
li.created_at {$order}
|
702 |
+
";
|
703 |
+
}
|
704 |
+
elseif($_GET['orderby']=='title') {
|
705 |
+
$orderby = "
|
706 |
+
li.name {$order}
|
707 |
+
";
|
708 |
+
}
|
709 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
710 |
|
711 |
+
return $orderby;
|
712 |
}
|
713 |
+
|
714 |
}
|
715 |
|
app/controllers/PrliLocalApiController.php
CHANGED
@@ -30,7 +30,7 @@ class PrliLocalApiController extends PrliBaseController {
|
|
30 |
*
|
31 |
* @param string $description Optional, description for the Pretty Link.
|
32 |
*
|
33 |
-
* @param integer $group_id Optional, the group that this link will be placed in.
|
34 |
* If this value isn't set then the link will not be
|
35 |
* placed in a group.
|
36 |
*
|
@@ -59,7 +59,7 @@ class PrliLocalApiController extends PrliBaseController {
|
|
59 |
$slug = '',
|
60 |
$name = '',
|
61 |
$description = '',
|
62 |
-
$group_id = 0,
|
63 |
$track_me = '',
|
64 |
$nofollow = '',
|
65 |
$redirect_type = '',
|
@@ -75,7 +75,6 @@ class PrliLocalApiController extends PrliBaseController {
|
|
75 |
$values['slug'] = (($slug == '')?$prli_link->generateValidSlug():$slug);
|
76 |
$values['name'] = $name;
|
77 |
$values['description'] = $description;
|
78 |
-
$values['group_id'] = $group_id;
|
79 |
$values['redirect_type'] = (($redirect_type == '')?$prli_options->link_redirect_type:$redirect_type);
|
80 |
$values['nofollow'] = (($nofollow === '')?$prli_options->link_nofollow:$nofollow);
|
81 |
$values['track_me'] = (($track_me === '')?$prli_options->link_track_me:$track_me);
|
@@ -111,7 +110,7 @@ class PrliLocalApiController extends PrliBaseController {
|
|
111 |
$slug = '',
|
112 |
$name = -1,
|
113 |
$description = -1,
|
114 |
-
$group_id = '',
|
115 |
$track_me = '',
|
116 |
$nofollow = '',
|
117 |
$redirect_type = '',
|
@@ -136,12 +135,12 @@ class PrliLocalApiController extends PrliBaseController {
|
|
136 |
$values['slug'] = (($slug == '')?$record->slug:$slug);
|
137 |
$values['name'] = (($name == -1)?$record->name:$name);
|
138 |
$values['description'] = (($description == -1)?$record->description:$description);
|
139 |
-
$values['group_id'] = (($group_id === '')?$record->group_id:$group_id);
|
140 |
$values['redirect_type'] = (($redirect_type == '')?$record->redirect_type:$redirect_type);
|
141 |
$values['nofollow'] = (($nofollow === '')?$record->nofollow:$nofollow);
|
142 |
$values['track_me'] = (($track_me === '')?(int)$record->track_me:$track_me);
|
143 |
$values['param_forwarding'] = !empty($param_forwarding);
|
144 |
$values['param_struct'] = (($param_struct == -1)?$record->param_struct:$param_struct);
|
|
|
145 |
|
146 |
// make array look like $_POST
|
147 |
if(empty($values['nofollow']) or !$values['nofollow'])
|
@@ -149,7 +148,7 @@ class PrliLocalApiController extends PrliBaseController {
|
|
149 |
if(empty($values['track_me']) or !$values['track_me'])
|
150 |
unset($values['track_me']);
|
151 |
|
152 |
-
$prli_error_messages = $prli_link->validate( $values );
|
153 |
|
154 |
if( count($prli_error_messages) == 0 )
|
155 |
{
|
@@ -166,16 +165,14 @@ class PrliLocalApiController extends PrliBaseController {
|
|
166 |
}
|
167 |
|
168 |
/**
|
169 |
-
* Get all the pretty link groups in an array suitable for creating a select box.
|
170 |
*
|
171 |
* @return bool (false if failure) | array A numerical array of associative arrays
|
172 |
* containing all the data about the pretty
|
173 |
* link groups.
|
174 |
*/
|
175 |
public function get_all_groups() {
|
176 |
-
|
177 |
-
$groups = $prli_group->getAll('',' ORDER BY gr.name', ARRAY_A);
|
178 |
-
return $groups;
|
179 |
}
|
180 |
|
181 |
/**
|
@@ -223,8 +220,11 @@ class PrliLocalApiController extends PrliBaseController {
|
|
223 |
public function get_pretty_link_url($id) {
|
224 |
global $prli_link,$prli_blogurl;
|
225 |
|
226 |
-
|
227 |
-
|
|
|
|
|
|
|
228 |
|
229 |
return false;
|
230 |
}
|
@@ -245,7 +245,7 @@ function prli_create_pretty_link( $target_url,
|
|
245 |
$slug = '',
|
246 |
$name = '',
|
247 |
$description = '',
|
248 |
-
$group_id = 0,
|
249 |
$track_me = '',
|
250 |
$nofollow = '',
|
251 |
$redirect_type = '',
|
@@ -256,7 +256,7 @@ function prli_create_pretty_link( $target_url,
|
|
256 |
$slug,
|
257 |
$name,
|
258 |
$description,
|
259 |
-
$group_id,
|
260 |
$track_me,
|
261 |
$nofollow,
|
262 |
$redirect_type,
|
@@ -269,7 +269,7 @@ function prli_update_pretty_link( $id,
|
|
269 |
$slug = '',
|
270 |
$name = -1,
|
271 |
$description = -1,
|
272 |
-
$group_id = '',
|
273 |
$track_me = '',
|
274 |
$nofollow = '',
|
275 |
$redirect_type = '',
|
@@ -281,7 +281,7 @@ function prli_update_pretty_link( $id,
|
|
281 |
$slug,
|
282 |
$name,
|
283 |
$description,
|
284 |
-
$group_id,
|
285 |
$track_me,
|
286 |
$nofollow,
|
287 |
$redirect_type,
|
@@ -289,9 +289,9 @@ function prli_update_pretty_link( $id,
|
|
289 |
$param_struct );
|
290 |
}
|
291 |
|
|
|
292 |
function prli_get_all_groups() {
|
293 |
-
|
294 |
-
return $ctrl->get_all_groups();
|
295 |
}
|
296 |
|
297 |
function prli_get_all_links() {
|
30 |
*
|
31 |
* @param string $description Optional, description for the Pretty Link.
|
32 |
*
|
33 |
+
* @param integer $group_id DEPRECATED Optional, the group that this link will be placed in.
|
34 |
* If this value isn't set then the link will not be
|
35 |
* placed in a group.
|
36 |
*
|
59 |
$slug = '',
|
60 |
$name = '',
|
61 |
$description = '',
|
62 |
+
$group_id = 0, // deprecated
|
63 |
$track_me = '',
|
64 |
$nofollow = '',
|
65 |
$redirect_type = '',
|
75 |
$values['slug'] = (($slug == '')?$prli_link->generateValidSlug():$slug);
|
76 |
$values['name'] = $name;
|
77 |
$values['description'] = $description;
|
|
|
78 |
$values['redirect_type'] = (($redirect_type == '')?$prli_options->link_redirect_type:$redirect_type);
|
79 |
$values['nofollow'] = (($nofollow === '')?$prli_options->link_nofollow:$nofollow);
|
80 |
$values['track_me'] = (($track_me === '')?$prli_options->link_track_me:$track_me);
|
110 |
$slug = '',
|
111 |
$name = -1,
|
112 |
$description = -1,
|
113 |
+
$group_id = '', // deprecated
|
114 |
$track_me = '',
|
115 |
$nofollow = '',
|
116 |
$redirect_type = '',
|
135 |
$values['slug'] = (($slug == '')?$record->slug:$slug);
|
136 |
$values['name'] = (($name == -1)?$record->name:$name);
|
137 |
$values['description'] = (($description == -1)?$record->description:$description);
|
|
|
138 |
$values['redirect_type'] = (($redirect_type == '')?$record->redirect_type:$redirect_type);
|
139 |
$values['nofollow'] = (($nofollow === '')?$record->nofollow:$nofollow);
|
140 |
$values['track_me'] = (($track_me === '')?(int)$record->track_me:$track_me);
|
141 |
$values['param_forwarding'] = !empty($param_forwarding);
|
142 |
$values['param_struct'] = (($param_struct == -1)?$record->param_struct:$param_struct);
|
143 |
+
$values['link_cpt_id'] = $record->link_cpt_id;
|
144 |
|
145 |
// make array look like $_POST
|
146 |
if(empty($values['nofollow']) or !$values['nofollow'])
|
148 |
if(empty($values['track_me']) or !$values['track_me'])
|
149 |
unset($values['track_me']);
|
150 |
|
151 |
+
$prli_error_messages = $prli_link->validate( $values, $id );
|
152 |
|
153 |
if( count($prli_error_messages) == 0 )
|
154 |
{
|
165 |
}
|
166 |
|
167 |
/**
|
168 |
+
* DEPRECATED: Get all the pretty link groups in an array suitable for creating a select box.
|
169 |
*
|
170 |
* @return bool (false if failure) | array A numerical array of associative arrays
|
171 |
* containing all the data about the pretty
|
172 |
* link groups.
|
173 |
*/
|
174 |
public function get_all_groups() {
|
175 |
+
return array();
|
|
|
|
|
176 |
}
|
177 |
|
178 |
/**
|
220 |
public function get_pretty_link_url($id) {
|
221 |
global $prli_link,$prli_blogurl;
|
222 |
|
223 |
+
$pretty_link = $prli_link->getOne($id);
|
224 |
+
|
225 |
+
if($pretty_link) {
|
226 |
+
return $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri().$pretty_link->slug;
|
227 |
+
}
|
228 |
|
229 |
return false;
|
230 |
}
|
245 |
$slug = '',
|
246 |
$name = '',
|
247 |
$description = '',
|
248 |
+
$group_id = 0, // deprecated
|
249 |
$track_me = '',
|
250 |
$nofollow = '',
|
251 |
$redirect_type = '',
|
256 |
$slug,
|
257 |
$name,
|
258 |
$description,
|
259 |
+
$group_id, // deprecated
|
260 |
$track_me,
|
261 |
$nofollow,
|
262 |
$redirect_type,
|
269 |
$slug = '',
|
270 |
$name = -1,
|
271 |
$description = -1,
|
272 |
+
$group_id = '', // deprecated
|
273 |
$track_me = '',
|
274 |
$nofollow = '',
|
275 |
$redirect_type = '',
|
281 |
$slug,
|
282 |
$name,
|
283 |
$description,
|
284 |
+
$group_id, // deprecated
|
285 |
$track_me,
|
286 |
$nofollow,
|
287 |
$redirect_type,
|
289 |
$param_struct );
|
290 |
}
|
291 |
|
292 |
+
/** DEPRECATED **/
|
293 |
function prli_get_all_groups() {
|
294 |
+
return array();
|
|
|
295 |
}
|
296 |
|
297 |
function prli_get_all_links() {
|
app/controllers/PrliOnboardingController.php
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
2 |
+
|
3 |
+
class PrliOnboardingController extends PrliBaseController {
|
4 |
+
public function load_hooks() {
|
5 |
+
// must be before PrliAppController::install() to detect a fresh install
|
6 |
+
add_action('init', array($this, 'maybe_onboard'), 5);
|
7 |
+
|
8 |
+
if (is_admin() && (!defined('DOING_AJAX') || !DOING_AJAX)) {
|
9 |
+
add_action('wp_loaded', array($this, 'onboarding_intercept'));
|
10 |
+
}
|
11 |
+
}
|
12 |
+
|
13 |
+
public function maybe_onboard() {
|
14 |
+
if (get_option('prli_version') == PRLI_VERSION) {
|
15 |
+
return;
|
16 |
+
}
|
17 |
+
|
18 |
+
if (get_option('prli_db_version')) {
|
19 |
+
// existing install
|
20 |
+
if ($this->is_major_update()) {
|
21 |
+
update_option('prli_onboard', 'update');
|
22 |
+
}
|
23 |
+
} else {
|
24 |
+
// fresh install
|
25 |
+
update_option('prli_onboard', 'welcome');
|
26 |
+
}
|
27 |
+
|
28 |
+
update_option('prli_version', PRLI_VERSION);
|
29 |
+
}
|
30 |
+
|
31 |
+
protected function is_major_update() {
|
32 |
+
$oldVersion = get_option('prli_version');
|
33 |
+
|
34 |
+
if (empty($oldVersion)) {
|
35 |
+
return true;
|
36 |
+
}
|
37 |
+
|
38 |
+
list($oldMajor, $oldMinor) = explode('.', $oldVersion);
|
39 |
+
list($newMajor, $newMinor) = explode('.', PRLI_VERSION);
|
40 |
+
|
41 |
+
return $newMajor > $oldMajor || ($newMajor == $oldMajor && $newMinor > $oldMinor);
|
42 |
+
}
|
43 |
+
|
44 |
+
public function onboarding_intercept() {
|
45 |
+
$onboard = get_option('prli_onboard');
|
46 |
+
|
47 |
+
if ($onboard == 'welcome' || $onboard == 'update') {
|
48 |
+
delete_option('prli_onboard');
|
49 |
+
wp_redirect(admin_url("admin.php?page=pretty-link-{$onboard}"));
|
50 |
+
exit;
|
51 |
+
}
|
52 |
+
}
|
53 |
+
|
54 |
+
public function welcome_route() {
|
55 |
+
require_once PRLI_VIEWS_PATH . '/admin/onboarding/welcome.php';
|
56 |
+
}
|
57 |
+
|
58 |
+
public function update_route() {
|
59 |
+
require_once PRLI_VIEWS_PATH . '/admin/onboarding/update.php';
|
60 |
+
}
|
61 |
+
}
|
app/controllers/PrliOptionsController.php
CHANGED
@@ -76,7 +76,7 @@ class PrliOptionsController extends PrliBaseController {
|
|
76 |
}
|
77 |
|
78 |
if( !empty($params[ $whitelist_ips ]) && !preg_match( "#^[ \t]*((\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)|([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*))([ \t]*,[ \t]*((\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)|([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*)))*$#", $params[ $whitelist_ips ] ) ) {
|
79 |
-
$errors[] = __('
|
80 |
}
|
81 |
|
82 |
return apply_filters( 'prli-validate-options', $errors, $params );
|
@@ -88,15 +88,15 @@ class PrliOptionsController extends PrliBaseController {
|
|
88 |
extract( $this->opt_fields );
|
89 |
|
90 |
// Read their posted value
|
91 |
-
$prli_options->prli_exclude_ips = stripslashes($params[ $prli_exclude_ips ]);
|
92 |
-
$prli_options->whitelist_ips = stripslashes($params[ $whitelist_ips ]);
|
93 |
$prli_options->filter_robots = (int)isset($params[ $filter_robots ]);
|
94 |
-
$prli_options->extended_tracking = stripslashes($params[ $extended_tracking ]);
|
95 |
$prli_options->link_track_me = (int)isset($params[ $link_track_me ]);
|
96 |
$prli_options->link_prefix = (int)isset($params[ $link_prefix ]);
|
97 |
$prli_options->auto_trim_clicks = (int)isset($params[ $auto_trim_clicks ]);
|
98 |
$prli_options->link_nofollow = (int)isset($params[ $link_nofollow ]);
|
99 |
-
$prli_options->link_redirect_type = $params[ $link_redirect_type ];
|
100 |
|
101 |
do_action('prli-update-options', $params);
|
102 |
}
|
76 |
}
|
77 |
|
78 |
if( !empty($params[ $whitelist_ips ]) && !preg_match( "#^[ \t]*((\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)|([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*))([ \t]*,[ \t]*((\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)\.(\d{1,3}|\*)|([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*):([0-9a-fA-F]{1,4}|\*)))*$#", $params[ $whitelist_ips ] ) ) {
|
79 |
+
$errors[] = __('Whitelist IP Addresses must be a comma separated list of IPv4 or IPv6 addresses or ranges.', 'pretty-link');
|
80 |
}
|
81 |
|
82 |
return apply_filters( 'prli-validate-options', $errors, $params );
|
88 |
extract( $this->opt_fields );
|
89 |
|
90 |
// Read their posted value
|
91 |
+
$prli_options->prli_exclude_ips = isset($params[ $prli_exclude_ips ]) && is_string($params[ $prli_exclude_ips ]) ? sanitize_text_field(stripslashes($params[ $prli_exclude_ips ])) : '';
|
92 |
+
$prli_options->whitelist_ips = isset($params[ $whitelist_ips ]) && is_string($params[ $whitelist_ips ]) ? sanitize_text_field(stripslashes($params[ $whitelist_ips ])) : '';
|
93 |
$prli_options->filter_robots = (int)isset($params[ $filter_robots ]);
|
94 |
+
$prli_options->extended_tracking = isset($params[ $extended_tracking ]) && is_string($params[ $extended_tracking ]) ? sanitize_key(stripslashes($params[ $extended_tracking ])) : 'normal';
|
95 |
$prli_options->link_track_me = (int)isset($params[ $link_track_me ]);
|
96 |
$prli_options->link_prefix = (int)isset($params[ $link_prefix ]);
|
97 |
$prli_options->auto_trim_clicks = (int)isset($params[ $auto_trim_clicks ]);
|
98 |
$prli_options->link_nofollow = (int)isset($params[ $link_nofollow ]);
|
99 |
+
$prli_options->link_redirect_type = isset($params[ $link_redirect_type ]) && is_string($params[ $link_redirect_type ]) ? sanitize_key(stripslashes($params[ $link_redirect_type ])) : '307';
|
100 |
|
101 |
do_action('prli-update-options', $params);
|
102 |
}
|
app/controllers/PrliPopupController.php
CHANGED
@@ -1,29 +1,30 @@
|
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
2 |
|
3 |
class PrliPopupController extends PrliBaseController {
|
4 |
-
public $
|
5 |
-
|
6 |
public function __construct() {
|
7 |
-
$cdn_base = 'https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/';
|
8 |
-
$this->popup_css = "{$cdn_base}/magnific-popup.min.css";
|
9 |
-
$this->popup_js = "{$cdn_base}/jquery.magnific-popup.min.js";
|
10 |
-
|
11 |
// This is an array of the currently defined popups ...
|
12 |
// used to validate that the popup specified actually exists
|
13 |
$this->popups = array(
|
14 |
'rating' => array(
|
15 |
-
'after_usage' =>
|
|
|
|
|
|
|
16 |
'user_popup' => true,
|
17 |
-
'lite_only_popup' =>
|
18 |
-
'delay' =>
|
19 |
-
'delay_after_last_popup' =>
|
20 |
),
|
21 |
'upgrade' => array(
|
22 |
-
'after_usage' =>
|
|
|
|
|
|
|
23 |
'user_popup' => true,
|
24 |
'lite_only_popup' => true,
|
25 |
-
'delay' =>
|
26 |
-
'delay_after_last_popup' =>
|
27 |
),
|
28 |
);
|
29 |
}
|
@@ -41,8 +42,8 @@ class PrliPopupController extends PrliBaseController {
|
|
41 |
}
|
42 |
|
43 |
public function enqueue_admin_scripts($hook) {
|
44 |
-
if(
|
45 |
-
wp_register_style('prli-magnific-popup',
|
46 |
wp_enqueue_style(
|
47 |
'prli-admin-popup',
|
48 |
PRLI_CSS_URL.'/admin_popup.css',
|
@@ -50,7 +51,7 @@ class PrliPopupController extends PrliBaseController {
|
|
50 |
PRLI_VERSION
|
51 |
);
|
52 |
|
53 |
-
wp_register_script('prli-magnific-popup',
|
54 |
wp_enqueue_script(
|
55 |
'prli-admin-popup',
|
56 |
PRLI_JS_URL.'/admin_popup.js',
|
@@ -66,13 +67,16 @@ class PrliPopupController extends PrliBaseController {
|
|
66 |
}
|
67 |
|
68 |
private function on_pretty_link_page() {
|
69 |
-
$
|
70 |
-
return (isset($
|
71 |
}
|
72 |
|
73 |
public function display_popups() {
|
74 |
if(!$this->on_pretty_link_page()) { return; }
|
75 |
|
|
|
|
|
|
|
76 |
// If this isn't a Pretty Link authorized user then bail
|
77 |
if(!PrliUtils::is_authorized()) { return; }
|
78 |
|
@@ -139,7 +143,7 @@ class PrliPopupController extends PrliBaseController {
|
|
139 |
}
|
140 |
|
141 |
private function is_popup_delayed($popup) {
|
142 |
-
if(!$this->is_valid_popup($popup)) {
|
143 |
|
144 |
if($this->popups[$popup]['user_popup']) {
|
145 |
// check if it's been delayed or stopped
|
@@ -151,7 +155,7 @@ class PrliPopupController extends PrliBaseController {
|
|
151 |
}
|
152 |
|
153 |
private function is_popup_stopped($popup) {
|
154 |
-
if(!$this->is_valid_popup($popup)) {
|
155 |
|
156 |
if($this->popups[$popup]['user_popup']) {
|
157 |
$user_id = PrliUtils::get_current_user_id();
|
@@ -188,19 +192,12 @@ class PrliPopupController extends PrliBaseController {
|
|
188 |
return false;
|
189 |
}
|
190 |
|
191 |
-
if($this->popups[$popup]['after_usage']) {
|
|
|
192 |
$click_count = PrliClick::get_count();
|
193 |
-
$first_click_date = PrliClick::get_first_date();
|
194 |
$link_count = PrliLink::get_count();
|
195 |
-
$first_link_date = PrliClick::get_first_date();
|
196 |
-
|
197 |
-
// Make sure user has been using Pretty Link for at least a month
|
198 |
-
$month_ago = time() - MONTH_IN_SECONDS;
|
199 |
|
200 |
-
if( $click_count <
|
201 |
-
($first_click_date!==false && strtotime($first_click_date) > $month_ago) ||
|
202 |
-
$link_count < 3 ||
|
203 |
-
strtotime($first_link_date) > $month_ago ) {
|
204 |
return false;
|
205 |
}
|
206 |
}
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
2 |
|
3 |
class PrliPopupController extends PrliBaseController {
|
4 |
+
public $popups;
|
|
|
5 |
public function __construct() {
|
|
|
|
|
|
|
|
|
6 |
// This is an array of the currently defined popups ...
|
7 |
// used to validate that the popup specified actually exists
|
8 |
$this->popups = array(
|
9 |
'rating' => array(
|
10 |
+
'after_usage' => array(
|
11 |
+
'links' => 1,
|
12 |
+
'clicks' => 5
|
13 |
+
),
|
14 |
'user_popup' => true,
|
15 |
+
'lite_only_popup' => false,
|
16 |
+
'delay' => WEEK_IN_SECONDS,
|
17 |
+
'delay_after_last_popup' => DAY_IN_SECONDS,
|
18 |
),
|
19 |
'upgrade' => array(
|
20 |
+
'after_usage' => array(
|
21 |
+
'links' => 3,
|
22 |
+
'clicks' => 5
|
23 |
+
),
|
24 |
'user_popup' => true,
|
25 |
'lite_only_popup' => true,
|
26 |
+
'delay' => 2*WEEK_IN_SECONDS,
|
27 |
+
'delay_after_last_popup' => DAY_IN_SECONDS,
|
28 |
),
|
29 |
);
|
30 |
}
|
42 |
}
|
43 |
|
44 |
public function enqueue_admin_scripts($hook) {
|
45 |
+
if($this->on_pretty_link_page()) {
|
46 |
+
wp_register_style('prli-magnific-popup', PRLI_VENDOR_LIB_URL . '/magnific-popup/magnific-popup.min.css', array(), '1.1.0');
|
47 |
wp_enqueue_style(
|
48 |
'prli-admin-popup',
|
49 |
PRLI_CSS_URL.'/admin_popup.css',
|
51 |
PRLI_VERSION
|
52 |
);
|
53 |
|
54 |
+
wp_register_script('prli-magnific-popup', PRLI_VENDOR_LIB_URL . '/magnific-popup/jquery.magnific-popup.min.js', array('jquery'), '1.1.0', true);
|
55 |
wp_enqueue_script(
|
56 |
'prli-admin-popup',
|
57 |
PRLI_JS_URL.'/admin_popup.js',
|
67 |
}
|
68 |
|
69 |
private function on_pretty_link_page() {
|
70 |
+
global $current_screen;
|
71 |
+
return (isset($current_screen->id) && strpos($current_screen->id,'pretty-link') !== false);
|
72 |
}
|
73 |
|
74 |
public function display_popups() {
|
75 |
if(!$this->on_pretty_link_page()) { return; }
|
76 |
|
77 |
+
// Bail on update/welcome page
|
78 |
+
if (isset($_GET['page']) && ($_GET['page'] == 'pretty-link-welcome' || $_GET['page'] == 'pretty-link-update')) { return;}
|
79 |
+
|
80 |
// If this isn't a Pretty Link authorized user then bail
|
81 |
if(!PrliUtils::is_authorized()) { return; }
|
82 |
|
143 |
}
|
144 |
|
145 |
private function is_popup_delayed($popup) {
|
146 |
+
if(!$this->is_valid_popup($popup)) { return; }
|
147 |
|
148 |
if($this->popups[$popup]['user_popup']) {
|
149 |
// check if it's been delayed or stopped
|
155 |
}
|
156 |
|
157 |
private function is_popup_stopped($popup) {
|
158 |
+
if(!$this->is_valid_popup($popup)) { return; }
|
159 |
|
160 |
if($this->popups[$popup]['user_popup']) {
|
161 |
$user_id = PrliUtils::get_current_user_id();
|
192 |
return false;
|
193 |
}
|
194 |
|
195 |
+
if(false !== $this->popups[$popup]['after_usage']) {
|
196 |
+
$usage = $this->popups[$popup]['after_usage'];
|
197 |
$click_count = PrliClick::get_count();
|
|
|
198 |
$link_count = PrliLink::get_count();
|
|
|
|
|
|
|
|
|
199 |
|
200 |
+
if( $click_count < $usage['clicks'] || $link_count < $usage['links'] ) {
|
|
|
|
|
|
|
201 |
return false;
|
202 |
}
|
203 |
}
|
app/controllers/PrliPostsController.php
CHANGED
@@ -58,6 +58,46 @@ class PrliPostsController extends PrliBaseController {
|
|
58 |
}
|
59 |
}
|
60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
require(PRLI_VIEWS_PATH.'/shared/tinymce_form_popup.php');
|
62 |
die();
|
63 |
}
|
@@ -69,10 +109,10 @@ class PrliPostsController extends PrliBaseController {
|
|
69 |
die();
|
70 |
}
|
71 |
|
72 |
-
$slug =
|
73 |
|
74 |
//Can't end in a slash
|
75 |
-
if(substr($slug, -1) == '/' || $slug[0] == '/' || preg_match('/\s/', $slug) ||
|
76 |
echo "false";
|
77 |
die();
|
78 |
}
|
@@ -97,14 +137,14 @@ class PrliPostsController extends PrliBaseController {
|
|
97 |
|
98 |
//Using the local API Yo
|
99 |
$id = prli_create_pretty_link(
|
100 |
-
stripslashes($_POST['target']),
|
101 |
-
stripslashes($_POST['slug']),
|
102 |
'', //Name
|
103 |
'', //Desc
|
104 |
0, //Group ID
|
105 |
(int)($_POST['tracking'] == 'enabled'),
|
106 |
(int)($_POST['nofollow'] == 'enabled'),
|
107 |
-
$_POST['redirect']
|
108 |
);
|
109 |
|
110 |
if((int)$id > 0) {
|
@@ -123,8 +163,8 @@ class PrliPostsController extends PrliBaseController {
|
|
123 |
if(!isset($_GET['term']) || empty($_GET['term'])) { die(''); }
|
124 |
|
125 |
$return = array();
|
126 |
-
$term = '%' .
|
127 |
-
$q = "SELECT * FROM {$prli_link->table_name} WHERE slug LIKE %s OR name LIKE %s OR url LIKE %s LIMIT 20";
|
128 |
$q = $wpdb->prepare($q, $term, $term, $term);
|
129 |
$results = $wpdb->get_results($q, ARRAY_A);
|
130 |
|
@@ -140,13 +180,16 @@ class PrliPostsController extends PrliBaseController {
|
|
140 |
$alt_name = (strlen($result['name']) > 55)?substr($result['name'], 0, 55).'...':$result['name'];
|
141 |
}
|
142 |
|
|
|
|
|
143 |
$return[] = array(
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
|
|
150 |
}
|
151 |
|
152 |
die(json_encode($return));
|
58 |
}
|
59 |
}
|
60 |
|
61 |
+
wp_register_style('prli-ui-smoothness', PRLI_VENDOR_LIB_URL.'/jquery-ui/jquery-ui.min.css', array(), '1.11.4');
|
62 |
+
wp_register_style('prli-tinymce-popup-form', PRLI_CSS_URL . '/tinymce_form_popup.css', array('prli-ui-smoothness'), PRLI_VERSION);
|
63 |
+
|
64 |
+
$css = sprintf('.ui-autocomplete-loading {
|
65 |
+
background: white url(%s) right center no-repeat;
|
66 |
+
}
|
67 |
+
.ui-autocomplete {
|
68 |
+
max-height: 200px;
|
69 |
+
overflow-y: auto;
|
70 |
+
overflow-x: hidden;
|
71 |
+
width: 510px !important;
|
72 |
+
}', esc_url(admin_url('images/wpspin_light.gif')));
|
73 |
+
|
74 |
+
wp_add_inline_style('prli-tinymce-popup-form', $css);
|
75 |
+
|
76 |
+
wp_register_script(
|
77 |
+
'prli-tinymce-popup-form',
|
78 |
+
PRLI_JS_URL . '/tinymce_form_popup.js',
|
79 |
+
array(
|
80 |
+
'jquery',
|
81 |
+
'jquery-ui-core',
|
82 |
+
'jquery-ui-widget',
|
83 |
+
'jquery-ui-position',
|
84 |
+
'jquery-ui-menu',
|
85 |
+
'jquery-ui-autocomplete',
|
86 |
+
'jquery-ui-accordion'
|
87 |
+
),
|
88 |
+
PRLI_VERSION,
|
89 |
+
true
|
90 |
+
);
|
91 |
+
|
92 |
+
wp_localize_script('prli-tinymce-popup-form', 'prliTinymceL10n', array(
|
93 |
+
'prli_selected_text' => '',
|
94 |
+
'home_url' => $home_url,
|
95 |
+
'default_redirect' => $default_redirect,
|
96 |
+
'default_nofollow' => $default_nofollow,
|
97 |
+
'default_tracking' => $default_tracking,
|
98 |
+
'ajaxurl' => admin_url('admin-ajax.php')
|
99 |
+
));
|
100 |
+
|
101 |
require(PRLI_VIEWS_PATH.'/shared/tinymce_form_popup.php');
|
102 |
die();
|
103 |
}
|
109 |
die();
|
110 |
}
|
111 |
|
112 |
+
$slug = sanitize_text_field(stripslashes($_POST['slug']));
|
113 |
|
114 |
//Can't end in a slash
|
115 |
+
if(substr($slug, -1) == '/' || $slug[0] == '/' || preg_match('/\s/', $slug) || is_wp_error(PrliUtils::is_slug_available($slug))) {
|
116 |
echo "false";
|
117 |
die();
|
118 |
}
|
137 |
|
138 |
//Using the local API Yo
|
139 |
$id = prli_create_pretty_link(
|
140 |
+
esc_url_raw(trim(stripslashes($_POST['target']))),
|
141 |
+
sanitize_text_field(stripslashes($_POST['slug'])),
|
142 |
'', //Name
|
143 |
'', //Desc
|
144 |
0, //Group ID
|
145 |
(int)($_POST['tracking'] == 'enabled'),
|
146 |
(int)($_POST['nofollow'] == 'enabled'),
|
147 |
+
sanitize_key(stripslashes($_POST['redirect']))
|
148 |
);
|
149 |
|
150 |
if((int)$id > 0) {
|
163 |
if(!isset($_GET['term']) || empty($_GET['term'])) { die(''); }
|
164 |
|
165 |
$return = array();
|
166 |
+
$term = '%' . $wpdb->esc_like(sanitize_text_field(stripslashes($_GET['term']))) . '%';
|
167 |
+
$q = "SELECT * FROM {$prli_link->table_name} WHERE link_status='enabled' AND (slug LIKE %s OR name LIKE %s OR url LIKE %s) LIMIT 20";
|
168 |
$q = $wpdb->prepare($q, $term, $term, $term);
|
169 |
$results = $wpdb->get_results($q, ARRAY_A);
|
170 |
|
180 |
$alt_name = (strlen($result['name']) > 55)?substr($result['name'], 0, 55).'...':$result['name'];
|
181 |
}
|
182 |
|
183 |
+
$pretty_link = prli_get_pretty_link_url($result['id']);
|
184 |
+
|
185 |
$return[] = array(
|
186 |
+
'pretty_url' => (empty($pretty_link) ? home_url() : $pretty_link),
|
187 |
+
'value' => (empty($result['name']))?$result['slug']:$alt_name,
|
188 |
+
'slug' => $result['slug'],
|
189 |
+
'target' => $result['url'],
|
190 |
+
'title' => $result['name'], //Not used currently, but we may want this at some point
|
191 |
+
'nofollow' => (int)$result['nofollow']
|
192 |
+
);
|
193 |
}
|
194 |
|
195 |
die(json_encode($return));
|
app/controllers/PrliReportsController.php
CHANGED
@@ -31,7 +31,7 @@ class PrliReportsController extends PrliBaseController {
|
|
31 |
|
32 |
$link_id = $params['l'];
|
33 |
$type = $params['type'];
|
34 |
-
$group =
|
35 |
$show_chart = (!isset($_GET['ip']) and !isset($_GET['vuid']));
|
36 |
|
37 |
return array(
|
31 |
|
32 |
$link_id = $params['l'];
|
33 |
$type = $params['type'];
|
34 |
+
$group = '';
|
35 |
$show_chart = (!isset($_GET['ip']) and !isset($_GET['vuid']));
|
36 |
|
37 |
return array(
|
app/controllers/PrliToolsController.php
CHANGED
@@ -45,13 +45,18 @@ class PrliToolsController extends PrliBaseController {
|
|
45 |
public static function bookmark($target_url) {
|
46 |
global $prli_options, $prli_blogurl, $prli_link, $plp_update;
|
47 |
|
48 |
-
$redirect_type =
|
49 |
-
$track =
|
50 |
-
$
|
51 |
|
52 |
-
$result = prli_create_pretty_link( esc_url_raw($target_url, array('http','https')), '', '', '',
|
53 |
|
54 |
$plink = $prli_link->getOne($result);
|
|
|
|
|
|
|
|
|
|
|
55 |
$target_url = $plink->url;
|
56 |
$target_url_title = $plink->name;
|
57 |
$pretty_link = $prli_blogurl . PrliUtils::get_permalink_pre_slug_uri() . $plink->slug;
|
45 |
public static function bookmark($target_url) {
|
46 |
global $prli_options, $prli_blogurl, $prli_link, $plp_update;
|
47 |
|
48 |
+
$redirect_type = isset($_GET['rt']) && is_string($_GET['rt']) && $_GET['rt'] != '-1' ? sanitize_key(stripslashes($_GET['rt'])) : '';
|
49 |
+
$track = isset($_GET['trk']) && is_numeric($_GET['trk']) && $_GET['trk'] != '-1' ? (int) $_GET['trk'] : '';
|
50 |
+
$category = isset($_GET['ct']) && is_numeric($_GET['ct']) && $_GET['ct'] != '-1' ? (int) $_GET['ct'] : '';
|
51 |
|
52 |
+
$result = prli_create_pretty_link( esc_url_raw($target_url, array('http','https')), '', '', '', 0, $track, '', $redirect_type );
|
53 |
|
54 |
$plink = $prli_link->getOne($result);
|
55 |
+
|
56 |
+
if ($plp_update->is_installed() && $category) {
|
57 |
+
wp_set_object_terms($plink->link_cpt_id, $category, PlpLinkCategoriesController::$ctax);
|
58 |
+
}
|
59 |
+
|
60 |
$target_url = $plink->url;
|
61 |
$target_url_title = $plink->name;
|
62 |
$pretty_link = $prli_blogurl . PrliUtils::get_permalink_pre_slug_uri() . $plink->slug;
|
app/controllers/PrliUpdateController.php
CHANGED
@@ -69,7 +69,7 @@ class PrliUpdateController {
|
|
69 |
|
70 |
public function process_form() {
|
71 |
if(!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'],'activation_form')) {
|
72 |
-
wp_die(
|
73 |
}
|
74 |
|
75 |
if(!isset($_POST[$this->mothership_license_str])) {
|
@@ -172,12 +172,11 @@ class PrliUpdateController {
|
|
172 |
$this->set_edge_updates(false);
|
173 |
|
174 |
$message = $act['message'];
|
175 |
-
$callback =
|
176 |
-
'require(PRLI_VIEWS_PATH."/admin/errors.php");' );
|
177 |
}
|
178 |
catch(Exception $e) {
|
179 |
-
$
|
180 |
-
|
181 |
}
|
182 |
|
183 |
add_action( 'admin_notices', $callback );
|
@@ -303,7 +302,7 @@ class PrliUpdateController {
|
|
303 |
|
304 |
public function queue_button() {
|
305 |
?>
|
306 |
-
<a href="<?php echo admin_url('admin.php?page=pretty-link-options&action=queue&_wpnonce=' . wp_create_nonce('PrliUpdateController::manually_queue_update')); ?>" class="button"><?php
|
307 |
<?php
|
308 |
}
|
309 |
|
@@ -392,7 +391,7 @@ class PrliUpdateController {
|
|
392 |
}
|
393 |
|
394 |
public function enqueue_scripts($hook) {
|
395 |
-
if(
|
396 |
wp_register_style('prli-settings-table', PRLI_CSS_URL.'/settings_table.css', array(), PRLI_VERSION);
|
397 |
wp_enqueue_style('prli-activate-css', PRLI_CSS_URL.'/admin-activate.css', array('prli-settings-table'), PRLI_VERSION);
|
398 |
|
69 |
|
70 |
public function process_form() {
|
71 |
if(!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'],'activation_form')) {
|
72 |
+
wp_die(__('Why you creepin\'?', 'pretty-link'));
|
73 |
}
|
74 |
|
75 |
if(!isset($_POST[$this->mothership_license_str])) {
|
172 |
$this->set_edge_updates(false);
|
173 |
|
174 |
$message = $act['message'];
|
175 |
+
$callback = function() use ($message) { require(PRLI_VIEWS_PATH."/admin/errors.php"); };
|
|
|
176 |
}
|
177 |
catch(Exception $e) {
|
178 |
+
$error = $e->getMessage();
|
179 |
+
$callback = function() use ($error) { require(PRLI_VIEWS_PATH."/admin/update/activation_warning.php"); };
|
180 |
}
|
181 |
|
182 |
add_action( 'admin_notices', $callback );
|
302 |
|
303 |
public function queue_button() {
|
304 |
?>
|
305 |
+
<a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-options&action=queue&_wpnonce=' . wp_create_nonce('PrliUpdateController::manually_queue_update'))); ?>" class="button"><?php esc_html_e('Check for Update', 'pretty-link')?></a>
|
306 |
<?php
|
307 |
}
|
308 |
|
391 |
}
|
392 |
|
393 |
public function enqueue_scripts($hook) {
|
394 |
+
if(preg_match('/_page_pretty-link-updates$/', $hook)) {
|
395 |
wp_register_style('prli-settings-table', PRLI_CSS_URL.'/settings_table.css', array(), PRLI_VERSION);
|
396 |
wp_enqueue_style('prli-activate-css', PRLI_CSS_URL.'/admin-activate.css', array('prli-settings-table'), PRLI_VERSION);
|
397 |
|
app/helpers/PrliAppHelper.php
CHANGED
@@ -7,7 +7,7 @@ class PrliAppHelper {
|
|
7 |
|
8 |
public static function info_tooltip($id, $title, $info) {
|
9 |
?>
|
10 |
-
<span id="prli-tooltip-<?php echo $id; ?>" class="prli-tooltip">
|
11 |
<span><i class="pl-icon pl-icon-info-circled pl-16"></i></span>
|
12 |
<span class="prli-data-title prli-hidden"><?php echo $title; ?></span>
|
13 |
<span class="prli-data-info prli-hidden"><?php echo $info; ?></span>
|
@@ -15,27 +15,17 @@ class PrliAppHelper {
|
|
15 |
<?php
|
16 |
}
|
17 |
|
18 |
-
public static function
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
<?php if( $include_blank ): ?>
|
23 |
-
<option value=""><?php _e('None', 'pretty-link'); ?></option>
|
24 |
-
<?php endif; ?>
|
25 |
-
|
26 |
-
<?php
|
27 |
-
$groups = prli_get_all_groups();
|
28 |
-
if(is_array($groups)) {
|
29 |
-
foreach($groups as $group) {
|
30 |
-
?>
|
31 |
-
<option value="<?php echo $group['id']; ?>" <?php selected($value, $group['id']); ?>><?php echo $group['name']; ?></option>
|
32 |
-
<?php
|
33 |
-
}
|
34 |
-
}
|
35 |
-
?>
|
36 |
|
37 |
-
|
38 |
-
|
|
|
|
|
|
|
|
|
39 |
}
|
40 |
}
|
41 |
|
7 |
|
8 |
public static function info_tooltip($id, $title, $info) {
|
9 |
?>
|
10 |
+
<span id="prli-tooltip-<?php echo esc_attr($id); ?>" class="prli-tooltip">
|
11 |
<span><i class="pl-icon pl-icon-info-circled pl-16"></i></span>
|
12 |
<span class="prli-data-title prli-hidden"><?php echo $title; ?></span>
|
13 |
<span class="prli-data-info prli-hidden"><?php echo $info; ?></span>
|
15 |
<?php
|
16 |
}
|
17 |
|
18 |
+
public static function pro_only_feature_indicator($feature='', $label=null, $title=null) {
|
19 |
+
$feature = esc_url_raw( empty($feature) ? '' : "?{$feature}" );
|
20 |
+
$label = esc_html( is_null($label) ? __('Pro', 'pretty-link') : $label );
|
21 |
+
$title = esc_attr( is_null($title) ? __('Upgrade to Pro to unlock this feature', 'pretty-link') : $title );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
+
return sprintf(
|
24 |
+
'<span class="prli-pro-only-indicator" title="%1$s"><a href="https://prettylinks.com/pl/pro-feature-indicator/upgrade%2$s">%3$s</a></span>',
|
25 |
+
$title,
|
26 |
+
$feature,
|
27 |
+
$label
|
28 |
+
);
|
29 |
}
|
30 |
}
|
31 |
|
app/helpers/PrliClicksHelper.php
CHANGED
@@ -16,7 +16,7 @@ class PrliClicksHelper {
|
|
16 |
|
17 |
// Insert search string
|
18 |
if(!empty($search_str)) {
|
19 |
-
$search_params = explode(' ',
|
20 |
|
21 |
$first_pass = true;
|
22 |
foreach($search_params as $search_param) {
|
16 |
|
17 |
// Insert search string
|
18 |
if(!empty($search_str)) {
|
19 |
+
$search_params = explode(' ', $search_str);
|
20 |
|
21 |
$first_pass = true;
|
22 |
foreach($search_params as $search_param) {
|
app/helpers/PrliLinksHelper.php
CHANGED
@@ -2,106 +2,58 @@
|
|
2 |
|
3 |
class PrliLinksHelper {
|
4 |
|
5 |
-
public static function groups_dropdown($fieldname, $value='', $extra_options=array(), $classes='') {
|
6 |
-
global $prli_group;
|
7 |
-
$groups = $prli_group->getAll();
|
8 |
-
|
9 |
-
$idname = preg_match('#^.*\[(.*?)\]$#',$fieldname,$matches)?$matches[1]:$fieldname;
|
10 |
-
|
11 |
-
?>
|
12 |
-
<select id="<?php echo esc_html($idname); ?>" name="<?php echo esc_html($fieldname); ?>" class="<?php echo $classes; ?>">
|
13 |
-
<?php if( empty($extra_options) ): ?>
|
14 |
-
<option><?php _e('None', 'pretty-link'); ?> </option>
|
15 |
-
<?php else:
|
16 |
-
foreach($extra_options as $exoptkey => $exoptval): ?>
|
17 |
-
<option value="<?php echo $exoptval; ?>"><?php echo $exoptkey; ?> </option>
|
18 |
-
<?php endforeach;
|
19 |
-
endif; ?>
|
20 |
-
<?php foreach($groups as $group): ?>
|
21 |
-
<?php $selected = ($value==$group->id)?' selected="selected"':''; ?>
|
22 |
-
<option value="<?php echo $group->id; ?>"<?php echo $selected; ?>><?php echo $group->name; ?> </option>
|
23 |
-
<?php endforeach; ?>
|
24 |
-
</select>
|
25 |
-
<?php
|
26 |
-
}
|
27 |
-
|
28 |
public static function redirect_type_dropdown($fieldname, $value='', $extra_options=array(), $classes='') {
|
29 |
$idname = preg_match('#^.*\[(.*?)\]$#',$fieldname,$matches)?$matches[1]:$fieldname;
|
30 |
?>
|
31 |
-
<select id="<?php echo $idname; ?>" name="<?php echo $fieldname; ?>" class="<?php echo $classes; ?>">
|
32 |
<?php if( !empty($extra_options) ): ?>
|
33 |
<?php foreach( $extra_options as $exoptkey => $exoptval ): ?>
|
34 |
-
<option value="<?php echo $exoptval; ?>"><?php echo $exoptkey; ?> </option>
|
35 |
<?php endforeach; ?>
|
36 |
<?php endif; ?>
|
37 |
-
<option value="307" <?php selected((int)$value,(int)307); ?>><?php
|
38 |
-
<option value="302" <?php selected((int)$value,(int)302); ?>><?php
|
39 |
-
<option value="301" <?php selected((int)$value,(int)301); ?>><?php
|
40 |
<?php do_action('prli_redirection_types', array(), $value); ?>
|
41 |
</select>
|
42 |
<?php
|
43 |
}
|
44 |
|
45 |
-
public static function bulk_action_dropdown() {
|
46 |
-
?>
|
47 |
-
<div class="prli_bulk_action_dropdown">
|
48 |
-
<select class="prli_bulk_action">
|
49 |
-
<option value="-1"><?php _e('Bulk Actions', 'pretty-link'); ?> </option>
|
50 |
-
<option value="edit"><?php _e('Edit', 'pretty-link'); ?> </option>
|
51 |
-
<option value="delete"><?php _e('Delete', 'pretty-link'); ?> </option>
|
52 |
-
</select>
|
53 |
-
<a href="javascript:" class="prli_bulk_action_apply button button-primary" data-confmsg="<?php _e('Are you sure you want to delete the selected links?', 'pretty-link'); ?>" data-url="<?php echo admin_url('admin.php'); ?>" data-wpnonce="<?php echo wp_create_nonce('prli_bulk_update'); ?>" style="display:inline-block;margin:0;"><?php _e('Apply', 'pretty-link'); ?></a>
|
54 |
-
</div>
|
55 |
-
<?php
|
56 |
-
}
|
57 |
-
|
58 |
-
public static function bulk_action_checkbox_dropdown($input_name, $input_title, $classes='') {
|
59 |
-
$idname = preg_match('#^.*\[(.*?)\]$#',$input_name,$matches)?$matches[1]:$input_name;
|
60 |
-
?>
|
61 |
-
<div class="bacheck-title"><?php echo $input_title; ?></div>
|
62 |
-
<select name="<?php echo $input_name; ?>" class="<?php echo $classes; ?>" id="<?php echo $idname; ?>">
|
63 |
-
<option value="##nochange##"><?php _e('- No Change -', 'pretty-link'); ?> </option>
|
64 |
-
<option value="off"><?php _e('Off', 'pretty-link'); ?> </option>
|
65 |
-
<option value="on"><?php _e('On', 'pretty-link'); ?> </option>
|
66 |
-
</select>
|
67 |
-
<?php
|
68 |
-
}
|
69 |
-
|
70 |
public static function link_list_icons($link) {
|
71 |
do_action('prli_list_icon',$link->id);
|
72 |
|
73 |
switch( $link->redirect_type ):
|
74 |
case 'prettybar': ?>
|
75 |
-
<i title="<?php
|
76 |
break;
|
77 |
case 'cloak': ?>
|
78 |
-
<i title="<?php
|
79 |
break;
|
80 |
case 'pixel': ?>
|
81 |
-
<i title="<?php
|
82 |
break;
|
83 |
case 'metarefresh': ?>
|
84 |
-
<i title="<?php
|
85 |
break;
|
86 |
case 'javascript': ?>
|
87 |
-
<i title="<?php
|
88 |
break;
|
89 |
case '307': ?>
|
90 |
-
<i title="<?php
|
91 |
break;
|
92 |
case '302': /* Using 307 Icon for now */ ?>
|
93 |
-
<i title="<?php
|
94 |
break;
|
95 |
case '301': ?>
|
96 |
-
<i title="<?php
|
97 |
endswitch;
|
98 |
|
99 |
if( $link->nofollow ): ?>
|
100 |
-
<i title="<?php
|
101 |
endif;
|
102 |
|
103 |
if(!empty($link->param_forwarding) && $link->param_forwarding != 'off'): ?>
|
104 |
-
<i title="<?php
|
105 |
endif;
|
106 |
|
107 |
do_action('prli_list_end_icon',$link);
|
@@ -112,27 +64,134 @@ class PrliLinksHelper {
|
|
112 |
|
113 |
$link_nonce = wp_create_nonce( 'link-actions' );
|
114 |
?>
|
115 |
-
<a href="<?php echo admin_url('admin.php?page=pretty-link&action=edit&id=' . $link->id); ?>" title="<?php
|
116 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link&action=destroy&id={$link->id}&_wpnonce={$link_nonce}"); ?>" onclick="return confirm('<?php
|
117 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link&action=reset&id={$link->id}&_wpnonce={$link_nonce}"); ?>" onclick="return confirm('<?php
|
118 |
<?php
|
119 |
if( $link->track_me and $prli_options->extended_tracking!='count' ):
|
120 |
-
?><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&l={$link->id}"); ?>" title="<?php
|
121 |
do_action('prli-link-action',$link->id);
|
122 |
endif;
|
123 |
|
124 |
if( $link->redirect_type != 'pixel' ):
|
125 |
-
?><a href="
|
126 |
-
<a href="mailto:?subject=Pretty Link&body
|
127 |
endif;
|
128 |
?>
|
129 |
|
130 |
<?php if( $link->redirect_type != 'pixel' ): ?>
|
131 |
-
<a href="<?php echo $link->url; ?>" target="_blank" title="<?php
|
132 |
-
<a href="<?php echo $pretty_link_url; ?>" target="_blank" title="<?php
|
133 |
endif;
|
134 |
|
135 |
do_action('prli-special-link-action',$link->id);
|
136 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
}
|
138 |
|
2 |
|
3 |
class PrliLinksHelper {
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
public static function redirect_type_dropdown($fieldname, $value='', $extra_options=array(), $classes='') {
|
6 |
$idname = preg_match('#^.*\[(.*?)\]$#',$fieldname,$matches)?$matches[1]:$fieldname;
|
7 |
?>
|
8 |
+
<select id="<?php echo esc_attr($idname); ?>" name="<?php echo esc_attr($fieldname); ?>" class="<?php echo esc_attr($classes); ?>">
|
9 |
<?php if( !empty($extra_options) ): ?>
|
10 |
<?php foreach( $extra_options as $exoptkey => $exoptval ): ?>
|
11 |
+
<option value="<?php echo esc_attr($exoptval); ?>"><?php echo esc_html($exoptkey); ?> </option>
|
12 |
<?php endforeach; ?>
|
13 |
<?php endif; ?>
|
14 |
+
<option value="307" <?php selected((int)$value,(int)307); ?>><?php esc_html_e('307 (Temporary)', 'pretty-link') ?> </option>
|
15 |
+
<option value="302" <?php selected((int)$value,(int)302); ?>><?php esc_html_e('302 (Temporary)', 'pretty-link') ?> </option>
|
16 |
+
<option value="301" <?php selected((int)$value,(int)301); ?>><?php esc_html_e('301 (Permanent)', 'pretty-link') ?> </option>
|
17 |
<?php do_action('prli_redirection_types', array(), $value); ?>
|
18 |
</select>
|
19 |
<?php
|
20 |
}
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
public static function link_list_icons($link) {
|
23 |
do_action('prli_list_icon',$link->id);
|
24 |
|
25 |
switch( $link->redirect_type ):
|
26 |
case 'prettybar': ?>
|
27 |
+
<i title="<?php esc_attr_e('PrettyBar Redirection', 'pretty-link'); ?>" class="pl-icon-star pl-list-icon"></i><?php
|
28 |
break;
|
29 |
case 'cloak': ?>
|
30 |
+
<i title="<?php esc_attr_e('Cloaked Redirection', 'pretty-link'); ?>" class="pl-icon-cloak pl-list-icon"></i><?php
|
31 |
break;
|
32 |
case 'pixel': ?>
|
33 |
+
<i title="<?php esc_attr_e('Pixel Tracking Redirection', 'pretty-link'); ?>" class="pl-icon-eye-off pl-list-icon"></i><?php
|
34 |
break;
|
35 |
case 'metarefresh': ?>
|
36 |
+
<i title="<?php esc_attr_e('Meta Refresh Redirection', 'pretty-link'); ?>" class="pl-icon-cw pl-list-icon"></i><?php
|
37 |
break;
|
38 |
case 'javascript': ?>
|
39 |
+
<i title="<?php esc_attr_e('Javascript Redirection', 'pretty-link'); ?>" class="pl-icon-code pl-list-icon"></i><?php
|
40 |
break;
|
41 |
case '307': ?>
|
42 |
+
<i title="<?php esc_attr_e('Temporary (307) Redirection', 'pretty-link'); ?>" class="pl-icon-307 pl-list-icon"></i><?php
|
43 |
break;
|
44 |
case '302': /* Using 307 Icon for now */ ?>
|
45 |
+
<i title="<?php esc_attr_e('Temporary (302) Redirection', 'pretty-link'); ?>" class="pl-icon-307 pl-list-icon"></i><?php
|
46 |
break;
|
47 |
case '301': ?>
|
48 |
+
<i title="<?php esc_attr_e('Permanent (301) Redirection', 'pretty-link'); ?>" class="pl-icon-301 pl-list-icon"></i><?php
|
49 |
endswitch;
|
50 |
|
51 |
if( $link->nofollow ): ?>
|
52 |
+
<i title="<?php esc_attr_e('Nofollow Enabled', 'pretty-link'); ?>" class="pl-icon-cancel-circled pl-list-icon"></i><?php
|
53 |
endif;
|
54 |
|
55 |
if(!empty($link->param_forwarding) && $link->param_forwarding != 'off'): ?>
|
56 |
+
<i title="<?php esc_attr_e('Parameter Forwarding Enabled', 'pretty-link'); ?>" class="pl-icon-forward pl-list-icon"></i><?php
|
57 |
endif;
|
58 |
|
59 |
do_action('prli_list_end_icon',$link);
|
64 |
|
65 |
$link_nonce = wp_create_nonce( 'link-actions' );
|
66 |
?>
|
67 |
+
<a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link&action=edit&id=' . $link->id)); ?>" title="<?php echo esc_html(sprintf(__('Edit %s', 'pretty-link'), $link->slug)); ?>"><i class="pl-list-icon pl-icon-edit"></i></a>
|
68 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link&action=destroy&id={$link->id}&_wpnonce={$link_nonce}")); ?>" onclick="return confirm('<?php echo esc_attr(sprintf(__('Are you sure you want to delete your %s Pretty Link? This will delete the Pretty Link and all of the statistical data about it in your database.', 'pretty-link'), $link->name)); ?>');" title="<?php echo esc_attr(sprintf(__('Delete %s', 'pretty-link'), $link->slug)); ?>"><i class="pl-list-icon pl-icon-cancel"></i></a>
|
69 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link&action=reset&id={$link->id}&_wpnonce={$link_nonce}")); ?>" onclick="return confirm('<?php echo esc_attr(sprintf(__('Are you sure you want to reset your %s Pretty Link? This will delete all of the statistical data about this Pretty Link in your database.', 'pretty-link'), $link->name)); ?>');" title="<?php echo esc_attr(sprintf(__('Reset %s', 'pretty-link'), $link->name)); ?>"><i class="pl-list-icon pl-icon-reply"></i></a>
|
70 |
<?php
|
71 |
if( $link->track_me and $prli_options->extended_tracking!='count' ):
|
72 |
+
?><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&l={$link->id}")); ?>" title="<?php echo esc_attr(sprintf(__('View clicks for %s', 'pretty-link'), $link->slug)); ?>"><i class="pl-list-icon pl-icon-chart-line"></i></a><?php
|
73 |
do_action('prli-link-action',$link->id);
|
74 |
endif;
|
75 |
|
76 |
if( $link->redirect_type != 'pixel' ):
|
77 |
+
?><a href="<?php echo esc_url('https://twitter.com/intent/tweet?url=' . urlencode($pretty_link_url)); ?>" target="_blank" title="<?php echo esc_attr(sprintf(__('Post %s to Twitter', 'pretty-link'), $pretty_link_url)); ?>"><i class="pl-list-icon pl-icon-twitter"></i></a>
|
78 |
+
<a href="<?php echo esc_url('mailto:?subject=Pretty Link&body=' . urlencode($pretty_link_url)); ?>" target="_blank" title="<?php echo esc_attr(sprintf(__('Send %s in an Email', 'pretty-link'), $pretty_link_url)); ?>"><i class="pl-list-icon pl-icon-mail"></i></a><?php
|
79 |
endif;
|
80 |
?>
|
81 |
|
82 |
<?php if( $link->redirect_type != 'pixel' ): ?>
|
83 |
+
<a href="<?php echo esc_url($link->url); ?>" target="_blank" title="<?php echo esc_attr(sprintf(__('Visit Target URL: %s in a New Window', 'pretty-link'), $link->url)); ?>"><i class="pl-icon-link-ext pl-list-icon"></i></a>
|
84 |
+
<a href="<?php echo esc_url($pretty_link_url); ?>" target="_blank" title="<?php echo esc_attr(sprintf( __('Visit Short URL: %s in a New Window', 'pretty-link'), $pretty_link_url)); ?>"><i class="pl-icon-link-ext pl-list-icon"></i></a><?php
|
85 |
endif;
|
86 |
|
87 |
do_action('prli-special-link-action',$link->id);
|
88 |
}
|
89 |
+
|
90 |
+
public static function link_list_clicks($link) {
|
91 |
+
global $prli_options;
|
92 |
+
|
93 |
+
if($link->track_me) {
|
94 |
+
$clicks = ( empty($link->clicks) ? 0 : $link->clicks );
|
95 |
+
$uniques = ( empty($link->uniques) ? 0 : $link->uniques );
|
96 |
+
$click_str = "{$clicks}/{$uniques}";
|
97 |
+
|
98 |
+
if($prli_options->extended_tracking !== 'count') {
|
99 |
+
?>
|
100 |
+
<a href="<?php echo esc_url(admin_url( "admin.php?page=pretty-link-clicks&l={$link->id}" )); ?>"
|
101 |
+
id="link_clicks_<?php echo esc_attr($link->id); ?>"
|
102 |
+
title="<?php echo esc_attr(sprintf(__('%d Clicks / %d Uniques', 'pretty-link'), $clicks, $uniques)); ?>"><?php echo esc_html($click_str); ?></a>
|
103 |
+
<?php
|
104 |
+
}
|
105 |
+
else {
|
106 |
+
echo esc_html($click_str);
|
107 |
+
}
|
108 |
+
}
|
109 |
+
else {
|
110 |
+
?>
|
111 |
+
<img src="<?php echo PRLI_IMAGES_URL.'/not_tracking.png'; ?>" title="<?php esc_attr_e('This link isn\'t being tracked', 'pretty-link'); ?>" />
|
112 |
+
<?php
|
113 |
+
}
|
114 |
+
}
|
115 |
+
|
116 |
+
public static function link_list_url_clipboard($link) {
|
117 |
+
global $prli_link;
|
118 |
+
|
119 |
+
$pretty_link_url = $prli_link->get_pretty_link_url($link->slug, true);
|
120 |
+
|
121 |
+
?>
|
122 |
+
<input type='text'
|
123 |
+
readonly="true"
|
124 |
+
style="width: 65%;"
|
125 |
+
onclick='this.select();'
|
126 |
+
onfocus='this.select();'
|
127 |
+
value="<?php echo esc_attr($pretty_link_url); ?>" />
|
128 |
+
<span class="list-clipboard prli-clipboard">
|
129 |
+
<i class="pl-icon-clipboard pl-list-icon icon-clipboardjs"
|
130 |
+
data-clipboard-text="<?php echo esc_url($pretty_link_url); ?>"></i>
|
131 |
+
</span>
|
132 |
+
<?php if( 0 ): // $link->redirect_type !== 'pixel' ): ?>
|
133 |
+
<div style="font-size: 8px;"
|
134 |
+
title="<?php echo esc_url($link->url); ?>">
|
135 |
+
<strong><?php esc_html_e('Target URL:', 'pretty-link'); ?></strong>
|
136 |
+
<?php echo esc_html(substr($link->url,0,47) . ((strlen($link->url) >= 47)?'...':'')); ?>
|
137 |
+
</div>
|
138 |
+
<?php endif;
|
139 |
+
}
|
140 |
+
|
141 |
+
public static function link_action_reset($link, $title) {
|
142 |
+
ob_start();
|
143 |
+
?>
|
144 |
+
<a href=""
|
145 |
+
data-id="<?php echo esc_attr($link->id); ?>"
|
146 |
+
class="prli_reset_pretty_link"
|
147 |
+
title="<?php echo esc_attr(sprintf( __('Reset %s', 'pretty-link'), $link->name )); ?>"><?php echo esc_html($title); ?></a>
|
148 |
+
<?php
|
149 |
+
|
150 |
+
return ob_get_clean();
|
151 |
+
}
|
152 |
+
|
153 |
+
public static function link_action_tweet($link, $title) {
|
154 |
+
ob_start();
|
155 |
+
?>
|
156 |
+
<a href="<?php echo esc_url('https://twitter.com/intent/tweet?url=' . urlencode($link->pretty_url)); ?>"
|
157 |
+
target="_blank"
|
158 |
+
title="<?php echo esc_attr(sprintf( __('Post %s to Twitter', 'pretty-link'), $link->pretty_url )); ?>"><?php echo esc_html($title); ?></a>
|
159 |
+
<?php
|
160 |
+
|
161 |
+
return ob_get_clean();
|
162 |
+
}
|
163 |
+
|
164 |
+
public static function link_action_email($link, $title) {
|
165 |
+
ob_start();
|
166 |
+
?>
|
167 |
+
<a href="<?php echo esc_url('mailto:?subject=' . rawurlencode(__('Pretty Link', 'pretty-link')) . '&body=' . rawurlencode($link->pretty_url)); ?>"
|
168 |
+
target="_blank"
|
169 |
+
title="<?php echo esc_attr(sprintf( __('Send %s in an Email', 'pretty-link'), $link->pretty_url )); ?>"><?php echo esc_html($title); ?></a>
|
170 |
+
<?php
|
171 |
+
|
172 |
+
return ob_get_clean();
|
173 |
+
}
|
174 |
+
|
175 |
+
public static function link_action_visit_target($link, $title) {
|
176 |
+
ob_start();
|
177 |
+
?>
|
178 |
+
<a href="<?php echo esc_url($link->url); ?>"
|
179 |
+
target="_blank"
|
180 |
+
title="<?php echo esc_attr(sprintf(__('Visit Target URL: %s in a New Window', 'pretty-link'), $link->url)); ?>"><?php echo esc_html($title); ?></a>
|
181 |
+
<?php
|
182 |
+
|
183 |
+
return ob_get_clean();
|
184 |
+
}
|
185 |
+
|
186 |
+
public static function link_action_visit_pretty_link($link, $title) {
|
187 |
+
ob_start();
|
188 |
+
?>
|
189 |
+
<a href="<?php echo esc_url($link->pretty_url); ?>"
|
190 |
+
target="_blank"
|
191 |
+
title="<?php echo esc_attr(sprintf(__('Visit Short URL: %s in a New Window', 'pretty-link'), $link->pretty_url)); ?>"><?php echo esc_html($title); ?></a>
|
192 |
+
<?php
|
193 |
+
|
194 |
+
return ob_get_clean();
|
195 |
+
}
|
196 |
}
|
197 |
|
app/models/PrliClick.php
CHANGED
@@ -231,12 +231,9 @@ class PrliClick {
|
|
231 |
}
|
232 |
|
233 |
public function setupClickLineGraph($start_timestamp, $end_timestamp, $link_id = "all", $type = "all", $group = '', $title_only = false) {
|
234 |
-
global $wpdb, $prli_utils, $prli_link
|
235 |
|
236 |
-
if(
|
237 |
-
$link_slug = sprintf(__("group: '%s'", 'pretty-link'),$wpdb->get_var($wpdb->prepare("SELECT name FROM {$prli_group->table_name} WHERE id = %d", $group)));
|
238 |
-
}
|
239 |
-
else if($link_id == 'all') {
|
240 |
$link_slug = __('all links', 'pretty-link');
|
241 |
}
|
242 |
else {
|
@@ -268,17 +265,17 @@ class PrliClick {
|
|
268 |
// Set defaults and grab get or post of each possible param
|
269 |
public function get_params_array() {
|
270 |
$values = array(
|
271 |
-
'paged' => (isset($_GET['paged'])
|
272 |
'l' => (isset($_GET['l'])?(int)$_GET['l']:(isset($_POST['l'])?(int)$_POST['l']:'all')),
|
273 |
-
'group' => (isset($_GET['group'])
|
274 |
-
'ip' => (isset($_GET['ip'])?$_GET['ip']:(isset($_POST['ip'])?$_POST['ip']:'')),
|
275 |
-
'vuid' => (isset($_GET['vuid'])?$_GET['vuid']:(isset($_POST['vuid'])?$_POST['vuid']:'')),
|
276 |
-
'sdate' => (isset($_GET['sdate'])?$_GET['sdate']:(isset($_POST['sdate'])?$_POST['sdate']:'')),
|
277 |
-
'edate' => (isset($_GET['edate'])?$_GET['edate']:(isset($_POST['edate'])?$_POST['edate']:'')),
|
278 |
-
'type' => (isset($_GET['type'])?$_GET['type']:(isset($_POST['type'])?$_POST['type']:'all')),
|
279 |
-
'search' => (isset($_GET['search'])?$_GET['search']:(isset($_POST['search'])?$_POST['search']:'')),
|
280 |
-
'sort' => (isset($_GET['sort'])?$_GET['sort']:(isset($_POST['sort'])?$_POST['sort']:'')),
|
281 |
-
'sdir' => (isset($_GET['sdir'])?$_GET['sdir']:(isset($_POST['sdir'])?$_POST['sdir']:''))
|
282 |
);
|
283 |
|
284 |
return $values;
|
231 |
}
|
232 |
|
233 |
public function setupClickLineGraph($start_timestamp, $end_timestamp, $link_id = "all", $type = "all", $group = '', $title_only = false) {
|
234 |
+
global $wpdb, $prli_utils, $prli_link;
|
235 |
|
236 |
+
if($link_id == 'all') {
|
|
|
|
|
|
|
237 |
$link_slug = __('all links', 'pretty-link');
|
238 |
}
|
239 |
else {
|
265 |
// Set defaults and grab get or post of each possible param
|
266 |
public function get_params_array() {
|
267 |
$values = array(
|
268 |
+
'paged' => (isset($_GET['paged'])?(int)$_GET['paged']:(isset($_POST['paged'])?(int)$_POST['paged']:1)),
|
269 |
'l' => (isset($_GET['l'])?(int)$_GET['l']:(isset($_POST['l'])?(int)$_POST['l']:'all')),
|
270 |
+
'group' => (isset($_GET['group'])?(int)$_GET['group']:(isset($_POST['group'])?(int)$_POST['group']:'')),
|
271 |
+
'ip' => sanitize_text_field(stripslashes(isset($_GET['ip'])?$_GET['ip']:(isset($_POST['ip'])?$_POST['ip']:''))),
|
272 |
+
'vuid' => sanitize_key(stripslashes(isset($_GET['vuid'])?$_GET['vuid']:(isset($_POST['vuid'])?$_POST['vuid']:''))),
|
273 |
+
'sdate' => sanitize_text_field(stripslashes(isset($_GET['sdate'])?$_GET['sdate']:(isset($_POST['sdate'])?$_POST['sdate']:''))),
|
274 |
+
'edate' => sanitize_text_field(stripslashes(isset($_GET['edate'])?$_GET['edate']:(isset($_POST['edate'])?$_POST['edate']:''))),
|
275 |
+
'type' => sanitize_text_field(stripslashes(isset($_GET['type'])?$_GET['type']:(isset($_POST['type'])?$_POST['type']:'all'))),
|
276 |
+
'search' => sanitize_text_field(stripslashes(isset($_GET['search'])?$_GET['search']:(isset($_POST['search'])?$_POST['search']:''))),
|
277 |
+
'sort' => sanitize_key(stripslashes(isset($_GET['sort'])?$_GET['sort']:(isset($_POST['sort'])?$_POST['sort']:''))),
|
278 |
+
'sdir' => sanitize_key(stripslashes(isset($_GET['sdir'])?$_GET['sdir']:(isset($_POST['sdir'])?$_POST['sdir']:'')))
|
279 |
);
|
280 |
|
281 |
return $values;
|
app/models/PrliDb.php
CHANGED
@@ -26,6 +26,10 @@ class PrliDb {
|
|
26 |
public function prli_install() {
|
27 |
global $wpdb, $prli_utils, $plp_update, $prli_db_version;
|
28 |
|
|
|
|
|
|
|
|
|
29 |
// This was introduced in WordPress 3.5
|
30 |
// $char_col = $wpdb->get_charset_collate(); //This doesn't work for most non english setups
|
31 |
$char_col = "";
|
@@ -47,9 +51,6 @@ class PrliDb {
|
|
47 |
|
48 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
49 |
|
50 |
-
//Fix for large indexes
|
51 |
-
$wpdb->query("SET GLOBAL innodb_large_prefix=1");
|
52 |
-
|
53 |
/* Create/Upgrade Clicks (Clicks) Table */
|
54 |
$sql = "CREATE TABLE {$this->clicks} (
|
55 |
id int(11) NOT NULL auto_increment,
|
@@ -68,14 +69,14 @@ class PrliDb {
|
|
68 |
vuid varchar(25) default NULL,
|
69 |
PRIMARY KEY (id),
|
70 |
KEY link_id (link_id),
|
71 |
-
KEY ip (ip),
|
72 |
-
KEY browser (browser),
|
73 |
-
KEY btype (btype),
|
74 |
-
KEY bversion (bversion),
|
75 |
-
KEY os (os),
|
76 |
-
KEY referer (referer),
|
77 |
-
KEY host (host),
|
78 |
-
KEY uri (uri),
|
79 |
KEY robot (robot),
|
80 |
KEY first_click (first_click),
|
81 |
KEY vuid (vuid)".
|
@@ -97,37 +98,26 @@ class PrliDb {
|
|
97 |
param_forwarding varchar(255) default NULL,
|
98 |
param_struct varchar(255) default NULL,
|
99 |
redirect_type varchar(255) default '307',
|
|
|
100 |
created_at datetime NOT NULL,
|
101 |
updated_at datetime default NULL,
|
102 |
group_id int(11) default NULL,
|
|
|
103 |
PRIMARY KEY (id),
|
|
|
104 |
KEY group_id (group_id),
|
105 |
-
KEY
|
106 |
KEY nofollow (nofollow),
|
107 |
KEY track_me (track_me),
|
108 |
-
KEY param_forwarding (param_forwarding),
|
109 |
-
KEY
|
110 |
-
KEY
|
111 |
-
KEY slug (slug),
|
112 |
KEY created_at (created_at),
|
113 |
KEY updated_at (updated_at)
|
114 |
) {$char_col};";
|
115 |
|
116 |
dbDelta($sql);
|
117 |
|
118 |
-
/* Create/Upgrade Groups Table */
|
119 |
-
$sql = "CREATE TABLE {$this->groups} (
|
120 |
-
id int(11) NOT NULL auto_increment,
|
121 |
-
name varchar(255) default NULL,
|
122 |
-
description text default NULL,
|
123 |
-
created_at datetime NOT NULL,
|
124 |
-
PRIMARY KEY (id),
|
125 |
-
KEY name (name)
|
126 |
-
) {$char_col};";
|
127 |
-
|
128 |
-
dbDelta($sql);
|
129 |
-
|
130 |
-
/* Create/Upgrade Groups Table */
|
131 |
$sql = "CREATE TABLE {$this->linkmeta} (
|
132 |
id int(11) NOT NULL auto_increment,
|
133 |
meta_key varchar(255) default NULL,
|
@@ -136,7 +126,7 @@ class PrliDb {
|
|
136 |
link_id int(11) NOT NULL,
|
137 |
created_at datetime NOT NULL,
|
138 |
PRIMARY KEY (id),
|
139 |
-
KEY meta_key (meta_key),
|
140 |
KEY link_id (link_id)
|
141 |
) {$char_col};";
|
142 |
|
@@ -154,4 +144,11 @@ class PrliDb {
|
|
154 |
/***** SAVE DB VERSION *****/
|
155 |
update_option('prli_db_version', $prli_db_version);
|
156 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
157 |
}
|
26 |
public function prli_install() {
|
27 |
global $wpdb, $prli_utils, $plp_update, $prli_db_version;
|
28 |
|
29 |
+
$wpdb->query('SET SQL_BIG_SELECTS=1'); //This may be getting set back to 0 when SET MAX_JOIN_SIZE is executed
|
30 |
+
$wpdb->query('SET MAX_JOIN_SIZE=18446744073709551615');
|
31 |
+
//$wpdb->query('SET GLOBAL innodb_large_prefix=1'); //Will fail on some installs without proper privileges still
|
32 |
+
|
33 |
// This was introduced in WordPress 3.5
|
34 |
// $char_col = $wpdb->get_charset_collate(); //This doesn't work for most non english setups
|
35 |
$char_col = "";
|
51 |
|
52 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
53 |
|
|
|
|
|
|
|
54 |
/* Create/Upgrade Clicks (Clicks) Table */
|
55 |
$sql = "CREATE TABLE {$this->clicks} (
|
56 |
id int(11) NOT NULL auto_increment,
|
69 |
vuid varchar(25) default NULL,
|
70 |
PRIMARY KEY (id),
|
71 |
KEY link_id (link_id),
|
72 |
+
KEY ip (ip(191)),
|
73 |
+
KEY browser (browser(191)),
|
74 |
+
KEY btype (btype(191)),
|
75 |
+
KEY bversion (bversion(191)),
|
76 |
+
KEY os (os(191)),
|
77 |
+
KEY referer (referer(191)),
|
78 |
+
KEY host (host(191)),
|
79 |
+
KEY uri (uri(191)),
|
80 |
KEY robot (robot),
|
81 |
KEY first_click (first_click),
|
82 |
KEY vuid (vuid)".
|
98 |
param_forwarding varchar(255) default NULL,
|
99 |
param_struct varchar(255) default NULL,
|
100 |
redirect_type varchar(255) default '307',
|
101 |
+
link_status varchar(64) default 'enabled',
|
102 |
created_at datetime NOT NULL,
|
103 |
updated_at datetime default NULL,
|
104 |
group_id int(11) default NULL,
|
105 |
+
link_cpt_id int(11) default 0,
|
106 |
PRIMARY KEY (id),
|
107 |
+
KEY link_cpt_id (link_cpt_id),
|
108 |
KEY group_id (group_id),
|
109 |
+
KEY link_status (link_status),
|
110 |
KEY nofollow (nofollow),
|
111 |
KEY track_me (track_me),
|
112 |
+
KEY param_forwarding (param_forwarding(191)),
|
113 |
+
KEY redirect_type (redirect_type(191)),
|
114 |
+
KEY slug (slug(191)),
|
|
|
115 |
KEY created_at (created_at),
|
116 |
KEY updated_at (updated_at)
|
117 |
) {$char_col};";
|
118 |
|
119 |
dbDelta($sql);
|
120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
$sql = "CREATE TABLE {$this->linkmeta} (
|
122 |
id int(11) NOT NULL auto_increment,
|
123 |
meta_key varchar(255) default NULL,
|
126 |
link_id int(11) NOT NULL,
|
127 |
created_at datetime NOT NULL,
|
128 |
PRIMARY KEY (id),
|
129 |
+
KEY meta_key (meta_key(191)),
|
130 |
KEY link_id (link_id)
|
131 |
) {$char_col};";
|
132 |
|
144 |
/***** SAVE DB VERSION *****/
|
145 |
update_option('prli_db_version', $prli_db_version);
|
146 |
}
|
147 |
+
|
148 |
+
public function table_exists($table) {
|
149 |
+
global $wpdb;
|
150 |
+
$q = $wpdb->prepare('SHOW TABLES LIKE %s', $table);
|
151 |
+
$table_res = $wpdb->get_var($q);
|
152 |
+
return (strtolower($table_res) == strtolower($table));
|
153 |
+
}
|
154 |
}
|
app/models/PrliGroup.php
CHANGED
@@ -26,26 +26,21 @@ class PrliGroup
|
|
26 |
{
|
27 |
global $wpdb;
|
28 |
|
29 |
-
$query =
|
30 |
-
|
31 |
-
' description=\'' . $values['description'] . '\' ' .
|
32 |
-
' WHERE id='.$id;
|
33 |
$query_results = $wpdb->query($query);
|
34 |
return $query_results;
|
35 |
}
|
36 |
|
37 |
public function destroy( $id )
|
38 |
{
|
39 |
-
//require_once(PRLI_MODELS_PATH.'/models.inc.php');
|
40 |
global $wpdb, $prli_link;
|
41 |
|
42 |
// Disconnect the links from this group
|
43 |
-
$query =
|
44 |
-
|
45 |
-
' WHERE group_id='.$id;
|
46 |
-
$query_results = $wpdb->query($query);
|
47 |
|
48 |
-
$destroy =
|
49 |
return $wpdb->query($destroy);
|
50 |
}
|
51 |
|
@@ -98,13 +93,13 @@ class PrliGroup
|
|
98 |
public function get_params_array()
|
99 |
{
|
100 |
$values = array(
|
101 |
-
'action' => (isset($_GET['action'])?$_GET['action']:(isset($_POST['action'])?$_POST['action']:'list')),
|
102 |
-
'id' => (isset($_GET['id'])
|
103 |
-
'paged' => (isset($_GET['paged'])
|
104 |
-
'group' => (isset($_GET['group'])
|
105 |
-
'search' => (isset($_GET['search'])?$_GET['search']:(isset($_POST['search'])?$_POST['search']:'')),
|
106 |
-
'sort' => (isset($_GET['sort'])?$_GET['sort']:(isset($_POST['sort'])?$_POST['sort']:'')),
|
107 |
-
'sdir' => (isset($_GET['sdir'])?$_GET['sdir']:(isset($_POST['sdir'])?$_POST['sdir']:''))
|
108 |
);
|
109 |
|
110 |
return $values;
|
@@ -116,7 +111,7 @@ class PrliGroup
|
|
116 |
|
117 |
$errors = array();
|
118 |
if( empty($values['name']) )
|
119 |
-
$errors[] =
|
120 |
|
121 |
return $errors;
|
122 |
}
|
26 |
{
|
27 |
global $wpdb;
|
28 |
|
29 |
+
$query = "UPDATE {$this->table_name} SET name = %s, description = %s WHERE id = %d";
|
30 |
+
$query = $wpdb->prepare($query, $values['name'], $values['description'], $id);
|
|
|
|
|
31 |
$query_results = $wpdb->query($query);
|
32 |
return $query_results;
|
33 |
}
|
34 |
|
35 |
public function destroy( $id )
|
36 |
{
|
|
|
37 |
global $wpdb, $prli_link;
|
38 |
|
39 |
// Disconnect the links from this group
|
40 |
+
$query = $wpdb->prepare("UPDATE {$prli_link->table_name} SET group_id = NULL WHERE group_id = %d", $id);
|
41 |
+
$wpdb->query($query);
|
|
|
|
|
42 |
|
43 |
+
$destroy = $wpdb->prepare("DELETE FROM {$this->table_name} WHERE id = %d", $id);
|
44 |
return $wpdb->query($destroy);
|
45 |
}
|
46 |
|
93 |
public function get_params_array()
|
94 |
{
|
95 |
$values = array(
|
96 |
+
'action' => sanitize_key(stripslashes(isset($_GET['action'])?$_GET['action']:(isset($_POST['action'])?$_POST['action']:'list'))),
|
97 |
+
'id' => (isset($_GET['id'])?(int)$_GET['id']:(isset($_POST['id'])?(int)$_POST['id']:'')),
|
98 |
+
'paged' => (isset($_GET['paged'])?(int)$_GET['paged']:(isset($_POST['paged'])?(int)$_POST['paged']:1)),
|
99 |
+
'group' => (isset($_GET['group'])?(int)$_GET['group']:(isset($_POST['group'])?(int)$_POST['group']:'')),
|
100 |
+
'search' => sanitize_text_field(stripslashes(isset($_GET['search'])?$_GET['search']:(isset($_POST['search'])?$_POST['search']:''))),
|
101 |
+
'sort' => sanitize_key(stripslashes(isset($_GET['sort'])?$_GET['sort']:(isset($_POST['sort'])?$_POST['sort']:''))),
|
102 |
+
'sdir' => sanitize_key(stripslashes(isset($_GET['sdir'])?$_GET['sdir']:(isset($_POST['sdir'])?$_POST['sdir']:'')))
|
103 |
);
|
104 |
|
105 |
return $values;
|
111 |
|
112 |
$errors = array();
|
113 |
if( empty($values['name']) )
|
114 |
+
$errors[] = __('Group must have a name.', 'pretty-link');
|
115 |
|
116 |
return $errors;
|
117 |
}
|
app/models/PrliLink.php
CHANGED
@@ -3,6 +3,8 @@ if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.')
|
|
3 |
|
4 |
class PrliLink {
|
5 |
public $table_name;
|
|
|
|
|
6 |
|
7 |
public function __construct() {
|
8 |
global $wpdb;
|
@@ -11,62 +13,50 @@ class PrliLink {
|
|
11 |
|
12 |
public static function get_count() {
|
13 |
global $wpdb, $prli_link;
|
14 |
-
$q = "SELECT COUNT(*) FROM {$prli_link->table_name}";
|
15 |
return $wpdb->get_var($q);
|
16 |
}
|
17 |
|
18 |
public static function get_first_date() {
|
19 |
global $wpdb, $prli_link;
|
20 |
-
$q = "SELECT min(created_at) FROM {$prli_link->table_name}";
|
21 |
return $wpdb->get_var($q);
|
22 |
}
|
23 |
|
24 |
public function create( $values ) {
|
25 |
global $wpdb, $prli_link_meta;
|
26 |
|
27 |
-
$now =
|
28 |
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
}
|
35 |
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
name
|
42 |
-
|
43 |
-
redirect_type,
|
44 |
-
description,
|
45 |
-
track_me,
|
46 |
-
nofollow,
|
47 |
-
group_id,
|
48 |
-
created_at,
|
49 |
-
updated_at
|
50 |
-
)
|
51 |
-
VALUES (%s,%s,%s,%s,%s,%s,%d,%d,%d,%s,%s)
|
52 |
-
";
|
53 |
|
54 |
-
|
55 |
-
|
56 |
-
$values['
|
57 |
-
$
|
58 |
-
|
59 |
-
(isset($values['param_forwarding']) && !empty($values['param_forwarding']))?1:0,
|
60 |
-
// We no longer handle this: $values['param_struct'],
|
61 |
-
$values['redirect_type'],
|
62 |
-
$values['description'],
|
63 |
-
(isset($values['track_me']) && !empty($values['track_me']))?1:0,
|
64 |
-
(isset($values['nofollow']) && !empty($values['nofollow']))?1:0,
|
65 |
-
(isset($values['group_id'])?(int)$values['group_id']:'NULL'),
|
66 |
-
$now, $now
|
67 |
-
);
|
68 |
|
69 |
-
$query_results = $wpdb->
|
70 |
|
71 |
$link_id = ($query_results ? $wpdb->insert_id : false);
|
72 |
|
@@ -75,129 +65,99 @@ class PrliLink {
|
|
75 |
$prli_link_meta->update_link_meta($link_id, 'delay', 0);
|
76 |
}
|
77 |
|
|
|
|
|
|
|
|
|
78 |
do_action('prli-create-link', $link_id, $values);
|
79 |
|
80 |
return $link_id;
|
81 |
}
|
82 |
|
83 |
public function update( $id, $values ) {
|
84 |
-
global $wpdb;
|
85 |
|
86 |
-
$now =
|
87 |
|
88 |
-
|
89 |
-
|
90 |
-
}
|
91 |
-
else {
|
92 |
-
$values['name'] = (!empty($values['name'])?$values['name']:PrliUtils::get_page_title($values['url'],$values['slug']));
|
93 |
-
}
|
94 |
|
95 |
-
|
96 |
-
$query_str = "
|
97 |
-
UPDATE {$this->table_name}
|
98 |
-
SET url=%s,
|
99 |
-
slug=%s,
|
100 |
-
name=%s,
|
101 |
-
param_forwarding=%s,
|
102 |
-
redirect_type=%s,
|
103 |
-
description=%s,
|
104 |
-
track_me=%d,
|
105 |
-
nofollow=%d,
|
106 |
-
group_id=%d,
|
107 |
-
updated_at=%s
|
108 |
-
WHERE id=%d
|
109 |
-
";
|
110 |
|
111 |
-
|
112 |
-
|
113 |
-
$
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
(isset($values['track_me']) && !empty($values['track_me']))?1:0,
|
121 |
-
(isset($values['nofollow']) && !empty($values['nofollow']))?1:0,
|
122 |
-
(isset($values['group_id'])?(int)$values['group_id']:'NULL'),
|
123 |
-
$now, $id
|
124 |
-
);
|
125 |
|
126 |
-
$query_results = $wpdb->
|
127 |
|
128 |
-
|
129 |
-
|
|
|
|
|
130 |
|
131 |
-
|
132 |
-
|
133 |
-
global $wpdb;
|
134 |
-
|
135 |
-
$now = date('Y-m-d H:i:s');
|
136 |
-
$sets = array();
|
137 |
-
$query = $wpdb->prepare("UPDATE {$this->table_name} SET updated_at=%s ", $now);
|
138 |
-
|
139 |
-
$link_columns = array(
|
140 |
-
'name',
|
141 |
-
'description',
|
142 |
-
'url',
|
143 |
-
'slug',
|
144 |
-
'nofollow',
|
145 |
-
'track_me',
|
146 |
-
'param_forwarding',
|
147 |
-
'param_struct',
|
148 |
-
'redirect_type',
|
149 |
-
'group_id'
|
150 |
-
);
|
151 |
-
|
152 |
-
foreach($values as $lnkkey => $lnkval) {
|
153 |
-
// make sure this is an option contained in the links table
|
154 |
-
if(in_array($lnkkey, $link_columns)) {
|
155 |
-
// check to see if this is a checkbox
|
156 |
-
if(in_array(strtolower($lnkval), array('on','off'))) {
|
157 |
-
$sets[] = $wpdb->prepare("{$lnkkey}=%d", (strtolower($lnkval)=='on'));
|
158 |
-
}
|
159 |
-
else {
|
160 |
-
$sets[] = $wpdb->prepare("{$lnkkey}=%s", $lnkval);
|
161 |
-
}
|
162 |
-
}
|
163 |
-
}
|
164 |
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
}
|
169 |
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
else {
|
174 |
-
$query .= $wpdb->prepare(" WHERE id=%d", $ids);
|
175 |
-
}
|
176 |
|
177 |
-
|
|
|
178 |
|
179 |
-
|
180 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
181 |
|
182 |
-
return
|
183 |
}
|
184 |
|
185 |
public function update_group($id, $value, $group_id) {
|
186 |
global $wpdb;
|
187 |
|
188 |
-
|
189 |
-
|
190 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
191 |
$query_results = $wpdb->query($query);
|
192 |
|
193 |
return $query_results;
|
194 |
}
|
195 |
|
196 |
-
public function destroy($id) {
|
197 |
-
//require_once(PRLI_MODELS_PATH.'/models.inc.php');
|
198 |
global $wpdb, $prli_click, $prli_link_meta;
|
199 |
|
200 |
do_action('prli_delete_link', $id);
|
|
|
|
|
|
|
|
|
|
|
|
|
201 |
$metas = $wpdb->prepare("DELETE FROM {$prli_link_meta->table_name} WHERE link_id=%d",$id);
|
202 |
$reset = $wpdb->prepare("DELETE FROM {$prli_click->table_name} WHERE link_id=%d",$id);
|
203 |
$destroy = $wpdb->prepare("DELETE FROM {$this->table_name} WHERE id=%d",$id);
|
@@ -209,7 +169,6 @@ class PrliLink {
|
|
209 |
}
|
210 |
|
211 |
public function reset($id) {
|
212 |
-
//require_once(PRLI_MODELS_PATH.'/models.inc.php');
|
213 |
global $wpdb, $prli_click, $prli_link_meta;
|
214 |
|
215 |
$prli_link_meta->delete_link_meta($id, 'static-clicks');
|
@@ -220,123 +179,89 @@ class PrliLink {
|
|
220 |
return $wpdb->query($reset);
|
221 |
}
|
222 |
|
223 |
-
public function getOneFromSlug( $slug, $return_type = OBJECT, $include_stats = false ) {
|
224 |
-
|
|
|
225 |
|
226 |
-
|
|
|
|
|
227 |
|
228 |
-
|
|
|
229 |
|
230 |
-
|
231 |
-
return $cached[$slug];
|
232 |
-
}
|
233 |
-
elseif($include_stats && isset($cached[$slug]['stats'])) {
|
234 |
-
return $cached[$slug]['stats'];
|
235 |
-
}
|
236 |
|
237 |
if($include_stats) {
|
238 |
-
$query =
|
|
|
|
|
239 |
|
240 |
if($prli_options->extended_tracking != 'count') {
|
241 |
-
$query .=
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
246 |
}
|
247 |
else {
|
248 |
-
$query .=
|
249 |
-
|
250 |
-
|
251 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
252 |
}
|
253 |
-
|
254 |
-
$query .= "FROM {$this->table_name} li " .
|
255 |
-
'WHERE slug=%s';
|
256 |
}
|
257 |
else {
|
258 |
-
$query = "SELECT
|
259 |
}
|
260 |
|
261 |
-
$query
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
if(!$link) { $link = false; }
|
266 |
-
|
267 |
-
if($include_stats and $link and $prli_options->extended_tracking == 'count') {
|
268 |
-
$link->clicks = $prli_link_meta->get_link_meta($link->id,'static-clicks',true);
|
269 |
-
$link->uniques = $prli_link_meta->get_link_meta($link->id,'static-uniques',true);
|
270 |
-
}
|
271 |
-
|
272 |
-
//Cache this to prevent multiple queries
|
273 |
-
if(!$include_stats) {
|
274 |
-
$cached[$slug] = $link;
|
275 |
-
}
|
276 |
-
else {
|
277 |
-
$cached[$slug]['stats'] = $link;
|
278 |
-
}
|
279 |
-
|
280 |
-
return $link;
|
281 |
-
}
|
282 |
-
|
283 |
-
public function getOne( $id, $return_type = OBJECT, $include_stats = false ) {
|
284 |
-
global $wpdb, $prli_click, $prli_link_meta, $prli_options;
|
285 |
-
|
286 |
-
if(!isset($id) or empty($id)) { return false; }
|
287 |
-
|
288 |
-
static $cached;
|
289 |
-
|
290 |
-
if(!isset($cached)) { $cached = array(); }
|
291 |
|
292 |
-
if(
|
293 |
-
|
|
|
|
|
294 |
}
|
295 |
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
if($prli_options->extended_tracking != 'count') {
|
300 |
-
$query .= '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
|
301 |
-
'WHERE cl.link_id = li.id' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as clicks, ' .
|
302 |
-
'(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
|
303 |
-
'WHERE cl.link_id = li.id ' .
|
304 |
-
'AND cl.first_click <> 0' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as uniques ';
|
305 |
-
}
|
306 |
-
else {
|
307 |
-
$query .= '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
|
308 |
-
'WHERE lm.meta_key="static-clicks" AND lm.link_id=li.id LIMIT 1) as clicks, ' .
|
309 |
-
'(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
|
310 |
-
'WHERE lm.meta_key="static-uniques" AND lm.link_id=li.id LIMIT 1) as uniques ';
|
311 |
-
}
|
312 |
-
|
313 |
-
$query .= 'FROM ' . $this->table_name . ' li ' .
|
314 |
-
'WHERE id=%d';
|
315 |
-
}
|
316 |
-
else {
|
317 |
-
$query = "SELECT * FROM {$this->table_name} WHERE id=%d";
|
318 |
-
}
|
319 |
|
320 |
-
|
321 |
-
$link
|
322 |
|
323 |
if($include_stats and $link and $prli_options->extended_tracking == 'count') {
|
324 |
$link->clicks = $prli_link_meta->get_link_meta($link->id,'static-clicks',true);
|
325 |
$link->uniques = $prli_link_meta->get_link_meta($link->id,'static-uniques',true);
|
326 |
}
|
327 |
|
328 |
-
//Cache this to prevent multiple queries
|
329 |
-
if(!$include_stats) {
|
330 |
-
$cached[$id] = $link;
|
331 |
-
}
|
332 |
-
|
333 |
return $link;
|
334 |
}
|
335 |
|
336 |
-
public function find_first_target_url($target_url)
|
337 |
-
{
|
338 |
global $wpdb;
|
339 |
-
$query_str = "SELECT id FROM {$this->table_name} WHERE url=%s LIMIT 1";
|
340 |
$query = $wpdb->prepare($query_str,$target_url);
|
341 |
return $wpdb->get_var($query);
|
342 |
}
|
@@ -344,7 +269,7 @@ class PrliLink {
|
|
344 |
public function get_or_create_pretty_link_for_target_url( $target_url, $group=0 )
|
345 |
{
|
346 |
global $wpdb;
|
347 |
-
$query_str = "SELECT * FROM {$this->table_name} WHERE url=%s LIMIT 1";
|
348 |
$query = $wpdb->prepare($query_str,$target_url);
|
349 |
$pretty_link = $wpdb->get_row($query);
|
350 |
|
@@ -380,9 +305,9 @@ class PrliLink {
|
|
380 |
if(preg_match($match_str, $uri, $match_val))
|
381 |
{
|
382 |
// Match longest slug -- this is the most common
|
383 |
-
$
|
384 |
if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) )
|
385 |
-
return compact('pretty_link_found'
|
386 |
|
387 |
// Trim down the matched link
|
388 |
$matched_link = preg_replace('#/[^/]*?$#','',$match_val[2],1);
|
@@ -396,9 +321,9 @@ class PrliLink {
|
|
396 |
{
|
397 |
$new_match_str ="#^{$subdir_str}({$struct})({$matched_link})(.*?)?$#";
|
398 |
|
399 |
-
$
|
400 |
if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) )
|
401 |
-
return compact('pretty_link_found'
|
402 |
|
403 |
// Trim down the matched link and try again
|
404 |
$matched_link = preg_replace('#/[^/]*$#','',$match_val[2],1);
|
@@ -409,14 +334,13 @@ class PrliLink {
|
|
409 |
return false;
|
410 |
}
|
411 |
|
412 |
-
public function is_pretty_link_slug($slug)
|
413 |
-
{
|
414 |
return apply_filters('prli-check-if-slug', $this->getOneFromSlug( rawurldecode($slug) ), rawurldecode($slug));
|
415 |
}
|
416 |
|
417 |
public function get_link_min( $id, $return_type = OBJECT ) {
|
418 |
global $wpdb, $prli_link_meta;
|
419 |
-
$query_str = "SELECT * FROM {$this->table_name} WHERE id=%d";
|
420 |
$query = $wpdb->prepare($query_str, $id);
|
421 |
$res = $wpdb->get_row($query, $return_type);
|
422 |
|
@@ -429,84 +353,62 @@ class PrliLink {
|
|
429 |
return $res;
|
430 |
}
|
431 |
|
432 |
-
public function getAll($where = '', $order_by = '', $return_type = OBJECT, $include_stats = false)
|
433 |
-
|
434 |
-
global $wpdb, $prli_click, $prli_group, $prli_link_meta, $prli_options, $prli_utils;
|
435 |
|
436 |
-
|
437 |
-
|
438 |
-
|
439 |
-
|
440 |
-
|
441 |
-
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
446 |
}
|
447 |
else
|
448 |
{
|
449 |
-
$query .=
|
450 |
-
|
451 |
-
|
452 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
453 |
}
|
454 |
-
$query .= 'gr.name as group_name ' .
|
455 |
-
'FROM '. $this->table_name . ' li ' .
|
456 |
-
'LEFT OUTER JOIN ' . $prli_group->table_name . ' gr ON li.group_id=gr.id' .
|
457 |
-
$prli_utils->prepend_and_or_where(' WHERE', $where) . $order_by;
|
458 |
}
|
459 |
-
else
|
460 |
-
|
461 |
-
$query = "SELECT li.*, gr.name as group_name FROM {$this->table_name} li " .
|
462 |
-
'LEFT OUTER JOIN ' . $prli_group->table_name . ' gr ON li.group_id=gr.id' .
|
463 |
-
$prli_utils->prepend_and_or_where(' WHERE', $where) . $order_by;
|
464 |
}
|
465 |
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
public function getRecordCount($where="")
|
471 |
-
{
|
472 |
-
global $wpdb, $prli_utils;
|
473 |
-
$query = 'SELECT COUNT(*) FROM ' . $this->table_name . ' li' . $prli_utils->prepend_and_or_where(' WHERE', $where);
|
474 |
-
return $wpdb->get_var($query);
|
475 |
-
}
|
476 |
|
477 |
-
|
478 |
-
{
|
479 |
-
return ceil((int)$this->getRecordCount($where) / (int)$p_size);
|
480 |
-
}
|
481 |
-
|
482 |
-
public function getPage($current_p,$p_size, $where = "", $order_by = '', $return_type = OBJECT)
|
483 |
-
{
|
484 |
-
global $wpdb, $prli_click, $prli_utils, $prli_group, $prli_link_meta, $prli_options;
|
485 |
-
$end_index = $current_p * $p_size;
|
486 |
-
$start_index = $end_index - $p_size;
|
487 |
-
$query = 'SELECT li.*, ';
|
488 |
-
if($prli_options->extended_tracking != 'count')
|
489 |
-
{
|
490 |
-
$query .= '(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
|
491 |
-
'WHERE cl.link_id = li.id' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as clicks, ' .
|
492 |
-
'(SELECT COUNT(*) FROM ' . $prli_click->table_name . ' cl ' .
|
493 |
-
'WHERE cl.link_id = li.id ' .
|
494 |
-
'AND cl.first_click <> 0' . $prli_click->get_exclude_where_clause( ' AND' ) . ') as uniques, ';
|
495 |
-
}
|
496 |
-
else
|
497 |
-
{
|
498 |
-
$query .= '(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
|
499 |
-
'WHERE lm.meta_key="static-clicks" AND lm.link_id=li.id LIMIT 1) as clicks, ' .
|
500 |
-
'(SELECT lm.meta_value FROM ' . $prli_link_meta->table_name . ' lm ' .
|
501 |
-
'WHERE lm.meta_key="static-uniques" AND lm.link_id=li.id LIMIT 1) as uniques, ';
|
502 |
-
}
|
503 |
-
$query .= 'gr.name as group_name ' .
|
504 |
-
'FROM ' . $this->table_name . ' li ' .
|
505 |
-
'LEFT OUTER JOIN ' . $prli_group->table_name . ' gr ON li.group_id=gr.id' .
|
506 |
-
$prli_utils->prepend_and_or_where(' WHERE', $where) . $order_by . ' ' .
|
507 |
-
'LIMIT ' . $start_index . ',' . $p_size . ';';
|
508 |
-
$results = $wpdb->get_results($query, $return_type);
|
509 |
-
return $results;
|
510 |
}
|
511 |
|
512 |
public function generateValidSlug($num_chars = 4) {
|
@@ -524,45 +426,75 @@ class PrliLink {
|
|
524 |
|
525 |
$slug = $slug_prefix . PrliUtils::gen_random_string($num_chars);
|
526 |
|
|
|
527 |
$query = "SELECT slug FROM {$this->table_name}";
|
528 |
$slugs = $wpdb->get_col($query,0);
|
529 |
|
530 |
// It is highly unlikely that we'll ever see 2 identical random slugs
|
531 |
// but just in case, here's some code to prevent collisions
|
532 |
-
while(in_array($slug, $slugs)
|
533 |
$slug = $slug_prefix . PrliUtils::gen_random_string($num_chars);
|
|
|
534 |
|
535 |
return apply_filters('prli-auto-generated-slug', $slug, $slugs, $num_chars);
|
536 |
}
|
537 |
|
538 |
-
public function get_pretty_link_url($slug)
|
539 |
-
{
|
540 |
global $prli_blogurl;
|
541 |
|
542 |
$link = $this->getOneFromSlug($slug);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
543 |
|
544 |
if( ( !isset($link->param_forwarding) || empty($link->param_forwarding) || $link->param_forwarding=='off' ) &&
|
545 |
( isset($link->redirect_type) && $link->redirect_type == 'pixel' ) ) {
|
546 |
-
return '<img src="'.$
|
547 |
}
|
548 |
else {
|
549 |
-
return $
|
550 |
}
|
551 |
}
|
552 |
|
553 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
554 |
{
|
555 |
global $wpdb, $prli_utils, $prli_blogurl;
|
556 |
|
|
|
|
|
557 |
$errors = array();
|
558 |
if( empty($values['url']) && $values['redirect_type'] != 'pixel' ) {
|
559 |
$errors[] = __("Target URL can't be blank", 'pretty-link');
|
560 |
}
|
561 |
|
562 |
-
if( $values['slug'] == null || $values['slug'] == '' ) {
|
563 |
-
$errors[] = __("Pretty Link can't be blank", 'pretty-link');
|
564 |
-
}
|
565 |
-
|
566 |
if( $values['url'] == $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri().$values['slug'] ) {
|
567 |
$errors[] = __("Target URL must be different than the Pretty Link", 'pretty-link');
|
568 |
}
|
@@ -579,9 +511,9 @@ class PrliLink {
|
|
579 |
$errors[] = __("Pretty Link slugs must not end with a slash (\"/\")", 'pretty-link');
|
580 |
}
|
581 |
|
582 |
-
$
|
583 |
-
if(
|
584 |
-
$errors[] =
|
585 |
}
|
586 |
|
587 |
return $errors;
|
@@ -599,7 +531,12 @@ class PrliLink {
|
|
599 |
|
600 |
if(empty($urls)) { return false; }
|
601 |
|
602 |
-
$decoded_urls = array_map(
|
|
|
|
|
|
|
|
|
|
|
603 |
|
604 |
// Filter out urls that are already Pretty Links
|
605 |
$where = "IN (" . implode( ',', array_map( array($this, 'get_link_slug'), $decoded_urls ) ) . ")";
|
@@ -607,7 +544,8 @@ class PrliLink {
|
|
607 |
$query = "
|
608 |
SELECT CONCAT(%s, li.slug) AS pretty_url
|
609 |
FROM {$this->table_name} AS li
|
610 |
-
WHERE li.
|
|
|
611 |
";
|
612 |
$query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri());
|
613 |
$plinks = $wpdb->get_col($query);
|
@@ -616,13 +554,18 @@ class PrliLink {
|
|
616 |
|
617 |
if(empty($decoded_urls)) { return false; }
|
618 |
|
619 |
-
$where = "IN (" . implode( ',', array_map(
|
|
|
|
|
|
|
|
|
620 |
|
621 |
$query = "
|
622 |
SELECT li.url AS target_url,
|
623 |
CONCAT(%s, li.slug) AS pretty_url
|
624 |
FROM {$this->table_name} AS li
|
625 |
-
WHERE li.
|
|
|
626 |
";
|
627 |
$query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri());
|
628 |
|
@@ -656,5 +599,157 @@ class PrliLink {
|
|
656 |
$site_url = site_url();
|
657 |
return "javascript:location.href='{$site_url}/index.php?action=prli_bookmarklet&k={$prli_options->bookmarklet_auth}&target_url='+escape(location.href);";
|
658 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
659 |
}
|
660 |
|
3 |
|
4 |
class PrliLink {
|
5 |
public $table_name;
|
6 |
+
public static $cpt = 'pretty-link';
|
7 |
+
public static $nonce_str = 'pretty-link-nonce';
|
8 |
|
9 |
public function __construct() {
|
10 |
global $wpdb;
|
13 |
|
14 |
public static function get_count() {
|
15 |
global $wpdb, $prli_link;
|
16 |
+
$q = "SELECT COUNT(*) FROM {$prli_link->table_name} WHERE link_status='enabled'";
|
17 |
return $wpdb->get_var($q);
|
18 |
}
|
19 |
|
20 |
public static function get_first_date() {
|
21 |
global $wpdb, $prli_link;
|
22 |
+
$q = "SELECT min(created_at) FROM {$prli_link->table_name} WHERE link_status='enabled'";
|
23 |
return $wpdb->get_var($q);
|
24 |
}
|
25 |
|
26 |
public function create( $values ) {
|
27 |
global $wpdb, $prli_link_meta;
|
28 |
|
29 |
+
$now = current_time('mysql');
|
30 |
|
31 |
+
$values = $this->sanitize($values);
|
32 |
+
$values['created_at'] = $values['updated_at'] = $now;
|
33 |
+
|
34 |
+
if($values['link_cpt_id'] == 0) { ## Autocreate CPT
|
35 |
+
|
36 |
+
$post_id = $this->create_cpt_for_link($values['name'], $now, $now);
|
37 |
+
|
38 |
+
if($post_id == 0 || is_wp_error($post_id)) {
|
39 |
+
error_log("Unable to create CPT Post for Link");
|
40 |
+
}
|
41 |
+
|
42 |
+
$values['link_cpt_id'] = $post_id;
|
43 |
}
|
44 |
|
45 |
+
if(empty($values['name'])) {
|
46 |
+
if($values['redirect_type'] == 'pixel') {
|
47 |
+
$values['name'] = $values['slug'];
|
48 |
+
}
|
49 |
+
else {
|
50 |
+
$values['name'] = PrliUtils::get_page_title($values['url'],$values['slug']);
|
51 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
|
53 |
+
// Update the post_title field directly so we don't activate the action
|
54 |
+
// that ultimately calls this function lest we get into an infinite loop
|
55 |
+
$q = $wpdb->prepare("UPDATE {$wpdb->posts} SET post_title=%s WHERE ID=%d", $values['name'], $values['link_cpt_id']);
|
56 |
+
$wpdb->query($q);
|
57 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
58 |
|
59 |
+
$query_results = $wpdb->insert($this->table_name, $values);
|
60 |
|
61 |
$link_id = ($query_results ? $wpdb->insert_id : false);
|
62 |
|
65 |
$prli_link_meta->update_link_meta($link_id, 'delay', 0);
|
66 |
}
|
67 |
|
68 |
+
$this->update_cpt_title($values['link_cpt_id'], $values['name']);
|
69 |
+
$this->update_cpt_status($values['link_cpt_id']);
|
70 |
+
$this->update_cpt_post_date($values['link_cpt_id'], $now);
|
71 |
+
|
72 |
do_action('prli-create-link', $link_id, $values);
|
73 |
|
74 |
return $link_id;
|
75 |
}
|
76 |
|
77 |
public function update( $id, $values ) {
|
78 |
+
global $wpdb, $prli_link;
|
79 |
|
80 |
+
$now = current_time('mysql');
|
81 |
|
82 |
+
$values = $this->sanitize($values);
|
83 |
+
$values['updated_at'] = $now;
|
|
|
|
|
|
|
|
|
84 |
|
85 |
+
$title = isset($values['name'])?trim($values['name']):'';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
|
87 |
+
if(empty($title)) {
|
88 |
+
error_log("REDIRECT TYPE: " . $values['redirect_type']);
|
89 |
+
if($values['redirect_type'] == 'pixel') {
|
90 |
+
$title = $values['slug'];
|
91 |
+
}
|
92 |
+
else {
|
93 |
+
$title = PrliUtils::get_page_title($values['url'],$values['slug']);
|
94 |
+
}
|
95 |
+
}
|
|
|
|
|
|
|
|
|
|
|
96 |
|
97 |
+
$query_results = $wpdb->update($this->table_name, $values, array('id' => $id));
|
98 |
|
99 |
+
$link = $this->getOne($id);
|
100 |
+
$this->update_cpt_title($link->link_cpt_id, $title);
|
101 |
+
$this->update_cpt_status($link->link_cpt_id);
|
102 |
+
$this->update_cpt_post_modified($link->link_cpt_id, $now);
|
103 |
|
104 |
+
return $id;
|
105 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
106 |
|
107 |
+
public function disable_link($id) {
|
108 |
+
return $this->update_link_status( $id, 'disabled' );
|
109 |
+
}
|
|
|
110 |
|
111 |
+
public function enable_link($id) {
|
112 |
+
return $this->update_link_status( $id, 'enabled' );
|
113 |
+
}
|
|
|
|
|
|
|
114 |
|
115 |
+
public function update_link_status( $id, $link_status='enabled' ) {
|
116 |
+
global $wpdb;
|
117 |
|
118 |
+
$q = $wpdb->prepare("
|
119 |
+
UPDATE {$this->table_name}
|
120 |
+
SET link_status=%s
|
121 |
+
WHERE id=%d
|
122 |
+
",
|
123 |
+
$link_status,
|
124 |
+
$id
|
125 |
+
);
|
126 |
|
127 |
+
return $wpdb->query($q);
|
128 |
}
|
129 |
|
130 |
public function update_group($id, $value, $group_id) {
|
131 |
global $wpdb;
|
132 |
|
133 |
+
if (isset($value)) {
|
134 |
+
$query = $wpdb->prepare(
|
135 |
+
"UPDATE {$this->table_name} SET group_id = %d WHERE id = %d",
|
136 |
+
$group_id,
|
137 |
+
$id
|
138 |
+
);
|
139 |
+
} else {
|
140 |
+
$query = $wpdb->prepare(
|
141 |
+
"UPDATE {$this->table_name} SET group_id = NULL WHERE id = %d",
|
142 |
+
$id
|
143 |
+
);
|
144 |
+
}
|
145 |
+
|
146 |
$query_results = $wpdb->query($query);
|
147 |
|
148 |
return $query_results;
|
149 |
}
|
150 |
|
151 |
+
public function destroy($id, $delete_mode='delete_cpt') {
|
|
|
152 |
global $wpdb, $prli_click, $prli_link_meta;
|
153 |
|
154 |
do_action('prli_delete_link', $id);
|
155 |
+
|
156 |
+
$link = $this->getOne($id);
|
157 |
+
if($delete_mode=='delete_cpt' && $link->link_cpt_id > 0) {
|
158 |
+
wp_delete_post($link->link_cpt_id, true);
|
159 |
+
}
|
160 |
+
|
161 |
$metas = $wpdb->prepare("DELETE FROM {$prli_link_meta->table_name} WHERE link_id=%d",$id);
|
162 |
$reset = $wpdb->prepare("DELETE FROM {$prli_click->table_name} WHERE link_id=%d",$id);
|
163 |
$destroy = $wpdb->prepare("DELETE FROM {$this->table_name} WHERE id=%d",$id);
|
169 |
}
|
170 |
|
171 |
public function reset($id) {
|
|
|
172 |
global $wpdb, $prli_click, $prli_link_meta;
|
173 |
|
174 |
$prli_link_meta->delete_link_meta($id, 'static-clicks');
|
179 |
return $wpdb->query($reset);
|
180 |
}
|
181 |
|
182 |
+
public function getOneFromSlug( $slug, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) {
|
183 |
+
return $this->get_one_by( 'slug', $slug, $return_type, $include_stats, $exclude_disabled );
|
184 |
+
}
|
185 |
|
186 |
+
public function getOne( $id, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) {
|
187 |
+
return $this->get_one_by( 'id', $id, $return_type, $include_stats, $exclude_disabled );
|
188 |
+
}
|
189 |
|
190 |
+
public function get_one_by( $field='id', $val, $return_type = OBJECT, $include_stats = false, $exclude_disabled=true ) {
|
191 |
+
global $wpdb, $prli_click, $prli_options, $prli_link_meta, $prli_blogurl;
|
192 |
|
193 |
+
$struct = PrliUtils::get_permalink_pre_slug_uri();
|
|
|
|
|
|
|
|
|
|
|
194 |
|
195 |
if($include_stats) {
|
196 |
+
$query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url, ";
|
197 |
+
|
198 |
+
$op = $prli_click->get_exclude_where_clause( ' AND' );
|
199 |
|
200 |
if($prli_options->extended_tracking != 'count') {
|
201 |
+
$query .= "
|
202 |
+
(
|
203 |
+
SELECT COUNT(*)
|
204 |
+
FROM {$prli_click->table_name} AS cl
|
205 |
+
WHERE cl.link_id = li.id
|
206 |
+
{$op}
|
207 |
+
) as clicks,
|
208 |
+
(
|
209 |
+
SELECT COUNT(*) FROM {$prli_click->table_name} AS cl
|
210 |
+
WHERE cl.link_id = li.id
|
211 |
+
AND cl.first_click <> 0
|
212 |
+
{$op}
|
213 |
+
) as uniques
|
214 |
+
";
|
215 |
}
|
216 |
else {
|
217 |
+
$query .= "
|
218 |
+
(
|
219 |
+
SELECT lm.meta_value
|
220 |
+
FROM {$prli_link_meta->table_name} AS lm
|
221 |
+
WHERE lm.meta_key=\"static-clicks\"
|
222 |
+
AND lm.link_id=li.id LIMIT 1
|
223 |
+
) as clicks,
|
224 |
+
(
|
225 |
+
SELECT lm.meta_value FROM {$prli_link_meta->table_name} AS lm
|
226 |
+
WHERE lm.meta_key=\"static-uniques\"
|
227 |
+
AND lm.link_id=li.id
|
228 |
+
LIMIT 1
|
229 |
+
) as uniques
|
230 |
+
";
|
231 |
}
|
|
|
|
|
|
|
232 |
}
|
233 |
else {
|
234 |
+
$query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url";
|
235 |
}
|
236 |
|
237 |
+
$query .= "
|
238 |
+
FROM {$this->table_name} AS li
|
239 |
+
WHERE {$field}=%s
|
240 |
+
";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
241 |
|
242 |
+
if($exclude_disabled) {
|
243 |
+
$query .= "
|
244 |
+
AND link_status='enabled'
|
245 |
+
";
|
246 |
}
|
247 |
|
248 |
+
$query = $wpdb->prepare($query, $val);
|
249 |
+
$link = $wpdb->get_row($query, $return_type);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
250 |
|
251 |
+
//get_row returns a null if not found - we don't want nulls
|
252 |
+
if(!$link) { $link = false; }
|
253 |
|
254 |
if($include_stats and $link and $prli_options->extended_tracking == 'count') {
|
255 |
$link->clicks = $prli_link_meta->get_link_meta($link->id,'static-clicks',true);
|
256 |
$link->uniques = $prli_link_meta->get_link_meta($link->id,'static-uniques',true);
|
257 |
}
|
258 |
|
|
|
|
|
|
|
|
|
|
|
259 |
return $link;
|
260 |
}
|
261 |
|
262 |
+
public function find_first_target_url($target_url) {
|
|
|
263 |
global $wpdb;
|
264 |
+
$query_str = "SELECT id FROM {$this->table_name} WHERE link_status='enabled' AND url=%s LIMIT 1";
|
265 |
$query = $wpdb->prepare($query_str,$target_url);
|
266 |
return $wpdb->get_var($query);
|
267 |
}
|
269 |
public function get_or_create_pretty_link_for_target_url( $target_url, $group=0 )
|
270 |
{
|
271 |
global $wpdb;
|
272 |
+
$query_str = "SELECT * FROM {$this->table_name} WHERE link_status='enabled' AND url=%s LIMIT 1";
|
273 |
$query = $wpdb->prepare($query_str,$target_url);
|
274 |
$pretty_link = $wpdb->get_row($query);
|
275 |
|
305 |
if(preg_match($match_str, $uri, $match_val))
|
306 |
{
|
307 |
// Match longest slug -- this is the most common
|
308 |
+
$pretty_link_params = (isset($match_val[3])?$match_val[3]:'');
|
309 |
if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) )
|
310 |
+
return compact('pretty_link_found');
|
311 |
|
312 |
// Trim down the matched link
|
313 |
$matched_link = preg_replace('#/[^/]*?$#','',$match_val[2],1);
|
321 |
{
|
322 |
$new_match_str ="#^{$subdir_str}({$struct})({$matched_link})(.*?)?$#";
|
323 |
|
324 |
+
$pretty_link_params = (isset($match_val[3])?$match_val:'');
|
325 |
if( $pretty_link_found = $this->is_pretty_link_slug( $match_val[2] ) )
|
326 |
+
return compact('pretty_link_found');
|
327 |
|
328 |
// Trim down the matched link and try again
|
329 |
$matched_link = preg_replace('#/[^/]*$#','',$match_val[2],1);
|
334 |
return false;
|
335 |
}
|
336 |
|
337 |
+
public function is_pretty_link_slug($slug) {
|
|
|
338 |
return apply_filters('prli-check-if-slug', $this->getOneFromSlug( rawurldecode($slug) ), rawurldecode($slug));
|
339 |
}
|
340 |
|
341 |
public function get_link_min( $id, $return_type = OBJECT ) {
|
342 |
global $wpdb, $prli_link_meta;
|
343 |
+
$query_str = "SELECT * FROM {$this->table_name} WHERE link_status='enabled' AND id=%d";
|
344 |
$query = $wpdb->prepare($query_str, $id);
|
345 |
$res = $wpdb->get_row($query, $return_type);
|
346 |
|
353 |
return $res;
|
354 |
}
|
355 |
|
356 |
+
public function getAll($where = '', $order_by = '', $return_type = OBJECT, $include_stats = false) {
|
357 |
+
global $wpdb, $prli_click, $prli_group, $prli_link_meta, $prli_options, $prli_utils, $prli_blogurl;
|
|
|
358 |
|
359 |
+
$struct = PrliUtils::get_permalink_pre_slug_regex();
|
360 |
+
|
361 |
+
$op = $prli_click->get_exclude_where_clause( ' AND' );
|
362 |
+
|
363 |
+
if($include_stats) {
|
364 |
+
$query = "SELECT li.*, CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url, ";
|
365 |
+
if($prli_options->extended_tracking != 'count') {
|
366 |
+
$query .= "
|
367 |
+
(
|
368 |
+
SELECT COUNT(*)
|
369 |
+
FROM {$prli_click->table_name} AS cl
|
370 |
+
WHERE cl.link_id = li.id
|
371 |
+
{$op}
|
372 |
+
) as clicks,
|
373 |
+
(
|
374 |
+
SELECT COUNT(*)
|
375 |
+
FROM {$prli_click->table_name} AS cl
|
376 |
+
WHERE cl.link_id = li.id
|
377 |
+
AND cl.first_click <> 0
|
378 |
+
{$op}
|
379 |
+
) as uniques
|
380 |
+
";
|
381 |
}
|
382 |
else
|
383 |
{
|
384 |
+
$query .= "
|
385 |
+
(
|
386 |
+
SELECT lm.meta_value
|
387 |
+
FROM {$prli_link_meta->table_name} AS lm
|
388 |
+
WHERE lm.meta_key=\"static-clicks\"
|
389 |
+
AND lm.link_id=li.id
|
390 |
+
LIMIT 1
|
391 |
+
) as clicks,
|
392 |
+
(
|
393 |
+
SELECT lm.meta_value
|
394 |
+
FROM {$prli_link_meta->table_name} AS lm
|
395 |
+
WHERE lm.meta_key=\"static-uniques\"
|
396 |
+
AND lm.link_id=li.id
|
397 |
+
LIMIT 1
|
398 |
+
) as uniques
|
399 |
+
";
|
400 |
}
|
|
|
|
|
|
|
|
|
401 |
}
|
402 |
+
else {
|
403 |
+
$query = "SELECT li.*,CONCAT(\"{$prli_blogurl}\",\"{$struct}\",li.slug) AS pretty_url ";
|
|
|
|
|
|
|
404 |
}
|
405 |
|
406 |
+
$query .= "FROM {$this->table_name} AS li
|
407 |
+
WHERE li.link_status='enabled'
|
408 |
+
" . $prli_utils->prepend_and_or_where(' AND', $where) .
|
409 |
+
$order_by;
|
|
|
|
|
|
|
|
|
|
|
|
|
410 |
|
411 |
+
return $wpdb->get_results($query, $return_type);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
412 |
}
|
413 |
|
414 |
public function generateValidSlug($num_chars = 4) {
|
426 |
|
427 |
$slug = $slug_prefix . PrliUtils::gen_random_string($num_chars);
|
428 |
|
429 |
+
// Intentionally not checking to see if link is enabled or disabled
|
430 |
$query = "SELECT slug FROM {$this->table_name}";
|
431 |
$slugs = $wpdb->get_col($query,0);
|
432 |
|
433 |
// It is highly unlikely that we'll ever see 2 identical random slugs
|
434 |
// but just in case, here's some code to prevent collisions
|
435 |
+
while(in_array($slug, $slugs) || is_wp_error(PrliUtils::is_slug_available($slug))) {
|
436 |
$slug = $slug_prefix . PrliUtils::gen_random_string($num_chars);
|
437 |
+
}
|
438 |
|
439 |
return apply_filters('prli-auto-generated-slug', $slug, $slugs, $num_chars);
|
440 |
}
|
441 |
|
442 |
+
public function get_pretty_link_url($slug, $esc_url=false) {
|
|
|
443 |
global $prli_blogurl;
|
444 |
|
445 |
$link = $this->getOneFromSlug($slug);
|
446 |
+
$pretty_link_url = $prli_blogurl . PrliUtils::get_permalink_pre_slug_uri() . $link->slug;
|
447 |
+
if($esc_url) {
|
448 |
+
$pretty_link_url = esc_url($pretty_link_url);
|
449 |
+
}
|
450 |
+
else {
|
451 |
+
$pretty_link_url = $pretty_link_url;
|
452 |
+
}
|
453 |
|
454 |
if( ( !isset($link->param_forwarding) || empty($link->param_forwarding) || $link->param_forwarding=='off' ) &&
|
455 |
( isset($link->redirect_type) && $link->redirect_type == 'pixel' ) ) {
|
456 |
+
return '<img src="'.$pretty_link_url.'" width="1" height="1" style="display: none" />';
|
457 |
}
|
458 |
else {
|
459 |
+
return $pretty_link_url;
|
460 |
}
|
461 |
}
|
462 |
|
463 |
+
/**
|
464 |
+
* Sanitize the given link options and return them
|
465 |
+
*
|
466 |
+
* @param array $values
|
467 |
+
* @return array
|
468 |
+
*/
|
469 |
+
public function sanitize($values)
|
470 |
+
{
|
471 |
+
$sanitized = array(
|
472 |
+
'redirect_type' => isset($values['redirect_type']) && is_string($values['redirect_type']) ? sanitize_key($values['redirect_type']) : '307',
|
473 |
+
'url' => isset($values['url']) && is_string($values['url']) ? esc_url_raw(trim($values['url'])) : '',
|
474 |
+
'slug' => isset($values['slug']) && is_string($values['slug']) ? sanitize_text_field($values['slug']) : '',
|
475 |
+
'name' => isset($values['name']) && is_string($values['name']) ? sanitize_text_field($values['name']) : '',
|
476 |
+
'description' => isset($values['description']) && is_string($values['description']) ? sanitize_textarea_field($values['description']) : '',
|
477 |
+
'group_id' => isset($values['group_id']) && is_numeric($values['group_id']) ? (int) $values['group_id'] : null,
|
478 |
+
'nofollow' => isset($values['nofollow']) ? 1 : 0,
|
479 |
+
'param_forwarding' => isset($values['param_forwarding']) ? 1 : 0,
|
480 |
+
'track_me' => isset($values['track_me']) ? 1 : 0,
|
481 |
+
'link_cpt_id' => isset($values['link_cpt_id']) && is_numeric($values['link_cpt_id']) ? (int) $values['link_cpt_id'] : 0
|
482 |
+
);
|
483 |
+
|
484 |
+
return $sanitized;
|
485 |
+
}
|
486 |
+
|
487 |
+
public function validate( $values , $id = null )
|
488 |
{
|
489 |
global $wpdb, $prli_utils, $prli_blogurl;
|
490 |
|
491 |
+
$values = $this->sanitize($values);
|
492 |
+
|
493 |
$errors = array();
|
494 |
if( empty($values['url']) && $values['redirect_type'] != 'pixel' ) {
|
495 |
$errors[] = __("Target URL can't be blank", 'pretty-link');
|
496 |
}
|
497 |
|
|
|
|
|
|
|
|
|
498 |
if( $values['url'] == $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri().$values['slug'] ) {
|
499 |
$errors[] = __("Target URL must be different than the Pretty Link", 'pretty-link');
|
500 |
}
|
511 |
$errors[] = __("Pretty Link slugs must not end with a slash (\"/\")", 'pretty-link');
|
512 |
}
|
513 |
|
514 |
+
$slug_is_available = PrliUtils::is_slug_available($values['slug'],$id);
|
515 |
+
if(is_wp_error($slug_is_available)) {
|
516 |
+
$errors[] = $slug_is_available->get_error_message();
|
517 |
}
|
518 |
|
519 |
return $errors;
|
531 |
|
532 |
if(empty($urls)) { return false; }
|
533 |
|
534 |
+
$decoded_urls = array_map(
|
535 |
+
function($url) {
|
536 |
+
return html_entity_decode(rawurldecode($url));
|
537 |
+
},
|
538 |
+
$urls
|
539 |
+
);
|
540 |
|
541 |
// Filter out urls that are already Pretty Links
|
542 |
$where = "IN (" . implode( ',', array_map( array($this, 'get_link_slug'), $decoded_urls ) ) . ")";
|
544 |
$query = "
|
545 |
SELECT CONCAT(%s, li.slug) AS pretty_url
|
546 |
FROM {$this->table_name} AS li
|
547 |
+
WHERE li.link_status='enabled'
|
548 |
+
AND li.slug {$where}
|
549 |
";
|
550 |
$query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri());
|
551 |
$plinks = $wpdb->get_col($query);
|
554 |
|
555 |
if(empty($decoded_urls)) { return false; }
|
556 |
|
557 |
+
$where = "IN (" . implode( ',', array_map(
|
558 |
+
function($url) {
|
559 |
+
return "\"{$url}\"";
|
560 |
+
},
|
561 |
+
$decoded_urls ) ) . ")";
|
562 |
|
563 |
$query = "
|
564 |
SELECT li.url AS target_url,
|
565 |
CONCAT(%s, li.slug) AS pretty_url
|
566 |
FROM {$this->table_name} AS li
|
567 |
+
WHERE li.link_status='enabled'
|
568 |
+
AND li.url {$where}
|
569 |
";
|
570 |
$query = $wpdb->prepare($query, $prli_blogurl.PrliUtils::get_permalink_pre_slug_uri());
|
571 |
|
599 |
$site_url = site_url();
|
600 |
return "javascript:location.href='{$site_url}/index.php?action=prli_bookmarklet&k={$prli_options->bookmarklet_auth}&target_url='+escape(location.href);";
|
601 |
}
|
602 |
+
|
603 |
+
public function get_link_from_cpt($cpt_id) {
|
604 |
+
global $wpdb;
|
605 |
+
|
606 |
+
$q = $wpdb->prepare("
|
607 |
+
SELECT id
|
608 |
+
FROM {$this->table_name}
|
609 |
+
WHERE link_cpt_id=%d
|
610 |
+
",
|
611 |
+
$cpt_id
|
612 |
+
);
|
613 |
+
|
614 |
+
$link_id = $wpdb->get_var($q);
|
615 |
+
|
616 |
+
if(empty($link_id)) {
|
617 |
+
$link_id = 0;
|
618 |
+
}
|
619 |
+
|
620 |
+
return $link_id;
|
621 |
+
}
|
622 |
+
|
623 |
+
public function update_link_cpt($link_id, $cpt_id) {
|
624 |
+
global $wpdb;
|
625 |
+
|
626 |
+
$q = $wpdb->prepare("
|
627 |
+
UPDATE {$this->table_name}
|
628 |
+
SET link_cpt_id=%d
|
629 |
+
WHERE id=%d
|
630 |
+
",
|
631 |
+
$cpt_id, $link_id
|
632 |
+
);
|
633 |
+
|
634 |
+
return $wpdb->get_var($q);
|
635 |
+
}
|
636 |
+
|
637 |
+
/** We do this directly in the database because wp_insert_post is very slow */
|
638 |
+
public function create_cpt_for_link($title, $created_at, $updated_at) {
|
639 |
+
global $wpdb;
|
640 |
+
|
641 |
+
$inserted = $wpdb->insert(
|
642 |
+
$wpdb->posts,
|
643 |
+
array(
|
644 |
+
'post_title' => stripslashes($title),
|
645 |
+
'post_type' => PrliLink::$cpt,
|
646 |
+
'post_status' => 'publish',
|
647 |
+
'post_date' => $created_at,
|
648 |
+
'post_date_gmt' => get_gmt_from_date($created_at),
|
649 |
+
'post_modified' => $updated_at,
|
650 |
+
'post_modified_gmt' => get_gmt_from_date($updated_at),
|
651 |
+
'comment_status' => 'closed',
|
652 |
+
'ping_status' => 'closed'
|
653 |
+
),
|
654 |
+
array('%s','%s','%s','%s','%s','%s','%s')
|
655 |
+
);
|
656 |
+
|
657 |
+
return $inserted ? $wpdb->insert_id : false;
|
658 |
+
}
|
659 |
+
|
660 |
+
public function update_cpt_title($cpt_id, $title) {
|
661 |
+
global $wpdb;
|
662 |
+
|
663 |
+
$q = $wpdb->prepare("
|
664 |
+
UPDATE {$wpdb->posts}
|
665 |
+
SET `post_title` = %s
|
666 |
+
WHERE `ID` = %d
|
667 |
+
AND `post_type` = %s
|
668 |
+
",
|
669 |
+
stripslashes($title),
|
670 |
+
$cpt_id,
|
671 |
+
PrliLink::$cpt
|
672 |
+
);
|
673 |
+
|
674 |
+
return $wpdb->query($q);
|
675 |
+
}
|
676 |
+
|
677 |
+
public function update_cpt_status($cpt_id, $status='publish') {
|
678 |
+
global $wpdb;
|
679 |
+
|
680 |
+
$q = $wpdb->prepare("
|
681 |
+
UPDATE {$wpdb->posts}
|
682 |
+
SET `post_status` = %s
|
683 |
+
WHERE `ID` = %d
|
684 |
+
AND `post_type` = %s
|
685 |
+
",
|
686 |
+
$status,
|
687 |
+
$cpt_id,
|
688 |
+
PrliLink::$cpt
|
689 |
+
);
|
690 |
+
|
691 |
+
return $wpdb->query($q);
|
692 |
+
}
|
693 |
+
|
694 |
+
public function update_cpt_post_date($cpt_id, $now=false) {
|
695 |
+
global $wpdb;
|
696 |
+
|
697 |
+
if(empty($now)) {
|
698 |
+
$now = current_time('mysql');
|
699 |
+
}
|
700 |
+
|
701 |
+
$wpdb->update(
|
702 |
+
$wpdb->posts,
|
703 |
+
array(
|
704 |
+
'post_date' => $now,
|
705 |
+
'post_date_gmt' => get_gmt_from_date($now)
|
706 |
+
),
|
707 |
+
array(
|
708 |
+
'ID' => $cpt_id,
|
709 |
+
'post_type' => PrliLink::$cpt
|
710 |
+
),
|
711 |
+
array('%s', '%s'),
|
712 |
+
array('%d', '%s')
|
713 |
+
);
|
714 |
+
}
|
715 |
+
|
716 |
+
public function update_cpt_post_modified($cpt_id, $now=false) {
|
717 |
+
global $wpdb;
|
718 |
+
|
719 |
+
if(empty($now)) {
|
720 |
+
$now = current_time('mysql');
|
721 |
+
}
|
722 |
+
|
723 |
+
$wpdb->update(
|
724 |
+
$wpdb->posts,
|
725 |
+
array(
|
726 |
+
'post_modified' => $now,
|
727 |
+
'post_modified_gmt' => get_gmt_from_date($now)
|
728 |
+
),
|
729 |
+
array(
|
730 |
+
'ID' => $cpt_id,
|
731 |
+
'post_type' => PrliLink::$cpt
|
732 |
+
),
|
733 |
+
array('%s', '%s'),
|
734 |
+
array('%d', '%s')
|
735 |
+
);
|
736 |
+
}
|
737 |
+
|
738 |
+
/** For legacy handling of groups filter */
|
739 |
+
public function get_all_legacy_groups() {
|
740 |
+
global $wpdb;
|
741 |
+
|
742 |
+
$prli_db = new PrliDb();
|
743 |
+
|
744 |
+
$groups_table = "{$wpdb->prefix}prli_groups";
|
745 |
+
$groups = array();
|
746 |
+
|
747 |
+
if($prli_db->table_exists($groups_table)) {
|
748 |
+
$q = "SELECT * FROM {$groups_table} ORDER BY `name`";
|
749 |
+
$groups = $wpdb->get_results($q);
|
750 |
+
}
|
751 |
+
|
752 |
+
return $groups;
|
753 |
+
}
|
754 |
}
|
755 |
|
app/models/PrliOptions.php
CHANGED
@@ -196,7 +196,7 @@ class PrliOptions
|
|
196 |
else
|
197 |
$this->prettybar_color = '';
|
198 |
}
|
199 |
-
else if(!preg_match('/^#/',$this->prettybar_color)) {
|
200 |
$this->prettybar_color = '#' . $this->prettybar_color;
|
201 |
}
|
202 |
|
@@ -208,7 +208,7 @@ class PrliOptions
|
|
208 |
else
|
209 |
$this->prettybar_text_color = '000000';
|
210 |
}
|
211 |
-
else if(!preg_match('/^#/',$this->prettybar_text_color)) {
|
212 |
$this->prettybar_text_color = '#' . $this->prettybar_text_color;
|
213 |
}
|
214 |
|
@@ -220,7 +220,7 @@ class PrliOptions
|
|
220 |
else
|
221 |
$this->prettybar_link_color = '0000ee';
|
222 |
}
|
223 |
-
else if(!preg_match('/^#/',$this->prettybar_link_color)) {
|
224 |
$this->prettybar_link_color = '#' . $this->prettybar_link_color;
|
225 |
}
|
226 |
|
@@ -232,7 +232,7 @@ class PrliOptions
|
|
232 |
else
|
233 |
$this->prettybar_hover_color = 'ababab';
|
234 |
}
|
235 |
-
else if(!preg_match('/^#/',$this->prettybar_hover_color)) {
|
236 |
$this->prettybar_hover_color = '#' . $this->prettybar_hover_color;
|
237 |
}
|
238 |
|
@@ -244,7 +244,7 @@ class PrliOptions
|
|
244 |
else
|
245 |
$this->prettybar_visited_color = '551a8b';
|
246 |
}
|
247 |
-
else if(!preg_match('/^#/',$this->prettybar_visited_color)) {
|
248 |
$this->prettybar_visited_color = '#' . $this->prettybar_visited_color;
|
249 |
}
|
250 |
|
196 |
else
|
197 |
$this->prettybar_color = '';
|
198 |
}
|
199 |
+
else if($this->prettybar_color && !preg_match('/^#/',$this->prettybar_color)) {
|
200 |
$this->prettybar_color = '#' . $this->prettybar_color;
|
201 |
}
|
202 |
|
208 |
else
|
209 |
$this->prettybar_text_color = '000000';
|
210 |
}
|
211 |
+
else if($this->prettybar_text_color && !preg_match('/^#/',$this->prettybar_text_color)) {
|
212 |
$this->prettybar_text_color = '#' . $this->prettybar_text_color;
|
213 |
}
|
214 |
|
220 |
else
|
221 |
$this->prettybar_link_color = '0000ee';
|
222 |
}
|
223 |
+
else if($this->prettybar_link_color && !preg_match('/^#/',$this->prettybar_link_color)) {
|
224 |
$this->prettybar_link_color = '#' . $this->prettybar_link_color;
|
225 |
}
|
226 |
|
232 |
else
|
233 |
$this->prettybar_hover_color = 'ababab';
|
234 |
}
|
235 |
+
else if($this->prettybar_hover_color && !preg_match('/^#/',$this->prettybar_hover_color)) {
|
236 |
$this->prettybar_hover_color = '#' . $this->prettybar_hover_color;
|
237 |
}
|
238 |
|
244 |
else
|
245 |
$this->prettybar_visited_color = '551a8b';
|
246 |
}
|
247 |
+
else if($this->prettybar_visited_color && !preg_match('/^#/',$this->prettybar_visited_color)) {
|
248 |
$this->prettybar_visited_color = '#' . $this->prettybar_visited_color;
|
249 |
}
|
250 |
|
app/models/PrliUtils.php
CHANGED
@@ -83,92 +83,64 @@ class PrliUtils {
|
|
83 |
}
|
84 |
}
|
85 |
|
86 |
-
public static function get_url_from_slug( $slug ) {
|
87 |
-
global $prli_blogurl;
|
88 |
-
return $prli_blogurl . self::get_permalink_pre_slug_uri() . $slug;
|
89 |
-
}
|
90 |
-
|
91 |
public static function debug_log($message) {
|
92 |
if(defined('WP_DEBUG') && WP_DEBUG) {
|
93 |
error_log(sprintf(__('*** Pretty Links Debug: %s', 'pretty-link'), $message));
|
94 |
}
|
95 |
}
|
96 |
|
97 |
-
public static function
|
|
|
98 |
global $wp_rewrite, $prli_link;
|
99 |
-
$url = self::
|
100 |
|
101 |
if(empty($slug)) {
|
102 |
-
|
103 |
-
|
|
|
104 |
}
|
105 |
|
106 |
// Check Filepaths
|
107 |
$filepath = ABSPATH . $slug;
|
108 |
if( file_exists($filepath) ) {
|
109 |
-
|
110 |
-
|
|
|
111 |
}
|
112 |
|
113 |
// Check other Pretty Links
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
}
|
121 |
-
else {
|
122 |
-
$this_link = $prli_link->getOne( $id );
|
123 |
-
$slug_link = $prli_link->getOneFromSlug( $slug );
|
124 |
|
125 |
-
|
126 |
-
|
127 |
-
return true;
|
128 |
-
}
|
129 |
-
}
|
130 |
|
131 |
-
|
132 |
-
$rules = $wp_rewrite->wp_rewrite_rules();
|
133 |
-
//self::debug_log('SlugIsAvailable: Rewrite Rules: ' . self::object_to_string($rules));
|
134 |
-
//unset($rules['([^/]+)(/[0-9]+)?/?$']); //Pretty sure this may nullify all the work below, but it's causing too many false positives somehow
|
135 |
-
|
136 |
-
foreach( $rules as $pattern => $query ) {
|
137 |
-
// just looking for the beginning of the pattern
|
138 |
-
if(isset($pattern[0]) && $pattern[0] != '^') { $pattern = '^' . $pattern; }
|
139 |
-
|
140 |
-
if( preg_match( "!{$pattern}!", $slug, $matches ) ) {
|
141 |
-
// Got a match.
|
142 |
-
// Trim the query of everything up to the '?'. (copied from url_to_postid)
|
143 |
-
$query = preg_replace("!^.+\?!", '', $query);
|
144 |
-
|
145 |
-
// Substitute the substring matches into the query. (copied from url_to_postid)
|
146 |
-
$query = addslashes(WP_MatchesMapRegex::apply($query, $matches));
|
147 |
-
|
148 |
-
// Filter out non-public query vars (copied from url_to_postid)
|
149 |
-
global $wp;
|
150 |
-
parse_str( $query, $query_vars );
|
151 |
-
$query = array();
|
152 |
-
|
153 |
-
foreach ( (array) $query_vars as $key => $value ) {
|
154 |
-
if ( in_array( $key, $wp->public_query_vars ) ) {
|
155 |
-
$query[$key] = $value;
|
156 |
-
if ( isset( $post_type_query_vars[$key] ) ) {
|
157 |
-
$query['post_type'] = $post_type_query_vars[$key];
|
158 |
-
$query['name'] = $value;
|
159 |
-
}
|
160 |
-
}
|
161 |
-
}
|
162 |
|
163 |
-
|
164 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
self::debug_log(self::object_to_string($wpq->post));
|
170 |
-
return false;
|
171 |
-
}
|
172 |
}
|
173 |
}
|
174 |
|
@@ -251,7 +223,16 @@ class PrliUtils {
|
|
251 |
public function track_link($slug,$values) {
|
252 |
global $wpdb, $prli_click, $prli_options, $prli_link, $plp_update;
|
253 |
|
254 |
-
$query =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
255 |
$pretty_link = $wpdb->get_row($query);
|
256 |
$pretty_link_target = apply_filters( 'prli_target_url', array( 'url' => $pretty_link->url, 'link_id' => $pretty_link->id, 'redirect_type' => $pretty_link->redirect_type ) );
|
257 |
$prli_edition = ucwords(preg_replace('/-/', ' ', PRLI_EDITION));
|
@@ -543,163 +524,6 @@ class PrliUtils {
|
|
543 |
// around in case you want to re-install it at some point
|
544 |
}
|
545 |
|
546 |
-
public function should_install_pro_db() {
|
547 |
-
global $plp_db_version;
|
548 |
-
$old_pro_db_version = get_option('prlipro_db_version');
|
549 |
-
|
550 |
-
if($plp_db_version != $old_pro_db_version) { return true; }
|
551 |
-
|
552 |
-
return false;
|
553 |
-
}
|
554 |
-
|
555 |
-
public function install_pro_db() {
|
556 |
-
global $wpdb, $plp_db_version;
|
557 |
-
|
558 |
-
$upgrade_path = ABSPATH . 'wp-admin/includes/upgrade.php';
|
559 |
-
require_once($upgrade_path);
|
560 |
-
|
561 |
-
// Pretty Links Pro Tables
|
562 |
-
$keywords_table = "{$wpdb->prefix}prli_keywords";
|
563 |
-
$post_keywords_table = "{$wpdb->prefix}prli_post_keywords";
|
564 |
-
$post_urls_table = "{$wpdb->prefix}prli_post_urls";
|
565 |
-
$reports_table = "{$wpdb->prefix}prli_reports";
|
566 |
-
$report_links_table = "{$wpdb->prefix}prli_report_links";
|
567 |
-
$link_rotations_table = "{$wpdb->prefix}prli_link_rotations";
|
568 |
-
$clicks_rotations_table = "{$wpdb->prefix}prli_clicks_rotations";
|
569 |
-
|
570 |
-
// This was introduced in WordPress 3.5
|
571 |
-
// $char_col = $wpdb->get_charset_collate(); //This doesn't work for most non english setups
|
572 |
-
$char_col = "";
|
573 |
-
$collation = $wpdb->get_row("SHOW FULL COLUMNS FROM {$wpdb->posts} WHERE field = 'post_content'");
|
574 |
-
|
575 |
-
if(isset($collation->Collation)) {
|
576 |
-
$charset = explode('_', $collation->Collation);
|
577 |
-
|
578 |
-
if(is_array($charset) && count($charset) > 1) {
|
579 |
-
$charset = $charset[0]; //Get the charset from the collation
|
580 |
-
$char_col = "DEFAULT CHARACTER SET {$charset} COLLATE {$collation->Collation}";
|
581 |
-
}
|
582 |
-
}
|
583 |
-
|
584 |
-
//Fine we'll try it your way this time
|
585 |
-
if(empty($char_col)) { $char_col = $wpdb->get_charset_collate(); }
|
586 |
-
|
587 |
-
//Fix for large indexes
|
588 |
-
$wpdb->query("SET GLOBAL innodb_large_prefix=1");
|
589 |
-
|
590 |
-
/* Create/Upgrade Keywords Table */
|
591 |
-
$sql = "
|
592 |
-
CREATE TABLE {$keywords_table} (
|
593 |
-
id int(11) NOT NULL auto_increment,
|
594 |
-
text varchar(255) NOT NULL,
|
595 |
-
link_id int(11) NOT NULL,
|
596 |
-
created_at datetime NOT NULL,
|
597 |
-
PRIMARY KEY (id),
|
598 |
-
KEY link_id (link_id),
|
599 |
-
KEY text (text)
|
600 |
-
) {$char_col};
|
601 |
-
";
|
602 |
-
|
603 |
-
dbDelta($sql);
|
604 |
-
|
605 |
-
/* Create/Upgrade Keywords Table */
|
606 |
-
$sql = "
|
607 |
-
CREATE TABLE {$post_keywords_table} (
|
608 |
-
id int(11) NOT NULL auto_increment,
|
609 |
-
keyword_id int(11) NOT NULL,
|
610 |
-
post_id int(11) NOT NULL,
|
611 |
-
PRIMARY KEY (id),
|
612 |
-
KEY keyword_id (keyword_id),
|
613 |
-
KEY post_id (post_id),
|
614 |
-
UNIQUE KEY post_keyword_index (keyword_id,post_id)
|
615 |
-
) {$char_col};
|
616 |
-
";
|
617 |
-
|
618 |
-
dbDelta($sql);
|
619 |
-
|
620 |
-
/* Create/Upgrade URLs Table */
|
621 |
-
$sql = "
|
622 |
-
CREATE TABLE {$post_urls_table} (
|
623 |
-
id int(11) NOT NULL auto_increment,
|
624 |
-
url_id int(11) NOT NULL,
|
625 |
-
post_id int(11) NOT NULL,
|
626 |
-
PRIMARY KEY (id),
|
627 |
-
KEY url_id (url_id),
|
628 |
-
KEY post_id (post_id),
|
629 |
-
UNIQUE KEY post_url_index (url_id,post_id)
|
630 |
-
) {$char_col};
|
631 |
-
";
|
632 |
-
|
633 |
-
dbDelta($sql);
|
634 |
-
|
635 |
-
/* Create/Upgrade Reports Table */
|
636 |
-
$sql = "
|
637 |
-
CREATE TABLE {$reports_table} (
|
638 |
-
id int(11) NOT NULL auto_increment,
|
639 |
-
name varchar(255) NOT NULL,
|
640 |
-
goal_link_id int(11) default NULL,
|
641 |
-
created_at datetime NOT NULL,
|
642 |
-
PRIMARY KEY (id),
|
643 |
-
KEY goal_link_id (goal_link_id),
|
644 |
-
KEY name (name)
|
645 |
-
) {$char_col};
|
646 |
-
";
|
647 |
-
|
648 |
-
dbDelta($sql);
|
649 |
-
|
650 |
-
/* Create/Upgrade Reports Table */
|
651 |
-
$sql = "
|
652 |
-
CREATE TABLE {$report_links_table} (
|
653 |
-
id int(11) NOT NULL auto_increment,
|
654 |
-
report_id int(11) NOT NULL,
|
655 |
-
link_id int(11) NOT NULL,
|
656 |
-
created_at datetime NOT NULL,
|
657 |
-
PRIMARY KEY (id),
|
658 |
-
KEY report_id (report_id),
|
659 |
-
KEY link_id (link_id)
|
660 |
-
) {$char_col};
|
661 |
-
";
|
662 |
-
|
663 |
-
dbDelta($sql);
|
664 |
-
|
665 |
-
/* Create/Upgrade Link Rotations Table */
|
666 |
-
$sql = "
|
667 |
-
CREATE TABLE {$link_rotations_table} (
|
668 |
-
id int(11) NOT NULL auto_increment,
|
669 |
-
url varchar(255) default NULL,
|
670 |
-
weight int(11) default 0,
|
671 |
-
r_index int(11) default 0,
|
672 |
-
link_id int(11) NOT NULL,
|
673 |
-
created_at datetime NOT NULL,
|
674 |
-
PRIMARY KEY (id),
|
675 |
-
KEY link_id (link_id),
|
676 |
-
KEY url (url),
|
677 |
-
KEY weight (weight),
|
678 |
-
KEY r_index (r_index)
|
679 |
-
) {$char_col};
|
680 |
-
";
|
681 |
-
|
682 |
-
dbDelta($sql);
|
683 |
-
|
684 |
-
/* Create/Upgrade Clicks / Rotations Table */
|
685 |
-
$sql = "
|
686 |
-
CREATE TABLE {$clicks_rotations_table} (
|
687 |
-
id int(11) NOT NULL auto_increment,
|
688 |
-
click_id int(11) NOT NULL,
|
689 |
-
link_id int(11) NOT NULL,
|
690 |
-
url text NOT NULL,
|
691 |
-
PRIMARY KEY (id),
|
692 |
-
KEY click_id (click_id),
|
693 |
-
KEY link_id (link_id)
|
694 |
-
) {$char_col};
|
695 |
-
";
|
696 |
-
|
697 |
-
dbDelta($sql);
|
698 |
-
|
699 |
-
/***** SAVE DB VERSION *****/
|
700 |
-
update_option('prlipro_db_version', $plp_db_version);
|
701 |
-
}
|
702 |
-
|
703 |
// be careful with this one -- I use it to forceably reinstall pretty link pro
|
704 |
public function delete_dir($dir) {
|
705 |
if (!file_exists($dir)) {
|
@@ -793,8 +617,7 @@ class PrliUtils {
|
|
793 |
|
794 |
if(!empty($char_col))
|
795 |
{
|
796 |
-
$prli_table_names = array( "{$wpdb->prefix}
|
797 |
-
"{$wpdb->prefix}prli_clicks",
|
798 |
"{$wpdb->prefix}prli_links",
|
799 |
"{$wpdb->prefix}prli_link_metas",
|
800 |
"{$wpdb->prefix}prli_tweets",
|
@@ -804,6 +627,11 @@ class PrliUtils {
|
|
804 |
"{$wpdb->prefix}prli_link_rotations",
|
805 |
"{$wpdb->prefix}prli_clicks_rotations" );
|
806 |
|
|
|
|
|
|
|
|
|
|
|
807 |
foreach($prli_table_names as $prli_table_name)
|
808 |
{
|
809 |
$query = "ALTER TABLE {$prli_table_name} {$char_col}";
|
@@ -869,6 +697,47 @@ class PrliUtils {
|
|
869 |
$query = $wpdb->prepare($query,'prli-url-aliases');
|
870 |
$results = $wpdb->query($query);
|
871 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
872 |
}
|
873 |
|
874 |
public function this_is_a_robot($browser_ua,$browsecap,$header='')
|
@@ -1006,6 +875,7 @@ class PrliUtils {
|
|
1006 |
return $string;
|
1007 |
}
|
1008 |
|
|
|
1009 |
public static function get_page_title($url, $slug='') {
|
1010 |
$title = '';
|
1011 |
$wp_http = new WP_Http;
|
@@ -1019,7 +889,7 @@ class PrliUtils {
|
|
1019 |
|
1020 |
// Look for <title>(.*?)</title> in the text
|
1021 |
if($data and preg_match('#<title>[\s\n\r]*?(.*?)[\s\n\r]*?</title>#im', $data, $matches)) {
|
1022 |
-
$title = trim($matches[1]);
|
1023 |
}
|
1024 |
|
1025 |
//Attempt to covert cyrillic and other weird shiz to UTF-8 - if it fails we'll just return the slug next
|
@@ -1042,13 +912,16 @@ class PrliUtils {
|
|
1042 |
|
1043 |
public static function is_url($str) {
|
1044 |
//For now we're not going to validate this - there's too many possible protocols/schemes to validate now
|
1045 |
-
return true;
|
1046 |
|
1047 |
// This uses the @diegoperini URL matching regex adapted for PHP from https://gist.github.com/dperini/729294
|
1048 |
-
//
|
1049 |
|
1050 |
//Let's see how PHP's built in validator does instead?
|
1051 |
//return apply_filters('prli_is_valid_url', (filter_var($str, FILTER_VALIDATE_URL) !== FALSE), $str);
|
|
|
|
|
|
|
|
|
1052 |
}
|
1053 |
|
1054 |
public static function is_email($str) {
|
@@ -1059,15 +932,15 @@ class PrliUtils {
|
|
1059 |
return preg_match('/\(?\d{3}\)?[- ]\d{3}-\d{4}/', $str);
|
1060 |
}
|
1061 |
|
1062 |
-
public static function
|
1063 |
-
global $prli_blogurl;
|
1064 |
-
|
1065 |
$struct = PrliUtils::get_permalink_pre_slug_uri();
|
1066 |
|
1067 |
-
if(isset($
|
1068 |
-
|
1069 |
-
|
1070 |
-
|
|
|
|
|
1071 |
}
|
1072 |
|
1073 |
public static function browser_image($browser) {
|
@@ -1229,9 +1102,13 @@ class PrliUtils {
|
|
1229 |
|
1230 |
// Set the default message
|
1231 |
if(empty($message)) {
|
1232 |
-
$message = sprintf(
|
1233 |
-
|
1234 |
-
|
|
|
|
|
|
|
|
|
1235 |
}
|
1236 |
|
1237 |
//Pro users don't want to be spammed
|
@@ -1387,5 +1264,45 @@ class PrliUtils {
|
|
1387 |
public static function db_now($format='Y-m-d H:i:s') {
|
1388 |
return self::ts_to_mysql_date(time(),$format);
|
1389 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1390 |
}
|
1391 |
|
83 |
}
|
84 |
}
|
85 |
|
|
|
|
|
|
|
|
|
|
|
86 |
public static function debug_log($message) {
|
87 |
if(defined('WP_DEBUG') && WP_DEBUG) {
|
88 |
error_log(sprintf(__('*** Pretty Links Debug: %s', 'pretty-link'), $message));
|
89 |
}
|
90 |
}
|
91 |
|
92 |
+
public static function is_slug_available( $slug, $id = '' ) {
|
93 |
+
self::debug_log("*** In Slug is available for {$slug} & id=[{$id}]");
|
94 |
global $wp_rewrite, $prli_link;
|
95 |
+
$url = self::get_pretty_link_url($slug);
|
96 |
|
97 |
if(empty($slug)) {
|
98 |
+
$error = __('The Slug can\'t be empty', 'pretty-link');
|
99 |
+
self::debug_log("slug_empty: {$error}");
|
100 |
+
return new WP_Error('slug_empty', $error);
|
101 |
}
|
102 |
|
103 |
// Check Filepaths
|
104 |
$filepath = ABSPATH . $slug;
|
105 |
if( file_exists($filepath) ) {
|
106 |
+
$error = sprintf(__('There\'s a file this slug conflicts with: %s', 'pretty-link'), $filepath);
|
107 |
+
self::debug_log("slug_not_available: {$error}");
|
108 |
+
return new WP_Error('slug_not_available', $error);
|
109 |
}
|
110 |
|
111 |
// Check other Pretty Links
|
112 |
+
$slug_link = $prli_link->getOneFromSlug( $slug );
|
113 |
+
self::debug_log(print_r($slug_link,true));
|
114 |
+
if(!empty($slug_link) && ($id != $slug_link->id)) {
|
115 |
+
$error = sprintf(__('This Pretty Link Slug is already taken. There\'s already another pretty link with this slug: %s', 'pretty-link'), $slug);
|
116 |
+
self::debug_log("slug_not_available: {$error}");
|
117 |
+
return new WP_Error('slug_not_available', $error);
|
118 |
}
|
|
|
|
|
|
|
119 |
|
120 |
+
// Check any other URLs
|
121 |
+
$resp = wp_remote_head($url);
|
|
|
|
|
|
|
122 |
|
123 |
+
self::debug_log("****** wp_remote_head returned: " . print_r($resp, true));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
|
125 |
+
if(!is_wp_error($resp)) {
|
126 |
+
if($resp['headers'] instanceof Requests_Utility_CaseInsensitiveDictionary) {
|
127 |
+
$resp_headers = $resp['headers']->getAll();
|
128 |
+
}
|
129 |
+
else {
|
130 |
+
$resp_headers = $resp['headers'];
|
131 |
+
}
|
132 |
+
if($resp['response']['code'] == 200) {
|
133 |
+
$error = sprintf(__('This Pretty Link Slug is already taken. The path resolved to URL: %s', 'pretty-link'), $url);
|
134 |
+
}
|
135 |
+
else if(in_array($resp['response']['code'], array(301,302,307)) &&
|
136 |
+
isset($resp_headers['location']) &&
|
137 |
+
preg_match('!^' . preg_quote($url,'!') . '/?$!', $resp_headers['location'])) {
|
138 |
+
$error = sprintf(__('This Pretty Link Slug is already taken. The path redirected to URL: %s', 'pretty-link'), $resp_headers['location']);
|
139 |
+
}
|
140 |
|
141 |
+
if(isset($error)) {
|
142 |
+
self::debug_log("slug_not_available: {$error}");
|
143 |
+
return new WP_Error('slug_not_available', $error);
|
|
|
|
|
|
|
144 |
}
|
145 |
}
|
146 |
|
223 |
public function track_link($slug,$values) {
|
224 |
global $wpdb, $prli_click, $prli_options, $prli_link, $plp_update;
|
225 |
|
226 |
+
$query = $wpdb->prepare("
|
227 |
+
SELECT *
|
228 |
+
FROM {$prli_link->table_name}
|
229 |
+
WHERE slug=%s
|
230 |
+
AND link_status='enabled'
|
231 |
+
LIMIT 1
|
232 |
+
",
|
233 |
+
$slug
|
234 |
+
);
|
235 |
+
|
236 |
$pretty_link = $wpdb->get_row($query);
|
237 |
$pretty_link_target = apply_filters( 'prli_target_url', array( 'url' => $pretty_link->url, 'link_id' => $pretty_link->id, 'redirect_type' => $pretty_link->redirect_type ) );
|
238 |
$prli_edition = ucwords(preg_replace('/-/', ' ', PRLI_EDITION));
|
524 |
// around in case you want to re-install it at some point
|
525 |
}
|
526 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
527 |
// be careful with this one -- I use it to forceably reinstall pretty link pro
|
528 |
public function delete_dir($dir) {
|
529 |
if (!file_exists($dir)) {
|
617 |
|
618 |
if(!empty($char_col))
|
619 |
{
|
620 |
+
$prli_table_names = array( "{$wpdb->prefix}prli_clicks",
|
|
|
621 |
"{$wpdb->prefix}prli_links",
|
622 |
"{$wpdb->prefix}prli_link_metas",
|
623 |
"{$wpdb->prefix}prli_tweets",
|
627 |
"{$wpdb->prefix}prli_link_rotations",
|
628 |
"{$wpdb->prefix}prli_clicks_rotations" );
|
629 |
|
630 |
+
$prli_db = new PrliDb();
|
631 |
+
if ($prli_db->table_exists("{$wpdb->prefix}prli_groups")) {
|
632 |
+
$prli_table_names[] = "{$wpdb->prefix}prli_groups";
|
633 |
+
}
|
634 |
+
|
635 |
foreach($prli_table_names as $prli_table_name)
|
636 |
{
|
637 |
$query = "ALTER TABLE {$prli_table_name} {$char_col}";
|
697 |
$query = $wpdb->prepare($query,'prli-url-aliases');
|
698 |
$results = $wpdb->query($query);
|
699 |
}
|
700 |
+
|
701 |
+
if($db_version && $db_version < 19) {
|
702 |
+
// Get 1000 links at a time
|
703 |
+
$q = "
|
704 |
+
SELECT *
|
705 |
+
FROM {$prli_link->table_name}
|
706 |
+
WHERE link_cpt_id IS NULL
|
707 |
+
OR link_cpt_id <= 0
|
708 |
+
ORDER BY created_at DESC
|
709 |
+
LIMIT 1000
|
710 |
+
";
|
711 |
+
|
712 |
+
$count_q = "
|
713 |
+
SELECT COUNT(*)
|
714 |
+
FROM {$prli_link->table_name}
|
715 |
+
WHERE link_cpt_id IS NULL
|
716 |
+
OR link_cpt_id <= 0
|
717 |
+
";
|
718 |
+
|
719 |
+
while(0 < ($count = $wpdb->get_var($count_q))) {
|
720 |
+
|
721 |
+
$links = $wpdb->get_results($q);
|
722 |
+
|
723 |
+
// Loop through Links in Link Table
|
724 |
+
foreach($links as $link) {
|
725 |
+
// If there's already a CPT associated then continue
|
726 |
+
if($link->link_cpt_id > 0) {
|
727 |
+
continue;
|
728 |
+
}
|
729 |
+
|
730 |
+
$cpt_id = $prli_link->create_cpt_for_link($link->name, $link->created_at, $link->updated_at);
|
731 |
+
|
732 |
+
if($cpt_id == false) {
|
733 |
+
PrliUtils::debug_log("Unable to create CPT Post for Link (Migration)");
|
734 |
+
}
|
735 |
+
|
736 |
+
// update the link db record with the Link CPT ID
|
737 |
+
$prli_link->update_link_cpt($link->id, $cpt_id);
|
738 |
+
}
|
739 |
+
}
|
740 |
+
}
|
741 |
}
|
742 |
|
743 |
public function this_is_a_robot($browser_ua,$browsecap,$header='')
|
875 |
return $string;
|
876 |
}
|
877 |
|
878 |
+
/** Attempt to get a page title from the target url */
|
879 |
public static function get_page_title($url, $slug='') {
|
880 |
$title = '';
|
881 |
$wp_http = new WP_Http;
|
889 |
|
890 |
// Look for <title>(.*?)</title> in the text
|
891 |
if($data and preg_match('#<title>[\s\n\r]*?(.*?)[\s\n\r]*?</title>#im', $data, $matches)) {
|
892 |
+
$title = html_entity_decode(trim($matches[1]));
|
893 |
}
|
894 |
|
895 |
//Attempt to covert cyrillic and other weird shiz to UTF-8 - if it fails we'll just return the slug next
|
912 |
|
913 |
public static function is_url($str) {
|
914 |
//For now we're not going to validate this - there's too many possible protocols/schemes to validate now
|
|
|
915 |
|
916 |
// This uses the @diegoperini URL matching regex adapted for PHP from https://gist.github.com/dperini/729294
|
917 |
+
//return apply_filters('prli_is_valid_url', preg_match('%^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\x{00a1}-\x{ffff}][a-z0-9\x{00a1}-\x{ffff}_-]{0,62})?[a-z0-9\x{00a1}-\x{ffff}]\.)+(?:[a-z\x{00a1}-\x{ffff}]{2,})\.?))(?::\d{2,5})?(?:[/?#]\S*)?$%iuS', $str));
|
918 |
|
919 |
//Let's see how PHP's built in validator does instead?
|
920 |
//return apply_filters('prli_is_valid_url', (filter_var($str, FILTER_VALIDATE_URL) !== FALSE), $str);
|
921 |
+
//
|
922 |
+
|
923 |
+
// Let's just make sure there's a mailto: or // somewhere here
|
924 |
+
return apply_filters('prli_is_valid_url', preg_match('%(^mailto:|//)%', $str));
|
925 |
}
|
926 |
|
927 |
public static function is_email($str) {
|
932 |
return preg_match('/\(?\d{3}\)?[- ]\d{3}-\d{4}/', $str);
|
933 |
}
|
934 |
|
935 |
+
public static function get_pretty_link_url($slug, $path_only=false) {
|
|
|
|
|
936 |
$struct = PrliUtils::get_permalink_pre_slug_uri();
|
937 |
|
938 |
+
if(isset($slug)) {
|
939 |
+
$path = "{$struct}{$slug}";
|
940 |
+
return ($path_only ? $path : home_url($path));
|
941 |
+
}
|
942 |
+
|
943 |
+
return false;
|
944 |
}
|
945 |
|
946 |
public static function browser_image($browser) {
|
1102 |
|
1103 |
// Set the default message
|
1104 |
if(empty($message)) {
|
1105 |
+
$message = sprintf(
|
1106 |
+
// translators: %1$s: open link tag, %2$s: close link tag, %3$s: br tag
|
1107 |
+
esc_html__( 'Get started by %1$sadding a URL%2$s that you want to turn into a pretty link.%3$sCome back to see how many times it was clicked.' , 'pretty-link' ),
|
1108 |
+
'<a href="' . esc_url(admin_url( 'admin.php?page=add-new-pretty-link' )) . '">',
|
1109 |
+
'</a>',
|
1110 |
+
'<br>'
|
1111 |
+
);
|
1112 |
}
|
1113 |
|
1114 |
//Pro users don't want to be spammed
|
1264 |
public static function db_now($format='Y-m-d H:i:s') {
|
1265 |
return self::ts_to_mysql_date(time(),$format);
|
1266 |
}
|
1267 |
+
|
1268 |
+
public static function is_post_request() {
|
1269 |
+
if(isset($_SERVER['REQUEST_METHOD'])) {
|
1270 |
+
return (strtolower($_SERVER['REQUEST_METHOD']) == 'post');
|
1271 |
+
}
|
1272 |
+
else {
|
1273 |
+
return (isset($_POST) && !empty($_POST));
|
1274 |
+
}
|
1275 |
+
}
|
1276 |
+
|
1277 |
+
public static function is_get_request() {
|
1278 |
+
if(isset($_SERVER['REQUEST_METHOD'])) {
|
1279 |
+
return (strtolower($_SERVER['REQUEST_METHOD']) == 'get');
|
1280 |
+
}
|
1281 |
+
else {
|
1282 |
+
return (!isset($_GET) || empty($_GET));
|
1283 |
+
}
|
1284 |
+
}
|
1285 |
+
|
1286 |
+
/**
|
1287 |
+
* Sanitize the HTML in the given string
|
1288 |
+
*
|
1289 |
+
* @param string $value
|
1290 |
+
* @return string
|
1291 |
+
*/
|
1292 |
+
public static function sanitize_html($value) {
|
1293 |
+
return current_user_can('unfiltered_html') ? $value : wp_kses_post($value);
|
1294 |
+
}
|
1295 |
+
|
1296 |
+
/**
|
1297 |
+
* Ensure the given number $x is between $min and $max inclusive
|
1298 |
+
*
|
1299 |
+
* @param mixed $x
|
1300 |
+
* @param mixed $min
|
1301 |
+
* @param mixed $max
|
1302 |
+
* @return mixed
|
1303 |
+
*/
|
1304 |
+
public static function clamp($x, $min, $max) {
|
1305 |
+
return min(max($x, $min), $max);
|
1306 |
+
}
|
1307 |
}
|
1308 |
|
app/views/admin/errors.php
CHANGED
@@ -4,13 +4,13 @@
|
|
4 |
<div class="error notice is-dismissible below-h2">
|
5 |
<ul>
|
6 |
<?php foreach($errors as $error): ?>
|
7 |
-
<li><strong><?php
|
8 |
<?php endforeach; ?>
|
9 |
</ul>
|
10 |
</div>
|
11 |
<?php endif; ?>
|
12 |
<?php if( isset($message) and !empty($message) ): ?>
|
13 |
<div class="updated notice notice-success is-dismissible">
|
14 |
-
<p><?php echo $message; ?></p>
|
15 |
</div>
|
16 |
<?php endif; ?>
|
4 |
<div class="error notice is-dismissible below-h2">
|
5 |
<ul>
|
6 |
<?php foreach($errors as $error): ?>
|
7 |
+
<li><strong><?php esc_html_e('ERROR', 'pretty-link'); ?></strong>: <?php echo esc_html($error); ?></li>
|
8 |
<?php endforeach; ?>
|
9 |
</ul>
|
10 |
</div>
|
11 |
<?php endif; ?>
|
12 |
<?php if( isset($message) and !empty($message) ): ?>
|
13 |
<div class="updated notice notice-success is-dismissible">
|
14 |
+
<p><?php echo esc_html($message); ?></p>
|
15 |
</div>
|
16 |
<?php endif; ?>
|
app/views/admin/onboarding/update.php
ADDED
@@ -0,0 +1,148 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
+
|
3 |
+
<div class="wrap prli-update">
|
4 |
+
<h1><?php esc_html_e('Get Some Quick Wins with Pretty Links 3.0!', 'pretty-link'); ?></h1>
|
5 |
+
|
6 |
+
<p>
|
7 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/update-3-0.png'; ?>" alt="<?php esc_attr_e('Get Some Quick Wins with Pretty Links 3.0!', 'pretty-link'); ?>">
|
8 |
+
</p>
|
9 |
+
|
10 |
+
<p>
|
11 |
+
<?php
|
12 |
+
printf(
|
13 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
14 |
+
esc_html__('We hope you know that here at Pretty Links, we work every day to deliver amazing tools for business owners to help them %1$swin more%2$s. We want our customers to make more money, easier through superior affiliate link strategy and management.', 'pretty-link'),
|
15 |
+
'<strong><em>',
|
16 |
+
'</em></strong>'
|
17 |
+
);
|
18 |
+
?>
|
19 |
+
</p>
|
20 |
+
|
21 |
+
<p>
|
22 |
+
<?php
|
23 |
+
printf(
|
24 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
25 |
+
esc_html__('That\'s why today, we\'re excited to announce that we\'re rolling out a major, new release. This release won\'t deliver any huge, new features but rather a set of incremental features & fixes that will %1$sinstantly give you some well deserved quick wins%2$s in your business.', 'pretty-link'),
|
26 |
+
'<strong><em>',
|
27 |
+
'</em></strong>'
|
28 |
+
);
|
29 |
+
?>
|
30 |
+
</p>
|
31 |
+
|
32 |
+
<p>
|
33 |
+
<?php
|
34 |
+
printf(
|
35 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
36 |
+
esc_html__('That\'s why we\'re calling Pretty Links 3.0 - %1$sQuick Wins!%2$s', 'pretty-link'),
|
37 |
+
'<strong><em>',
|
38 |
+
'</em></strong>'
|
39 |
+
);
|
40 |
+
?>
|
41 |
+
</p>
|
42 |
+
|
43 |
+
<h2><?php esc_html_e('What Changes Can You Expect, Exactly?', 'pretty-link'); ?></h2>
|
44 |
+
|
45 |
+
<p><?php esc_html_e('Check out these solid improvements that will make your experience with Pretty Links better in almost every way:', 'pretty-link'); ?></p>
|
46 |
+
|
47 |
+
<ul class="prli-bullet-list">
|
48 |
+
<li>
|
49 |
+
<p>
|
50 |
+
<?php
|
51 |
+
printf(
|
52 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
53 |
+
esc_html__('%1$sAn all-new Link Editor%2$s - We\'ve completely overhauled our link editing experience. Our new, power-packed link editor will make creating and managing your affiliate links easier than ever before!', 'pretty-link'),
|
54 |
+
'<strong>',
|
55 |
+
'</strong>'
|
56 |
+
);
|
57 |
+
?>
|
58 |
+
</p>
|
59 |
+
<div class="prli-row prli-2-columns">
|
60 |
+
<div class="prli-column">
|
61 |
+
<a href="<?php echo PRLI_IMAGES_URL . '/update-new-link-editor-1.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('An all-new Link Editor', 'pretty-link'); ?>">
|
62 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/update-new-link-editor-1.png'; ?>" alt="<?php esc_attr_e('An all-new Link Editor', 'pretty-link'); ?>">
|
63 |
+
</a>
|
64 |
+
</div>
|
65 |
+
<div class="prli-column">
|
66 |
+
<a href="<?php echo PRLI_IMAGES_URL . '/update-new-link-editor-2.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('An all-new Link Editor', 'pretty-link'); ?>">
|
67 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/update-new-link-editor-2.png'; ?>" alt="<?php esc_attr_e('An all-new Link Editor', 'pretty-link'); ?>">
|
68 |
+
</a>
|
69 |
+
</div>
|
70 |
+
</div>
|
71 |
+
</li>
|
72 |
+
<li>
|
73 |
+
<p>
|
74 |
+
<?php
|
75 |
+
printf(
|
76 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
77 |
+
esc_html__('%1$sAll new Link Listing%2$s - Gone is the clumsy, old Link Listing feature! You’ll now be able to send links to the "Trash," customize what columns you see in your listing with "Screen Options" and change the number of rows displayed.', 'pretty-link'),
|
78 |
+
'<strong>',
|
79 |
+
'</strong>'
|
80 |
+
);
|
81 |
+
?>
|
82 |
+
</p>
|
83 |
+
<div class="prli-row">
|
84 |
+
<div class="prli-column">
|
85 |
+
<a href="<?php echo PRLI_IMAGES_URL . '/update-all-new-link-listing.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('All new Link Listing', 'pretty-link'); ?>">
|
86 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/update-all-new-link-listing.png'; ?>" alt="<?php esc_attr_e('All new Link Listing', 'pretty-link'); ?>">
|
87 |
+
</a>
|
88 |
+
</div>
|
89 |
+
</div>
|
90 |
+
</li>
|
91 |
+
<li>
|
92 |
+
<p>
|
93 |
+
<?php
|
94 |
+
printf(
|
95 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
96 |
+
esc_html__('%1$sCustomizable Links Tags / Categories (Pro Only)%2$s - Once you upgrade to Quick Wins, you\'ll be able to categorize and tag your pretty links! This is a long-requested feature that will help you organize your links and group them any way that you\'d like to for ultimate productivity and monetization!', 'pretty-link'),
|
97 |
+
'<strong>',
|
98 |
+
'</strong>'
|
99 |
+
);
|
100 |
+
?>
|
101 |
+
</p>
|
102 |
+
<div class="prli-row">
|
103 |
+
<div class="prli-column">
|
104 |
+
<a href="<?php echo PRLI_IMAGES_URL . '/update-categories-tags.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('Customizable Links Tags / Categories (Pro Only)', 'pretty-link'); ?>">
|
105 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/update-categories-tags.png'; ?>" alt="<?php esc_attr_e('Customizable Links Tags / Categories (Pro Only)', 'pretty-link'); ?>">
|
106 |
+
</a>
|
107 |
+
</div>
|
108 |
+
</div>
|
109 |
+
</li>
|
110 |
+
<li>
|
111 |
+
<p>
|
112 |
+
<?php
|
113 |
+
printf(
|
114 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
115 |
+
esc_html__('%1$sGutenberg Block Link Integration%2$s - You can now use your Pretty Links directly inside the Gutenberg Paragraph Block. All you have to do is select the "Pretty Link" button from your Paragraph Block\'s formatting bar then you can search and insert Pretty Links instantly!', 'pretty-link'),
|
116 |
+
'<strong>',
|
117 |
+
'</strong>'
|
118 |
+
);
|
119 |
+
?>
|
120 |
+
</p>
|
121 |
+
<div class="prli-row">
|
122 |
+
<div class="prli-column">
|
123 |
+
<a href="<?php echo PRLI_IMAGES_URL . '/update-gutenberg-editor.png'; ?>" class="prli-image-popup" title="<?php esc_attr_e('Gutenberg Block Link Integration', 'pretty-link'); ?>">
|
124 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/update-gutenberg-editor.png'; ?>" alt="<?php esc_attr_e('Gutenberg Block Link Integration', 'pretty-link'); ?>">
|
125 |
+
</a>
|
126 |
+
</div>
|
127 |
+
</div>
|
128 |
+
</div>
|
129 |
+
</div>
|
130 |
+
|
131 |
+
</ul>
|
132 |
+
|
133 |
+
<h2><?php esc_html_e('Tons of Fixes and Enhancements', 'pretty-link'); ?></h2>
|
134 |
+
|
135 |
+
<p><?php esc_html_e('In addition to these streamlined, new features we’ve made hundreds of enhancements and numerous small fixes. Pretty Links Quick Wins is going to make your link experience easier, faster, more secure and more capable than ever before!', 'pretty-link'); ?></p>
|
136 |
+
|
137 |
+
<p>
|
138 |
+
<?php
|
139 |
+
printf(
|
140 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
141 |
+
esc_html__('We\'re excited for you to start winning more today with %1$sPretty Link Quick Wins!%2$s', 'pretty-link'),
|
142 |
+
'<strong><em>',
|
143 |
+
'</em></strong>'
|
144 |
+
);
|
145 |
+
?>
|
146 |
+
</p>
|
147 |
+
|
148 |
+
</div>
|
app/views/admin/onboarding/welcome.php
ADDED
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
+
|
3 |
+
<div class="wrap prli-welcome">
|
4 |
+
<h1><?php esc_html_e('Welcome to Pretty Links!', 'pretty-link'); ?></h1>
|
5 |
+
|
6 |
+
<div class="prli-welcome-badge">
|
7 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-desk.png'; ?>" alt="<?php esc_attr_e('Welcome to Pretty Links!', 'pretty-link'); ?>">
|
8 |
+
</div>
|
9 |
+
|
10 |
+
<p class="prli-welcome-about"><?php esc_html_e('Congratulations, you\'ve just installed the most powerful link management platform for WordPress on Earth!', 'pretty-link'); ?></p>
|
11 |
+
<p class="prli-welcome-about"><?php esc_html_e('With Pretty Links, you\'ll no longer need to manage links from a spreadsheet and you\'ll be able to maximize the visibility of your links - these benefits (and more) will make it possible to make more money from your content like never before!', 'pretty-link'); ?></p>
|
12 |
+
|
13 |
+
<hr>
|
14 |
+
|
15 |
+
<div class="prli-center-section">
|
16 |
+
<div> </div>
|
17 |
+
<h2><?php esc_html_e('Getting Started', 'pretty-link'); ?></h2>
|
18 |
+
<p><?php esc_html_e('Start by creating your first Pretty Link:', 'pretty-link'); ?></p>
|
19 |
+
</div>
|
20 |
+
|
21 |
+
<div class="prli-center-section">
|
22 |
+
<div> </div>
|
23 |
+
<p class="prli-welcome-step">
|
24 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-add-new.png'; ?>" alt="<?php esc_attr_e('Click "Add New Link"', 'pretty-link'); ?>">
|
25 |
+
<?php esc_html_e('1. Click "Add New Link"', 'pretty-link'); ?>
|
26 |
+
</p>
|
27 |
+
<p class="prli-welcome-step">
|
28 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-enter-url.png'; ?>" alt="<?php esc_attr_e('Enter the URL of your Affiliate Link', 'pretty-link'); ?>">
|
29 |
+
<?php esc_html_e('2. Enter the URL of your Affiliate Link', 'pretty-link'); ?>
|
30 |
+
</p>
|
31 |
+
<p class="prli-welcome-step">
|
32 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-customize-slug.png'; ?>" alt="<?php esc_attr_e('Customize your Pretty Link Slug', 'pretty-link'); ?>">
|
33 |
+
<?php esc_html_e('3. Customize your Pretty Link Slug', 'pretty-link'); ?>
|
34 |
+
</p>
|
35 |
+
<p class="prli-welcome-step">
|
36 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-click-update.png'; ?>" alt="<?php esc_attr_e('Click "Update"', 'pretty-link'); ?>">
|
37 |
+
<?php esc_html_e('4. Click "Update"', 'pretty-link'); ?>
|
38 |
+
</p>
|
39 |
+
<p class="prli-welcome-step">
|
40 |
+
<img class="prli-welcome-step" src="<?php echo PRLI_IMAGES_URL . '/welcome-copy-url.png'; ?>" alt="<?php esc_attr_e('Copy the Pretty Link URL', 'pretty-link'); ?>">
|
41 |
+
<?php esc_html_e('5. Copy the Pretty Link URL', 'pretty-link'); ?>
|
42 |
+
</p>
|
43 |
+
<div> </div>
|
44 |
+
|
45 |
+
<p><?php esc_html_e('Wasn\'t that easy? Now, you can use this link wherever you want!', 'pretty-link'); ?></p>
|
46 |
+
|
47 |
+
</div>
|
48 |
+
|
49 |
+
<hr>
|
50 |
+
|
51 |
+
<div class="prli-center-section">
|
52 |
+
<div> </div>
|
53 |
+
<h2><?php esc_html_e('The Power of Pretty Links Pro', 'pretty-link'); ?></h2>
|
54 |
+
<p><?php esc_html_e('There are many reasons that premium users of Pretty Links are able to take their business to the next level:', 'pretty-link'); ?></p>
|
55 |
+
</div>
|
56 |
+
|
57 |
+
<div class="prli-center-section prli-row prli-2-columns prli-is-wider-left">
|
58 |
+
<div class="prli-column prli-align-vertically">
|
59 |
+
<h3><?php esc_html_e('Automated, Site-Wide Link Placement (Keyword Replacement)', 'pretty-link'); ?></h3>
|
60 |
+
<p><?php esc_html_e('Imagine if you never had to hand-edit links, copy and paste from a spreadsheet, or actively have to keep up with you links ever again. Well that time has come! Now with Pretty Links, all you have to do is create your links and let Pretty Links do the rest!', 'pretty-link'); ?></p>
|
61 |
+
<p><?php esc_html_e('Pretty Links will scan your content for the keywords or URLs that you want to target and will replace them with Pretty Links automatically! This will save you tons of time so you can focus on growing your business!', 'pretty-link'); ?></p>
|
62 |
+
</div>
|
63 |
+
<div class="prli-column">
|
64 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-link.png'; ?>" alt="<?php esc_attr_e('Automated, Site-Wide Link Placement (Keyword Replacement)', 'pretty-link'); ?>">
|
65 |
+
</div>
|
66 |
+
</div>
|
67 |
+
|
68 |
+
<div class="prli-center-section prli-row prli-2-columns prli-is-wider-right">
|
69 |
+
<div class="prli-column">
|
70 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-categories.png'; ?>" alt="<?php esc_attr_e('Categories & Tags', 'pretty-link'); ?>">
|
71 |
+
</div>
|
72 |
+
<div class="prli-column prli-align-vertically">
|
73 |
+
<h3><?php esc_html_e('Categories & Tags', 'pretty-link'); ?></h3>
|
74 |
+
<p><?php esc_html_e('When you are dealing with a large number of links, it can be easy to be overwhelmed and confused by which links to you planned to use where. It\'s now easier than ever to organize your links and group them any way that you like for ultimate productivity and monetization!', 'pretty-link'); ?></p>
|
75 |
+
</div>
|
76 |
+
</div>
|
77 |
+
|
78 |
+
<div class="prli-center-section prli-row prli-2-columns prli-is-wider-left">
|
79 |
+
<div class="prli-column prli-align-vertically">
|
80 |
+
<h3><?php esc_html_e('Advanced Redirect Types', 'pretty-link'); ?></h3>
|
81 |
+
<p><?php esc_html_e('Lite users can take advantage of 301 & 302 server side redirects but our pro users can also redirect with cloaking, JavaScript, Meta-refresh and more.', 'pretty-link'); ?></p>
|
82 |
+
<p><?php esc_html_e('So if you have social media links, a landing page, or a new page or post you\'d like to redirect your customers to, this feature will definitely come in handy!', 'pretty-link'); ?></p>
|
83 |
+
</div>
|
84 |
+
<div class="prli-column">
|
85 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-advanced-redirects.png'; ?>" alt="<?php esc_attr_e('Advanced Redirect Types', 'pretty-link'); ?>">
|
86 |
+
</div>
|
87 |
+
</div>
|
88 |
+
|
89 |
+
<div class="prli-center-section prli-row prli-2-columns prli-is-wider-right">
|
90 |
+
<div class="prli-column">
|
91 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-dynamic-redirects.png'; ?>" alt="<?php esc_attr_e('Dynamic Redirect Types', 'pretty-link'); ?>">
|
92 |
+
</div>
|
93 |
+
<div class="prli-column prli-align-vertically">
|
94 |
+
<h3><?php esc_html_e('Dynamic Redirect Types', 'pretty-link'); ?></h3>
|
95 |
+
<p><?php esc_html_e('Would you like your Pretty Link to redirect somewhere custom depending on what country your user is in, device they\'re using, time they\'re clicking the link or just randomly? Our pro users can do this easily with our Dynamic Redirections!', 'pretty-link'); ?></p>
|
96 |
+
<p><?php esc_html_e('This feature is excellent if you are running a time-sensitive sales, want to create custom content for you customers, create stellar landing pages for customers in different countries!', 'pretty-link'); ?></p>
|
97 |
+
</div>
|
98 |
+
</div>
|
99 |
+
|
100 |
+
<div class="prli-center-section prli-row prli-2-columns prli-is-wider-left">
|
101 |
+
<div class="prli-column prli-align-vertically">
|
102 |
+
<h3><?php esc_html_e('Import and Export Links', 'pretty-link'); ?></h3>
|
103 |
+
<p><?php esc_html_e('Export your links to a spreadsheet or import them en masse - our pro users can do this with ease. Simply download your spreadsheet, upload to WordPress, and your links are automatically added to Pretty Links!', 'pretty-link'); ?></p>
|
104 |
+
</div>
|
105 |
+
<div class="prli-column">
|
106 |
+
<img src="<?php echo PRLI_IMAGES_URL . '/welcome-import-export.png'; ?>" alt="<?php esc_attr_e('Import and Export Links', 'pretty-link'); ?>">
|
107 |
+
</div>
|
108 |
+
</div>
|
109 |
+
|
110 |
+
<div class="prli-center-section">
|
111 |
+
<h3><?php esc_html_e('The list goes on and on', 'pretty-link'); ?></h3>
|
112 |
+
<p><?php esc_html_e('Our premium editions of Pretty Links are a HUGE upgrade from Lite. Don’t miss out on our critical PRO benefits!', 'pretty-link'); ?></p>
|
113 |
+
</div>
|
114 |
+
|
115 |
+
<div class="prli-center-section prli-button-section">
|
116 |
+
<a href="https://prettylinks.com/pl/welcome-page/upgrade" class="button button-primary"><?php esc_html_e('Upgrade to Pro', 'pretty-link'); ?></a>
|
117 |
+
<p><?php esc_html_e('Upgrade NOW and get 50% off of your subscription!!!', 'pretty-link'); ?></p>
|
118 |
+
</div>
|
119 |
+
|
120 |
+
</div>
|
app/views/admin/popups/rating.php
CHANGED
@@ -1,20 +1,46 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
|
|
|
|
3 |
<div id="prli-rating-popup" class="mfp-hide prli-popup prli-auto-open">
|
4 |
<p><img src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="200" height="32" /></p>
|
5 |
-
<div
|
6 |
-
|
7 |
-
|
8 |
-
<p><?php _e('Thanks for your support!', 'pretty-link'); ?></p>
|
9 |
-
<div> </div>
|
10 |
-
<div> </div>
|
11 |
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
<div> </div>
|
16 |
-
<
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
</div>
|
20 |
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
+
<?php $plp_update = new PrliUpdateController(); ?>
|
4 |
+
|
5 |
<div id="prli-rating-popup" class="mfp-hide prli-popup prli-auto-open">
|
6 |
<p><img src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="200" height="32" /></p>
|
7 |
+
<div id="prli-rating-stage-one">
|
8 |
+
<center><h2><?php esc_html_e('Are you enjoying using Pretty Links?', 'pretty-link'); ?></h2></center>
|
9 |
+
<div> </div>
|
|
|
|
|
|
|
10 |
|
11 |
+
<center>
|
12 |
+
<button data-popup="rating" class="prli-rating-enjoy-yes-popup button-primary"><?php esc_html_e('Yes', 'pretty-link'); ?></button>
|
13 |
+
<button data-popup="rating" class="prli-rating-enjoy-no-popup button"><?php esc_html_e('No', 'pretty-link'); ?></button>
|
14 |
+
</center>
|
15 |
+
</div>
|
16 |
+
<div id="prli-rating-stage-two-yes" class="prli-hidden">
|
17 |
+
<h2><?php esc_html_e('Rate Pretty Links', 'pretty-link'); ?></h2>
|
18 |
+
<p><?php esc_html_e('If you enjoy using Pretty Links would you mind taking a moment to rate it on WordPress.org? It won\'t take more than a minute.', 'pretty-link'); ?></p>
|
19 |
+
<p><?php esc_html_e('Thanks for your support!', 'pretty-link'); ?></p>
|
20 |
<div> </div>
|
21 |
+
<div> </div>
|
22 |
+
|
23 |
+
<center>
|
24 |
+
<button data-popup="rating" class="prli-delay-popup button"><?php esc_html_e('Remind Me Later', 'pretty-link'); ?></button>
|
25 |
+
<button data-popup="rating" data-href="https://prettylinks.com/pl/footer/review" class="prli-stop-popup button-primary"><?php esc_html_e('Review Pretty Links', 'pretty-link'); ?></button>
|
26 |
+
</center>
|
27 |
+
</div>
|
28 |
+
<div id="prli-rating-stage-two-no" class="prli-hidden">
|
29 |
+
<h2><?php esc_html_e('Leave Feedback', 'pretty-link'); ?></h2>
|
30 |
+
<p><?php esc_html_e('To help us improve Pretty Links, would you mind taking a moment to leave feedback?', 'pretty-link'); ?></p>
|
31 |
+
<p><?php esc_html_e('Thanks for your support!', 'pretty-link'); ?></p>
|
32 |
+
<div> </div>
|
33 |
+
<div> </div>
|
34 |
+
|
35 |
+
<center>
|
36 |
+
<button data-popup="rating" class="prli-delay-popup button"><?php esc_html_e('Remind Me Later', 'pretty-link'); ?></button>
|
37 |
+
<a href="https://prettylinks.com/feedback/" target="_blank" class="prli-leave-feedback button-primary"><?php esc_html_e('Leave Feedback', 'pretty-link'); ?></a>
|
38 |
+
<?php if($plp_update->is_installed()): ?>
|
39 |
+
<div> </div>
|
40 |
+
<a href="" data-popup="rating" class="prli-stop-popup"><?php esc_html_e('Never Remind Me Again', 'pretty-link'); ?></a>
|
41 |
+
<?php endif; ?>
|
42 |
+
</center>
|
43 |
+
</div>
|
44 |
|
45 |
</div>
|
46 |
|
app/views/admin/popups/upgrade.php
CHANGED
@@ -1,29 +1,27 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
<div id="prli-upgrade-popup" class="mfp-hide prli-popup prli-auto-open">
|
4 |
-
<p><img src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="200" height="32" /></p>
|
5 |
<div> </div>
|
6 |
-
<h2><?php
|
7 |
-
<p><?php
|
8 |
<ul>
|
9 |
-
<li> • <?php
|
10 |
-
<li> • <?php
|
11 |
-
<li> • <?php
|
12 |
-
<li> • <?php
|
13 |
-
<li> • <?php
|
14 |
-
<li> • <?php
|
15 |
</ul>
|
16 |
</p>
|
17 |
-
<p><?php
|
18 |
-
<p><?php
|
19 |
<div> </div>
|
20 |
<div> </div>
|
21 |
|
22 |
<center>
|
23 |
-
<button data-popup="upgrade" class="prli-delay-popup button"><?php
|
24 |
-
<button data-popup="upgrade"
|
25 |
-
<div> </div>
|
26 |
-
<a href="" data-popup="upgrade" class="prli-stop-popup"><?php _e('Never Remind Me Again', 'pretty-link'); ?></a>
|
27 |
</center>
|
28 |
|
29 |
</div>
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
<div id="prli-upgrade-popup" class="mfp-hide prli-popup prli-auto-open">
|
4 |
+
<p><img src="<?php echo esc_url(PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'); ?>" width="200" height="32" /></p>
|
5 |
<div> </div>
|
6 |
+
<h2><?php esc_html_e('Upgrade to Pretty Links PRO', 'pretty-link'); ?></h2>
|
7 |
+
<p><?php esc_html_e('Unlock Pretty Links\' PRO features and you\'ll be able to:', 'pretty-link'); ?><br/>
|
8 |
<ul>
|
9 |
+
<li> • <?php esc_html_e('Monetize existing content with automated Pretty Link placement', 'pretty-link'); ?></li>
|
10 |
+
<li> • <?php esc_html_e('Redirect with cloaking, Javascript or Meta-refresh', 'pretty-link'); ?></li>
|
11 |
+
<li> • <?php esc_html_e('Redirect by location, time, device or rotation', 'pretty-link'); ?></li>
|
12 |
+
<li> • <?php esc_html_e('Expire your Pretty Links', 'pretty-link'); ?></li>
|
13 |
+
<li> • <?php esc_html_e('Split-test your Pretty Links', 'pretty-link'); ?></li>
|
14 |
+
<li> • <?php esc_html_e('And much, much more!', 'pretty-link'); ?></li>
|
15 |
</ul>
|
16 |
</p>
|
17 |
+
<p><?php esc_html_e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data.', 'pretty-link'); ?></p>
|
18 |
+
<p><?php esc_html_e('We think you\'ll love it!', 'pretty-link'); ?></p>
|
19 |
<div> </div>
|
20 |
<div> </div>
|
21 |
|
22 |
<center>
|
23 |
+
<button data-popup="upgrade" data-href="https://prettylinks.com/pl/popup/upgrade" class="prli-delay-popup button-primary"><?php esc_html_e('Upgrade to Pretty Links Pro', 'pretty-link'); ?></button>
|
24 |
+
<button data-popup="upgrade" class="prli-delay-popup button"><?php esc_html_e('Maybe Later', 'pretty-link'); ?></button>
|
|
|
|
|
25 |
</center>
|
26 |
|
27 |
</div>
|
app/views/admin/update/activation_warning.php
CHANGED
@@ -1,19 +1,65 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<?php global $plp_update; ?>
|
3 |
<?php if(defined('PRETTYLINK_LICENSE_KEY') && isset($error)): ?>
|
4 |
-
<div class="prli-red-notice"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
<?php elseif($plp_update->was_activated_with_username_and_password()): ?>
|
6 |
<div class="prli-red-notice">
|
7 |
-
<h2><?php
|
8 |
-
<p><?php
|
9 |
-
<p
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
</div>
|
12 |
<?php else: ?>
|
13 |
<div class="prli-red-notice">
|
14 |
-
<h2><?php
|
15 |
-
<p
|
16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
</div>
|
18 |
<?php endif; ?>
|
19 |
-
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<?php global $plp_update; ?>
|
3 |
<?php if(defined('PRETTYLINK_LICENSE_KEY') && isset($error)): ?>
|
4 |
+
<div class="prli-red-notice">
|
5 |
+
<?php
|
6 |
+
printf(
|
7 |
+
esc_html__('Error with PRETTYLINK_LICENSE_KEY: %s', 'pretty-link'),
|
8 |
+
esc_html($error)
|
9 |
+
);
|
10 |
+
?>
|
11 |
+
</div>
|
12 |
<?php elseif($plp_update->was_activated_with_username_and_password()): ?>
|
13 |
<div class="prli-red-notice">
|
14 |
+
<h2><?php esc_html_e('Pretty Links Pro isn\'t able to get critical automatic updates', 'pretty-link'); ?></h2>
|
15 |
+
<p><?php esc_html_e('It looks like you used to have Pretty Links Pro activated with a username and password but now you need a license key to activate it.', 'pretty-link'); ?></p>
|
16 |
+
<p>
|
17 |
+
<strong>
|
18 |
+
<?php
|
19 |
+
printf(
|
20 |
+
// translators: %1$s: open link tag, %2$s: close link tag
|
21 |
+
esc_html__('You can get your license key by logging in at %1$sPrettyLinkPro.com.%2$s', 'pretty-link'),
|
22 |
+
'<a href="https://prettylinks.com/activation-warning/account" target="_blank">',
|
23 |
+
'</a>'
|
24 |
+
);
|
25 |
+
?>
|
26 |
+
</strong>
|
27 |
+
</p>
|
28 |
+
<p>
|
29 |
+
<?php
|
30 |
+
printf(
|
31 |
+
// translators: %1$s: open link tag, %2$s: close link tag
|
32 |
+
esc_html__('After you paste your license key on the %1$s"Pretty Link" -> "Activate Pro" admin page,%2$s you\'ll start getting updates again.', 'pretty-link'),
|
33 |
+
sprintf('<a href="%s">', esc_url($plp_update->activate_page_url())),
|
34 |
+
'</a>'
|
35 |
+
);
|
36 |
+
?>
|
37 |
+
</p>
|
38 |
</div>
|
39 |
<?php else: ?>
|
40 |
<div class="prli-red-notice">
|
41 |
+
<h2><?php esc_html_e('Pretty Links Pro isn\'t able to get critical automatic updates', 'pretty-link'); ?></h2>
|
42 |
+
<p>
|
43 |
+
<strong>
|
44 |
+
<?php
|
45 |
+
printf(
|
46 |
+
// translators: %1$s: open link tag, %2$s: close link tag
|
47 |
+
esc_html__('You can retrieve or purchase a license key at %1$sPrettyLinks.com%2$s to enable automatic updates today.', 'pretty-link'),
|
48 |
+
'<a href="https://prettylinks.com/pl/activation-warning/buy" target="_blank">',
|
49 |
+
'</a>'
|
50 |
+
);
|
51 |
+
?>
|
52 |
+
</strong>
|
53 |
+
</p>
|
54 |
+
<p>
|
55 |
+
<?php
|
56 |
+
printf(
|
57 |
+
// translators: %1$s: open link tag, %2$s: close link tag
|
58 |
+
esc_html__('After you paste your license key on the %1$s"Pretty Links" -> "Activate Pro" admin page,%2$s you\'ll start getting automatic updates.', 'pretty-link'),
|
59 |
+
sprintf('<a href="%s">', esc_url($plp_update->activate_page_url())),
|
60 |
+
'</a>'
|
61 |
+
);
|
62 |
+
?>
|
63 |
+
</p>
|
64 |
</div>
|
65 |
<?php endif; ?>
|
|
app/views/admin/update/addon_popup.php
CHANGED
@@ -1,25 +1,34 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
<div class="prli-admin-notice prli-auto-open mfp-hide prli-white-popup prli-popup-leftalign">
|
4 |
-
<h2 class="prli_error" style="text-align: center !important; padding-bottom: 15px !important; padding-top: 15px !important"><i class="mp-icon-attention"> </i> <?php
|
5 |
-
<p><?php
|
6 |
-
<p><?php
|
7 |
|
8 |
<?php if($installed): ?>
|
9 |
-
<p><?php
|
10 |
<?php else: ?>
|
11 |
-
<p><?php
|
12 |
-
<p
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
<?php endif; ?>
|
14 |
<br/>
|
15 |
<center>
|
16 |
-
<div data-addon="<?php echo $k; ?>">
|
17 |
<?php if($installed): ?>
|
18 |
-
<button data-href="<?php echo MeprAddonsHelper::activate_url("pretty-link-{$k}/main.php"); ?>" class="prli-btn prli-left-margin prli-addon-activate"><?php
|
19 |
<?php else: ?>
|
20 |
-
<button data-href="<?php echo MeprAddonsHelper::install_url('pretty-link-'.$k); ?>" class="prli-btn prli-left-margin prli-addon-install"><?php
|
21 |
<?php endif; ?>
|
22 |
-
<button class="prli-btn prli-left-margin prli-addon-stop-notices"><?php
|
23 |
</div>
|
24 |
</center>
|
25 |
<br/>
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
<div class="prli-admin-notice prli-auto-open mfp-hide prli-white-popup prli-popup-leftalign">
|
4 |
+
<h2 class="prli_error" style="text-align: center !important; padding-bottom: 15px !important; padding-top: 15px !important"><i class="mp-icon-attention"> </i> <?php esc_html_e('ACTION REQUIRED', 'pretty-link'); ?></h2>
|
5 |
+
<p><?php echo esc_html(sprintf(__('The %s features in your Pretty Link options have been moved from Pretty Link into a separate plugin.', 'pretty-link'), $a->name)); ?></p>
|
6 |
+
<p><?php esc_html_e('Why you ask? Well, it\'s to streamline and increase the performance of Pretty Link for you.', 'pretty-link'); ?></p>
|
7 |
|
8 |
<?php if($installed): ?>
|
9 |
+
<p><?php echo esc_html(sprintf(__('And good for you, it looks like you\'ve already got the %1$s Add-on installed. Just click the "Activate %2$s Add-on" button below and you\'ll get all these features back now.', 'pretty-link'), $a->name, $a->name)); ?></p>
|
10 |
<?php else: ?>
|
11 |
+
<p><?php echo esc_html(sprintf(__('Luckily it\'s easy to get these features back now. Just click the "Install %s Add-on" button below.', 'pretty-link'), $a->name)); ?></p>
|
12 |
+
<p>
|
13 |
+
<?php
|
14 |
+
printf(
|
15 |
+
// translators: %1$s: open link tag, %2$s: close link tag
|
16 |
+
esc_html__('If you have problems with the auto-install please refer to %1$sthe user manual%2$s for manual install instructions.', 'pretty-link'),
|
17 |
+
'<a href="https://prettylinks.com/pl/addon-popup/um/manual-installation" target="_blank">',
|
18 |
+
'</a>'
|
19 |
+
);
|
20 |
+
?>
|
21 |
+
</p>
|
22 |
<?php endif; ?>
|
23 |
<br/>
|
24 |
<center>
|
25 |
+
<div data-addon="<?php echo esc_attr($k); ?>">
|
26 |
<?php if($installed): ?>
|
27 |
+
<button data-href="<?php echo esc_url(MeprAddonsHelper::activate_url("pretty-link-{$k}/main.php")); ?>" class="prli-btn prli-left-margin prli-addon-activate"><?php echo esc_html(sprintf(__('Activate %s Add-on', 'pretty-link'), $a->name)); ?></button>
|
28 |
<?php else: ?>
|
29 |
+
<button data-href="<?php echo esc_url(MeprAddonsHelper::install_url('pretty-link-'.$k)); ?>" class="prli-btn prli-left-margin prli-addon-install"><?php echo esc_html(sprintf(__('Install %s Add-on', 'pretty-link'), $a->name)); ?></button>
|
30 |
<?php endif; ?>
|
31 |
+
<button class="prli-btn prli-left-margin prli-addon-stop-notices"><?php esc_html_e('Don\'t Show This Message Again', 'pretty-link'); ?></button>
|
32 |
</div>
|
33 |
</center>
|
34 |
<br/>
|
app/views/admin/update/addons.php
CHANGED
@@ -1,19 +1,19 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
-
<div class="prli-page-title"><?php
|
4 |
|
5 |
<?php $addons = PrliUpdateController::addons(true); ?>
|
6 |
|
7 |
<?php if(empty($addons)): ?>
|
8 |
-
<h3><?php
|
9 |
<?php else: ?>
|
10 |
<table class="widefat">
|
11 |
|
12 |
<thead>
|
13 |
<tr>
|
14 |
-
<th><?php
|
15 |
-
<th><?php
|
16 |
-
<th><?php
|
17 |
</tr>
|
18 |
</thead>
|
19 |
|
@@ -36,22 +36,22 @@
|
|
36 |
<strong>
|
37 |
<?php
|
38 |
|
39 |
-
echo isset($info->extra_info->list_title) ? $info->extra_info->list_title : $info->product_name;
|
40 |
|
41 |
if($update_available) {
|
42 |
-
echo ' ' .
|
43 |
}
|
44 |
?>
|
45 |
</strong>
|
46 |
</td>
|
47 |
-
<td><?php echo $info->extra_info->description; ?></td>
|
48 |
<td>
|
49 |
<?php if($installed && $active): ?>
|
50 |
-
<a class="button" href="" style="pointer-events: none;" disabled><?php
|
51 |
<?php elseif($installed && !$active): ?>
|
52 |
-
<a class="button" href="" style="pointer-events: none;" disabled><?php
|
53 |
<?php else: ?>
|
54 |
-
<a class="button button-primary" href="<?php echo PrliAddonsHelper::install_url($slug); ?>"><?php
|
55 |
<?php endif; ?>
|
56 |
</td>
|
57 |
</tr>
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
+
<div class="prli-page-title"><?php esc_html_e('Pretty Link Add-ons', 'pretty-link'); ?></div>
|
4 |
|
5 |
<?php $addons = PrliUpdateController::addons(true); ?>
|
6 |
|
7 |
<?php if(empty($addons)): ?>
|
8 |
+
<h3><?php esc_html_e('There were no Add-ons found for your license or lack thereof...', 'pretty-link'); ?></h3>
|
9 |
<?php else: ?>
|
10 |
<table class="widefat">
|
11 |
|
12 |
<thead>
|
13 |
<tr>
|
14 |
+
<th><?php esc_html_e('Add-on', 'pretty-link'); ?></th>
|
15 |
+
<th><?php esc_html_e('Description', 'pretty-link'); ?></th>
|
16 |
+
<th><?php esc_html_e('Install', 'pretty-link'); ?></th>
|
17 |
</tr>
|
18 |
</thead>
|
19 |
|
36 |
<strong>
|
37 |
<?php
|
38 |
|
39 |
+
echo esc_html(isset($info->extra_info->list_title) ? $info->extra_info->list_title : $info->product_name);
|
40 |
|
41 |
if($update_available) {
|
42 |
+
echo ' ' . esc_html__('(Update Available)', 'pretty-link');
|
43 |
}
|
44 |
?>
|
45 |
</strong>
|
46 |
</td>
|
47 |
+
<td><?php echo esc_html($info->extra_info->description); ?></td>
|
48 |
<td>
|
49 |
<?php if($installed && $active): ?>
|
50 |
+
<a class="button" href="" style="pointer-events: none;" disabled><?php esc_html_e('Installed & Active', 'pretty-link'); ?></a>
|
51 |
<?php elseif($installed && !$active): ?>
|
52 |
+
<a class="button" href="" style="pointer-events: none;" disabled><?php esc_html_e('Installed & Inactive', 'pretty-link'); ?></a>
|
53 |
<?php else: ?>
|
54 |
+
<a class="button button-primary" href="<?php echo esc_url(PrliAddonsHelper::install_url($slug)); ?>"><?php esc_html_e('Install', 'pretty-link'); ?></a>
|
55 |
<?php endif; ?>
|
56 |
</td>
|
57 |
</tr>
|
app/views/admin/update/edge_updates.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<?php global $plp_update; ?>
|
3 |
-
<div id="<?php echo $plp_update->edge_updates_str; ?>-wrap">
|
4 |
-
<input type="checkbox" id="<?php echo $plp_update->edge_updates_str; ?>" data-nonce="<?php echo wp_create_nonce('wp-edge-updates'); ?>" <?php checked($plp_update->edge_updates); ?>/> <?php
|
5 |
</div>
|
6 |
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<?php global $plp_update; ?>
|
3 |
+
<div id="<?php echo esc_attr($plp_update->edge_updates_str); ?>-wrap">
|
4 |
+
<input type="checkbox" id="<?php echo esc_attr($plp_update->edge_updates_str); ?>" data-nonce="<?php echo esc_attr(wp_create_nonce('wp-edge-updates')); ?>" <?php checked($plp_update->edge_updates); ?>/> <?php esc_html_e('Include Pretty Links Pro edge (development) releases in automatic updates (not recommended for production websites)', 'pretty-link'); ?> <img src="<?php echo esc_url(PRLI_IMAGES_URL . '/square-loader.gif'); ?>" alt="<?php esc_attr_e('Loading...', 'pretty-link'); ?>" class="prli_loader" />
|
5 |
</div>
|
6 |
|
app/views/admin/update/license.php
CHANGED
@@ -1,82 +1,112 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
-
<?php
|
|
|
|
|
|
|
3 |
|
4 |
-
<div class="prli-page-title"><?php
|
5 |
|
6 |
<?php if( !isset($li) or empty($li) ): ?>
|
7 |
-
<p class="description"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
<form name="activation_form" method="post" action="">
|
9 |
<?php wp_nonce_field('activation_form'); ?>
|
10 |
|
11 |
<table class="form-table">
|
12 |
<tr class="form-field">
|
13 |
-
<td valign="top" width="225px"><?php
|
14 |
<td>
|
15 |
-
<input type="text" name="<?php echo $plp_update->mothership_license_str; ?>" value="<?php echo (
|
16 |
</td>
|
17 |
</tr>
|
18 |
</table>
|
19 |
<p class="submit">
|
20 |
-
<input type="submit" name="Submit" class="button button-primary" value="<?php
|
21 |
</p>
|
22 |
</form>
|
23 |
|
24 |
<?php if(!$plp_update->is_installed()): ?>
|
25 |
<div> </div>
|
26 |
|
27 |
-
<div class="prli-page-title"><?php
|
28 |
|
29 |
<div>
|
30 |
-
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
31 |
</div>
|
32 |
|
33 |
<div> </div>
|
34 |
|
35 |
<ul style="padding-left: 25px;">
|
36 |
-
<li>• <?php
|
37 |
-
<li>• <?php
|
38 |
-
<li>• <?php
|
39 |
-
<li>• <?php
|
40 |
-
<li>• <?php
|
41 |
-
<li>• <?php
|
42 |
</ul>
|
43 |
|
44 |
<div> </div>
|
45 |
-
<div><?php
|
46 |
<div> </div>
|
47 |
-
<div><?php
|
48 |
<div> </div>
|
49 |
-
<div><a href="https://prettylinks.com/pl/license-alert/upgrade-1" class="button button-primary"><?php
|
50 |
<?php endif; ?>
|
51 |
<?php else: ?>
|
52 |
<div class="prli-license-active">
|
53 |
-
<div><h4><?php
|
54 |
<table>
|
55 |
<tr>
|
56 |
-
<td><?php
|
57 |
-
<td>********-****-****-****-<?php echo substr($li['license_key']['license'], -12); ?></td>
|
58 |
</tr>
|
59 |
<tr>
|
60 |
-
<td><?php
|
61 |
-
<td><?php
|
62 |
</tr>
|
63 |
<tr>
|
64 |
-
<td><?php
|
65 |
-
<td><?php echo $li['product_name']; ?></td>
|
66 |
</tr>
|
67 |
<tr>
|
68 |
-
<td><?php
|
69 |
-
<td
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
</tr>
|
71 |
</table>
|
72 |
-
<div class="prli-deactivate-button"><a href="<?php echo admin_url('admin.php?page=pretty-link-updates&action=deactivate&_wpnonce='.wp_create_nonce('pretty-link_deactivate')); ?>" class="button button-primary" onclick="return confirm('<?php
|
73 |
</div>
|
74 |
<?php if(!$this->is_installed()): ?>
|
75 |
-
<div><a href="<?php echo $this->update_plugin_url(); ?>" class="button button-primary"><?php
|
76 |
<div> </div>
|
77 |
<?php endif; ?>
|
78 |
<?php require(PRLI_VIEWS_PATH.'/admin/update/edge_updates.php'); ?>
|
79 |
<br/>
|
80 |
-
<div id="prli-version-string"><?php printf(
|
81 |
<?php endif; ?>
|
82 |
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
+
<?php
|
3 |
+
global $plp_update;
|
4 |
+
$mothership_license_str = isset($_POST[$plp_update->mothership_license_str]) ? sanitize_key($_POST[$plp_update->mothership_license_str]) : $plp_update->mothership_license;
|
5 |
+
?>
|
6 |
|
7 |
+
<div class="prli-page-title"><?php esc_html_e('Pretty Links Pro License', 'pretty-link'); ?></div>
|
8 |
|
9 |
<?php if( !isset($li) or empty($li) ): ?>
|
10 |
+
<p class="description">
|
11 |
+
<?php
|
12 |
+
printf(
|
13 |
+
// translators: %1$s: link to pro site, %2$s: link to pro site login page
|
14 |
+
esc_html__('You must have a License Key to enable automatic updates for Pretty Links Pro. If you don\'t have a License please go to %1$s to get one. If you do have a license you can login at %2$s to manage your licenses and site activations.', 'pretty-link'),
|
15 |
+
'<a href="https://prettylinks.com/pl/license-alert/buy">prettylinks.com</a>',
|
16 |
+
'<a href="https://prettylinks.com/pl/license-alert/login">prettylinks.com/login</a>'
|
17 |
+
);
|
18 |
+
?>
|
19 |
+
</p>
|
20 |
<form name="activation_form" method="post" action="">
|
21 |
<?php wp_nonce_field('activation_form'); ?>
|
22 |
|
23 |
<table class="form-table">
|
24 |
<tr class="form-field">
|
25 |
+
<td valign="top" width="225px"><?php esc_html_e('Enter Your Pretty Links Pro License Key:', 'pretty-link'); ?></td>
|
26 |
<td>
|
27 |
+
<input type="text" name="<?php echo esc_attr($plp_update->mothership_license_str); ?>" value="<?php echo esc_attr($mothership_license_str); ?>"/>
|
28 |
</td>
|
29 |
</tr>
|
30 |
</table>
|
31 |
<p class="submit">
|
32 |
+
<input type="submit" name="Submit" class="button button-primary" value="<?php echo esc_attr(sprintf(__('Activate License Key on %s', 'pretty-link'), PrliUtils::site_domain())); ?>" />
|
33 |
</p>
|
34 |
</form>
|
35 |
|
36 |
<?php if(!$plp_update->is_installed()): ?>
|
37 |
<div> </div>
|
38 |
|
39 |
+
<div class="prli-page-title"><?php esc_html_e('Upgrade to Pro', 'pretty-link'); ?></div>
|
40 |
|
41 |
<div>
|
42 |
+
<?php
|
43 |
+
printf(
|
44 |
+
// translators: %1$s: open link tag, %2$s: close link tag
|
45 |
+
esc_html__('It looks like you haven\'t %1$supgraded to Pretty Links Pro%2$s yet. Here are just a few things you could be doing with pro:', 'pretty-link'),
|
46 |
+
'<a href="https://prettylinks.com/pl/license-alert/upgrade" target="_blank">',
|
47 |
+
'</a>'
|
48 |
+
);
|
49 |
+
?>
|
50 |
</div>
|
51 |
|
52 |
<div> </div>
|
53 |
|
54 |
<ul style="padding-left: 25px;">
|
55 |
+
<li>• <?php esc_html_e('Auto-replace keywords throughout your site with Pretty Links', 'pretty-link'); ?></li>
|
56 |
+
<li>• <?php esc_html_e('Protect your affiliate links by using Cloaked Redirects', 'pretty-link'); ?></li>
|
57 |
+
<li>• <?php esc_html_e('Redirect based on a visitor\'s location', 'pretty-link'); ?></li>
|
58 |
+
<li>• <?php esc_html_e('Auto-prettylink your Pages & Posts', 'pretty-link'); ?></li>
|
59 |
+
<li>• <?php esc_html_e('Find out what works and what doesn\'t by split testing your links', 'pretty-link'); ?></li>
|
60 |
+
<li>• <?php esc_html_e('And much, much more!', 'pretty-link'); ?></li>
|
61 |
</ul>
|
62 |
|
63 |
<div> </div>
|
64 |
+
<div><?php esc_html_e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data. And there\'s even a 14 day money back guarantee.', 'pretty-link'); ?></div>
|
65 |
<div> </div>
|
66 |
+
<div><?php esc_html_e('We think you\'ll love it!', 'pretty-link'); ?></div>
|
67 |
<div> </div>
|
68 |
+
<div><a href="https://prettylinks.com/pl/license-alert/upgrade-1" class="button button-primary"><?php esc_html_e('Upgrade to Pro today!', 'pretty-link'); ?></a></div>
|
69 |
<?php endif; ?>
|
70 |
<?php else: ?>
|
71 |
<div class="prli-license-active">
|
72 |
+
<div><h4><?php esc_html_e('Active License Key Information:', 'pretty-link'); ?></h4></div>
|
73 |
<table>
|
74 |
<tr>
|
75 |
+
<td><?php esc_html_e('License Key:', 'pretty-link'); ?></td>
|
76 |
+
<td>********-****-****-****-<?php echo esc_html(substr($li['license_key']['license'], -12)); ?></td>
|
77 |
</tr>
|
78 |
<tr>
|
79 |
+
<td><?php esc_html_e('Status:', 'pretty-link'); ?></td>
|
80 |
+
<td><b><?php echo esc_html(sprintf(__('Active on %s', 'pretty-link'), PrliUtils::site_domain())); ?></b></td>
|
81 |
</tr>
|
82 |
<tr>
|
83 |
+
<td><?php esc_html_e('Product:', 'pretty-link'); ?></td>
|
84 |
+
<td><?php echo esc_html($li['product_name']); ?></td>
|
85 |
</tr>
|
86 |
<tr>
|
87 |
+
<td><?php esc_html_e('Activations:', 'pretty-link'); ?></td>
|
88 |
+
<td>
|
89 |
+
<?php
|
90 |
+
printf(
|
91 |
+
// translators: %1$s: open b tag, %2$s: close b tag, %3$d: current activation count, %4$s: max activations
|
92 |
+
esc_html__('%1$s%3$d of %4$s%2$s sites have been activated with this license key', 'pretty-link'),
|
93 |
+
'<b>',
|
94 |
+
'</b>',
|
95 |
+
esc_html($li['activation_count']),
|
96 |
+
esc_html(ucwords($li['max_activations']))
|
97 |
+
);
|
98 |
+
?>
|
99 |
+
</td>
|
100 |
</tr>
|
101 |
</table>
|
102 |
+
<div class="prli-deactivate-button"><a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-updates&action=deactivate&_wpnonce='.wp_create_nonce('pretty-link_deactivate'))); ?>" class="button button-primary" onclick="return confirm('<?php echo esc_attr(sprintf(__("Are you sure? Pretty Links Pro will not be functional on %s if this License Key is deactivated.", 'pretty-link'), PrliUtils::site_domain())); ?>');"><?php echo esc_html(sprintf(__('Deactivate License Key on %s', 'pretty-link'), PrliUtils::site_domain())); ?></a></div>
|
103 |
</div>
|
104 |
<?php if(!$this->is_installed()): ?>
|
105 |
+
<div><a href="<?php echo esc_url($this->update_plugin_url()); ?>" class="button button-primary"><?php esc_html_e('Upgrade plugin to Pro', 'pretty-link'); ?></a></div>
|
106 |
<div> </div>
|
107 |
<?php endif; ?>
|
108 |
<?php require(PRLI_VIEWS_PATH.'/admin/update/edge_updates.php'); ?>
|
109 |
<br/>
|
110 |
+
<div id="prli-version-string"><?php printf(esc_html__("You're currently running version %s of Pretty Links Pro", 'pretty-link'), '<b>'.esc_html(PRLI_VERSION).'</b>'); ?></div>
|
111 |
<?php endif; ?>
|
112 |
|
app/views/admin/update/ui.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<div class="wrap">
|
3 |
-
<?php
|
4 |
<?php require(PRLI_VIEWS_PATH.'/admin/errors.php'); ?>
|
5 |
|
6 |
<div class="prli_spacer"></div>
|
@@ -13,8 +13,8 @@
|
|
13 |
<tr>
|
14 |
<td class="prli-settings-table-nav">
|
15 |
<ul class="prli-sidebar-nav">
|
16 |
-
<li><a data-id="license"><?php
|
17 |
-
<!-- <li><a data-id="addons"><?php
|
18 |
<?php do_action('prli_updates_nav_items'); ?>
|
19 |
</ul>
|
20 |
</td>
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<div class="wrap">
|
3 |
+
<?php PrliAppHelper::page_title(__('Activate Pretty Links Pro', 'pretty-link')); ?>
|
4 |
<?php require(PRLI_VIEWS_PATH.'/admin/errors.php'); ?>
|
5 |
|
6 |
<div class="prli_spacer"></div>
|
13 |
<tr>
|
14 |
<td class="prli-settings-table-nav">
|
15 |
<ul class="prli-sidebar-nav">
|
16 |
+
<li><a data-id="license"><?php esc_html_e('License', 'pretty-link'); ?></a></li>
|
17 |
+
<!-- <li><a data-id="addons"><?php esc_html_e('Add-Ons', 'pretty-link'); ?></a></li> -->
|
18 |
<?php do_action('prli_updates_nav_items'); ?>
|
19 |
</ul>
|
20 |
</td>
|
app/views/clicks/csv_download.php
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<div class="wrap">
|
3 |
-
<?php
|
4 |
-
<span style="font-size: 14px; font-weight: bold;"
|
5 |
|
6 |
-
<h3><?php
|
7 |
-
<span class="description"><?php
|
8 |
<br/>
|
9 |
<ul>
|
10 |
<?php
|
@@ -25,7 +25,7 @@
|
|
25 |
$hit_param_delim = (preg_match('#\?#',$hit_report_url)?'&':'?');
|
26 |
|
27 |
?>
|
28 |
-
<li><a href="<?php echo $hit_report_url . $hit_param_delim
|
29 |
<?php
|
30 |
}
|
31 |
?>
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<div class="wrap">
|
3 |
+
<?php PrliAppHelper::page_title(__('Download Clicks', 'pretty-link')); ?>
|
4 |
+
<span style="font-size: 14px; font-weight: bold;"><?php echo esc_html(sprintf(__('For %s', 'pretty-link'), stripslashes($link_name))); ?></span>
|
5 |
|
6 |
+
<h3><?php esc_html_e('Click Reports:', 'pretty-link'); ?></h3>
|
7 |
+
<span class="description"><?php echo esc_html(sprintf(__('All clicks on %s', 'pretty-link'), stripslashes($link_name))); ?></span>
|
8 |
<br/>
|
9 |
<ul>
|
10 |
<?php
|
25 |
$hit_param_delim = (preg_match('#\?#',$hit_report_url)?'&':'?');
|
26 |
|
27 |
?>
|
28 |
+
<li><a href="<?php echo esc_url($hit_report_url . $hit_param_delim . 'prli_page=' . $i); ?>"><?php echo esc_html($report_label); ?></a></li>
|
29 |
<?php
|
30 |
}
|
31 |
?>
|
app/views/clicks/list.php
CHANGED
@@ -1,24 +1,24 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
<div class="wrap">
|
4 |
-
<?php
|
5 |
<br/>
|
6 |
-
<span style="font-size: 14px;"><?php echo __('For', 'pretty-link')
|
7 |
<?php
|
8 |
// Don't show this sheesh if we're displaying the vuid or ip grouping
|
9 |
if(empty($params['ip']) and empty($params['vuid'])) {
|
10 |
?>
|
11 |
-
<a href="#" class="filter_toggle button button-primary" style="vertical-align:middle;"><?php
|
12 |
<?php
|
13 |
}
|
14 |
?>
|
15 |
|
16 |
<?php
|
17 |
if(!empty($params['l']) && $params['l'] != 'all') {
|
18 |
-
echo '<br/><a href="'.admin_url("admin.php?page=pretty-link-clicks").'">« '.
|
19 |
}
|
20 |
else if(!empty($params['ip']) || !empty($params['vuid'])) {
|
21 |
-
echo '<br/><a href="'.admin_url('admin.php?page=pretty-link-clicks').'">« '.
|
22 |
}
|
23 |
|
24 |
if(empty($params['ip']) && empty($params['vuid'])) {
|
@@ -27,20 +27,20 @@
|
|
27 |
<div class="filter_pane" style="margin-top:15px;">
|
28 |
<form class="form-fields" name="form2" method="post" action="">
|
29 |
<?php wp_nonce_field('prli-reports'); ?>
|
30 |
-
<span><?php
|
31 |
<select id="type" name="type" style="display: inline;">
|
32 |
-
<option value="all"<?php selected(empty($params['type']) || $params['type'] == 'all'); ?>><?php
|
33 |
-
<option value="unique"<?php selected($params['type'] == 'unique'); ?>><?php
|
34 |
</select>
|
35 |
<br/>
|
36 |
<br/>
|
37 |
-
<span><?php
|
38 |
<div id="dateselectors" style="display: inline;">
|
39 |
-
<input type="text" name="sdate" id="sdate" value="<?php echo $params['sdate']; ?>" style="display:inline;"/> <?php
|
40 |
</div>
|
41 |
<br/>
|
42 |
<br/>
|
43 |
-
<div class="submit" style="display: inline;"><input type="submit" name="Submit" value="Customize" class="button button-primary" /> <a href="#" class="filter_toggle button"><?php
|
44 |
</form>
|
45 |
</div>
|
46 |
|
@@ -56,12 +56,12 @@
|
|
56 |
<form class="form-fields" name="click_form" method="post" action="">
|
57 |
<?php wp_nonce_field('prli-clicks'); ?>
|
58 |
|
59 |
-
<input type="hidden" name="sort" id="sort" value="<?php echo $sort_str; ?>" />
|
60 |
-
<input type="hidden" name="sdir" id="sort" value="<?php echo $sdir_str; ?>" />
|
61 |
<input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
|
62 |
-
<div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="Search Clicks"/>
|
63 |
<?php if(!empty($search_str)): ?>
|
64 |
-
<a href="<?php echo admin_url('admin.php?page=pretty-link-clicks'.(!empty($params['l'])?'&l='.$params['l']:'')); ?>" class="button"><?php
|
65 |
<?php endif; ?>
|
66 |
</div>
|
67 |
</form>
|
@@ -70,35 +70,35 @@
|
|
70 |
<thead>
|
71 |
<tr>
|
72 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
73 |
-
<th class="manage-column" width="5%"><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=btype".(($sort_str == 'btype' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php
|
74 |
</th>
|
75 |
-
<th class="manage-column" width="5%"><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=os".(($sort_str == 'os' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php
|
76 |
</th>
|
77 |
<?php } ?>
|
78 |
<th class="manage-column" width="12%">
|
79 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=ip".(($sort_str == 'ip' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php
|
80 |
</th>
|
81 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
82 |
<th class="manage-column" width="12%">
|
83 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=vuid".(($sort_str == 'vuid' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php
|
84 |
</th>
|
85 |
<?php } ?>
|
86 |
<th class="manage-column" width="13%">
|
87 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=created_at".(($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php
|
88 |
</th>
|
89 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
90 |
<th class="manage-column" width="16%">
|
91 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=host".(($sort_str == 'host' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php
|
92 |
</th>
|
93 |
<?php } ?>
|
94 |
<th class="manage-column" width="16%">
|
95 |
-
<a href="
|
96 |
</th>
|
97 |
<th class="manage-column" width="16%">
|
98 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=referer".(($sort_str == 'referer' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php
|
99 |
</th>
|
100 |
<th class="manage-column" width="13%">
|
101 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=link".(($sort_str == 'link' and $sdir_str == 'asc')?'&sdir=desc':'')); ?>"><?php
|
102 |
</th>
|
103 |
</tr>
|
104 |
</thead>
|
@@ -108,7 +108,7 @@
|
|
108 |
{
|
109 |
?>
|
110 |
<tr>
|
111 |
-
<td colspan="8"><?php
|
112 |
</tr>
|
113 |
<?php
|
114 |
}
|
@@ -119,7 +119,7 @@
|
|
119 |
$alternate = ( $row_index++ % 2 ? '' : 'alternate' );
|
120 |
|
121 |
?>
|
122 |
-
<tr id="record_<?php echo $click->id; ?>" class="<?php echo $alternate; ?>">
|
123 |
|
124 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
|
125 |
<td>
|
@@ -129,38 +129,36 @@
|
|
129 |
?>
|
130 |
|
131 |
<?php if(false===$browser_image): ?>
|
132 |
-
<span style="font-size: 16px; cursor: pointer;" title="<?php echo $click->btype; ?>"><strong>?</strong></span>
|
133 |
<?php else: ?>
|
134 |
-
<img src="<?php echo
|
135 |
<?php endif; ?>
|
136 |
</td>
|
137 |
|
138 |
<td>
|
139 |
<?php if(false===$os_image): ?>
|
140 |
-
<span style="font-size: 16px; cursor: pointer;" title="<?php echo $click->os; ?>"><strong>?</strong></span>
|
141 |
<?php else: ?>
|
142 |
-
<img src="<?php echo
|
143 |
<?php endif; ?>
|
144 |
</td>
|
145 |
<?php endif; ?>
|
146 |
|
147 |
-
<?php $
|
148 |
-
|
149 |
-
<td><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&ip={$click_ip}"); ?>" title="<?php printf(__('View All Activity for IP Address: %s', 'pretty-link'), $click_ip); ?>"><?php echo $click_ip; ?> (<?php echo $click->ip_count; ?>)</a></td>
|
150 |
|
151 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
|
152 |
-
<td><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&vuid={$click->vuid}") ?>" title="<?php
|
153 |
<?php endif; ?>
|
154 |
|
155 |
-
<td><?php echo $click->created_at; ?></td>
|
156 |
|
157 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
|
158 |
-
<td><?php echo $click->host; ?></td>
|
159 |
<?php endif; ?>
|
160 |
|
161 |
-
<td><?php echo $click->uri; ?></td>
|
162 |
-
<td><a href="<?php echo
|
163 |
-
<td><a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&l={$click->link_id}"); ?>" title="<?php
|
164 |
</tr>
|
165 |
<?php
|
166 |
|
@@ -170,26 +168,26 @@
|
|
170 |
<tfoot>
|
171 |
<tr>
|
172 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
173 |
-
<th class="manage-column"><?php
|
174 |
-
<th class="manage-column"><?php
|
175 |
<?php } ?>
|
176 |
-
<th class="manage-column"><?php
|
177 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
178 |
-
<th class="manage-column"><?php
|
179 |
<?php } ?>
|
180 |
-
<th class="manage-column"><?php
|
181 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
182 |
-
<th class="manage-column"><?php
|
183 |
<?php } ?>
|
184 |
-
<th class="manage-column"><?php
|
185 |
-
<th class="manage-column"><?php
|
186 |
-
<th class="manage-column"><?php
|
187 |
</tr>
|
188 |
</tfoot>
|
189 |
</table>
|
190 |
|
191 |
<br/>
|
192 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-clicks&action=csv{$page_params}"); ?>" class="button button-primary"><?php
|
193 |
|
194 |
<?php
|
195 |
require(PRLI_VIEWS_PATH.'/shared/table-nav.php');
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
|
3 |
<div class="wrap">
|
4 |
+
<?php PrliAppHelper::page_title(__('Clicks', 'pretty-link')); ?>
|
5 |
<br/>
|
6 |
+
<span style="font-size: 14px;"><?php echo esc_html(sprintf(__('For %s', 'pretty-link'), stripslashes($link_name))); ?>: </span>
|
7 |
<?php
|
8 |
// Don't show this sheesh if we're displaying the vuid or ip grouping
|
9 |
if(empty($params['ip']) and empty($params['vuid'])) {
|
10 |
?>
|
11 |
+
<a href="#" class="filter_toggle button button-primary" style="vertical-align:middle;"><?php esc_html_e('Customize Report', 'pretty-link'); ?></a>
|
12 |
<?php
|
13 |
}
|
14 |
?>
|
15 |
|
16 |
<?php
|
17 |
if(!empty($params['l']) && $params['l'] != 'all') {
|
18 |
+
echo '<br/><a href="'.esc_url(admin_url("admin.php?page=pretty-link-clicks")).'">« '.esc_html__("Back to Links", 'pretty-link').'</a>';
|
19 |
}
|
20 |
else if(!empty($params['ip']) || !empty($params['vuid'])) {
|
21 |
+
echo '<br/><a href="'.esc_url(admin_url('admin.php?page=pretty-link-clicks')).'">« '.esc_html__("Back to Clicks", 'pretty-link').'</a>';
|
22 |
}
|
23 |
|
24 |
if(empty($params['ip']) && empty($params['vuid'])) {
|
27 |
<div class="filter_pane" style="margin-top:15px;">
|
28 |
<form class="form-fields" name="form2" method="post" action="">
|
29 |
<?php wp_nonce_field('prli-reports'); ?>
|
30 |
+
<span><?php esc_html_e('Type:', 'pretty-link'); ?></span>
|
31 |
<select id="type" name="type" style="display: inline;">
|
32 |
+
<option value="all"<?php selected(empty($params['type']) || $params['type'] == 'all'); ?>><?php esc_html_e('All Clicks', 'pretty-link'); ?> </option>
|
33 |
+
<option value="unique"<?php selected($params['type'] == 'unique'); ?>><?php esc_html_e('Unique Clicks', 'pretty-link'); ?> </option>
|
34 |
</select>
|
35 |
<br/>
|
36 |
<br/>
|
37 |
+
<span><?php esc_html_e('Date Range:', 'pretty-link'); ?></span>
|
38 |
<div id="dateselectors" style="display: inline;">
|
39 |
+
<input type="text" name="sdate" id="sdate" value="<?php echo esc_attr($params['sdate']); ?>" style="display:inline;"/> <?php esc_html_e('to', 'pretty-link'); ?> <input type="text" name="edate" id="edate" value="<?php echo esc_attr($params['edate']); ?>" style="display:inline;"/>
|
40 |
</div>
|
41 |
<br/>
|
42 |
<br/>
|
43 |
+
<div class="submit" style="display: inline;"><input type="submit" name="Submit" value="<?php esc_attr_e('Customize', 'pretty-link'); ?>" class="button button-primary" /> <a href="#" class="filter_toggle button"><?php esc_html_e('Cancel', 'pretty-link'); ?></a></div>
|
44 |
</form>
|
45 |
</div>
|
46 |
|
56 |
<form class="form-fields" name="click_form" method="post" action="">
|
57 |
<?php wp_nonce_field('prli-clicks'); ?>
|
58 |
|
59 |
+
<input type="hidden" name="sort" id="sort" value="<?php echo esc_attr($sort_str); ?>" />
|
60 |
+
<input type="hidden" name="sdir" id="sort" value="<?php echo esc_attr($sdir_str); ?>" />
|
61 |
<input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
|
62 |
+
<div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="<?php esc_attr_e('Search Clicks', 'pretty-link'); ?>"/>
|
63 |
<?php if(!empty($search_str)): ?>
|
64 |
+
<a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-clicks'.(!empty($params['l'])?'&l='.$params['l']:''))); ?>" class="button"><?php esc_html_e('Reset', 'pretty-link'); ?></a>
|
65 |
<?php endif; ?>
|
66 |
</div>
|
67 |
</form>
|
70 |
<thead>
|
71 |
<tr>
|
72 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
73 |
+
<th class="manage-column" width="5%"><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=btype".(($sort_str == 'btype' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Browser', 'pretty-link'); echo (($sort_str == 'btype')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
74 |
</th>
|
75 |
+
<th class="manage-column" width="5%"><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=os".(($sort_str == 'os' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('OS', 'pretty-link'); echo (($sort_str == 'btype')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
76 |
</th>
|
77 |
<?php } ?>
|
78 |
<th class="manage-column" width="12%">
|
79 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=ip".(($sort_str == 'ip' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('IP', 'pretty-link'); echo (($sort_str == 'ip')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
80 |
</th>
|
81 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
82 |
<th class="manage-column" width="12%">
|
83 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=vuid".(($sort_str == 'vuid' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Visitor', 'pretty-link'); echo (($sort_str == 'vuid')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
84 |
</th>
|
85 |
<?php } ?>
|
86 |
<th class="manage-column" width="13%">
|
87 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=created_at".(($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Timestamp', 'pretty-link'); echo ((empty($sort_str) or $sort_str == 'created_at')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.((empty($sort_str) or $sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
88 |
</th>
|
89 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
90 |
<th class="manage-column" width="16%">
|
91 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=host".(($sort_str == 'host' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Host', 'pretty-link'); echo (($sort_str == 'host')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
92 |
</th>
|
93 |
<?php } ?>
|
94 |
<th class="manage-column" width="16%">
|
95 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=uri".(($sort_str == 'uri' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('URI', 'pretty-link'); echo (($sort_str == 'uri')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
96 |
</th>
|
97 |
<th class="manage-column" width="16%">
|
98 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=referer".(($sort_str == 'referer' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Referrer', 'pretty-link'); echo (($sort_str == 'referer')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
99 |
</th>
|
100 |
<th class="manage-column" width="13%">
|
101 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks{$sort_params}&sort=link".(($sort_str == 'link' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>"><?php esc_html_e('Link', 'pretty-link'); echo (($sort_str == 'link')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?></a>
|
102 |
</th>
|
103 |
</tr>
|
104 |
</thead>
|
108 |
{
|
109 |
?>
|
110 |
<tr>
|
111 |
+
<td colspan="8"><?php esc_html_e('No Clicks have been recorded yet', 'pretty-link'); ?></td>
|
112 |
</tr>
|
113 |
<?php
|
114 |
}
|
119 |
$alternate = ( $row_index++ % 2 ? '' : 'alternate' );
|
120 |
|
121 |
?>
|
122 |
+
<tr id="record_<?php echo esc_attr($click->id); ?>" class="<?php echo esc_attr($alternate); ?>">
|
123 |
|
124 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
|
125 |
<td>
|
129 |
?>
|
130 |
|
131 |
<?php if(false===$browser_image): ?>
|
132 |
+
<span style="font-size: 16px; cursor: pointer;" title="<?php echo esc_attr($click->btype); ?>"><strong>?</strong></span>
|
133 |
<?php else: ?>
|
134 |
+
<img src="<?php echo esc_url(PRLI_BROWSER_URL . '/' . $browser_image); ?>" alt="<?php echo esc_attr($click->btype . " v" . $click->bversion); ?>" title="<?php echo esc_attr($click->btype . " v" . $click->bversion); ?>" width="16px" height="16px" style="width: 16px; height: 16px;" />
|
135 |
<?php endif; ?>
|
136 |
</td>
|
137 |
|
138 |
<td>
|
139 |
<?php if(false===$os_image): ?>
|
140 |
+
<span style="font-size: 16px; cursor: pointer;" title="<?php echo esc_attr($click->os); ?>"><strong>?</strong></span>
|
141 |
<?php else: ?>
|
142 |
+
<img src="<?php echo esc_url(PRLI_OS_URL . '/' . $os_image); ?>" alt="<?php echo esc_attr($click->os); ?>" title="<?php echo esc_attr($click->os); ?>" width="16px" height="16px" style="width: 16px; height: 16px;" /></td>
|
143 |
<?php endif; ?>
|
144 |
</td>
|
145 |
<?php endif; ?>
|
146 |
|
147 |
+
<td><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&ip={$click->ip}")); ?>" title="<?php echo esc_attr(sprintf(__('View All Activity for IP Address: %s', 'pretty-link'), $click->ip)); ?>"><?php echo esc_html($click->ip); ?> (<?php echo esc_html($click->ip_count); ?>)</a></td>
|
|
|
|
|
148 |
|
149 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
|
150 |
+
<td><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&vuid={$click->vuid}")); ?>" title="<?php echo esc_attr(sprintf(__('View All Activity for Visitor: %s', 'pretty-link'), $click->vuid)); ?>"><?php echo esc_html($click->vuid); ?><?php echo (($click->vuid != null)?" (".esc_html($click->vuid_count).")":''); ?></a></td>
|
151 |
<?php endif; ?>
|
152 |
|
153 |
+
<td><?php echo esc_html($click->created_at); ?></td>
|
154 |
|
155 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ): ?>
|
156 |
+
<td><?php echo esc_html($click->host); ?></td>
|
157 |
<?php endif; ?>
|
158 |
|
159 |
+
<td><?php echo esc_html($click->uri); ?></td>
|
160 |
+
<td><a href="<?php echo esc_url( $click->referer ); ?>"><?php echo esc_html( $click->referer ); ?></a></td>
|
161 |
+
<td><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&l={$click->link_id}")); ?>" title="<?php echo esc_attr(sprintf(__('View clicks for %s', 'pretty-link'), stripslashes($click->link_name))); ?>"><?php echo esc_html(stripslashes($click->link_name)); ?></a></td>
|
162 |
</tr>
|
163 |
<?php
|
164 |
|
168 |
<tfoot>
|
169 |
<tr>
|
170 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
171 |
+
<th class="manage-column"><?php esc_html_e('Browser', 'pretty-link'); ?></th>
|
172 |
+
<th class="manage-column"><?php esc_html_e('OS', 'pretty-link'); ?></th>
|
173 |
<?php } ?>
|
174 |
+
<th class="manage-column"><?php esc_html_e('IP', 'pretty-link'); ?></th>
|
175 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
176 |
+
<th class="manage-column"><?php esc_html_e('Visitor', 'pretty-link'); ?></th>
|
177 |
<?php } ?>
|
178 |
+
<th class="manage-column"><?php esc_html_e('Timestamp', 'pretty-link'); ?></th>
|
179 |
<?php if( isset($prli_options->extended_tracking) and $prli_options->extended_tracking == "extended" ) { ?>
|
180 |
+
<th class="manage-column"><?php esc_html_e('Host', 'pretty-link'); ?></th>
|
181 |
<?php } ?>
|
182 |
+
<th class="manage-column"><?php esc_html_e('URI', 'pretty-link'); ?></th>
|
183 |
+
<th class="manage-column"><?php esc_html_e('Referrer', 'pretty-link'); ?></th>
|
184 |
+
<th class="manage-column"><?php esc_html_e('Link', 'pretty-link'); ?></th>
|
185 |
</tr>
|
186 |
</tfoot>
|
187 |
</table>
|
188 |
|
189 |
<br/>
|
190 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&action=csv{$page_params}")); ?>" class="button button-primary"><?php esc_html_e('Download CSV', 'pretty-link'); ?> (<?php echo esc_html(stripslashes($link_name)); ?>)</a>
|
191 |
|
192 |
<?php
|
193 |
require(PRLI_VIEWS_PATH.'/shared/table-nav.php');
|
app/views/groups/edit.php
CHANGED
@@ -1,34 +1,40 @@
|
|
1 |
-
<?php
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
3 |
<div class="wrap">
|
4 |
-
<?php
|
5 |
|
6 |
<?php require(PRLI_VIEWS_PATH.'/shared/errors.php'); ?>
|
7 |
|
8 |
-
<form name="form1" method="post" action="<?php echo admin_url("admin.php?page=pretty-link-groups"); ?>">
|
9 |
<input type="hidden" name="action" value="update">
|
10 |
-
<input type="hidden" name="id" value="<?php echo $id; ?>">
|
11 |
<?php wp_nonce_field('update-options'); ?>
|
12 |
|
13 |
<table class="form-table">
|
14 |
<tr class="form-field">
|
15 |
-
<td width="75px" valign="top"><?php
|
16 |
-
<td><input type="text" name="name" value="<?php echo
|
17 |
-
<br/><span class="setting-description"><?php
|
18 |
</tr>
|
19 |
<tr class="form-field">
|
20 |
-
<td valign="top"><?php
|
21 |
-
<td><textarea style="height: 100px;" name="description"><?php echo (
|
22 |
-
<br/><span class="setting-description"><?php
|
23 |
</tr>
|
24 |
<tr class="form-field" valign="top">
|
25 |
-
<td valign="top"><?php
|
26 |
<td valign="top">
|
27 |
<div style="height: 400px; width: 95%; border: 1px solid #8cbdd5; overflow: auto;">
|
28 |
<table width="100%" cellspacing="0">
|
29 |
<thead style="background-color: #dedede; padding: 0px; margin: 0px; line-height: 8px; font-size: 14px;">
|
30 |
-
<th style="padding-left: 5px; margin: 0px; width: 50%; min-width: 50%;"><strong><?php
|
31 |
-
<th style="padding-left: 5px; margin: 0px; width: 50%; min-width: 50%;"><strong><?php
|
32 |
</thead>
|
33 |
<?php
|
34 |
for($i = 0; $i < count($links); $i++) {
|
@@ -36,8 +42,11 @@
|
|
36 |
|
37 |
?>
|
38 |
<tr style="line-height: 15px; font-size: 12px;<?php echo (($i%2)?' background-color: #efefef;':''); ?>">
|
39 |
-
<td style="min-width: 50%; width: 50%"
|
40 |
-
|
|
|
|
|
|
|
41 |
</tr>
|
42 |
<?php
|
43 |
|
@@ -45,13 +54,22 @@
|
|
45 |
?>
|
46 |
</table>
|
47 |
</div>
|
48 |
-
<span class="setting-description"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
</td>
|
50 |
</tr>
|
51 |
</table>
|
52 |
|
53 |
<p class="submit">
|
54 |
-
<input type="submit" class="button button-primary" name="submit" value="<?php
|
55 |
</p>
|
56 |
</form>
|
57 |
</div>
|
1 |
+
<?php
|
2 |
+
if(!defined('ABSPATH')) {
|
3 |
+
die('You are not allowed to call this page directly.');
|
4 |
+
}
|
5 |
|
6 |
+
$name = stripslashes(isset($values['name']) && empty($record) ? $values['name'] : $record->name);
|
7 |
+
$description = stripslashes(isset($values['description']) && empty($record) ? $values['description'] : $record->description);
|
8 |
+
?>
|
9 |
<div class="wrap">
|
10 |
+
<?php PrliAppHelper::page_title(__('Edit Group', 'pretty-link')); ?>
|
11 |
|
12 |
<?php require(PRLI_VIEWS_PATH.'/shared/errors.php'); ?>
|
13 |
|
14 |
+
<form name="form1" method="post" action="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups")); ?>">
|
15 |
<input type="hidden" name="action" value="update">
|
16 |
+
<input type="hidden" name="id" value="<?php echo esc_attr($id); ?>">
|
17 |
<?php wp_nonce_field('update-options'); ?>
|
18 |
|
19 |
<table class="form-table">
|
20 |
<tr class="form-field">
|
21 |
+
<td width="75px" valign="top"><?php esc_html_e('Name:', 'pretty-link'); ?> </td>
|
22 |
+
<td><input type="text" name="name" value="<?php echo esc_attr($name); ?>" size="75">
|
23 |
+
<br/><span class="setting-description"><?php esc_html_e("This is how you'll identify your Group.", 'pretty-link'); ?></span></td>
|
24 |
</tr>
|
25 |
<tr class="form-field">
|
26 |
+
<td valign="top"><?php esc_html_e('Description:', 'pretty-link'); ?> </td>
|
27 |
+
<td><textarea style="height: 100px;" name="description"><?php echo esc_textarea($description); ?></textarea>
|
28 |
+
<br/><span class="setting-description"><?php esc_html_e('A Description of this group.', 'pretty-link'); ?></span></td>
|
29 |
</tr>
|
30 |
<tr class="form-field" valign="top">
|
31 |
+
<td valign="top"><?php esc_html_e('Links:', 'pretty-link'); ?> </td>
|
32 |
<td valign="top">
|
33 |
<div style="height: 400px; width: 95%; border: 1px solid #8cbdd5; overflow: auto;">
|
34 |
<table width="100%" cellspacing="0">
|
35 |
<thead style="background-color: #dedede; padding: 0px; margin: 0px; line-height: 8px; font-size: 14px;">
|
36 |
+
<th style="padding-left: 5px; margin: 0px; width: 50%; min-width: 50%;"><strong><?php esc_html_e('Name', 'pretty-link'); ?></strong></th>
|
37 |
+
<th style="padding-left: 5px; margin: 0px; width: 50%; min-width: 50%;"><strong><?php esc_html_e('Current Group', 'pretty-link'); ?></strong></th>
|
38 |
</thead>
|
39 |
<?php
|
40 |
for($i = 0; $i < count($links); $i++) {
|
42 |
|
43 |
?>
|
44 |
<tr style="line-height: 15px; font-size: 12px;<?php echo (($i%2)?' background-color: #efefef;':''); ?>">
|
45 |
+
<td style="min-width: 50%; width: 50%">
|
46 |
+
<input type="checkbox" style="display:inline;width: 15px; padding: 0; margin: 0; float: left; text-align: left;" name="link[<?php echo esc_attr($link->id); ?>]" <?php echo (((isset($_POST['link'][$link->id]) and $_POST['link'][$link->id] == 'on') or (empty($_POST) and !empty($record) && $link->group_id == $record->id))?'checked="true"':''); ?>/>
|
47 |
+
<span><?php echo esc_html(stripslashes($link->name)) . " <strong>(" . esc_html(stripslashes($link->slug)) . ")</strong>"; ?></span>
|
48 |
+
</td>
|
49 |
+
<td style="min-width: 50%; width: 50%"><?php echo esc_html(stripslashes($link->group_name)); ?></td>
|
50 |
</tr>
|
51 |
<?php
|
52 |
|
54 |
?>
|
55 |
</table>
|
56 |
</div>
|
57 |
+
<span class="setting-description">
|
58 |
+
<?php
|
59 |
+
printf(
|
60 |
+
// translators: %1$s: open strong tag, %2$s close strong tag
|
61 |
+
esc_html__('Select some links for this group. %1$sNote: each link can only be in one group at a time.%2$s', 'pretty-link'),
|
62 |
+
'<strong>',
|
63 |
+
'</strong>'
|
64 |
+
);
|
65 |
+
?>
|
66 |
+
</span>
|
67 |
</td>
|
68 |
</tr>
|
69 |
</table>
|
70 |
|
71 |
<p class="submit">
|
72 |
+
<input type="submit" class="button button-primary" name="submit" value="<?php esc_attr_e('Update', 'pretty-link'); ?>" /> <a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups')); ?>" class="button"><?php esc_html_e('Cancel', 'pretty-link'); ?></a>
|
73 |
</p>
|
74 |
</form>
|
75 |
</div>
|
app/views/groups/list.php
CHANGED
@@ -3,8 +3,8 @@ if(!defined('ABSPATH'))
|
|
3 |
die('You are not allowed to call this page directly.');
|
4 |
?>
|
5 |
<div class="wrap">
|
6 |
-
<?php
|
7 |
-
<a href="<?php echo admin_url('admin.php?page=pretty-link-groups&action=new'); ?>" class="page-title-action"><?php
|
8 |
<hr class="wp-header-end">
|
9 |
|
10 |
<?php if(empty($groups)): ?>
|
@@ -14,14 +14,14 @@ if(!defined('ABSPATH'))
|
|
14 |
<div id="search_pane" style="float: right;">
|
15 |
<form class="form-fields" name="group_form" method="post" action="">
|
16 |
<?php wp_nonce_field('prli-groups'); ?>
|
17 |
-
<input type="hidden" name="sort" id="sort" value="<?php echo $sort_str; ?>" />
|
18 |
-
<input type="hidden" name="sdir" id="sort" value="<?php echo $sdir_str; ?>" />
|
19 |
<input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
|
20 |
-
<div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="Search"/>
|
21 |
<?php
|
22 |
if(!empty($search_str)) {
|
23 |
?>
|
24 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-groups"); ?>" class="button"><?php
|
25 |
<?php
|
26 |
}
|
27 |
?>
|
@@ -36,9 +36,21 @@ if(!defined('ABSPATH'))
|
|
36 |
<table class="widefat post fixed" cellspacing="0">
|
37 |
<thead>
|
38 |
<tr>
|
39 |
-
<th class="manage-column" width="50%"
|
40 |
-
|
41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
</tr>
|
43 |
</thead>
|
44 |
<?php
|
@@ -47,7 +59,7 @@ if(!defined('ABSPATH'))
|
|
47 |
{
|
48 |
?>
|
49 |
<tr>
|
50 |
-
<td colspan="5"><?php
|
51 |
</tr>
|
52 |
<?php
|
53 |
}
|
@@ -58,19 +70,19 @@ if(!defined('ABSPATH'))
|
|
58 |
{
|
59 |
$alternate = ( $row_index++ % 2 ? '' : 'alternate' );
|
60 |
?>
|
61 |
-
<tr id="record_<?php echo $group->id; ?>" class="<?php echo $alternate; ?>">
|
62 |
<td class="edit_group">
|
63 |
-
<a class="group_name" href="<?php echo admin_url("admin.php?page=pretty-link-groups&action=edit&id={$group->id}"); ?>" title="<?php
|
64 |
<br/>
|
65 |
<div class="group_actions">
|
66 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-groups&action=edit&id={$group->id}"); ?>" title="<?php
|
67 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link-groups&action=destroy&id={$group->id}"); ?>" onclick="return confirm('<?php
|
68 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link&group={$group->id}"); ?>" title="View links in
|
69 |
-
<a href="<?php echo admin_url(
|
70 |
</div>
|
71 |
</td>
|
72 |
-
<td><a href="<?php echo admin_url("admin.php?page=pretty-link&group={$group->id}"); ?>" title="View links in
|
73 |
-
<td><?php echo $group->created_at; ?></td>
|
74 |
</tr>
|
75 |
<?php
|
76 |
}
|
@@ -78,9 +90,9 @@ if(!defined('ABSPATH'))
|
|
78 |
?>
|
79 |
<tfoot>
|
80 |
<tr>
|
81 |
-
<th class="manage-column"><?php
|
82 |
-
<th class="manage-column"><?php
|
83 |
-
<th class="manage-column"><?php
|
84 |
</tr>
|
85 |
</tfoot>
|
86 |
</table>
|
3 |
die('You are not allowed to call this page directly.');
|
4 |
?>
|
5 |
<div class="wrap">
|
6 |
+
<?php PrliAppHelper::page_title(__('Groups', 'pretty-link')); ?>
|
7 |
+
<a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups&action=new')); ?>" class="page-title-action"><?php esc_html_e('Add Group', 'pretty-link'); ?></a>
|
8 |
<hr class="wp-header-end">
|
9 |
|
10 |
<?php if(empty($groups)): ?>
|
14 |
<div id="search_pane" style="float: right;">
|
15 |
<form class="form-fields" name="group_form" method="post" action="">
|
16 |
<?php wp_nonce_field('prli-groups'); ?>
|
17 |
+
<input type="hidden" name="sort" id="sort" value="<?php echo esc_attr($sort_str); ?>" />
|
18 |
+
<input type="hidden" name="sdir" id="sort" value="<?php echo esc_attr($sdir_str); ?>" />
|
19 |
<input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
|
20 |
+
<div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="<?php esc_attr_e('Search', 'pretty-link'); ?>"/>
|
21 |
<?php
|
22 |
if(!empty($search_str)) {
|
23 |
?>
|
24 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups")); ?>" class="button"><?php esc_html_e('Reset', 'pretty-link'); ?></a>
|
25 |
<?php
|
26 |
}
|
27 |
?>
|
36 |
<table class="widefat post fixed" cellspacing="0">
|
37 |
<thead>
|
38 |
<tr>
|
39 |
+
<th class="manage-column" width="50%">
|
40 |
+
<a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups&sort=name'.(($sort_str == 'name' && $sdir_str == 'asc')?'&sdir=desc':''))); ?>">
|
41 |
+
<?php esc_html_e('Name', 'pretty-link'); echo (($sort_str == 'name')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?>
|
42 |
+
</a>
|
43 |
+
</th>
|
44 |
+
<th class="manage-column" width="20%">
|
45 |
+
<a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups&sort=link_count'.(($sort_str == 'link_count' && $sdir_str == 'asc')?'&sdir=desc':''))); ?>">
|
46 |
+
<?php esc_html_e('Links', 'pretty-link'); echo (($sort_str == 'link_count')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?>
|
47 |
+
</a>
|
48 |
+
</th>
|
49 |
+
<th class="manage-column" width="30%">
|
50 |
+
<a href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-groups&sort=created_at'.(($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':''))); ?>">
|
51 |
+
<?php esc_html_e('Created', 'pretty-link'); echo ((empty($sort_str) or $sort_str == 'created_at')?' <img src="'.esc_url(PRLI_IMAGES_URL.'/'.((empty($sort_str) or $sdir_str == 'desc')?'arrow_down.png':'arrow_up.png')).'"/>':'') ?>
|
52 |
+
</a>
|
53 |
+
</th>
|
54 |
</tr>
|
55 |
</thead>
|
56 |
<?php
|
59 |
{
|
60 |
?>
|
61 |
<tr>
|
62 |
+
<td colspan="5"><?php esc_html_e('No Pretty Link Groups were found', 'pretty-link'); ?></td>
|
63 |
</tr>
|
64 |
<?php
|
65 |
}
|
70 |
{
|
71 |
$alternate = ( $row_index++ % 2 ? '' : 'alternate' );
|
72 |
?>
|
73 |
+
<tr id="record_<?php echo esc_attr($group->id); ?>" class="<?php echo $alternate; ?>">
|
74 |
<td class="edit_group">
|
75 |
+
<a class="group_name" href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups&action=edit&id={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('Edit %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php echo esc_html(stripslashes($group->name)); ?></a>
|
76 |
<br/>
|
77 |
<div class="group_actions">
|
78 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups&action=edit&id={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('Edit %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php esc_html_e('Edit', 'pretty-link'); ?></a> |
|
79 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups&action=destroy&id={$group->id}")); ?>" onclick="return confirm('<?php echo esc_attr(sprintf(__('Are you sure you want to delete your %s Pretty Link Group?', 'pretty-link'), stripslashes($group->name))); ?>');" title="<?php echo esc_attr(sprintf(__('Delete %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php esc_html_e('Delete', 'pretty-link'); ?></a> |
|
80 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link&group={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('View links in %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php esc_html_e('Links', 'pretty-link'); ?></a> |
|
81 |
+
<a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-clicks&group={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('View hits in %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php esc_html_e('Clicks', 'pretty-link'); ?></a>
|
82 |
</div>
|
83 |
</td>
|
84 |
+
<td><a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link&group={$group->id}")); ?>" title="<?php echo esc_attr(sprintf(__('View links in %s', 'pretty-link'), stripslashes($group->name))); ?>"><?php echo esc_html($group->link_count); ?></a></td>
|
85 |
+
<td><?php echo esc_html($group->created_at); ?></td>
|
86 |
</tr>
|
87 |
<?php
|
88 |
}
|
90 |
?>
|
91 |
<tfoot>
|
92 |
<tr>
|
93 |
+
<th class="manage-column"><?php esc_html_e('Name', 'pretty-link'); ?></th>
|
94 |
+
<th class="manage-column"><?php esc_html_e('Links', 'pretty-link'); ?></th>
|
95 |
+
<th class="manage-column"><?php esc_html_e('Created', 'pretty-link'); ?></th>
|
96 |
</tr>
|
97 |
</tfoot>
|
98 |
</table>
|
app/views/groups/new.php
CHANGED
@@ -2,61 +2,74 @@
|
|
2 |
if(!defined('ABSPATH'))
|
3 |
die('You are not allowed to call this page directly.');
|
4 |
|
5 |
-
$name = isset($_POST['name']) ?
|
|
|
6 |
?>
|
7 |
|
8 |
<div class="wrap">
|
9 |
-
<?php
|
10 |
|
11 |
<?php
|
12 |
require(PRLI_VIEWS_PATH.'/shared/errors.php');
|
13 |
?>
|
14 |
|
15 |
-
<form name="form1" method="post" action="<?php echo admin_url("admin.php?page=pretty-link-groups"); ?>">
|
16 |
<input type="hidden" name="action" value="create">
|
17 |
<?php wp_nonce_field('update-options'); ?>
|
18 |
|
19 |
<table class="form-table">
|
20 |
<tr class="form-field">
|
21 |
-
<td width="75px" valign="top"><?php
|
22 |
-
<td><input type="text" name="name" value="<?php echo $name; ?>" size="75">
|
23 |
-
<br/><span class="setting-description"><?php
|
24 |
</tr>
|
25 |
<tr class="form-field">
|
26 |
-
<td valign="top"><?php
|
27 |
-
<td><textarea style="height: 100px;" name="description"><?php echo (
|
28 |
-
<br/><span class="setting-description"><?php
|
29 |
</tr>
|
30 |
<tr class="form-field" valign="top">
|
31 |
-
<td valign="top"><?php
|
32 |
<td valign="top">
|
33 |
<div style="height: 400px; width: 95%; border: 1px solid #8cbdd5; overflow: auto;">
|
34 |
<table width="100%" cellspacing="0">
|
35 |
<thead style="background-color: #dedede; padding: 0px; margin: 0px; line-height: 8px; font-size: 14px;">
|
36 |
-
<th width="50%" style="padding-left: 5px; margin: 0px;"><strong><?php
|
37 |
-
<th width="50%" style="padding-left: 5px; margin: 0px;"><strong><?php
|
38 |
</thead>
|
39 |
<?php
|
40 |
for($i = 0; $i < count($links); $i++) {
|
41 |
$link = $links[$i];
|
42 |
?>
|
43 |
<tr style="line-height: 15px; font-size: 12px;<?php echo (($i%2)?' background-color: #efefef;':''); ?>">
|
44 |
-
<td style="min-width: 50%; width: 50%;"
|
45 |
-
|
|
|
|
|
|
|
46 |
</tr>
|
47 |
<?php
|
48 |
}
|
49 |
?>
|
50 |
</table>
|
51 |
</div>
|
52 |
-
<span class="setting-description"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
</td>
|
54 |
</tr>
|
55 |
</table>
|
56 |
|
57 |
<p class="submit">
|
58 |
-
<input type="submit" class="button button-primary" name="submit" value="<?php
|
59 |
</p>
|
60 |
|
61 |
</form>
|
62 |
-
</div>
|
2 |
if(!defined('ABSPATH'))
|
3 |
die('You are not allowed to call this page directly.');
|
4 |
|
5 |
+
$name = isset($_POST['name']) ? sanitize_text_field(stripslashes($_POST['name'])) : '';
|
6 |
+
$description = isset($_POST['description']) ? sanitize_textarea_field(stripslashes($_POST['description'])) : '';
|
7 |
?>
|
8 |
|
9 |
<div class="wrap">
|
10 |
+
<?php PrliAppHelper::page_title(__('New Group', 'pretty-link')); ?>
|
11 |
|
12 |
<?php
|
13 |
require(PRLI_VIEWS_PATH.'/shared/errors.php');
|
14 |
?>
|
15 |
|
16 |
+
<form name="form1" method="post" action="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups")); ?>">
|
17 |
<input type="hidden" name="action" value="create">
|
18 |
<?php wp_nonce_field('update-options'); ?>
|
19 |
|
20 |
<table class="form-table">
|
21 |
<tr class="form-field">
|
22 |
+
<td width="75px" valign="top"><?php esc_html_e('Name*:', 'pretty-link'); ?> </td>
|
23 |
+
<td><input type="text" name="name" value="<?php echo esc_attr($name); ?>" size="75">
|
24 |
+
<br/><span class="setting-description"><?php esc_html_e("This is how you'll identify your Group.", 'pretty-link'); ?></span></td>
|
25 |
</tr>
|
26 |
<tr class="form-field">
|
27 |
+
<td valign="top"><?php esc_html_e('Description:', 'pretty-link'); ?> </td>
|
28 |
+
<td><textarea style="height: 100px;" name="description"><?php echo esc_textarea($description) ?></textarea>
|
29 |
+
<br/><span class="setting-description"><?php esc_html_e('A Description of this group.', 'pretty-link'); ?></span></td>
|
30 |
</tr>
|
31 |
<tr class="form-field" valign="top">
|
32 |
+
<td valign="top"><?php esc_html_e('Links:', 'pretty-link'); ?> </td>
|
33 |
<td valign="top">
|
34 |
<div style="height: 400px; width: 95%; border: 1px solid #8cbdd5; overflow: auto;">
|
35 |
<table width="100%" cellspacing="0">
|
36 |
<thead style="background-color: #dedede; padding: 0px; margin: 0px; line-height: 8px; font-size: 14px;">
|
37 |
+
<th width="50%" style="padding-left: 5px; margin: 0px;"><strong><?php esc_html_e('Name', 'pretty-link'); ?></strong></th>
|
38 |
+
<th width="50%" style="padding-left: 5px; margin: 0px;"><strong><?php esc_html_e('Current Group', 'pretty-link'); ?></strong></th>
|
39 |
</thead>
|
40 |
<?php
|
41 |
for($i = 0; $i < count($links); $i++) {
|
42 |
$link = $links[$i];
|
43 |
?>
|
44 |
<tr style="line-height: 15px; font-size: 12px;<?php echo (($i%2)?' background-color: #efefef;':''); ?>">
|
45 |
+
<td style="min-width: 50%; width: 50%;">
|
46 |
+
<input type="checkbox" style="width: 15px;" name="link[<?php echo esc_attr($link->id); ?>]" <?php echo ((isset($_POST['link'][$link->id]) and $_POST['link'][$link->id] == 'on')?'checked="true"':''); ?>/>
|
47 |
+
<?php echo esc_html(stripslashes($link->name)) . " <strong>(" . esc_html(stripslashes($link->slug)) . ")</strong>"; ?>
|
48 |
+
</td>
|
49 |
+
<td style="min-width: 50%; width: 50%;"><?php echo esc_html(stripslashes($link->group_name)); ?></td>
|
50 |
</tr>
|
51 |
<?php
|
52 |
}
|
53 |
?>
|
54 |
</table>
|
55 |
</div>
|
56 |
+
<span class="setting-description">
|
57 |
+
<?php
|
58 |
+
printf(
|
59 |
+
// translators: %1$s: open strong tag, %2$s close strong tag
|
60 |
+
esc_html__('Select some links for this group. %1$sNote: each link can only be in one group at a time.%2$s', 'pretty-link'),
|
61 |
+
'<strong>',
|
62 |
+
'</strong>'
|
63 |
+
);
|
64 |
+
?>
|
65 |
+
</span>
|
66 |
</td>
|
67 |
</tr>
|
68 |
</table>
|
69 |
|
70 |
<p class="submit">
|
71 |
+
<input type="submit" class="button button-primary" name="submit" value="<?php esc_attr_e('Create', 'pretty-link'); ?>" /> <a href="<?php echo esc_url(admin_url("admin.php?page=pretty-link-groups")); ?>" class="button"><?php esc_html_e('Cancel', 'pretty-link'); ?></a>
|
72 |
</p>
|
73 |
|
74 |
</form>
|
75 |
+
</div>
|
app/views/links/edit.php
DELETED
@@ -1,19 +0,0 @@
|
|
1 |
-
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
-
|
3 |
-
<div class="wrap">
|
4 |
-
<?php echo PrliAppHelper::page_title(__('Edit Link', 'pretty-link')); ?>
|
5 |
-
|
6 |
-
<?php require(PRLI_VIEWS_PATH.'/shared/errors.php'); ?>
|
7 |
-
|
8 |
-
<form name="form1" method="post" action="<?php echo admin_url('admin.php?page=pretty-link'); ?>">
|
9 |
-
<input type="hidden" name="action" value="update">
|
10 |
-
<input type="hidden" name="id" value="<?php echo $id; ?>">
|
11 |
-
<?php wp_nonce_field('update-options'); ?>
|
12 |
-
|
13 |
-
<?php require(PRLI_VIEWS_PATH.'/links/form.php'); ?>
|
14 |
-
|
15 |
-
<p class="submit">
|
16 |
-
<input type="submit" class="button button-primary" name="submit" value="<?php _e('Update', 'pretty-link'); ?>" /> <a href="<?php echo admin_url('admin.php?page=pretty-link'); ?>" class="button"><?php _e('Cancel', 'pretty-link'); ?></a>
|
17 |
-
</p>
|
18 |
-
</form>
|
19 |
-
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/views/links/form.php
CHANGED
@@ -1,243 +1,47 @@
|
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
<?php
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
?>
|
24 |
-
<p class="description"><?php printf(__('Make your life easier by upgrading to %1$sPretty Links Pro%2$s -- get more redirection types, speed, automations and <b>results from your links</b> by %1$sgoing pro today!%2$s', 'pretty-link'),'<a href="https://prettylinks.com/pl/link-form/upgrade" target="_blank">','</a>') ?></p>
|
25 |
-
<?php
|
26 |
-
} ?>
|
27 |
-
</td>
|
28 |
-
</tr>
|
29 |
-
<tr id="prli_target_url">
|
30 |
-
<th scope="row">
|
31 |
-
<?php _e('Target URL*', 'pretty-link'); ?>
|
32 |
-
<?php PrliAppHelper::info_tooltip(
|
33 |
-
'prli-link-options-target-url',
|
34 |
-
__('Target URL', 'pretty-link'),
|
35 |
-
__('This is the URL that your Pretty Link will redirect to.', 'pretty-link')
|
36 |
-
); ?>
|
37 |
-
</th>
|
38 |
-
<td>
|
39 |
-
<textarea class="large-text" name="url"><?php echo esc_html($values['url'],ENT_COMPAT,'UTF-8'); ?></textarea>
|
40 |
-
</td>
|
41 |
-
</tr>
|
42 |
-
<tr>
|
43 |
-
<th scope="row">
|
44 |
-
<?php _e('Pretty Link*', 'pretty-link'); ?>
|
45 |
-
<?php PrliAppHelper::info_tooltip(
|
46 |
-
'prli-link-options-slug',
|
47 |
-
__('Pretty Link', 'pretty-link'),
|
48 |
-
__('This is how your pretty link will appear. You can edit the Pretty Link slug here.', 'pretty-link')
|
49 |
-
); ?>
|
50 |
-
</th>
|
51 |
-
<td>
|
52 |
-
<strong><?php global $prli_blogurl; echo esc_html($prli_blogurl); ?></strong>/<input type="text" name="slug" class="regular-text" value="<?php echo esc_attr($values['slug']); ?>" />
|
53 |
</td>
|
54 |
</tr>
|
55 |
<tr>
|
56 |
-
<
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
</th>
|
64 |
-
<td>
|
65 |
-
<input type="text" name="name" class="large-text" value="<?php echo esc_attr($values['name']); ?>" />
|
66 |
</td>
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
<td>
|
78 |
-
<textarea class="large-text" name="description"><?php echo esc_html($values['description'],ENT_COMPAT,'UTF-8'); ?></textarea>
|
79 |
</td>
|
80 |
</tr>
|
81 |
</table>
|
82 |
|
83 |
-
<div class="prli-sub-box-white">
|
84 |
-
<h3 class="prli-page-title"><a href="" class="prli-toggle-link" data-box="prli-link-advanced-options"><?php _e('Advanced Options', 'pretty-link'); ?></a></h3>
|
85 |
-
<div class="prli-sub-box prli-link-advanced-options prli-hidden">
|
86 |
-
<div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
|
87 |
-
<table class="form-table" id="prli-link-advanced-options-box">
|
88 |
-
<tbody>
|
89 |
-
<tr>
|
90 |
-
<th scope="row">
|
91 |
-
<?php _e('Group', 'pretty-link'); ?>
|
92 |
-
<?php PrliAppHelper::info_tooltip(
|
93 |
-
'prli-link-options-group',
|
94 |
-
__('Link Group', 'pretty-link'),
|
95 |
-
__('Select a Group for this Link', 'pretty-link')
|
96 |
-
); ?>
|
97 |
-
</th>
|
98 |
-
<td>
|
99 |
-
<select name="group_id" id="group_dropdown" style="padding: 0px; margin: 0px;">
|
100 |
-
<option><?php _e("None", 'pretty-link') ?></option>
|
101 |
-
<?php
|
102 |
-
foreach($values['groups'] as $group) {
|
103 |
-
?>
|
104 |
-
<option value="<?php echo esc_attr($group['id']); ?>"<?php echo esc_html($group['value']); ?>><?php echo esc_html($group['name']); ?> </option>
|
105 |
-
<?php
|
106 |
-
}
|
107 |
-
?>
|
108 |
-
</select>
|
109 |
-
<input class="defaultText" id="add_group_textbox" title="<?php _e('Add a New Group', 'pretty-link') ?>" type="text" prli_nonce="<?php echo wp_create_nonce('prli-add-new-group'); ?>" style="vertical-align:middle;" /><div id="add_group_message"></div>
|
110 |
-
</td>
|
111 |
-
</tr>
|
112 |
-
<tr>
|
113 |
-
<th scope="row">
|
114 |
-
<?php _e('No Follow', 'pretty-link'); ?>
|
115 |
-
<?php PrliAppHelper::info_tooltip(
|
116 |
-
'prli-link-options-nofollow',
|
117 |
-
__('Nofollow Link', 'pretty-link'),
|
118 |
-
__('Add a nofollow and noindex to this link\'s http redirect header', 'pretty-link')
|
119 |
-
); ?>
|
120 |
-
</th>
|
121 |
-
<td>
|
122 |
-
<input type="checkbox" name="nofollow" <?php echo esc_html($values['nofollow']); ?>/>
|
123 |
-
</td>
|
124 |
-
</tr>
|
125 |
-
<tr id="prli_time_delay" style="display: none">
|
126 |
-
<th scope="row">
|
127 |
-
<?php _e('Delay Redirect', 'pretty-link'); ?>
|
128 |
-
<?php PrliAppHelper::info_tooltip(
|
129 |
-
'prli-link-delay-redirect',
|
130 |
-
__('Delay Redirect', 'pretty-link'),
|
131 |
-
__('Time in seconds to wait before redirecting', 'pretty-link')
|
132 |
-
); ?>
|
133 |
-
</th>
|
134 |
-
<td>
|
135 |
-
<input type="number" name="delay" class="small-text" value="<?php echo esc_attr($values['delay']); ?>" />
|
136 |
-
</td>
|
137 |
-
</tr>
|
138 |
-
<tr>
|
139 |
-
<th scope="row">
|
140 |
-
<?php _e("Parameter Forwarding", 'pretty-link') ?>
|
141 |
-
<?php PrliAppHelper::info_tooltip(
|
142 |
-
'prli-link-parameter-forwarding',
|
143 |
-
__('Parameter Forwarding', 'pretty-link'),
|
144 |
-
__('Forward parameters passed to this link onto the Target URL', 'pretty-link')
|
145 |
-
); ?>
|
146 |
-
</th>
|
147 |
-
<td>
|
148 |
-
<input type="checkbox" name="param_forwarding" id="param_forwarding" <?php echo checked($values['param_forwarding']); ?> />
|
149 |
-
</td>
|
150 |
-
</tr>
|
151 |
-
<tr>
|
152 |
-
<th scope="row">
|
153 |
-
<?php _e("Tracking", 'pretty-link') ?>
|
154 |
-
<?php PrliAppHelper::info_tooltip(
|
155 |
-
'prli-link-tracking-options',
|
156 |
-
__('Tracking', 'pretty-link'),
|
157 |
-
__('Enable Pretty Link\'s built-in hit (click) tracking', 'pretty-link')
|
158 |
-
); ?>
|
159 |
-
</th>
|
160 |
-
<td>
|
161 |
-
<input type="checkbox" name="track_me" <?php echo esc_html($values['track_me']); ?> />
|
162 |
-
</td>
|
163 |
-
</tr>
|
164 |
-
<tr id="prli_google_analytics" style="display: none">
|
165 |
-
<th scope="row">
|
166 |
-
<?php _e('Google Analytics', 'pretty-link'); ?>
|
167 |
-
<?php PrliAppHelper::info_tooltip(
|
168 |
-
'prli-link-ga',
|
169 |
-
__('Google Analytics Tracking', 'pretty-link'),
|
170 |
-
__('Requires the Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast) or Google Analytics Plugin installed and configured for this to work.', 'pretty-link')
|
171 |
-
); ?>
|
172 |
-
</th>
|
173 |
-
<td>
|
174 |
-
<?php
|
175 |
-
global $plp_update;
|
176 |
-
if($plp_update->is_installed()):
|
177 |
-
if($ga_info = PlpUtils::ga_installed()):
|
178 |
-
?>
|
179 |
-
<input type="checkbox" name="google_tracking" <?php echo esc_html($values['google_tracking']); ?> />
|
180 |
-
<p class="description"><?php printf(__('It appears that <strong>%s</strong> is currently installed. Pretty Link will attempt to use its settings to track this link.', 'pretty-link'), $ga_info['name']); ?></p>
|
181 |
-
<?php
|
182 |
-
else:
|
183 |
-
?>
|
184 |
-
<input type="hidden" name="google_tracking" value="" />
|
185 |
-
<p class="description"><strong><?php _e('No Google Analytics Plugin is currently installed. Pretty Link cannot track links using Google Analytics until one is.', 'pretty-link'); ?></strong></p>
|
186 |
-
<?php
|
187 |
-
endif;
|
188 |
-
endif;
|
189 |
-
?>
|
190 |
-
</td>
|
191 |
-
</tr>
|
192 |
-
</tbody>
|
193 |
-
</table>
|
194 |
-
</div>
|
195 |
-
</div>
|
196 |
-
<div> </div>
|
197 |
-
<div class="prli-sub-box-white">
|
198 |
-
<h3><a href="" class="prli-toggle-link" data-box="prli-link-pro-options"><?php _e('Pro Options', 'pretty-link'); ?></a></h3>
|
199 |
-
<div class="prli-sub-box prli-link-pro-options prli-hidden">
|
200 |
-
<div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
|
201 |
-
<?php
|
202 |
-
global $plp_update;
|
203 |
-
if($plp_update->is_installed()) {
|
204 |
-
?>
|
205 |
-
<table class="form-table" id="prli-link-pro-options-box">
|
206 |
-
<?php
|
207 |
-
|
208 |
-
$id = isset($id)?$id:false;
|
209 |
-
// Add stuff to the form here
|
210 |
-
do_action('prli_link_fields',$id);
|
211 |
-
|
212 |
-
?>
|
213 |
-
</table>
|
214 |
-
<?php
|
215 |
-
}
|
216 |
-
else {
|
217 |
-
?>
|
218 |
-
<h2><?php _e('Oops!', 'pretty-link'); ?></h2>
|
219 |
-
|
220 |
-
<div>
|
221 |
-
<?php printf(__('It looks like you haven\'t %1$supgraded to Pretty Links Pro%2$s yet. Here are just a few things you could be doing with pro:', 'pretty-link'),'<a href="https://prettylinks.com/pl/link-form/upgrade-1" target="_blank">','</a>') ?>
|
222 |
-
</div>
|
223 |
-
<div> </div>
|
224 |
-
<ul style="padding-left: 25px;">
|
225 |
-
<li>• <?php _e('Auto-replace keywords throughout your site with Pretty Links', 'pretty-link'); ?></li>
|
226 |
-
<li>• <?php _e('Protect your affiliate links by using Cloaked Redirects', 'pretty-link'); ?></li>
|
227 |
-
<li>• <?php _e('Redirect based on a visitor\'s location', 'pretty-link'); ?></li>
|
228 |
-
<li>• <?php _e('Auto-prettylink your Pages & Posts', 'pretty-link'); ?></li>
|
229 |
-
<li>• <?php _e('Find out what works and what doesn\'t by split testing your links', 'pretty-link'); ?></li>
|
230 |
-
<li>• <?php _e('And much, much more!', 'pretty-link'); ?></li>
|
231 |
-
</ul>
|
232 |
-
<div> </div>
|
233 |
-
<div><?php _e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data. And there\'s even a 14 day money back guarantee.', 'pretty-link'); ?></div>
|
234 |
-
<div> </div>
|
235 |
-
<div><?php _e('We think you\'ll love it!', 'pretty-link'); ?></div>
|
236 |
-
<div> </div>
|
237 |
-
<div><a href="https://prettylinks.com/pl/link-form/upgrade-2" class="button button-primary"><?php _e('Upgrade to Pro today!', 'pretty-link'); ?></a></div>
|
238 |
-
<?php
|
239 |
-
}
|
240 |
-
?>
|
241 |
-
</div>
|
242 |
-
</div>
|
243 |
-
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
|
3 |
+
<?php
|
4 |
+
if(isset($values['link_id']) && $values['link_id'] > 0) {
|
5 |
+
?>
|
6 |
+
<input type="hidden" name="link_id" value="<?php echo esc_attr($values['link_id']); ?>" />
|
7 |
+
<?php
|
8 |
+
}
|
9 |
+
|
10 |
+
$link_nonce = wp_create_nonce(PrliLink::$nonce_str . wp_salt());
|
11 |
+
?>
|
12 |
+
|
13 |
+
<input type="hidden" name="<?php echo esc_attr(PrliLink::$nonce_str); ?>" value="<?php echo esc_attr($link_nonce); ?>" />
|
14 |
+
|
15 |
+
<div id="pretty_link_errors" class="prli-hidden">
|
16 |
+
<p><!-- This is where our errors will show up --></p>
|
17 |
+
</div>
|
18 |
+
|
19 |
+
<table class="prli-settings-table">
|
20 |
+
<tr class="prli-mobile-nav">
|
21 |
+
<td colspan="2">
|
22 |
+
<a href="" class="prli-toggle-nav"><i class="pl-icon-menu"> </i></a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
</td>
|
24 |
</tr>
|
25 |
<tr>
|
26 |
+
<td class="prli-settings-table-nav">
|
27 |
+
<ul class="prli-sidebar-nav">
|
28 |
+
<li><a data-id="basic"><?php esc_html_e('Basic', 'pretty-link'); ?></a></li>
|
29 |
+
<li><a data-id="advanced"><?php esc_html_e('Advanced', 'pretty-link'); ?></a></li>
|
30 |
+
<li><a data-id="pro"><?php esc_html_e('Pro', 'pretty-link'); ?></a></li>
|
31 |
+
<?php do_action('prli_admin_link_nav'); ?>
|
32 |
+
</ul>
|
|
|
|
|
|
|
33 |
</td>
|
34 |
+
<td class="prli-settings-table-pages">
|
35 |
+
<div class="prli-page" id="basic">
|
36 |
+
<?php require(PRLI_VIEWS_PATH . '/links/form_basic.php'); ?>
|
37 |
+
</div>
|
38 |
+
<div class="prli-page" id="advanced">
|
39 |
+
<?php require(PRLI_VIEWS_PATH . '/links/form_advanced.php'); ?>
|
40 |
+
</div>
|
41 |
+
<div class="prli-page" id="pro">
|
42 |
+
<?php require(PRLI_VIEWS_PATH . '/links/form_pro.php'); ?>
|
43 |
+
</div>
|
|
|
|
|
44 |
</td>
|
45 |
</tr>
|
46 |
</table>
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/views/links/form_advanced.php
ADDED
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
+
|
3 |
+
<table class="form-table">
|
4 |
+
<tr>
|
5 |
+
<th scope="row">
|
6 |
+
<?php esc_html_e('No Follow', 'pretty-link'); ?>
|
7 |
+
<?php PrliAppHelper::info_tooltip(
|
8 |
+
'prli-link-options-nofollow',
|
9 |
+
esc_html__('Nofollow Link', 'pretty-link'),
|
10 |
+
esc_html__('Add a nofollow and noindex to this link\'s http redirect header', 'pretty-link')
|
11 |
+
); ?>
|
12 |
+
</th>
|
13 |
+
<td>
|
14 |
+
<input type="checkbox" name="nofollow" <?php checked($values['nofollow']); ?>/>
|
15 |
+
</td>
|
16 |
+
</tr>
|
17 |
+
<tr id="prli_time_delay" style="display: none">
|
18 |
+
<th scope="row">
|
19 |
+
<?php esc_html_e('Delay Redirect', 'pretty-link'); ?>
|
20 |
+
<?php PrliAppHelper::info_tooltip(
|
21 |
+
'prli-link-delay-redirect',
|
22 |
+
esc_html__('Delay Redirect', 'pretty-link'),
|
23 |
+
esc_html__('Time in seconds to wait before redirecting', 'pretty-link')
|
24 |
+
); ?>
|
25 |
+
</th>
|
26 |
+
<td>
|
27 |
+
<input type="number" name="delay" class="small-text" value="<?php echo esc_attr($values['delay']); ?>" />
|
28 |
+
</td>
|
29 |
+
</tr>
|
30 |
+
<tr>
|
31 |
+
<th scope="row">
|
32 |
+
<?php esc_html_e("Parameter Forwarding", 'pretty-link') ?>
|
33 |
+
<?php PrliAppHelper::info_tooltip(
|
34 |
+
'prli-link-parameter-forwarding',
|
35 |
+
esc_html__('Parameter Forwarding', 'pretty-link'),
|
36 |
+
esc_html__('Forward parameters passed to this link onto the Target URL', 'pretty-link')
|
37 |
+
); ?>
|
38 |
+
</th>
|
39 |
+
<td>
|
40 |
+
<input type="checkbox" name="param_forwarding" id="param_forwarding" <?php checked($values['param_forwarding']); ?> />
|
41 |
+
</td>
|
42 |
+
</tr>
|
43 |
+
<tr>
|
44 |
+
<th scope="row">
|
45 |
+
<?php esc_html_e("Tracking", 'pretty-link') ?>
|
46 |
+
<?php PrliAppHelper::info_tooltip(
|
47 |
+
'prli-link-tracking-options',
|
48 |
+
esc_html__('Tracking', 'pretty-link'),
|
49 |
+
esc_html__('Enable Pretty Link\'s built-in hit (click) tracking', 'pretty-link')
|
50 |
+
); ?>
|
51 |
+
</th>
|
52 |
+
<td>
|
53 |
+
<input type="checkbox" name="track_me" <?php checked($values['track_me']); ?> />
|
54 |
+
</td>
|
55 |
+
</tr>
|
56 |
+
<tr id="prli_google_analytics" style="display: none">
|
57 |
+
<th scope="row">
|
58 |
+
<?php esc_html_e('Google Analytics', 'pretty-link'); ?>
|
59 |
+
<?php PrliAppHelper::info_tooltip(
|
60 |
+
'prli-link-ga',
|
61 |
+
esc_html__('Google Analytics Tracking', 'pretty-link'),
|
62 |
+
esc_html__('Requires the Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast) or Google Analytics Plugin installed and configured for this to work.', 'pretty-link')
|
63 |
+
); ?>
|
64 |
+
</th>
|
65 |
+
<td>
|
66 |
+
<?php
|
67 |
+
global $plp_update;
|
68 |
+
if($plp_update->is_installed()):
|
69 |
+
if($ga_info = PlpUtils::ga_installed()):
|
70 |
+
?>
|
71 |
+
<input type="checkbox" name="google_tracking" <?php echo esc_html($values['google_tracking']); ?> />
|
72 |
+
<p class="description">
|
73 |
+
<?php
|
74 |
+
printf(
|
75 |
+
esc_html__('It appears that %s is currently installed. Pretty Link will attempt to use its settings to track this link.', 'pretty-link'),
|
76 |
+
'<strong>' . esc_html($ga_info['name']) . '</strong>'
|
77 |
+
);
|
78 |
+
?>
|
79 |
+
</p>
|
80 |
+
<?php
|
81 |
+
else:
|
82 |
+
?>
|
83 |
+
<input type="hidden" name="google_tracking" value="" />
|
84 |
+
<p class="description"><strong><?php esc_html_e('No Google Analytics Plugin is currently installed. Pretty Link cannot track links using Google Analytics until one is.', 'pretty-link'); ?></strong></p>
|
85 |
+
<?php
|
86 |
+
endif;
|
87 |
+
endif;
|
88 |
+
?>
|
89 |
+
</td>
|
90 |
+
</tr>
|
91 |
+
</table>
|
92 |
+
|
app/views/links/form_basic.php
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
+
|
3 |
+
<table class="form-table">
|
4 |
+
<tr>
|
5 |
+
<th scope="row">
|
6 |
+
<?php esc_html_e('Redirection*', 'pretty-link'); ?>
|
7 |
+
<?php PrliAppHelper::info_tooltip(
|
8 |
+
'prli-link-options-redirection-type',
|
9 |
+
esc_html__('Redirection Type', 'pretty-link'),
|
10 |
+
esc_html__('This is the method of redirection for your link.', 'pretty-link')
|
11 |
+
); ?>
|
12 |
+
</th>
|
13 |
+
<td>
|
14 |
+
<select id="redirect_type" name="redirect_type" style="padding: 0px; margin: 0px;">
|
15 |
+
<option value="307"<?php echo $values['redirect_type']['307']; ?>><?php esc_html_e("307 (Temporary)", 'pretty-link') ?> </option>
|
16 |
+
<option value="302"<?php echo $values['redirect_type']['302']; ?>><?php esc_html_e("302 (Temporary)", 'pretty-link') ?> </option>
|
17 |
+
<option value="301"<?php echo $values['redirect_type']['301']; ?>><?php esc_html_e("301 (Permanent)", 'pretty-link') ?> </option>
|
18 |
+
<?php do_action('prli_redirection_types', $values, false); ?>
|
19 |
+
</select>
|
20 |
+
<?php
|
21 |
+
global $plp_update;
|
22 |
+
if(!$plp_update->is_installed()) {
|
23 |
+
?>
|
24 |
+
<p class="description"><?php printf(esc_html__('Get cloaked redirects, Javascript redirects and more when you %1$sUpgrade to PRO%2$s', 'pretty-link'),'<a href="https://prettylinks.com/pl/link-form/upgrade" target="_blank">','</a>') ?></p>
|
25 |
+
<?php
|
26 |
+
}
|
27 |
+
?>
|
28 |
+
</td>
|
29 |
+
</tr>
|
30 |
+
<tr id="prli_target_url">
|
31 |
+
<th scope="row">
|
32 |
+
<?php esc_html_e('Target URL*', 'pretty-link'); ?>
|
33 |
+
<?php PrliAppHelper::info_tooltip(
|
34 |
+
'prli-link-options-target-url',
|
35 |
+
esc_html__('Target URL', 'pretty-link'),
|
36 |
+
esc_html__('This is the URL that your Pretty Link will redirect to.', 'pretty-link')
|
37 |
+
); ?>
|
38 |
+
</th>
|
39 |
+
<td>
|
40 |
+
<textarea class="large-text" name="url"><?php echo esc_textarea($values['url']); ?></textarea>
|
41 |
+
</td>
|
42 |
+
</tr>
|
43 |
+
<tr>
|
44 |
+
<th scope="row">
|
45 |
+
<?php esc_html_e('Pretty Link*', 'pretty-link'); ?>
|
46 |
+
<?php PrliAppHelper::info_tooltip(
|
47 |
+
'prli-link-options-slug',
|
48 |
+
esc_html__('Pretty Link', 'pretty-link'),
|
49 |
+
esc_html__('This is how your pretty link will appear. You can edit the Pretty Link slug here.', 'pretty-link')
|
50 |
+
); ?>
|
51 |
+
</th>
|
52 |
+
<td>
|
53 |
+
<strong><?php global $prli_blogurl; echo esc_html($prli_blogurl); ?></strong>/<input type="text" name="slug" class="regular-text" value="<?php echo esc_attr($values['slug']); ?>" />
|
54 |
+
</td>
|
55 |
+
</tr>
|
56 |
+
<tr>
|
57 |
+
<th scope="row">
|
58 |
+
<?php esc_html_e('Notes', 'pretty-link'); ?>
|
59 |
+
<?php PrliAppHelper::info_tooltip(
|
60 |
+
'prli-link-options-notes',
|
61 |
+
esc_html__('Notes', 'pretty-link'),
|
62 |
+
esc_html__('This is a field where you can enter notes about a particular link. This notes field is mainly for your own link management needs. It isn\'t currently used anywhere on the front end.', 'pretty-link')
|
63 |
+
); ?>
|
64 |
+
</th>
|
65 |
+
<td>
|
66 |
+
<textarea class="large-text" name="description"><?php echo esc_textarea($values['description']); ?></textarea>
|
67 |
+
</td>
|
68 |
+
</tr>
|
69 |
+
</table>
|
70 |
+
|
app/views/links/form_pro.php
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
+
|
3 |
+
<?php
|
4 |
+
global $plp_update;
|
5 |
+
if($plp_update->is_installed()) {
|
6 |
+
$id = isset($id)?$id:false;
|
7 |
+
// Add stuff to the form here
|
8 |
+
do_action('prli_link_fields',$id);
|
9 |
+
}
|
10 |
+
else {
|
11 |
+
?>
|
12 |
+
<table class="form-table">
|
13 |
+
<tr class="prli-pro-only">
|
14 |
+
<th scope="row">
|
15 |
+
<?php esc_html_e('Expire', 'pretty-link'); ?>
|
16 |
+
<?php PrliAppHelper::info_tooltip(
|
17 |
+
'plp-expire',
|
18 |
+
esc_html__('Expire Link', 'pretty-link'),
|
19 |
+
esc_html__('Set this link to expire after a specific date or number of clicks.', 'pretty-link')
|
20 |
+
); ?>
|
21 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('link-expire'); ?>
|
22 |
+
</th>
|
23 |
+
<td>
|
24 |
+
<input class="prli-toggle-checkbox" type="checkbox" disabled />
|
25 |
+
</td>
|
26 |
+
</tr>
|
27 |
+
|
28 |
+
<tr class="prli-pro-only">
|
29 |
+
<th scope="row">
|
30 |
+
<?php esc_html_e('Keywords', 'pretty-link'); ?>
|
31 |
+
<?php PrliAppHelper::info_tooltip(
|
32 |
+
'prli-link-pro-options-keywords',
|
33 |
+
esc_html__('Auto-Replace Keywords', 'pretty-link'),
|
34 |
+
esc_html__('Enter a comma separated list of keywords / keyword phrases that you\'d like to replace with this link in your Posts & Pages.', 'pretty-link')); ?>
|
35 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('link-keywords'); ?>
|
36 |
+
</th>
|
37 |
+
<td>
|
38 |
+
<input type="text" class="large-text" disabled />
|
39 |
+
</td>
|
40 |
+
</tr>
|
41 |
+
|
42 |
+
<tr class="prli-pro-only">
|
43 |
+
<th scope="row">
|
44 |
+
<?php esc_html_e('URL Replacements', 'pretty-link'); ?>
|
45 |
+
<?php PrliAppHelper::info_tooltip(
|
46 |
+
'prli-link-pro-options-url-replacements',
|
47 |
+
esc_html__('Auto-Replace URLs', 'pretty-link'),
|
48 |
+
sprintf(
|
49 |
+
// translators: %1$s: open code tag, %2$s: close code tag
|
50 |
+
esc_html__('Enter a comma separated list of the URLs that you\'d like to replace with this Pretty Link in your Posts & Pages. These must be formatted as URLs for example: %1$shttp://example.com%2$s or %1$shttp://example.com?product_id=53%2$s', 'pretty-link'),
|
51 |
+
'<code>',
|
52 |
+
'</code>'
|
53 |
+
)
|
54 |
+
); ?>
|
55 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('link-url-replacements'); ?>
|
56 |
+
</th>
|
57 |
+
<td>
|
58 |
+
<input type="text" class="large-text" disabled />
|
59 |
+
</td>
|
60 |
+
</tr>
|
61 |
+
|
62 |
+
<tr class="prli-pro-only">
|
63 |
+
<th scope="row">
|
64 |
+
<?php esc_html_e('Head Scripts', 'pretty-link'); ?>
|
65 |
+
<?php PrliAppHelper::info_tooltip(
|
66 |
+
'prli-link-pro-options-head-scripts',
|
67 |
+
esc_html__('Head Scripts', 'pretty-link'),
|
68 |
+
sprintf(
|
69 |
+
// translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
|
70 |
+
esc_html__('Useful for adding Google Analytics tracking, Facebook retargeting pixels, or any other kind of tracking script to the HTML head for this pretty link.%1$s%1$sThese scripts will be in addition to any global one\'s you\'ve defined in the options.%1$s%1$s%2$sNOTE:%3$s This does NOT work with 301, 302 and 307 type redirects.', 'pretty-link'),
|
71 |
+
'<br>',
|
72 |
+
'<b>',
|
73 |
+
'</b>'
|
74 |
+
)
|
75 |
+
); ?>
|
76 |
+
</th>
|
77 |
+
<td>
|
78 |
+
<textarea class="large-text" disabled></textarea>
|
79 |
+
</td>
|
80 |
+
</tr>
|
81 |
+
|
82 |
+
<tr class="prli-pro-only">
|
83 |
+
<th scope="row">
|
84 |
+
<?php esc_html_e('Dynamic Redirection', 'pretty-link'); ?>
|
85 |
+
<?php PrliAppHelper::info_tooltip(
|
86 |
+
'prli-link-pro-options-dynamic-redirection-options',
|
87 |
+
esc_html__('Dynamic Redirection Options', 'pretty-link'),
|
88 |
+
esc_html__('These powerful options are available to give you dynamic control over redirection for this pretty link.', 'pretty-link')
|
89 |
+
); ?>
|
90 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('dynamic-redirection'); ?>
|
91 |
+
</th>
|
92 |
+
<td>
|
93 |
+
<select disabled>
|
94 |
+
<option value="none"><?php esc_html_e('None', 'pretty-link'); ?></option>
|
95 |
+
<option value="rotate"><?php esc_html_e('Rotation', 'pretty-link'); ?></option>
|
96 |
+
<option value="geo"><?php esc_html_e('Geographic', 'pretty-link'); ?></option>
|
97 |
+
<option value="tech"><?php esc_html_e('Technology', 'pretty-link'); ?></option>
|
98 |
+
<option value="time"><?php esc_html_e('Time', 'pretty-link'); ?></option>
|
99 |
+
</select>
|
100 |
+
</td>
|
101 |
+
</tr>
|
102 |
+
</table>
|
103 |
+
<?php
|
104 |
+
}
|
app/views/links/list.php
DELETED
@@ -1,163 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
3 |
-
|
4 |
-
$group = (isset($_REQUEST['group']))?(int)$_REQUEST['group']:'';
|
5 |
-
$size = (isset($_REQUEST['size']))?(int)$_REQUEST['size']:'10';
|
6 |
-
$search = (isset($_REQUEST['search']))?sanitize_text_field($_REQUEST['search']):'';
|
7 |
-
|
8 |
-
$url_params = "&group={$group}&size={$size}&search={$search}"
|
9 |
-
?>
|
10 |
-
|
11 |
-
<div class="wrap">
|
12 |
-
<?php echo PrliAppHelper::page_title(__('Pretty Links', 'pretty-link')); ?>
|
13 |
-
<a href="<?php echo admin_url('admin.php?page=add-new-pretty-link'); ?>" class="page-title-action"><?php _e('Add Pretty Link', 'pretty-link'); ?></a>
|
14 |
-
<hr class="wp-header-end">
|
15 |
-
|
16 |
-
<?php if(empty($params['group'])): ?>
|
17 |
-
<?php $permalink_structure = get_option('permalink_structure'); ?>
|
18 |
-
<?php if(!$permalink_structure or empty($permalink_structure)): ?>
|
19 |
-
<div class="error"><p><strong><?php _e("WordPress Must be Configured:</strong> Pretty Link won't work until you select a Permalink Structure other than 'Default'", 'pretty-link'); ?> ... <a href="<?php echo admin_url('options-permalink.php'); ?>"><?php _e('Permalink Settings', 'pretty-link'); ?></a></p></div>
|
20 |
-
<?php endif; //end $permalink_structure ?>
|
21 |
-
<?php if($record_count <= 0): ?>
|
22 |
-
<div class="updated notice notice-success is-dismissible"><p><?php echo $prli_message; ?></p></div>
|
23 |
-
<?php endif; //end $record_count message ?>
|
24 |
-
<?php do_action('prli-link-message'); ?>
|
25 |
-
<div id="search_pane" style="float: right;">
|
26 |
-
<form class="form-fields" name="link_form" method="post" action="">
|
27 |
-
<?php wp_nonce_field('prli-links'); ?>
|
28 |
-
<input type="hidden" name="sort" id="sort" value="<?php echo $sort_str; ?>" />
|
29 |
-
<input type="hidden" name="sdir" id="sort" value="<?php echo $sdir_str; ?>" />
|
30 |
-
<input type="text" name="search" id="search" value="<?php echo esc_attr($search_str); ?>" style="display:inline;"/>
|
31 |
-
<div class="submit" style="display: inline;"><input class="button button-primary" type="submit" name="Submit" value="Search"/>
|
32 |
-
<?php
|
33 |
-
if(!empty($search_str)) {
|
34 |
-
$link_nonce = wp_create_nonce( 'link-actions' );
|
35 |
-
?>
|
36 |
-
<a href="<?php echo admin_url("admin.php?page=pretty-link&action=reset&_wpnonce={$link_nonce}"); ?>" class="button"><?php _e('Reset', 'pretty-link'); ?></a>
|
37 |
-
<?php
|
38 |
-
}
|
39 |
-
?>
|
40 |
-
</div>
|
41 |
-
</form>
|
42 |
-
</div>
|
43 |
-
<?php else: //else if Groups ?>
|
44 |
-
<h3><?php echo $prli_message; ?></h3>
|
45 |
-
<a href="<?php echo admin_url('admin.php?page=pretty-link-groups'); ?>">« <?php _e('Back to Groups', 'pretty-link'); ?></a>
|
46 |
-
<br/><br/>
|
47 |
-
<?php endif; //end if Groups ?>
|
48 |
-
<?php $footer = false; require(PRLI_VIEWS_PATH.'/shared/link-table-nav.php'); ?>
|
49 |
-
<table class="prli-edit-table widefat post fixed" cellspacing="0">
|
50 |
-
<thead>
|
51 |
-
<tr>
|
52 |
-
<th class="manage-column" width="30%"><input type="checkbox" name="check-all" class="select-all-link-action-checkboxes" style="margin-left: 1px;"/> <a href="<?php echo admin_url('admin.php?page=pretty-link&sort=name' . (($sort_str == 'name' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params); ?>"><?php _e('Name', 'pretty-link'); echo (($sort_str == 'name')?' <img src="'.PRLI_IMAGES_URL . '/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
|
53 |
-
<?php do_action('prli_link_column_header'); ?>
|
54 |
-
<th class="manage-column" width="10%"><a href="<?php echo admin_url('admin.php?page=pretty-link&sort=clicks' . (($sort_str == 'clicks' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params); ?>"><?php _e('Clicks / Uniq', 'pretty-link'); echo (($sort_str == 'clicks')?' <img src="'.PRLI_IMAGES_URL . '/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
|
55 |
-
<th class="manage-column" width="5%"><a href="<?php echo admin_url('admin.php?page=pretty-link&sort=group_name' . (($sort_str == 'group_name' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params) ?>"><?php _e('Group', 'pretty-link'); echo (($sort_str == 'group_name')?' <img src="'.PRLI_IMAGES_URL . '/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
|
56 |
-
<th class="manage-column" width="12%"><a href="<?php echo admin_url('admin.php?page=pretty-link&sort=created_at' . (($sort_str == 'created_at' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params); ?>"><?php _e('Created', 'pretty-link'); echo ((empty($sort_str) or $sort_str == 'created_at')?' <img src="'.PRLI_IMAGES_URL . '/'.((empty($sort_str) or $sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
|
57 |
-
<th class="manage-column" width="20%"><a href="<?php echo admin_url('admin.php?page=pretty-link&sort=slug' . (($sort_str == 'slug' and $sdir_str == 'asc')?'&sdir=desc':'') . $url_params); ?>"><?php _e('Links', 'pretty-link'); echo (($sort_str == 'slug')?' <img src="'.PRLI_IMAGES_URL . '/'.(($sdir_str == 'desc')?'arrow_down.png':'arrow_up.png').'"/>':'') ?></a></th>
|
58 |
-
</tr>
|
59 |
-
</thead>
|
60 |
-
<tr id="bulk-edit" class="inline-edit-row inline-edit-row-post inline-edit-post bulk-edit-row bulk-edit-row-post bulk-edit-post" style="display: none;">
|
61 |
-
<td class="colspanchange">
|
62 |
-
<form id="prli-bulk-action-form" action="<?php echo admin_url('admin.php'); ?>" method="post">
|
63 |
-
<input type="hidden" name="page" value="pretty-link" />
|
64 |
-
<input type="hidden" name="action" value="bulk-edit" />
|
65 |
-
<input type="hidden" name="_wpnonce" value="<?php echo wp_create_nonce('prli-bulk-edit'); ?>" />
|
66 |
-
<fieldset class="inline-edit-col-left">
|
67 |
-
<div class="inline-edit-col">
|
68 |
-
<h4><?php _e('Bulk Edit', 'pretty-link'); ?></h4>
|
69 |
-
<div id="bulk-title-div">
|
70 |
-
<div id="bulk-titles"></div>
|
71 |
-
</div>
|
72 |
-
</div>
|
73 |
-
</fieldset>
|
74 |
-
<fieldset class="inline-edit-col-center">
|
75 |
-
<h4><?php _e('Basic Link Options', 'pretty-link'); ?></h4>
|
76 |
-
<div class="bacheck-title"><?php _e('Redirect Type', 'pretty-link'); ?></div>
|
77 |
-
<?php PrliLinksHelper::redirect_type_dropdown( 'bu[redirect_type]', '', array(__('- No Change -', 'pretty-link') => '##nochange##'), 'bulk-edit-select' ) ?>
|
78 |
-
<br/>
|
79 |
-
<div class="bacheck-title"><?php _e('Group', 'pretty-link'); ?></div>
|
80 |
-
<?php PrliLinksHelper::groups_dropdown('bu[group_id]', '', array(__('- No Change -', 'pretty-link') => '##nochange##'), 'bulk-edit-select'); ?>
|
81 |
-
<br/>
|
82 |
-
<?php PrliLinksHelper::bulk_action_checkbox_dropdown('bu[track_me]', __('Track', 'pretty-link'), 'bulk-edit-select'); ?>
|
83 |
-
<br/>
|
84 |
-
<?php PrliLinksHelper::bulk_action_checkbox_dropdown('bu[nofollow]', __('Nofollow', 'pretty-link'), 'bulk-edit-select'); ?>
|
85 |
-
<br/>
|
86 |
-
<?php PrliLinksHelper::bulk_action_checkbox_dropdown('bu[param_forwarding]', __('Forward Params', 'pretty-link'), 'bulk-edit-select'); ?>
|
87 |
-
<br/>
|
88 |
-
</fieldset>
|
89 |
-
<fieldset class="inline-edit-col-right">
|
90 |
-
<?php do_action('prli_bulk_action_right_col'); ?>
|
91 |
-
</fieldset>
|
92 |
-
<p class="submit inline-edit-save">
|
93 |
-
<a href="javascript:" title="<?php _e('Cancel', 'pretty-link'); ?>" class="button-secondary bulk-edit-cancel alignleft"><?php _e('Cancel', 'pretty-link'); ?></a>
|
94 |
-
<a href="javascript:" title="<?php _e('Update', 'pretty-link'); ?>" class="button-primary bulk-edit-update alignright"><?php _e('Bulk Update', 'pretty-link'); ?></a><br class="clear">
|
95 |
-
</p>
|
96 |
-
</form>
|
97 |
-
</td>
|
98 |
-
</tr>
|
99 |
-
<?php
|
100 |
-
|
101 |
-
if($record_count <= 0) {
|
102 |
-
?>
|
103 |
-
<tr>
|
104 |
-
<td colspan="5"><?php printf(__('No Pretty Links were found, %sCreate One%s', 'pretty-link'), '<a href="' . admin_url('admin.php?page=add-new-pretty-link') . '">', '</a>'); ?></td>
|
105 |
-
</tr>
|
106 |
-
<?php
|
107 |
-
}
|
108 |
-
else {
|
109 |
-
global $prli_blogurl;
|
110 |
-
$row_index=0;
|
111 |
-
foreach($links as $link) {
|
112 |
-
$alternate = ( $row_index++ % 2 ? '' : ' alternate' );
|
113 |
-
$struct = PrliUtils::get_permalink_pre_slug_uri();
|
114 |
-
$pretty_link_url = "{$prli_blogurl}{$struct}{$link->slug}";
|
115 |
-
$plnotes = empty($link->description) ? $link->name : $link->description;
|
116 |
-
?>
|
117 |
-
|
118 |
-
<tr id="record_<?php echo $link->id; ?>" class="link_row<?php echo $alternate; ?>">
|
119 |
-
<td class="edit_link">
|
120 |
-
|
121 |
-
<input type="checkbox" name="link-action[<?php echo $link->id; ?>]" class="link-action-checkbox" data-id="<?php echo $link->id; ?>" data-title="<?php echo esc_attr(stripslashes($link->name)); ?>" /> <?php PrliLinksHelper::link_list_icons($link); ?>
|
122 |
-
<a class="slug_name" href="<?php echo admin_url('admin.php?page=pretty-link&action=edit&id='.$link->id); ?>" title="<?php echo esc_attr(stripslashes($plnotes)); ?>"><?php echo stripslashes($link->name); ?></a>
|
123 |
-
<div class="link_actions">
|
124 |
-
<br/>
|
125 |
-
<?php echo PrliLinksHelper::link_list_actions($link, $pretty_link_url); ?>
|
126 |
-
</div>
|
127 |
-
</td>
|
128 |
-
<?php do_action('prli_link_column_row',$link->id); ?>
|
129 |
-
<td>
|
130 |
-
<?php if($prli_options->extended_tracking!='count')
|
131 |
-
echo (($link->track_me)?"<a href=\"". admin_url( "admin.php?page=pretty-link-clicks&l={$link->id}" ) . "\" title=\"View clicks for $link->slug\">" . (empty($link->clicks)?0:$link->clicks) . "/" . (empty($link->uniques)?0:$link->uniques) . "</a>":"<img src=\"".PRLI_IMAGES_URL."/not_tracking.png\" title=\"This link isn't being tracked\"/>");
|
132 |
-
else
|
133 |
-
echo (($link->track_me)?(empty($link->clicks)?0:$link->clicks) . "/" . (empty($link->uniques)?0:$link->uniques):"<img src=\"".PRLI_IMAGES_URL."/not_tracking.png\" title=\"This link isn't being tracked\"/>");
|
134 |
-
?>
|
135 |
-
</td>
|
136 |
-
<td><a href="<?php echo admin_url( "admin.php?page=pretty-link&group={$link->group_id}"); ?>"><?php echo $link->group_name; ?></a></td>
|
137 |
-
<td><?php echo $link->created_at; ?></td>
|
138 |
-
</td>
|
139 |
-
<td>
|
140 |
-
<input type='text' style="font-size: 10px; width: 65%;" readonly="true" onclick='this.select();' onfocus='this.select();' value='<?php echo $pretty_link_url; ?>' />
|
141 |
-
<span class="list-clipboard prli-clipboard"><i class="pl-icon-clipboard pl-list-icon icon-clipboardjs" data-clipboard-text="<?php echo $pretty_link_url; ?>"></i></span>
|
142 |
-
<?php if( $link->redirect_type != 'pixel' ) { ?>
|
143 |
-
<div style="font-size: 8px;" title="<?php echo $link->url; ?>"><strong><?php _e('Target URL:', 'pretty-link'); ?></strong> <?php echo htmlentities((substr($link->url,0,47) . ((strlen($link->url) >= 47)?'...':'')),ENT_COMPAT,'UTF-8'); ?></div>
|
144 |
-
<?php } ?>
|
145 |
-
</td>
|
146 |
-
</tr>
|
147 |
-
<?php
|
148 |
-
}
|
149 |
-
}
|
150 |
-
?>
|
151 |
-
<tfoot>
|
152 |
-
<tr>
|
153 |
-
<th class="manage-column"><?php do_action('prli-list-header-icon'); ?><?php _e('Name', 'pretty-link'); ?></th>
|
154 |
-
<?php do_action('prli_link_column_footer'); ?>
|
155 |
-
<th class="manage-column"><?php _e('Clicks / Uniq', 'pretty-link'); ?></th>
|
156 |
-
<th class="manage-column"><?php _e('Group', 'pretty-link'); ?></th>
|
157 |
-
<th class="manage-column"><?php _e('Created', 'pretty-link'); ?></th>
|
158 |
-
<th class="manage-column"><?php _e('Links', 'pretty-link'); ?></th>
|
159 |
-
</tr>
|
160 |
-
</tfoot>
|
161 |
-
</table>
|
162 |
-
<?php $footer = true; require(PRLI_VIEWS_PATH.'/shared/link-table-nav.php'); ?>
|
163 |
-
</div> <!-- end wrap -->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/views/links/new.php
DELETED
@@ -1,18 +0,0 @@
|
|
1 |
-
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
-
|
3 |
-
<div class="wrap">
|
4 |
-
<?php echo PrliAppHelper::page_title(__('Add Pretty Link', 'pretty-link')); ?>
|
5 |
-
|
6 |
-
<?php require(PRLI_VIEWS_PATH.'/shared/errors.php'); ?>
|
7 |
-
|
8 |
-
<form name="form1" method="post" action="<?php echo admin_url("admin.php?page=pretty-link"); ?>">
|
9 |
-
<input type="hidden" name="action" value="create">
|
10 |
-
<?php wp_nonce_field('update-options'); ?>
|
11 |
-
|
12 |
-
<?php require(PRLI_VIEWS_PATH.'/links/form.php'); ?>
|
13 |
-
|
14 |
-
<p class="submit">
|
15 |
-
<input type="submit" class="button button-primary" name="submit" value="<?php _e('Create', 'pretty-link'); ?>" /> <a href="<?php echo admin_url('admin.php?page=pretty-link'); ?>" class="button"><?php _e('Cancel', 'pretty-link'); ?></a>
|
16 |
-
</p>
|
17 |
-
</form>
|
18 |
-
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/views/options/form.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
<div class="wrap">
|
3 |
-
<?php
|
4 |
-
<a href="https://prettylinks.com/user-manual-2" class="page-title-action"><?php
|
5 |
<hr class="wp-header-end">
|
6 |
|
7 |
<?php
|
@@ -9,7 +9,19 @@
|
|
9 |
if(!$permalink_structure or empty($permalink_structure)) {
|
10 |
global $prli_siteurl;
|
11 |
?>
|
12 |
-
<div class="error"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
<?php
|
14 |
}
|
15 |
|
@@ -20,8 +32,8 @@
|
|
20 |
<div class="updated notice notice-success is-dismissible"><p><strong><?php echo esc_html($update_message); ?></strong></p></div>
|
21 |
<?php endif; ?>
|
22 |
|
23 |
-
<form name="form1" id="prli-options" method="post" action="<?php echo admin_url('/admin.php?page=pretty-link-options'); ?>">
|
24 |
-
<input type="hidden" name="<?php echo $hidden_field_name; ?>" value="Y">
|
25 |
<?php wp_nonce_field('update-options'); ?>
|
26 |
|
27 |
<table class="prli-settings-table">
|
@@ -34,132 +46,234 @@
|
|
34 |
<td class="prli-settings-table-nav">
|
35 |
<ul class="prli-sidebar-nav">
|
36 |
<?php if($plp_update->is_installed()): ?>
|
37 |
-
<li><a data-id="general"><?php
|
38 |
<?php endif; ?>
|
39 |
-
<li><a data-id="links"><?php
|
40 |
-
<li><a data-id="reporting"><?php
|
|
|
|
|
|
|
|
|
|
|
41 |
<?php do_action('prli_admin_options_nav'); ?>
|
42 |
</ul>
|
43 |
</td>
|
44 |
<td class="prli-settings-table-pages">
|
45 |
<?php if($plp_update->is_installed()): ?>
|
46 |
<div class="prli-page" id="general">
|
47 |
-
<div class="prli-page-title"><?php
|
48 |
<?php do_action('prli_admin_general_options'); ?>
|
49 |
</div>
|
50 |
<?php endif; ?>
|
51 |
|
52 |
<div class="prli-page" id="links">
|
53 |
-
<div class="prli-page-title"><?php
|
54 |
<table class="form-table">
|
55 |
<tbody>
|
56 |
<tr valign="top">
|
57 |
<th scope="row">
|
58 |
-
<label for="<?php echo $link_redirect_type; ?>"><?php
|
59 |
<?php PrliAppHelper::info_tooltip('prli-options-default-link-redirection',
|
60 |
-
|
61 |
-
|
62 |
?>
|
63 |
</th>
|
64 |
<td>
|
65 |
<?php PrliLinksHelper::redirect_type_dropdown($link_redirect_type, $prli_options->link_redirect_type); ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
66 |
</td>
|
67 |
</tr>
|
68 |
<tr valign="top">
|
69 |
<th scope="row">
|
70 |
-
<label for="<?php echo $link_track_me; ?>"><?php
|
71 |
<?php PrliAppHelper::info_tooltip('prli-options-track-link',
|
72 |
-
|
73 |
-
|
74 |
?>
|
75 |
</th>
|
76 |
<td>
|
77 |
-
<input type="checkbox" name="<?php echo $link_track_me; ?>" <?php checked($prli_options->link_track_me != 0); ?>/>
|
78 |
</td>
|
79 |
</tr>
|
80 |
<tr valign="top">
|
81 |
<th scope="row">
|
82 |
-
<label for="<?php echo $link_nofollow; ?>"><?php
|
83 |
<?php PrliAppHelper::info_tooltip('prli-options-add-nofollow',
|
84 |
-
|
85 |
-
|
86 |
?>
|
87 |
</th>
|
88 |
<td>
|
89 |
-
<input type="checkbox" name="<?php echo $link_nofollow; ?>" <?php checked($prli_options->link_nofollow != 0); ?>/>
|
90 |
</td>
|
91 |
</tr>
|
92 |
<tr valign="top">
|
93 |
<th scope="row">
|
94 |
-
<label for="<?php echo $link_prefix; ?>"><?php
|
95 |
<?php PrliAppHelper::info_tooltip('prli-options-use-prefix-permalinks',
|
96 |
-
|
97 |
-
|
98 |
?>
|
99 |
</th>
|
100 |
<td>
|
101 |
-
<input type="checkbox" name="<?php echo $link_prefix; ?>" <?php checked($prli_options->link_prefix != 0); ?>/>
|
102 |
</td>
|
103 |
</tr>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
<?php do_action('prli_custom_link_options'); ?>
|
105 |
</tbody>
|
106 |
</table>
|
107 |
</div>
|
108 |
|
109 |
<div class="prli-page" id="reporting">
|
110 |
-
<div class="prli-page-title"><?php
|
111 |
<table class="form-table">
|
112 |
<tbody>
|
113 |
<tr valign="top">
|
114 |
<th scope="row">
|
115 |
-
<?php
|
116 |
<?php PrliAppHelper::info_tooltip('prli-options-tracking-style',
|
117 |
-
|
118 |
-
|
119 |
?>
|
120 |
</th>
|
121 |
<td>
|
122 |
-
<input type="radio" name="<?php echo $extended_tracking; ?>" value="normal" <?php checked($prli_options->extended_tracking,'normal'); ?>/><span class="prli-radio-text"><?php
|
123 |
-
<input type="radio" name="<?php echo $extended_tracking; ?>" value="extended"<?php checked($prli_options->extended_tracking,'extended'); ?>/><span class="prli-radio-text"><?php
|
124 |
-
<input type="radio" name="<?php echo $extended_tracking; ?>" value="count"<?php checked($prli_options->extended_tracking,'count'); ?>/><span class="prli-radio-text"><?php
|
125 |
</td>
|
126 |
</tr>
|
127 |
<tr valign="top">
|
128 |
<th scope="row">
|
129 |
-
<label for="<?php echo $prli_exclude_ips; ?>">
|
130 |
-
<?php
|
131 |
<?php PrliAppHelper::info_tooltip('prli-options-excluded-ips',
|
132 |
-
|
133 |
-
|
|
|
|
|
|
|
|
|
134 |
?>
|
135 |
</label>
|
136 |
</th>
|
137 |
<td>
|
138 |
-
<input type="text" name="<?php echo $prli_exclude_ips; ?>" class="regular-text" value="<?php echo $prli_options->prli_exclude_ips; ?>">
|
139 |
</td>
|
140 |
</tr>
|
141 |
<tr valign="top">
|
142 |
<th scope="row">
|
143 |
-
<?php
|
144 |
<?php PrliAppHelper::info_tooltip('prli-options-auto-trim-clicks',
|
145 |
-
|
146 |
-
|
147 |
?>
|
148 |
</th>
|
149 |
<td>
|
150 |
-
<input type="checkbox" name="<?php echo $auto_trim_clicks; ?>" <?php checked($prli_options->auto_trim_clicks != 0); ?> />
|
151 |
</td>
|
152 |
</tr>
|
153 |
<tr valign="top">
|
154 |
<th scope="row">
|
155 |
-
<?php
|
156 |
<?php PrliAppHelper::info_tooltip('prli-options-filter-robots',
|
157 |
-
|
158 |
-
|
159 |
?>
|
160 |
</th>
|
161 |
<td>
|
162 |
-
<input type="checkbox" class="prli-toggle-checkbox" data-box="prli-whitelist-ips" name="<?php echo $filter_robots; ?>" <?php checked($prli_options->filter_robots != 0); ?> />
|
163 |
</td>
|
164 |
</tr>
|
165 |
</tbody>
|
@@ -170,28 +284,719 @@
|
|
170 |
<tbody>
|
171 |
<tr valign="top">
|
172 |
<th scope="row">
|
173 |
-
<label for="<?php echo $whitelist_ips; ?>">
|
174 |
-
<?php
|
175 |
<?php PrliAppHelper::info_tooltip('prli-options-whitelist-ips',
|
176 |
-
|
177 |
-
|
178 |
?>
|
179 |
</label>
|
180 |
</th>
|
181 |
-
<td><input type="text" name="<?php echo $whitelist_ips; ?>" class="regular-text" value="<?php echo $prli_options->whitelist_ips; ?>"></td>
|
182 |
</tr>
|
183 |
</tbody>
|
184 |
</table>
|
185 |
</div>
|
186 |
</div>
|
187 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
188 |
<?php do_action('prli_admin_options_pages'); ?>
|
189 |
</td>
|
190 |
</tr>
|
191 |
</table>
|
192 |
|
193 |
<p class="submit">
|
194 |
-
<input type="submit" name="submit" class="button button-primary" value="<?php
|
195 |
</p>
|
196 |
|
197 |
</form>
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
<div class="wrap">
|
3 |
+
<?php PrliAppHelper::page_title(esc_html__('Options', 'pretty-link')); ?>
|
4 |
+
<a href="https://prettylinks.com/user-manual-2" class="page-title-action"><?php esc_html_e('User Manual', 'pretty-link'); ?></a>
|
5 |
<hr class="wp-header-end">
|
6 |
|
7 |
<?php
|
9 |
if(!$permalink_structure or empty($permalink_structure)) {
|
10 |
global $prli_siteurl;
|
11 |
?>
|
12 |
+
<div class="error">
|
13 |
+
<p>
|
14 |
+
<?php
|
15 |
+
printf(
|
16 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
17 |
+
esc_html__('%1$sWordPress Must be Configured:%2$s Pretty Links won\'t work until you select a Permalink Structure other than \'Default\'', 'pretty-link'),
|
18 |
+
'<strong>',
|
19 |
+
'</strong>'
|
20 |
+
);
|
21 |
+
?>
|
22 |
+
... <a href="<?php echo esc_url(admin_url('options-permalink.php')); ?>"><?php esc_html_e('Permalink Settings', 'pretty-link'); ?></a>
|
23 |
+
</p>
|
24 |
+
</div>
|
25 |
<?php
|
26 |
}
|
27 |
|
32 |
<div class="updated notice notice-success is-dismissible"><p><strong><?php echo esc_html($update_message); ?></strong></p></div>
|
33 |
<?php endif; ?>
|
34 |
|
35 |
+
<form name="form1" id="prli-options" method="post" action="<?php echo esc_url(admin_url('/admin.php?page=pretty-link-options')); ?>">
|
36 |
+
<input type="hidden" name="<?php echo esc_attr($hidden_field_name); ?>" value="Y">
|
37 |
<?php wp_nonce_field('update-options'); ?>
|
38 |
|
39 |
<table class="prli-settings-table">
|
46 |
<td class="prli-settings-table-nav">
|
47 |
<ul class="prli-sidebar-nav">
|
48 |
<?php if($plp_update->is_installed()): ?>
|
49 |
+
<li><a data-id="general"><?php esc_html_e('General', 'pretty-link'); ?></a></li>
|
50 |
<?php endif; ?>
|
51 |
+
<li><a data-id="links"><?php esc_html_e('Links', 'pretty-link'); ?></a></li>
|
52 |
+
<li><a data-id="reporting"><?php esc_html_e('Reporting', 'pretty-link'); ?></a></li>
|
53 |
+
<li><a data-id="replacements"><?php esc_html_e('Replacements', 'pretty-link'); ?></a></li>
|
54 |
+
<li><a data-id="auto-create"><?php esc_html_e('Auto-Create Links', 'pretty-link'); ?></a></li>
|
55 |
+
<li><a data-id="prettybar"><?php esc_html_e('Pretty Bar', 'pretty-link'); ?></a></li>
|
56 |
+
<li><a data-id="social"><?php esc_html_e('Social', 'pretty-link'); ?></a></li>
|
57 |
+
<li><a data-id="public-links"><?php esc_html_e('Public', 'pretty-link'); ?></a></li>
|
58 |
<?php do_action('prli_admin_options_nav'); ?>
|
59 |
</ul>
|
60 |
</td>
|
61 |
<td class="prli-settings-table-pages">
|
62 |
<?php if($plp_update->is_installed()): ?>
|
63 |
<div class="prli-page" id="general">
|
64 |
+
<div class="prli-page-title"><?php esc_html_e('General Options', 'pretty-link'); ?></div>
|
65 |
<?php do_action('prli_admin_general_options'); ?>
|
66 |
</div>
|
67 |
<?php endif; ?>
|
68 |
|
69 |
<div class="prli-page" id="links">
|
70 |
+
<div class="prli-page-title"><?php esc_html_e('Default Link Options', 'pretty-link'); ?></div>
|
71 |
<table class="form-table">
|
72 |
<tbody>
|
73 |
<tr valign="top">
|
74 |
<th scope="row">
|
75 |
+
<label for="<?php echo esc_attr($link_redirect_type); ?>"><?php esc_html_e('Redirection', 'pretty-link') ?></label>
|
76 |
<?php PrliAppHelper::info_tooltip('prli-options-default-link-redirection',
|
77 |
+
esc_html__('Redirection Type', 'pretty-link'),
|
78 |
+
esc_html__('Select the type of redirection you want your newly created links to have.', 'pretty-link'));
|
79 |
?>
|
80 |
</th>
|
81 |
<td>
|
82 |
<?php PrliLinksHelper::redirect_type_dropdown($link_redirect_type, $prli_options->link_redirect_type); ?>
|
83 |
+
<?php
|
84 |
+
global $plp_update;
|
85 |
+
if(!$plp_update->is_installed()) {
|
86 |
+
?>
|
87 |
+
<p class="description"><?php printf(esc_html__('Get cloaked redirects, Javascript redirects and more when you %1$sUpgrade to PRO%2$s', 'pretty-link'),'<a href="https://prettylinks.com/pl/link-form/upgrade" target="_blank">','</a>') ?></p>
|
88 |
+
<?php
|
89 |
+
}
|
90 |
+
?>
|
91 |
</td>
|
92 |
</tr>
|
93 |
<tr valign="top">
|
94 |
<th scope="row">
|
95 |
+
<label for="<?php echo esc_attr($link_track_me); ?>"><?php esc_html_e('Enable Tracking', 'pretty-link'); ?></label>
|
96 |
<?php PrliAppHelper::info_tooltip('prli-options-track-link',
|
97 |
+
esc_html__('Enable Tracking', 'pretty-link'),
|
98 |
+
esc_html__('Default all new links to be tracked.', 'pretty-link'));
|
99 |
?>
|
100 |
</th>
|
101 |
<td>
|
102 |
+
<input type="checkbox" name="<?php echo esc_attr($link_track_me); ?>" <?php checked($prli_options->link_track_me != 0); ?>/>
|
103 |
</td>
|
104 |
</tr>
|
105 |
<tr valign="top">
|
106 |
<th scope="row">
|
107 |
+
<label for="<?php echo esc_attr($link_nofollow); ?>"><?php esc_html_e('Enable No Follow', 'pretty-link'); ?></label>
|
108 |
<?php PrliAppHelper::info_tooltip('prli-options-add-nofollow',
|
109 |
+
esc_html__('Add No Follow', 'pretty-link'),
|
110 |
+
esc_html__('Add the \'nofollow\' attribute by default to new links.', 'pretty-link'));
|
111 |
?>
|
112 |
</th>
|
113 |
<td>
|
114 |
+
<input type="checkbox" name="<?php echo esc_attr($link_nofollow); ?>" <?php checked($prli_options->link_nofollow != 0); ?>/>
|
115 |
</td>
|
116 |
</tr>
|
117 |
<tr valign="top">
|
118 |
<th scope="row">
|
119 |
+
<label for="<?php echo esc_attr($link_prefix); ?>"><?php esc_html_e('Enable Permalink Fix', 'pretty-link'); ?></label>
|
120 |
<?php PrliAppHelper::info_tooltip('prli-options-use-prefix-permalinks',
|
121 |
+
esc_html__('Use fix for index.php Permalink Structure', 'pretty-link'),
|
122 |
+
esc_html__("This option should ONLY be checked if you have elements in your permalink structure that must be present in any link on your site. For example, some WordPress installs don't have the benefit of full rewrite capabilities and in this case you'd need an index.php included in each link (http://example.com/index.php/mycoolslug instead of http://example.com/mycoolslug). If this is the case for you then check this option but the vast majority of users will want to keep this unchecked.", 'pretty-link'));
|
123 |
?>
|
124 |
</th>
|
125 |
<td>
|
126 |
+
<input type="checkbox" name="<?php echo esc_attr($link_prefix); ?>" <?php checked($prli_options->link_prefix != 0); ?>/>
|
127 |
</td>
|
128 |
</tr>
|
129 |
+
|
130 |
+
<?php if(!$plp_update->is_installed()): ?>
|
131 |
+
|
132 |
+
<tr valign="top" class="prli-pro-only">
|
133 |
+
<th scope="row">
|
134 |
+
<label><?php esc_html_e('Base Slug Prefix', 'pretty-link'); ?></label>
|
135 |
+
<?php PrliAppHelper::info_tooltip('prli-base-slug-prefix',
|
136 |
+
esc_html__('Base Slug Prefix', 'pretty-link'),
|
137 |
+
sprintf(
|
138 |
+
// translators: %1$s: open b tag, %2$s close b tag
|
139 |
+
esc_html__('Use this to prefix all newly generated pretty links with a directory of your choice. For example set to %1$sout%2$s to make your pretty links look like http://site.com/%1$sout%2$s/xyz. Changing this option will NOT affect existing pretty links. If you do not wish to use a directory prefix, leave this text field blank. Whatever you type here will be sanitized and modified to ensure it is URL-safe. So %1$sHello World%2$s might get changed to something like %1$shello-world%2$s instead. Lowercase letters, numbers, dashes, and underscores are allowed.', 'pretty-link'),
|
140 |
+
'<b>',
|
141 |
+
'</b>'
|
142 |
+
));
|
143 |
+
?>
|
144 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-base-slug-prefix'); ?>
|
145 |
+
</th>
|
146 |
+
<td>
|
147 |
+
<input type="text" class="regular-text" disabled />
|
148 |
+
</td>
|
149 |
+
</tr>
|
150 |
+
|
151 |
+
<tr valign="top" class="prli-pro-only">
|
152 |
+
<th scope="row">
|
153 |
+
<label><?php esc_html_e('Slug Character Count', 'pretty-link'); ?></label>
|
154 |
+
<?php PrliAppHelper::info_tooltip('prli-num-slug-chars',
|
155 |
+
esc_html__('Slug Character Count', 'pretty-link'),
|
156 |
+
esc_html__("The number of characters to use when auto-generating a random slug for pretty links. The default is 4. You cannot use less than 2.", 'pretty-link'));
|
157 |
+
?>
|
158 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-slug-character-count'); ?>
|
159 |
+
</th>
|
160 |
+
<td>
|
161 |
+
<input type="number" min="2" disabled value="4" />
|
162 |
+
</td>
|
163 |
+
</tr>
|
164 |
+
|
165 |
+
<tr valign="top" class="prli-pro-only">
|
166 |
+
<th scope="row">
|
167 |
+
<label><?php esc_html_e('Enable Google Analytics', 'pretty-link') ?></label>
|
168 |
+
<?php PrliAppHelper::info_tooltip('prli-options-use-ga', esc_html__('Enable Google Analytics', 'pretty-link'),
|
169 |
+
esc_html__("Requires Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast), or the Google Analytics Plugin to be installed and configured on your site.", 'pretty-link'));
|
170 |
+
?>
|
171 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-google-analytics'); ?>
|
172 |
+
</th>
|
173 |
+
<td>
|
174 |
+
<input type="checkbox" disabled />
|
175 |
+
</td>
|
176 |
+
</tr>
|
177 |
+
|
178 |
+
<tr valign="top" class="prli-pro-only">
|
179 |
+
<th scope="row">
|
180 |
+
<label><?php printf(esc_html__('Enable %sQR Codes%s', 'pretty-link'), '<a href="http://en.wikipedia.org/wiki/QR_code">', '</a>'); ?></label>
|
181 |
+
<?php PrliAppHelper::info_tooltip('prli-options-generate-qr-codes',
|
182 |
+
esc_html__('Generate QR Codes', 'pretty-link'),
|
183 |
+
esc_html__("This will enable a link in your pretty link admin that will allow you to automatically download a QR Code for each individual Pretty Link.", 'pretty-link'));
|
184 |
+
?>
|
185 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-qr-codes'); ?>
|
186 |
+
</th>
|
187 |
+
<td>
|
188 |
+
<input type="checkbox" disabled />
|
189 |
+
</td>
|
190 |
+
</tr>
|
191 |
+
|
192 |
+
<tr valign="top" class="prli-pro-only">
|
193 |
+
<th scope="row">
|
194 |
+
<label><?php esc_html_e('Global Head Scripts', 'pretty-link'); ?></label>
|
195 |
+
<?php PrliAppHelper::info_tooltip('prli-options-global-head-scripts',
|
196 |
+
esc_html__('Global Head Scripts', 'pretty-link'),
|
197 |
+
sprintf(
|
198 |
+
// translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
|
199 |
+
esc_html__('Useful for adding Google Analytics tracking, Facebook retargeting pixels, or any other kind of tracking script to the HTML head.%1$s%1$sWhat you enter in this box will be applied to all supported pretty links.%1$s%1$s%2$sNOTE:%3$s This does NOT work with 301, 302 and 307 type redirects.', 'pretty-link'),
|
200 |
+
'<br>',
|
201 |
+
'<b>',
|
202 |
+
'</b>'
|
203 |
+
));
|
204 |
+
?>
|
205 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-global-head-scripts'); ?>
|
206 |
+
</th>
|
207 |
+
<td>
|
208 |
+
<textarea class="large-text" disabled></textarea>
|
209 |
+
</td>
|
210 |
+
</tr>
|
211 |
+
|
212 |
+
<?php endif; ?>
|
213 |
+
|
214 |
<?php do_action('prli_custom_link_options'); ?>
|
215 |
</tbody>
|
216 |
</table>
|
217 |
</div>
|
218 |
|
219 |
<div class="prli-page" id="reporting">
|
220 |
+
<div class="prli-page-title"><?php esc_html_e('Reporting Options', 'pretty-link'); ?></div>
|
221 |
<table class="form-table">
|
222 |
<tbody>
|
223 |
<tr valign="top">
|
224 |
<th scope="row">
|
225 |
+
<?php esc_html_e('Tracking Style', 'pretty-link'); ?>
|
226 |
<?php PrliAppHelper::info_tooltip('prli-options-tracking-style',
|
227 |
+
esc_html__('Tracking Style', 'pretty-link'),
|
228 |
+
esc_html__("Changing your tracking style can affect the accuracy of your existing statistics. Extended mode must be used for Conversion reporting.", 'pretty-link'));
|
229 |
?>
|
230 |
</th>
|
231 |
<td>
|
232 |
+
<input type="radio" name="<?php echo esc_attr($extended_tracking); ?>" value="normal" <?php checked($prli_options->extended_tracking,'normal'); ?>/><span class="prli-radio-text"><?php esc_html_e('Normal Tracking', 'pretty-link'); ?></span><br/><br/>
|
233 |
+
<input type="radio" name="<?php echo esc_attr($extended_tracking); ?>" value="extended"<?php checked($prli_options->extended_tracking,'extended'); ?>/><span class="prli-radio-text"><?php esc_html_e('Extended Tracking (more stats / slower performance)', 'pretty-link'); ?></span><br/><br/>
|
234 |
+
<input type="radio" name="<?php echo esc_attr($extended_tracking); ?>" value="count"<?php checked($prli_options->extended_tracking,'count'); ?>/><span class="prli-radio-text"><?php esc_html_e('Simple Click Count Tracking (less stats / faster performance)', 'pretty-link'); ?></span><br/>
|
235 |
</td>
|
236 |
</tr>
|
237 |
<tr valign="top">
|
238 |
<th scope="row">
|
239 |
+
<label for="<?php echo esc_attr($prli_exclude_ips); ?>">
|
240 |
+
<?php esc_html_e('Excluded IP Addresses:', 'pretty-link'); ?>
|
241 |
<?php PrliAppHelper::info_tooltip('prli-options-excluded-ips',
|
242 |
+
esc_html__('Excluded IP Addresses', 'pretty-link'),
|
243 |
+
esc_html__('Enter IP Addresses or IP Ranges you want to exclude from your Click data and Stats. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*', 'pretty-link') .
|
244 |
+
sprintf(
|
245 |
+
'<br/><br/><strong>%s</strong>',
|
246 |
+
esc_html(sprintf(__('FYI, your current IP address is %s.', 'pretty-link'), $prli_utils->get_current_client_ip()))
|
247 |
+
));
|
248 |
?>
|
249 |
</label>
|
250 |
</th>
|
251 |
<td>
|
252 |
+
<input type="text" name="<?php echo esc_attr($prli_exclude_ips); ?>" class="regular-text" value="<?php echo esc_attr($prli_options->prli_exclude_ips); ?>">
|
253 |
</td>
|
254 |
</tr>
|
255 |
<tr valign="top">
|
256 |
<th scope="row">
|
257 |
+
<?php esc_html_e('Auto-Trim Clicks', 'pretty-link'); ?>
|
258 |
<?php PrliAppHelper::info_tooltip('prli-options-auto-trim-clicks',
|
259 |
+
esc_html__('Automatically Trim Clicks', 'pretty-link'),
|
260 |
+
esc_html__("Will automatically delete all hits older than 90 days. We strongly recommend doing this to keep your database performance up. This will permanently delete this click data, and is not undo-able. ", 'pretty-link'));
|
261 |
?>
|
262 |
</th>
|
263 |
<td>
|
264 |
+
<input type="checkbox" name="<?php echo esc_attr($auto_trim_clicks); ?>" <?php checked($prli_options->auto_trim_clicks != 0); ?> />
|
265 |
</td>
|
266 |
</tr>
|
267 |
<tr valign="top">
|
268 |
<th scope="row">
|
269 |
+
<?php esc_html_e('Filter Robots', 'pretty-link'); ?>
|
270 |
<?php PrliAppHelper::info_tooltip('prli-options-filter-robots',
|
271 |
+
esc_html__('Filter Robots', 'pretty-link'),
|
272 |
+
esc_html__("Filter known Robots and unidentifiable browser clients from your click data, stats and reports. Works best if Tracking Style above is set to 'Extended Tracking'.", 'pretty-link'));
|
273 |
?>
|
274 |
</th>
|
275 |
<td>
|
276 |
+
<input type="checkbox" class="prli-toggle-checkbox" data-box="prli-whitelist-ips" name="<?php echo esc_attr($filter_robots); ?>" <?php checked($prli_options->filter_robots != 0); ?> />
|
277 |
</td>
|
278 |
</tr>
|
279 |
</tbody>
|
284 |
<tbody>
|
285 |
<tr valign="top">
|
286 |
<th scope="row">
|
287 |
+
<label for="<?php echo esc_attr($whitelist_ips); ?>">
|
288 |
+
<?php esc_html_e('Whitelist IP Addresses', 'pretty-link'); ?>
|
289 |
<?php PrliAppHelper::info_tooltip('prli-options-whitelist-ips',
|
290 |
+
esc_html__('Whitelist IP Addresses', 'pretty-link'),
|
291 |
+
esc_html__("Enter IP Addresses or IP Ranges you want to always include in your Click data and Stats even if they are flagged as robots. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*", 'pretty-link'));
|
292 |
?>
|
293 |
</label>
|
294 |
</th>
|
295 |
+
<td><input type="text" name="<?php echo esc_attr($whitelist_ips); ?>" class="regular-text" value="<?php echo esc_attr($prli_options->whitelist_ips); ?>"></td>
|
296 |
</tr>
|
297 |
</tbody>
|
298 |
</table>
|
299 |
</div>
|
300 |
</div>
|
301 |
|
302 |
+
<?php if(!$plp_update->is_installed()): ?>
|
303 |
+
|
304 |
+
<div class="prli-page" id="replacements">
|
305 |
+
<div class="prli-page-title"><?php esc_html_e('Keyword & URL Auto Replacements Options', 'pretty-link'); ?></div>
|
306 |
+
|
307 |
+
<table class="form-table">
|
308 |
+
<tbody>
|
309 |
+
<tr valign="top" class="prli-pro-only">
|
310 |
+
<th scope="row">
|
311 |
+
<label>
|
312 |
+
<?php esc_html_e('Enable Replacements', 'pretty-link'); ?>
|
313 |
+
<?php PrliAppHelper::info_tooltip('prli-keyword-replacement',
|
314 |
+
esc_html__('Enable Keyword and URL Auto Replacement', 'pretty-link'),
|
315 |
+
esc_html__('If checked, this will enable you to automatically replace keywords and/or URLs on your blog with pretty links. You will specify the specific keywords and urls from your Pretty Link edit page.', 'pretty-link'));
|
316 |
+
?>
|
317 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-enable-replacements'); ?>
|
318 |
+
</label>
|
319 |
+
</th>
|
320 |
+
<td>
|
321 |
+
<input class="prli-toggle-checkbox" type="checkbox" checked disabled />
|
322 |
+
</td>
|
323 |
+
</tr>
|
324 |
+
</tbody>
|
325 |
+
</table>
|
326 |
+
|
327 |
+
<div class="prli-sub-box pretty-link-keyword-replacement-options">
|
328 |
+
<div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
|
329 |
+
<table class="form-table">
|
330 |
+
<tbody>
|
331 |
+
<tr valign="top" class="prli-pro-only">
|
332 |
+
<th scope="row">
|
333 |
+
<label>
|
334 |
+
<?php esc_html_e('Thresholds', 'pretty-link'); ?>
|
335 |
+
<?php PrliAppHelper::info_tooltip('prli-keyword-replacement-thresholds',
|
336 |
+
esc_html__('Set Keyword Replacement Thresholds', 'pretty-link'),
|
337 |
+
esc_html__('Don\'t want to have too many keyword replacements per page? Select to set some reasonable keyword replacement thresholds.', 'pretty-link'));
|
338 |
+
?>
|
339 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-thresholds'); ?>
|
340 |
+
</label>
|
341 |
+
</th>
|
342 |
+
<td>
|
343 |
+
<input class="prli-toggle-checkbox" type="checkbox" disabled />
|
344 |
+
</td>
|
345 |
+
</tr>
|
346 |
+
</tbody>
|
347 |
+
</table>
|
348 |
+
<table class="form-table">
|
349 |
+
<tbody>
|
350 |
+
<tr valign="top" class="prli-pro-only">
|
351 |
+
<th scope="row">
|
352 |
+
<label>
|
353 |
+
<?php esc_html_e('Open in New Window', 'pretty-link'); ?>
|
354 |
+
<?php PrliAppHelper::info_tooltip('prli-keyword-replacement-thresholds',
|
355 |
+
esc_html__('Open Keyword Replacement Links in New Window', 'pretty-link'),
|
356 |
+
sprintf(
|
357 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
358 |
+
esc_html__('Ensure that these keyword replacement links are opened in a separate window. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
|
359 |
+
'<strong>',
|
360 |
+
'</strong>'
|
361 |
+
));
|
362 |
+
?>
|
363 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-new-window'); ?>
|
364 |
+
</label>
|
365 |
+
</th>
|
366 |
+
<td>
|
367 |
+
<input type="checkbox" disabled />
|
368 |
+
</td>
|
369 |
+
</tr>
|
370 |
+
<tr valign="top" class="prli-pro-only">
|
371 |
+
<th scope="row">
|
372 |
+
<label>
|
373 |
+
<?php esc_html_e('Add No Follows', 'pretty-link'); ?>
|
374 |
+
<?php PrliAppHelper::info_tooltip('prli-keyword-links-nofollow',
|
375 |
+
esc_html__('Add \'nofollow\' attribute to all Keyword Pretty Links', 'pretty-link'),
|
376 |
+
sprintf(
|
377 |
+
// translators: %1$s: open code tag, %2$s: close code tag, %3$s: open strong tag, %4$s close strong tag
|
378 |
+
esc_html__('This adds the html %1$sNOFOLLOW%2$s attribute to all keyword replacement links. %3$sNote:%4$s This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
|
379 |
+
'<code>',
|
380 |
+
'</code>',
|
381 |
+
'<strong>',
|
382 |
+
'</strong>'
|
383 |
+
));
|
384 |
+
?>
|
385 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-no-follows'); ?>
|
386 |
+
</label>
|
387 |
+
</th>
|
388 |
+
<td>
|
389 |
+
<input type="checkbox" disabled />
|
390 |
+
</td>
|
391 |
+
</tr>
|
392 |
+
<tr valign="top" class="prli-pro-only">
|
393 |
+
<th scope="row">
|
394 |
+
<label>
|
395 |
+
<?php esc_html_e('Custom CSS', 'pretty-link'); ?>
|
396 |
+
<?php PrliAppHelper::info_tooltip('prli-keyword-custom-css',
|
397 |
+
esc_html__('Add custom CSS to your keyword replacement links', 'pretty-link'),
|
398 |
+
sprintf(
|
399 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
400 |
+
esc_html__('Add some custom formatting to your keyword pretty link replacements. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
|
401 |
+
'<strong>',
|
402 |
+
'</strong>'
|
403 |
+
));
|
404 |
+
?>
|
405 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-custom-css'); ?>
|
406 |
+
</label>
|
407 |
+
</th>
|
408 |
+
<td>
|
409 |
+
<input type="text" class="regular-text" disabled />
|
410 |
+
</td>
|
411 |
+
</tr>
|
412 |
+
<tr valign="top" class="prli-pro-only">
|
413 |
+
<th valign="row">
|
414 |
+
<label>
|
415 |
+
<?php esc_html_e('Custom Hover CSS', 'pretty-link'); ?>
|
416 |
+
<?php PrliAppHelper::info_tooltip('prli-keyword-custom-hover-css',
|
417 |
+
esc_html__('Add custom hover CSS to your keyword replacement links', 'pretty-link'),
|
418 |
+
sprintf(
|
419 |
+
// translators: %1$s: open strong tag, %2$s: close strong tag
|
420 |
+
esc_html__('Add some custom formatting to the hover attribute of your keyword pretty links. %1$sNote%2$s: This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
|
421 |
+
'<strong>',
|
422 |
+
'</strong>'
|
423 |
+
));
|
424 |
+
?>
|
425 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-custom-hover-css'); ?>
|
426 |
+
</label>
|
427 |
+
</th>
|
428 |
+
<td>
|
429 |
+
<input type="text" class="regular-text" disabled />
|
430 |
+
</td>
|
431 |
+
</tr>
|
432 |
+
<tr valign="top" class="prli-pro-only">
|
433 |
+
<th valign="row">
|
434 |
+
<label>
|
435 |
+
<?php esc_html_e('Link to Disclosures', 'pretty-link'); ?>
|
436 |
+
<?php PrliAppHelper::info_tooltip(
|
437 |
+
'prlipro-link-to-disclosures',
|
438 |
+
esc_html__('Automatically Add a Link to Disclosures', 'pretty-link'),
|
439 |
+
esc_html__('When enabled, this will add a link to your official affiliate link disclosure page to any page, post or custom post type that have any keyword or URL replacements. You\'ll also be able to customize the URL and position of the disclosure link.', 'pretty-link')
|
440 |
+
);
|
441 |
+
?>
|
442 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-link-to-disclosures'); ?>
|
443 |
+
</label>
|
444 |
+
</th>
|
445 |
+
<td>
|
446 |
+
<input type="checkbox" class="prli-toggle-checkbox" disabled />
|
447 |
+
</td>
|
448 |
+
</tr>
|
449 |
+
<tr valign="top" class="prli-pro-only">
|
450 |
+
<th valign="row">
|
451 |
+
<label>
|
452 |
+
<?php esc_html_e('Keyword Disclosures', 'pretty-link'); ?>
|
453 |
+
<?php PrliAppHelper::info_tooltip(
|
454 |
+
'prlipro-enable-keyword-link-disclosures',
|
455 |
+
esc_html__('Automatically Add Affiliate Link Disclosures to Keyword Replacements', 'pretty-link'),
|
456 |
+
sprintf(
|
457 |
+
// translators: %1$s: open b tag, %2$s close b tag
|
458 |
+
esc_html__('When enabled, this will add an affiliate link disclosure next to each one of your keyword replacements. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements.', 'pretty-link'),
|
459 |
+
'<b>',
|
460 |
+
'</b>'
|
461 |
+
)
|
462 |
+
);
|
463 |
+
?>
|
464 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-keyword-disclosures'); ?>
|
465 |
+
</label>
|
466 |
+
</th>
|
467 |
+
<td>
|
468 |
+
<input type="checkbox" class="prli-toggle-checkbox" disabled />
|
469 |
+
</td>
|
470 |
+
</tr>
|
471 |
+
<tr valign="top" class="prli-pro-only">
|
472 |
+
<th valign="row">
|
473 |
+
<label>
|
474 |
+
<?php esc_html_e('Replace All URLs', 'pretty-link'); ?>
|
475 |
+
<?php PrliAppHelper::info_tooltip('prli-replace-urls',
|
476 |
+
esc_html__('Replace All non-Pretty Link URLs With Pretty Link URLs', 'pretty-link'),
|
477 |
+
esc_html__('This feature will take each url it finds and create or use an existing pretty link pointing to the url and replace it with the pretty link.', 'pretty-link'));
|
478 |
+
?>
|
479 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-replace-urls'); ?>
|
480 |
+
</label>
|
481 |
+
</th>
|
482 |
+
<td>
|
483 |
+
<input type="checkbox" class="prli-toggle-checkbox" disabled />
|
484 |
+
</td>
|
485 |
+
</tr>
|
486 |
+
<tr valign="top" class="prli-pro-only">
|
487 |
+
<th valign="row">
|
488 |
+
<label>
|
489 |
+
<?php esc_html_e('Replace in Comments', 'pretty-link'); ?>
|
490 |
+
<?php PrliAppHelper::info_tooltip('prli-replace-in-comments',
|
491 |
+
esc_html__('Replace Keywords and URLs in Comments', 'pretty-link'),
|
492 |
+
esc_html__('This option will enable the keyword / URL replacement routine to run in Comments.', 'pretty-link'));
|
493 |
+
?>
|
494 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-replace-in-comments'); ?>
|
495 |
+
</label>
|
496 |
+
</th>
|
497 |
+
<td>
|
498 |
+
<input type="checkbox" disabled />
|
499 |
+
</td>
|
500 |
+
</tr>
|
501 |
+
<tr valign="top" class="prli-pro-only">
|
502 |
+
<th valign="row">
|
503 |
+
<label>
|
504 |
+
<?php esc_html_e('Replace in Feeds', 'pretty-link'); ?>
|
505 |
+
<?php PrliAppHelper::info_tooltip('prli-replace-in-feeds',
|
506 |
+
esc_html__('Replace Keywords and URLs in Feeds', 'pretty-link'),
|
507 |
+
sprintf(
|
508 |
+
// translators: %1$s: br tag, %2$s open strong tag, %3$s: close strong tag
|
509 |
+
esc_html__('This option will enable the keyword / URL replacement routine to run in RSS Feeds.%1$s%2$sNote:%3$s This option can slow the load speed of your RSS feed -- unless used in conjunction with a caching plugin like W3 Total Cache or WP Super Cache.%1$s%2$sNote #2%3$s This option will only work if you have "Full Text" selected in your General WordPress Reading settings.%1$s%2$sNote #3:%3$s If this option is used along with "Replace Keywords and URLs in Comments" then your post comment feeds will have keywords replaced in them as well.', 'pretty-link'),
|
510 |
+
'<br>',
|
511 |
+
'<strong>',
|
512 |
+
'</strong>'
|
513 |
+
));
|
514 |
+
?>
|
515 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-replace-in-feeds'); ?>
|
516 |
+
</label>
|
517 |
+
</th>
|
518 |
+
<td>
|
519 |
+
<input type="checkbox" disabled />
|
520 |
+
</td>
|
521 |
+
</tr>
|
522 |
+
<tr valign="top" class="prli-pro-only">
|
523 |
+
<th valign="row">
|
524 |
+
<label>
|
525 |
+
<?php esc_html_e('Index Replacements', 'pretty-link'); ?>
|
526 |
+
<?php PrliAppHelper::info_tooltip('plp-index-keywords',
|
527 |
+
esc_html__('Index Replacements', 'pretty-link'),
|
528 |
+
sprintf(
|
529 |
+
// translators: %1$s: br tag, %2$s open strong tag, %3$s: close strong tag
|
530 |
+
esc_html__('This feature will index all of your keyword & URL replacements to dramatically improve performance.%1$s%1$sIf your site has a large number of replacements and/or posts then this feature may increase the load on your server temporarily and your replacements may not show up on your posts for a day or two initially (until all posts are indexed).%1$s%1$s%2$sNote:%3$s this feature requires the use of wp-cron.', 'pretty-link'),
|
531 |
+
'<br>',
|
532 |
+
'<strong>',
|
533 |
+
'</strong>'
|
534 |
+
));
|
535 |
+
?>
|
536 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-replacement-index'); ?>
|
537 |
+
</label>
|
538 |
+
</th>
|
539 |
+
<td>
|
540 |
+
<input type="checkbox" class="prli-toggle-checkbox" disabled />
|
541 |
+
</td>
|
542 |
+
</tr>
|
543 |
+
</tbody>
|
544 |
+
</table>
|
545 |
+
</div>
|
546 |
+
</div>
|
547 |
+
|
548 |
+
<div class="prli-page" id="auto-create">
|
549 |
+
<div class="prli-page-title"><?php esc_html_e('Auto-Create Shortlink Options', 'pretty-link'); ?></div>
|
550 |
+
|
551 |
+
<table class="form-table">
|
552 |
+
<tbody>
|
553 |
+
<tr valign="top" class="prli-pro-only">
|
554 |
+
<th scope="row">
|
555 |
+
<label>
|
556 |
+
<?php esc_html_e('Post Shortlinks', 'pretty-link'); ?>
|
557 |
+
<?php
|
558 |
+
PrliAppHelper::info_tooltip("prli-post-auto",
|
559 |
+
esc_html__('Create Pretty Links for Posts', 'pretty-link'),
|
560 |
+
esc_html__('Automatically Create a Pretty Link for each of your published Posts', 'pretty-link')
|
561 |
+
);
|
562 |
+
?>
|
563 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-auto-create-post'); ?>
|
564 |
+
</label>
|
565 |
+
</th>
|
566 |
+
<td>
|
567 |
+
<input class="prli-toggle-checkbox" type="checkbox" disabled />
|
568 |
+
</td>
|
569 |
+
</tr>
|
570 |
+
<tr valign="top" class="prli-pro-only">
|
571 |
+
<th scope="row">
|
572 |
+
<label>
|
573 |
+
<?php esc_html_e('Page Shortlinks', 'pretty-link'); ?>
|
574 |
+
<?php
|
575 |
+
PrliAppHelper::info_tooltip("prli-page-auto",
|
576 |
+
esc_html__('Create Pretty Links for Pages', 'pretty-link'),
|
577 |
+
esc_html__('Automatically Create a Pretty Link for each of your published Pages', 'pretty-link')
|
578 |
+
);
|
579 |
+
?>
|
580 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-auto-create-page'); ?>
|
581 |
+
</label>
|
582 |
+
</th>
|
583 |
+
<td>
|
584 |
+
<input class="prli-toggle-checkbox" type="checkbox" disabled />
|
585 |
+
</td>
|
586 |
+
</tr>
|
587 |
+
</tbody>
|
588 |
+
</table>
|
589 |
+
|
590 |
+
</div>
|
591 |
+
|
592 |
+
<div class="prli-page" id="prettybar">
|
593 |
+
<div class="prli-page-title"><?php esc_html_e('Pretty Bar Options', 'pretty-link'); ?></div>
|
594 |
+
<table class="form-table">
|
595 |
+
<tbody>
|
596 |
+
<tr valign="top" class="prli-pro-only">
|
597 |
+
<th scope="row">
|
598 |
+
<label>
|
599 |
+
<?php esc_html_e('Image URL', 'pretty-link'); ?>
|
600 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-image-url',
|
601 |
+
esc_html__('Pretty Bar Image URL', 'pretty-link'),
|
602 |
+
esc_html__('If set, this will replace the logo image on the Pretty Bar. The image that this URL references should be 48x48 Pixels to fit.', 'pretty-link'));
|
603 |
+
?>
|
604 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-image'); ?>
|
605 |
+
</label>
|
606 |
+
</th>
|
607 |
+
<td>
|
608 |
+
<input type="text" class="large-text" disabled />
|
609 |
+
</td>
|
610 |
+
</tr>
|
611 |
+
<tr valign="top" class="prli-pro-only">
|
612 |
+
<th scope="row">
|
613 |
+
<label>
|
614 |
+
<?php esc_html_e('Background Image URL', 'pretty-link'); ?>
|
615 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-background-image-url',
|
616 |
+
esc_html__('Pretty Bar Background Image URL', 'pretty-link'),
|
617 |
+
esc_html__('If set, this will replace the background image on Pretty Bar. The image that this URL references should be 65px tall - this image will be repeated horizontally across the bar.', 'pretty-link'));
|
618 |
+
?>
|
619 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-background-image'); ?>
|
620 |
+
</label>
|
621 |
+
</th>
|
622 |
+
<td>
|
623 |
+
<input type="text" class="large-text" disabled />
|
624 |
+
</td>
|
625 |
+
</tr>
|
626 |
+
<tr valign="top" class="prli-pro-only">
|
627 |
+
<th scope="row">
|
628 |
+
<label>
|
629 |
+
<?php esc_html_e('Background Color', 'pretty-link'); ?>
|
630 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-color',
|
631 |
+
esc_html__('Pretty Bar Background Color', 'pretty-link'),
|
632 |
+
esc_html__('This will alter the background color of the Pretty Bar if you haven\'t specified a Pretty Bar background image.', 'pretty-link'));
|
633 |
+
?>
|
634 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-background-color'); ?>
|
635 |
+
</label>
|
636 |
+
</th>
|
637 |
+
<td>
|
638 |
+
<input type="text" class="plp-colorpicker" size="8" disabled />
|
639 |
+
</td>
|
640 |
+
</tr>
|
641 |
+
<tr valign="top" class="prli-pro-only">
|
642 |
+
<th scope="row">
|
643 |
+
<label>
|
644 |
+
<?php esc_html_e('Text Color', 'pretty-link'); ?>
|
645 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-text-color',
|
646 |
+
esc_html__('Pretty Bar Text Color', 'pretty-link'),
|
647 |
+
sprintf(
|
648 |
+
// translators: %1$s: open code tag, %2$s: close code tag
|
649 |
+
esc_html__('If not set, this defaults to black (RGB value %1$s#000000%2$s) but you can change it to whatever color you like.', 'pretty-link'),
|
650 |
+
'<code>',
|
651 |
+
'</code>'
|
652 |
+
));
|
653 |
+
?>
|
654 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-text-color'); ?>
|
655 |
+
</label>
|
656 |
+
</th>
|
657 |
+
<td>
|
658 |
+
<input type="text" class="plp-colorpicker" size="8" disabled />
|
659 |
+
</td>
|
660 |
+
</tr>
|
661 |
+
<tr valign="top" class="prli-pro-only">
|
662 |
+
<th scope="row">
|
663 |
+
<label>
|
664 |
+
<?php esc_html_e('Link Color', 'pretty-link'); ?>
|
665 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-link-color',
|
666 |
+
esc_html__('Pretty Bar Link Color', 'pretty-link'),
|
667 |
+
sprintf(
|
668 |
+
// translators: %1$s: open code tag, %2$s: close code tag
|
669 |
+
esc_html__('If not set, this defaults to blue (RGB value %1$s#0000ee%2$s) but you can change it to whatever color you like.', 'pretty-link'),
|
670 |
+
'<code>',
|
671 |
+
'</code>'
|
672 |
+
));
|
673 |
+
?>
|
674 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-link-color'); ?>
|
675 |
+
</label>
|
676 |
+
</th>
|
677 |
+
<td>
|
678 |
+
<input type="text" class="plp-colorpicker" size="8" disabled />
|
679 |
+
</td>
|
680 |
+
</tr>
|
681 |
+
<tr valign="top" class="prli-pro-only">
|
682 |
+
<th scope="row">
|
683 |
+
<label>
|
684 |
+
<?php esc_html_e('Link Hover Color', 'pretty-link'); ?>
|
685 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-link-hover-color',
|
686 |
+
esc_html__('Pretty Bar Link Hover Color', 'pretty-link'),
|
687 |
+
sprintf(
|
688 |
+
// translators: %1$s: open code tag, %2$s: close code tag
|
689 |
+
esc_html__('If not set, this defaults to RGB value %1$s#ababab%2$s but you can change it to whatever color you like.', 'pretty-link'),
|
690 |
+
'<code>',
|
691 |
+
'</code>'
|
692 |
+
));
|
693 |
+
?>
|
694 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-link-hover-color'); ?>
|
695 |
+
</label>
|
696 |
+
</th>
|
697 |
+
<td>
|
698 |
+
<input type="text" class="plp-colorpicker" size="8" disabled />
|
699 |
+
</td>
|
700 |
+
</tr>
|
701 |
+
<tr valign="top" class="prli-pro-only">
|
702 |
+
<th scope="row">
|
703 |
+
<label>
|
704 |
+
<?php esc_html_e('Visited Link Color', 'pretty-link'); ?>
|
705 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-visited-link-color',
|
706 |
+
esc_html__('Pretty Bar Visited Link Color', 'pretty-link'),
|
707 |
+
sprintf(
|
708 |
+
// translators: %1$s: open code tag, %2$s: close code tag
|
709 |
+
esc_html__('If not set, this defaults to RGB value %1$s#551a8b%2$s but you can change it to whatever color you like.', 'pretty-link'),
|
710 |
+
'<code>',
|
711 |
+
'</code>'
|
712 |
+
));
|
713 |
+
?>
|
714 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-link-visited-color'); ?>
|
715 |
+
</label>
|
716 |
+
</th>
|
717 |
+
<td>
|
718 |
+
<input type="text" class="plp-colorpicker" size="8" disabled />
|
719 |
+
</td>
|
720 |
+
</tr>
|
721 |
+
<tr valign="top" class="prli-pro-only">
|
722 |
+
<th scope="row">
|
723 |
+
<label>
|
724 |
+
<?php esc_html_e('Title Char Limit', 'pretty-link'); ?>
|
725 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-title-char-limit',
|
726 |
+
esc_html__('Pretty Bar Title Char Limit', 'pretty-link'),
|
727 |
+
sprintf(
|
728 |
+
// translators: %1$s: open code tag, %2$s: close code tag
|
729 |
+
esc_html__('If your Website has a long title then you may need to adjust this value so that it will all fit on the Pretty Bar. It is recommended that you keep this value to %1$s30%2$s characters or less so the Pretty Bar\'s format looks good across different browsers and screen resolutions.', 'pretty-link'),
|
730 |
+
'<code>',
|
731 |
+
'</code>'
|
732 |
+
));
|
733 |
+
?>
|
734 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-title-char-limit'); ?>
|
735 |
+
</label>
|
736 |
+
</th>
|
737 |
+
<td>
|
738 |
+
<input type="text" size="4" disabled />
|
739 |
+
</td>
|
740 |
+
</tr>
|
741 |
+
<tr valign="top" class="prli-pro-only">
|
742 |
+
<th scope="row">
|
743 |
+
<label>
|
744 |
+
<?php esc_html_e('Description Char Limit', 'pretty-link'); ?>
|
745 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-desc-char-limit',
|
746 |
+
esc_html__('Pretty Bar Description Char Limit', 'pretty-link'),
|
747 |
+
sprintf(
|
748 |
+
// translators: %1$s: open code tag, %2$s: close code tag
|
749 |
+
esc_html__('If your Website has a long Description (tagline) then you may need to adjust this value so that it will all fit on the Pretty Bar. It is recommended that you keep this value to %1$s40%2$s characters or less so the Pretty Bar\'s format looks good across different browsers and screen resolutions.', 'pretty-link'),
|
750 |
+
'<code>',
|
751 |
+
'</code>'
|
752 |
+
));
|
753 |
+
?>
|
754 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-description-char-limit'); ?>
|
755 |
+
</label>
|
756 |
+
</th>
|
757 |
+
<td>
|
758 |
+
<input type="text" size="4" disabled />
|
759 |
+
</td>
|
760 |
+
</tr>
|
761 |
+
<tr valign="top" class="prli-pro-only">
|
762 |
+
<th scope="row">
|
763 |
+
<label>
|
764 |
+
<?php esc_html_e('Target URL Char Limit', 'pretty-link'); ?>
|
765 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-target-url-char-limit',
|
766 |
+
esc_html__('Pretty Bar Target URL Char Limit', 'pretty-link'),
|
767 |
+
sprintf(
|
768 |
+
// translators: %1$s: open code tag, %2$s: close code tag
|
769 |
+
esc_html__('If you link to a lot of large Target URLs you may want to adjust this value. It is recommended that you keep this value to %1$s40%2$s or below so the Pretty Bar\'s format looks good across different browsers and URL sizes', 'pretty-link'),
|
770 |
+
'<code>',
|
771 |
+
'</code>'
|
772 |
+
));
|
773 |
+
?>
|
774 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-target-url-char-limit'); ?>
|
775 |
+
</label>
|
776 |
+
</th>
|
777 |
+
<td>
|
778 |
+
<input type="text" size="4" disabled />
|
779 |
+
</td>
|
780 |
+
</tr>
|
781 |
+
<tr valign="top" class="prli-pro-only">
|
782 |
+
<th scope="row">
|
783 |
+
<label>
|
784 |
+
<?php esc_html_e('Show Title', 'pretty-link'); ?>
|
785 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-show-title',
|
786 |
+
esc_html__('Pretty Bar Show Title', 'pretty-link'),
|
787 |
+
esc_html__('Make sure this is checked if you want the title of your blog (and link) to show up on the Pretty Bar.', 'pretty-link'));
|
788 |
+
?>
|
789 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-show-title'); ?>
|
790 |
+
</label>
|
791 |
+
</th>
|
792 |
+
<td>
|
793 |
+
<input type="checkbox" disabled />
|
794 |
+
</td>
|
795 |
+
</tr>
|
796 |
+
<tr valign="top" class="prli-pro-only">
|
797 |
+
<th scope="row">
|
798 |
+
<label>
|
799 |
+
<?php esc_html_e('Show Description', 'pretty-link'); ?>
|
800 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-show-description',
|
801 |
+
esc_html__('Pretty Bar Show Description', 'pretty-link'),
|
802 |
+
esc_html__('Make sure this is checked if you want your site description to show up on the Pretty Bar.', 'pretty-link'));
|
803 |
+
?>
|
804 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-show-description'); ?>
|
805 |
+
</label>
|
806 |
+
</th>
|
807 |
+
<td>
|
808 |
+
<input type="checkbox" disabled />
|
809 |
+
</td>
|
810 |
+
</tr>
|
811 |
+
<tr valign="top" class="prli-pro-only">
|
812 |
+
<th scope="row">
|
813 |
+
<label>
|
814 |
+
<?php esc_html_e('Show Share Links', 'pretty-link'); ?>
|
815 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-show-share-links',
|
816 |
+
esc_html__('Pretty Bar Show Share Links', 'pretty-link'),
|
817 |
+
esc_html__('Make sure this is checked if you want "share links" to show up on the Pretty Bar.', 'pretty-link'));
|
818 |
+
?>
|
819 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-show-share-links'); ?>
|
820 |
+
</label>
|
821 |
+
</th>
|
822 |
+
<td>
|
823 |
+
<input type="checkbox" disabled />
|
824 |
+
</td>
|
825 |
+
</tr>
|
826 |
+
<tr valign="top" class="prli-pro-only">
|
827 |
+
<th scope="row">
|
828 |
+
<label>
|
829 |
+
<?php esc_html_e('Show Target URL', 'pretty-link'); ?>
|
830 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-show-target-url-links',
|
831 |
+
esc_html__('Pretty Bar Show Target URL Links', 'pretty-link'),
|
832 |
+
esc_html__('Make sure this is checked if you want a link displaying the Target URL to show up on the Pretty Bar.', 'pretty-link'));
|
833 |
+
?>
|
834 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-show-target-url'); ?>
|
835 |
+
</label>
|
836 |
+
</th>
|
837 |
+
<td>
|
838 |
+
<input type="checkbox" disabled />
|
839 |
+
</td>
|
840 |
+
</tr>
|
841 |
+
<tr valign="top" class="prli-pro-only">
|
842 |
+
<th scope="row">
|
843 |
+
<label>
|
844 |
+
<?php esc_html_e('Hide Attribution Link', 'pretty-link'); ?>
|
845 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-hide-attrib-link',
|
846 |
+
esc_html__('Hide Attribution Link', 'pretty-link'),
|
847 |
+
sprintf(
|
848 |
+
// translators: %1$s: br tag, %2$s: open strong tag, %3$s close strong tag, %4$s open em tag, %5$s close em tag, %6$s open link tag, %7$s close link tag
|
849 |
+
esc_html__('Check this to hide the pretty link attribution link on the pretty bar.%1$s%1$s%2$sWait, before you do this, you might want to leave this un-checked and set the alternate URL of this link to your %4$sPretty Links Pro%5$s %6$sAffiliate URL%7$s to earn a few bucks while you are at it.%3$s', 'pretty-link'),
|
850 |
+
'<br>',
|
851 |
+
'<strong>',
|
852 |
+
'</strong>',
|
853 |
+
'<em>',
|
854 |
+
'</em>',
|
855 |
+
'<a href="https://prettylinks.com/plp/options/aff-attribution">',
|
856 |
+
'</a>'
|
857 |
+
));
|
858 |
+
?>
|
859 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-hide-attrib-link'); ?>
|
860 |
+
</label>
|
861 |
+
</th>
|
862 |
+
<td>
|
863 |
+
<input type="checkbox" class="prli-toggle-checkbox" disabled />
|
864 |
+
</td>
|
865 |
+
</tr>
|
866 |
+
</tbody>
|
867 |
+
</table>
|
868 |
+
|
869 |
+
<div class="prli-sub-box prettybar-attrib-url">
|
870 |
+
<div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
|
871 |
+
<table class="form-table">
|
872 |
+
<tbody>
|
873 |
+
<tr valign="top" class="prli-pro-only">
|
874 |
+
<th scope="row">
|
875 |
+
<label>
|
876 |
+
<?php esc_html_e('Attribution URL', 'pretty-link'); ?>
|
877 |
+
<?php PrliAppHelper::info_tooltip('prli-prettybar-attribution-url',
|
878 |
+
esc_html__('Alternate Pretty Bar Attribution URL', 'pretty-link'),
|
879 |
+
sprintf(
|
880 |
+
// translators: %1$s open em tag, %2$s close em tag, %3$s open link tag, %4$s close link tag
|
881 |
+
esc_html__('If set, this will replace the Pretty Bars attribution URL. This is a very good place to put your %1$sPretty Links Pro%2$s %3$sAffiliate Link%4$s.', 'pretty-link'),
|
882 |
+
'<em>',
|
883 |
+
'</em>',
|
884 |
+
'<a href="https://prettylinks.com/plp/options/aff-attribution-2">',
|
885 |
+
'</a>'
|
886 |
+
));
|
887 |
+
?>
|
888 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-prettybar-attrib-url'); ?>
|
889 |
+
</label>
|
890 |
+
</th>
|
891 |
+
<td>
|
892 |
+
<input type="text" class="regular-text" disabled />
|
893 |
+
</td>
|
894 |
+
</tr>
|
895 |
+
</tbody>
|
896 |
+
</table>
|
897 |
+
</div>
|
898 |
+
</div>
|
899 |
+
|
900 |
+
<div class="prli-page" id="social">
|
901 |
+
<div class="prli-page-title"><?php esc_html_e('Social Buttons Options', 'pretty-link'); ?></div>
|
902 |
+
<label class="prli-label prli-pro-only">
|
903 |
+
<?php esc_html_e('Buttons', 'pretty-link'); ?>
|
904 |
+
<?php PrliAppHelper::info_tooltip('prli-social-buttons',
|
905 |
+
esc_html__('Social Buttons', 'pretty-link'),
|
906 |
+
sprintf(
|
907 |
+
// translators: %1$s: br tag, %2$s open code tag, %3$s close code tag
|
908 |
+
esc_html__('Select which buttons you want to be visible on the Social Buttons Bar.%1$s%1$s%2$sNote:%3$s In order for the Social Buttons Bar to be visible on Pages and or Posts, you must first enable it in the "Page & Post Options" section above.', 'pretty-link'),
|
909 |
+
'<br>',
|
910 |
+
'<code>',
|
911 |
+
'</code>'
|
912 |
+
));
|
913 |
+
?>
|
914 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-social-buttons'); ?>
|
915 |
+
</label>
|
916 |
+
<ul class="prli-social-button-checkboxes">
|
917 |
+
<?php foreach(array('facebook', 'twitter', 'gplus', 'pinterest', 'linkedin', 'reddit', 'stumbleupon', 'digg', 'email') as $b) : ?>
|
918 |
+
<li class="pl-social-<?php echo esc_attr($b); ?>-button">
|
919 |
+
<input type="checkbox" disabled />
|
920 |
+
<i class="pl-icon-<?php echo esc_attr($b); ?>"> </i>
|
921 |
+
</li>
|
922 |
+
<?php endforeach; ?>
|
923 |
+
</ul>
|
924 |
+
<br/>
|
925 |
+
<table class="form-table">
|
926 |
+
<tbody>
|
927 |
+
<tr valign="top" class="prli-pro-only">
|
928 |
+
<th scope="row">
|
929 |
+
<label>
|
930 |
+
<?php esc_html_e('Buttons Placement', 'pretty-link'); ?>
|
931 |
+
<?php PrliAppHelper::info_tooltip('prli-social-buttons-placement',
|
932 |
+
esc_html__('Social Buttons Placement', 'pretty-link'),
|
933 |
+
sprintf(
|
934 |
+
// translators: %1$s: br tag, %2$s open code tag, %3$s close code tag
|
935 |
+
esc_html__('This determines where your Social Buttons Placement should appear in relation to content on Pages and/or Posts.%1$s%1$s%2$sNote:%3$s If you want this bar to appear then you must enable it in the "Auto-Create Links" section above.', 'pretty-link'),
|
936 |
+
'<br>',
|
937 |
+
'<code>',
|
938 |
+
'</code>'
|
939 |
+
));
|
940 |
+
?>
|
941 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-social-buttons-placement'); ?>
|
942 |
+
</label>
|
943 |
+
</th>
|
944 |
+
<td>
|
945 |
+
<input type="radio" value="top" disabled /><span class="prli-radio-text"><?php esc_html_e('Top', 'pretty-link'); ?></span><br/><br/>
|
946 |
+
<input type="radio" value="bottom" checked disabled /><span class="prli-radio-text"><?php esc_html_e('Bottom', 'pretty-link'); ?></span><br/><br/>
|
947 |
+
<input type="radio" value="top-and-bottom" disabled /><span class="prli-radio-text"><?php esc_html_e('Top and Bottom', 'pretty-link'); ?></span><br/><br/>
|
948 |
+
<input type="radio" value="none" disabled /><span class="prli-radio-text"><?php esc_html_e('None', 'pretty-link'); ?></span>
|
949 |
+
<?php PrliAppHelper::info_tooltip('prli-social-buttons-placement-none',
|
950 |
+
esc_html__('Social Buttons Manual Placement', 'pretty-link'),
|
951 |
+
sprintf(
|
952 |
+
// translators: %1$s: example shortcode, %2$s: example template tag
|
953 |
+
esc_html__('If you select none, you can still show your Social Buttons by manually adding the %1$s shortcode to your blog posts or %2$s template tag to your WordPress Theme.', 'pretty-link'),
|
954 |
+
'<code>[social_buttons_bar]</code>',
|
955 |
+
'<code><?php the_social_buttons_bar(); ?></code>'
|
956 |
+
));
|
957 |
+
?>
|
958 |
+
</td>
|
959 |
+
</tr>
|
960 |
+
</tbody>
|
961 |
+
</table>
|
962 |
+
|
963 |
+
</div>
|
964 |
+
|
965 |
+
<div class="prli-page" id="public-links">
|
966 |
+
<div class="prli-page-title"><?php esc_html_e('Public Links Creation Options', 'pretty-link'); ?></div>
|
967 |
+
<table class="form-table">
|
968 |
+
<tbody>
|
969 |
+
<tr valign="top" class="prli-pro-only">
|
970 |
+
<th scope="row">
|
971 |
+
<label>
|
972 |
+
<?php esc_html_e('Enable Public Links', 'pretty-link'); ?>
|
973 |
+
<?php PrliAppHelper::info_tooltip('prli-enable-public-link-creation',
|
974 |
+
esc_html__('Enable Public Link Creation on this Site', 'pretty-link'),
|
975 |
+
sprintf(
|
976 |
+
esc_html__('This option will give you the ability to turn your website into a link shortening service for your users. Once selected, you can enable the Pretty Links Pro Sidebar Widget or just display the link creation form with the %s shortcode in any post or page on your website.', 'pretty-link'),
|
977 |
+
'<code>[prli_create_form]</code>'
|
978 |
+
));
|
979 |
+
?>
|
980 |
+
<?php echo PrliAppHelper::pro_only_feature_indicator('option-enable-public-link-creation'); ?>
|
981 |
+
</label>
|
982 |
+
</th>
|
983 |
+
<td>
|
984 |
+
<input class="prli-toggle-checkbox" type="checkbox" disabled />
|
985 |
+
</td>
|
986 |
+
</tr>
|
987 |
+
</tbody>
|
988 |
+
</table>
|
989 |
+
</div>
|
990 |
+
|
991 |
+
<?php endif; ?>
|
992 |
+
|
993 |
<?php do_action('prli_admin_options_pages'); ?>
|
994 |
</td>
|
995 |
</tr>
|
996 |
</table>
|
997 |
|
998 |
<p class="submit">
|
999 |
+
<input type="submit" name="submit" class="button button-primary" value="<?php esc_attr_e('Update', 'pretty-link') ?>" />
|
1000 |
</p>
|
1001 |
|
1002 |
</form>
|
app/views/shared/errors.php
CHANGED
@@ -9,7 +9,7 @@
|
|
9 |
foreach( $errors as $error )
|
10 |
{
|
11 |
?>
|
12 |
-
<li><strong><?php
|
13 |
<?php
|
14 |
}
|
15 |
?>
|
9 |
foreach( $errors as $error )
|
10 |
{
|
11 |
?>
|
12 |
+
<li><strong><?php esc_html_e('ERROR', 'pretty-link'); ?></strong>: <?php echo esc_html($error); ?></li>
|
13 |
<?php
|
14 |
}
|
15 |
?>
|
app/views/shared/jsredirect.php
DELETED
@@ -1,7 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
if(!defined('ABSPATH'))
|
3 |
-
die('You are not allowed to call this page directly.');
|
4 |
-
?>
|
5 |
-
<script type="text/javascript">
|
6 |
-
window.location = '<?php echo esc_url_raw($redirect_url); ?>';
|
7 |
-
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/views/shared/link-table-nav.php
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
2 |
|
3 |
$curr_size = (isset($_REQUEST['size']))?(int)$_REQUEST['size']:10;
|
4 |
-
$curr_url =
|
5 |
$group = (isset($_REQUEST['group']))?(int)$_REQUEST['group']:'';
|
6 |
$sort = (isset($_REQUEST['sort']))?sanitize_text_field($_REQUEST['sort']):'';
|
7 |
$sdir = (isset($_REQUEST['sdir']))?sanitize_text_field($_REQUEST['sdir']):'';
|
@@ -10,39 +10,36 @@ $search = (isset($_REQUEST['search']))?sanitize_text_field($_REQUEST['search
|
|
10 |
// Only show the pager bar if there is more than 1 page
|
11 |
if($page_count > 1) {
|
12 |
?>
|
13 |
-
<div class="tablenav"<?php echo (isset($navstyle)?
|
14 |
-
<div class=
|
15 |
<span class="displaying-num">
|
16 |
-
<?php
|
17 |
-
_e('Displaying', 'pretty-link');
|
18 |
-
echo " $page_first_record–$page_last_record of $record_count";
|
19 |
-
?>
|
20 |
</span>
|
21 |
|
22 |
<?php
|
23 |
// Only show the prev page button if the current page is not the first page
|
24 |
if($current_page > 1) {
|
25 |
?>
|
26 |
-
<a class=
|
27 |
<?php
|
28 |
}
|
29 |
|
30 |
// First page is always displayed
|
31 |
if($current_page==1) {
|
32 |
?>
|
33 |
-
<a class=
|
34 |
<?php
|
35 |
}
|
36 |
else {
|
37 |
?>
|
38 |
-
<a class=
|
39 |
<?php
|
40 |
}
|
41 |
|
42 |
// If the current page is more than 2 spaces away from the first page then we put some dots in here
|
43 |
if($current_page >= 5) {
|
44 |
?>
|
45 |
-
<span class=
|
46 |
<?php
|
47 |
}
|
48 |
|
@@ -52,12 +49,12 @@ if($page_count > 1) {
|
|
52 |
for($i = $low_page; $i <= $high_page; $i++) {
|
53 |
if($current_page==$i) {
|
54 |
?>
|
55 |
-
<a class=
|
56 |
<?php
|
57 |
}
|
58 |
else {
|
59 |
?>
|
60 |
-
<a class=
|
61 |
<?php
|
62 |
}
|
63 |
}
|
@@ -65,30 +62,30 @@ if($page_count > 1) {
|
|
65 |
// If the current page is more than 2 away from the last page then show ellipsis
|
66 |
if($current_page < ($page_count - 3)) {
|
67 |
?>
|
68 |
-
<span class=
|
69 |
<?php
|
70 |
}
|
71 |
|
72 |
// Display the last page icon
|
73 |
if($current_page == $page_count) {
|
74 |
?>
|
75 |
-
<a class=
|
76 |
<?php
|
77 |
}
|
78 |
else {
|
79 |
?>
|
80 |
-
<a class=
|
81 |
<?php
|
82 |
}
|
83 |
|
84 |
// Display the next page icon if there is a next page
|
85 |
if($current_page < $page_count) {
|
86 |
?>
|
87 |
-
<a class=
|
88 |
<?php
|
89 |
}
|
90 |
?>
|
91 |
-
<select class="prli-page-size" data-url="<?php echo admin_url("admin.php?page=pretty-link&paged=1&sort={$sort}&sdir={$sdir}&group={$group}&search={$search}&size="); ?>">
|
92 |
<option value="10" selected="selected">10</option>
|
93 |
<option value="25" <?php if($curr_size == 25) echo 'selected="selected"'; ?>>25</option>
|
94 |
<option value="50" <?php if($curr_size == 50) echo 'selected="selected"'; ?>>50</option>
|
@@ -104,9 +101,11 @@ if($page_count > 1) {
|
|
104 |
else {
|
105 |
?>
|
106 |
<div class="tablenav"<?php echo (isset($navstyle)?" style=\"$navstyle\"":''); ?>>
|
107 |
-
<div class=
|
108 |
-
<span class="displaying-num"
|
109 |
-
|
|
|
|
|
110 |
<option value="10" selected="selected">10</option>
|
111 |
<option value="25" <?php if($curr_size == 25) echo 'selected="selected"'; ?>>25</option>
|
112 |
<option value="50" <?php if($curr_size == 50) echo 'selected="selected"'; ?>>50</option>
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
|
2 |
|
3 |
$curr_size = (isset($_REQUEST['size']))?(int)$_REQUEST['size']:10;
|
4 |
+
$curr_url = sanitize_text_field($_REQUEST['page']) . $page_params;
|
5 |
$group = (isset($_REQUEST['group']))?(int)$_REQUEST['group']:'';
|
6 |
$sort = (isset($_REQUEST['sort']))?sanitize_text_field($_REQUEST['sort']):'';
|
7 |
$sdir = (isset($_REQUEST['sdir']))?sanitize_text_field($_REQUEST['sdir']):'';
|
10 |
// Only show the pager bar if there is more than 1 page
|
11 |
if($page_count > 1) {
|
12 |
?>
|
13 |
+
<div class="tablenav"<?php echo (isset($navstyle)?' style="'.esc_attr($navstyle).'"':''); ?>>
|
14 |
+
<div class="tablenav-pages">
|
15 |
<span class="displaying-num">
|
16 |
+
<?php echo esc_html(sprintf(__('Displaying %1$s–%2$s of %3$s', 'pretty-link'), $page_first_record, $page_last_record, $record_count)); ?>
|
|
|
|
|
|
|
17 |
</span>
|
18 |
|
19 |
<?php
|
20 |
// Only show the prev page button if the current page is not the first page
|
21 |
if($current_page > 1) {
|
22 |
?>
|
23 |
+
<a class="prev page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . ($current_page-1) . '&size=' . $curr_size); ?>">«</a>
|
24 |
<?php
|
25 |
}
|
26 |
|
27 |
// First page is always displayed
|
28 |
if($current_page==1) {
|
29 |
?>
|
30 |
+
<a class="page-numbers disabled" href="#">1</a>
|
31 |
<?php
|
32 |
}
|
33 |
else {
|
34 |
?>
|
35 |
+
<a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=1&size=' . $curr_size); ?>">1</a>
|
36 |
<?php
|
37 |
}
|
38 |
|
39 |
// If the current page is more than 2 spaces away from the first page then we put some dots in here
|
40 |
if($current_page >= 5) {
|
41 |
?>
|
42 |
+
<span class="page-numbers dots">...</span>
|
43 |
<?php
|
44 |
}
|
45 |
|
49 |
for($i = $low_page; $i <= $high_page; $i++) {
|
50 |
if($current_page==$i) {
|
51 |
?>
|
52 |
+
<a class="page-numbers disabled" href="#"><?php echo esc_html($i); ?></a>
|
53 |
<?php
|
54 |
}
|
55 |
else {
|
56 |
?>
|
57 |
+
<a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . $i . '&size=' . $curr_size); ?>"><?php echo esc_html($i); ?></a>
|
58 |
<?php
|
59 |
}
|
60 |
}
|
62 |
// If the current page is more than 2 away from the last page then show ellipsis
|
63 |
if($current_page < ($page_count - 3)) {
|
64 |
?>
|
65 |
+
<span class="page-numbers dots">...</span>
|
66 |
<?php
|
67 |
}
|
68 |
|
69 |
// Display the last page icon
|
70 |
if($current_page == $page_count) {
|
71 |
?>
|
72 |
+
<a class="page-numbers disabled" href="#"><?php echo esc_html($page_count); ?></a>
|
73 |
<?php
|
74 |
}
|
75 |
else {
|
76 |
?>
|
77 |
+
<a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . $page_count . '&size=' . $curr_size); ?>"><?php echo esc_html($page_count); ?></a>
|
78 |
<?php
|
79 |
}
|
80 |
|
81 |
// Display the next page icon if there is a next page
|
82 |
if($current_page < $page_count) {
|
83 |
?>
|
84 |
+
<a class="next page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . ($current_page + 1) . '&size=' . $curr_size); ?>">»</a>
|
85 |
<?php
|
86 |
}
|
87 |
?>
|
88 |
+
<select class="prli-page-size" data-url="<?php echo esc_url(admin_url("admin.php?page=pretty-link&paged=1&sort={$sort}&sdir={$sdir}&group={$group}&search={$search}&size=")); ?>">
|
89 |
<option value="10" selected="selected">10</option>
|
90 |
<option value="25" <?php if($curr_size == 25) echo 'selected="selected"'; ?>>25</option>
|
91 |
<option value="50" <?php if($curr_size == 50) echo 'selected="selected"'; ?>>50</option>
|
101 |
else {
|
102 |
?>
|
103 |
<div class="tablenav"<?php echo (isset($navstyle)?" style=\"$navstyle\"":''); ?>>
|
104 |
+
<div class="tablenav-pages">
|
105 |
+
<span class="displaying-num">
|
106 |
+
<?php echo esc_html(sprintf(__('Displaying %1$s–%2$s of %3$s', 'pretty-link'), $page_first_record, $page_last_record, $record_count)); ?>
|
107 |
+
</span>
|
108 |
+
<select class="prli-page-size" data-url="<?php echo esc_url(admin_url("admin.php?page=pretty-link&paged=1&sort={$sort}&sdir={$sdir}&group={$group}&search={$search}&size=")); ?>">
|
109 |
<option value="10" selected="selected">10</option>
|
110 |
<option value="25" <?php if($curr_size == 25) echo 'selected="selected"'; ?>>25</option>
|
111 |
<option value="50" <?php if($curr_size == 50) echo 'selected="selected"'; ?>>50</option>
|
app/views/shared/nav.php
CHANGED
@@ -3,20 +3,20 @@
|
|
3 |
global $plp_update;
|
4 |
|
5 |
if($plp_update->is_installed()) {
|
6 |
-
$support_link = " | <a href=\"https://prettylinks.com/pl/nav/um\" target=\"_blank\">" .
|
7 |
}
|
8 |
else {
|
9 |
-
$support_link = " | <a href=\"https://prettylinks.com/pl/nav/upgrade\" target=\"_blank\">" .
|
10 |
}
|
11 |
|
12 |
?>
|
13 |
<p class="prli-shared-header">
|
14 |
-
<span><?php
|
15 |
<a href="http://twitter.com/blairwilli"><img src="<?php echo PRLI_IMAGES_URL; ?>/twitter_32.png" class="prli-icon" /></a>
|
16 |
<a href="http://www.facebook.com/pages/Pretty-Link/283252860401"><img src="<?php echo PRLI_IMAGES_URL; ?>/facebook_32.png" class="prli-icon" /></a>
|
17 |
<br/>
|
18 |
-
<?php
|
19 |
-
<a href="http://blairwilliams.com/xba" target="_blank"><?php
|
20 |
<?php echo $support_link; ?>
|
21 |
</p>
|
22 |
|
3 |
global $plp_update;
|
4 |
|
5 |
if($plp_update->is_installed()) {
|
6 |
+
$support_link = " | <a href=\"https://prettylinks.com/pl/nav/um\" target=\"_blank\">" . esc_html__('Pro Manual', 'pretty-link') . '</a>';
|
7 |
}
|
8 |
else {
|
9 |
+
$support_link = " | <a href=\"https://prettylinks.com/pl/nav/upgrade\" target=\"_blank\">" . esc_html__('Upgrade to Pro', 'pretty-link') . '</a>';
|
10 |
}
|
11 |
|
12 |
?>
|
13 |
<p class="prli-shared-header">
|
14 |
+
<span><?php esc_html_e('Connect:', 'pretty-link'); ?></span>
|
15 |
<a href="http://twitter.com/blairwilli"><img src="<?php echo PRLI_IMAGES_URL; ?>/twitter_32.png" class="prli-icon" /></a>
|
16 |
<a href="http://www.facebook.com/pages/Pretty-Link/283252860401"><img src="<?php echo PRLI_IMAGES_URL; ?>/facebook_32.png" class="prli-icon" /></a>
|
17 |
<br/>
|
18 |
+
<?php esc_html_e('Get Help:', 'pretty-link'); ?>
|
19 |
+
<a href="http://blairwilliams.com/xba" target="_blank"><?php esc_html_e('Tutorials', 'pretty-link'); ?></a>
|
20 |
<?php echo $support_link; ?>
|
21 |
</p>
|
22 |
|
app/views/shared/public_link.php
CHANGED
@@ -1,58 +1,49 @@
|
|
1 |
<?php if(!defined('ABSPATH')) die('You are not allowed to call this page directly.');
|
2 |
|
3 |
-
|
4 |
-
$pretty_link_id = esc_html( $pretty_link_id );
|
5 |
-
$target_url_raw = esc_url_raw( $target_url, array('http','https') );
|
6 |
-
$target_url = esc_url( $target_url, array('http','https') );
|
7 |
-
$pretty_link_raw = esc_url_raw( $pretty_link, array('http','https') );
|
8 |
-
$pretty_link = esc_url( $pretty_link, array('http','https') );
|
9 |
-
$prli_blogurl_raw = esc_url_raw( $prli_blogurl, array('http','https') );
|
10 |
-
$prli_blogurl = esc_url( $prli_blogurl, array('http','https') );
|
11 |
-
$target_url_title = esc_html( $target_url_title );
|
12 |
-
|
13 |
$target_url_display = substr($target_url,0,50) . ((strlen($target_url)>50)?"...":'');
|
14 |
|
15 |
-
|
|
|
|
|
|
|
|
|
|
|
16 |
|
|
|
|
|
|
|
17 |
?>
|
18 |
<!DOCTYPE html>
|
19 |
<html>
|
20 |
<head>
|
21 |
<meta charset="UTF-8">
|
22 |
|
23 |
-
<title><?php
|
24 |
|
25 |
-
|
26 |
-
<link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/tooltipster-sideTip-borderless.min.css'; ?>" type="text/css" media="all" />
|
27 |
-
<link rel="stylesheet" href="<?php echo PRLI_VENDOR_LIB_URL.'/fontello/css/animation.css'; ?>" type="text/css" media="all" />
|
28 |
-
<link rel="stylesheet" href="<?php echo PRLI_VENDOR_LIB_URL.'/fontello/css/pretty-link.css'; ?>" type="text/css" media="all" />
|
29 |
-
<link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/social_buttons.css'; ?>" type="text/css" media="all" />
|
30 |
-
<link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/public_link.css'; ?>" type="text/css" media="all" />
|
31 |
-
|
32 |
-
<script type="text/javascript" src="<?php echo site_url('/wp-includes/js/jquery/jquery.js'); ?>"></script>
|
33 |
-
<script type="text/javascript" src="<?php echo PRLI_JS_URL . '/clipboard.min.js'; ?>"></script>
|
34 |
-
<script type="text/javascript" src="<?php echo PRLI_JS_URL . '/tooltipster.bundle.min.js'; ?>"></script>
|
35 |
-
<script type="text/javascript" src="<?php echo PRLI_JS_URL . '/admin_link_list.js'; ?>"></script>
|
36 |
</head>
|
37 |
<body>
|
38 |
<div class="prli-public-logo"><img src="<?php echo PRLI_IMAGES_URL; ?>/pl-logo-horiz-RGB.svg" /></div>
|
39 |
|
40 |
<div class="prli-public-wrap">
|
41 |
-
<div class="prli-public-label"><em><?php
|
42 |
-
<div class="prli-public-name"><?php echo $target_url_title; ?></div>
|
43 |
-
<div class="prli-public-target">(<span title="<?php echo $target_url; ?>"><?php echo $target_url_display; ?></span>)</div>
|
44 |
|
45 |
<div class="prli-public-pretty-link">
|
46 |
-
<span class="prli-public-pretty-link-display"><a href="<?php echo $
|
47 |
-
<span class="prli-clipboardjs prli-public-pretty-link-copy"><i class="pl-icon-clipboard pl-list-icon icon-clipboardjs" data-clipboard-text="<?php echo $
|
48 |
</div>
|
49 |
</div>
|
50 |
|
51 |
<?php if( $plp_update->is_installed() ): ?>
|
52 |
-
<div class="prli-public-social"><?php
|
53 |
<?php echo PlpSocialButtonsHelper::get_social_buttons_bar($pretty_link_id); ?>
|
54 |
<?php endif; ?>
|
55 |
|
56 |
-
<div class="prli-public-back"><a href="<?php echo $
|
|
|
|
|
57 |
</body>
|
58 |
</html>
|
1 |
<?php if(!defined('ABSPATH')) die('You are not allowed to call this page directly.');
|
2 |
|
3 |
+
global $plp_update;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
$target_url_display = substr($target_url,0,50) . ((strlen($target_url)>50)?"...":'');
|
5 |
|
6 |
+
wp_register_style('tooltipster', PRLI_CSS_URL . '/tooltipster.bundle.min.css', array(), '4.2.6');
|
7 |
+
wp_register_style('tooltipster-sidetip', PRLI_CSS_URL . '/tooltipster-sideTip-borderless.min.css', array('tooltipster'), '4.2.6');
|
8 |
+
wp_register_style('prli-animation', PRLI_VENDOR_LIB_URL.'/fontello/css/animation.css', array(), PRLI_VERSION);
|
9 |
+
wp_register_style('prli-icons', PRLI_VENDOR_LIB_URL.'/fontello/css/pretty-link.css', array(), PRLI_VERSION);
|
10 |
+
wp_register_style('prli-social-buttons', PRLI_CSS_URL . '/social_buttons.css', array(), PRLI_VERSION);
|
11 |
+
wp_register_style('prli-public-link', PRLI_CSS_URL . '/public_link.css', array('tooltipster', 'tooltipster-sidetip', 'prli-animation', 'prli-icons', 'prli-social-buttons'), PRLI_VERSION);
|
12 |
|
13 |
+
wp_register_script('clipboard-js', PRLI_JS_URL . '/clipboard.min.js', array(), '2.0.0');
|
14 |
+
wp_register_script('tooltipster', PRLI_JS_URL . '/tooltipster.bundle.min.js', array('jquery'), '4.2.6');
|
15 |
+
wp_register_script('prli-admin-link-list', PRLI_JS_URL . '/admin_link_list.js', array('jquery', 'clipboard-js', 'tooltipster'), PRLI_VERSION);
|
16 |
?>
|
17 |
<!DOCTYPE html>
|
18 |
<html>
|
19 |
<head>
|
20 |
<meta charset="UTF-8">
|
21 |
|
22 |
+
<title><?php esc_html_e('Here is your Pretty Link', 'pretty-link'); ?></title>
|
23 |
|
24 |
+
<?php wp_print_styles('prli-public-link'); ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
</head>
|
26 |
<body>
|
27 |
<div class="prli-public-logo"><img src="<?php echo PRLI_IMAGES_URL; ?>/pl-logo-horiz-RGB.svg" /></div>
|
28 |
|
29 |
<div class="prli-public-wrap">
|
30 |
+
<div class="prli-public-label"><em><?php esc_html_e('Here\'s your pretty link for', 'pretty-link'); ?></em></div>
|
31 |
+
<div class="prli-public-name"><?php echo esc_html($target_url_title); ?></div>
|
32 |
+
<div class="prli-public-target">(<span title="<?php echo esc_url($target_url); ?>"><?php echo esc_html($target_url_display); ?></span>)</div>
|
33 |
|
34 |
<div class="prli-public-pretty-link">
|
35 |
+
<span class="prli-public-pretty-link-display"><a href="<?php echo esc_url($pretty_link); ?>"><?php echo esc_url($pretty_link); ?></a></span>
|
36 |
+
<span class="prli-clipboardjs prli-public-pretty-link-copy"><i class="pl-icon-clipboard pl-list-icon icon-clipboardjs" data-clipboard-text="<?php echo esc_url($pretty_link); ?>"></i></span>
|
37 |
</div>
|
38 |
</div>
|
39 |
|
40 |
<?php if( $plp_update->is_installed() ): ?>
|
41 |
+
<div class="prli-public-social"><?php esc_html_e('send this link to:', 'pretty-link'); ?></div>
|
42 |
<?php echo PlpSocialButtonsHelper::get_social_buttons_bar($pretty_link_id); ?>
|
43 |
<?php endif; ?>
|
44 |
|
45 |
+
<div class="prli-public-back"><a href="<?php echo esc_url($target_url); ?>">« <?php esc_html_e('back', 'pretty-link'); ?></a></div>
|
46 |
+
|
47 |
+
<?php wp_print_scripts('prli-admin-link-list'); ?>
|
48 |
</body>
|
49 |
</html>
|
app/views/shared/table-nav.php
CHANGED
@@ -1,22 +1,25 @@
|
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
<?php
|
3 |
|
4 |
-
$curr_size = isset($_REQUEST['size']) ? $_REQUEST['size'] : 10;
|
5 |
-
$curr_url =
|
6 |
|
7 |
// Only show the pager bar if there is more than 1 page
|
8 |
if($page_count > 1)
|
9 |
{
|
10 |
?>
|
11 |
-
<div class="tablenav"<?php echo (isset($navstyle)?
|
12 |
-
<div class=
|
|
|
|
|
|
|
13 |
|
14 |
<?php
|
15 |
// Only show the prev page button if the current page is not the first page
|
16 |
if($current_page > 1)
|
17 |
{
|
18 |
?>
|
19 |
-
<a class=
|
20 |
<?php
|
21 |
}
|
22 |
|
@@ -24,13 +27,13 @@
|
|
24 |
if($current_page==1)
|
25 |
{
|
26 |
?>
|
27 |
-
<a class=
|
28 |
<?php
|
29 |
}
|
30 |
else
|
31 |
{
|
32 |
?>
|
33 |
-
<a class=
|
34 |
<?php
|
35 |
}
|
36 |
|
@@ -38,7 +41,7 @@
|
|
38 |
if($current_page >= 5)
|
39 |
{
|
40 |
?>
|
41 |
-
<span class=
|
42 |
<?php
|
43 |
}
|
44 |
|
@@ -50,13 +53,13 @@
|
|
50 |
if($current_page==$i)
|
51 |
{
|
52 |
?>
|
53 |
-
<a class=
|
54 |
<?php
|
55 |
}
|
56 |
else
|
57 |
{
|
58 |
?>
|
59 |
-
<a class=
|
60 |
<?php
|
61 |
}
|
62 |
}
|
@@ -65,7 +68,7 @@
|
|
65 |
if($current_page < ($page_count - 3))
|
66 |
{
|
67 |
?>
|
68 |
-
<span class=
|
69 |
<?php
|
70 |
}
|
71 |
|
@@ -73,13 +76,13 @@
|
|
73 |
if($current_page == $page_count)
|
74 |
{
|
75 |
?>
|
76 |
-
<a class=
|
77 |
<?php
|
78 |
}
|
79 |
else
|
80 |
{
|
81 |
?>
|
82 |
-
<a class=
|
83 |
<?php
|
84 |
}
|
85 |
|
@@ -87,7 +90,7 @@
|
|
87 |
if($current_page < $page_count)
|
88 |
{
|
89 |
?>
|
90 |
-
<a class=
|
91 |
<?php
|
92 |
}
|
93 |
?>
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
<?php
|
3 |
|
4 |
+
$curr_size = isset($_REQUEST['size']) ? (int) $_REQUEST['size'] : 10;
|
5 |
+
$curr_url = sanitize_text_field($_REQUEST['page']) . $page_params;
|
6 |
|
7 |
// Only show the pager bar if there is more than 1 page
|
8 |
if($page_count > 1)
|
9 |
{
|
10 |
?>
|
11 |
+
<div class="tablenav"<?php echo (isset($navstyle)?' style="' . esc_html($navstyle) . '"':''); ?>>
|
12 |
+
<div class="tablenav-pages">
|
13 |
+
<span class="displaying-num">
|
14 |
+
<?php echo esc_html(sprintf(__('Displaying %1$s–%2$s of %3$s', 'pretty-link'), $page_first_record, $page_last_record, $record_count)); ?>
|
15 |
+
</span>
|
16 |
|
17 |
<?php
|
18 |
// Only show the prev page button if the current page is not the first page
|
19 |
if($current_page > 1)
|
20 |
{
|
21 |
?>
|
22 |
+
<a class="prev page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . ($current_page-1)); ?>">«</a>
|
23 |
<?php
|
24 |
}
|
25 |
|
27 |
if($current_page==1)
|
28 |
{
|
29 |
?>
|
30 |
+
<a class="page-numbers disabled" href="#">1</a>
|
31 |
<?php
|
32 |
}
|
33 |
else
|
34 |
{
|
35 |
?>
|
36 |
+
<a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=1'); ?>">1</a>
|
37 |
<?php
|
38 |
}
|
39 |
|
41 |
if($current_page >= 5)
|
42 |
{
|
43 |
?>
|
44 |
+
<span class="page-numbers dots">...</span>
|
45 |
<?php
|
46 |
}
|
47 |
|
53 |
if($current_page==$i)
|
54 |
{
|
55 |
?>
|
56 |
+
<a class="page-numbers disabled" href="#"><?php echo esc_html($i); ?></a>
|
57 |
<?php
|
58 |
}
|
59 |
else
|
60 |
{
|
61 |
?>
|
62 |
+
<a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . $i); ?>"><?php echo esc_html($i); ?></a>
|
63 |
<?php
|
64 |
}
|
65 |
}
|
68 |
if($current_page < ($page_count - 3))
|
69 |
{
|
70 |
?>
|
71 |
+
<span class="page-numbers dots">...</span>
|
72 |
<?php
|
73 |
}
|
74 |
|
76 |
if($current_page == $page_count)
|
77 |
{
|
78 |
?>
|
79 |
+
<a class="page-numbers disabled" href="#"><?php echo esc_html($page_count); ?></a>
|
80 |
<?php
|
81 |
}
|
82 |
else
|
83 |
{
|
84 |
?>
|
85 |
+
<a class="page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . $page_count); ?>"><?php echo esc_html($page_count); ?></a>
|
86 |
<?php
|
87 |
}
|
88 |
|
90 |
if($current_page < $page_count)
|
91 |
{
|
92 |
?>
|
93 |
+
<a class="next page-numbers" href="<?php echo esc_url('?page=' . $curr_url . '&paged=' . ($current_page + 1)); ?>">»</a>
|
94 |
<?php
|
95 |
}
|
96 |
?>
|
app/views/shared/tinymce_form_popup.php
CHANGED
@@ -1,126 +1,97 @@
|
|
1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2 |
<html xmlns="http://www.w3.org/1999/xhtml">
|
3 |
<head>
|
4 |
-
<title><?php
|
5 |
-
|
6 |
-
.ui-autocomplete-loading {
|
7 |
-
background: white url("<?php echo admin_url('images/wpspin_light.gif'); ?>") right center no-repeat;
|
8 |
-
}
|
9 |
-
.ui-autocomplete {
|
10 |
-
max-height: 200px;
|
11 |
-
overflow-y: auto;
|
12 |
-
overflow-x: hidden;
|
13 |
-
width: 510px !important;
|
14 |
-
}
|
15 |
-
</style>
|
16 |
-
<link rel="stylesheet" href="<?php echo PRLI_CSS_URL . '/tinymce_form_popup.css'; ?>" type="text/css" media="all" />
|
17 |
-
<link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" type="text/css" media="all" />
|
18 |
-
<script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/jquery.js'); ?>"></script>
|
19 |
-
<script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/core.min.js'); ?>"></script>
|
20 |
-
<script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/widget.min.js'); ?>"></script>
|
21 |
-
<script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/position.min.js'); ?>"></script>
|
22 |
-
<script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/menu.min.js'); ?>"></script>
|
23 |
-
<script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/autocomplete.min.js'); ?>"></script>
|
24 |
-
<script language="javascript" type="text/javascript" src="<?php echo includes_url('/js/jquery/ui/accordion.min.js'); ?>"></script>
|
25 |
-
<script type="text/javascript">
|
26 |
-
//Setting up some JS variables for the tinymce_form_popup.js file
|
27 |
-
//Doing this here becuase I have access to PHP
|
28 |
-
var prli_selected_text = ''; //Updated on PrliPopUpHandler.init
|
29 |
-
var home_url = '<?php echo $home_url; ?>';
|
30 |
-
var default_redirect = '<?php echo $default_redirect; ?>';
|
31 |
-
var default_nofollow = '<?php echo $default_nofollow; ?>';
|
32 |
-
var default_tracking = '<?php echo $default_tracking; ?>';
|
33 |
-
var ajaxurl = '<?php echo admin_url('admin-ajax.php'); ?>';
|
34 |
-
</script>
|
35 |
-
<script language="javascript" type="text/javascript" src="<?php echo PRLI_JS_URL . '/tinymce_form_popup.js'; ?>"></script>
|
36 |
</head>
|
37 |
<body>
|
38 |
<div id="errors"></div>
|
39 |
<div id="prli_accordion">
|
40 |
-
<h3><?php
|
41 |
<div class="prlitinymce-options">
|
42 |
<div class="prlitinymce-options-row">
|
43 |
-
<label><?php
|
44 |
<input type="text" name="prli_insert_link_target" id="prli_insert_link_target" value="" />
|
45 |
</div>
|
46 |
<div class="prlitinymce-options-row">
|
47 |
-
<label><?php
|
48 |
-
<input type="text" name="prli_insert_link_slug" id="prli_insert_link_slug" value="<?php echo $random_slug; ?>" />
|
49 |
-
<span id="prlitinymce-thinking" class="prlitinymce-hidden"><img src="<?php echo admin_url('images/wpspin_light.gif'); ?>" /></span>
|
50 |
-
<span id="prlitinymce-good-slug" class="prlitinymce-hidden"><small><?php
|
51 |
-
<span id="prlitinymce-bad-slug" class="prlitinymce-hidden"><small><?php
|
52 |
<input type="hidden" name="prli_is_valid_slug" id="prli_is_valid_slug" value="good" />
|
53 |
</div>
|
54 |
<div class="prlitinymce-options-row">
|
55 |
-
<label><?php
|
56 |
<input type="text" name="prli_insert_link_link_text" id="prli_insert_link_link_text" value="" />
|
57 |
</div>
|
58 |
<div class="prlitinymce-options-row">
|
59 |
-
<label><?php
|
60 |
<select name="prli_insert_link_redirect" id="prli_insert_link_redirect">
|
61 |
-
<option value="default"><?php
|
62 |
-
<option value="307"><?php
|
63 |
-
<option value="302"><?php
|
64 |
-
<option value="301"><?php
|
65 |
<?php global $plp_update; ?>
|
66 |
<?php if($plp_update->is_installed()): ?>
|
67 |
-
<option value="prettybar"><?php
|
68 |
-
<option value="cloak"><?php
|
69 |
-
<option value="pixel"><?php
|
70 |
-
<option value="metarefresh"><?php
|
71 |
-
<option value="javascript"><?php
|
72 |
<?php endif; ?>
|
73 |
</select>
|
74 |
</div>
|
75 |
<div class="prlitinymce-options-row">
|
76 |
-
<label><?php
|
77 |
<select name="prli_insert_link_nofollow" id="prli_insert_link_nofollow">
|
78 |
-
<option value="default"><?php
|
79 |
-
<option value="enabled"><?php
|
80 |
-
<option value="disabled"><?php
|
81 |
</select>
|
82 |
</div>
|
83 |
<div class="prlitinymce-options-row">
|
84 |
-
<label><?php
|
85 |
<select name="prli_insert_link_tracking" id="prli_insert_link_tracking">
|
86 |
-
<option value="default"><?php
|
87 |
-
<option value="enabled"><?php
|
88 |
-
<option value="disabled"><?php
|
89 |
</select>
|
90 |
</div>
|
91 |
<div class="prlitinymce-options-row">
|
92 |
<label> </label>
|
93 |
-
<input type="checkbox" name="prli_insert_link_new_tab" id="prli_insert_link_new_tab" /> <?php
|
94 |
</div>
|
95 |
<div class="prlitinymce-options-row" id="prlitinymce-insert">
|
96 |
-
<a href="javascript:PrliPopUpHandler.insert_new()" class="prli_button"><?php
|
97 |
-
<span id="insert_loading" class="prlitinymce-hidden"><img src="<?php echo includes_url('/js/thickbox/loadingAnimation.gif'); ?>" width="150" /></span>
|
98 |
</div>
|
99 |
</div>
|
100 |
-
<h3><?php
|
101 |
<div id="prlitinymce-search-area" class="prlitinymce-options">
|
102 |
-
<input type="text" name="prli_search_box" id="prli_search_box" value="" placeholder="<?php
|
103 |
<div class="prlitinymce-options-row">
|
104 |
-
<label class="lefty"><?php
|
105 |
-
<small id="existing_link_target" class="righty"><?php
|
106 |
</div>
|
107 |
<div class="prlitinymce-options-row">
|
108 |
-
<label class="lefty"><?php
|
109 |
-
<small id="existing_link_slug" class="righty"><?php
|
110 |
</div>
|
111 |
<div class="prlitinymce-options-row">
|
112 |
-
<label><?php
|
113 |
<input type="text" name="existing_link_link_text" id="existing_link_link_text" value="" />
|
114 |
</div>
|
115 |
<div class="prlitinymce-options-row">
|
116 |
<label> </label>
|
117 |
-
<input type="checkbox" name="existing_link_new_tab" id="existing_link_new_tab" /> <?php
|
118 |
</div>
|
119 |
<div class="prlitinymce-options-row" id="existing_link_insert">
|
120 |
<input type="hidden" name="existing_link_nofollow" id="existing_link_nofollow" value="0" />
|
121 |
-
<a href="javascript:PrliPopUpHandler.insert_existing()" class="prli_button"><?php
|
122 |
</div>
|
123 |
</div>
|
124 |
</div>
|
|
|
125 |
</body>
|
126 |
</html>
|
1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
2 |
<html xmlns="http://www.w3.org/1999/xhtml">
|
3 |
<head>
|
4 |
+
<title><?php esc_html_e('Insert Pretty Link', 'pretty-link'); ?></title>
|
5 |
+
<?php wp_print_styles('prli-tinymce-popup-form'); ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
</head>
|
7 |
<body>
|
8 |
<div id="errors"></div>
|
9 |
<div id="prli_accordion">
|
10 |
+
<h3><?php esc_html_e('Create New Pretty Link', 'pretty-link'); ?></h3>
|
11 |
<div class="prlitinymce-options">
|
12 |
<div class="prlitinymce-options-row">
|
13 |
+
<label><?php esc_html_e('Target URL', 'pretty-link'); ?>:</label>
|
14 |
<input type="text" name="prli_insert_link_target" id="prli_insert_link_target" value="" />
|
15 |
</div>
|
16 |
<div class="prlitinymce-options-row">
|
17 |
+
<label><?php esc_html_e('Slug', 'pretty-link'); ?>:</label>
|
18 |
+
<input type="text" name="prli_insert_link_slug" id="prli_insert_link_slug" value="<?php echo esc_attr($random_slug); ?>" />
|
19 |
+
<span id="prlitinymce-thinking" class="prlitinymce-hidden"><img src="<?php echo esc_url(admin_url('images/wpspin_light.gif')); ?>" /></span>
|
20 |
+
<span id="prlitinymce-good-slug" class="prlitinymce-hidden"><small><?php esc_html_e('valid', 'pretty-link'); ?></small></span>
|
21 |
+
<span id="prlitinymce-bad-slug" class="prlitinymce-hidden"><small><?php esc_html_e('invalid', 'pretty-link'); ?></small></span>
|
22 |
<input type="hidden" name="prli_is_valid_slug" id="prli_is_valid_slug" value="good" />
|
23 |
</div>
|
24 |
<div class="prlitinymce-options-row">
|
25 |
+
<label><?php esc_html_e('Link Text', 'pretty-link'); ?>:</label>
|
26 |
<input type="text" name="prli_insert_link_link_text" id="prli_insert_link_link_text" value="" />
|
27 |
</div>
|
28 |
<div class="prlitinymce-options-row">
|
29 |
+
<label><?php esc_html_e('Redirect Type', 'pretty-link'); ?>:</label>
|
30 |
<select name="prli_insert_link_redirect" id="prli_insert_link_redirect">
|
31 |
+
<option value="default"><?php esc_html_e('Default', 'pretty-link'); ?></option>
|
32 |
+
<option value="307"><?php esc_html_e('307 (Temporary)', 'pretty-link'); ?></option>
|
33 |
+
<option value="302"><?php esc_html_e('302 (Temporary)', 'pretty-link'); ?></option>
|
34 |
+
<option value="301"><?php esc_html_e('301 (Permanent)', 'pretty-link'); ?></option>
|
35 |
<?php global $plp_update; ?>
|
36 |
<?php if($plp_update->is_installed()): ?>
|
37 |
+
<option value="prettybar"><?php esc_html_e('Pretty Bar', 'pretty-link'); ?></option>
|
38 |
+
<option value="cloak"><?php esc_html_e('Cloaked', 'pretty-link'); ?></option>
|
39 |
+
<option value="pixel"><?php esc_html_e('Pixel', 'pretty-link'); ?></option>
|
40 |
+
<option value="metarefresh"><?php esc_html_e('Meta Refresh', 'pretty-link'); ?></option>
|
41 |
+
<option value="javascript"><?php esc_html_e('Javascript', 'pretty-link'); ?></option>
|
42 |
<?php endif; ?>
|
43 |
</select>
|
44 |
</div>
|
45 |
<div class="prlitinymce-options-row">
|
46 |
+
<label><?php esc_html_e('Nofollow', 'pretty-link'); ?>:</label>
|
47 |
<select name="prli_insert_link_nofollow" id="prli_insert_link_nofollow">
|
48 |
+
<option value="default"><?php esc_html_e('Default', 'pretty-link'); ?></option>
|
49 |
+
<option value="enabled"><?php esc_html_e('Enabled', 'pretty-link'); ?></option>
|
50 |
+
<option value="disabled"><?php esc_html_e('Disabled', 'pretty-link'); ?></option>
|
51 |
</select>
|
52 |
</div>
|
53 |
<div class="prlitinymce-options-row">
|
54 |
+
<label><?php esc_html_e('Tracking', 'pretty-link'); ?>:</label>
|
55 |
<select name="prli_insert_link_tracking" id="prli_insert_link_tracking">
|
56 |
+
<option value="default"><?php esc_html_e('Default', 'pretty-link'); ?></option>
|
57 |
+
<option value="enabled"><?php esc_html_e('Enabled', 'pretty-link'); ?></option>
|
58 |
+
<option value="disabled"><?php esc_html_e('Disabled', 'pretty-link'); ?></option>
|
59 |
</select>
|
60 |
</div>
|
61 |
<div class="prlitinymce-options-row">
|
62 |
<label> </label>
|
63 |
+
<input type="checkbox" name="prli_insert_link_new_tab" id="prli_insert_link_new_tab" /> <?php esc_html_e('Open this Pretty Link in a new window/tab', 'pretty-link'); ?>
|
64 |
</div>
|
65 |
<div class="prlitinymce-options-row" id="prlitinymce-insert">
|
66 |
+
<a href="javascript:PrliPopUpHandler.insert_new()" class="prli_button"><?php esc_html_e('Insert New Pretty Link', 'pretty-link'); ?></a>
|
67 |
+
<span id="insert_loading" class="prlitinymce-hidden"><img src="<?php echo esc_url(includes_url('/js/thickbox/loadingAnimation.gif')); ?>" width="150" /></span>
|
68 |
</div>
|
69 |
</div>
|
70 |
+
<h3><?php esc_html_e("Use Existing Pretty Link", 'pretty-link'); ?></h3>
|
71 |
<div id="prlitinymce-search-area" class="prlitinymce-options">
|
72 |
+
<input type="text" name="prli_search_box" id="prli_search_box" value="" placeholder="<?php esc_attr_e('Search by Slug, Title, or Target URL...', 'pretty-link'); ?>" />
|
73 |
<div class="prlitinymce-options-row">
|
74 |
+
<label class="lefty"><?php esc_html_e('Target URL', 'pretty-link'); ?>:</label>
|
75 |
+
<small id="existing_link_target" class="righty"><?php esc_html_e('None', 'pretty-link'); ?></small>
|
76 |
</div>
|
77 |
<div class="prlitinymce-options-row">
|
78 |
+
<label class="lefty"><?php esc_html_e('Pretty Link', 'pretty-link'); ?>:</label>
|
79 |
+
<small id="existing_link_slug" class="righty"><?php esc_html_e('None', 'pretty-link'); ?></small>
|
80 |
</div>
|
81 |
<div class="prlitinymce-options-row">
|
82 |
+
<label><?php esc_html_e('Link Text', 'pretty-link'); ?>:</label>
|
83 |
<input type="text" name="existing_link_link_text" id="existing_link_link_text" value="" />
|
84 |
</div>
|
85 |
<div class="prlitinymce-options-row">
|
86 |
<label> </label>
|
87 |
+
<input type="checkbox" name="existing_link_new_tab" id="existing_link_new_tab" /> <?php esc_html_e('Open this Pretty Link in a new window/tab', 'pretty-link'); ?>
|
88 |
</div>
|
89 |
<div class="prlitinymce-options-row" id="existing_link_insert">
|
90 |
<input type="hidden" name="existing_link_nofollow" id="existing_link_nofollow" value="0" />
|
91 |
+
<a href="javascript:PrliPopUpHandler.insert_existing()" class="prli_button"><?php esc_html_e('Insert Existing Pretty Link', 'pretty-link'); ?></a>
|
92 |
</div>
|
93 |
</div>
|
94 |
</div>
|
95 |
+
<?php wp_print_scripts('prli-tinymce-popup-form'); ?>
|
96 |
</body>
|
97 |
</html>
|
app/views/shared/title_text.php
CHANGED
@@ -1,3 +1,2 @@
|
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
-
<
|
3 |
-
<h1 class="wp-heading-inline" style="margin-bottom:15px;"><?php echo esc_html($page_title); ?></h1>
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
+
<h1 class="wp-heading-inline" style="margin-bottom:15px;"><?php echo esc_html($page_title); ?></h1>
|
|
app/views/tools/form.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
<div class="wrap">
|
3 |
-
<?php
|
4 |
|
5 |
<?php if($update_message): ?>
|
6 |
<div class="updated notice notice-success is-dismissible"><p><strong><?php echo esc_html($update_message); ?></strong></p></div>
|
@@ -15,57 +15,79 @@
|
|
15 |
<tr>
|
16 |
<td class="prli-settings-table-nav">
|
17 |
<ul class="prli-sidebar-nav">
|
18 |
-
<li><a data-id="bookmarklet"><?php
|
19 |
-
<li><a data-id="trim"><?php
|
20 |
<?php do_action('prli_admin_tools_nav'); ?>
|
21 |
</ul>
|
22 |
</td>
|
23 |
<td class="prli-settings-table-pages">
|
24 |
<div class="prli-page" id="bookmarklet">
|
25 |
-
<div class="prli-page-title"><?php
|
26 |
-
<strong><a class="button button-primary" href="<?php echo PrliLink::bookmarklet_link(); ?>" style="vertical-align:middle;"><?php
|
27 |
<?php PrliAppHelper::info_tooltip( 'prli-bookmarklet-instructions',
|
28 |
-
|
29 |
-
|
|
|
|
|
|
|
|
|
|
|
30 |
?>
|
31 |
-
<br/><br/><a href="javascript:toggle_iphone_instructions()"><strong><?php
|
32 |
<br/><br/>
|
33 |
<div class="prli-sub-box iphone_instructions" style="display: none">
|
34 |
<div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
|
35 |
-
<?php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
<ol>
|
37 |
-
<li><?php
|
38 |
-
<li><?php
|
39 |
-
<li><?php
|
40 |
-
<li><?php
|
41 |
-
<li><?php
|
42 |
-
<li><?php
|
43 |
-
<li
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
</ol>
|
45 |
</div>
|
46 |
</div>
|
47 |
<div class="prli-page" id="trim">
|
48 |
-
<div class="prli-page-title"><?php
|
49 |
<?php if($prli_options->auto_trim_clicks): ?>
|
50 |
-
<p><em><?php
|
51 |
<?php endif; ?>
|
52 |
<?php if($prli_options->extended_tracking != 'count'): ?>
|
53 |
-
<a class="button" href="<?php echo admin_url('admin.php?page=pretty-link-tools&action=clear_30day_clicks'); ?>" onclick="return confirm('<?php
|
54 |
<?php PrliAppHelper::info_tooltip( 'prli-clear-clicks-30',
|
55 |
-
|
56 |
-
|
57 |
<div> </div>
|
58 |
-
<a class="button" href="<?php echo admin_url('admin.php?page=pretty-link-tools&action=clear_90day_clicks'); ?>" onclick="return confirm('<?php
|
59 |
<?php PrliAppHelper::info_tooltip( 'prli-clear-clicks-90',
|
60 |
-
|
61 |
-
|
62 |
<div> </div>
|
63 |
<?php endif; ?>
|
64 |
|
65 |
-
<a class="button button-primary" href="<?php echo admin_url('admin.php?page=pretty-link-tools&action=clear_all_clicks'); ?>" onclick="return confirm('<?php
|
66 |
<?php PrliAppHelper::info_tooltip( 'prli-clear-all-clicks',
|
67 |
-
|
68 |
-
|
69 |
</div>
|
70 |
|
71 |
<?php do_action('prli_admin_tools_pages'); ?>
|
1 |
<?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); } ?>
|
2 |
<div class="wrap">
|
3 |
+
<?php PrliAppHelper::page_title(__('Tools', 'pretty-link')); ?>
|
4 |
|
5 |
<?php if($update_message): ?>
|
6 |
<div class="updated notice notice-success is-dismissible"><p><strong><?php echo esc_html($update_message); ?></strong></p></div>
|
15 |
<tr>
|
16 |
<td class="prli-settings-table-nav">
|
17 |
<ul class="prli-sidebar-nav">
|
18 |
+
<li><a data-id="bookmarklet"><?php esc_html_e('Bookmarklet', 'pretty-link'); ?></a></li>
|
19 |
+
<li><a data-id="trim"><?php esc_html_e('Trim Clicks', 'pretty-link'); ?></a></li>
|
20 |
<?php do_action('prli_admin_tools_nav'); ?>
|
21 |
</ul>
|
22 |
</td>
|
23 |
<td class="prli-settings-table-pages">
|
24 |
<div class="prli-page" id="bookmarklet">
|
25 |
+
<div class="prli-page-title"><?php esc_html_e('Bookmarklet', 'pretty-link'); ?></div>
|
26 |
+
<strong><a class="button button-primary" href="<?php echo PrliLink::bookmarklet_link(); ?>" style="vertical-align:middle;"><?php esc_html_e('Get Pretty Link', 'pretty-link'); ?></a></strong>
|
27 |
<?php PrliAppHelper::info_tooltip( 'prli-bookmarklet-instructions',
|
28 |
+
esc_html__('Install Pretty Link Bookmarklet', 'pretty-link'),
|
29 |
+
sprintf(
|
30 |
+
// translators: %1$s: open link tag, %2$s close link tag
|
31 |
+
esc_html__('Just drag this "Get PrettyLink" link to your toolbar to install the bookmarklet. As you browse the web, you can just click this bookmarklet to create a pretty link from the current url you\'re looking at. %1$s(more help)%2$s', 'pretty-link'),
|
32 |
+
'<a href="http://blairwilliams.com/pretty-link-bookmarklet/">',
|
33 |
+
'</a>'
|
34 |
+
));
|
35 |
?>
|
36 |
+
<br/><br/><a href="javascript:toggle_iphone_instructions()"><strong><?php esc_html_e('Show iPhone Bookmarklet Instructions', 'pretty-link'); ?></strong></a>
|
37 |
<br/><br/>
|
38 |
<div class="prli-sub-box iphone_instructions" style="display: none">
|
39 |
<div class="prli-arrow prli-gray prli-up prli-sub-box-arrow"> </div>
|
40 |
+
<?php
|
41 |
+
printf(
|
42 |
+
// translators: %1$s: open strong tag, %2$s close strong tag
|
43 |
+
esc_html__('%1$sNote:%2$s iPhone users can install this bookmarklet in their Safari to create Pretty Links with the following steps:', 'pretty-link'),
|
44 |
+
'<strong>',
|
45 |
+
'</strong>'
|
46 |
+
);
|
47 |
+
?><br/>
|
48 |
<ol>
|
49 |
+
<li><?php esc_html_e('Copy this text:', 'pretty-link'); ?><br/><input type="text" value="<?php echo esc_attr(PrliLink::bookmarklet_link()); ?>" /></li>
|
50 |
+
<li><?php esc_html_e('Tap the + button at the bottom of the screen', 'pretty-link'); ?></li>
|
51 |
+
<li><?php esc_html_e('Choose to share the page, then click on "Bookmark". We recommend saving it in your Favorites folder. Rename your bookmark to "Get PrettyLink" (or whatever you want) and then "Save"', 'pretty-link'); ?></li>
|
52 |
+
<li><?php esc_html_e('Navigate through your Bookmarks until you find the new bookmark and click "Edit"', 'pretty-link'); ?></li>
|
53 |
+
<li><?php esc_html_e('Delete all the text from the address', 'pretty-link'); ?></li>
|
54 |
+
<li><?php esc_html_e('Paste the text you copied in Step 1 into the address field', 'pretty-link'); ?></li>
|
55 |
+
<li>
|
56 |
+
<?php
|
57 |
+
printf(
|
58 |
+
// translators: %1$s: open strong tag, %2$s close strong tag
|
59 |
+
esc_html__('To save the changes hit "Bookmarks" and %1$syou\'re done!%2$s', 'pretty-link'),
|
60 |
+
'<strong>',
|
61 |
+
'</strong>'
|
62 |
+
);
|
63 |
+
?>
|
64 |
+
<?php esc_html_e('Now when you find a page you want to save off as a Pretty Link, just click the "Bookmarks" icon at the bottom of the screen and select your "Get PrettyLink" bookmarklet.', 'pretty-link'); ?>
|
65 |
+
</li>
|
66 |
</ol>
|
67 |
</div>
|
68 |
</div>
|
69 |
<div class="prli-page" id="trim">
|
70 |
+
<div class="prli-page-title"><?php esc_html_e('Trim Clicks', 'pretty-link'); ?></div>
|
71 |
<?php if($prli_options->auto_trim_clicks): ?>
|
72 |
+
<p><em><?php esc_html_e('Pretty Link is already automatically trimming Clicks older than 90 days. Although not necessary, you can still use the buttons below to force click trimming.', 'pretty-link'); ?></em></p>
|
73 |
<?php endif; ?>
|
74 |
<?php if($prli_options->extended_tracking != 'count'): ?>
|
75 |
+
<a class="button" href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-tools&action=clear_30day_clicks')); ?>" onclick="return confirm('<?php esc_attr_e('***WARNING*** If you click OK you will delete ALL of the Click data that is older than 30 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!', 'pretty-link'); ?>');"><?php esc_html_e('Delete Clicks older than 30 days', 'pretty-link'); ?></a>
|
76 |
<?php PrliAppHelper::info_tooltip( 'prli-clear-clicks-30',
|
77 |
+
esc_html__('Clear clicks 30 days or older', 'pretty-link'),
|
78 |
+
esc_html__('This will clear all clicks in your database that are older than 30 days.', 'pretty-link') ); ?>
|
79 |
<div> </div>
|
80 |
+
<a class="button" href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-tools&action=clear_90day_clicks')); ?>" onclick="return confirm('<?php esc_attr_e('***WARNING*** If you click OK you will delete ALL of the Click data that is older than 90 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!', 'pretty-link'); ?>');"><?php esc_html_e('Delete Clicks older than 90 days', 'pretty-link'); ?></a>
|
81 |
<?php PrliAppHelper::info_tooltip( 'prli-clear-clicks-90',
|
82 |
+
esc_html__('Clear clicks 90 days or older', 'pretty-link'),
|
83 |
+
esc_html__('This will clear all clicks in your database that are older than 90 days.', 'pretty-link') ); ?>
|
84 |
<div> </div>
|
85 |
<?php endif; ?>
|
86 |
|
87 |
+
<a class="button button-primary" href="<?php echo esc_url(admin_url('admin.php?page=pretty-link-tools&action=clear_all_clicks')); ?>" onclick="return confirm('<?php esc_attr_e('***WARNING*** If you click OK you will delete ALL of the Click data in your Database. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete all your data because there is no going back!', 'pretty-link'); ?>');"><?php esc_html_e('Delete All Clicks', 'pretty-link'); ?></a>
|
88 |
<?php PrliAppHelper::info_tooltip( 'prli-clear-all-clicks',
|
89 |
+
esc_html__('Clear all clicks', 'pretty-link'),
|
90 |
+
esc_html__('Seriously, only click this link if you want to delete all the Click data in your database.', 'pretty-link') ); ?>
|
91 |
</div>
|
92 |
|
93 |
<?php do_action('prli_admin_tools_pages'); ?>
|
app/views/widgets/widget.php
CHANGED
@@ -1,26 +1,25 @@
|
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<div class="wrap">
|
3 |
<p style="text-align: left;">
|
4 |
-
<a href="https://prettylinks.com/pl/widget/buy"><img style="border: 0px;" src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="75%" /></a>
|
5 |
</p>
|
6 |
|
7 |
-
<form
|
8 |
-
|
9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
<
|
14 |
-
|
15 |
-
</tr>
|
16 |
-
<tr>
|
17 |
-
<td valign="top"><?php _e("Pretty Link", 'pretty-link'); ?></td>
|
18 |
-
<td><strong><?php echo esc_html($prli_blogurl); ?></strong>/<input type="text" name="slug" value="<?php echo $prli_link->generateValidSlug(); ?>">
|
19 |
-
</tr>
|
20 |
-
</table>
|
21 |
-
|
22 |
-
<p class="submit">
|
23 |
-
<input type="submit" name="Submit" value="Create" class="button button-primary" />
|
24 |
-
</p>
|
25 |
</form>
|
26 |
</div>
|
1 |
<?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
|
2 |
<div class="wrap">
|
3 |
<p style="text-align: left;">
|
4 |
+
<a href="https://prettylinks.com/pl/widget/buy"><img style="border: 0px;" src="<?php echo esc_url(PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'); ?>" width="75%" /></a>
|
5 |
</p>
|
6 |
|
7 |
+
<form id="prli-quick-create" method="post">
|
8 |
+
<div id="prli-quick-create-error" class="hidden"></div>
|
9 |
+
<table class="form-table">
|
10 |
+
<tr class="form-field">
|
11 |
+
<td valign="top"><?php esc_html_e("Target URL", 'pretty-link'); ?></td>
|
12 |
+
<td><input type="text" id="prli-quick-create-url" name="url" value="" size="75">
|
13 |
+
</tr>
|
14 |
+
<tr>
|
15 |
+
<td valign="top"><?php esc_html_e("Pretty Link", 'pretty-link'); ?></td>
|
16 |
+
<td><strong><?php echo esc_html($prli_blogurl); ?></strong>/<input type="text" id="prli-quick-create-slug" name="slug" value="<?php echo esc_attr($prli_link->generateValidSlug()); ?>">
|
17 |
+
</tr>
|
18 |
+
</table>
|
19 |
|
20 |
+
<p class="submit">
|
21 |
+
<input type="submit" name="Submit" value="<?php esc_attr_e('Create', 'pretty-link'); ?>" class="button button-primary" />
|
22 |
+
<span id="prli-quick-create-loading" class="hidden"><img src="<?php echo PRLI_IMAGES_URL . '/square-loader.gif'; ?>" alt="<?php esc_attr_e('Loading...', 'pretty-link'); ?>"></span>
|
23 |
+
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
</form>
|
25 |
</div>
|
css/admin_shared.css
CHANGED
@@ -92,7 +92,7 @@ a i.pl-icon:hover {
|
|
92 |
color: #aeaeae;
|
93 |
}
|
94 |
|
95 |
-
.prli-hidden {
|
96 |
display: none;
|
97 |
}
|
98 |
|
@@ -113,7 +113,6 @@ img.prli_loader {
|
|
113 |
}
|
114 |
|
115 |
.prli_admin_branding {
|
116 |
-
/* background: url(../images/pl-logo-horiz-RGB.png) no-repeat; */
|
117 |
float: right !important;
|
118 |
padding-right: 25px !important;
|
119 |
height:32px !important;
|
@@ -122,6 +121,7 @@ img.prli_loader {
|
|
122 |
background-size: 200px 32px !important;
|
123 |
}
|
124 |
|
|
|
125 |
.tablenav .tablenav-pages a.disabled ,
|
126 |
.tablenav .tablenav-pages a.disabled:hover {
|
127 |
cursor:default;
|
@@ -129,6 +129,7 @@ img.prli_loader {
|
|
129 |
border-color:#ccc;
|
130 |
color:#fff;
|
131 |
}
|
|
|
132 |
|
133 |
.prli-red {
|
134 |
color: red !important;
|
@@ -138,3 +139,187 @@ img.prli_loader {
|
|
138 |
color: green !important;
|
139 |
}
|
140 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
color: #aeaeae;
|
93 |
}
|
94 |
|
95 |
+
.prli-hidden, .prli_hidden {
|
96 |
display: none;
|
97 |
}
|
98 |
|
113 |
}
|
114 |
|
115 |
.prli_admin_branding {
|
|
|
116 |
float: right !important;
|
117 |
padding-right: 25px !important;
|
118 |
height:32px !important;
|
121 |
background-size: 200px 32px !important;
|
122 |
}
|
123 |
|
124 |
+
/*
|
125 |
.tablenav .tablenav-pages a.disabled ,
|
126 |
.tablenav .tablenav-pages a.disabled:hover {
|
127 |
cursor:default;
|
129 |
border-color:#ccc;
|
130 |
color:#fff;
|
131 |
}
|
132 |
+
*/
|
133 |
|
134 |
.prli-red {
|
135 |
color: red !important;
|
139 |
color: green !important;
|
140 |
}
|
141 |
|
142 |
+
#wpcontent #pl-admin-header {
|
143 |
+
margin-left: -20px;
|
144 |
+
padding: 15px;
|
145 |
+
padding-left: 22px;
|
146 |
+
background-image: url("../images/pretty-links-plugin-header.jpg");
|
147 |
+
background-repeat: repeat;
|
148 |
+
background-size: 1200px 75px;
|
149 |
+
min-height: 36px;
|
150 |
+
/* border-bottom: 2px solid #00cee6; */
|
151 |
+
}
|
152 |
+
#wpcontent #pl-admin-header img.pl-logo {
|
153 |
+
height: 36px;
|
154 |
+
}
|
155 |
+
|
156 |
+
.mfp-bg.mfp-prli {
|
157 |
+
z-index: 100002;
|
158 |
+
}
|
159 |
+
.mfp-wrap.mfp-prli {
|
160 |
+
z-index: 100003;
|
161 |
+
}
|
162 |
+
.mfp-wrap.mfp-prli .mfp-preloader {
|
163 |
+
z-index: 100004;
|
164 |
+
}
|
165 |
+
.mfp-wrap.mfp-prli .mfp-content {
|
166 |
+
z-index: 100005;
|
167 |
+
}
|
168 |
+
.prli-bullet-list {
|
169 |
+
list-style: disc;
|
170 |
+
margin-left: 2em;
|
171 |
+
}
|
172 |
+
.prli-welcome,
|
173 |
+
.prli-update {
|
174 |
+
position: relative;
|
175 |
+
max-width: 1200px;
|
176 |
+
margin: 25px 40px 0 20px;
|
177 |
+
font-size: 15px;
|
178 |
+
}
|
179 |
+
.prli-update {
|
180 |
+
max-width: 890px;
|
181 |
+
}
|
182 |
+
.prli-welcome h1,
|
183 |
+
.prli-update h1 {
|
184 |
+
margin: .2em 0 0 0;
|
185 |
+
padding: 0;
|
186 |
+
color: #32373c;
|
187 |
+
line-height: 1.2;
|
188 |
+
font-size: 2.8em;
|
189 |
+
font-weight: 400;
|
190 |
+
}
|
191 |
+
.prli-welcome h1 {
|
192 |
+
margin-right: 280px;
|
193 |
+
}
|
194 |
+
.prli-update h1 {
|
195 |
+
margin-bottom: 0.6em;
|
196 |
+
}
|
197 |
+
.prli-welcome p,
|
198 |
+
.prli-update p {
|
199 |
+
font-size: 16px;
|
200 |
+
line-height: 1.5;
|
201 |
+
}
|
202 |
+
.prli-welcome .prli-welcome-about {
|
203 |
+
font-size: 19px;
|
204 |
+
line-height: 1.6;
|
205 |
+
margin: 1em 0 1em 0;
|
206 |
+
}
|
207 |
+
.prli-welcome-badge {
|
208 |
+
/*
|
209 |
+
* position: absolute;
|
210 |
+
* top: 0;
|
211 |
+
* right: 0;
|
212 |
+
*/
|
213 |
+
width: 230px;
|
214 |
+
padding: 15px 15px 15px 0;
|
215 |
+
float: left;
|
216 |
+
}
|
217 |
+
.prli-welcome img,
|
218 |
+
.prli-update img {
|
219 |
+
max-width: 100%;
|
220 |
+
}
|
221 |
+
.prli-welcome hr {
|
222 |
+
border: 0;
|
223 |
+
height: 0;
|
224 |
+
margin: 5em 0 0;
|
225 |
+
border-top: 1px solid rgba(0, 0, 0, .1);
|
226 |
+
}
|
227 |
+
/*
|
228 |
+
.prli-center-section {
|
229 |
+
max-width: 890px;
|
230 |
+
margin: 40px auto 0 auto;
|
231 |
+
}
|
232 |
+
*/
|
233 |
+
p.prli-welcome-step {
|
234 |
+
display: block;
|
235 |
+
height: 160px;
|
236 |
+
font-weight: 900;
|
237 |
+
font-size: 18px;
|
238 |
+
margin-left: 25px;
|
239 |
+
}
|
240 |
+
p.prli-welcome-step img {
|
241 |
+
width: 160px !important;
|
242 |
+
height: 160px !important;
|
243 |
+
padding: 5px !important;
|
244 |
+
margin-right: 15px !important;
|
245 |
+
float: left;
|
246 |
+
border: 1px solid #444444;
|
247 |
+
}
|
248 |
+
.prli-row {
|
249 |
+
display: -ms-grid;
|
250 |
+
display: grid;
|
251 |
+
}
|
252 |
+
.prli-row.prli-2-columns {
|
253 |
+
-ms-grid-columns: 1fr 1fr;
|
254 |
+
grid-template-columns: 1fr 1fr;
|
255 |
+
}
|
256 |
+
.prli-row.prli-2-columns.prli-is-wider-left {
|
257 |
+
-ms-grid-columns: 2fr 1fr;
|
258 |
+
grid-template-columns: 2fr 1fr;
|
259 |
+
}
|
260 |
+
.prli-row.prli-2-columns.prli-is-wider-right {
|
261 |
+
-ms-grid-columns: 1fr 2fr;
|
262 |
+
grid-template-columns: 1fr 2fr;
|
263 |
+
}
|
264 |
+
.prli-column {
|
265 |
+
margin-right: 20px;
|
266 |
+
margin-left: 20px;
|
267 |
+
}
|
268 |
+
.prli-column :first-child {
|
269 |
+
margin-top: 0;
|
270 |
+
}
|
271 |
+
.prli-column.prli-align-vertically {
|
272 |
+
align-self: center;
|
273 |
+
}
|
274 |
+
.prli-welcome .prli-column img {
|
275 |
+
padding: 20px;
|
276 |
+
}
|
277 |
+
.prli-welcome h2,
|
278 |
+
.prli-update h2 {
|
279 |
+
margin: 0 0 .6em;
|
280 |
+
font-size: 1.6em;
|
281 |
+
line-height: 1.5;
|
282 |
+
}
|
283 |
+
.prli-welcome h3 {
|
284 |
+
margin: 1.25em 0 .6em;
|
285 |
+
font-size: 1.4em;
|
286 |
+
line-height: 1.5;
|
287 |
+
}
|
288 |
+
.prli-welcome ol li img {
|
289 |
+
display: block;
|
290 |
+
margin: 30px 0;
|
291 |
+
}
|
292 |
+
.prli-welcome ol li:last-child img {
|
293 |
+
margin-bottom: 0;
|
294 |
+
}
|
295 |
+
.prli-button-section {
|
296 |
+
text-align: center;
|
297 |
+
}
|
298 |
+
.prli-welcome .prli-button-section a {
|
299 |
+
padding: 15px 40px;
|
300 |
+
height: auto;
|
301 |
+
font-size: 17px;
|
302 |
+
line-height: 1.5;
|
303 |
+
}
|
304 |
+
.prli-update .prli-image-popup {
|
305 |
+
display: block;
|
306 |
+
}
|
307 |
+
@media screen and (max-width: 782px) {
|
308 |
+
.prli-welcome,
|
309 |
+
.prli-update {
|
310 |
+
margin-right: 30px;
|
311 |
+
}
|
312 |
+
.prli-welcome-badge {
|
313 |
+
position: relative;
|
314 |
+
width: 100%;
|
315 |
+
margin-bottom: 1.5em;
|
316 |
+
}
|
317 |
+
.prli-welcome h1,
|
318 |
+
.prli-welcome .prli-welcome-about {
|
319 |
+
margin-right: 0;
|
320 |
+
}
|
321 |
+
}
|
322 |
+
|
323 |
+
.prli-position-relative {
|
324 |
+
position: relative;
|
325 |
+
}
|
css/cloaked-redirect.css
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/* Make this shnizzle full screen and responsive */
|
2 |
+
body {
|
3 |
+
margin: 0;
|
4 |
+
}
|
5 |
+
/* fix for older browsers */
|
6 |
+
iframe, object, embed {
|
7 |
+
height: 100%;
|
8 |
+
width: 100%;
|
9 |
+
}
|
10 |
+
iframe, object, embed {
|
11 |
+
display: block;
|
12 |
+
background: #000;
|
13 |
+
border: none;
|
14 |
+
height: 100vh;
|
15 |
+
width: 100vw;
|
16 |
+
}
|
css/menu-styles.css
CHANGED
@@ -5,11 +5,11 @@
|
|
5 |
content: "\e844";
|
6 |
}
|
7 |
|
8 |
-
|
9 |
display: none;
|
10 |
}
|
11 |
|
12 |
-
|
13 |
/* content: "\e843"; */
|
14 |
content: "\e844";
|
15 |
font-family: "pretty-link";
|
5 |
content: "\e844";
|
6 |
}
|
7 |
|
8 |
+
.menu-icon-pretty-link div.wp-menu-image img {
|
9 |
display: none;
|
10 |
}
|
11 |
|
12 |
+
.menu-icon-pretty-link div.wp-menu-image:before {
|
13 |
/* content: "\e843"; */
|
14 |
content: "\e844";
|
15 |
font-family: "pretty-link";
|
css/prli-admin-links.css
CHANGED
@@ -1,8 +1,6 @@
|
|
1 |
#options-table {
|
2 |
width: 100%;
|
3 |
-
margin-top: 10px;
|
4 |
-
}
|
5 |
-
|
6 |
#pro-options-table {
|
7 |
width: 100%;
|
8 |
margin-top: 10px;
|
@@ -22,15 +20,6 @@
|
|
22 |
font-style: italic;
|
23 |
}
|
24 |
|
25 |
-
.link_row {
|
26 |
-
min-height: 75px;
|
27 |
-
height: 75px;
|
28 |
-
}
|
29 |
-
|
30 |
-
.link_actions {
|
31 |
-
display: none;
|
32 |
-
}
|
33 |
-
|
34 |
#add_group_message {
|
35 |
padding-left: 5px;
|
36 |
display: inline;
|
@@ -56,28 +45,128 @@
|
|
56 |
display: inline;
|
57 |
}
|
58 |
|
59 |
-
.
|
60 |
-
|
61 |
-
|
|
|
|
|
|
|
|
|
62 |
}
|
63 |
|
64 |
-
.
|
65 |
-
|
|
|
|
|
|
|
|
|
|
|
66 |
}
|
67 |
|
68 |
-
|
69 |
-
.
|
70 |
-
|
71 |
-
clear: none !important;
|
72 |
}
|
73 |
-
*/
|
74 |
|
75 |
-
.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
width: 100%;
|
77 |
-
clear: none !important;
|
78 |
}
|
79 |
|
80 |
-
.
|
81 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
}
|
83 |
|
1 |
#options-table {
|
2 |
width: 100%;
|
3 |
+
margin-top: 10px; }
|
|
|
|
|
4 |
#pro-options-table {
|
5 |
width: 100%;
|
6 |
margin-top: 10px;
|
20 |
font-style: italic;
|
21 |
}
|
22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
23 |
#add_group_message {
|
24 |
padding-left: 5px;
|
25 |
display: inline;
|
45 |
display: inline;
|
46 |
}
|
47 |
|
48 |
+
.advanced-link-options {
|
49 |
+
width: 100%;
|
50 |
+
clear: none !important;
|
51 |
+
}
|
52 |
+
|
53 |
+
.pl-list-icon {
|
54 |
+
font-size: 18px;
|
55 |
}
|
56 |
|
57 |
+
.post-type-pretty-link #pretty_link_errors {
|
58 |
+
background: #fff;
|
59 |
+
border: 1px solid rgba(0,0,0,.125);
|
60 |
+
border-left: 4px solid #dc3232;
|
61 |
+
box-shadow: 0 1px 1px 0 rgba(0,0,0,0.1);
|
62 |
+
margin: 5px 0 15px;
|
63 |
+
padding: 5px 12px;
|
64 |
}
|
65 |
|
66 |
+
.post-type-pretty-link #submitdiv #misc-publishing-actions,
|
67 |
+
.post-type-pretty-link #submitdiv #minor-publishing-actions {
|
68 |
+
display: none;
|
|
|
69 |
}
|
|
|
70 |
|
71 |
+
.column-settings {
|
72 |
+
width: 10% !important;
|
73 |
+
}
|
74 |
+
|
75 |
+
.column-title {
|
76 |
+
width: 25% !important;
|
77 |
+
}
|
78 |
+
|
79 |
+
.column-taxonomy-pretty-link-category,
|
80 |
+
.column-pro-pretty-link-category {
|
81 |
+
width: 10% !important;
|
82 |
+
}
|
83 |
+
|
84 |
+
.column-taxonomy-pretty-link-tag,
|
85 |
+
.column-pro-pretty-link-tag {
|
86 |
+
width: 10% !important;
|
87 |
+
}
|
88 |
+
|
89 |
+
.column-keywords {
|
90 |
+
width: 15% !important;
|
91 |
+
}
|
92 |
+
|
93 |
+
.column-clicks {
|
94 |
+
width: 5% !important;
|
95 |
+
}
|
96 |
+
|
97 |
+
.column-date {
|
98 |
+
width: 10% !important;
|
99 |
+
}
|
100 |
+
|
101 |
+
.column-links {
|
102 |
+
width: 25% !important;
|
103 |
+
}
|
104 |
+
|
105 |
+
.column-slug {
|
106 |
+
width: 15% !important;
|
107 |
+
}
|
108 |
+
|
109 |
+
.column-target {
|
110 |
+
width: 15% !important;
|
111 |
+
}
|
112 |
+
|
113 |
+
#pretty-link-settings.postbox .inside,
|
114 |
+
#pretty-link-settings.postbox .prli-settings-table {
|
115 |
+
padding: 0;
|
116 |
+
margin: 0;
|
117 |
+
}
|
118 |
+
|
119 |
+
#pretty-link-settings.postbox .prli-settings-table {
|
120 |
width: 100%;
|
|
|
121 |
}
|
122 |
|
123 |
+
#pretty-link-settings.postbox .prli-settings-table-pages {
|
124 |
+
padding-top: 0;
|
125 |
+
}
|
126 |
+
|
127 |
+
#pretty-link-settings.postbox h2.hndle {
|
128 |
+
color: white;
|
129 |
+
background-color: #444;
|
130 |
+
border-bottom: none;
|
131 |
+
}
|
132 |
+
|
133 |
+
#pretty-link-settings.postbox button.handlediv {
|
134 |
+
height: 35px;
|
135 |
+
}
|
136 |
+
|
137 |
+
table.wp-list-table .prli-pro-only-indicator a {
|
138 |
+
/* position: absolute; */
|
139 |
+
/* right: 10px; */
|
140 |
+
/* top: 20px; */
|
141 |
+
color: #fff;
|
142 |
+
background: #0074a2;
|
143 |
+
font-size: 10px;
|
144 |
+
line-height: 1.3;
|
145 |
+
text-transform: uppercase;
|
146 |
+
padding: 2px 3px;
|
147 |
+
-webkit-border-radius: 3px;
|
148 |
+
-moz-border-radius: 3px;
|
149 |
+
border-radius: 3px;
|
150 |
+
text-decoration: none;
|
151 |
+
}
|
152 |
+
|
153 |
+
table.wp-list-table .prli-pro-only-indicator a:hover {
|
154 |
+
background: #3390b5;
|
155 |
+
}
|
156 |
+
|
157 |
+
@media screen and (max-width: 782px) {
|
158 |
+
.wp-list-table .type-pretty-link .column-settings,
|
159 |
+
.wp-list-table .type-pretty-link.is-expanded .column-settings {
|
160 |
+
display: table-cell !important;
|
161 |
+
}
|
162 |
+
.wp-list-table .type-pretty-link .column-settings:before {
|
163 |
+
content: "" !important;
|
164 |
+
}
|
165 |
+
.wp-list-table .type-pretty-link .column-links {
|
166 |
+
text-align: inherit;
|
167 |
+
}
|
168 |
+
.wp-list-table .type-pretty-link .column-links input {
|
169 |
+
width: calc(100% - 30px) !important;
|
170 |
+
}
|
171 |
}
|
172 |
|
css/settings_table.css
CHANGED
@@ -61,6 +61,10 @@ table.prli-settings-table input[type=number] {
|
|
61 |
width: 50px !important;
|
62 |
}
|
63 |
|
|
|
|
|
|
|
|
|
64 |
table.prli-settings-table td.prli-settings-table-pages {
|
65 |
width: 100%;
|
66 |
background-color: white;
|
@@ -85,6 +89,43 @@ table.prli-settings-table td.prli-settings-table-pages .prli-page .prli-page-tit
|
|
85 |
margin-bottom: 15px;
|
86 |
}
|
87 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
.prli-sub-box {
|
89 |
background-color: #f1f1f1;
|
90 |
padding: 15px;
|
@@ -100,7 +141,7 @@ table.prli-settings-table td.prli-settings-table-pages .prli-page input.prli-aut
|
|
100 |
}
|
101 |
|
102 |
label.prli-label {
|
103 |
-
font-weight:
|
104 |
font-size: 14px;
|
105 |
color: #222;
|
106 |
}
|
@@ -184,5 +225,8 @@ table.prli-settings-table tr.prli-mobile-nav {
|
|
184 |
line-height: 50px;
|
185 |
padding: 0 15px;
|
186 |
}
|
|
|
|
|
|
|
187 |
}
|
188 |
|
61 |
width: 50px !important;
|
62 |
}
|
63 |
|
64 |
+
table.prli-settings-table .form-table th {
|
65 |
+
width: 225px;
|
66 |
+
}
|
67 |
+
|
68 |
table.prli-settings-table td.prli-settings-table-pages {
|
69 |
width: 100%;
|
70 |
background-color: white;
|
89 |
margin-bottom: 15px;
|
90 |
}
|
91 |
|
92 |
+
table.prli-settings-table tr.prli-pro-only th,
|
93 |
+
table.prli-settings-table label.prli-pro-only {
|
94 |
+
position: relative;
|
95 |
+
padding-right: 40px;
|
96 |
+
}
|
97 |
+
|
98 |
+
table.prli-settings-table tr.prli-pro-only input[type=checkbox]:disabled {
|
99 |
+
opacity: 1;
|
100 |
+
}
|
101 |
+
|
102 |
+
table.prli-settings-table .prli-pro-only-indicator {
|
103 |
+
position: absolute;
|
104 |
+
right: 10px;
|
105 |
+
top: 20px;
|
106 |
+
}
|
107 |
+
|
108 |
+
table.prli-settings-table .prli-pro-only-indicator a {
|
109 |
+
color: #fff;
|
110 |
+
background: #0074a2;
|
111 |
+
font-size: 10px;
|
112 |
+
line-height: 1.3;
|
113 |
+
text-transform: uppercase;
|
114 |
+
padding: 2px 3px;
|
115 |
+
-webkit-border-radius: 3px;
|
116 |
+
-moz-border-radius: 3px;
|
117 |
+
border-radius: 3px;
|
118 |
+
text-decoration: none;
|
119 |
+
}
|
120 |
+
|
121 |
+
table.prli-settings-table .prli-pro-only-indicator a:hover {
|
122 |
+
background: #3390b5;
|
123 |
+
}
|
124 |
+
|
125 |
+
table.prli-settings-table label.prli-pro-only .prli-pro-only-indicator {
|
126 |
+
top: 0;
|
127 |
+
}
|
128 |
+
|
129 |
.prli-sub-box {
|
130 |
background-color: #f1f1f1;
|
131 |
padding: 15px;
|
141 |
}
|
142 |
|
143 |
label.prli-label {
|
144 |
+
font-weight: 600;
|
145 |
font-size: 14px;
|
146 |
color: #222;
|
147 |
}
|
225 |
line-height: 50px;
|
226 |
padding: 0 15px;
|
227 |
}
|
228 |
+
table.prli-settings-table .prli-pro-only-indicator {
|
229 |
+
top: 10px;
|
230 |
+
}
|
231 |
}
|
232 |
|
i18n/pretty-link.pot
CHANGED
@@ -1,1872 +1,2033 @@
|
|
1 |
-
# Copyright (C) 2019
|
2 |
-
# This file is distributed under the same license as the Pretty Links
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version: Pretty Links
|
6 |
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/pretty-link\n"
|
7 |
-
"
|
|
|
8 |
"MIME-Version: 1.0\n"
|
9 |
"Content-Type: text/plain; charset=UTF-8\n"
|
10 |
"Content-Transfer-Encoding: 8bit\n"
|
11 |
-
"
|
12 |
-
"
|
13 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
|
15 |
-
|
16 |
-
|
17 |
-
msgid "Pretty Links | Manage Pretty Links"
|
18 |
msgstr ""
|
19 |
|
20 |
-
#.
|
21 |
-
|
22 |
-
#: app/controllers/PrliAppController.php:37
|
23 |
-
#: app/controllers/PrliAppController.php:46 app/views/links/list.php:12
|
24 |
-
msgid "Pretty Links"
|
25 |
msgstr ""
|
26 |
|
27 |
-
|
28 |
-
msgid "
|
29 |
msgstr ""
|
30 |
|
31 |
-
|
32 |
-
msgid "
|
33 |
msgstr ""
|
34 |
|
35 |
-
#: app/
|
36 |
-
|
|
|
37 |
msgstr ""
|
38 |
|
39 |
-
#:
|
40 |
-
msgid "
|
41 |
msgstr ""
|
42 |
|
43 |
-
#: app/
|
44 |
-
msgid "
|
45 |
msgstr ""
|
46 |
|
47 |
-
#:
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
#: pro/app/
|
|
|
|
|
52 |
#: pro/app/views/reports/split-test-report.php:28
|
53 |
#: pro/app/views/reports/split-test-report.php:60
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
54 |
msgid "Clicks"
|
55 |
msgstr ""
|
56 |
|
57 |
-
#: app/
|
58 |
-
|
|
|
|
|
|
|
|
|
59 |
msgstr ""
|
60 |
|
61 |
-
#:
|
62 |
-
|
|
|
63 |
msgstr ""
|
64 |
|
65 |
-
#: app/
|
66 |
-
msgid "
|
67 |
msgstr ""
|
68 |
|
69 |
-
#:
|
70 |
-
msgid "
|
71 |
msgstr ""
|
72 |
|
73 |
-
#: app/
|
74 |
-
|
75 |
-
msgid "Activate Pro"
|
76 |
msgstr ""
|
77 |
|
78 |
-
#: app/
|
79 |
-
|
80 |
-
#: app/views/admin/update/license.php:27 app/views/shared/nav.php:9
|
81 |
-
msgid "Upgrade to Pro"
|
82 |
msgstr ""
|
83 |
|
84 |
-
#: app/
|
85 |
-
|
86 |
-
#: app/controllers/PrliAppController.php:127
|
87 |
-
msgid "Docs"
|
88 |
msgstr ""
|
89 |
|
90 |
-
#: app/
|
91 |
-
|
|
|
92 |
msgstr ""
|
93 |
|
94 |
-
#: app/
|
95 |
-
#: app/controllers/
|
96 |
-
|
|
|
97 |
msgstr ""
|
98 |
|
99 |
-
#: app/
|
100 |
-
msgid "
|
101 |
msgstr ""
|
102 |
|
103 |
-
#: app/
|
104 |
-
msgid ""
|
105 |
-
"You're almost done!<br/>%1$sFinish your Re-Install of Pretty Links Pro%2$s"
|
106 |
msgstr ""
|
107 |
|
108 |
-
#: app/
|
109 |
-
|
|
|
|
|
110 |
msgstr ""
|
111 |
|
112 |
-
#: app/
|
113 |
-
msgid "
|
114 |
msgstr ""
|
115 |
|
116 |
-
#: app/
|
117 |
-
msgid ""
|
118 |
-
"Your Pretty Links Pro installation isn't quite complete yet. "
|
119 |
-
"%1$sAutomatically Upgrade to Enable Pretty Links Pro%2$s"
|
120 |
msgstr ""
|
121 |
|
122 |
-
#: app/
|
123 |
-
msgid ""
|
124 |
-
"Your Pretty Links Pro installation isn't quite complete yet.<br/>"
|
125 |
-
"%1$sAutomatically Upgrade to Enable Pretty Links Pro%2$s"
|
126 |
msgstr ""
|
127 |
|
128 |
-
#: app/
|
129 |
-
msgid "
|
130 |
msgstr ""
|
131 |
|
132 |
-
#: app/
|
133 |
-
msgid "
|
134 |
msgstr ""
|
135 |
|
136 |
-
#: app/
|
137 |
-
msgid "
|
138 |
msgstr ""
|
139 |
|
140 |
-
#: app/
|
141 |
-
msgid "
|
142 |
msgstr ""
|
143 |
|
144 |
-
#: app/
|
145 |
-
msgid "
|
146 |
msgstr ""
|
147 |
|
148 |
-
#: app/
|
149 |
-
|
|
|
150 |
msgstr ""
|
151 |
|
152 |
-
#: app/
|
153 |
-
msgid "
|
154 |
msgstr ""
|
155 |
|
156 |
-
#: app/
|
157 |
-
msgid "
|
158 |
msgstr ""
|
159 |
|
160 |
-
#: app/
|
161 |
-
msgid "
|
162 |
msgstr ""
|
163 |
|
164 |
-
#: app/
|
165 |
-
msgid "
|
166 |
msgstr ""
|
167 |
|
168 |
-
#: app/
|
169 |
-
msgid "
|
170 |
msgstr ""
|
171 |
|
172 |
-
#: app/
|
173 |
-
msgid "
|
174 |
msgstr ""
|
175 |
|
176 |
-
#: app/
|
177 |
-
|
|
|
|
|
178 |
msgstr ""
|
179 |
|
180 |
-
#: app/
|
181 |
-
|
|
|
|
|
|
|
182 |
msgstr ""
|
183 |
|
184 |
-
#: app/
|
185 |
-
#: app/
|
186 |
-
|
|
|
|
|
|
|
187 |
msgstr ""
|
188 |
|
189 |
-
#: app/
|
190 |
-
|
|
|
|
|
|
|
|
|
191 |
msgstr ""
|
192 |
|
193 |
-
#: app/
|
194 |
-
|
|
|
|
|
|
|
|
|
|
|
195 |
msgstr ""
|
196 |
|
197 |
-
#: app/
|
198 |
-
|
199 |
-
msgid "You are unauthorized to view this page."
|
200 |
msgstr ""
|
201 |
|
202 |
-
#: app/
|
203 |
-
|
|
|
204 |
msgstr ""
|
205 |
|
206 |
-
#: app/
|
207 |
-
|
|
|
|
|
|
|
208 |
msgstr ""
|
209 |
|
210 |
-
#: app/
|
211 |
-
|
|
|
|
|
|
|
212 |
msgstr ""
|
213 |
|
214 |
-
|
215 |
-
|
|
|
|
|
216 |
msgstr ""
|
217 |
|
218 |
-
#: app/
|
219 |
-
#: app/
|
220 |
-
|
|
|
|
|
221 |
msgstr ""
|
222 |
|
223 |
-
#: app/
|
224 |
-
|
|
|
225 |
msgstr ""
|
226 |
|
227 |
-
#: app/
|
228 |
-
|
|
|
|
|
|
|
229 |
msgstr ""
|
230 |
|
231 |
-
#: app/
|
232 |
-
|
233 |
-
"
|
234 |
-
"addresses or ranges."
|
235 |
msgstr ""
|
236 |
|
237 |
-
|
238 |
-
|
239 |
-
"
|
240 |
-
"addresses or ranges."
|
241 |
msgstr ""
|
242 |
|
243 |
-
#: app/
|
244 |
-
|
|
|
245 |
msgstr ""
|
246 |
|
247 |
-
#: app/
|
248 |
-
|
|
|
249 |
msgstr ""
|
250 |
|
251 |
-
#: app/
|
252 |
-
|
|
|
|
|
|
|
253 |
msgstr ""
|
254 |
|
255 |
-
|
256 |
-
|
|
|
|
|
257 |
msgstr ""
|
258 |
|
259 |
-
#: app/
|
260 |
-
|
|
|
261 |
msgstr ""
|
262 |
|
263 |
-
#: app/
|
264 |
-
|
|
|
265 |
msgstr ""
|
266 |
|
267 |
-
#: app/
|
268 |
-
|
|
|
269 |
msgstr ""
|
270 |
|
271 |
-
#: app/
|
272 |
-
msgid "
|
273 |
msgstr ""
|
274 |
|
275 |
-
#: app/
|
276 |
-
msgid "
|
277 |
msgstr ""
|
278 |
|
279 |
-
|
280 |
-
|
|
|
281 |
msgstr ""
|
282 |
|
283 |
-
#: app/
|
284 |
-
|
|
|
|
|
|
|
285 |
msgstr ""
|
286 |
|
287 |
-
#: app/
|
288 |
-
msgid "
|
289 |
msgstr ""
|
290 |
|
291 |
-
|
292 |
-
|
|
|
293 |
msgstr ""
|
294 |
|
295 |
-
#: app/
|
296 |
-
msgid "
|
297 |
msgstr ""
|
298 |
|
299 |
-
#: app/
|
300 |
-
msgid "
|
301 |
msgstr ""
|
302 |
|
303 |
-
#: app/
|
304 |
-
|
305 |
-
#: app/controllers/PrliXmlRpcController.php:145
|
306 |
-
#: app/controllers/PrliXmlRpcController.php:200
|
307 |
-
#: app/controllers/PrliXmlRpcController.php:229
|
308 |
-
#: app/controllers/PrliXmlRpcController.php:257
|
309 |
-
#: app/controllers/PrliXmlRpcController.php:290
|
310 |
-
#: app/controllers/PrliXmlRpcController.php:322
|
311 |
-
msgid "Sorry, XML-RPC Not enabled for this website"
|
312 |
msgstr ""
|
313 |
|
314 |
-
#: app/
|
315 |
-
|
316 |
-
#: app/controllers/PrliXmlRpcController.php:148
|
317 |
-
#: app/controllers/PrliXmlRpcController.php:203
|
318 |
-
#: app/controllers/PrliXmlRpcController.php:232
|
319 |
-
#: app/controllers/PrliXmlRpcController.php:260
|
320 |
-
#: app/controllers/PrliXmlRpcController.php:293
|
321 |
-
#: app/controllers/PrliXmlRpcController.php:325
|
322 |
-
msgid "Sorry, Login failed"
|
323 |
msgstr ""
|
324 |
|
325 |
-
|
326 |
-
#: app/
|
327 |
-
|
328 |
-
#: app/controllers/PrliXmlRpcController.php:209
|
329 |
-
#: app/controllers/PrliXmlRpcController.php:238
|
330 |
-
#: app/controllers/PrliXmlRpcController.php:266
|
331 |
-
#: app/controllers/PrliXmlRpcController.php:299
|
332 |
-
#: app/controllers/PrliXmlRpcController.php:331
|
333 |
-
msgid "Sorry, you must be an administrator to access this resource"
|
334 |
msgstr ""
|
335 |
|
336 |
-
#: app/
|
337 |
-
|
|
|
338 |
msgstr ""
|
339 |
|
340 |
-
#: app/
|
341 |
-
|
342 |
-
msgid "There was an error creating your Pretty Link"
|
343 |
msgstr ""
|
344 |
|
345 |
-
#: app/
|
346 |
-
msgid "
|
347 |
msgstr ""
|
348 |
|
349 |
-
#: app/
|
350 |
-
|
|
|
|
|
351 |
msgstr ""
|
352 |
|
353 |
-
#: app/
|
354 |
-
|
|
|
355 |
msgstr ""
|
356 |
|
357 |
-
#: app/
|
358 |
-
msgid "
|
359 |
msgstr ""
|
360 |
|
361 |
-
#: app/
|
362 |
-
#: app/
|
363 |
-
msgid "
|
364 |
msgstr ""
|
365 |
|
366 |
-
#: app/
|
367 |
-
#: app/
|
368 |
-
msgid "
|
369 |
msgstr ""
|
370 |
|
371 |
-
|
372 |
-
|
|
|
373 |
msgstr ""
|
374 |
|
375 |
-
#: app/
|
376 |
-
#: app/views/links/form.php:
|
377 |
-
#: app/views/
|
378 |
-
#:
|
379 |
-
|
380 |
-
msgid "None"
|
381 |
msgstr ""
|
382 |
|
383 |
-
|
384 |
-
#: app/views/
|
385 |
-
|
|
|
386 |
msgstr ""
|
387 |
|
388 |
-
#:
|
389 |
-
#: app/views/
|
390 |
-
msgid "
|
391 |
msgstr ""
|
392 |
|
393 |
-
#:
|
394 |
-
#: app/views/
|
395 |
-
msgid "
|
396 |
msgstr ""
|
397 |
|
398 |
-
#: app/
|
399 |
-
|
|
|
400 |
msgstr ""
|
401 |
|
402 |
-
#:
|
403 |
-
#: pro/app/views/
|
404 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
405 |
msgstr ""
|
406 |
|
407 |
-
#:
|
408 |
-
#:
|
409 |
-
msgid "
|
410 |
msgstr ""
|
411 |
|
412 |
-
#: app/
|
413 |
-
|
|
|
414 |
msgstr ""
|
415 |
|
416 |
-
#: app/
|
417 |
-
|
|
|
418 |
msgstr ""
|
419 |
|
420 |
-
#:
|
421 |
-
#: app/views/links/
|
422 |
-
msgid "
|
423 |
msgstr ""
|
424 |
|
425 |
-
|
426 |
-
|
|
|
427 |
msgstr ""
|
428 |
|
429 |
-
#: app/
|
430 |
-
msgid "
|
431 |
msgstr ""
|
432 |
|
433 |
-
#: app/
|
434 |
-
msgid "
|
435 |
msgstr ""
|
436 |
|
437 |
-
#: app/
|
438 |
-
msgid "
|
439 |
msgstr ""
|
440 |
|
441 |
-
#: app/
|
442 |
-
msgid "
|
443 |
msgstr ""
|
444 |
|
445 |
-
#: app/
|
446 |
-
msgid "
|
447 |
msgstr ""
|
448 |
|
449 |
-
#: app/
|
450 |
-
|
|
|
|
|
451 |
msgstr ""
|
452 |
|
453 |
-
#: app/
|
454 |
-
msgid "
|
455 |
msgstr ""
|
456 |
|
457 |
-
#: app/
|
458 |
-
msgid "
|
459 |
msgstr ""
|
460 |
|
461 |
-
#: app/
|
462 |
-
msgid "
|
463 |
msgstr ""
|
464 |
|
465 |
-
#: app/
|
466 |
-
|
|
|
467 |
msgstr ""
|
468 |
|
469 |
-
#: app/
|
470 |
-
msgid "
|
471 |
msgstr ""
|
472 |
|
473 |
-
#:
|
474 |
-
#: app/views/
|
475 |
-
|
|
|
476 |
msgstr ""
|
477 |
|
478 |
-
#: app/
|
479 |
-
|
480 |
-
"
|
481 |
-
"Pretty Link and all of the statistical data about it in your database."
|
482 |
msgstr ""
|
483 |
|
484 |
-
#: app/
|
485 |
-
msgid "
|
486 |
msgstr ""
|
487 |
|
488 |
-
#: app/
|
489 |
-
|
490 |
-
"
|
491 |
-
"the statistical data about this Pretty Link in your database."
|
492 |
msgstr ""
|
493 |
|
494 |
-
|
495 |
-
|
|
|
496 |
msgstr ""
|
497 |
|
498 |
-
#:
|
499 |
-
msgid "
|
500 |
msgstr ""
|
501 |
|
502 |
-
#: app/
|
503 |
-
msgid "
|
504 |
msgstr ""
|
505 |
|
506 |
-
#: app/
|
507 |
-
msgid "
|
508 |
msgstr ""
|
509 |
|
510 |
-
#: app/
|
511 |
-
msgid "
|
512 |
msgstr ""
|
513 |
|
514 |
-
#: app/
|
515 |
-
msgid "
|
516 |
msgstr ""
|
517 |
|
518 |
-
#: app/
|
519 |
-
msgid "
|
520 |
msgstr ""
|
521 |
|
522 |
-
#: app/
|
523 |
-
msgid "
|
524 |
msgstr ""
|
525 |
|
526 |
-
#:
|
527 |
-
msgid "
|
528 |
msgstr ""
|
529 |
|
530 |
-
#: app/
|
531 |
-
msgid "
|
532 |
msgstr ""
|
533 |
|
534 |
-
#:
|
535 |
-
msgid "
|
536 |
msgstr ""
|
537 |
|
538 |
-
#:
|
539 |
-
#: pro/app/
|
540 |
-
|
|
|
541 |
msgstr ""
|
542 |
|
543 |
-
#:
|
544 |
-
|
545 |
-
msgid "Date"
|
546 |
msgstr ""
|
547 |
|
548 |
-
#: app/
|
549 |
-
msgid "
|
550 |
msgstr ""
|
551 |
|
552 |
-
#: app/
|
553 |
-
|
|
|
|
|
554 |
msgstr ""
|
555 |
|
556 |
-
#: app/
|
557 |
-
msgid "
|
558 |
msgstr ""
|
559 |
|
560 |
-
#: app/
|
561 |
-
msgid "
|
562 |
msgstr ""
|
563 |
|
564 |
-
|
565 |
-
|
566 |
-
"
|
567 |
-
"signs."
|
568 |
msgstr ""
|
569 |
|
570 |
-
#: app/
|
571 |
-
|
|
|
|
|
572 |
msgstr ""
|
573 |
|
574 |
-
#: app/
|
575 |
-
msgid ""
|
576 |
-
"This Pretty Link Slug is already taken. Check to make sure it isn't being "
|
577 |
-
"used by another pretty link, post, page, category or tag slug. If none of "
|
578 |
-
"these are true then check to see that this slug isn't the name of a file in "
|
579 |
-
"the root folder of your wordpress install."
|
580 |
msgstr ""
|
581 |
|
582 |
-
#: app/
|
583 |
-
msgid "
|
584 |
msgstr ""
|
585 |
|
586 |
-
#:
|
587 |
-
msgid "
|
588 |
msgstr ""
|
589 |
|
590 |
-
#: app/views/
|
591 |
-
msgid "
|
592 |
msgstr ""
|
593 |
|
594 |
-
#: app/views/
|
595 |
-
msgid ""
|
596 |
-
"If you enjoy using Pretty Link would you mind taking a moment to rate it on "
|
597 |
-
"WordPress.org? It won't take more than a minute."
|
598 |
msgstr ""
|
599 |
|
600 |
-
#: app/views/
|
601 |
-
msgid "
|
602 |
msgstr ""
|
603 |
|
604 |
-
#:
|
605 |
-
msgid "
|
606 |
msgstr ""
|
607 |
|
608 |
-
#: app/views/
|
609 |
-
|
|
|
610 |
msgstr ""
|
611 |
|
612 |
-
#:
|
613 |
-
msgid "
|
614 |
msgstr ""
|
615 |
|
616 |
-
#: app/views/
|
617 |
-
msgid "
|
618 |
msgstr ""
|
619 |
|
620 |
-
#: app/views/
|
621 |
-
msgid "
|
622 |
msgstr ""
|
623 |
|
624 |
-
#:
|
625 |
-
|
626 |
-
msgid "Auto-replace keywords throughout your site with Pretty Links"
|
627 |
msgstr ""
|
628 |
|
629 |
-
#:
|
630 |
-
|
631 |
-
msgid "Protect your affiliate links by using Cloaked Redirects"
|
632 |
msgstr ""
|
633 |
|
634 |
-
#:
|
635 |
-
|
636 |
-
msgid "Redirect based on a visitor's location"
|
637 |
msgstr ""
|
638 |
|
639 |
-
#:
|
640 |
-
|
641 |
-
msgid "Auto-prettylink your Pages & Posts"
|
642 |
msgstr ""
|
643 |
|
644 |
-
#:
|
645 |
-
|
646 |
-
msgid "Find out what works and what doesn't by split testing your links"
|
647 |
msgstr ""
|
648 |
|
649 |
-
#:
|
650 |
-
|
651 |
-
msgid "And much, much more!"
|
652 |
msgstr ""
|
653 |
|
654 |
-
#:
|
655 |
-
|
656 |
-
msgid ""
|
657 |
-
"Plus, upgrading is fast, easy and won't disrupt any of your existing links "
|
658 |
-
"or data. And there's even a 14 day money back guarantee."
|
659 |
msgstr ""
|
660 |
|
661 |
-
#:
|
662 |
-
|
663 |
-
msgid "We think you'll love it!"
|
664 |
msgstr ""
|
665 |
|
666 |
-
#: app/views/
|
667 |
-
msgid "
|
668 |
msgstr ""
|
669 |
|
670 |
-
#: app/views/
|
671 |
-
msgid "
|
672 |
msgstr ""
|
673 |
|
674 |
-
#: app/views/
|
675 |
-
|
676 |
-
msgid "Pretty Links Pro isn't able to get critical automatic updates"
|
677 |
msgstr ""
|
678 |
|
679 |
-
#: app/views/
|
680 |
-
msgid ""
|
681 |
-
"It looks like you used to have Pretty Links Pro activated with a username "
|
682 |
-
"and password but now you need a license key to activate it."
|
683 |
msgstr ""
|
684 |
|
685 |
-
#: app/views/
|
686 |
-
msgid ""
|
687 |
-
"You can get your license key by logging in at %1$sPrettyLinkPro.com.%2$s"
|
688 |
msgstr ""
|
689 |
|
690 |
-
#: app/views/
|
691 |
-
msgid ""
|
692 |
-
"After you paste your license key on the %1$s\"Pretty Link\" -> \"Activate Pro"
|
693 |
-
"\" admin page,%2$s you'll start getting updates again."
|
694 |
msgstr ""
|
695 |
|
696 |
-
#: app/views/
|
697 |
-
msgid ""
|
698 |
-
"You can retrieve or purchase a license key at %1$sPrettyLinkPro.com%2$s to "
|
699 |
-
"enable automatic updates today."
|
700 |
msgstr ""
|
701 |
|
702 |
-
#: app/views/
|
703 |
-
msgid ""
|
704 |
-
"After you paste your license key on the %1$s\"Pretty Link\" -> \"Activate Pro"
|
705 |
-
"\" admin page,%2$s you'll start getting automatic updates."
|
706 |
msgstr ""
|
707 |
|
708 |
-
#: app/views/
|
709 |
-
msgid "
|
710 |
msgstr ""
|
711 |
|
712 |
-
#: app/views/
|
713 |
-
msgid ""
|
714 |
-
"The %s features in your Pretty Link options have been moved from Pretty Link "
|
715 |
-
"into a separate plugin."
|
716 |
msgstr ""
|
717 |
|
718 |
-
#: app/views/
|
719 |
-
msgid ""
|
720 |
-
"Why you ask? Well, it's to streamline and increase the performance of Pretty "
|
721 |
-
"Link for you."
|
722 |
msgstr ""
|
723 |
|
724 |
-
#: app/views/
|
725 |
-
msgid ""
|
726 |
-
"And good for you, it looks like you've already got the %1$s Add-on "
|
727 |
-
"installed. Just click the \"Activate %2$s Add-on\" button below and you'll "
|
728 |
-
"get all these features back now."
|
729 |
msgstr ""
|
730 |
|
731 |
-
#: app/views/
|
732 |
-
msgid ""
|
733 |
-
"Luckily it's easy to get these features back now. Just click the \"Install "
|
734 |
-
"%s Add-on\" button below."
|
735 |
msgstr ""
|
736 |
|
737 |
-
#: app/views/
|
738 |
-
msgid ""
|
739 |
-
"If you have problems with the auto-install please refer to %1$sthe user "
|
740 |
-
"manual%2$s for manual install instructions."
|
741 |
msgstr ""
|
742 |
|
743 |
-
#: app/views/
|
744 |
-
msgid "
|
745 |
msgstr ""
|
746 |
|
747 |
-
#: app/views/
|
748 |
-
msgid "
|
749 |
msgstr ""
|
750 |
|
751 |
-
#: app/views/
|
752 |
-
msgid "
|
753 |
msgstr ""
|
754 |
|
755 |
-
#: app/views/
|
756 |
-
msgid "
|
757 |
msgstr ""
|
758 |
|
759 |
-
#: app/views/
|
760 |
-
msgid "
|
761 |
msgstr ""
|
762 |
|
763 |
-
#: app/views/
|
764 |
-
|
|
|
765 |
msgstr ""
|
766 |
|
767 |
-
#: app/views/
|
768 |
-
|
|
|
769 |
msgstr ""
|
770 |
|
771 |
-
#:
|
772 |
-
|
|
|
773 |
msgstr ""
|
774 |
|
775 |
-
#: app/views/
|
776 |
-
|
|
|
777 |
msgstr ""
|
778 |
|
779 |
-
#: app/views/
|
780 |
-
|
|
|
781 |
msgstr ""
|
782 |
|
783 |
-
#: app/views/
|
784 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
785 |
msgstr ""
|
786 |
|
787 |
-
#: app/views/
|
788 |
-
|
789 |
-
"
|
790 |
-
"(not recommended for production websites)"
|
791 |
msgstr ""
|
792 |
|
793 |
-
#: app/views/
|
794 |
-
|
|
|
|
|
|
|
795 |
msgstr ""
|
796 |
|
797 |
-
#: app/views/
|
798 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
799 |
msgstr ""
|
800 |
|
801 |
-
#: app/views/
|
802 |
-
|
803 |
-
"
|
804 |
-
"Pro. If you don't have a License please go to %1$s to get one. If you do "
|
805 |
-
"have a license you can login at %2$s to manage your licenses and site "
|
806 |
-
"activations."
|
807 |
msgstr ""
|
808 |
|
809 |
-
#: app/views/
|
810 |
-
msgid "
|
811 |
msgstr ""
|
812 |
|
813 |
-
#: app/views/
|
814 |
-
|
|
|
815 |
msgstr ""
|
816 |
|
817 |
-
#:
|
818 |
-
|
819 |
-
|
820 |
-
|
|
|
821 |
msgstr ""
|
822 |
|
823 |
-
#:
|
824 |
-
|
|
|
|
|
|
|
|
|
|
|
825 |
msgstr ""
|
826 |
|
827 |
-
#: app/views/
|
828 |
-
|
|
|
|
|
|
|
829 |
msgstr ""
|
830 |
|
831 |
-
#: app/views/
|
832 |
-
msgid "
|
833 |
msgstr ""
|
834 |
|
835 |
-
#: app/views/
|
836 |
-
|
|
|
|
|
|
|
|
|
837 |
msgstr ""
|
838 |
|
839 |
-
#: app/views/
|
840 |
-
|
|
|
841 |
msgstr ""
|
842 |
|
843 |
-
#: app/views/
|
844 |
-
msgid "
|
845 |
msgstr ""
|
846 |
|
847 |
-
#: app/views/
|
848 |
-
|
|
|
|
|
849 |
msgstr ""
|
850 |
|
851 |
-
#: app/views/
|
852 |
-
|
853 |
-
|
854 |
-
"Key is deactivated."
|
855 |
msgstr ""
|
856 |
|
857 |
-
#: app/views/
|
858 |
-
msgid "
|
859 |
msgstr ""
|
860 |
|
861 |
-
#: app/views/
|
862 |
-
msgid "
|
863 |
msgstr ""
|
864 |
|
865 |
-
#: app/views/
|
866 |
-
msgid "
|
867 |
msgstr ""
|
868 |
|
869 |
-
#: app/views/
|
870 |
-
msgid "
|
871 |
msgstr ""
|
872 |
|
873 |
-
#: app/views/
|
874 |
-
msgid "
|
875 |
msgstr ""
|
876 |
|
877 |
-
#: app/views/
|
878 |
-
|
|
|
879 |
msgstr ""
|
880 |
|
881 |
-
#: app/views/
|
882 |
-
|
|
|
|
|
883 |
msgstr ""
|
884 |
|
885 |
-
#: app/views/
|
886 |
-
|
|
|
|
|
887 |
msgstr ""
|
888 |
|
889 |
-
#: app/views/
|
890 |
-
|
|
|
|
|
891 |
msgstr ""
|
892 |
|
893 |
-
#: app/views/
|
894 |
-
msgid "
|
895 |
msgstr ""
|
896 |
|
897 |
-
#: app/views/
|
898 |
-
|
|
|
|
|
|
|
899 |
msgstr ""
|
900 |
|
901 |
-
#:
|
902 |
-
|
903 |
-
msgid "Customize Report"
|
904 |
msgstr ""
|
905 |
|
906 |
-
#:
|
907 |
-
msgid "
|
908 |
msgstr ""
|
909 |
|
910 |
-
#: app/views/
|
911 |
-
msgid "
|
912 |
msgstr ""
|
913 |
|
914 |
-
#: app/views/
|
915 |
-
msgid "
|
916 |
msgstr ""
|
917 |
|
918 |
-
#: app/views/
|
919 |
-
#: pro/app/
|
920 |
-
|
921 |
-
msgid "All Clicks"
|
922 |
msgstr ""
|
923 |
|
924 |
-
#: app/views/
|
925 |
-
#: pro/app/
|
926 |
-
|
927 |
-
msgid "Unique Clicks"
|
928 |
msgstr ""
|
929 |
|
930 |
-
#:
|
931 |
-
|
932 |
-
msgid "Date Range:"
|
933 |
msgstr ""
|
934 |
|
935 |
-
#: app/views/
|
936 |
-
|
|
|
937 |
msgstr ""
|
938 |
|
939 |
-
#:
|
940 |
-
#: app/views/groups/new.php:
|
941 |
-
#: app/views/
|
942 |
-
|
943 |
-
#: pro/app/views/reports/edit.php:109 pro/app/views/reports/new.php:109
|
944 |
-
msgid "Cancel"
|
945 |
msgstr ""
|
946 |
|
947 |
-
#:
|
948 |
-
#: app/views/
|
949 |
-
msgid "
|
950 |
msgstr ""
|
951 |
|
952 |
-
#:
|
953 |
-
|
|
|
954 |
msgstr ""
|
955 |
|
956 |
-
#:
|
957 |
-
|
|
|
958 |
msgstr ""
|
959 |
|
960 |
-
#:
|
961 |
-
|
|
|
962 |
msgstr ""
|
963 |
|
964 |
-
#:
|
965 |
-
|
|
|
966 |
msgstr ""
|
967 |
|
968 |
-
#:
|
969 |
-
|
|
|
970 |
msgstr ""
|
971 |
|
972 |
-
#:
|
973 |
-
|
|
|
974 |
msgstr ""
|
975 |
|
976 |
-
#:
|
977 |
-
msgid "
|
978 |
msgstr ""
|
979 |
|
980 |
-
#:
|
981 |
-
msgid "
|
982 |
msgstr ""
|
983 |
|
984 |
-
#:
|
985 |
-
|
986 |
-
msgid "Link"
|
987 |
msgstr ""
|
988 |
|
989 |
-
#: app/views/
|
990 |
-
msgid "
|
991 |
msgstr ""
|
992 |
|
993 |
-
#: app/views/
|
994 |
-
msgid "
|
995 |
msgstr ""
|
996 |
|
997 |
-
#: app/views/
|
998 |
-
msgid "
|
999 |
msgstr ""
|
1000 |
|
1001 |
-
#: app/views/
|
1002 |
-
|
|
|
1003 |
msgstr ""
|
1004 |
|
1005 |
-
#: app/views/
|
1006 |
-
|
|
|
1007 |
msgstr ""
|
1008 |
|
1009 |
-
|
1010 |
-
|
|
|
|
|
1011 |
msgstr ""
|
1012 |
|
1013 |
-
#:
|
1014 |
-
|
|
|
1015 |
msgstr ""
|
1016 |
|
1017 |
-
#:
|
1018 |
-
|
|
|
1019 |
msgstr ""
|
1020 |
|
1021 |
-
|
1022 |
-
|
|
|
|
|
1023 |
msgstr ""
|
1024 |
|
1025 |
-
#:
|
1026 |
-
|
|
|
1027 |
msgstr ""
|
1028 |
|
1029 |
-
#:
|
1030 |
-
#: app/views/
|
1031 |
-
|
1032 |
-
#: pro/app/views/reports/edit.php:85 pro/app/views/reports/list.php:30
|
1033 |
-
#: pro/app/views/reports/list.php:70 pro/app/views/reports/new.php:85
|
1034 |
-
msgid "Name"
|
1035 |
msgstr ""
|
1036 |
|
1037 |
-
|
1038 |
-
|
|
|
|
|
1039 |
msgstr ""
|
1040 |
|
1041 |
-
#:
|
1042 |
-
|
1043 |
-
"
|
1044 |
-
"group at a time.</strong>"
|
1045 |
msgstr ""
|
1046 |
|
1047 |
-
#:
|
1048 |
-
#: app/views/
|
1049 |
-
|
1050 |
-
msgid "Update"
|
1051 |
msgstr ""
|
1052 |
|
1053 |
-
|
1054 |
-
|
|
|
|
|
1055 |
msgstr ""
|
1056 |
|
1057 |
-
#:
|
1058 |
-
#: app/views/
|
1059 |
-
|
1060 |
-
#: pro/app/views/reports/list.php:32 pro/app/views/reports/list.php:72
|
1061 |
-
msgid "Links"
|
1062 |
msgstr ""
|
1063 |
|
1064 |
-
#:
|
1065 |
-
#: app/views/
|
1066 |
-
|
1067 |
-
msgid "Created"
|
1068 |
msgstr ""
|
1069 |
|
1070 |
-
#: app/views/
|
1071 |
-
|
|
|
1072 |
msgstr ""
|
1073 |
|
1074 |
-
#: app/views/
|
1075 |
-
msgid "
|
1076 |
msgstr ""
|
1077 |
|
1078 |
-
#: app/views/
|
1079 |
-
msgid "
|
1080 |
msgstr ""
|
1081 |
|
1082 |
-
#: app/views/
|
1083 |
-
msgid "
|
1084 |
msgstr ""
|
1085 |
|
1086 |
-
#:
|
1087 |
-
msgid "
|
1088 |
msgstr ""
|
1089 |
|
1090 |
-
#:
|
1091 |
-
msgid "
|
1092 |
msgstr ""
|
1093 |
|
1094 |
-
#: app/views/
|
1095 |
-
msgid "
|
1096 |
msgstr ""
|
1097 |
|
1098 |
-
#: app/views/
|
1099 |
-
msgid "
|
1100 |
msgstr ""
|
1101 |
|
1102 |
-
#:
|
1103 |
-
|
1104 |
-
msgid "Redirection Type"
|
1105 |
msgstr ""
|
1106 |
|
1107 |
-
#: app/views/
|
1108 |
-
|
|
|
|
|
1109 |
msgstr ""
|
1110 |
|
1111 |
-
#: app/views/
|
1112 |
-
|
1113 |
-
|
1114 |
-
|
1115 |
-
"%1$sgoing pro today!%2$s"
|
1116 |
msgstr ""
|
1117 |
|
1118 |
-
#: app/views/
|
1119 |
-
|
|
|
|
|
1120 |
msgstr ""
|
1121 |
|
1122 |
-
#: app/views/
|
1123 |
-
#: app/views/
|
1124 |
-
msgid "
|
1125 |
msgstr ""
|
1126 |
|
1127 |
-
#: app/views/
|
1128 |
-
|
|
|
1129 |
msgstr ""
|
1130 |
|
1131 |
-
|
1132 |
-
|
|
|
|
|
1133 |
msgstr ""
|
1134 |
|
1135 |
-
#: app/views/
|
1136 |
-
|
1137 |
-
msgid "Pretty Link"
|
1138 |
msgstr ""
|
1139 |
|
1140 |
-
#: app/views/
|
1141 |
-
msgid ""
|
1142 |
-
"This is how your pretty link will appear. You can edit the Pretty Link slug "
|
1143 |
-
"here."
|
1144 |
msgstr ""
|
1145 |
|
1146 |
-
#:
|
1147 |
-
msgid "
|
1148 |
msgstr ""
|
1149 |
|
1150 |
-
#: app/views/
|
1151 |
-
|
1152 |
-
"
|
1153 |
-
"target url. Alternatively you can enter a custom title here."
|
1154 |
msgstr ""
|
1155 |
|
1156 |
-
#:
|
1157 |
-
|
|
|
1158 |
msgstr ""
|
1159 |
|
1160 |
-
#: app/views/
|
1161 |
-
|
1162 |
-
"This
|
1163 |
-
"notes field is mainly for your own link management needs. It isn't currently "
|
1164 |
-
"used anywhere on the front end."
|
1165 |
msgstr ""
|
1166 |
|
1167 |
-
#: app/views/
|
1168 |
-
msgid "
|
1169 |
msgstr ""
|
1170 |
|
1171 |
-
#: app/views/
|
1172 |
-
|
1173 |
-
#: pro/app/views/options/autocreate.php:30 pro/app/views/reports/edit.php:86
|
1174 |
-
#: pro/app/views/reports/new.php:86
|
1175 |
-
msgid "Group"
|
1176 |
msgstr ""
|
1177 |
|
1178 |
-
|
1179 |
-
|
|
|
1180 |
msgstr ""
|
1181 |
|
1182 |
-
#: app/views/
|
1183 |
-
|
|
|
1184 |
msgstr ""
|
1185 |
|
1186 |
-
#:
|
1187 |
-
|
|
|
1188 |
msgstr ""
|
1189 |
|
1190 |
-
#: app/views/
|
1191 |
-
|
|
|
1192 |
msgstr ""
|
1193 |
|
1194 |
-
#: app/views/
|
1195 |
-
|
|
|
1196 |
msgstr ""
|
1197 |
|
1198 |
-
#: app/views/
|
1199 |
-
|
|
|
1200 |
msgstr ""
|
1201 |
|
1202 |
-
|
1203 |
-
|
|
|
|
|
1204 |
msgstr ""
|
1205 |
|
1206 |
-
#: app/views/
|
1207 |
-
|
|
|
|
|
|
|
1208 |
msgstr ""
|
1209 |
|
1210 |
-
|
1211 |
-
|
|
|
|
|
1212 |
msgstr ""
|
1213 |
|
1214 |
-
#: app/views/
|
1215 |
-
|
|
|
1216 |
msgstr ""
|
1217 |
|
1218 |
-
#:
|
1219 |
-
|
1220 |
-
msgid "Tracking"
|
1221 |
msgstr ""
|
1222 |
|
1223 |
-
#: app/views/
|
1224 |
-
|
|
|
1225 |
msgstr ""
|
1226 |
|
1227 |
-
#: app/views/
|
1228 |
-
#: pro/app/views/
|
1229 |
-
msgid "
|
1230 |
msgstr ""
|
1231 |
|
1232 |
-
#: app/views/
|
1233 |
-
msgid "
|
1234 |
msgstr ""
|
1235 |
|
1236 |
-
#: app/views/
|
1237 |
-
msgid ""
|
1238 |
-
"Requires the Google Analyticator, Google Analytics by MonsterInsights "
|
1239 |
-
"(formerly Yoast) or Google Analytics Plugin installed and configured for "
|
1240 |
-
"this to work."
|
1241 |
msgstr ""
|
1242 |
|
1243 |
-
#: app/views/
|
1244 |
-
msgid ""
|
1245 |
-
"It appears that <strong>%s</strong> is currently installed. Pretty Link will "
|
1246 |
-
"attempt to use its settings to track this link."
|
1247 |
msgstr ""
|
1248 |
|
1249 |
-
#: app/views/
|
1250 |
-
|
1251 |
-
"
|
1252 |
-
"links using Google Analytics until one is."
|
1253 |
msgstr ""
|
1254 |
|
1255 |
-
#: app/views/
|
1256 |
-
|
|
|
1257 |
msgstr ""
|
1258 |
|
1259 |
-
#: app/views/
|
1260 |
-
|
|
|
1261 |
msgstr ""
|
1262 |
|
1263 |
-
#:
|
1264 |
-
|
|
|
1265 |
msgstr ""
|
1266 |
|
1267 |
-
#: app/views/
|
1268 |
-
|
1269 |
-
"
|
1270 |
-
"select a Permalink Structure other than 'Default'"
|
1271 |
msgstr ""
|
1272 |
|
1273 |
-
#:
|
1274 |
-
|
|
|
1275 |
msgstr ""
|
1276 |
|
1277 |
-
#: app/views/
|
1278 |
-
|
|
|
1279 |
msgstr ""
|
1280 |
|
1281 |
-
#:
|
1282 |
-
|
|
|
1283 |
msgstr ""
|
1284 |
|
1285 |
-
#: app/views/
|
1286 |
-
|
|
|
1287 |
msgstr ""
|
1288 |
|
1289 |
-
#: app/views/
|
1290 |
-
|
|
|
1291 |
msgstr ""
|
1292 |
|
1293 |
-
#:
|
1294 |
-
|
|
|
1295 |
msgstr ""
|
1296 |
|
1297 |
-
#: app/views/
|
1298 |
-
|
|
|
1299 |
msgstr ""
|
1300 |
|
1301 |
-
#:
|
1302 |
-
|
|
|
1303 |
msgstr ""
|
1304 |
|
1305 |
-
|
1306 |
-
|
|
|
|
|
1307 |
msgstr ""
|
1308 |
|
1309 |
-
#: app/views/
|
1310 |
-
|
|
|
1311 |
msgstr ""
|
1312 |
|
1313 |
-
#: app/views/
|
1314 |
-
|
|
|
1315 |
msgstr ""
|
1316 |
|
1317 |
-
|
1318 |
-
|
|
|
|
|
1319 |
msgstr ""
|
1320 |
|
1321 |
-
#: app/views/options/form.php:
|
1322 |
-
|
|
|
1323 |
msgstr ""
|
1324 |
|
1325 |
-
#: app/views/options/form.php:
|
1326 |
-
|
|
|
1327 |
msgstr ""
|
1328 |
|
1329 |
-
|
1330 |
-
|
1331 |
-
|
1332 |
-
"
|
1333 |
msgstr ""
|
1334 |
|
1335 |
-
#: app/views/options/form.php:
|
1336 |
-
|
|
|
1337 |
msgstr ""
|
1338 |
|
1339 |
-
#: app/views/options/form.php:
|
1340 |
-
|
|
|
1341 |
msgstr ""
|
1342 |
|
1343 |
-
|
1344 |
-
|
|
|
|
|
1345 |
msgstr ""
|
1346 |
|
1347 |
-
#: app/views/options/form.php:
|
1348 |
-
|
|
|
1349 |
msgstr ""
|
1350 |
|
1351 |
-
#: app/views/options/form.php:
|
1352 |
-
|
1353 |
-
"
|
1354 |
msgstr ""
|
1355 |
|
1356 |
-
|
1357 |
-
|
|
|
|
|
1358 |
msgstr ""
|
1359 |
|
1360 |
-
#: app/views/options/form.php:
|
1361 |
-
|
|
|
1362 |
msgstr ""
|
1363 |
|
1364 |
-
#: app/views/options/form.php:
|
1365 |
-
|
|
|
1366 |
msgstr ""
|
1367 |
|
1368 |
-
|
1369 |
-
|
|
|
|
|
1370 |
msgstr ""
|
1371 |
|
1372 |
-
#: app/views/options/form.php:
|
1373 |
-
|
|
|
1374 |
msgstr ""
|
1375 |
|
1376 |
-
#: app/views/options/form.php:
|
1377 |
-
|
|
|
1378 |
msgstr ""
|
1379 |
|
1380 |
-
|
1381 |
-
|
|
|
|
|
1382 |
msgstr ""
|
1383 |
|
1384 |
-
#: app/views/options/form.php:
|
1385 |
-
|
1386 |
-
"
|
1387 |
-
"structure that must be present in any link on your site. For example, some "
|
1388 |
-
"WordPress installs don't have the benefit of full rewrite capabilities and "
|
1389 |
-
"in this case you'd need an index.php included in each link (http://example."
|
1390 |
-
"com/index.php/mycoolslug instead of http://example.com/mycoolslug). If this "
|
1391 |
-
"is the case for you then check this option but the vast majority of users "
|
1392 |
-
"will want to keep this unchecked."
|
1393 |
msgstr ""
|
1394 |
|
1395 |
-
#: app/views/options/form.php:
|
1396 |
-
|
|
|
1397 |
msgstr ""
|
1398 |
|
1399 |
-
#:
|
1400 |
-
|
|
|
1401 |
msgstr ""
|
1402 |
|
1403 |
-
#: app/views/options/form.php:
|
1404 |
-
|
1405 |
-
"
|
1406 |
-
"statistics. Extended mode must be used for Conversion reporting."
|
1407 |
msgstr ""
|
1408 |
|
1409 |
-
#: app/views/options/form.php:
|
1410 |
-
|
|
|
1411 |
msgstr ""
|
1412 |
|
1413 |
-
#: app/views/options/form.php:
|
1414 |
-
|
|
|
1415 |
msgstr ""
|
1416 |
|
1417 |
-
#: app/views/options/form.php:
|
1418 |
-
|
|
|
1419 |
msgstr ""
|
1420 |
|
1421 |
-
#: app/views/options/form.php:
|
1422 |
-
|
|
|
1423 |
msgstr ""
|
1424 |
|
1425 |
-
#: app/views/options/form.php:
|
1426 |
-
|
|
|
1427 |
msgstr ""
|
1428 |
|
1429 |
-
#: app/views/options/form.php:
|
1430 |
-
|
1431 |
-
"
|
1432 |
-
"Stats. Each IP Address should be separated by commas. Example: 192.168.0.1, "
|
1433 |
-
"192.168.2.1, 192.168.3.4 or 192.168.*.*<br/><br/><strong>FYI, your current "
|
1434 |
-
"IP address is %s."
|
1435 |
msgstr ""
|
1436 |
|
1437 |
-
#: app/views/options/form.php:
|
1438 |
-
|
|
|
1439 |
msgstr ""
|
1440 |
|
1441 |
-
#: app/views/options/form.php:
|
1442 |
-
|
|
|
1443 |
msgstr ""
|
1444 |
|
1445 |
-
#: app/views/options/form.php:
|
1446 |
-
|
1447 |
-
|
1448 |
-
|
1449 |
-
"
|
1450 |
msgstr ""
|
1451 |
|
1452 |
-
|
1453 |
-
|
|
|
|
|
1454 |
msgstr ""
|
1455 |
|
1456 |
-
#: app/views/options/form.php:
|
1457 |
-
|
1458 |
-
"
|
1459 |
-
"stats and reports. Works best if Tracking Style above is set to 'Extended "
|
1460 |
-
"Tracking'."
|
1461 |
msgstr ""
|
1462 |
|
1463 |
-
#: app/views/options/form.php:
|
1464 |
-
|
|
|
1465 |
msgstr ""
|
1466 |
|
1467 |
-
|
1468 |
-
|
|
|
|
|
1469 |
msgstr ""
|
1470 |
|
1471 |
-
#: app/views/options/form.php:
|
1472 |
-
|
1473 |
-
"
|
1474 |
-
"data and Stats even if they are flagged as robots. Each IP Address should be "
|
1475 |
-
"separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or "
|
1476 |
-
"192.168.*.*"
|
1477 |
msgstr ""
|
1478 |
|
1479 |
-
#: app/views/
|
1480 |
-
#: app/views/
|
1481 |
-
msgid "
|
1482 |
msgstr ""
|
1483 |
|
1484 |
-
#: app/views/
|
1485 |
-
|
|
|
1486 |
msgstr ""
|
1487 |
|
1488 |
-
|
1489 |
-
|
|
|
|
|
1490 |
msgstr ""
|
1491 |
|
1492 |
-
#: app/views/
|
1493 |
-
|
|
|
1494 |
msgstr ""
|
1495 |
|
1496 |
-
#: app/views/
|
1497 |
-
|
|
|
1498 |
msgstr ""
|
1499 |
|
1500 |
-
|
1501 |
-
|
|
|
|
|
1502 |
msgstr ""
|
1503 |
|
1504 |
-
#: app/views/
|
1505 |
-
|
|
|
1506 |
msgstr ""
|
1507 |
|
1508 |
-
|
1509 |
-
|
|
|
|
|
1510 |
msgstr ""
|
1511 |
|
1512 |
-
#: app/views/
|
1513 |
-
|
|
|
1514 |
msgstr ""
|
1515 |
|
1516 |
-
#: app/views/
|
1517 |
-
|
|
|
1518 |
msgstr ""
|
1519 |
|
1520 |
-
#: app/views/
|
1521 |
-
|
|
|
1522 |
msgstr ""
|
1523 |
|
1524 |
-
#: app/views/
|
1525 |
-
|
|
|
1526 |
msgstr ""
|
1527 |
|
1528 |
-
#: app/views/
|
1529 |
-
msgid "
|
1530 |
msgstr ""
|
1531 |
|
1532 |
-
#: app/views/
|
1533 |
-
msgid "
|
1534 |
msgstr ""
|
1535 |
|
1536 |
-
#: app/views/
|
1537 |
-
|
1538 |
-
msgid "Link Text"
|
1539 |
msgstr ""
|
1540 |
|
1541 |
-
#: app/views/
|
1542 |
-
|
1543 |
-
#: app/views/shared/tinymce_form_popup.php:86
|
1544 |
-
#: pro/app/views/tools/generator.php:22 pro/app/views/tools/generator.php:27
|
1545 |
-
#: pro/app/widgets/PlpPublicLinksWidget.php:59
|
1546 |
-
#: pro/app/widgets/PlpPublicLinksWidget.php:71
|
1547 |
-
msgid "Default"
|
1548 |
msgstr ""
|
1549 |
|
1550 |
-
#: app/views/
|
1551 |
-
|
1552 |
-
#: pro/app/controllers/PlpLinksController.php:667
|
1553 |
-
#: pro/app/views/options/nav.php:5
|
1554 |
-
msgid "Pretty Bar"
|
1555 |
msgstr ""
|
1556 |
|
1557 |
-
#: app/views/
|
1558 |
-
|
1559 |
-
msgid "Cloaked"
|
1560 |
msgstr ""
|
1561 |
|
1562 |
-
#: app/views/
|
1563 |
-
|
1564 |
-
#: pro/app/controllers/PlpLinksController.php:669
|
1565 |
-
msgid "Pixel"
|
1566 |
msgstr ""
|
1567 |
|
1568 |
-
#: app/views/
|
1569 |
-
|
1570 |
-
#: pro/app/controllers/PlpLinksController.php:670
|
1571 |
-
msgid "Meta Refresh"
|
1572 |
msgstr ""
|
1573 |
|
1574 |
-
#: app/views/
|
1575 |
-
|
1576 |
-
#: pro/app/controllers/PlpLinksController.php:671
|
1577 |
-
msgid "Javascript"
|
1578 |
msgstr ""
|
1579 |
|
1580 |
-
#: app/views/
|
1581 |
-
|
1582 |
-
msgid "Enabled"
|
1583 |
msgstr ""
|
1584 |
|
1585 |
-
#: app/views/
|
1586 |
-
|
1587 |
-
msgid "Disabled"
|
1588 |
msgstr ""
|
1589 |
|
1590 |
-
#: app/views/
|
1591 |
-
|
1592 |
-
msgid "Open this Pretty Link in a new window/tab"
|
1593 |
msgstr ""
|
1594 |
|
1595 |
-
#: app/views/
|
1596 |
-
msgid "
|
1597 |
msgstr ""
|
1598 |
|
1599 |
-
#: app/views/
|
1600 |
-
msgid "
|
1601 |
msgstr ""
|
1602 |
|
1603 |
-
#: app/views/
|
1604 |
-
msgid "
|
1605 |
msgstr ""
|
1606 |
|
1607 |
-
#: app/views/
|
1608 |
-
msgid "
|
1609 |
msgstr ""
|
1610 |
|
1611 |
-
#:
|
1612 |
-
msgid "
|
1613 |
msgstr ""
|
1614 |
|
1615 |
-
#:
|
1616 |
-
msgid "
|
1617 |
msgstr ""
|
1618 |
|
1619 |
-
#:
|
1620 |
-
|
1621 |
-
msgid "Get Pretty Link"
|
1622 |
msgstr ""
|
1623 |
|
1624 |
-
#: app/views/
|
1625 |
-
|
|
|
1626 |
msgstr ""
|
1627 |
|
1628 |
-
#: app/views/
|
1629 |
-
msgid ""
|
1630 |
-
"Just drag this \"Get PrettyLink\" link to your toolbar to install the "
|
1631 |
-
"bookmarklet. As you browse the web, you can just click this bookmarklet to "
|
1632 |
-
"create a pretty link from the current url you're looking at. <a href="
|
1633 |
-
"\"http://blairwilliams.com/pretty-link-bookmarklet/\">(more help)</a>"
|
1634 |
msgstr ""
|
1635 |
|
1636 |
-
#: app/views/
|
1637 |
-
msgid "
|
1638 |
msgstr ""
|
1639 |
|
1640 |
-
#: app/views/
|
1641 |
-
msgid ""
|
1642 |
-
"<strong>Note:</strong> iPhone users can install this bookmarklet in their "
|
1643 |
-
"Safari to create Pretty Links with the following steps:"
|
1644 |
msgstr ""
|
1645 |
|
1646 |
-
#: app/views/
|
1647 |
-
msgid "
|
1648 |
msgstr ""
|
1649 |
|
1650 |
-
#: app/views/
|
1651 |
-
msgid "
|
1652 |
msgstr ""
|
1653 |
|
1654 |
-
#: app/views/
|
1655 |
-
msgid ""
|
1656 |
-
"Choose to share the page, then click on \"Bookmark\". We recommend saving it "
|
1657 |
-
"in your Favorites folder. Rename your bookmark to \"Get PrettyLink\" (or "
|
1658 |
-
"whatever you want) and then \"Save\""
|
1659 |
msgstr ""
|
1660 |
|
1661 |
-
#: app/views/
|
1662 |
-
msgid ""
|
1663 |
-
"Navigate through your Bookmarks until you find the new bookmark and click "
|
1664 |
-
"\"Edit\""
|
1665 |
msgstr ""
|
1666 |
|
1667 |
-
#: app/views/
|
1668 |
-
msgid "
|
1669 |
msgstr ""
|
1670 |
|
1671 |
-
#: app/views/
|
1672 |
-
msgid "
|
1673 |
msgstr ""
|
1674 |
|
1675 |
-
#: app/views/tools/
|
1676 |
-
msgid "
|
1677 |
msgstr ""
|
1678 |
|
1679 |
-
#: app/views/tools/
|
1680 |
-
msgid ""
|
1681 |
-
"Now when you find a page you want to save off as a Pretty Link, just click "
|
1682 |
-
"the \"Bookmarks\" icon at the bottom of the screen and select your \"Get "
|
1683 |
-
"PrettyLink\" bookmarklet."
|
1684 |
msgstr ""
|
1685 |
|
1686 |
-
#: app/views/tools/
|
1687 |
-
|
1688 |
-
|
1689 |
-
"
|
1690 |
-
"trimming."
|
1691 |
msgstr ""
|
1692 |
|
1693 |
-
#: app/views/tools/
|
1694 |
-
msgid ""
|
1695 |
-
"***WARNING*** If you click OK you will delete ALL of the Click data that is "
|
1696 |
-
"older than 30 days. Your data will be gone forever -- no way to retreive it. "
|
1697 |
-
"Do not click OK unless you are absolutely sure you want to delete this data "
|
1698 |
-
"because there is no going back!"
|
1699 |
msgstr ""
|
1700 |
|
1701 |
-
#: app/views/tools/
|
1702 |
-
msgid "
|
1703 |
msgstr ""
|
1704 |
|
1705 |
-
#: app/views/tools/
|
1706 |
-
|
|
|
1707 |
msgstr ""
|
1708 |
|
1709 |
-
#: app/views/tools/
|
1710 |
-
msgid ""
|
1711 |
-
"This will clear all clicks in your database that are older than 30 days."
|
1712 |
msgstr ""
|
1713 |
|
1714 |
-
#: app/views/tools/
|
1715 |
-
|
1716 |
-
|
1717 |
-
"older than 90 days. Your data will be gone forever -- no way to retreive it. "
|
1718 |
-
"Do not click OK unless you are absolutely sure you want to delete this data "
|
1719 |
-
"because there is no going back!"
|
1720 |
msgstr ""
|
1721 |
|
1722 |
-
#: app/views/tools/
|
1723 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
1724 |
msgstr ""
|
1725 |
|
1726 |
-
#: app/views/tools/
|
1727 |
-
msgid "
|
1728 |
msgstr ""
|
1729 |
|
1730 |
-
#: app/views/tools/
|
1731 |
-
|
1732 |
-
|
|
|
1733 |
msgstr ""
|
1734 |
|
1735 |
-
#: app/views/tools/
|
1736 |
-
|
1737 |
-
|
1738 |
-
|
1739 |
-
"click OK unless you are absolutely sure you want to delete all your data "
|
1740 |
-
"because there is no going back!"
|
1741 |
msgstr ""
|
1742 |
|
1743 |
-
#: app/views/tools/
|
1744 |
-
|
|
|
1745 |
msgstr ""
|
1746 |
|
1747 |
-
#: app/views/
|
1748 |
-
msgid "
|
1749 |
msgstr ""
|
1750 |
|
1751 |
-
#: app/views/
|
1752 |
-
|
1753 |
-
"
|
1754 |
-
"your database."
|
1755 |
msgstr ""
|
1756 |
|
1757 |
-
#: pro/app/
|
1758 |
-
msgid "
|
1759 |
msgstr ""
|
1760 |
|
1761 |
-
#: pro/app/
|
1762 |
-
msgid "
|
1763 |
msgstr ""
|
1764 |
|
1765 |
-
#: pro/app/
|
1766 |
-
|
|
|
1767 |
msgstr ""
|
1768 |
|
1769 |
-
#: pro/app/
|
1770 |
-
msgid "Pro
|
1771 |
msgstr ""
|
1772 |
|
1773 |
-
#: pro/app/
|
1774 |
-
msgid "
|
1775 |
msgstr ""
|
1776 |
|
1777 |
-
#: pro/app/
|
1778 |
-
|
1779 |
-
msgid "Keywords"
|
1780 |
msgstr ""
|
1781 |
|
1782 |
-
#: pro/app/
|
1783 |
-
msgid ""
|
1784 |
-
|
1785 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1786 |
msgstr ""
|
1787 |
|
1788 |
-
#: pro/app/controllers/PlpLinksController.php:
|
|
|
|
|
|
|
|
|
1789 |
msgid "Date must be valid and formatted YYYY-MM-DD."
|
1790 |
msgstr ""
|
1791 |
|
1792 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1793 |
msgid "Expire Clicks must be a number greater than zero."
|
1794 |
msgstr ""
|
1795 |
|
1796 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1797 |
msgid "Expired URL must be a valid URL."
|
1798 |
msgstr ""
|
1799 |
|
1800 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1801 |
msgid "Your URL Rotations must all be properly formatted URLs."
|
1802 |
msgstr ""
|
1803 |
|
1804 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1805 |
msgid "Your Link Rotation Weights must add up to 100%."
|
1806 |
msgstr ""
|
1807 |
|
1808 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1809 |
msgid "Your Geographic Redirect URLs must all be properly formatted."
|
1810 |
msgstr ""
|
1811 |
|
1812 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1813 |
msgid "Your Geographic Redirects URLs must not be empty."
|
1814 |
msgstr ""
|
1815 |
|
1816 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1817 |
msgid "Your Geographic Redirect Countries must not be empty."
|
1818 |
msgstr ""
|
1819 |
|
1820 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1821 |
msgid "Your Technology Redirect URLs must all be properly formatted."
|
1822 |
msgstr ""
|
1823 |
|
1824 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1825 |
msgid "Your Technology Redirects URLs must not be empty."
|
1826 |
msgstr ""
|
1827 |
|
1828 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1829 |
msgid "Your Time Period Redirect URLs must all be properly formatted."
|
1830 |
msgstr ""
|
1831 |
|
1832 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1833 |
msgid "Your Time Period Redirects URLs must not be empty."
|
1834 |
msgstr ""
|
1835 |
|
1836 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1837 |
msgid "Your Time Period Redirect start time must not be empty."
|
1838 |
msgstr ""
|
1839 |
|
1840 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1841 |
msgid "Your Time Period Redirect start time must be a properly formatted date."
|
1842 |
msgstr ""
|
1843 |
|
1844 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1845 |
msgid "Your Time Period Redirect end time must not be empty."
|
1846 |
msgstr ""
|
1847 |
|
1848 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1849 |
msgid "Your Time Period Redirect end time must be a properly formatted date."
|
1850 |
msgstr ""
|
1851 |
|
1852 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1853 |
msgid "Your Time Period Redirect start time must come before the end time."
|
1854 |
msgstr ""
|
1855 |
|
1856 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1857 |
msgid "Delay Redirect must be a number"
|
1858 |
msgstr ""
|
1859 |
|
|
|
1860 |
#: pro/app/controllers/PlpLinksController.php:668
|
1861 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1862 |
msgid "Cloak"
|
1863 |
msgstr ""
|
1864 |
|
1865 |
-
#: pro/app/controllers/PlpLinksController.php:
|
1866 |
msgid "View QR Code for this link: %s"
|
1867 |
msgstr ""
|
1868 |
|
1869 |
-
#: pro/app/controllers/PlpLinksController.php:
|
|
|
|
|
|
|
|
|
|
|
1870 |
msgid "Download QR Code for this link: %s"
|
1871 |
msgstr ""
|
1872 |
|
@@ -1883,8 +2044,7 @@ msgid "This link is set to expire after the date %s"
|
|
1883 |
msgstr ""
|
1884 |
|
1885 |
#: pro/app/controllers/PlpLinksController.php:829
|
1886 |
-
msgid ""
|
1887 |
-
"This link expired after %d clicks and will now cause a 404 error when visited"
|
1888 |
msgstr ""
|
1889 |
|
1890 |
#: pro/app/controllers/PlpLinksController.php:832
|
@@ -1908,48 +2068,62 @@ msgid "This link has additional Technology Dependent Conditional Target URLs"
|
|
1908 |
msgstr ""
|
1909 |
|
1910 |
#: pro/app/controllers/PlpLinksController.php:855
|
1911 |
-
msgid ""
|
1912 |
-
"A Time Period Redirect is currently active for this link. When visited it "
|
1913 |
-
"will currently redirect to %s rather than the Target URL unless the link is "
|
1914 |
-
"expired."
|
1915 |
msgstr ""
|
1916 |
|
1917 |
#: pro/app/controllers/PlpLinksController.php:859
|
1918 |
-
msgid ""
|
1919 |
-
"Time Period Redirects have been setup for this link but the current time is "
|
1920 |
-
"not within any of them currently."
|
1921 |
msgstr ""
|
1922 |
|
1923 |
-
#: pro/app/controllers/
|
1924 |
-
msgid "
|
1925 |
msgstr ""
|
1926 |
|
1927 |
-
#: pro/app/controllers/
|
1928 |
-
|
|
|
1929 |
msgstr ""
|
1930 |
|
1931 |
-
#: pro/app/controllers/
|
1932 |
-
|
1933 |
-
"
|
1934 |
-
"\"Use an alternate base url for your Pretty Links\""
|
1935 |
msgstr ""
|
1936 |
|
1937 |
-
#: pro/app/controllers/
|
1938 |
-
msgid ""
|
1939 |
-
"You need to enter a valid Public Link Display URL now that you have selected "
|
1940 |
-
"\"Use a custom public link display page\""
|
1941 |
msgstr ""
|
1942 |
|
1943 |
-
#: pro/app/controllers/
|
1944 |
-
msgid "
|
1945 |
msgstr ""
|
1946 |
|
1947 |
-
#: pro/app/controllers/
|
1948 |
-
msgid "
|
1949 |
msgstr ""
|
1950 |
|
1951 |
-
#: pro/app/controllers/
|
1952 |
-
msgid "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1953 |
msgstr ""
|
1954 |
|
1955 |
#: pro/app/controllers/PlpPrettyBarController.php:50
|
@@ -2001,2757 +2175,2976 @@ msgstr ""
|
|
2001 |
msgid "PrettyBar Link Character Limit must be a number"
|
2002 |
msgstr ""
|
2003 |
|
2004 |
-
#: pro/app/controllers/
|
2005 |
-
|
2006 |
-
msgid "Enter a URL:"
|
2007 |
msgstr ""
|
2008 |
|
2009 |
-
#: pro/app/controllers/
|
2010 |
-
|
2011 |
-
msgid "Shrink"
|
2012 |
msgstr ""
|
2013 |
|
2014 |
-
#: pro/app/controllers/
|
2015 |
-
|
|
|
|
|
|
|
2016 |
msgstr ""
|
2017 |
|
2018 |
-
#: pro/app/controllers/PlpReportsController.php:
|
2019 |
-
msgid "Pro Reports"
|
2020 |
msgstr ""
|
2021 |
|
2022 |
-
#: pro/app/controllers/PlpReportsController.php:
|
2023 |
msgid "Create a custom link report and analyze your data."
|
2024 |
msgstr ""
|
2025 |
|
2026 |
-
#: pro/app/controllers/PlpReportsController.php:
|
2027 |
-
msgid "View the Split Test Report for %s"
|
2028 |
-
msgstr ""
|
2029 |
-
|
2030 |
-
#: pro/app/controllers/PlpReportsController.php:86
|
2031 |
msgid "Your Pretty Link Report was Successfully Created"
|
2032 |
msgstr ""
|
2033 |
|
2034 |
-
#: pro/app/controllers/PlpReportsController.php:
|
2035 |
msgid "Your Pretty Link Report was Successfully Updated"
|
2036 |
msgstr ""
|
2037 |
|
2038 |
-
#: pro/app/controllers/PlpReportsController.php:
|
2039 |
msgid "Your Pretty Link Report was Successfully Deleted"
|
2040 |
msgstr ""
|
2041 |
|
2042 |
-
#: pro/app/
|
2043 |
-
msgid "
|
2044 |
msgstr ""
|
2045 |
|
2046 |
-
#: pro/app/
|
2047 |
-
msgid "
|
2048 |
msgstr ""
|
2049 |
|
2050 |
-
#: pro/app/
|
2051 |
-
|
|
|
2052 |
msgstr ""
|
2053 |
|
2054 |
-
#: pro/app/
|
2055 |
-
|
|
|
2056 |
msgstr ""
|
2057 |
|
2058 |
-
#: pro/app/
|
2059 |
-
|
2060 |
-
|
2061 |
-
#: pro/app/views/reports/split-test-report.php:29
|
2062 |
-
#: pro/app/views/reports/split-test-report.php:61
|
2063 |
-
msgid "Uniques"
|
2064 |
msgstr ""
|
2065 |
|
2066 |
-
#: pro/app/
|
2067 |
-
msgid "
|
2068 |
msgstr ""
|
2069 |
|
2070 |
-
#: pro/app/
|
2071 |
-
msgid "
|
2072 |
msgstr ""
|
2073 |
|
2074 |
-
#: pro/app/
|
2075 |
-
msgid "
|
2076 |
msgstr ""
|
2077 |
|
2078 |
-
#: pro/app/
|
2079 |
-
msgid "
|
2080 |
msgstr ""
|
2081 |
|
2082 |
-
#: pro/app/
|
2083 |
-
msgid ""
|
2084 |
-
"A Pretty Link hasn't been generated for this entry yet. Click \"Update Post"
|
2085 |
-
"\" to generate."
|
2086 |
msgstr ""
|
2087 |
|
2088 |
-
#: pro/app/
|
2089 |
-
msgid "
|
2090 |
msgstr ""
|
2091 |
|
2092 |
-
#: pro/app/
|
2093 |
-
msgid "
|
2094 |
msgstr ""
|
2095 |
|
2096 |
-
#: pro/app/
|
2097 |
-
msgid "
|
2098 |
msgstr ""
|
2099 |
|
2100 |
-
#: pro/app/
|
2101 |
-
msgid "
|
2102 |
msgstr ""
|
2103 |
|
2104 |
-
#: pro/app/
|
2105 |
-
msgid "
|
2106 |
msgstr ""
|
2107 |
|
2108 |
-
#: pro/app/
|
2109 |
-
|
|
|
2110 |
msgstr ""
|
2111 |
|
2112 |
-
#: pro/app/
|
2113 |
-
msgid "
|
2114 |
msgstr ""
|
2115 |
|
2116 |
-
#: pro/app/
|
2117 |
-
msgid "
|
2118 |
msgstr ""
|
2119 |
|
2120 |
-
#: pro/app/
|
2121 |
-
msgid "
|
2122 |
msgstr ""
|
2123 |
|
2124 |
-
#: pro/app/
|
2125 |
-
msgid "
|
2126 |
msgstr ""
|
2127 |
|
2128 |
-
#: pro/app/
|
2129 |
-
msgid "
|
2130 |
msgstr ""
|
2131 |
|
2132 |
-
#: pro/app/
|
2133 |
-
msgid "
|
2134 |
msgstr ""
|
2135 |
|
2136 |
-
#: pro/app/
|
2137 |
-
msgid "
|
2138 |
msgstr ""
|
2139 |
|
2140 |
-
#: pro/app/
|
2141 |
-
msgid "
|
2142 |
msgstr ""
|
2143 |
|
2144 |
-
#: pro/app/
|
2145 |
-
msgid "
|
2146 |
msgstr ""
|
2147 |
|
2148 |
-
#: pro/app/
|
2149 |
-
msgid "
|
2150 |
msgstr ""
|
2151 |
|
2152 |
-
#: pro/app/
|
2153 |
-
|
2154 |
-
#: pro/app/views/reports/custom-report.php:67
|
2155 |
-
#: pro/app/views/reports/split-test-report.php:31
|
2156 |
-
#: pro/app/views/reports/split-test-report.php:63
|
2157 |
-
msgid "Conversions"
|
2158 |
msgstr ""
|
2159 |
|
2160 |
-
#: pro/app/
|
2161 |
-
msgid "
|
2162 |
msgstr ""
|
2163 |
|
2164 |
-
#: pro/app/
|
2165 |
-
|
2166 |
-
msgid "Rotation"
|
2167 |
msgstr ""
|
2168 |
|
2169 |
-
#: pro/app/
|
2170 |
-
msgid "
|
2171 |
msgstr ""
|
2172 |
|
2173 |
-
#: pro/app/
|
2174 |
-
msgid "
|
2175 |
msgstr ""
|
2176 |
|
2177 |
-
#: pro/app/
|
2178 |
-
msgid "
|
2179 |
msgstr ""
|
2180 |
|
2181 |
-
#: pro/app/
|
2182 |
-
|
2183 |
-
msgid "Export Pretty Links"
|
2184 |
msgstr ""
|
2185 |
|
2186 |
-
#: pro/app/
|
2187 |
-
msgid "
|
2188 |
msgstr ""
|
2189 |
|
2190 |
-
#: pro/
|
2191 |
-
msgid "
|
2192 |
msgstr ""
|
2193 |
|
2194 |
-
#: pro/
|
2195 |
-
|
2196 |
-
msgid "Import Pretty Links"
|
2197 |
msgstr ""
|
2198 |
|
2199 |
-
#: pro/
|
2200 |
-
msgid ""
|
2201 |
-
"There are two ways to import a file.<br/><br/>1) Importing to update "
|
2202 |
-
"existing links and<br/><br/>2) Importing to generate new links. When "
|
2203 |
-
"Importing to generate new links, you must delete the \"id\" column from the "
|
2204 |
-
"CSV before importing. If the \"id\" column is present, Pretty Links Pro will "
|
2205 |
-
"attempt to update existing links."
|
2206 |
msgstr ""
|
2207 |
|
2208 |
-
#: pro/
|
2209 |
-
msgid "
|
2210 |
msgstr ""
|
2211 |
|
2212 |
-
#: pro/
|
2213 |
-
msgid "
|
2214 |
msgstr ""
|
2215 |
|
2216 |
-
#: pro/
|
2217 |
-
msgid ""
|
2218 |
-
"Select a file that has been formatted as a Pretty Link CSV import file and "
|
2219 |
-
"click \"Import\""
|
2220 |
msgstr ""
|
2221 |
|
2222 |
-
#: pro/
|
2223 |
-
msgid "
|
2224 |
msgstr ""
|
2225 |
|
2226 |
-
#: pro/
|
2227 |
-
msgid "
|
2228 |
msgstr ""
|
2229 |
|
2230 |
-
#: pro/
|
2231 |
-
msgid "
|
2232 |
msgstr ""
|
2233 |
|
2234 |
-
#: pro/
|
2235 |
-
msgid "
|
2236 |
msgstr ""
|
2237 |
|
2238 |
-
#: pro/
|
2239 |
-
msgid "
|
2240 |
msgstr ""
|
2241 |
|
2242 |
-
#: pro/
|
2243 |
-
msgid "
|
2244 |
msgstr ""
|
2245 |
|
2246 |
-
#: pro/
|
2247 |
-
msgid "
|
2248 |
msgstr ""
|
2249 |
|
2250 |
-
#: pro/
|
2251 |
-
msgid "
|
2252 |
msgstr ""
|
2253 |
|
2254 |
-
#: pro/
|
2255 |
-
msgid "
|
2256 |
msgstr ""
|
2257 |
|
2258 |
-
#: pro/
|
2259 |
-
msgid "
|
2260 |
msgstr ""
|
2261 |
|
2262 |
-
#: pro/
|
2263 |
-
msgid "
|
2264 |
msgstr ""
|
2265 |
|
2266 |
-
#: pro/
|
2267 |
-
msgid "
|
2268 |
msgstr ""
|
2269 |
|
2270 |
-
#: pro/
|
2271 |
-
msgid "
|
2272 |
msgstr ""
|
2273 |
|
2274 |
-
#: pro/
|
2275 |
-
msgid "
|
2276 |
msgstr ""
|
2277 |
|
2278 |
-
#: pro/
|
2279 |
-
msgid "
|
2280 |
msgstr ""
|
2281 |
|
2282 |
-
#: pro/
|
2283 |
-
msgid "
|
2284 |
msgstr ""
|
2285 |
|
2286 |
-
#: pro/
|
2287 |
-
msgid ""
|
2288 |
-
"Select the type of expiration you want for this link.<br/><br/><b>Date</b> "
|
2289 |
-
"Select this option if you'd like to expire your link after a certain date."
|
2290 |
-
"<br/><br/><b>Clicks</b>: Select this option to expire this link after it has "
|
2291 |
-
"been clicked a specific number of times."
|
2292 |
msgstr ""
|
2293 |
|
2294 |
-
#: pro/
|
2295 |
-
msgid "
|
2296 |
msgstr ""
|
2297 |
|
2298 |
-
#: pro/
|
2299 |
-
msgid ""
|
2300 |
-
"Enter the number of times this link can be clicked before it expires.<br/"
|
2301 |
-
"><br/><b>Note: Expirations based on clicks wouldn't work properly if you had "
|
2302 |
-
"tracking turned off for this link so as long as this is set to Clicks, "
|
2303 |
-
"Pretty Link will ensure tracking is turned on for this link as well.</b>"
|
2304 |
msgstr ""
|
2305 |
|
2306 |
-
#: pro/
|
2307 |
-
msgid "
|
2308 |
msgstr ""
|
2309 |
|
2310 |
-
#: pro/
|
2311 |
-
msgid ""
|
2312 |
-
"Enter a date here in the format YYYY-MM-DD to set when this link should "
|
2313 |
-
"expire."
|
2314 |
msgstr ""
|
2315 |
|
2316 |
-
#: pro/
|
2317 |
-
msgid "
|
2318 |
msgstr ""
|
2319 |
|
2320 |
-
#: pro/
|
2321 |
-
msgid "
|
2322 |
msgstr ""
|
2323 |
|
2324 |
-
#: pro/
|
2325 |
-
msgid ""
|
2326 |
-
"When this link expires, do you want to redirect to a specific URL. You can "
|
2327 |
-
"use this to redirect to a page you've setup to indicate that the link is "
|
2328 |
-
"expired.<br/><br/><b>Note: If this is not set the link will throw a 404 "
|
2329 |
-
"error when expired</b>."
|
2330 |
msgstr ""
|
2331 |
|
2332 |
-
#: pro/
|
2333 |
-
msgid "
|
2334 |
msgstr ""
|
2335 |
|
2336 |
-
#: pro/
|
2337 |
-
msgid "
|
2338 |
msgstr ""
|
2339 |
|
2340 |
-
#: pro/
|
2341 |
-
msgid ""
|
2342 |
-
"This is the URL that this link will redirect to after the expiration date "
|
2343 |
-
"above."
|
2344 |
msgstr ""
|
2345 |
|
2346 |
-
#: pro/
|
2347 |
-
msgid "
|
2348 |
msgstr ""
|
2349 |
|
2350 |
-
#: pro/
|
2351 |
-
msgid ""
|
2352 |
-
"Enter a comma separated list of keywords / keyword phrases that you'd like "
|
2353 |
-
"to replace with this link in your Posts & Pages."
|
2354 |
msgstr ""
|
2355 |
|
2356 |
-
#: pro/
|
2357 |
-
msgid "
|
2358 |
msgstr ""
|
2359 |
|
2360 |
-
#: pro/
|
2361 |
-
msgid "
|
2362 |
msgstr ""
|
2363 |
|
2364 |
-
#: pro/
|
2365 |
-
msgid ""
|
2366 |
-
"Enter a comma separated list of the URLs that you'd like to replace with "
|
2367 |
-
"this Pretty Link in your Posts & Pages. These must be formatted as URLs "
|
2368 |
-
"for example: <code>http://example.com</code> or <code>http://example.com?"
|
2369 |
-
"product_id=53</code>"
|
2370 |
msgstr ""
|
2371 |
|
2372 |
-
#: pro/
|
2373 |
-
msgid "
|
2374 |
msgstr ""
|
2375 |
|
2376 |
-
#: pro/
|
2377 |
-
msgid ""
|
2378 |
-
"Useful for adding Google Analytics tracking, Facebook retargeting pixels, or "
|
2379 |
-
"any other kind of tracking script to the HTML head for this pretty link.<br/"
|
2380 |
-
"><br/>These scripts will be in addition to any global one's you've defined "
|
2381 |
-
"in the options.<br/><br/><b>NOTE:</b> This does NOT work with 301, 302 and "
|
2382 |
-
"307 type redirects."
|
2383 |
msgstr ""
|
2384 |
|
2385 |
-
#: pro/
|
2386 |
-
msgid "
|
2387 |
msgstr ""
|
2388 |
|
2389 |
-
#: pro/
|
2390 |
-
msgid "
|
2391 |
msgstr ""
|
2392 |
|
2393 |
-
#: pro/
|
2394 |
-
msgid ""
|
2395 |
-
"These powerful options are available to give you dynamic control over "
|
2396 |
-
"redirection for this pretty link."
|
2397 |
msgstr ""
|
2398 |
|
2399 |
-
#: pro/
|
2400 |
-
msgid "
|
2401 |
msgstr ""
|
2402 |
|
2403 |
-
#: pro/
|
2404 |
-
msgid "
|
2405 |
msgstr ""
|
2406 |
|
2407 |
-
#: pro/
|
2408 |
-
msgid "
|
2409 |
msgstr ""
|
2410 |
|
2411 |
-
#: pro/
|
2412 |
-
msgid "
|
2413 |
msgstr ""
|
2414 |
|
2415 |
-
#: pro/
|
2416 |
-
msgid ""
|
2417 |
-
"Enter the Target URLs that you'd like to rotate through when this Pretty "
|
2418 |
-
"Link is Clicked. These must be formatted as URLs example: <code>http://"
|
2419 |
-
"example.com</code> or <code>http://example.com?product_id=53</code>"
|
2420 |
msgstr ""
|
2421 |
|
2422 |
-
#: pro/
|
2423 |
-
msgid "
|
2424 |
msgstr ""
|
2425 |
|
2426 |
-
#: pro/
|
2427 |
-
msgid "
|
2428 |
msgstr ""
|
2429 |
|
2430 |
-
#: pro/
|
2431 |
-
msgid "
|
2432 |
msgstr ""
|
2433 |
|
2434 |
-
#: pro/
|
2435 |
-
msgid "
|
2436 |
msgstr ""
|
2437 |
|
2438 |
-
#: pro/
|
2439 |
-
msgid ""
|
2440 |
-
"Split testing will enable you to track the effectiveness of several links "
|
2441 |
-
"against each other. This works best when you have multiple link rotation "
|
2442 |
-
"URLs entered."
|
2443 |
msgstr ""
|
2444 |
|
2445 |
-
#: pro/
|
2446 |
-
|
2447 |
-
msgid "Goal Link"
|
2448 |
msgstr ""
|
2449 |
|
2450 |
-
#: pro/
|
2451 |
-
msgid "
|
2452 |
msgstr ""
|
2453 |
|
2454 |
-
#: pro/
|
2455 |
-
msgid "
|
2456 |
-
msgstr ""
|
2457 |
|
2458 |
-
#: pro/
|
2459 |
-
msgid "
|
2460 |
msgstr ""
|
2461 |
|
2462 |
-
#: pro/
|
2463 |
-
msgid "
|
2464 |
msgstr ""
|
2465 |
|
2466 |
-
#: pro/
|
2467 |
-
msgid ""
|
2468 |
-
"This will enable you to setup specific target urls that this pretty link "
|
2469 |
-
"will redirect to based on the country of the person visiting the url."
|
2470 |
msgstr ""
|
2471 |
|
2472 |
-
#: pro/
|
2473 |
-
|
2474 |
-
msgid "Add"
|
2475 |
msgstr ""
|
2476 |
|
2477 |
-
#: pro/
|
2478 |
-
msgid "
|
2479 |
msgstr ""
|
2480 |
|
2481 |
-
#: pro/
|
2482 |
-
msgid ""
|
2483 |
-
"This will allow you to redirect based on your visitor's device, operating "
|
2484 |
-
"system and/or browser"
|
2485 |
msgstr ""
|
2486 |
|
2487 |
-
#: pro/
|
2488 |
-
msgid "
|
2489 |
msgstr ""
|
2490 |
|
2491 |
-
#: pro/
|
2492 |
-
msgid ""
|
2493 |
-
"This will allow you to redirect based on the time period in which your "
|
2494 |
-
"visitor visits this link.<br/><br/><b>Note: If your visitor doesn't visit "
|
2495 |
-
"the link during any of the specified time periods set here, they'll simply "
|
2496 |
-
"be redirected to the main target url.</b>"
|
2497 |
msgstr ""
|
2498 |
|
2499 |
-
#: pro/
|
2500 |
-
msgid "
|
2501 |
msgstr ""
|
2502 |
|
2503 |
-
#: pro/
|
2504 |
-
msgid "
|
2505 |
msgstr ""
|
2506 |
|
2507 |
-
#: pro/
|
2508 |
-
msgid ""
|
2509 |
-
"This is a comma-separated list of countries that this redirect will match "
|
2510 |
-
"on. Just start typing a country's name and an autocomplete dropdown will "
|
2511 |
-
"appear to select from. Once a country is selected, feel free to start typing "
|
2512 |
-
"the name of another country. You can add as many as you'd like this redirect "
|
2513 |
-
"to match on"
|
2514 |
msgstr ""
|
2515 |
|
2516 |
-
#: pro/
|
2517 |
-
|
2518 |
-
msgid "URL:"
|
2519 |
msgstr ""
|
2520 |
|
2521 |
-
#: pro/
|
2522 |
-
msgid "
|
2523 |
msgstr ""
|
2524 |
|
2525 |
-
#: pro/
|
2526 |
-
msgid ""
|
2527 |
-
"This is the URL that this Pretty Link will redirect to if the visitor's "
|
2528 |
-
"country match the settings here."
|
2529 |
msgstr ""
|
2530 |
|
2531 |
-
#: pro/
|
2532 |
-
|
2533 |
-
msgid "Remove"
|
2534 |
msgstr ""
|
2535 |
|
2536 |
-
#: pro/
|
2537 |
-
msgid "
|
2538 |
msgstr ""
|
2539 |
|
2540 |
-
#: pro/
|
2541 |
-
msgid "
|
2542 |
msgstr ""
|
2543 |
|
2544 |
-
#: pro/
|
2545 |
-
|
2546 |
-
msgid "Base Slug Prefix"
|
2547 |
msgstr ""
|
2548 |
|
2549 |
-
#: pro/
|
2550 |
-
msgid ""
|
2551 |
-
"Use this to prefix all newly generated pretty links with a directory of your "
|
2552 |
-
"choice. For example set to <b>out</b> to make your pretty links look like "
|
2553 |
-
"http://site.com/<b>out</b>/xyz. Changing this option will NOT affect "
|
2554 |
-
"existing pretty links. If you do not wish to use a directory prefix, leave "
|
2555 |
-
"this text field blank. Whatever you type here will be sanitized and modified "
|
2556 |
-
"to ensure it is URL-safe. So <b>Hello World</b> might get changed to "
|
2557 |
-
"something like <b>hello-world</b> instead. Lowercase letters, numbers, "
|
2558 |
-
"dashes, and underscores are allowed."
|
2559 |
-
msgstr ""
|
2560 |
-
|
2561 |
-
#: pro/app/views/links/link-options.php:16
|
2562 |
-
#: pro/app/views/links/link-options.php:18
|
2563 |
-
msgid "Slug Character Count"
|
2564 |
msgstr ""
|
2565 |
|
2566 |
-
#: pro/
|
2567 |
-
msgid ""
|
2568 |
-
"The number of characters to use when auto-generating a random slug for "
|
2569 |
-
"pretty links. The default is 4. You cannot use less than 2."
|
2570 |
msgstr ""
|
2571 |
|
2572 |
-
#: pro/
|
2573 |
-
|
2574 |
-
msgid "Enable Google Analytics"
|
2575 |
msgstr ""
|
2576 |
|
2577 |
-
#: pro/
|
2578 |
-
msgid ""
|
2579 |
-
"Requires Google Analyticator, Google Analytics by MonsterInsights (formerly "
|
2580 |
-
"Yoast), or the Google Analytics Plugin to be installed and configured on "
|
2581 |
-
"your site."
|
2582 |
msgstr ""
|
2583 |
|
2584 |
-
#: pro/
|
2585 |
-
msgid "
|
2586 |
msgstr ""
|
2587 |
|
2588 |
-
#: pro/
|
2589 |
-
msgid "
|
2590 |
msgstr ""
|
2591 |
|
2592 |
-
#: pro/
|
2593 |
-
msgid ""
|
2594 |
-
"This will enable a link in your pretty link admin that will allow you to "
|
2595 |
-
"automatically download a QR Code for each individual Pretty Link."
|
2596 |
msgstr ""
|
2597 |
|
2598 |
-
#: pro/
|
2599 |
-
|
2600 |
-
msgid "Global Head Scripts"
|
2601 |
msgstr ""
|
2602 |
|
2603 |
-
#: pro/
|
2604 |
-
msgid ""
|
2605 |
-
"Useful for adding Google Analytics tracking, Facebook retargeting pixels, or "
|
2606 |
-
"any other kind of tracking script to the HTML head.<br/><br/>What you enter "
|
2607 |
-
"in this box will be applied to all supported pretty links.<br/><br/><b>NOTE:"
|
2608 |
-
"</b> This does NOT work with 301, 302 and 307 type redirects."
|
2609 |
msgstr ""
|
2610 |
|
2611 |
-
#: pro/
|
2612 |
-
msgid "
|
2613 |
msgstr ""
|
2614 |
|
2615 |
-
#: pro/
|
2616 |
-
msgid "
|
2617 |
msgstr ""
|
2618 |
|
2619 |
-
#: pro/
|
2620 |
-
msgid "
|
2621 |
msgstr ""
|
2622 |
|
2623 |
-
#: pro/
|
2624 |
-
msgid "
|
2625 |
msgstr ""
|
2626 |
|
2627 |
-
#: pro/
|
2628 |
-
msgid ""
|
2629 |
-
"<b>Desktop</b> will match on any conventional laptop or desktop computer.<br/"
|
2630 |
-
"><br/><b>Mobile</b> will match on any phone, tablet or other portable device."
|
2631 |
-
"<br/><br/><b>Phone</b> will match on any phone or similarly small device.<br/"
|
2632 |
-
"><br/><b>Tablet</b> will match on any tablet sized device."
|
2633 |
msgstr ""
|
2634 |
|
2635 |
-
#: pro/
|
2636 |
-
|
2637 |
-
msgid "Any"
|
2638 |
msgstr ""
|
2639 |
|
2640 |
-
#: pro/
|
2641 |
-
msgid "
|
2642 |
msgstr ""
|
2643 |
|
2644 |
-
#: pro/
|
2645 |
-
msgid "
|
2646 |
msgstr ""
|
2647 |
|
2648 |
-
#: pro/
|
2649 |
-
msgid "
|
2650 |
msgstr ""
|
2651 |
|
2652 |
-
#: pro/
|
2653 |
-
msgid "
|
2654 |
msgstr ""
|
2655 |
|
2656 |
-
#: pro/
|
2657 |
-
msgid "
|
2658 |
msgstr ""
|
2659 |
|
2660 |
-
#: pro/
|
2661 |
-
msgid "
|
2662 |
msgstr ""
|
2663 |
|
2664 |
-
#: pro/
|
2665 |
-
msgid ""
|
2666 |
-
"Use this dropdown to select which Operating System this redirect will match "
|
2667 |
-
"on."
|
2668 |
msgstr ""
|
2669 |
|
2670 |
-
#: pro/
|
2671 |
-
msgid "
|
2672 |
msgstr ""
|
2673 |
|
2674 |
-
#: pro/
|
2675 |
-
msgid "
|
2676 |
msgstr ""
|
2677 |
|
2678 |
-
#: pro/
|
2679 |
-
msgid "
|
2680 |
msgstr ""
|
2681 |
|
2682 |
-
#: pro/
|
2683 |
-
msgid "
|
2684 |
msgstr ""
|
2685 |
|
2686 |
-
#: pro/
|
2687 |
-
msgid "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2688 |
msgstr ""
|
2689 |
|
2690 |
-
#: pro/
|
2691 |
-
msgid "
|
2692 |
msgstr ""
|
2693 |
|
2694 |
-
#: pro/
|
2695 |
-
msgid "
|
2696 |
msgstr ""
|
2697 |
|
2698 |
-
#: pro/
|
2699 |
-
msgid "
|
2700 |
msgstr ""
|
2701 |
|
2702 |
-
#: pro/
|
2703 |
-
msgid "
|
2704 |
msgstr ""
|
2705 |
|
2706 |
-
#: pro/
|
2707 |
-
msgid "
|
2708 |
msgstr ""
|
2709 |
|
2710 |
-
#: pro/
|
2711 |
-
msgid "
|
2712 |
msgstr ""
|
2713 |
|
2714 |
-
#: pro/
|
2715 |
-
msgid "
|
2716 |
msgstr ""
|
2717 |
|
2718 |
-
#: pro/
|
2719 |
-
msgid "
|
2720 |
msgstr ""
|
2721 |
|
2722 |
-
#: pro/
|
2723 |
-
msgid "
|
2724 |
msgstr ""
|
2725 |
|
2726 |
-
#: pro/
|
2727 |
-
msgid "
|
2728 |
msgstr ""
|
2729 |
|
2730 |
-
#: pro/
|
2731 |
-
msgid "
|
2732 |
msgstr ""
|
2733 |
|
2734 |
-
#: pro/
|
2735 |
-
msgid "
|
2736 |
msgstr ""
|
2737 |
|
2738 |
-
#: pro/
|
2739 |
-
msgid "
|
2740 |
msgstr ""
|
2741 |
|
2742 |
-
#: pro/
|
2743 |
-
msgid "
|
2744 |
msgstr ""
|
2745 |
|
2746 |
-
#: pro/
|
2747 |
-
msgid ""
|
2748 |
-
"This is the URL that this Pretty Link will redirect to if the visitor's "
|
2749 |
-
"device, os and browser match the settings here."
|
2750 |
msgstr ""
|
2751 |
|
2752 |
-
#: pro/
|
2753 |
-
msgid "
|
2754 |
msgstr ""
|
2755 |
|
2756 |
-
#: pro/
|
2757 |
-
msgid "
|
2758 |
msgstr ""
|
2759 |
|
2760 |
-
#: pro/
|
2761 |
-
msgid ""
|
2762 |
-
"This is where you'll enter the beginning of the time period for this redirect"
|
2763 |
msgstr ""
|
2764 |
|
2765 |
-
#: pro/
|
2766 |
-
msgid "
|
2767 |
msgstr ""
|
2768 |
|
2769 |
-
#: pro/
|
2770 |
-
msgid "
|
2771 |
msgstr ""
|
2772 |
|
2773 |
-
#: pro/
|
2774 |
-
msgid "
|
2775 |
msgstr ""
|
2776 |
|
2777 |
-
#: pro/
|
2778 |
-
msgid "
|
2779 |
msgstr ""
|
2780 |
|
2781 |
-
#: pro/
|
2782 |
-
msgid ""
|
2783 |
-
"This is the URL that this Pretty Link will redirect to when the visitor "
|
2784 |
-
"visits the link in the associated time period."
|
2785 |
msgstr ""
|
2786 |
|
2787 |
-
#: pro/
|
2788 |
-
msgid "
|
2789 |
msgstr ""
|
2790 |
|
2791 |
-
#: pro/
|
2792 |
-
msgid "
|
2793 |
msgstr ""
|
2794 |
|
2795 |
-
#: pro/
|
2796 |
-
msgid "
|
2797 |
msgstr ""
|
2798 |
|
2799 |
-
#: pro/
|
2800 |
-
msgid "
|
2801 |
msgstr ""
|
2802 |
|
2803 |
-
#: pro/
|
2804 |
-
msgid "
|
2805 |
msgstr ""
|
2806 |
|
2807 |
-
#: pro/
|
2808 |
-
msgid "
|
2809 |
msgstr ""
|
2810 |
|
2811 |
-
#: pro/
|
2812 |
-
msgid "
|
2813 |
msgstr ""
|
2814 |
|
2815 |
-
#: pro/
|
2816 |
-
msgid ""
|
2817 |
-
"If this button is checked then you'll have the ability to include a social "
|
2818 |
-
"buttons bar on your %s."
|
2819 |
msgstr ""
|
2820 |
|
2821 |
-
#: pro/
|
2822 |
-
msgid "
|
2823 |
msgstr ""
|
2824 |
|
2825 |
-
#: pro/
|
2826 |
-
msgid "
|
2827 |
msgstr ""
|
2828 |
|
2829 |
-
#: pro/
|
2830 |
-
msgid "
|
2831 |
msgstr ""
|
2832 |
|
2833 |
-
#: pro/
|
2834 |
-
msgid ""
|
2835 |
-
"If checked, this will enable you to automatically replace keywords and/or "
|
2836 |
-
"URLs on your blog with pretty links. You will specify the specific keywords "
|
2837 |
-
"and urls from your Pretty Link edit page."
|
2838 |
msgstr ""
|
2839 |
|
2840 |
-
#: pro/
|
2841 |
-
msgid "
|
2842 |
msgstr ""
|
2843 |
|
2844 |
-
#: pro/
|
2845 |
-
msgid "
|
2846 |
msgstr ""
|
2847 |
|
2848 |
-
#: pro/
|
2849 |
-
msgid ""
|
2850 |
-
"Don't want to have too many keyword replacements per page? Select to set "
|
2851 |
-
"some reasonable keyword replacement thresholds."
|
2852 |
msgstr ""
|
2853 |
|
2854 |
-
#: pro/
|
2855 |
-
msgid "
|
2856 |
msgstr ""
|
2857 |
|
2858 |
-
#: pro/
|
2859 |
-
msgid "
|
2860 |
msgstr ""
|
2861 |
|
2862 |
-
#: pro/
|
2863 |
-
msgid ""
|
2864 |
-
"Maximum number of unique keyword / keyphrases you can replace with Pretty "
|
2865 |
-
"Links per page."
|
2866 |
msgstr ""
|
2867 |
|
2868 |
-
#: pro/
|
2869 |
-
msgid "
|
2870 |
msgstr ""
|
2871 |
|
2872 |
-
#: pro/
|
2873 |
-
msgid "
|
2874 |
msgstr ""
|
2875 |
|
2876 |
-
#: pro/
|
2877 |
-
msgid "
|
2878 |
msgstr ""
|
2879 |
|
2880 |
-
#: pro/
|
2881 |
-
msgid "
|
2882 |
msgstr ""
|
2883 |
|
2884 |
-
#: pro/
|
2885 |
-
msgid "
|
2886 |
msgstr ""
|
2887 |
|
2888 |
-
#: pro/
|
2889 |
-
msgid ""
|
2890 |
-
"Ensure that these keyword replacement links are opened in a separate window. "
|
2891 |
-
"<strong>Note:</strong> This does not apply to url replacements--only keyword "
|
2892 |
-
"replacements."
|
2893 |
msgstr ""
|
2894 |
|
2895 |
-
#: pro/
|
2896 |
-
msgid "
|
2897 |
msgstr ""
|
2898 |
|
2899 |
-
#: pro/
|
2900 |
-
msgid "
|
2901 |
msgstr ""
|
2902 |
|
2903 |
-
#: pro/
|
2904 |
-
msgid ""
|
2905 |
-
"This adds the html <code>NOFOLLOW</code> attribute to all keyword "
|
2906 |
-
"replacement links. <strong>Note:</strong> This does not apply to url "
|
2907 |
-
"replacements--only keyword replacements."
|
2908 |
msgstr ""
|
2909 |
|
2910 |
-
#: pro/
|
2911 |
-
msgid "
|
2912 |
msgstr ""
|
2913 |
|
2914 |
-
#: pro/
|
2915 |
-
msgid "
|
2916 |
msgstr ""
|
2917 |
|
2918 |
-
#: pro/
|
2919 |
-
msgid ""
|
2920 |
-
"Add some custom formatting to your keyword pretty link replacements. "
|
2921 |
-
"<strong>Note:</strong> This does not apply to url replacements--only keyword "
|
2922 |
-
"replacements."
|
2923 |
msgstr ""
|
2924 |
|
2925 |
-
#: pro/
|
2926 |
-
msgid "
|
2927 |
msgstr ""
|
2928 |
|
2929 |
-
#: pro/
|
2930 |
-
msgid "
|
2931 |
msgstr ""
|
2932 |
|
2933 |
-
#: pro/
|
2934 |
-
msgid ""
|
2935 |
-
"Add some custom formatting to the hover attribute of your keyword pretty "
|
2936 |
-
"links. <strong>Note:</strong> This does not apply to url replacements--only "
|
2937 |
-
"keyword replacements."
|
2938 |
msgstr ""
|
2939 |
|
2940 |
-
#: pro/
|
2941 |
-
msgid "
|
2942 |
msgstr ""
|
2943 |
|
2944 |
-
#: pro/
|
2945 |
-
msgid "
|
2946 |
msgstr ""
|
2947 |
|
2948 |
-
#:
|
2949 |
-
|
2950 |
-
|
2951 |
-
|
2952 |
-
|
2953 |
-
|
2954 |
msgstr ""
|
2955 |
|
2956 |
-
#:
|
2957 |
-
msgid "
|
2958 |
msgstr ""
|
2959 |
|
2960 |
-
#:
|
2961 |
-
|
2962 |
-
|
2963 |
-
"
|
2964 |
msgstr ""
|
2965 |
|
2966 |
-
#:
|
2967 |
-
|
|
|
|
|
2968 |
msgstr ""
|
2969 |
|
2970 |
-
#:
|
2971 |
-
|
|
|
|
|
2972 |
msgstr ""
|
2973 |
|
2974 |
-
#:
|
2975 |
-
msgid ""
|
2976 |
-
"This is the text of the link to your disclosures. This text will be visible "
|
2977 |
-
"to your visitors when the link is displayed."
|
2978 |
msgstr ""
|
2979 |
|
2980 |
-
#:
|
2981 |
-
msgid "
|
2982 |
msgstr ""
|
2983 |
|
2984 |
-
#:
|
2985 |
-
msgid "
|
2986 |
msgstr ""
|
2987 |
|
2988 |
-
#:
|
2989 |
-
msgid ""
|
2990 |
-
"This is the position of the link to your disclosures in relation to your "
|
2991 |
-
"post content."
|
2992 |
msgstr ""
|
2993 |
|
2994 |
-
#:
|
2995 |
-
msgid "
|
2996 |
msgstr ""
|
2997 |
|
2998 |
-
#:
|
2999 |
-
msgid "
|
3000 |
msgstr ""
|
3001 |
|
3002 |
-
#:
|
3003 |
-
msgid "
|
3004 |
msgstr ""
|
3005 |
|
3006 |
-
#:
|
3007 |
-
msgid "
|
3008 |
msgstr ""
|
3009 |
|
3010 |
-
#:
|
3011 |
-
msgid "
|
3012 |
msgstr ""
|
3013 |
|
3014 |
-
#:
|
3015 |
-
msgid ""
|
3016 |
-
"When enabled, this will add an affiliate link disclosure next to each one of "
|
3017 |
-
"your keyword replacements. <b>Note:</b> This does not apply to url "
|
3018 |
-
"replacements--only keyword replacements."
|
3019 |
msgstr ""
|
3020 |
|
3021 |
-
#:
|
3022 |
-
msgid "
|
3023 |
msgstr ""
|
3024 |
|
3025 |
-
#:
|
3026 |
-
msgid "
|
3027 |
msgstr ""
|
3028 |
|
3029 |
-
#:
|
3030 |
-
|
3031 |
-
"
|
3032 |
-
"indicate that the link is an affiliate link."
|
3033 |
msgstr ""
|
3034 |
|
3035 |
-
#:
|
3036 |
-
|
|
|
3037 |
msgstr ""
|
3038 |
|
3039 |
-
#:
|
3040 |
-
|
|
|
3041 |
msgstr ""
|
3042 |
|
3043 |
-
#:
|
3044 |
-
|
3045 |
-
"
|
3046 |
-
"pretty link pointing to the url and replace it with the pretty link."
|
3047 |
msgstr ""
|
3048 |
|
3049 |
-
#:
|
3050 |
-
|
|
|
3051 |
msgstr ""
|
3052 |
|
3053 |
-
#:
|
3054 |
-
|
|
|
3055 |
msgstr ""
|
3056 |
|
3057 |
-
#:
|
3058 |
-
msgid ""
|
3059 |
-
"Any links on your site which point to domains you define here will not be "
|
3060 |
-
"replaced automatically with Pretty Links. Place one domain per line.<br/><br/"
|
3061 |
-
">You MUST enter http:// or https:// in front of the domain names and do NOT "
|
3062 |
-
"include any /'s or other text after the domain name.<br/><br/>Proper entry "
|
3063 |
-
"example:<br/><b>https://www.google.com</b><br/><b>http://mysite.org</b><br/"
|
3064 |
-
"><br/>Improperly entered domains will be removed upon saving the Options."
|
3065 |
msgstr ""
|
3066 |
|
3067 |
-
#:
|
3068 |
-
msgid "
|
3069 |
msgstr ""
|
3070 |
|
3071 |
-
#:
|
3072 |
-
msgid "
|
3073 |
msgstr ""
|
3074 |
|
3075 |
-
#:
|
3076 |
-
|
3077 |
-
|
3078 |
-
|
|
|
|
|
3079 |
msgstr ""
|
3080 |
|
3081 |
-
#:
|
3082 |
-
msgid "
|
3083 |
msgstr ""
|
3084 |
|
3085 |
-
#:
|
3086 |
-
msgid "
|
3087 |
msgstr ""
|
3088 |
|
3089 |
-
#:
|
3090 |
-
msgid ""
|
3091 |
-
"This option will enable the keyword / URL replacement routine to run in RSS "
|
3092 |
-
"Feeds.<br/><strong>Note:</strong> This option can slow the load speed of "
|
3093 |
-
"your RSS feed -- unless used in conjunction with a caching plugin like W3 "
|
3094 |
-
"Total Cache or WP Super Cache.<br/><strong>Note #2</strong> This option will "
|
3095 |
-
"only work if you have \"Full Text\" selected in your General WordPress "
|
3096 |
-
"Reading settings.<br/><strong>Note #3:</strong> If this option is used along "
|
3097 |
-
"with \"Replace Keywords and URLs in Comments\" then your post comment feeds "
|
3098 |
-
"will have keywords replaced in them as well."
|
3099 |
msgstr ""
|
3100 |
|
3101 |
-
#:
|
3102 |
-
msgid "
|
3103 |
msgstr ""
|
3104 |
|
3105 |
-
#:
|
3106 |
-
msgid ""
|
3107 |
-
"This feature will index all of your keyword & URL replacements to "
|
3108 |
-
"dramatically improve performance.<br/><br/>If your site has a large number "
|
3109 |
-
"of replacements and/or posts then this feature may increase the load on your "
|
3110 |
-
"server temporarily and your replacements may not show up on your posts for a "
|
3111 |
-
"day or two initially (until all posts are indexed).<br/><br/><strong>Note:</"
|
3112 |
-
"strong> this feature requires the use of wp-cron."
|
3113 |
msgstr ""
|
3114 |
|
3115 |
-
#:
|
3116 |
-
msgid "
|
3117 |
msgstr ""
|
3118 |
|
3119 |
-
|
3120 |
-
|
3121 |
-
"
|
3122 |
-
"replacement."
|
3123 |
msgstr ""
|
3124 |
|
3125 |
-
#:
|
3126 |
-
msgid "
|
3127 |
msgstr ""
|
3128 |
|
3129 |
-
#:
|
3130 |
-
msgid "
|
3131 |
msgstr ""
|
3132 |
|
3133 |
-
#:
|
3134 |
-
msgid "URL
|
3135 |
msgstr ""
|
3136 |
|
3137 |
-
#:
|
3138 |
-
msgid "
|
3139 |
msgstr ""
|
3140 |
|
3141 |
-
#:
|
3142 |
-
msgid ""
|
3143 |
-
"This shows how many posts have url replacements indexed for and are ready "
|
3144 |
-
"for replacement."
|
3145 |
msgstr ""
|
3146 |
|
3147 |
-
#:
|
3148 |
-
msgid "
|
3149 |
msgstr ""
|
3150 |
|
3151 |
-
#:
|
3152 |
-
msgid "
|
3153 |
msgstr ""
|
3154 |
|
3155 |
-
#:
|
3156 |
-
msgid "
|
3157 |
msgstr ""
|
3158 |
|
3159 |
-
#:
|
3160 |
-
msgid "
|
3161 |
msgstr ""
|
3162 |
|
3163 |
-
#:
|
3164 |
-
msgid ""
|
3165 |
-
"If set, this will replace the logo image on the Pretty Bar. The image that "
|
3166 |
-
"this URL references should be 48x48 Pixels to fit."
|
3167 |
msgstr ""
|
3168 |
|
3169 |
-
#:
|
3170 |
-
msgid "
|
3171 |
msgstr ""
|
3172 |
|
3173 |
-
#:
|
3174 |
-
msgid "
|
3175 |
msgstr ""
|
3176 |
|
3177 |
-
#:
|
3178 |
-
msgid ""
|
3179 |
-
"If set, this will replace the background image on Pretty Bar. The image that "
|
3180 |
-
"this URL references should be 65px tall - this image will be repeated "
|
3181 |
-
"horizontally across the bar."
|
3182 |
msgstr ""
|
3183 |
|
3184 |
-
#:
|
3185 |
-
|
|
|
3186 |
msgstr ""
|
3187 |
|
3188 |
-
#:
|
3189 |
-
msgid "
|
3190 |
msgstr ""
|
3191 |
|
3192 |
-
#:
|
3193 |
-
|
3194 |
-
"
|
3195 |
-
"specified a Pretty Bar background image."
|
3196 |
msgstr ""
|
3197 |
|
3198 |
-
#:
|
3199 |
-
msgid "
|
3200 |
msgstr ""
|
3201 |
|
3202 |
-
#:
|
3203 |
-
|
|
|
|
|
3204 |
msgstr ""
|
3205 |
|
3206 |
-
#:
|
3207 |
-
msgid ""
|
3208 |
-
"If not set, this defaults to black (RGB value <code>#000000</code>) but you "
|
3209 |
-
"can change it to whatever color you like."
|
3210 |
msgstr ""
|
3211 |
|
3212 |
-
#:
|
3213 |
-
msgid "
|
3214 |
msgstr ""
|
3215 |
|
3216 |
-
#:
|
3217 |
-
msgid "
|
3218 |
msgstr ""
|
3219 |
|
3220 |
-
#:
|
3221 |
-
msgid ""
|
3222 |
-
"If not set, this defaults to blue (RGB value <code>#0000ee</code>) but you "
|
3223 |
-
"can change it to whatever color you like."
|
3224 |
msgstr ""
|
3225 |
|
3226 |
-
#:
|
3227 |
-
msgid "Link
|
3228 |
msgstr ""
|
3229 |
|
3230 |
-
#:
|
3231 |
-
msgid "
|
3232 |
msgstr ""
|
3233 |
|
3234 |
-
#:
|
3235 |
-
msgid ""
|
3236 |
-
"If not set, this defaults to RGB value <code>#ababab</code> but you can "
|
3237 |
-
"change it to whatever color you like."
|
3238 |
msgstr ""
|
3239 |
|
3240 |
-
#:
|
3241 |
-
msgid "
|
3242 |
msgstr ""
|
3243 |
|
3244 |
-
#:
|
3245 |
-
|
|
|
3246 |
msgstr ""
|
3247 |
|
3248 |
-
#:
|
3249 |
-
msgid ""
|
3250 |
-
"If not set, this defaults to RGB value <code>#551a8b</code> but you can "
|
3251 |
-
"change it to whatever color you like."
|
3252 |
msgstr ""
|
3253 |
|
3254 |
-
#:
|
3255 |
-
|
|
|
3256 |
msgstr ""
|
3257 |
|
3258 |
-
#:
|
3259 |
-
msgid "
|
3260 |
msgstr ""
|
3261 |
|
3262 |
-
#:
|
3263 |
-
|
3264 |
-
|
3265 |
-
|
3266 |
-
"
|
3267 |
-
"good across different browsers and screen resolutions."
|
3268 |
msgstr ""
|
3269 |
|
3270 |
-
#:
|
3271 |
-
msgid "
|
3272 |
msgstr ""
|
3273 |
|
3274 |
-
#:
|
3275 |
-
msgid "Pretty
|
3276 |
msgstr ""
|
3277 |
|
3278 |
-
#:
|
3279 |
-
msgid ""
|
3280 |
-
"If your Website has a long Description (tagline) then you may need to adjust "
|
3281 |
-
"this value so that it will all fit on the Pretty Bar. It is recommended that "
|
3282 |
-
"you keep this value to <code>40</code> characters or less so the Pretty "
|
3283 |
-
"Bar's format looks good across different browsers and screen resolutions."
|
3284 |
msgstr ""
|
3285 |
|
3286 |
-
#:
|
3287 |
-
|
|
|
3288 |
msgstr ""
|
3289 |
|
3290 |
-
#:
|
3291 |
-
msgid "
|
3292 |
msgstr ""
|
3293 |
|
3294 |
-
#:
|
3295 |
-
msgid ""
|
3296 |
-
"If you link to a lot of large Target URLs you may want to adjust this value. "
|
3297 |
-
"It is recommended that you keep this value to <code>40</code> or below so "
|
3298 |
-
"the Pretty Bar's format looks good across different browsers and URL sizes"
|
3299 |
msgstr ""
|
3300 |
|
3301 |
-
|
3302 |
-
|
|
|
3303 |
msgstr ""
|
3304 |
|
3305 |
-
#:
|
3306 |
-
msgid "
|
3307 |
msgstr ""
|
3308 |
|
3309 |
-
#:
|
3310 |
-
|
3311 |
-
|
3312 |
-
|
|
|
3313 |
msgstr ""
|
3314 |
|
3315 |
-
#:
|
3316 |
-
msgid "
|
3317 |
msgstr ""
|
3318 |
|
3319 |
-
#:
|
3320 |
-
msgid "
|
3321 |
msgstr ""
|
3322 |
|
3323 |
-
#:
|
3324 |
-
msgid ""
|
3325 |
-
"Make sure this is checked if you want your site description to show up on "
|
3326 |
-
"the Pretty Bar."
|
3327 |
msgstr ""
|
3328 |
|
3329 |
-
#:
|
3330 |
-
msgid "
|
3331 |
msgstr ""
|
3332 |
|
3333 |
-
#:
|
3334 |
-
msgid "
|
3335 |
msgstr ""
|
3336 |
|
3337 |
-
#:
|
3338 |
-
msgid ""
|
3339 |
-
"Make sure this is checked if you want \"share links\" to show up on the "
|
3340 |
-
"Pretty Bar."
|
3341 |
msgstr ""
|
3342 |
|
3343 |
-
#:
|
3344 |
-
msgid "
|
3345 |
msgstr ""
|
3346 |
|
3347 |
-
#:
|
3348 |
-
|
|
|
|
|
3349 |
msgstr ""
|
3350 |
|
3351 |
-
#:
|
3352 |
-
msgid ""
|
3353 |
-
"Make sure this is checked if you want a link displaying the Target URL to "
|
3354 |
-
"show up on the Pretty Bar."
|
3355 |
msgstr ""
|
3356 |
|
3357 |
-
#:
|
3358 |
-
|
|
|
|
|
3359 |
msgstr ""
|
3360 |
|
3361 |
-
#:
|
3362 |
-
msgid ""
|
3363 |
-
"Check this to hide the pretty link attribution link on the pretty bar.<br/"
|
3364 |
-
"><br/><strong>Wait, before you do this, you might want to leave this un-"
|
3365 |
-
"checked and set the alternate URL of this link to your <em>Pretty Links Pro</"
|
3366 |
-
"em> <a href=\"https://prettylinks.com/plp/options/aff-attribution"
|
3367 |
-
"\">Affiliate URL</a> to earn a few bucks while you are at it."
|
3368 |
msgstr ""
|
3369 |
|
3370 |
-
#:
|
3371 |
-
msgid "
|
3372 |
msgstr ""
|
3373 |
|
3374 |
-
#:
|
3375 |
-
msgid "
|
3376 |
msgstr ""
|
3377 |
|
3378 |
-
#:
|
3379 |
-
|
3380 |
-
"
|
3381 |
-
"good place to put your <em>Pretty Links Pro</em> <a href=\"https://"
|
3382 |
-
"prettylinks.com/plp/options/aff-attribution-2\">Affiliate Link</a>."
|
3383 |
msgstr ""
|
3384 |
|
3385 |
-
#:
|
3386 |
-
msgid "
|
3387 |
msgstr ""
|
3388 |
|
3389 |
-
#:
|
3390 |
-
msgid "
|
3391 |
msgstr ""
|
3392 |
|
3393 |
-
#:
|
3394 |
-
|
|
|
3395 |
msgstr ""
|
3396 |
|
3397 |
-
#:
|
3398 |
-
|
3399 |
-
|
3400 |
-
"><br/><code>Note:</code> In order for the Social Buttons Bar to be visible "
|
3401 |
-
"on Pages and or Posts, you must first enable it in the \"Page & Post "
|
3402 |
-
"Options\" section above."
|
3403 |
msgstr ""
|
3404 |
|
3405 |
-
#:
|
3406 |
-
|
|
|
3407 |
msgstr ""
|
3408 |
|
3409 |
-
#:
|
3410 |
-
msgid "
|
3411 |
msgstr ""
|
3412 |
|
3413 |
-
#:
|
3414 |
-
msgid ""
|
3415 |
-
"This determines where your Social Buttons Placement should appear in "
|
3416 |
-
"relation to content on Pages and/or Posts.<br/><br/><code>Note:</code> If "
|
3417 |
-
"you want this bar to appear then you must enable it in the \"Page and Post "
|
3418 |
-
"Options\" above."
|
3419 |
msgstr ""
|
3420 |
|
3421 |
-
#:
|
3422 |
-
msgid "
|
3423 |
msgstr ""
|
3424 |
|
3425 |
-
#:
|
3426 |
-
msgid ""
|
3427 |
-
"If you select none, you can still show your Social Buttons by manually "
|
3428 |
-
"adding the <code>[social_buttons_bar]</code> shortcode to your blog posts or "
|
3429 |
-
"<code><?php the_social_buttons_bar(); ?></code> template tag to your "
|
3430 |
-
"WordPress Theme."
|
3431 |
msgstr ""
|
3432 |
|
3433 |
-
#:
|
3434 |
-
|
|
|
3435 |
msgstr ""
|
3436 |
|
3437 |
-
#:
|
3438 |
-
msgid "
|
3439 |
msgstr ""
|
3440 |
|
3441 |
-
#:
|
3442 |
-
msgid "
|
3443 |
msgstr ""
|
3444 |
|
3445 |
-
#:
|
3446 |
-
msgid ""
|
3447 |
-
"This option will give you the ability to turn your website into a link "
|
3448 |
-
"shortening service for your users. Once selected, you can enable the Pretty "
|
3449 |
-
"Links Pro Sidebar Widget or just display the link creation form with the "
|
3450 |
-
"<code>[prli_create_form]</code> shortcode in any post or page on your "
|
3451 |
-
"website."
|
3452 |
msgstr ""
|
3453 |
|
3454 |
-
#:
|
3455 |
-
msgid "
|
3456 |
msgstr ""
|
3457 |
|
3458 |
-
#:
|
3459 |
-
msgid "
|
3460 |
msgstr ""
|
3461 |
|
3462 |
-
#:
|
3463 |
-
msgid ""
|
3464 |
-
"When a link is created using the public form, the user is typically "
|
3465 |
-
"redirected to a simple page displaying their new pretty link. But, you can "
|
3466 |
-
"specify a page that you want them to be redirected to on your website, using "
|
3467 |
-
"your branding instead by selecting this box and entering the url of the page "
|
3468 |
-
"you want them to go to."
|
3469 |
msgstr ""
|
3470 |
|
3471 |
-
#:
|
3472 |
-
msgid "
|
3473 |
msgstr ""
|
3474 |
|
3475 |
-
#:
|
3476 |
-
|
|
|
3477 |
msgstr ""
|
3478 |
|
3479 |
-
#:
|
3480 |
-
msgid ""
|
3481 |
-
"To set this up, create a new page on your WordPress site and make sure the "
|
3482 |
-
"<code>[prli_create_display]</code> appears somewhere on this page -- "
|
3483 |
-
"otherwise the link will never get created. Once this page is created, just "
|
3484 |
-
"enter the full URL to it here. Make sure this URL does npt end with a slash "
|
3485 |
-
"(/)."
|
3486 |
msgstr ""
|
3487 |
|
3488 |
-
#:
|
3489 |
-
|
|
|
3490 |
msgstr ""
|
3491 |
|
3492 |
-
#:
|
3493 |
-
msgid "
|
3494 |
msgstr ""
|
3495 |
|
3496 |
-
#:
|
3497 |
-
msgid ""
|
3498 |
-
"Use this option if you want to substitute your actual blog's url with "
|
3499 |
-
"another URL. You must have another valid domain name pointing to this "
|
3500 |
-
"WordPress install before you enable this option. If you are using this "
|
3501 |
-
"option to just get rid of the www in the beginning of your url that is fine "
|
3502 |
-
"-- just make sure your domain works without the www before enabling this "
|
3503 |
-
"option."
|
3504 |
msgstr ""
|
3505 |
|
3506 |
-
#:
|
3507 |
-
msgid "
|
3508 |
msgstr ""
|
3509 |
|
3510 |
-
#:
|
3511 |
-
msgid ""
|
3512 |
-
"Enter a valid base url that points at this WordPress install. Make sure this "
|
3513 |
-
"URL does not end with a slash (/)."
|
3514 |
msgstr ""
|
3515 |
|
3516 |
-
#:
|
3517 |
-
msgid "
|
3518 |
msgstr ""
|
3519 |
|
3520 |
-
#:
|
3521 |
-
|
|
|
3522 |
msgstr ""
|
3523 |
|
3524 |
-
#:
|
3525 |
-
|
3526 |
-
"
|
3527 |
-
"interface for Pretty Link."
|
3528 |
msgstr ""
|
3529 |
|
3530 |
-
#:
|
3531 |
-
msgid "
|
3532 |
msgstr ""
|
3533 |
|
3534 |
-
#:
|
3535 |
-
|
|
|
3536 |
msgstr ""
|
3537 |
|
3538 |
-
#:
|
3539 |
-
msgid "
|
3540 |
msgstr ""
|
3541 |
|
3542 |
-
#:
|
3543 |
-
msgid "
|
3544 |
msgstr ""
|
3545 |
|
3546 |
-
#:
|
3547 |
-
msgid "
|
3548 |
msgstr ""
|
3549 |
|
3550 |
-
#:
|
3551 |
-
msgid "
|
3552 |
msgstr ""
|
3553 |
|
3554 |
-
#:
|
3555 |
-
msgid "
|
3556 |
msgstr ""
|
3557 |
|
3558 |
-
#:
|
3559 |
-
msgid "
|
3560 |
msgstr ""
|
3561 |
|
3562 |
-
#:
|
3563 |
-
|
|
|
3564 |
msgstr ""
|
3565 |
|
3566 |
-
#:
|
3567 |
-
msgid "
|
3568 |
msgstr ""
|
3569 |
|
3570 |
-
#:
|
3571 |
-
msgid "
|
3572 |
msgstr ""
|
3573 |
|
3574 |
-
#:
|
3575 |
-
msgid "
|
3576 |
msgstr ""
|
3577 |
|
3578 |
-
#:
|
3579 |
-
msgid "
|
3580 |
msgstr ""
|
3581 |
|
3582 |
-
|
3583 |
-
#:
|
3584 |
-
msgid "
|
3585 |
msgstr ""
|
3586 |
|
3587 |
-
#:
|
3588 |
-
|
3589 |
-
#: pro/app/views/reports/split-test-report.php:32
|
3590 |
-
#: pro/app/views/reports/split-test-report.php:64
|
3591 |
-
msgid "Conv Rate"
|
3592 |
msgstr ""
|
3593 |
|
3594 |
-
#:
|
3595 |
-
msgid "
|
3596 |
msgstr ""
|
3597 |
|
3598 |
-
|
3599 |
-
|
|
|
3600 |
msgstr ""
|
3601 |
|
3602 |
-
#:
|
3603 |
-
msgid "
|
3604 |
msgstr ""
|
3605 |
|
3606 |
-
#:
|
3607 |
-
msgid "
|
3608 |
msgstr ""
|
3609 |
|
3610 |
-
#:
|
3611 |
-
msgid "
|
3612 |
msgstr ""
|
3613 |
|
3614 |
-
#:
|
3615 |
-
msgid ""
|
3616 |
-
"If you want to enable conversion tracking in this report then select a goal "
|
3617 |
-
"link."
|
3618 |
msgstr ""
|
3619 |
|
3620 |
-
#:
|
3621 |
-
msgid "
|
3622 |
msgstr ""
|
3623 |
|
3624 |
-
#:
|
3625 |
-
msgid "
|
3626 |
msgstr ""
|
3627 |
|
3628 |
-
#:
|
3629 |
-
msgid "
|
3630 |
msgstr ""
|
3631 |
|
3632 |
-
#:
|
3633 |
-
msgid "
|
3634 |
msgstr ""
|
3635 |
|
3636 |
-
#:
|
3637 |
-
msgid "
|
3638 |
msgstr ""
|
3639 |
|
3640 |
-
#:
|
3641 |
-
msgid "
|
3642 |
msgstr ""
|
3643 |
|
3644 |
-
#:
|
3645 |
-
msgid "
|
3646 |
msgstr ""
|
3647 |
|
3648 |
-
#:
|
3649 |
-
msgid "
|
3650 |
msgstr ""
|
3651 |
|
3652 |
-
#:
|
3653 |
-
msgid "
|
3654 |
msgstr ""
|
3655 |
|
3656 |
-
|
3657 |
-
|
|
|
3658 |
msgstr ""
|
3659 |
|
3660 |
-
#:
|
3661 |
-
msgid "
|
3662 |
msgstr ""
|
3663 |
|
3664 |
-
#:
|
3665 |
-
msgid "
|
3666 |
msgstr ""
|
3667 |
|
3668 |
-
#:
|
3669 |
-
msgid "
|
3670 |
msgstr ""
|
3671 |
|
3672 |
-
#:
|
3673 |
-
msgid ""
|
3674 |
-
"Alter the options below to customize this Bookmarklet. As you modify the "
|
3675 |
-
"label, redirect type, tracking and group, you will see this bookmarklet "
|
3676 |
-
"update -- when the settings are how you want them, drag the bookmarklet into "
|
3677 |
-
"your toolbar. You can create as many bookmarklets as you want each with "
|
3678 |
-
"different settings."
|
3679 |
msgstr ""
|
3680 |
|
3681 |
-
#:
|
3682 |
-
|
3683 |
-
msgid "Pretty Link Options"
|
3684 |
msgstr ""
|
3685 |
|
3686 |
-
#:
|
3687 |
-
msgid "
|
3688 |
msgstr ""
|
3689 |
|
3690 |
-
#:
|
3691 |
-
|
3692 |
-
msgid "Redirection:"
|
3693 |
msgstr ""
|
3694 |
|
3695 |
-
#:
|
3696 |
-
msgid "
|
3697 |
msgstr ""
|
3698 |
|
3699 |
-
#:
|
3700 |
-
|
3701 |
-
msgid "Yes"
|
3702 |
msgstr ""
|
3703 |
|
3704 |
-
|
3705 |
-
#:
|
3706 |
-
msgid "
|
3707 |
msgstr ""
|
3708 |
|
3709 |
-
#:
|
3710 |
-
|
3711 |
-
msgid "Group:"
|
3712 |
msgstr ""
|
3713 |
|
3714 |
-
#:
|
3715 |
-
msgid "
|
3716 |
msgstr ""
|
3717 |
|
3718 |
-
#:
|
3719 |
-
msgid "
|
3720 |
msgstr ""
|
3721 |
|
3722 |
-
#:
|
3723 |
-
msgid "
|
3724 |
msgstr ""
|
3725 |
|
3726 |
-
#:
|
3727 |
-
msgid "
|
3728 |
msgstr ""
|
3729 |
|
3730 |
-
#:
|
3731 |
-
msgid "
|
3732 |
msgstr ""
|
3733 |
|
3734 |
-
#:
|
3735 |
-
msgid "
|
3736 |
msgstr ""
|
3737 |
|
3738 |
-
#:
|
3739 |
-
|
|
|
3740 |
msgstr ""
|
3741 |
|
3742 |
-
#:
|
3743 |
-
msgid "
|
3744 |
msgstr ""
|
3745 |
|
3746 |
-
#:
|
3747 |
-
|
|
|
3748 |
msgstr ""
|
3749 |
|
3750 |
-
#:
|
3751 |
-
msgid "
|
3752 |
msgstr ""
|
3753 |
|
3754 |
-
|
3755 |
-
|
|
|
3756 |
msgstr ""
|
3757 |
|
3758 |
-
|
3759 |
-
|
|
|
3760 |
msgstr ""
|
3761 |
|
3762 |
-
|
3763 |
-
|
|
|
3764 |
msgstr ""
|
3765 |
|
3766 |
-
|
3767 |
-
|
|
|
3768 |
msgstr ""
|
3769 |
|
3770 |
-
#:
|
3771 |
-
|
|
|
3772 |
msgstr ""
|
3773 |
|
3774 |
-
#:
|
3775 |
-
msgid "
|
3776 |
msgstr ""
|
3777 |
|
3778 |
-
#:
|
3779 |
-
msgid "
|
3780 |
msgstr ""
|
3781 |
|
3782 |
-
#:
|
3783 |
-
msgid "
|
3784 |
msgstr ""
|
3785 |
|
3786 |
-
#:
|
3787 |
-
msgid "
|
3788 |
msgstr ""
|
3789 |
|
3790 |
-
#:
|
3791 |
-
msgid "
|
3792 |
msgstr ""
|
3793 |
|
3794 |
-
#:
|
3795 |
-
msgid "
|
3796 |
msgstr ""
|
3797 |
|
3798 |
-
#:
|
3799 |
-
msgid "
|
3800 |
msgstr ""
|
3801 |
|
3802 |
-
#:
|
3803 |
-
msgid "
|
3804 |
msgstr ""
|
3805 |
|
3806 |
-
#:
|
3807 |
-
msgid "
|
3808 |
msgstr ""
|
3809 |
|
3810 |
-
#:
|
3811 |
-
msgid "
|
3812 |
msgstr ""
|
3813 |
|
3814 |
-
#:
|
3815 |
-
msgid "
|
3816 |
msgstr ""
|
3817 |
|
3818 |
-
#:
|
3819 |
-
msgid "
|
3820 |
msgstr ""
|
3821 |
|
3822 |
-
#:
|
3823 |
-
msgid "
|
3824 |
msgstr ""
|
3825 |
|
3826 |
-
#:
|
3827 |
-
msgid "
|
3828 |
msgstr ""
|
3829 |
|
3830 |
-
#:
|
3831 |
-
msgid "
|
3832 |
msgstr ""
|
3833 |
|
3834 |
-
#:
|
3835 |
-
msgid "
|
3836 |
msgstr ""
|
3837 |
|
3838 |
-
#:
|
3839 |
-
msgid "
|
3840 |
msgstr ""
|
3841 |
|
3842 |
-
#:
|
3843 |
-
|
|
|
3844 |
msgstr ""
|
3845 |
|
3846 |
-
#:
|
3847 |
-
msgid "
|
3848 |
msgstr ""
|
3849 |
|
3850 |
-
#:
|
3851 |
-
msgid "
|
3852 |
msgstr ""
|
3853 |
|
3854 |
-
#:
|
3855 |
-
|
|
|
3856 |
msgstr ""
|
3857 |
|
3858 |
-
#:
|
3859 |
-
msgid "
|
3860 |
msgstr ""
|
3861 |
|
3862 |
-
#:
|
3863 |
-
|
|
|
3864 |
msgstr ""
|
3865 |
|
3866 |
-
#:
|
3867 |
-
msgid "
|
3868 |
msgstr ""
|
3869 |
|
3870 |
-
#:
|
3871 |
-
msgid "
|
3872 |
msgstr ""
|
3873 |
|
3874 |
-
#:
|
3875 |
-
|
|
|
3876 |
msgstr ""
|
3877 |
|
3878 |
-
#:
|
3879 |
-
msgid "
|
3880 |
msgstr ""
|
3881 |
|
3882 |
-
#:
|
3883 |
-
msgid "
|
3884 |
msgstr ""
|
3885 |
|
3886 |
-
#:
|
3887 |
-
|
|
|
3888 |
msgstr ""
|
3889 |
|
3890 |
-
#:
|
3891 |
-
msgid "
|
3892 |
msgstr ""
|
3893 |
|
3894 |
-
#:
|
3895 |
-
msgid "
|
3896 |
msgstr ""
|
3897 |
|
3898 |
-
#:
|
3899 |
-
msgid "
|
3900 |
msgstr ""
|
3901 |
|
3902 |
-
#:
|
3903 |
-
msgid "
|
3904 |
msgstr ""
|
3905 |
|
3906 |
-
#:
|
3907 |
-
|
|
|
3908 |
msgstr ""
|
3909 |
|
3910 |
-
|
3911 |
-
|
|
|
3912 |
msgstr ""
|
3913 |
|
3914 |
-
|
3915 |
-
|
|
|
3916 |
msgstr ""
|
3917 |
|
3918 |
-
|
3919 |
-
|
|
|
3920 |
msgstr ""
|
3921 |
|
3922 |
-
#:
|
3923 |
-
msgid "
|
3924 |
msgstr ""
|
3925 |
|
3926 |
-
#:
|
3927 |
-
msgid "
|
3928 |
msgstr ""
|
3929 |
|
3930 |
-
|
3931 |
-
|
|
|
3932 |
msgstr ""
|
3933 |
|
3934 |
-
#:
|
3935 |
-
|
|
|
|
|
|
|
3936 |
msgstr ""
|
3937 |
|
3938 |
-
|
3939 |
-
|
|
|
3940 |
msgstr ""
|
3941 |
|
3942 |
-
#:
|
3943 |
-
|
|
|
3944 |
msgstr ""
|
3945 |
|
3946 |
-
|
3947 |
-
|
|
|
3948 |
msgstr ""
|
3949 |
|
3950 |
-
#:
|
3951 |
-
|
|
|
3952 |
msgstr ""
|
3953 |
|
3954 |
-
|
3955 |
-
|
|
|
3956 |
msgstr ""
|
3957 |
|
3958 |
-
#:
|
3959 |
-
|
|
|
3960 |
msgstr ""
|
3961 |
|
3962 |
-
#:
|
3963 |
-
msgid "
|
3964 |
msgstr ""
|
3965 |
|
3966 |
-
#:
|
3967 |
-
msgid "
|
3968 |
msgstr ""
|
3969 |
|
3970 |
-
|
3971 |
-
|
|
|
3972 |
msgstr ""
|
3973 |
|
3974 |
-
#:
|
3975 |
-
|
|
|
3976 |
msgstr ""
|
3977 |
|
3978 |
-
#:
|
3979 |
-
msgid "
|
3980 |
msgstr ""
|
3981 |
|
3982 |
-
|
3983 |
-
|
|
|
3984 |
msgstr ""
|
3985 |
|
3986 |
-
#:
|
3987 |
-
msgid "
|
3988 |
msgstr ""
|
3989 |
|
3990 |
-
#:
|
3991 |
-
msgid "
|
3992 |
msgstr ""
|
3993 |
|
3994 |
-
#:
|
3995 |
-
msgid "
|
3996 |
msgstr ""
|
3997 |
|
3998 |
-
#:
|
3999 |
-
msgid "
|
4000 |
msgstr ""
|
4001 |
|
4002 |
-
#:
|
4003 |
-
msgid "
|
4004 |
msgstr ""
|
4005 |
|
4006 |
-
#:
|
4007 |
-
msgid "
|
4008 |
msgstr ""
|
4009 |
|
4010 |
-
#:
|
4011 |
-
msgid "
|
4012 |
msgstr ""
|
4013 |
|
4014 |
-
#:
|
4015 |
-
msgid "
|
4016 |
msgstr ""
|
4017 |
|
4018 |
-
#:
|
4019 |
-
msgid "
|
4020 |
msgstr ""
|
4021 |
|
4022 |
-
#:
|
4023 |
-
msgid "
|
4024 |
msgstr ""
|
4025 |
|
4026 |
-
#:
|
4027 |
-
msgid "
|
4028 |
msgstr ""
|
4029 |
|
4030 |
-
#:
|
4031 |
-
|
|
|
4032 |
msgstr ""
|
4033 |
|
4034 |
-
#:
|
4035 |
-
msgid "
|
4036 |
msgstr ""
|
4037 |
|
4038 |
-
#:
|
4039 |
-
msgid "
|
4040 |
msgstr ""
|
4041 |
|
4042 |
-
#:
|
4043 |
-
msgid "
|
4044 |
msgstr ""
|
4045 |
|
4046 |
-
#:
|
4047 |
-
msgid "
|
|
|
|
|
|
|
|
|
4048 |
msgstr ""
|
4049 |
|
4050 |
-
#:
|
4051 |
-
msgid "
|
4052 |
msgstr ""
|
4053 |
|
4054 |
-
#:
|
4055 |
-
msgid "
|
4056 |
msgstr ""
|
4057 |
|
4058 |
-
#:
|
4059 |
-
msgid "
|
4060 |
msgstr ""
|
4061 |
|
4062 |
-
#:
|
4063 |
-
msgid "
|
4064 |
msgstr ""
|
4065 |
|
4066 |
-
#:
|
4067 |
-
|
|
|
4068 |
msgstr ""
|
4069 |
|
4070 |
-
#:
|
4071 |
-
msgid "
|
4072 |
msgstr ""
|
4073 |
|
4074 |
-
#:
|
4075 |
-
msgid "
|
4076 |
msgstr ""
|
4077 |
|
4078 |
-
#:
|
4079 |
-
msgid "
|
4080 |
msgstr ""
|
4081 |
|
4082 |
-
#:
|
4083 |
-
msgid "
|
4084 |
msgstr ""
|
4085 |
|
4086 |
-
#:
|
4087 |
-
msgid "
|
4088 |
msgstr ""
|
4089 |
|
4090 |
-
#:
|
4091 |
-
msgid "
|
4092 |
msgstr ""
|
4093 |
|
4094 |
-
#:
|
4095 |
-
msgid "
|
4096 |
msgstr ""
|
4097 |
|
4098 |
-
#:
|
4099 |
-
msgid "
|
4100 |
msgstr ""
|
4101 |
|
4102 |
-
#:
|
4103 |
-
msgid "
|
4104 |
msgstr ""
|
4105 |
|
4106 |
-
#:
|
4107 |
-
msgid "
|
4108 |
msgstr ""
|
4109 |
|
4110 |
-
#:
|
4111 |
-
msgid "
|
4112 |
msgstr ""
|
4113 |
|
4114 |
-
#:
|
4115 |
-
|
|
|
4116 |
msgstr ""
|
4117 |
|
4118 |
-
#:
|
4119 |
-
msgid "
|
4120 |
msgstr ""
|
4121 |
|
4122 |
-
#:
|
4123 |
-
|
|
|
4124 |
msgstr ""
|
4125 |
|
4126 |
-
#:
|
4127 |
-
msgid "
|
4128 |
msgstr ""
|
4129 |
|
4130 |
-
#:
|
4131 |
-
msgid "
|
4132 |
msgstr ""
|
4133 |
|
4134 |
-
#:
|
4135 |
-
msgid "
|
4136 |
msgstr ""
|
4137 |
|
4138 |
-
#:
|
4139 |
-
msgid "
|
4140 |
msgstr ""
|
4141 |
|
4142 |
-
#:
|
4143 |
-
msgid "
|
4144 |
msgstr ""
|
4145 |
|
4146 |
-
#:
|
4147 |
-
msgid "
|
4148 |
msgstr ""
|
4149 |
|
4150 |
-
#:
|
4151 |
-
msgid "
|
4152 |
msgstr ""
|
4153 |
|
4154 |
-
#:
|
4155 |
-
msgid "
|
4156 |
msgstr ""
|
4157 |
|
4158 |
-
#:
|
4159 |
-
|
|
|
4160 |
msgstr ""
|
4161 |
|
4162 |
-
#:
|
4163 |
-
|
|
|
4164 |
msgstr ""
|
4165 |
|
4166 |
-
#:
|
4167 |
-
|
|
|
4168 |
msgstr ""
|
4169 |
|
4170 |
-
#:
|
4171 |
-
|
|
|
4172 |
msgstr ""
|
4173 |
|
4174 |
-
#:
|
4175 |
-
|
|
|
4176 |
msgstr ""
|
4177 |
|
4178 |
-
|
4179 |
-
|
|
|
|
|
4180 |
msgstr ""
|
4181 |
|
4182 |
-
#:
|
4183 |
-
msgid "
|
4184 |
msgstr ""
|
4185 |
|
4186 |
-
#:
|
4187 |
-
msgid "
|
4188 |
msgstr ""
|
4189 |
|
4190 |
-
#:
|
4191 |
-
msgid "
|
4192 |
msgstr ""
|
4193 |
|
4194 |
-
#:
|
4195 |
-
msgid "
|
4196 |
msgstr ""
|
4197 |
|
4198 |
-
#:
|
4199 |
-
|
|
|
4200 |
msgstr ""
|
4201 |
|
4202 |
-
#:
|
4203 |
-
msgid "
|
4204 |
msgstr ""
|
4205 |
|
4206 |
-
#:
|
4207 |
-
msgid "
|
4208 |
msgstr ""
|
4209 |
|
4210 |
-
#:
|
4211 |
-
|
|
|
4212 |
msgstr ""
|
4213 |
|
4214 |
-
#:
|
4215 |
-
|
|
|
4216 |
msgstr ""
|
4217 |
|
4218 |
-
#:
|
4219 |
-
|
|
|
4220 |
msgstr ""
|
4221 |
|
4222 |
-
#:
|
4223 |
-
msgid "
|
4224 |
msgstr ""
|
4225 |
|
4226 |
-
|
4227 |
-
|
|
|
4228 |
msgstr ""
|
4229 |
|
4230 |
-
#:
|
4231 |
-
msgid "
|
4232 |
msgstr ""
|
4233 |
|
4234 |
-
|
4235 |
-
|
|
|
4236 |
msgstr ""
|
4237 |
|
4238 |
-
#:
|
4239 |
-
msgid "
|
4240 |
msgstr ""
|
4241 |
|
4242 |
-
#:
|
4243 |
-
msgid "
|
4244 |
msgstr ""
|
4245 |
|
4246 |
-
#:
|
4247 |
-
msgid "
|
4248 |
msgstr ""
|
4249 |
|
4250 |
-
#:
|
4251 |
-
msgid "
|
4252 |
msgstr ""
|
4253 |
|
4254 |
-
#:
|
4255 |
-
msgid "
|
4256 |
msgstr ""
|
4257 |
|
4258 |
-
#:
|
4259 |
-
msgid "
|
4260 |
msgstr ""
|
4261 |
|
4262 |
-
|
4263 |
-
|
|
|
4264 |
msgstr ""
|
4265 |
|
4266 |
-
#:
|
4267 |
-
msgid "
|
4268 |
msgstr ""
|
4269 |
|
4270 |
-
#:
|
4271 |
-
msgid "
|
4272 |
msgstr ""
|
4273 |
|
4274 |
-
#:
|
4275 |
-
msgid "
|
4276 |
msgstr ""
|
4277 |
|
4278 |
-
#:
|
4279 |
-
msgid "
|
4280 |
msgstr ""
|
4281 |
|
4282 |
-
#:
|
4283 |
-
msgid "
|
4284 |
msgstr ""
|
4285 |
|
4286 |
-
#:
|
4287 |
-
msgid "
|
4288 |
msgstr ""
|
4289 |
|
4290 |
-
#:
|
4291 |
-
msgid "
|
4292 |
msgstr ""
|
4293 |
|
4294 |
-
#:
|
4295 |
-
msgid "
|
4296 |
msgstr ""
|
4297 |
|
4298 |
-
#:
|
4299 |
-
msgid "
|
4300 |
msgstr ""
|
4301 |
|
4302 |
-
#:
|
4303 |
-
msgid "
|
4304 |
msgstr ""
|
4305 |
|
4306 |
-
#:
|
4307 |
-
msgid "
|
4308 |
msgstr ""
|
4309 |
|
4310 |
-
#:
|
4311 |
-
msgid "
|
4312 |
msgstr ""
|
4313 |
|
4314 |
-
#:
|
4315 |
-
msgid "
|
4316 |
msgstr ""
|
4317 |
|
4318 |
-
#:
|
4319 |
-
msgid "
|
4320 |
msgstr ""
|
4321 |
|
4322 |
-
#:
|
4323 |
-
|
|
|
4324 |
msgstr ""
|
4325 |
|
4326 |
-
#:
|
4327 |
-
msgid "
|
4328 |
msgstr ""
|
4329 |
|
4330 |
-
#:
|
4331 |
-
msgid "
|
4332 |
msgstr ""
|
4333 |
|
4334 |
-
#:
|
4335 |
-
msgid "
|
4336 |
msgstr ""
|
4337 |
|
4338 |
-
#:
|
4339 |
-
msgid "
|
4340 |
msgstr ""
|
4341 |
|
4342 |
-
#:
|
4343 |
-
|
|
|
4344 |
msgstr ""
|
4345 |
|
4346 |
-
#:
|
4347 |
-
|
|
|
4348 |
msgstr ""
|
4349 |
|
4350 |
-
#:
|
4351 |
-
|
|
|
4352 |
msgstr ""
|
4353 |
|
4354 |
-
#:
|
4355 |
-
|
|
|
4356 |
msgstr ""
|
4357 |
|
4358 |
-
#:
|
4359 |
-
|
|
|
4360 |
msgstr ""
|
4361 |
|
4362 |
-
#:
|
4363 |
-
|
|
|
4364 |
msgstr ""
|
4365 |
|
4366 |
-
#:
|
4367 |
-
|
|
|
4368 |
msgstr ""
|
4369 |
|
4370 |
-
#:
|
4371 |
-
|
|
|
4372 |
msgstr ""
|
4373 |
|
4374 |
-
#:
|
4375 |
-
msgid "
|
4376 |
msgstr ""
|
4377 |
|
4378 |
-
#:
|
4379 |
-
msgid "
|
4380 |
msgstr ""
|
4381 |
|
4382 |
-
#:
|
4383 |
-
msgid "
|
4384 |
msgstr ""
|
4385 |
|
4386 |
-
#:
|
4387 |
-
msgid "
|
4388 |
msgstr ""
|
4389 |
|
4390 |
-
#:
|
4391 |
-
msgid "
|
4392 |
msgstr ""
|
4393 |
|
4394 |
-
#:
|
4395 |
-
msgid "
|
4396 |
msgstr ""
|
4397 |
|
4398 |
-
#:
|
4399 |
-
msgid "
|
4400 |
msgstr ""
|
4401 |
|
4402 |
-
#:
|
4403 |
-
msgid "
|
4404 |
msgstr ""
|
4405 |
|
4406 |
-
#:
|
4407 |
-
msgid "
|
4408 |
msgstr ""
|
4409 |
|
4410 |
-
#:
|
4411 |
-
msgid "
|
4412 |
msgstr ""
|
4413 |
|
4414 |
-
#:
|
4415 |
-
msgid "
|
4416 |
msgstr ""
|
4417 |
|
4418 |
-
#:
|
4419 |
-
msgid "
|
4420 |
msgstr ""
|
4421 |
|
4422 |
-
#:
|
4423 |
-
msgid "
|
4424 |
msgstr ""
|
4425 |
|
4426 |
-
#:
|
4427 |
-
msgid "
|
4428 |
msgstr ""
|
4429 |
|
4430 |
-
#:
|
4431 |
-
msgid "
|
4432 |
msgstr ""
|
4433 |
|
4434 |
-
#:
|
4435 |
-
msgid "
|
4436 |
msgstr ""
|
4437 |
|
4438 |
-
#:
|
4439 |
-
msgid "
|
4440 |
msgstr ""
|
4441 |
|
4442 |
-
#:
|
4443 |
-
msgid "
|
4444 |
msgstr ""
|
4445 |
|
4446 |
-
#:
|
4447 |
-
msgid "
|
4448 |
msgstr ""
|
4449 |
|
4450 |
-
#:
|
4451 |
-
msgid "
|
4452 |
msgstr ""
|
4453 |
|
4454 |
-
#:
|
4455 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4456 |
msgstr ""
|
4457 |
|
4458 |
-
#:
|
4459 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4460 |
msgstr ""
|
4461 |
|
4462 |
-
#:
|
4463 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4464 |
msgstr ""
|
4465 |
|
4466 |
-
#:
|
4467 |
-
msgid "
|
4468 |
msgstr ""
|
4469 |
|
4470 |
-
#:
|
4471 |
-
|
|
|
4472 |
msgstr ""
|
4473 |
|
4474 |
-
#:
|
4475 |
-
msgid "
|
4476 |
msgstr ""
|
4477 |
|
4478 |
-
#:
|
4479 |
-
msgid "
|
4480 |
msgstr ""
|
4481 |
|
4482 |
-
#:
|
4483 |
-
msgid "
|
4484 |
msgstr ""
|
4485 |
|
4486 |
-
#:
|
4487 |
-
msgid "
|
4488 |
msgstr ""
|
4489 |
|
4490 |
-
#:
|
4491 |
-
|
|
|
4492 |
msgstr ""
|
4493 |
|
4494 |
-
#:
|
4495 |
-
|
|
|
4496 |
msgstr ""
|
4497 |
|
4498 |
-
#:
|
4499 |
-
msgid "
|
4500 |
msgstr ""
|
4501 |
|
4502 |
-
#:
|
4503 |
-
msgid "
|
4504 |
msgstr ""
|
4505 |
|
4506 |
-
#:
|
4507 |
-
msgid "
|
4508 |
msgstr ""
|
4509 |
|
4510 |
-
#:
|
4511 |
-
msgid "
|
4512 |
msgstr ""
|
4513 |
|
4514 |
-
#:
|
4515 |
-
msgid "
|
4516 |
msgstr ""
|
4517 |
|
4518 |
-
#:
|
4519 |
-
|
|
|
|
|
4520 |
msgstr ""
|
4521 |
|
4522 |
-
#:
|
4523 |
-
msgid "
|
4524 |
msgstr ""
|
4525 |
|
4526 |
-
#:
|
4527 |
-
msgid "
|
4528 |
msgstr ""
|
4529 |
|
4530 |
-
#:
|
4531 |
-
msgid "
|
4532 |
msgstr ""
|
4533 |
|
4534 |
-
#:
|
4535 |
-
msgid "
|
4536 |
msgstr ""
|
4537 |
|
4538 |
-
#:
|
4539 |
-
|
|
|
4540 |
msgstr ""
|
4541 |
|
4542 |
-
#:
|
4543 |
-
msgid "
|
4544 |
msgstr ""
|
4545 |
|
4546 |
-
#:
|
4547 |
-
msgid "
|
4548 |
msgstr ""
|
4549 |
|
4550 |
-
#:
|
4551 |
-
msgid "
|
4552 |
msgstr ""
|
4553 |
|
4554 |
-
#:
|
4555 |
-
|
|
|
|
|
4556 |
msgstr ""
|
4557 |
|
4558 |
-
#:
|
4559 |
-
msgid "
|
4560 |
msgstr ""
|
4561 |
|
4562 |
-
#:
|
4563 |
-
msgid "
|
4564 |
msgstr ""
|
4565 |
|
4566 |
-
#:
|
4567 |
-
msgid "
|
4568 |
msgstr ""
|
4569 |
|
4570 |
-
#:
|
4571 |
-
msgid "
|
4572 |
msgstr ""
|
4573 |
|
4574 |
-
#:
|
4575 |
-
msgid "
|
4576 |
msgstr ""
|
4577 |
|
4578 |
-
#:
|
4579 |
-
msgid "
|
4580 |
msgstr ""
|
4581 |
|
4582 |
-
#:
|
4583 |
-
msgid "
|
4584 |
msgstr ""
|
4585 |
|
4586 |
-
#:
|
4587 |
-
msgid "
|
4588 |
msgstr ""
|
4589 |
|
4590 |
-
#:
|
4591 |
-
msgid "
|
4592 |
msgstr ""
|
4593 |
|
4594 |
-
#:
|
4595 |
-
msgid "
|
4596 |
msgstr ""
|
4597 |
|
4598 |
-
#:
|
4599 |
-
msgid "
|
4600 |
msgstr ""
|
4601 |
|
4602 |
-
#:
|
4603 |
-
msgid "
|
4604 |
msgstr ""
|
4605 |
|
4606 |
-
#:
|
4607 |
-
msgid "
|
4608 |
msgstr ""
|
4609 |
|
4610 |
-
#:
|
4611 |
-
msgid "
|
4612 |
msgstr ""
|
4613 |
|
4614 |
-
#:
|
4615 |
-
msgid "
|
4616 |
msgstr ""
|
4617 |
|
4618 |
-
#:
|
4619 |
-
msgid "
|
4620 |
msgstr ""
|
4621 |
|
4622 |
-
#:
|
4623 |
-
msgid "
|
4624 |
msgstr ""
|
4625 |
|
4626 |
-
#:
|
4627 |
-
|
|
|
4628 |
msgstr ""
|
4629 |
|
4630 |
-
#:
|
4631 |
-
msgid "
|
4632 |
msgstr ""
|
4633 |
|
4634 |
-
#:
|
4635 |
-
msgid "
|
4636 |
msgstr ""
|
4637 |
|
4638 |
-
#:
|
4639 |
-
msgid "
|
4640 |
msgstr ""
|
4641 |
|
4642 |
-
#:
|
4643 |
-
msgid "
|
4644 |
msgstr ""
|
4645 |
|
4646 |
-
#:
|
4647 |
-
msgid "
|
4648 |
msgstr ""
|
4649 |
|
4650 |
-
#:
|
4651 |
-
msgid "
|
4652 |
msgstr ""
|
4653 |
|
4654 |
-
#:
|
4655 |
-
msgid "
|
4656 |
msgstr ""
|
4657 |
|
4658 |
-
#:
|
4659 |
-
msgid "
|
4660 |
msgstr ""
|
4661 |
|
4662 |
-
#:
|
4663 |
-
msgid "
|
4664 |
msgstr ""
|
4665 |
|
4666 |
-
#:
|
4667 |
-
msgid "
|
4668 |
msgstr ""
|
4669 |
|
4670 |
-
#:
|
4671 |
-
msgid "
|
4672 |
msgstr ""
|
4673 |
|
4674 |
-
#:
|
4675 |
-
msgid "
|
4676 |
msgstr ""
|
4677 |
|
4678 |
-
#:
|
4679 |
-
msgid "
|
4680 |
msgstr ""
|
4681 |
|
4682 |
-
#:
|
4683 |
-
msgid "
|
4684 |
msgstr ""
|
4685 |
|
4686 |
-
#:
|
4687 |
-
msgid "
|
4688 |
msgstr ""
|
4689 |
|
4690 |
-
#:
|
4691 |
-
msgid "
|
4692 |
msgstr ""
|
4693 |
|
4694 |
-
#:
|
4695 |
-
|
|
|
|
|
4696 |
msgstr ""
|
4697 |
|
4698 |
-
#:
|
4699 |
-
msgid "
|
4700 |
msgstr ""
|
4701 |
|
4702 |
-
#:
|
4703 |
-
msgid "
|
4704 |
msgstr ""
|
4705 |
|
4706 |
-
#:
|
4707 |
-
msgid "
|
4708 |
msgstr ""
|
4709 |
|
4710 |
-
#:
|
4711 |
-
|
|
|
|
|
4712 |
msgstr ""
|
4713 |
|
4714 |
-
#:
|
4715 |
-
|
|
|
4716 |
msgstr ""
|
4717 |
|
4718 |
-
#:
|
4719 |
-
msgid "
|
4720 |
msgstr ""
|
4721 |
|
4722 |
-
#:
|
4723 |
-
msgid "
|
4724 |
msgstr ""
|
4725 |
|
4726 |
-
|
4727 |
-
|
|
|
4728 |
msgstr ""
|
4729 |
|
4730 |
-
#:
|
4731 |
-
msgid "
|
4732 |
msgstr ""
|
4733 |
|
4734 |
-
#:
|
4735 |
-
msgid "
|
4736 |
msgstr ""
|
4737 |
|
4738 |
-
#:
|
4739 |
-
msgid "
|
4740 |
msgstr ""
|
4741 |
|
4742 |
-
|
4743 |
-
msgid "
|
4744 |
msgstr ""
|
4745 |
|
4746 |
-
|
4747 |
-
msgid ""
|
4748 |
-
"Shrink, track and share any URL on the Internet from your WordPress website!"
|
4749 |
msgstr ""
|
4750 |
|
4751 |
-
|
4752 |
-
msgid "
|
4753 |
msgstr ""
|
4754 |
|
4755 |
-
#.
|
4756 |
-
|
|
|
4757 |
msgstr ""
|
1 |
+
# Copyright (C) 2019 Blair Williams
|
2 |
+
# This file is distributed under the same license as the Pretty Links plugin.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: Pretty Links 3.0.0\n"
|
6 |
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/pretty-link\n"
|
7 |
+
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
8 |
+
"Language-Team: LANGUAGE <LL@li.org>\n"
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
12 |
+
"POT-Creation-Date: 2019-07-16T13:21:15-06:00\n"
|
13 |
+
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
14 |
+
"X-Generator: WP-CLI 2.2.0\n"
|
15 |
+
"X-Domain: pretty-link\n"
|
16 |
+
|
17 |
+
#. Plugin Name of the plugin
|
18 |
+
#: pro/app/views/links/prettybar.php:68
|
19 |
+
#: app/controllers/PrliLinksController.php:43
|
20 |
+
#: app/controllers/PrliLinksController.php:411
|
21 |
+
msgid "Pretty Links"
|
22 |
+
msgstr ""
|
23 |
|
24 |
+
#. Plugin URI of the plugin
|
25 |
+
msgid "https://prettylinks.com/pl/plugin-uri"
|
|
|
26 |
msgstr ""
|
27 |
|
28 |
+
#. Description of the plugin
|
29 |
+
msgid "Shrink, track and share any URL on the Internet from your WordPress website!"
|
|
|
|
|
|
|
30 |
msgstr ""
|
31 |
|
32 |
+
#. Author of the plugin
|
33 |
+
msgid "Blair Williams"
|
34 |
msgstr ""
|
35 |
|
36 |
+
#. Author URI of the plugin
|
37 |
+
msgid "http://blairwilliams.com"
|
38 |
msgstr ""
|
39 |
|
40 |
+
#: pro/app/helpers/PlpLinksHelper.php:18
|
41 |
+
#: pro/app/views/links/form.php:226
|
42 |
+
msgid "weight:"
|
43 |
msgstr ""
|
44 |
|
45 |
+
#: pro/app/helpers/PlpPostsHelper.php:19
|
46 |
+
msgid "Hide Social Buttons on this post."
|
47 |
msgstr ""
|
48 |
|
49 |
+
#: pro/app/helpers/PlpPostsHelper.php:26
|
50 |
+
msgid "Disable Keyword Replacements on this post."
|
51 |
msgstr ""
|
52 |
|
53 |
+
#: pro/app/helpers/PlpPostsHelper.php:44
|
54 |
+
msgid "A Pretty Link will be created on Publish"
|
55 |
+
msgstr ""
|
56 |
+
|
57 |
+
#: pro/app/helpers/PlpPostsHelper.php:61
|
58 |
+
#: pro/app/views/links/form.php:39
|
59 |
+
#: pro/app/views/links/form.php:49
|
60 |
#: pro/app/views/reports/split-test-report.php:28
|
61 |
#: pro/app/views/reports/split-test-report.php:60
|
62 |
+
#: pro/app/views/reports/custom-report.php:31
|
63 |
+
#: pro/app/views/reports/custom-report.php:64
|
64 |
+
#: app/models/PrliClick.php:256
|
65 |
+
#: app/views/groups/list.php:81
|
66 |
+
#: app/views/clicks/list.php:4
|
67 |
+
#: app/controllers/PrliLinksController.php:409
|
68 |
+
#: app/controllers/PrliAppController.php:118
|
69 |
msgid "Clicks"
|
70 |
msgstr ""
|
71 |
|
72 |
+
#: pro/app/helpers/PlpPostsHelper.php:63
|
73 |
+
#: pro/app/views/reports/split-test-report.php:29
|
74 |
+
#: pro/app/views/reports/split-test-report.php:61
|
75 |
+
#: pro/app/views/reports/custom-report.php:32
|
76 |
+
#: pro/app/views/reports/custom-report.php:65
|
77 |
+
msgid "Uniques"
|
78 |
msgstr ""
|
79 |
|
80 |
+
#: pro/app/helpers/PlpPostsHelper.php:66
|
81 |
+
#: app/models/PrliClick.php:251
|
82 |
+
msgid "Pretty Link:"
|
83 |
msgstr ""
|
84 |
|
85 |
+
#: pro/app/helpers/PlpPostsHelper.php:68
|
86 |
+
msgid "edit"
|
87 |
msgstr ""
|
88 |
|
89 |
+
#: pro/app/helpers/PlpPostsHelper.php:70
|
90 |
+
msgid "Visit Pretty Link:"
|
91 |
msgstr ""
|
92 |
|
93 |
+
#: pro/app/helpers/PlpPostsHelper.php:70
|
94 |
+
msgid "in a New Window"
|
|
|
95 |
msgstr ""
|
96 |
|
97 |
+
#: pro/app/helpers/PlpPostsHelper.php:70
|
98 |
+
msgid "visit"
|
|
|
|
|
99 |
msgstr ""
|
100 |
|
101 |
+
#: pro/app/helpers/PlpPostsHelper.php:76
|
102 |
+
msgid "A Pretty Link hasn't been generated for this entry yet. Click \"Update Post\" to generate."
|
|
|
|
|
103 |
msgstr ""
|
104 |
|
105 |
+
#: pro/app/helpers/PlpPublicLinksHelper.php:6
|
106 |
+
#: pro/app/controllers/PlpPublicLinksController.php:106
|
107 |
+
msgid "Enter a URL:"
|
108 |
msgstr ""
|
109 |
|
110 |
+
#: pro/app/helpers/PlpPublicLinksHelper.php:7
|
111 |
+
#: pro/app/controllers/PlpPublicLinksController.php:107
|
112 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:61
|
113 |
+
msgid "Shrink"
|
114 |
msgstr ""
|
115 |
|
116 |
+
#: pro/app/models/PlpUtils.php:36
|
117 |
+
msgid "Google Analyticator"
|
118 |
msgstr ""
|
119 |
|
120 |
+
#: pro/app/models/PlpUtils.php:39
|
121 |
+
msgid "Google Analytics by MonsterInsights"
|
|
|
122 |
msgstr ""
|
123 |
|
124 |
+
#: pro/app/models/PlpUtils.php:42
|
125 |
+
#: pro/app/views/links/bulk-edit.php:10
|
126 |
+
#: app/views/links/form_advanced.php:58
|
127 |
+
msgid "Google Analytics"
|
128 |
msgstr ""
|
129 |
|
130 |
+
#: pro/app/models/PlpOptions.php:99
|
131 |
+
msgid "Facebook"
|
132 |
msgstr ""
|
133 |
|
134 |
+
#: pro/app/models/PlpOptions.php:106
|
135 |
+
msgid "Twitter"
|
|
|
|
|
136 |
msgstr ""
|
137 |
|
138 |
+
#: pro/app/models/PlpOptions.php:113
|
139 |
+
msgid "Google+"
|
|
|
|
|
140 |
msgstr ""
|
141 |
|
142 |
+
#: pro/app/models/PlpOptions.php:120
|
143 |
+
msgid "Pinterest"
|
144 |
msgstr ""
|
145 |
|
146 |
+
#: pro/app/models/PlpOptions.php:127
|
147 |
+
msgid "LinkedIn"
|
148 |
msgstr ""
|
149 |
|
150 |
+
#: pro/app/models/PlpOptions.php:134
|
151 |
+
msgid "Reddit"
|
152 |
msgstr ""
|
153 |
|
154 |
+
#: pro/app/models/PlpOptions.php:141
|
155 |
+
msgid "StumbleUpon"
|
156 |
msgstr ""
|
157 |
|
158 |
+
#: pro/app/models/PlpOptions.php:148
|
159 |
+
msgid "Digg"
|
160 |
msgstr ""
|
161 |
|
162 |
+
#: pro/app/models/PlpOptions.php:155
|
163 |
+
#: app/controllers/PrliLinksController.php:506
|
164 |
+
msgid "Email"
|
165 |
msgstr ""
|
166 |
|
167 |
+
#: pro/app/models/PlpOptions.php:238
|
168 |
+
msgid "Affiliate Link Disclosures"
|
169 |
msgstr ""
|
170 |
|
171 |
+
#: pro/app/models/PlpOptions.php:247
|
172 |
+
msgid "(aff)"
|
173 |
msgstr ""
|
174 |
|
175 |
+
#: pro/app/models/PlpReport.php:150
|
176 |
+
msgid "Report must have a name."
|
177 |
msgstr ""
|
178 |
|
179 |
+
#: pro/app/models/PlpReport.php:154
|
180 |
+
msgid "At least one link must be selected for analysis."
|
181 |
msgstr ""
|
182 |
|
183 |
+
#: pro/app/models/PlpReport.php:259
|
184 |
+
msgid "Pretty Links Pro: Clicks for"
|
185 |
msgstr ""
|
186 |
|
187 |
+
#: pro/app/models/PlpReport.php:259
|
188 |
+
msgid "report between"
|
189 |
msgstr ""
|
190 |
|
191 |
+
#: pro/app/models/PlpReport.php:259
|
192 |
+
#: pro/app/models/PlpReport.php:400
|
193 |
+
#: app/models/PrliClick.php:251
|
194 |
+
msgid "and"
|
195 |
msgstr ""
|
196 |
|
197 |
+
#: pro/app/models/PlpReport.php:266
|
198 |
+
#: pro/app/models/PlpReport.php:275
|
199 |
+
#: app/views/clicks/list.php:101
|
200 |
+
#: app/views/clicks/list.php:184
|
201 |
+
msgid "Link"
|
202 |
msgstr ""
|
203 |
|
204 |
+
#: pro/app/models/PlpReport.php:266
|
205 |
+
#: pro/app/models/PlpReport.php:275
|
206 |
+
#: pro/app/models/PlpReport.php:412
|
207 |
+
#: pro/app/models/PlpReport.php:419
|
208 |
+
#: app/views/clicks/list.php:32
|
209 |
+
msgid "All Clicks"
|
210 |
msgstr ""
|
211 |
|
212 |
+
#: pro/app/models/PlpReport.php:266
|
213 |
+
#: pro/app/models/PlpReport.php:275
|
214 |
+
#: pro/app/models/PlpReport.php:412
|
215 |
+
#: pro/app/models/PlpReport.php:419
|
216 |
+
#: app/views/clicks/list.php:33
|
217 |
+
msgid "Unique Clicks"
|
218 |
msgstr ""
|
219 |
|
220 |
+
#: pro/app/models/PlpReport.php:266
|
221 |
+
#: pro/app/models/PlpReport.php:412
|
222 |
+
#: pro/app/views/reports/split-test-report.php:31
|
223 |
+
#: pro/app/views/reports/split-test-report.php:63
|
224 |
+
#: pro/app/views/reports/custom-report.php:34
|
225 |
+
#: pro/app/views/reports/custom-report.php:67
|
226 |
+
msgid "Conversions"
|
227 |
msgstr ""
|
228 |
|
229 |
+
#: pro/app/models/PlpReport.php:400
|
230 |
+
msgid "Pretty Links Pro: Split Report for"
|
|
|
231 |
msgstr ""
|
232 |
|
233 |
+
#: pro/app/models/PlpReport.php:400
|
234 |
+
#: app/models/PrliClick.php:251
|
235 |
+
msgid "between"
|
236 |
msgstr ""
|
237 |
|
238 |
+
#: pro/app/models/PlpReport.php:412
|
239 |
+
#: pro/app/models/PlpReport.php:419
|
240 |
+
#: pro/app/views/links/form.php:199
|
241 |
+
#: app/views/links/form_pro.php:95
|
242 |
+
msgid "Rotation"
|
243 |
msgstr ""
|
244 |
|
245 |
+
#: pro/app/views/links/link-options.php:3
|
246 |
+
#: pro/app/views/links/link-options.php:5
|
247 |
+
#: app/views/options/form.php:134
|
248 |
+
#: app/views/options/form.php:136
|
249 |
+
msgid "Base Slug Prefix"
|
250 |
msgstr ""
|
251 |
|
252 |
+
#. translators: %1$s: open b tag, %2$s close b tag
|
253 |
+
#: pro/app/views/links/link-options.php:8
|
254 |
+
#: app/views/options/form.php:139
|
255 |
+
msgid "Use this to prefix all newly generated pretty links with a directory of your choice. For example set to %1$sout%2$s to make your pretty links look like http://site.com/%1$sout%2$s/xyz. Changing this option will NOT affect existing pretty links. If you do not wish to use a directory prefix, leave this text field blank. Whatever you type here will be sanitized and modified to ensure it is URL-safe. So %1$sHello World%2$s might get changed to something like %1$shello-world%2$s instead. Lowercase letters, numbers, dashes, and underscores are allowed."
|
256 |
msgstr ""
|
257 |
|
258 |
+
#: pro/app/views/links/link-options.php:21
|
259 |
+
#: pro/app/views/links/link-options.php:23
|
260 |
+
#: app/views/options/form.php:153
|
261 |
+
#: app/views/options/form.php:155
|
262 |
+
msgid "Slug Character Count"
|
263 |
msgstr ""
|
264 |
|
265 |
+
#: pro/app/views/links/link-options.php:24
|
266 |
+
#: app/views/options/form.php:156
|
267 |
+
msgid "The number of characters to use when auto-generating a random slug for pretty links. The default is 4. You cannot use less than 2."
|
268 |
msgstr ""
|
269 |
|
270 |
+
#: pro/app/views/links/link-options.php:34
|
271 |
+
#: pro/app/views/links/link-options.php:35
|
272 |
+
#: app/views/options/form.php:167
|
273 |
+
#: app/views/options/form.php:168
|
274 |
+
msgid "Enable Google Analytics"
|
275 |
msgstr ""
|
276 |
|
277 |
+
#: pro/app/views/links/link-options.php:36
|
278 |
+
#: app/views/options/form.php:169
|
279 |
+
msgid "Requires Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast), or the Google Analytics Plugin to be installed and configured on your site."
|
|
|
280 |
msgstr ""
|
281 |
|
282 |
+
#. translators: %1s: open link tag, %2$s: close link tag
|
283 |
+
#: pro/app/views/links/link-options.php:50
|
284 |
+
msgid "Enable %1sQR Codes%2$s"
|
|
|
285 |
msgstr ""
|
286 |
|
287 |
+
#: pro/app/views/links/link-options.php:57
|
288 |
+
#: app/views/options/form.php:182
|
289 |
+
msgid "Generate QR Codes"
|
290 |
msgstr ""
|
291 |
|
292 |
+
#: pro/app/views/links/link-options.php:58
|
293 |
+
#: app/views/options/form.php:183
|
294 |
+
msgid "This will enable a link in your pretty link admin that will allow you to automatically download a QR Code for each individual Pretty Link."
|
295 |
msgstr ""
|
296 |
|
297 |
+
#: pro/app/views/links/link-options.php:68
|
298 |
+
#: pro/app/views/links/link-options.php:70
|
299 |
+
#: app/views/options/form.php:194
|
300 |
+
#: app/views/options/form.php:196
|
301 |
+
msgid "Global Head Scripts"
|
302 |
msgstr ""
|
303 |
|
304 |
+
#. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
|
305 |
+
#: pro/app/views/links/link-options.php:73
|
306 |
+
#: app/views/options/form.php:199
|
307 |
+
msgid "Useful for adding Google Analytics tracking, Facebook retargeting pixels, or any other kind of tracking script to the HTML head.%1$s%1$sWhat you enter in this box will be applied to all supported pretty links.%1$s%1$s%2$sNOTE:%3$s This does NOT work with 301, 302 and 307 type redirects."
|
308 |
msgstr ""
|
309 |
|
310 |
+
#: pro/app/views/links/form.php:6
|
311 |
+
#: app/views/links/form_pro.php:15
|
312 |
+
msgid "Expire"
|
313 |
msgstr ""
|
314 |
|
315 |
+
#: pro/app/views/links/form.php:9
|
316 |
+
#: app/views/links/form_pro.php:18
|
317 |
+
msgid "Expire Link"
|
318 |
msgstr ""
|
319 |
|
320 |
+
#: pro/app/views/links/form.php:10
|
321 |
+
#: app/views/links/form_pro.php:19
|
322 |
+
msgid "Set this link to expire after a specific date or number of clicks."
|
323 |
msgstr ""
|
324 |
|
325 |
+
#: pro/app/views/links/form.php:23
|
326 |
+
msgid "Expire After"
|
327 |
msgstr ""
|
328 |
|
329 |
+
#: pro/app/views/links/form.php:26
|
330 |
+
msgid "Expiration Type"
|
331 |
msgstr ""
|
332 |
|
333 |
+
#. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
|
334 |
+
#: pro/app/views/links/form.php:29
|
335 |
+
msgid "Select the type of expiration you want for this link.%1$s%1$s%2$sDate%3$s Select this option if you'd like to expire your link after a certain date.%1%s%1$s%2$sClicks%3$s: Select this option to expire this link after it has been clicked a specific number of times."
|
336 |
msgstr ""
|
337 |
|
338 |
+
#: pro/app/views/links/form.php:38
|
339 |
+
#: pro/app/views/links/form.php:73
|
340 |
+
#: app/models/PrliClick.php:256
|
341 |
+
#: app/controllers/PrliLinksController.php:410
|
342 |
+
msgid "Date"
|
343 |
msgstr ""
|
344 |
|
345 |
+
#: pro/app/views/links/form.php:52
|
346 |
+
msgid "Number of Clicks"
|
347 |
msgstr ""
|
348 |
|
349 |
+
#. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
|
350 |
+
#: pro/app/views/links/form.php:55
|
351 |
+
msgid "Enter the number of times this link can be clicked before it expires.%1$s%1$s%2$sNote: Expirations based on clicks wouldn't work properly if you had tracking turned off for this link so as long as this is set to Clicks, Pretty Link will ensure tracking is turned on for this link as well.%3$s"
|
352 |
msgstr ""
|
353 |
|
354 |
+
#: pro/app/views/links/form.php:76
|
355 |
+
msgid "Expiration Date"
|
356 |
msgstr ""
|
357 |
|
358 |
+
#: pro/app/views/links/form.php:77
|
359 |
+
msgid "Enter a date here in the format YYYY-MM-DD to set when this link should expire."
|
360 |
msgstr ""
|
361 |
|
362 |
+
#: pro/app/views/links/form.php:91
|
363 |
+
msgid "Expired Redirect"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
364 |
msgstr ""
|
365 |
|
366 |
+
#: pro/app/views/links/form.php:94
|
367 |
+
msgid "Redirect to URL when Expired"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
368 |
msgstr ""
|
369 |
|
370 |
+
#. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
|
371 |
+
#: pro/app/views/links/form.php:97
|
372 |
+
msgid "When this link expires, do you want to redirect to a specific URL. You can use this to redirect to a page you've setup to indicate that the link is expired.%1$s%1$s%2$sNote: If this is not set the link will throw a 404 error when expired%3$s."
|
|
|
|
|
|
|
|
|
|
|
|
|
373 |
msgstr ""
|
374 |
|
375 |
+
#: pro/app/views/links/form.php:114
|
376 |
+
#: pro/app/views/options/form.php:187
|
377 |
+
msgid "URL"
|
378 |
msgstr ""
|
379 |
|
380 |
+
#: pro/app/views/links/form.php:117
|
381 |
+
msgid "Expired URL"
|
|
|
382 |
msgstr ""
|
383 |
|
384 |
+
#: pro/app/views/links/form.php:118
|
385 |
+
msgid "This is the URL that this link will redirect to after the expiration date above."
|
386 |
msgstr ""
|
387 |
|
388 |
+
#: pro/app/views/links/form.php:133
|
389 |
+
#: app/views/links/form_pro.php:30
|
390 |
+
#: app/controllers/PrliLinksController.php:372
|
391 |
+
msgid "Keywords"
|
392 |
msgstr ""
|
393 |
|
394 |
+
#: pro/app/views/links/form.php:136
|
395 |
+
#: app/views/links/form_pro.php:33
|
396 |
+
msgid "Auto-Replace Keywords"
|
397 |
msgstr ""
|
398 |
|
399 |
+
#: pro/app/views/links/form.php:137
|
400 |
+
msgid "Enter a comma separated list of keywords / keyword phrases that you'd like to replace with this link in your Posts & Pages."
|
401 |
msgstr ""
|
402 |
|
403 |
+
#: pro/app/views/links/form.php:145
|
404 |
+
#: app/views/links/form_pro.php:44
|
405 |
+
msgid "URL Replacements"
|
406 |
msgstr ""
|
407 |
|
408 |
+
#: pro/app/views/links/form.php:148
|
409 |
+
#: app/views/links/form_pro.php:47
|
410 |
+
msgid "Auto-Replace URLs"
|
411 |
msgstr ""
|
412 |
|
413 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
414 |
+
#: pro/app/views/links/form.php:151
|
415 |
+
msgid "Enter a comma separated list of the URLs that you'd like to replace with this Pretty Link in your Posts & Pages. These must be formatted as URLs for example: %1$shttp://example.com%2$s or %1$shttp://example.com?product_id=53%2$s"
|
416 |
msgstr ""
|
417 |
|
418 |
+
#: pro/app/views/links/form.php:167
|
419 |
+
#: pro/app/views/links/form.php:170
|
420 |
+
#: app/views/links/form_pro.php:64
|
421 |
+
#: app/views/links/form_pro.php:67
|
422 |
+
msgid "Head Scripts"
|
|
|
423 |
msgstr ""
|
424 |
|
425 |
+
#. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
|
426 |
+
#: pro/app/views/links/form.php:173
|
427 |
+
#: app/views/links/form_pro.php:70
|
428 |
+
msgid "Useful for adding Google Analytics tracking, Facebook retargeting pixels, or any other kind of tracking script to the HTML head for this pretty link.%1$s%1$sThese scripts will be in addition to any global one's you've defined in the options.%1$s%1$s%2$sNOTE:%3$s This does NOT work with 301, 302 and 307 type redirects."
|
429 |
msgstr ""
|
430 |
|
431 |
+
#: pro/app/views/links/form.php:189
|
432 |
+
#: app/views/links/form_pro.php:84
|
433 |
+
msgid "Dynamic Redirection"
|
434 |
msgstr ""
|
435 |
|
436 |
+
#: pro/app/views/links/form.php:192
|
437 |
+
#: app/views/links/form_pro.php:87
|
438 |
+
msgid "Dynamic Redirection Options"
|
439 |
msgstr ""
|
440 |
|
441 |
+
#: pro/app/views/links/form.php:193
|
442 |
+
#: app/views/links/form_pro.php:88
|
443 |
+
msgid "These powerful options are available to give you dynamic control over redirection for this pretty link."
|
444 |
msgstr ""
|
445 |
|
446 |
+
#: pro/app/views/links/form.php:198
|
447 |
+
#: pro/app/views/options/form.php:812
|
448 |
+
#: pro/app/views/options/autocreate.php:44
|
449 |
+
#: pro/app/views/tools/generator.php:37
|
450 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:94
|
451 |
+
#: app/views/links/form_pro.php:94
|
452 |
+
#: app/views/shared/tinymce_form_popup.php:75
|
453 |
+
#: app/views/shared/tinymce_form_popup.php:79
|
454 |
+
#: app/views/options/form.php:948
|
455 |
+
msgid "None"
|
456 |
msgstr ""
|
457 |
|
458 |
+
#: pro/app/views/links/form.php:200
|
459 |
+
#: app/views/links/form_pro.php:96
|
460 |
+
msgid "Geographic"
|
461 |
msgstr ""
|
462 |
|
463 |
+
#: pro/app/views/links/form.php:201
|
464 |
+
#: app/views/links/form_pro.php:97
|
465 |
+
msgid "Technology"
|
466 |
msgstr ""
|
467 |
|
468 |
+
#: pro/app/views/links/form.php:202
|
469 |
+
#: app/views/links/form_pro.php:98
|
470 |
+
msgid "Time"
|
471 |
msgstr ""
|
472 |
|
473 |
+
#: pro/app/views/links/form.php:211
|
474 |
+
#: pro/app/views/links/form.php:214
|
475 |
+
msgid "Target URL Rotations"
|
476 |
msgstr ""
|
477 |
|
478 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
479 |
+
#: pro/app/views/links/form.php:217
|
480 |
+
msgid "Enter the Target URLs that you'd like to rotate through when this Pretty Link is Clicked. These must be formatted as URLs example: %1$shttp://example.com%2$s or %1$shttp://example.com?product_id=53%2$s"
|
481 |
msgstr ""
|
482 |
|
483 |
+
#: pro/app/views/links/form.php:225
|
484 |
+
msgid "Target URL (above)"
|
485 |
msgstr ""
|
486 |
|
487 |
+
#: pro/app/views/links/form.php:237
|
488 |
+
msgid "Add Link Rotation"
|
489 |
msgstr ""
|
490 |
|
491 |
+
#: pro/app/views/links/form.php:242
|
492 |
+
msgid "Split Test"
|
493 |
msgstr ""
|
494 |
|
495 |
+
#: pro/app/views/links/form.php:245
|
496 |
+
msgid "Split Test This Link"
|
497 |
msgstr ""
|
498 |
|
499 |
+
#: pro/app/views/links/form.php:246
|
500 |
+
msgid "Split testing will enable you to track the effectiveness of several links against each other. This works best when you have multiple link rotation URLs entered."
|
501 |
msgstr ""
|
502 |
|
503 |
+
#: pro/app/views/links/form.php:260
|
504 |
+
#: pro/app/views/reports/list.php:37
|
505 |
+
#: pro/app/views/reports/list.php:87
|
506 |
+
msgid "Goal Link"
|
507 |
msgstr ""
|
508 |
|
509 |
+
#: pro/app/views/links/form.php:263
|
510 |
+
msgid "Goal Link for Split Test"
|
511 |
msgstr ""
|
512 |
|
513 |
+
#: pro/app/views/links/form.php:264
|
514 |
+
msgid "This is the goal link for your split test."
|
515 |
msgstr ""
|
516 |
|
517 |
+
#: pro/app/views/links/form.php:275
|
518 |
+
msgid "id: %1$s | slug: %3$s | name: %2$s"
|
519 |
msgstr ""
|
520 |
|
521 |
+
#: pro/app/views/links/form.php:293
|
522 |
+
#: pro/app/views/links/form.php:296
|
523 |
+
msgid "Geographic Redirects"
|
524 |
msgstr ""
|
525 |
|
526 |
+
#: pro/app/views/links/form.php:297
|
527 |
+
msgid "This will enable you to setup specific target urls that this pretty link will redirect to based on the country of the person visiting the url."
|
528 |
msgstr ""
|
529 |
|
530 |
+
#: pro/app/views/links/form.php:302
|
531 |
+
#: pro/app/views/links/form.php:316
|
532 |
+
#: pro/app/views/links/form.php:336
|
533 |
+
msgid "Add"
|
534 |
msgstr ""
|
535 |
|
536 |
+
#: pro/app/views/links/form.php:307
|
537 |
+
#: pro/app/views/links/form.php:310
|
538 |
+
msgid "Technology Redirects"
|
|
|
539 |
msgstr ""
|
540 |
|
541 |
+
#: pro/app/views/links/form.php:311
|
542 |
+
msgid "This will allow you to redirect based on your visitor's device, operating system and/or browser"
|
543 |
msgstr ""
|
544 |
|
545 |
+
#: pro/app/views/links/form.php:321
|
546 |
+
#: pro/app/views/links/form.php:324
|
547 |
+
msgid "Time Period Redirects"
|
|
|
548 |
msgstr ""
|
549 |
|
550 |
+
#. translators: %1$s: br tag, %2$s: open b tag, %3$s close b tag
|
551 |
+
#: pro/app/views/links/form.php:327
|
552 |
+
msgid "This will allow you to redirect based on the time period in which your visitor visits this link.%1$s%1$s%2$sNote: If your visitor doesn't visit the link during any of the specified time periods set here, they'll simply be redirected to the main target url.%3$s"
|
553 |
msgstr ""
|
554 |
|
555 |
+
#: pro/app/views/links/bulk-edit.php:6
|
556 |
+
msgid "Advanced Link Options"
|
557 |
msgstr ""
|
558 |
|
559 |
+
#: pro/app/views/links/cloaked-redirect.php:19
|
560 |
+
msgid "Your browser does not support frames."
|
561 |
msgstr ""
|
562 |
|
563 |
+
#: pro/app/views/links/link-has-expired.php:9
|
564 |
+
msgid "Link Not Found"
|
565 |
msgstr ""
|
566 |
|
567 |
+
#: pro/app/views/links/link-has-expired.php:23
|
568 |
+
msgid "Sorry, this link has expired"
|
569 |
msgstr ""
|
570 |
|
571 |
+
#: pro/app/views/links/time_row.php:13
|
572 |
+
msgid "Start Time:"
|
573 |
msgstr ""
|
574 |
|
575 |
+
#: pro/app/views/links/time_row.php:16
|
576 |
+
msgid "Start of Time Period"
|
577 |
msgstr ""
|
578 |
|
579 |
+
#: pro/app/views/links/time_row.php:17
|
580 |
+
msgid "This is where you'll enter the beginning of the time period for this redirect"
|
581 |
msgstr ""
|
582 |
|
583 |
+
#: pro/app/views/links/time_row.php:26
|
584 |
+
msgid "End Time:"
|
585 |
msgstr ""
|
586 |
|
587 |
+
#: pro/app/views/links/time_row.php:29
|
588 |
+
msgid "End of Time Period"
|
589 |
msgstr ""
|
590 |
|
591 |
+
#: pro/app/views/links/time_row.php:30
|
592 |
+
msgid "This is where you'll enter the end of the time period for this redirect"
|
593 |
msgstr ""
|
594 |
|
595 |
+
#: pro/app/views/links/time_row.php:39
|
596 |
+
#: pro/app/views/links/tech_row.php:85
|
597 |
+
#: pro/app/views/links/geo_row.php:25
|
598 |
+
msgid "URL:"
|
599 |
msgstr ""
|
600 |
|
601 |
+
#: pro/app/views/links/time_row.php:42
|
602 |
+
msgid "Time Period Redirect URL"
|
|
|
603 |
msgstr ""
|
604 |
|
605 |
+
#: pro/app/views/links/time_row.php:43
|
606 |
+
msgid "This is the URL that this Pretty Link will redirect to when the visitor visits the link in the associated time period."
|
607 |
msgstr ""
|
608 |
|
609 |
+
#: pro/app/views/links/time_row.php:52
|
610 |
+
#: pro/app/views/links/tech_row.php:98
|
611 |
+
#: pro/app/views/links/geo_row.php:38
|
612 |
+
msgid "Remove"
|
613 |
msgstr ""
|
614 |
|
615 |
+
#: pro/app/views/links/tech_row.php:14
|
616 |
+
msgid "Device:"
|
617 |
msgstr ""
|
618 |
|
619 |
+
#: pro/app/views/links/tech_row.php:17
|
620 |
+
msgid "Technology Redirection Device"
|
621 |
msgstr ""
|
622 |
|
623 |
+
#. translators: %1$s: open b tag, %2$s: close b tag, %3$s: br tag
|
624 |
+
#: pro/app/views/links/tech_row.php:20
|
625 |
+
msgid "%1$sDesktop%2$s will match on any conventional laptop or desktop computer.%3$s%3$s%1$sMobile%2$s will match on any phone, tablet or other portable device.%3$s%3$s%1$sPhone%2$s will match on any phone or similarly small device.%3$s%3$s%1$sTablet%2$s will match on any tablet sized device."
|
|
|
626 |
msgstr ""
|
627 |
|
628 |
+
#: pro/app/views/links/tech_row.php:29
|
629 |
+
#: pro/app/views/links/tech_row.php:48
|
630 |
+
#: pro/app/views/links/tech_row.php:68
|
631 |
+
msgid "Any"
|
632 |
msgstr ""
|
633 |
|
634 |
+
#: pro/app/views/links/tech_row.php:30
|
635 |
+
msgid "Desktop"
|
|
|
|
|
|
|
|
|
636 |
msgstr ""
|
637 |
|
638 |
+
#: pro/app/views/links/tech_row.php:31
|
639 |
+
msgid "Mobile"
|
640 |
msgstr ""
|
641 |
|
642 |
+
#: pro/app/views/links/tech_row.php:32
|
643 |
+
msgid "Phone"
|
644 |
msgstr ""
|
645 |
|
646 |
+
#: pro/app/views/links/tech_row.php:33
|
647 |
+
msgid "Tablet"
|
648 |
msgstr ""
|
649 |
|
650 |
+
#: pro/app/views/links/tech_row.php:39
|
651 |
+
msgid "Operating System:"
|
|
|
|
|
652 |
msgstr ""
|
653 |
|
654 |
+
#: pro/app/views/links/tech_row.php:42
|
655 |
+
msgid "Technology Redirection OS"
|
656 |
msgstr ""
|
657 |
|
658 |
+
#: pro/app/views/links/tech_row.php:43
|
659 |
+
msgid "Use this dropdown to select which Operating System this redirect will match on."
|
660 |
msgstr ""
|
661 |
|
662 |
+
#: pro/app/views/links/tech_row.php:49
|
663 |
+
#: pro/app/views/links/tech_row.php:70
|
664 |
+
msgid "Android"
|
665 |
msgstr ""
|
666 |
|
667 |
+
#: pro/app/views/links/tech_row.php:50
|
668 |
+
msgid "iOS"
|
669 |
msgstr ""
|
670 |
|
671 |
+
#: pro/app/views/links/tech_row.php:51
|
672 |
+
msgid "Linux"
|
673 |
msgstr ""
|
674 |
|
675 |
+
#: pro/app/views/links/tech_row.php:52
|
676 |
+
msgid "Mac"
|
677 |
msgstr ""
|
678 |
|
679 |
+
#: pro/app/views/links/tech_row.php:53
|
680 |
+
msgid "Windows"
|
|
|
681 |
msgstr ""
|
682 |
|
683 |
+
#: pro/app/views/links/tech_row.php:59
|
684 |
+
msgid "Browser:"
|
|
|
685 |
msgstr ""
|
686 |
|
687 |
+
#: pro/app/views/links/tech_row.php:62
|
688 |
+
msgid "Technology Redirection Browser"
|
|
|
689 |
msgstr ""
|
690 |
|
691 |
+
#: pro/app/views/links/tech_row.php:63
|
692 |
+
msgid "Use this dropdown to select which Browser this redirect will match on."
|
|
|
693 |
msgstr ""
|
694 |
|
695 |
+
#: pro/app/views/links/tech_row.php:69
|
696 |
+
msgid "Amazon Silk"
|
|
|
697 |
msgstr ""
|
698 |
|
699 |
+
#: pro/app/views/links/tech_row.php:71
|
700 |
+
msgid "Chrome"
|
|
|
701 |
msgstr ""
|
702 |
|
703 |
+
#: pro/app/views/links/tech_row.php:72
|
704 |
+
msgid "Chromium"
|
|
|
|
|
|
|
705 |
msgstr ""
|
706 |
|
707 |
+
#: pro/app/views/links/tech_row.php:73
|
708 |
+
msgid "Edge"
|
|
|
709 |
msgstr ""
|
710 |
|
711 |
+
#: pro/app/views/links/tech_row.php:74
|
712 |
+
msgid "Firefox"
|
713 |
msgstr ""
|
714 |
|
715 |
+
#: pro/app/views/links/tech_row.php:75
|
716 |
+
msgid "Internet Explorer"
|
717 |
msgstr ""
|
718 |
|
719 |
+
#: pro/app/views/links/tech_row.php:76
|
720 |
+
msgid "Kindle"
|
|
|
721 |
msgstr ""
|
722 |
|
723 |
+
#: pro/app/views/links/tech_row.php:77
|
724 |
+
msgid "Opera"
|
|
|
|
|
725 |
msgstr ""
|
726 |
|
727 |
+
#: pro/app/views/links/tech_row.php:78
|
728 |
+
msgid "Opera Coast"
|
|
|
729 |
msgstr ""
|
730 |
|
731 |
+
#: pro/app/views/links/tech_row.php:79
|
732 |
+
msgid "Safari"
|
|
|
|
|
733 |
msgstr ""
|
734 |
|
735 |
+
#: pro/app/views/links/tech_row.php:88
|
736 |
+
msgid "Technology Redirection URL"
|
|
|
|
|
737 |
msgstr ""
|
738 |
|
739 |
+
#: pro/app/views/links/tech_row.php:89
|
740 |
+
msgid "This is the URL that this Pretty Link will redirect to if the visitor's device, os and browser match the settings here."
|
|
|
|
|
741 |
msgstr ""
|
742 |
|
743 |
+
#: pro/app/views/links/prettybar.php:46
|
744 |
+
msgid "You're viewing: %s"
|
745 |
msgstr ""
|
746 |
|
747 |
+
#: pro/app/views/links/prettybar.php:46
|
748 |
+
msgid "Viewing: %s"
|
|
|
|
|
749 |
msgstr ""
|
750 |
|
751 |
+
#: pro/app/views/links/prettybar.php:51
|
752 |
+
msgid "Share on Twitter"
|
|
|
|
|
753 |
msgstr ""
|
754 |
|
755 |
+
#: pro/app/views/links/prettybar.php:68
|
756 |
+
msgid "Powered by"
|
|
|
|
|
|
|
757 |
msgstr ""
|
758 |
|
759 |
+
#: pro/app/views/links/geo_row.php:12
|
760 |
+
msgid "Countries:"
|
|
|
|
|
761 |
msgstr ""
|
762 |
|
763 |
+
#: pro/app/views/links/geo_row.php:15
|
764 |
+
msgid "Technology Redirection Countries"
|
|
|
|
|
765 |
msgstr ""
|
766 |
|
767 |
+
#: pro/app/views/links/geo_row.php:16
|
768 |
+
msgid "This is a comma-separated list of countries that this redirect will match on. Just start typing a country's name and an autocomplete dropdown will appear to select from. Once a country is selected, feel free to start typing the name of another country. You can add as many as you'd like this redirect to match on"
|
769 |
msgstr ""
|
770 |
|
771 |
+
#: pro/app/views/links/geo_row.php:28
|
772 |
+
msgid "Geographic Redirection URL"
|
773 |
msgstr ""
|
774 |
|
775 |
+
#: pro/app/views/links/geo_row.php:29
|
776 |
+
msgid "This is the URL that this Pretty Link will redirect to if the visitor's country match the settings here."
|
777 |
msgstr ""
|
778 |
|
779 |
+
#: pro/app/views/public/form.php:28
|
780 |
+
msgid "ERROR:"
|
781 |
msgstr ""
|
782 |
|
783 |
+
#: pro/app/views/reports/edit.php:7
|
784 |
+
msgid "Edit Link Report"
|
785 |
msgstr ""
|
786 |
|
787 |
+
#: pro/app/views/reports/edit.php:18
|
788 |
+
#: app/views/groups/edit.php:21
|
789 |
+
msgid "Name:"
|
790 |
msgstr ""
|
791 |
|
792 |
+
#: pro/app/views/reports/edit.php:20
|
793 |
+
#: pro/app/views/reports/new.php:19
|
794 |
+
msgid "This is how you'll identify your Report."
|
795 |
msgstr ""
|
796 |
|
797 |
+
#: pro/app/views/reports/edit.php:26
|
798 |
+
#: pro/app/views/reports/new.php:26
|
799 |
+
msgid "Select Links to Analyze in this Report:"
|
800 |
msgstr ""
|
801 |
|
802 |
+
#: pro/app/views/reports/edit.php:36
|
803 |
+
#: pro/app/views/reports/new.php:36
|
804 |
+
msgid "Select some links to be analyzed in this report."
|
805 |
msgstr ""
|
806 |
|
807 |
+
#: pro/app/views/reports/edit.php:39
|
808 |
+
#: pro/app/views/reports/new.php:39
|
809 |
+
msgid "Select Your Goal Link (optional):"
|
810 |
msgstr ""
|
811 |
|
812 |
+
#: pro/app/views/reports/edit.php:44
|
813 |
+
#: pro/app/views/reports/list.php:32
|
814 |
+
#: pro/app/views/reports/list.php:86
|
815 |
+
#: pro/app/views/reports/new.php:44
|
816 |
+
#: app/views/groups/edit.php:36
|
817 |
+
#: app/views/groups/list.php:41
|
818 |
+
#: app/views/groups/list.php:93
|
819 |
+
#: app/views/groups/new.php:37
|
820 |
+
msgid "Name"
|
821 |
msgstr ""
|
822 |
|
823 |
+
#: pro/app/views/reports/edit.php:60
|
824 |
+
#: pro/app/views/reports/new.php:60
|
825 |
+
msgid "If you want to enable conversion tracking in this report then select a goal link."
|
|
|
826 |
msgstr ""
|
827 |
|
828 |
+
#: pro/app/views/reports/edit.php:66
|
829 |
+
#: app/views/options/form.php:999
|
830 |
+
#: app/views/groups/edit.php:72
|
831 |
+
#: app/controllers/PrliAppController.php:377
|
832 |
+
msgid "Update"
|
833 |
msgstr ""
|
834 |
|
835 |
+
#: pro/app/views/reports/edit.php:66
|
836 |
+
#: pro/app/views/reports/split-test-report.php:19
|
837 |
+
#: pro/app/views/reports/custom-report.php:22
|
838 |
+
#: pro/app/views/reports/new.php:66
|
839 |
+
#: app/views/groups/edit.php:72
|
840 |
+
#: app/views/groups/new.php:71
|
841 |
+
#: app/views/clicks/list.php:43
|
842 |
+
msgid "Cancel"
|
843 |
msgstr ""
|
844 |
|
845 |
+
#: pro/app/views/reports/list.php:4
|
846 |
+
#: pro/app/views/reports/reports.php:7
|
847 |
+
msgid "Link Reports"
|
|
|
|
|
|
|
848 |
msgstr ""
|
849 |
|
850 |
+
#: pro/app/views/reports/list.php:5
|
851 |
+
msgid "Add Report"
|
852 |
msgstr ""
|
853 |
|
854 |
+
#: pro/app/views/reports/list.php:18
|
855 |
+
#: app/views/groups/list.php:20
|
856 |
+
msgid "Search"
|
857 |
msgstr ""
|
858 |
|
859 |
+
#: pro/app/views/reports/list.php:20
|
860 |
+
#: app/views/groups/list.php:24
|
861 |
+
#: app/views/clicks/list.php:64
|
862 |
+
#: app/controllers/PrliLinksController.php:502
|
863 |
+
msgid "Reset"
|
864 |
msgstr ""
|
865 |
|
866 |
+
#: pro/app/views/reports/list.php:42
|
867 |
+
#: pro/app/views/reports/list.php:88
|
868 |
+
#: app/views/options/form.php:51
|
869 |
+
#: app/views/groups/list.php:46
|
870 |
+
#: app/views/groups/list.php:80
|
871 |
+
#: app/views/groups/list.php:94
|
872 |
+
msgid "Links"
|
873 |
msgstr ""
|
874 |
|
875 |
+
#: pro/app/views/reports/list.php:47
|
876 |
+
#: pro/app/views/reports/list.php:89
|
877 |
+
#: app/views/groups/list.php:51
|
878 |
+
#: app/views/groups/list.php:95
|
879 |
+
msgid "Created"
|
880 |
msgstr ""
|
881 |
|
882 |
+
#: pro/app/views/reports/list.php:57
|
883 |
+
msgid "No Pretty Link Reports were found"
|
884 |
msgstr ""
|
885 |
|
886 |
+
#: pro/app/views/reports/list.php:68
|
887 |
+
#: pro/app/views/reports/list.php:71
|
888 |
+
#: app/helpers/PrliLinksHelper.php:67
|
889 |
+
#: app/views/groups/list.php:75
|
890 |
+
#: app/views/groups/list.php:78
|
891 |
+
msgid "Edit %s"
|
892 |
msgstr ""
|
893 |
|
894 |
+
#: pro/app/views/reports/list.php:71
|
895 |
+
#: app/views/groups/list.php:78
|
896 |
+
msgid "Edit"
|
897 |
msgstr ""
|
898 |
|
899 |
+
#: pro/app/views/reports/list.php:72
|
900 |
+
msgid "Are you sure you want to delete your %s Pretty Link Report?"
|
901 |
msgstr ""
|
902 |
|
903 |
+
#: pro/app/views/reports/list.php:72
|
904 |
+
#: app/helpers/PrliLinksHelper.php:68
|
905 |
+
#: app/views/groups/list.php:79
|
906 |
+
msgid "Delete %s"
|
907 |
msgstr ""
|
908 |
|
909 |
+
#: pro/app/views/reports/list.php:72
|
910 |
+
#: app/views/groups/list.php:79
|
911 |
+
msgid "Delete"
|
|
|
912 |
msgstr ""
|
913 |
|
914 |
+
#: pro/app/views/reports/list.php:73
|
915 |
+
msgid "View report for %s"
|
916 |
msgstr ""
|
917 |
|
918 |
+
#: pro/app/views/reports/list.php:73
|
919 |
+
msgid "View"
|
920 |
msgstr ""
|
921 |
|
922 |
+
#: pro/app/views/reports/split-test-report.php:4
|
923 |
+
msgid "Link Split-Test Report"
|
924 |
msgstr ""
|
925 |
|
926 |
+
#: pro/app/views/reports/split-test-report.php:5
|
927 |
+
msgid "For Link:"
|
928 |
msgstr ""
|
929 |
|
930 |
+
#: pro/app/views/reports/split-test-report.php:7
|
931 |
+
msgid "Goal Link:"
|
932 |
msgstr ""
|
933 |
|
934 |
+
#: pro/app/views/reports/split-test-report.php:9
|
935 |
+
#: app/views/clicks/list.php:18
|
936 |
+
msgid "Back to Links"
|
937 |
msgstr ""
|
938 |
|
939 |
+
#: pro/app/views/reports/split-test-report.php:9
|
940 |
+
#: pro/app/views/reports/custom-report.php:12
|
941 |
+
#: app/views/clicks/list.php:11
|
942 |
+
msgid "Customize Report"
|
943 |
msgstr ""
|
944 |
|
945 |
+
#: pro/app/views/reports/split-test-report.php:13
|
946 |
+
#: pro/app/views/reports/custom-report.php:16
|
947 |
+
#: app/views/clicks/list.php:37
|
948 |
+
msgid "Date Range:"
|
949 |
msgstr ""
|
950 |
|
951 |
+
#: pro/app/views/reports/split-test-report.php:19
|
952 |
+
#: pro/app/views/reports/custom-report.php:22
|
953 |
+
#: app/views/clicks/list.php:43
|
954 |
+
msgid "Customize"
|
955 |
msgstr ""
|
956 |
|
957 |
+
#: pro/app/views/reports/split-test-report.php:27
|
958 |
+
msgid "Link Rotation URL"
|
959 |
msgstr ""
|
960 |
|
961 |
+
#: pro/app/views/reports/split-test-report.php:32
|
962 |
+
#: pro/app/views/reports/split-test-report.php:64
|
963 |
+
#: pro/app/views/reports/custom-report.php:35
|
964 |
+
#: pro/app/views/reports/custom-report.php:68
|
965 |
+
msgid "Conv Rate"
|
966 |
msgstr ""
|
967 |
|
968 |
+
#: pro/app/views/reports/split-test-report.php:59
|
969 |
+
msgid "Rotation URL"
|
|
|
970 |
msgstr ""
|
971 |
|
972 |
+
#: pro/app/views/reports/custom-report.php:7
|
973 |
+
msgid "Link Report"
|
974 |
msgstr ""
|
975 |
|
976 |
+
#: pro/app/views/reports/custom-report.php:8
|
977 |
+
msgid "Report:"
|
978 |
msgstr ""
|
979 |
|
980 |
+
#: pro/app/views/reports/custom-report.php:10
|
981 |
+
msgid "For Goal Link:"
|
982 |
msgstr ""
|
983 |
|
984 |
+
#: pro/app/views/reports/custom-report.php:30
|
985 |
+
#: pro/app/views/reports/custom-report.php:63
|
986 |
+
msgid "Link Name"
|
|
|
987 |
msgstr ""
|
988 |
|
989 |
+
#: pro/app/views/reports/reports.php:4
|
990 |
+
#: pro/app/controllers/PlpReportsController.php:15
|
991 |
+
msgid "Reports"
|
|
|
992 |
msgstr ""
|
993 |
|
994 |
+
#: pro/app/views/reports/new.php:7
|
995 |
+
msgid "Add Link Report"
|
|
|
996 |
msgstr ""
|
997 |
|
998 |
+
#: pro/app/views/reports/new.php:17
|
999 |
+
#: app/views/groups/new.php:22
|
1000 |
+
msgid "Name*:"
|
1001 |
msgstr ""
|
1002 |
|
1003 |
+
#: pro/app/views/reports/new.php:66
|
1004 |
+
#: app/views/groups/new.php:71
|
1005 |
+
#: app/views/widgets/widget.php:21
|
1006 |
+
msgid "Create"
|
|
|
|
|
1007 |
msgstr ""
|
1008 |
|
1009 |
+
#: pro/app/views/options/form.php:4
|
1010 |
+
#: app/views/options/form.php:305
|
1011 |
+
msgid "Keyword & URL Auto Replacements Options"
|
1012 |
msgstr ""
|
1013 |
|
1014 |
+
#: pro/app/views/options/form.php:13
|
1015 |
+
#: app/views/options/form.php:312
|
1016 |
+
msgid "Enable Replacements"
|
1017 |
msgstr ""
|
1018 |
|
1019 |
+
#: pro/app/views/options/form.php:15
|
1020 |
+
#: app/views/options/form.php:314
|
1021 |
+
msgid "Enable Keyword and URL Auto Replacement"
|
1022 |
msgstr ""
|
1023 |
|
1024 |
+
#: pro/app/views/options/form.php:16
|
1025 |
+
#: app/views/options/form.php:315
|
1026 |
+
msgid "If checked, this will enable you to automatically replace keywords and/or URLs on your blog with pretty links. You will specify the specific keywords and urls from your Pretty Link edit page."
|
1027 |
msgstr ""
|
1028 |
|
1029 |
+
#: pro/app/views/options/form.php:34
|
1030 |
+
#: app/views/options/form.php:334
|
1031 |
+
msgid "Thresholds"
|
1032 |
msgstr ""
|
1033 |
|
1034 |
+
#: pro/app/views/options/form.php:36
|
1035 |
+
#: app/views/options/form.php:336
|
1036 |
+
msgid "Set Keyword Replacement Thresholds"
|
1037 |
msgstr ""
|
1038 |
|
1039 |
+
#: pro/app/views/options/form.php:37
|
1040 |
+
#: app/views/options/form.php:337
|
1041 |
+
msgid "Don't want to have too many keyword replacements per page? Select to set some reasonable keyword replacement thresholds."
|
1042 |
msgstr ""
|
1043 |
|
1044 |
+
#: pro/app/views/options/form.php:54
|
1045 |
+
msgid "Max Keywords"
|
1046 |
msgstr ""
|
1047 |
|
1048 |
+
#: pro/app/views/options/form.php:56
|
1049 |
+
msgid "Set Maximum Keywords per Page"
|
1050 |
msgstr ""
|
1051 |
|
1052 |
+
#: pro/app/views/options/form.php:57
|
1053 |
+
msgid "Maximum number of unique keyword / keyphrases you can replace with Pretty Links per page."
|
|
|
1054 |
msgstr ""
|
1055 |
|
1056 |
+
#: pro/app/views/options/form.php:68
|
1057 |
+
msgid "Max Replacements"
|
1058 |
msgstr ""
|
1059 |
|
1060 |
+
#: pro/app/views/options/form.php:70
|
1061 |
+
msgid "Set Maximum Replacements per Keyword"
|
1062 |
msgstr ""
|
1063 |
|
1064 |
+
#: pro/app/views/options/form.php:71
|
1065 |
+
msgid "Maximum number of Pretty Link replacements per Keyword / Keyphrase."
|
1066 |
msgstr ""
|
1067 |
|
1068 |
+
#: pro/app/views/options/form.php:87
|
1069 |
+
#: app/views/options/form.php:353
|
1070 |
+
msgid "Open in New Window"
|
1071 |
msgstr ""
|
1072 |
|
1073 |
+
#: pro/app/views/options/form.php:89
|
1074 |
+
#: app/views/options/form.php:355
|
1075 |
+
msgid "Open Keyword Replacement Links in New Window"
|
1076 |
msgstr ""
|
1077 |
|
1078 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
1079 |
+
#: pro/app/views/options/form.php:92
|
1080 |
+
#: app/views/options/form.php:358
|
1081 |
+
msgid "Ensure that these keyword replacement links are opened in a separate window. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements."
|
1082 |
msgstr ""
|
1083 |
|
1084 |
+
#: pro/app/views/options/form.php:106
|
1085 |
+
#: app/views/options/form.php:373
|
1086 |
+
msgid "Add No Follows"
|
1087 |
msgstr ""
|
1088 |
|
1089 |
+
#: pro/app/views/options/form.php:108
|
1090 |
+
#: app/views/options/form.php:375
|
1091 |
+
msgid "Add 'nofollow' attribute to all Keyword Pretty Links"
|
1092 |
msgstr ""
|
1093 |
|
1094 |
+
#. translators: %1$s: open code tag, %2$s: close code tag, %3$s: open strong tag, %4$s close strong tag
|
1095 |
+
#: pro/app/views/options/form.php:111
|
1096 |
+
#: app/views/options/form.php:378
|
1097 |
+
msgid "This adds the html %1$sNOFOLLOW%2$s attribute to all keyword replacement links. %3$sNote:%4$s This does not apply to url replacements--only keyword replacements."
|
1098 |
msgstr ""
|
1099 |
|
1100 |
+
#: pro/app/views/options/form.php:127
|
1101 |
+
#: app/views/options/form.php:395
|
1102 |
+
msgid "Custom CSS"
|
1103 |
msgstr ""
|
1104 |
|
1105 |
+
#: pro/app/views/options/form.php:129
|
1106 |
+
#: app/views/options/form.php:397
|
1107 |
+
msgid "Add custom CSS to your keyword replacement links"
|
|
|
|
|
|
|
1108 |
msgstr ""
|
1109 |
|
1110 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
1111 |
+
#: pro/app/views/options/form.php:132
|
1112 |
+
#: app/views/options/form.php:400
|
1113 |
+
msgid "Add some custom formatting to your keyword pretty link replacements. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements."
|
1114 |
msgstr ""
|
1115 |
|
1116 |
+
#: pro/app/views/options/form.php:146
|
1117 |
+
#: app/views/options/form.php:415
|
1118 |
+
msgid "Custom Hover CSS"
|
|
|
1119 |
msgstr ""
|
1120 |
|
1121 |
+
#: pro/app/views/options/form.php:148
|
1122 |
+
#: app/views/options/form.php:417
|
1123 |
+
msgid "Add custom hover CSS to your keyword replacement links"
|
|
|
1124 |
msgstr ""
|
1125 |
|
1126 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
1127 |
+
#: pro/app/views/options/form.php:151
|
1128 |
+
#: app/views/options/form.php:420
|
1129 |
+
msgid "Add some custom formatting to the hover attribute of your keyword pretty links. %1$sNote%2$s: This does not apply to url replacements--only keyword replacements."
|
1130 |
msgstr ""
|
1131 |
|
1132 |
+
#: pro/app/views/options/form.php:165
|
1133 |
+
#: app/views/options/form.php:435
|
1134 |
+
msgid "Link to Disclosures"
|
|
|
|
|
1135 |
msgstr ""
|
1136 |
|
1137 |
+
#: pro/app/views/options/form.php:168
|
1138 |
+
#: app/views/options/form.php:438
|
1139 |
+
msgid "Automatically Add a Link to Disclosures"
|
|
|
1140 |
msgstr ""
|
1141 |
|
1142 |
+
#: pro/app/views/options/form.php:169
|
1143 |
+
#: app/views/options/form.php:439
|
1144 |
+
msgid "When enabled, this will add a link to your official affiliate link disclosure page to any page, post or custom post type that have any keyword or URL replacements. You'll also be able to customize the URL and position of the disclosure link."
|
1145 |
msgstr ""
|
1146 |
|
1147 |
+
#: pro/app/views/options/form.php:190
|
1148 |
+
msgid "Disclosures Link URL"
|
1149 |
msgstr ""
|
1150 |
|
1151 |
+
#: pro/app/views/options/form.php:191
|
1152 |
+
msgid "This is the URL of the page that contains your official affiliate link disclosures. This URL will be used in the link that will be generated."
|
1153 |
msgstr ""
|
1154 |
|
1155 |
+
#: pro/app/views/options/form.php:202
|
1156 |
+
msgid "Text"
|
1157 |
msgstr ""
|
1158 |
|
1159 |
+
#: pro/app/views/options/form.php:205
|
1160 |
+
msgid "Disclosures Link Text"
|
1161 |
msgstr ""
|
1162 |
|
1163 |
+
#: pro/app/views/options/form.php:206
|
1164 |
+
msgid "This is the text of the link to your disclosures. This text will be visible to your visitors when the link is displayed."
|
1165 |
msgstr ""
|
1166 |
|
1167 |
+
#: pro/app/views/options/form.php:217
|
1168 |
+
msgid "Position"
|
1169 |
msgstr ""
|
1170 |
|
1171 |
+
#: pro/app/views/options/form.php:220
|
1172 |
+
msgid "Disclosures Link Position"
|
1173 |
msgstr ""
|
1174 |
|
1175 |
+
#: pro/app/views/options/form.php:221
|
1176 |
+
msgid "This is the position of the link to your disclosures in relation to your post content."
|
|
|
1177 |
msgstr ""
|
1178 |
|
1179 |
+
#: pro/app/views/options/form.php:227
|
1180 |
+
#: pro/app/views/options/form.php:810
|
1181 |
+
#: app/views/options/form.php:946
|
1182 |
+
msgid "Bottom"
|
1183 |
msgstr ""
|
1184 |
|
1185 |
+
#: pro/app/views/options/form.php:228
|
1186 |
+
#: pro/app/views/options/form.php:809
|
1187 |
+
#: app/views/options/form.php:945
|
1188 |
+
msgid "Top"
|
|
|
1189 |
msgstr ""
|
1190 |
|
1191 |
+
#: pro/app/views/options/form.php:229
|
1192 |
+
#: pro/app/views/options/form.php:811
|
1193 |
+
#: app/views/options/form.php:947
|
1194 |
+
msgid "Top and Bottom"
|
1195 |
msgstr ""
|
1196 |
|
1197 |
+
#: pro/app/views/options/form.php:241
|
1198 |
+
#: app/views/options/form.php:452
|
1199 |
+
msgid "Keyword Disclosures"
|
1200 |
msgstr ""
|
1201 |
|
1202 |
+
#: pro/app/views/options/form.php:244
|
1203 |
+
#: app/views/options/form.php:455
|
1204 |
+
msgid "Automatically Add Affiliate Link Disclosures to Keyword Replacements"
|
1205 |
msgstr ""
|
1206 |
|
1207 |
+
#. translators: %1$s: open b tag, %2$s close b tag
|
1208 |
+
#: pro/app/views/options/form.php:247
|
1209 |
+
#: app/views/options/form.php:458
|
1210 |
+
msgid "When enabled, this will add an affiliate link disclosure next to each one of your keyword replacements. %1$sNote:%2$s This does not apply to url replacements--only keyword replacements."
|
1211 |
msgstr ""
|
1212 |
|
1213 |
+
#: pro/app/views/options/form.php:268
|
1214 |
+
msgid "Disclosure Text"
|
|
|
1215 |
msgstr ""
|
1216 |
|
1217 |
+
#: pro/app/views/options/form.php:271
|
1218 |
+
msgid "Keyword Link Disclosure Text"
|
|
|
|
|
1219 |
msgstr ""
|
1220 |
|
1221 |
+
#: pro/app/views/options/form.php:272
|
1222 |
+
msgid "This is the text that will be added after each keyword replacement to indicate that the link is an affiliate link."
|
1223 |
msgstr ""
|
1224 |
|
1225 |
+
#: pro/app/views/options/form.php:288
|
1226 |
+
#: app/views/options/form.php:474
|
1227 |
+
msgid "Replace All URLs"
|
|
|
1228 |
msgstr ""
|
1229 |
|
1230 |
+
#: pro/app/views/options/form.php:290
|
1231 |
+
#: app/views/options/form.php:476
|
1232 |
+
msgid "Replace All non-Pretty Link URLs With Pretty Link URLs"
|
1233 |
msgstr ""
|
1234 |
|
1235 |
+
#: pro/app/views/options/form.php:291
|
1236 |
+
#: app/views/options/form.php:477
|
1237 |
+
msgid "This feature will take each url it finds and create or use an existing pretty link pointing to the url and replace it with the pretty link."
|
|
|
|
|
1238 |
msgstr ""
|
1239 |
|
1240 |
+
#: pro/app/views/options/form.php:308
|
1241 |
+
msgid "Domain Blacklist"
|
1242 |
msgstr ""
|
1243 |
|
1244 |
+
#: pro/app/views/options/form.php:310
|
1245 |
+
msgid "Do not replace links from these domains"
|
|
|
|
|
|
|
1246 |
msgstr ""
|
1247 |
|
1248 |
+
#. translators: %1$s: br tag, %2$s: open b tag, %3$s: close b tag
|
1249 |
+
#: pro/app/views/options/form.php:313
|
1250 |
+
msgid "Any links on your site which point to domains you define here will not be replaced automatically with Pretty Links. Place one domain per line.%1$s%1$sYou MUST enter http:// or https:// in front of the domain names and do NOT include any /'s or other text after the domain name.%1$s%1$sProper entry example:%1$s%2$shttps://www.google.com%3$s%1$s%2$shttp://mysite.org%3$s%1$s%1$sImproperly entered domains will be removed upon saving the Options."
|
1251 |
msgstr ""
|
1252 |
|
1253 |
+
#: pro/app/views/options/form.php:333
|
1254 |
+
#: app/views/options/form.php:489
|
1255 |
+
msgid "Replace in Comments"
|
1256 |
msgstr ""
|
1257 |
|
1258 |
+
#: pro/app/views/options/form.php:335
|
1259 |
+
#: app/views/options/form.php:491
|
1260 |
+
msgid "Replace Keywords and URLs in Comments"
|
1261 |
msgstr ""
|
1262 |
|
1263 |
+
#: pro/app/views/options/form.php:336
|
1264 |
+
#: app/views/options/form.php:492
|
1265 |
+
msgid "This option will enable the keyword / URL replacement routine to run in Comments."
|
1266 |
msgstr ""
|
1267 |
|
1268 |
+
#: pro/app/views/options/form.php:347
|
1269 |
+
#: app/views/options/form.php:504
|
1270 |
+
msgid "Replace in Feeds"
|
1271 |
msgstr ""
|
1272 |
|
1273 |
+
#: pro/app/views/options/form.php:349
|
1274 |
+
#: app/views/options/form.php:506
|
1275 |
+
msgid "Replace Keywords and URLs in Feeds"
|
1276 |
msgstr ""
|
1277 |
|
1278 |
+
#. translators: %1$s: br tag, %2$s open strong tag, %3$s: close strong tag
|
1279 |
+
#: pro/app/views/options/form.php:352
|
1280 |
+
#: app/views/options/form.php:509
|
1281 |
+
msgid "This option will enable the keyword / URL replacement routine to run in RSS Feeds.%1$s%2$sNote:%3$s This option can slow the load speed of your RSS feed -- unless used in conjunction with a caching plugin like W3 Total Cache or WP Super Cache.%1$s%2$sNote #2%3$s This option will only work if you have \"Full Text\" selected in your General WordPress Reading settings.%1$s%2$sNote #3:%3$s If this option is used along with \"Replace Keywords and URLs in Comments\" then your post comment feeds will have keywords replaced in them as well."
|
1282 |
msgstr ""
|
1283 |
|
1284 |
+
#: pro/app/views/options/form.php:367
|
1285 |
+
#: pro/app/views/options/form.php:369
|
1286 |
+
#: app/views/options/form.php:525
|
1287 |
+
#: app/views/options/form.php:527
|
1288 |
+
msgid "Index Replacements"
|
1289 |
msgstr ""
|
1290 |
|
1291 |
+
#. translators: %1$s: br tag, %2$s open strong tag, %3$s: close strong tag
|
1292 |
+
#: pro/app/views/options/form.php:372
|
1293 |
+
#: app/views/options/form.php:530
|
1294 |
+
msgid "This feature will index all of your keyword & URL replacements to dramatically improve performance.%1$s%1$sIf your site has a large number of replacements and/or posts then this feature may increase the load on your server temporarily and your replacements may not show up on your posts for a day or two initially (until all posts are indexed).%1$s%1$s%2$sNote:%3$s this feature requires the use of wp-cron."
|
1295 |
msgstr ""
|
1296 |
|
1297 |
+
#: pro/app/views/options/form.php:393
|
1298 |
+
#: pro/app/views/options/form.php:395
|
1299 |
+
msgid "Keyword Index Status"
|
1300 |
msgstr ""
|
1301 |
|
1302 |
+
#: pro/app/views/options/form.php:396
|
1303 |
+
msgid "This shows how many posts have keywords indexed for and are ready for replacement."
|
|
|
1304 |
msgstr ""
|
1305 |
|
1306 |
+
#: pro/app/views/options/form.php:404
|
1307 |
+
#: pro/app/views/options/form.php:427
|
1308 |
+
msgid "%1$s out of %2$s Posts Indexed"
|
1309 |
msgstr ""
|
1310 |
|
1311 |
+
#: pro/app/views/options/form.php:408
|
1312 |
+
#: pro/app/views/options/form.php:431
|
1313 |
+
msgid "%1$s out of %2$s Comments Indexed"
|
1314 |
msgstr ""
|
1315 |
|
1316 |
+
#: pro/app/views/options/form.php:416
|
1317 |
+
msgid "URL Index Status"
|
1318 |
msgstr ""
|
1319 |
|
1320 |
+
#: pro/app/views/options/form.php:418
|
1321 |
+
msgid "URL Replacements Index Status"
|
|
|
|
|
|
|
1322 |
msgstr ""
|
1323 |
|
1324 |
+
#: pro/app/views/options/form.php:419
|
1325 |
+
msgid "This shows how many posts have url replacements indexed for and are ready for replacement."
|
|
|
|
|
1326 |
msgstr ""
|
1327 |
|
1328 |
+
#: pro/app/views/options/form.php:447
|
1329 |
+
#: app/views/options/form.php:549
|
1330 |
+
msgid "Auto-Create Shortlink Options"
|
|
|
1331 |
msgstr ""
|
1332 |
|
1333 |
+
#: pro/app/views/options/form.php:468
|
1334 |
+
#: app/views/options/form.php:593
|
1335 |
+
msgid "Pretty Bar Options"
|
1336 |
msgstr ""
|
1337 |
|
1338 |
+
#: pro/app/views/options/form.php:474
|
1339 |
+
#: app/views/options/form.php:599
|
1340 |
+
msgid "Image URL"
|
1341 |
msgstr ""
|
1342 |
|
1343 |
+
#: pro/app/views/options/form.php:476
|
1344 |
+
#: app/views/options/form.php:601
|
1345 |
+
msgid "Pretty Bar Image URL"
|
1346 |
msgstr ""
|
1347 |
|
1348 |
+
#: pro/app/views/options/form.php:477
|
1349 |
+
#: app/views/options/form.php:602
|
1350 |
+
msgid "If set, this will replace the logo image on the Pretty Bar. The image that this URL references should be 48x48 Pixels to fit."
|
|
|
1351 |
msgstr ""
|
1352 |
|
1353 |
+
#: pro/app/views/options/form.php:488
|
1354 |
+
#: app/views/options/form.php:614
|
1355 |
+
msgid "Background Image URL"
|
1356 |
msgstr ""
|
1357 |
|
1358 |
+
#: pro/app/views/options/form.php:490
|
1359 |
+
#: app/views/options/form.php:616
|
1360 |
+
msgid "Pretty Bar Background Image URL"
|
1361 |
msgstr ""
|
1362 |
|
1363 |
+
#: pro/app/views/options/form.php:491
|
1364 |
+
#: app/views/options/form.php:617
|
1365 |
+
msgid "If set, this will replace the background image on Pretty Bar. The image that this URL references should be 65px tall - this image will be repeated horizontally across the bar."
|
1366 |
msgstr ""
|
1367 |
|
1368 |
+
#: pro/app/views/options/form.php:502
|
1369 |
+
#: app/views/options/form.php:629
|
1370 |
+
msgid "Background Color"
|
1371 |
msgstr ""
|
1372 |
|
1373 |
+
#: pro/app/views/options/form.php:504
|
1374 |
+
#: app/views/options/form.php:631
|
1375 |
+
msgid "Pretty Bar Background Color"
|
1376 |
msgstr ""
|
1377 |
|
1378 |
+
#: pro/app/views/options/form.php:505
|
1379 |
+
#: app/views/options/form.php:632
|
1380 |
+
msgid "This will alter the background color of the Pretty Bar if you haven't specified a Pretty Bar background image."
|
1381 |
msgstr ""
|
1382 |
|
1383 |
+
#: pro/app/views/options/form.php:516
|
1384 |
+
#: app/views/options/form.php:644
|
1385 |
+
msgid "Text Color"
|
1386 |
msgstr ""
|
1387 |
|
1388 |
+
#: pro/app/views/options/form.php:518
|
1389 |
+
#: app/views/options/form.php:646
|
1390 |
+
msgid "Pretty Bar Text Color"
|
1391 |
msgstr ""
|
1392 |
|
1393 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
1394 |
+
#: pro/app/views/options/form.php:521
|
1395 |
+
#: app/views/options/form.php:649
|
1396 |
+
msgid "If not set, this defaults to black (RGB value %1$s#000000%2$s) but you can change it to whatever color you like."
|
1397 |
msgstr ""
|
1398 |
|
1399 |
+
#: pro/app/views/options/form.php:535
|
1400 |
+
#: app/views/options/form.php:664
|
1401 |
+
msgid "Link Color"
|
1402 |
msgstr ""
|
1403 |
|
1404 |
+
#: pro/app/views/options/form.php:537
|
1405 |
+
#: app/views/options/form.php:666
|
1406 |
+
msgid "Pretty Bar Link Color"
|
1407 |
msgstr ""
|
1408 |
|
1409 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
1410 |
+
#: pro/app/views/options/form.php:540
|
1411 |
+
#: app/views/options/form.php:669
|
1412 |
+
msgid "If not set, this defaults to blue (RGB value %1$s#0000ee%2$s) but you can change it to whatever color you like."
|
1413 |
msgstr ""
|
1414 |
|
1415 |
+
#: pro/app/views/options/form.php:554
|
1416 |
+
#: app/views/options/form.php:684
|
1417 |
+
msgid "Link Hover Color"
|
1418 |
msgstr ""
|
1419 |
|
1420 |
+
#: pro/app/views/options/form.php:556
|
1421 |
+
#: app/views/options/form.php:686
|
1422 |
+
msgid "Pretty Bar Link Hover Color"
|
1423 |
msgstr ""
|
1424 |
|
1425 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
1426 |
+
#: pro/app/views/options/form.php:559
|
1427 |
+
#: app/views/options/form.php:689
|
1428 |
+
msgid "If not set, this defaults to RGB value %1$s#ababab%2$s but you can change it to whatever color you like."
|
1429 |
msgstr ""
|
1430 |
|
1431 |
+
#: pro/app/views/options/form.php:573
|
1432 |
+
#: app/views/options/form.php:704
|
1433 |
+
msgid "Visited Link Color"
|
1434 |
msgstr ""
|
1435 |
|
1436 |
+
#: pro/app/views/options/form.php:575
|
1437 |
+
#: app/views/options/form.php:706
|
1438 |
+
msgid "Pretty Bar Visited Link Color"
|
1439 |
msgstr ""
|
1440 |
|
1441 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
1442 |
+
#: pro/app/views/options/form.php:578
|
1443 |
+
#: app/views/options/form.php:709
|
1444 |
+
msgid "If not set, this defaults to RGB value %1$s#551a8b%2$s but you can change it to whatever color you like."
|
1445 |
msgstr ""
|
1446 |
|
1447 |
+
#: pro/app/views/options/form.php:592
|
1448 |
+
#: app/views/options/form.php:724
|
1449 |
+
msgid "Title Char Limit"
|
1450 |
msgstr ""
|
1451 |
|
1452 |
+
#: pro/app/views/options/form.php:594
|
1453 |
+
#: app/views/options/form.php:726
|
1454 |
+
msgid "Pretty Bar Title Char Limit"
|
1455 |
msgstr ""
|
1456 |
|
1457 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
1458 |
+
#: pro/app/views/options/form.php:597
|
1459 |
+
#: app/views/options/form.php:729
|
1460 |
+
msgid "If your Website has a long title then you may need to adjust this value so that it will all fit on the Pretty Bar. It is recommended that you keep this value to %1$s30%2$s characters or less so the Pretty Bar's format looks good across different browsers and screen resolutions."
|
1461 |
msgstr ""
|
1462 |
|
1463 |
+
#: pro/app/views/options/form.php:611
|
1464 |
+
#: app/views/options/form.php:744
|
1465 |
+
msgid "Description Char Limit"
|
1466 |
msgstr ""
|
1467 |
|
1468 |
+
#: pro/app/views/options/form.php:613
|
1469 |
+
#: app/views/options/form.php:746
|
1470 |
+
msgid "Pretty Bar Description Char Limit"
|
1471 |
msgstr ""
|
1472 |
|
1473 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
1474 |
+
#: pro/app/views/options/form.php:616
|
1475 |
+
#: app/views/options/form.php:749
|
1476 |
+
msgid "If your Website has a long Description (tagline) then you may need to adjust this value so that it will all fit on the Pretty Bar. It is recommended that you keep this value to %1$s40%2$s characters or less so the Pretty Bar's format looks good across different browsers and screen resolutions."
|
1477 |
msgstr ""
|
1478 |
|
1479 |
+
#: pro/app/views/options/form.php:630
|
1480 |
+
#: app/views/options/form.php:764
|
1481 |
+
msgid "Target URL Char Limit"
|
1482 |
msgstr ""
|
1483 |
|
1484 |
+
#: pro/app/views/options/form.php:632
|
1485 |
+
#: app/views/options/form.php:766
|
1486 |
+
msgid "Pretty Bar Target URL Char Limit"
|
1487 |
msgstr ""
|
1488 |
|
1489 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
1490 |
+
#: pro/app/views/options/form.php:635
|
1491 |
+
#: app/views/options/form.php:769
|
1492 |
+
msgid "If you link to a lot of large Target URLs you may want to adjust this value. It is recommended that you keep this value to %1$s40%2$s or below so the Pretty Bar's format looks good across different browsers and URL sizes"
|
1493 |
msgstr ""
|
1494 |
|
1495 |
+
#: pro/app/views/options/form.php:649
|
1496 |
+
#: app/views/options/form.php:784
|
1497 |
+
msgid "Show Title"
|
|
|
|
|
|
|
|
|
|
|
|
|
1498 |
msgstr ""
|
1499 |
|
1500 |
+
#: pro/app/views/options/form.php:651
|
1501 |
+
#: app/views/options/form.php:786
|
1502 |
+
msgid "Pretty Bar Show Title"
|
1503 |
msgstr ""
|
1504 |
|
1505 |
+
#: pro/app/views/options/form.php:652
|
1506 |
+
#: app/views/options/form.php:787
|
1507 |
+
msgid "Make sure this is checked if you want the title of your blog (and link) to show up on the Pretty Bar."
|
1508 |
msgstr ""
|
1509 |
|
1510 |
+
#: pro/app/views/options/form.php:663
|
1511 |
+
#: app/views/options/form.php:799
|
1512 |
+
msgid "Show Description"
|
|
|
1513 |
msgstr ""
|
1514 |
|
1515 |
+
#: pro/app/views/options/form.php:665
|
1516 |
+
#: app/views/options/form.php:801
|
1517 |
+
msgid "Pretty Bar Show Description"
|
1518 |
msgstr ""
|
1519 |
|
1520 |
+
#: pro/app/views/options/form.php:666
|
1521 |
+
#: app/views/options/form.php:802
|
1522 |
+
msgid "Make sure this is checked if you want your site description to show up on the Pretty Bar."
|
1523 |
msgstr ""
|
1524 |
|
1525 |
+
#: pro/app/views/options/form.php:677
|
1526 |
+
#: app/views/options/form.php:814
|
1527 |
+
msgid "Show Share Links"
|
1528 |
msgstr ""
|
1529 |
|
1530 |
+
#: pro/app/views/options/form.php:679
|
1531 |
+
#: app/views/options/form.php:816
|
1532 |
+
msgid "Pretty Bar Show Share Links"
|
1533 |
msgstr ""
|
1534 |
|
1535 |
+
#: pro/app/views/options/form.php:680
|
1536 |
+
#: app/views/options/form.php:817
|
1537 |
+
msgid "Make sure this is checked if you want \"share links\" to show up on the Pretty Bar."
|
1538 |
msgstr ""
|
1539 |
|
1540 |
+
#: pro/app/views/options/form.php:691
|
1541 |
+
#: app/views/options/form.php:829
|
1542 |
+
msgid "Show Target URL"
|
|
|
|
|
|
|
1543 |
msgstr ""
|
1544 |
|
1545 |
+
#: pro/app/views/options/form.php:693
|
1546 |
+
#: app/views/options/form.php:831
|
1547 |
+
msgid "Pretty Bar Show Target URL Links"
|
1548 |
msgstr ""
|
1549 |
|
1550 |
+
#: pro/app/views/options/form.php:694
|
1551 |
+
#: app/views/options/form.php:832
|
1552 |
+
msgid "Make sure this is checked if you want a link displaying the Target URL to show up on the Pretty Bar."
|
1553 |
msgstr ""
|
1554 |
|
1555 |
+
#: pro/app/views/options/form.php:705
|
1556 |
+
#: pro/app/views/options/form.php:707
|
1557 |
+
#: app/views/options/form.php:844
|
1558 |
+
#: app/views/options/form.php:846
|
1559 |
+
msgid "Hide Attribution Link"
|
1560 |
msgstr ""
|
1561 |
|
1562 |
+
#. translators: %1$s: br tag, %2$s: open strong tag, %3$s close strong tag, %4$s open em tag, %5$s close em tag, %6$s open link tag, %7$s close link tag
|
1563 |
+
#: pro/app/views/options/form.php:710
|
1564 |
+
#: app/views/options/form.php:849
|
1565 |
+
msgid "Check this to hide the pretty link attribution link on the pretty bar.%1$s%1$s%2$sWait, before you do this, you might want to leave this un-checked and set the alternate URL of this link to your %4$sPretty Links Pro%5$s %6$sAffiliate URL%7$s to earn a few bucks while you are at it.%3$s"
|
1566 |
msgstr ""
|
1567 |
|
1568 |
+
#: pro/app/views/options/form.php:736
|
1569 |
+
#: app/views/options/form.php:876
|
1570 |
+
msgid "Attribution URL"
|
|
|
|
|
1571 |
msgstr ""
|
1572 |
|
1573 |
+
#: pro/app/views/options/form.php:738
|
1574 |
+
#: app/views/options/form.php:878
|
1575 |
+
msgid "Alternate Pretty Bar Attribution URL"
|
1576 |
msgstr ""
|
1577 |
|
1578 |
+
#. translators: %1$s open em tag, %2$s close em tag, %3$s open link tag, %4$s close link tag
|
1579 |
+
#: pro/app/views/options/form.php:741
|
1580 |
+
#: app/views/options/form.php:881
|
1581 |
+
msgid "If set, this will replace the Pretty Bars attribution URL. This is a very good place to put your %1$sPretty Links Pro%2$s %3$sAffiliate Link%4$s."
|
1582 |
msgstr ""
|
1583 |
|
1584 |
+
#: pro/app/views/options/form.php:760
|
1585 |
+
#: app/views/options/form.php:901
|
1586 |
+
msgid "Social Buttons Options"
|
|
|
|
|
|
|
1587 |
msgstr ""
|
1588 |
|
1589 |
+
#: pro/app/views/options/form.php:763
|
1590 |
+
#: app/views/options/form.php:903
|
1591 |
+
msgid "Buttons"
|
1592 |
msgstr ""
|
1593 |
|
1594 |
+
#: pro/app/views/options/form.php:765
|
1595 |
+
#: app/views/options/form.php:905
|
1596 |
+
msgid "Social Buttons"
|
1597 |
msgstr ""
|
1598 |
|
1599 |
+
#. translators: %1$s: br tag, %2$s open code tag, %3$s close code tag
|
1600 |
+
#: pro/app/views/options/form.php:768
|
1601 |
+
#: app/views/options/form.php:908
|
1602 |
+
msgid "Select which buttons you want to be visible on the Social Buttons Bar.%1$s%1$s%2$sNote:%3$s In order for the Social Buttons Bar to be visible on Pages and or Posts, you must first enable it in the \"Page & Post Options\" section above."
|
1603 |
msgstr ""
|
1604 |
|
1605 |
+
#: pro/app/views/options/form.php:795
|
1606 |
+
#: app/views/options/form.php:930
|
1607 |
+
msgid "Buttons Placement"
|
1608 |
msgstr ""
|
1609 |
|
1610 |
+
#: pro/app/views/options/form.php:797
|
1611 |
+
#: app/views/options/form.php:932
|
1612 |
+
msgid "Social Buttons Placement"
|
1613 |
msgstr ""
|
1614 |
|
1615 |
+
#. translators: %1$s: br tag, %2$s open code tag, %3$s close code tag
|
1616 |
+
#: pro/app/views/options/form.php:800
|
1617 |
+
#: app/views/options/form.php:935
|
1618 |
+
msgid "This determines where your Social Buttons Placement should appear in relation to content on Pages and/or Posts.%1$s%1$s%2$sNote:%3$s If you want this bar to appear then you must enable it in the \"Auto-Create Links\" section above."
|
1619 |
msgstr ""
|
1620 |
|
1621 |
+
#: pro/app/views/options/form.php:814
|
1622 |
+
#: app/views/options/form.php:950
|
1623 |
+
msgid "Social Buttons Manual Placement"
|
1624 |
msgstr ""
|
1625 |
|
1626 |
+
#. translators: %1$s: example shortcode, %2$s: example template tag
|
1627 |
+
#: pro/app/views/options/form.php:817
|
1628 |
+
#: app/views/options/form.php:953
|
1629 |
+
msgid "If you select none, you can still show your Social Buttons by manually adding the %1$s shortcode to your blog posts or %2$s template tag to your WordPress Theme."
|
1630 |
msgstr ""
|
1631 |
|
1632 |
+
#: pro/app/views/options/form.php:845
|
1633 |
+
#: app/views/options/form.php:966
|
1634 |
+
msgid "Public Links Creation Options"
|
1635 |
msgstr ""
|
1636 |
|
1637 |
+
#: pro/app/views/options/form.php:851
|
1638 |
+
#: app/views/options/form.php:972
|
1639 |
+
msgid "Enable Public Links"
|
1640 |
msgstr ""
|
1641 |
|
1642 |
+
#: pro/app/views/options/form.php:853
|
1643 |
+
#: app/views/options/form.php:974
|
1644 |
+
msgid "Enable Public Link Creation on this Site"
|
1645 |
msgstr ""
|
1646 |
|
1647 |
+
#: pro/app/views/options/form.php:855
|
1648 |
+
#: app/views/options/form.php:976
|
1649 |
+
msgid "This option will give you the ability to turn your website into a link shortening service for your users. Once selected, you can enable the Pretty Links Pro Sidebar Widget or just display the link creation form with the %s shortcode in any post or page on your website."
|
1650 |
msgstr ""
|
1651 |
|
1652 |
+
#: pro/app/views/options/form.php:874
|
1653 |
+
msgid "Use Display Page"
|
1654 |
msgstr ""
|
1655 |
|
1656 |
+
#: pro/app/views/options/form.php:876
|
1657 |
+
msgid "Use Public Link Display Page"
|
1658 |
msgstr ""
|
1659 |
|
1660 |
+
#: pro/app/views/options/form.php:877
|
1661 |
+
msgid "When a link is created using the public form, the user is typically redirected to a simple page displaying their new pretty link. But, you can specify a page that you want them to be redirected to on your website, using your branding instead by selecting this box and entering the url of the page you want them to go to."
|
|
|
1662 |
msgstr ""
|
1663 |
|
1664 |
+
#: pro/app/views/options/form.php:894
|
1665 |
+
msgid "Display Page"
|
|
|
|
|
|
|
|
|
|
|
1666 |
msgstr ""
|
1667 |
|
1668 |
+
#: pro/app/views/options/form.php:896
|
1669 |
+
msgid "Public Pretty Link Creation Display URL"
|
|
|
|
|
|
|
1670 |
msgstr ""
|
1671 |
|
1672 |
+
#: pro/app/views/options/form.php:898
|
1673 |
+
msgid "To set this up, create a new page on your WordPress site and make sure the %s appears somewhere on this page -- otherwise the link will never get created. Once this page is created, just enter the full URL to it here. Make sure this URL does not end with a slash (/)."
|
|
|
1674 |
msgstr ""
|
1675 |
|
1676 |
+
#: pro/app/views/options/autocreate.php:7
|
1677 |
+
msgid "%s Shortlinks"
|
|
|
|
|
1678 |
msgstr ""
|
1679 |
|
1680 |
+
#: pro/app/views/options/autocreate.php:10
|
1681 |
+
msgid "Create Pretty Links for %s"
|
|
|
|
|
1682 |
msgstr ""
|
1683 |
|
1684 |
+
#: pro/app/views/options/autocreate.php:11
|
1685 |
+
msgid "Automatically Create a Pretty Link for each of your published %s"
|
|
|
|
|
1686 |
msgstr ""
|
1687 |
|
1688 |
+
#: pro/app/views/options/autocreate.php:30
|
1689 |
+
msgid "Category"
|
|
|
1690 |
msgstr ""
|
1691 |
|
1692 |
+
#: pro/app/views/options/autocreate.php:33
|
1693 |
+
msgid "%s Auto Link Category"
|
|
|
1694 |
msgstr ""
|
1695 |
|
1696 |
+
#: pro/app/views/options/autocreate.php:34
|
1697 |
+
msgid "Category that Pretty Links for %s will be automatically added to."
|
|
|
1698 |
msgstr ""
|
1699 |
|
1700 |
+
#: pro/app/views/options/autocreate.php:51
|
1701 |
+
msgid "Add a New Category"
|
1702 |
msgstr ""
|
1703 |
|
1704 |
+
#: pro/app/views/options/autocreate.php:57
|
1705 |
+
msgid "Show Social Buttons"
|
1706 |
msgstr ""
|
1707 |
|
1708 |
+
#: pro/app/views/options/autocreate.php:60
|
1709 |
+
msgid "Show Social Buttons on %s"
|
1710 |
msgstr ""
|
1711 |
|
1712 |
+
#: pro/app/views/options/autocreate.php:61
|
1713 |
+
msgid "If this button is checked then you'll have the ability to include a social buttons bar on your %s."
|
1714 |
msgstr ""
|
1715 |
|
1716 |
+
#: pro/app/views/options/general.php:8
|
1717 |
+
msgid "Use Shortlink URL"
|
1718 |
msgstr ""
|
1719 |
|
1720 |
+
#: pro/app/views/options/general.php:10
|
1721 |
+
msgid "Use an Alternate Shortlink URL"
|
1722 |
msgstr ""
|
1723 |
|
1724 |
+
#: pro/app/views/options/general.php:11
|
1725 |
+
msgid "Use this option if you want to substitute your actual blog's url with another URL. You must have another valid domain name pointing to this WordPress install before you enable this option. If you are using this option to just get rid of the www in the beginning of your url that is fine -- just make sure your domain works without the www before enabling this option."
|
|
|
1726 |
msgstr ""
|
1727 |
|
1728 |
+
#: pro/app/views/options/general.php:28
|
1729 |
+
#: pro/app/views/options/general.php:30
|
1730 |
+
msgid "Shortlink URL"
|
1731 |
msgstr ""
|
1732 |
|
1733 |
+
#: pro/app/views/options/general.php:31
|
1734 |
+
msgid "Enter a valid base url that points at this WordPress install. Make sure this URL does not end with a slash (/)."
|
|
|
|
|
|
|
|
|
1735 |
msgstr ""
|
1736 |
|
1737 |
+
#: pro/app/views/options/general.php:47
|
1738 |
+
msgid "Minimum Admin Role"
|
1739 |
msgstr ""
|
1740 |
|
1741 |
+
#: pro/app/views/options/general.php:49
|
1742 |
+
msgid "Set Minimum Role Required To Access Pretty Link"
|
|
|
|
|
1743 |
msgstr ""
|
1744 |
|
1745 |
+
#: pro/app/views/options/general.php:50
|
1746 |
+
msgid "Use this option to set the minimum role of users who can access the Admin interface for Pretty Link."
|
1747 |
msgstr ""
|
1748 |
|
1749 |
+
#: pro/app/views/options/general.php:56
|
1750 |
+
msgid "Administrator"
|
1751 |
msgstr ""
|
1752 |
|
1753 |
+
#: pro/app/views/options/general.php:57
|
1754 |
+
msgid "Editor"
|
|
|
|
|
|
|
1755 |
msgstr ""
|
1756 |
|
1757 |
+
#: pro/app/views/options/general.php:58
|
1758 |
+
msgid "Author"
|
|
|
|
|
1759 |
msgstr ""
|
1760 |
|
1761 |
+
#: pro/app/views/options/general.php:59
|
1762 |
+
msgid "Contributor"
|
1763 |
msgstr ""
|
1764 |
|
1765 |
+
#: pro/app/views/options/general.php:60
|
1766 |
+
msgid "Subscriber"
|
1767 |
msgstr ""
|
1768 |
|
1769 |
+
#: pro/app/views/tools/nav.php:3
|
1770 |
+
msgid "Custom Bookmarklet"
|
1771 |
msgstr ""
|
1772 |
|
1773 |
+
#: pro/app/views/tools/generator.php:6
|
1774 |
+
msgid "Custom Bookmarklet:"
|
|
|
|
|
|
|
1775 |
msgstr ""
|
1776 |
|
1777 |
+
#: pro/app/views/tools/generator.php:7
|
1778 |
+
#: pro/app/views/tools/generator.php:17
|
1779 |
+
#: app/views/tools/form.php:26
|
1780 |
+
msgid "Get Pretty Link"
|
|
|
1781 |
msgstr ""
|
1782 |
|
1783 |
+
#: pro/app/views/tools/generator.php:9
|
1784 |
+
msgid "Customize Pretty Link Bookmarklet"
|
|
|
|
|
|
|
|
|
1785 |
msgstr ""
|
1786 |
|
1787 |
+
#: pro/app/views/tools/generator.php:10
|
1788 |
+
msgid "Alter the options below to customize this Bookmarklet. As you modify the label, redirect type, tracking and category, you will see this bookmarklet update -- when the settings are how you want them, drag the bookmarklet into your toolbar. You can create as many bookmarklets as you want each with different settings."
|
1789 |
msgstr ""
|
1790 |
|
1791 |
+
#: pro/app/views/tools/generator.php:13
|
1792 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:66
|
1793 |
+
msgid "Pretty Link Options"
|
1794 |
msgstr ""
|
1795 |
|
1796 |
+
#: pro/app/views/tools/generator.php:16
|
1797 |
+
msgid "Label:"
|
|
|
1798 |
msgstr ""
|
1799 |
|
1800 |
+
#: pro/app/views/tools/generator.php:20
|
1801 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:68
|
1802 |
+
msgid "Redirection:"
|
|
|
|
|
|
|
1803 |
msgstr ""
|
1804 |
|
1805 |
+
#: pro/app/views/tools/generator.php:21
|
1806 |
+
#: pro/app/views/tools/generator.php:26
|
1807 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:70
|
1808 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:82
|
1809 |
+
#: app/views/shared/tinymce_form_popup.php:31
|
1810 |
+
#: app/views/shared/tinymce_form_popup.php:48
|
1811 |
+
#: app/views/shared/tinymce_form_popup.php:56
|
1812 |
+
msgid "Default"
|
1813 |
msgstr ""
|
1814 |
|
1815 |
+
#: pro/app/views/tools/generator.php:24
|
1816 |
+
msgid "Tracking:"
|
1817 |
msgstr ""
|
1818 |
|
1819 |
+
#: pro/app/views/tools/generator.php:27
|
1820 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:83
|
1821 |
+
#: app/views/admin/popups/rating.php:12
|
1822 |
+
msgid "Yes"
|
1823 |
msgstr ""
|
1824 |
|
1825 |
+
#: pro/app/views/tools/generator.php:28
|
1826 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:84
|
1827 |
+
#: app/views/admin/popups/rating.php:13
|
1828 |
+
msgid "No"
|
|
|
|
|
1829 |
msgstr ""
|
1830 |
|
1831 |
+
#: pro/app/views/tools/generator.php:32
|
1832 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:89
|
1833 |
+
msgid "Category:"
|
1834 |
msgstr ""
|
1835 |
|
1836 |
+
#: pro/app/views/import-export/form.php:4
|
1837 |
+
msgid "Import / Export Links"
|
1838 |
msgstr ""
|
1839 |
|
1840 |
+
#: pro/app/views/import-export/form.php:9
|
1841 |
+
#: pro/app/views/import-export/form.php:12
|
1842 |
+
msgid "Export Pretty Links"
|
|
|
1843 |
msgstr ""
|
1844 |
|
1845 |
+
#: pro/app/views/import-export/form.php:13
|
1846 |
+
msgid "Export Links to a CSV File"
|
1847 |
msgstr ""
|
1848 |
|
1849 |
+
#: pro/app/views/import-export/form.php:17
|
1850 |
+
msgid "Export"
|
1851 |
msgstr ""
|
1852 |
|
1853 |
+
#: pro/app/views/import-export/form.php:22
|
1854 |
+
#: pro/app/views/import-export/form.php:25
|
1855 |
+
msgid "Import Pretty Links"
|
1856 |
msgstr ""
|
1857 |
|
1858 |
+
#: pro/app/views/import-export/form.php:27
|
1859 |
+
msgid "There are two ways to import a file.%1$s%1$s1) Importing to update existing links and%1$s%1$s2) Importing to generate new links. When Importing to generate new links, you must delete the \"id\" column from the CSV before importing. If the \"id\" column is present, Pretty Links Pro will attempt to update existing links."
|
1860 |
msgstr ""
|
1861 |
|
1862 |
+
#: pro/app/views/import-export/form.php:39
|
1863 |
+
msgid "Import"
|
1864 |
msgstr ""
|
1865 |
|
1866 |
+
#: pro/app/views/import-export/form.php:42
|
1867 |
+
msgid "Links Import File"
|
|
|
1868 |
msgstr ""
|
1869 |
|
1870 |
+
#: pro/app/views/import-export/form.php:43
|
1871 |
+
msgid "Select a file that has been formatted as a Pretty Link CSV import file and click \"Import\""
|
1872 |
+
msgstr ""
|
1873 |
+
|
1874 |
+
#: pro/app/views/import-export/form.php:51
|
1875 |
+
msgid "Import/Export Help"
|
1876 |
+
msgstr ""
|
1877 |
+
|
1878 |
+
#: pro/app/views/import-export/import.php:4
|
1879 |
+
msgid "Import Results"
|
1880 |
+
msgstr ""
|
1881 |
+
|
1882 |
+
#: pro/app/views/import-export/import.php:5
|
1883 |
+
msgid "Total Rows: %s"
|
1884 |
+
msgstr ""
|
1885 |
+
|
1886 |
+
#: pro/app/views/import-export/import.php:7
|
1887 |
+
msgid "%s Pretty Links were Successfully Created"
|
1888 |
+
msgstr ""
|
1889 |
+
|
1890 |
+
#: pro/app/views/import-export/import.php:8
|
1891 |
+
msgid "%s Pretty Links were Successfully Updated"
|
1892 |
+
msgstr ""
|
1893 |
+
|
1894 |
+
#: pro/app/views/import-export/import.php:13
|
1895 |
+
msgid "Pretty Links were unable to be Created: %s"
|
1896 |
+
msgstr ""
|
1897 |
+
|
1898 |
+
#: pro/app/views/import-export/import.php:17
|
1899 |
+
msgid "Error(s) for Pretty Link with Slug: %s"
|
1900 |
+
msgstr ""
|
1901 |
+
|
1902 |
+
#: pro/app/views/import-export/import.php:32
|
1903 |
+
msgid "Pretty Links were unable to be Updated: %s"
|
1904 |
+
msgstr ""
|
1905 |
+
|
1906 |
+
#: pro/app/views/import-export/import.php:36
|
1907 |
+
msgid "Error(s) for Pretty Link with id: %s"
|
1908 |
msgstr ""
|
1909 |
|
1910 |
+
#: pro/app/controllers/PlpLinksController.php:195
|
1911 |
+
msgid "Your URL Replacements must be formatted as a comma separated list of properly formatted URLs (http[s]://example.com/whatever)"
|
1912 |
+
msgstr ""
|
1913 |
+
|
1914 |
+
#: pro/app/controllers/PlpLinksController.php:206
|
1915 |
msgid "Date must be valid and formatted YYYY-MM-DD."
|
1916 |
msgstr ""
|
1917 |
|
1918 |
+
#: pro/app/controllers/PlpLinksController.php:218
|
1919 |
msgid "Expire Clicks must be a number greater than zero."
|
1920 |
msgstr ""
|
1921 |
|
1922 |
+
#: pro/app/controllers/PlpLinksController.php:225
|
1923 |
msgid "Expired URL must be a valid URL."
|
1924 |
msgstr ""
|
1925 |
|
1926 |
+
#: pro/app/controllers/PlpLinksController.php:237
|
1927 |
msgid "Your URL Rotations must all be properly formatted URLs."
|
1928 |
msgstr ""
|
1929 |
|
1930 |
+
#: pro/app/controllers/PlpLinksController.php:246
|
1931 |
msgid "Your Link Rotation Weights must add up to 100%."
|
1932 |
msgstr ""
|
1933 |
|
1934 |
+
#: pro/app/controllers/PlpLinksController.php:256
|
1935 |
msgid "Your Geographic Redirect URLs must all be properly formatted."
|
1936 |
msgstr ""
|
1937 |
|
1938 |
+
#: pro/app/controllers/PlpLinksController.php:260
|
1939 |
msgid "Your Geographic Redirects URLs must not be empty."
|
1940 |
msgstr ""
|
1941 |
|
1942 |
+
#: pro/app/controllers/PlpLinksController.php:264
|
1943 |
msgid "Your Geographic Redirect Countries must not be empty."
|
1944 |
msgstr ""
|
1945 |
|
1946 |
+
#: pro/app/controllers/PlpLinksController.php:275
|
1947 |
msgid "Your Technology Redirect URLs must all be properly formatted."
|
1948 |
msgstr ""
|
1949 |
|
1950 |
+
#: pro/app/controllers/PlpLinksController.php:279
|
1951 |
msgid "Your Technology Redirects URLs must not be empty."
|
1952 |
msgstr ""
|
1953 |
|
1954 |
+
#: pro/app/controllers/PlpLinksController.php:290
|
1955 |
msgid "Your Time Period Redirect URLs must all be properly formatted."
|
1956 |
msgstr ""
|
1957 |
|
1958 |
+
#: pro/app/controllers/PlpLinksController.php:294
|
1959 |
msgid "Your Time Period Redirects URLs must not be empty."
|
1960 |
msgstr ""
|
1961 |
|
1962 |
+
#: pro/app/controllers/PlpLinksController.php:299
|
1963 |
msgid "Your Time Period Redirect start time must not be empty."
|
1964 |
msgstr ""
|
1965 |
|
1966 |
+
#: pro/app/controllers/PlpLinksController.php:302
|
1967 |
msgid "Your Time Period Redirect start time must be a properly formatted date."
|
1968 |
msgstr ""
|
1969 |
|
1970 |
+
#: pro/app/controllers/PlpLinksController.php:308
|
1971 |
msgid "Your Time Period Redirect end time must not be empty."
|
1972 |
msgstr ""
|
1973 |
|
1974 |
+
#: pro/app/controllers/PlpLinksController.php:311
|
1975 |
msgid "Your Time Period Redirect end time must be a properly formatted date."
|
1976 |
msgstr ""
|
1977 |
|
1978 |
+
#: pro/app/controllers/PlpLinksController.php:319
|
1979 |
msgid "Your Time Period Redirect start time must come before the end time."
|
1980 |
msgstr ""
|
1981 |
|
1982 |
+
#: pro/app/controllers/PlpLinksController.php:327
|
1983 |
msgid "Delay Redirect must be a number"
|
1984 |
msgstr ""
|
1985 |
|
1986 |
+
#: pro/app/controllers/PlpLinksController.php:623
|
1987 |
#: pro/app/controllers/PlpLinksController.php:668
|
1988 |
+
#: app/views/shared/tinymce_form_popup.php:37
|
1989 |
+
#: app/views/options/form.php:55
|
1990 |
+
msgid "Pretty Bar"
|
1991 |
+
msgstr ""
|
1992 |
+
|
1993 |
+
#: pro/app/controllers/PlpLinksController.php:624
|
1994 |
+
#: app/views/shared/tinymce_form_popup.php:38
|
1995 |
+
msgid "Cloaked"
|
1996 |
+
msgstr ""
|
1997 |
+
|
1998 |
+
#: pro/app/controllers/PlpLinksController.php:625
|
1999 |
+
#: pro/app/controllers/PlpLinksController.php:670
|
2000 |
+
#: app/views/shared/tinymce_form_popup.php:39
|
2001 |
+
msgid "Pixel"
|
2002 |
+
msgstr ""
|
2003 |
+
|
2004 |
+
#: pro/app/controllers/PlpLinksController.php:626
|
2005 |
+
#: pro/app/controllers/PlpLinksController.php:671
|
2006 |
+
#: app/views/shared/tinymce_form_popup.php:40
|
2007 |
+
msgid "Meta Refresh"
|
2008 |
+
msgstr ""
|
2009 |
+
|
2010 |
+
#: pro/app/controllers/PlpLinksController.php:627
|
2011 |
+
#: pro/app/controllers/PlpLinksController.php:672
|
2012 |
+
#: app/views/shared/tinymce_form_popup.php:41
|
2013 |
+
msgid "Javascript"
|
2014 |
+
msgstr ""
|
2015 |
+
|
2016 |
+
#: pro/app/controllers/PlpLinksController.php:669
|
2017 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:75
|
2018 |
msgid "Cloak"
|
2019 |
msgstr ""
|
2020 |
|
2021 |
+
#: pro/app/controllers/PlpLinksController.php:734
|
2022 |
msgid "View QR Code for this link: %s"
|
2023 |
msgstr ""
|
2024 |
|
2025 |
+
#: pro/app/controllers/PlpLinksController.php:734
|
2026 |
+
#: pro/app/controllers/PlpLinksController.php:738
|
2027 |
+
msgid "QR Code"
|
2028 |
+
msgstr ""
|
2029 |
+
|
2030 |
+
#: pro/app/controllers/PlpLinksController.php:738
|
2031 |
msgid "Download QR Code for this link: %s"
|
2032 |
msgstr ""
|
2033 |
|
2044 |
msgstr ""
|
2045 |
|
2046 |
#: pro/app/controllers/PlpLinksController.php:829
|
2047 |
+
msgid "This link expired after %d clicks and will now cause a 404 error when visited"
|
|
|
2048 |
msgstr ""
|
2049 |
|
2050 |
#: pro/app/controllers/PlpLinksController.php:832
|
2068 |
msgstr ""
|
2069 |
|
2070 |
#: pro/app/controllers/PlpLinksController.php:855
|
2071 |
+
msgid "A Time Period Redirect is currently active for this link. When visited it will currently redirect to %s rather than the Target URL unless the link is expired."
|
|
|
|
|
|
|
2072 |
msgstr ""
|
2073 |
|
2074 |
#: pro/app/controllers/PlpLinksController.php:859
|
2075 |
+
msgid "Time Period Redirects have been setup for this link but the current time is not within any of them currently."
|
|
|
|
|
2076 |
msgstr ""
|
2077 |
|
2078 |
+
#: pro/app/controllers/PlpKeywordsController.php:68
|
2079 |
+
msgid "Pretty Link Post Build Index"
|
2080 |
msgstr ""
|
2081 |
|
2082 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:13
|
2083 |
+
msgctxt "taxonomy general name"
|
2084 |
+
msgid "Link Categories"
|
2085 |
msgstr ""
|
2086 |
|
2087 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:14
|
2088 |
+
msgctxt "taxonomy singular name"
|
2089 |
+
msgid "Link Category"
|
|
|
2090 |
msgstr ""
|
2091 |
|
2092 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:15
|
2093 |
+
msgid "Search Link Categories"
|
|
|
|
|
2094 |
msgstr ""
|
2095 |
|
2096 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:16
|
2097 |
+
msgid "All Link Categories"
|
2098 |
msgstr ""
|
2099 |
|
2100 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:17
|
2101 |
+
msgid "Parent Link Category"
|
2102 |
msgstr ""
|
2103 |
|
2104 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:18
|
2105 |
+
msgid "Parent Link Category:"
|
2106 |
+
msgstr ""
|
2107 |
+
|
2108 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:19
|
2109 |
+
msgid "Edit Link Category"
|
2110 |
+
msgstr ""
|
2111 |
+
|
2112 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:20
|
2113 |
+
msgid "Update Link Category"
|
2114 |
+
msgstr ""
|
2115 |
+
|
2116 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:21
|
2117 |
+
msgid "Add New Link Category"
|
2118 |
+
msgstr ""
|
2119 |
+
|
2120 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:22
|
2121 |
+
msgid "New Link Category Name"
|
2122 |
+
msgstr ""
|
2123 |
+
|
2124 |
+
#: pro/app/controllers/PlpLinkCategoriesController.php:23
|
2125 |
+
#: app/controllers/PrliLinksController.php:370
|
2126 |
+
msgid "Categories"
|
2127 |
msgstr ""
|
2128 |
|
2129 |
#: pro/app/controllers/PlpPrettyBarController.php:50
|
2175 |
msgid "PrettyBar Link Character Limit must be a number"
|
2176 |
msgstr ""
|
2177 |
|
2178 |
+
#: pro/app/controllers/PlpPostsController.php:50
|
2179 |
+
msgid "Pretty Links Pro"
|
|
|
2180 |
msgstr ""
|
2181 |
|
2182 |
+
#: pro/app/controllers/PlpPostsController.php:54
|
2183 |
+
msgid "Pretty Links Pro Options"
|
|
|
2184 |
msgstr ""
|
2185 |
|
2186 |
+
#: pro/app/controllers/PlpPostsController.php:139
|
2187 |
+
#: pro/app/controllers/PlpPostsController.php:155
|
2188 |
+
#: pro/app/controllers/PlpPostsController.php:236
|
2189 |
+
#: pro/app/controllers/PlpPostsController.php:249
|
2190 |
+
msgid "Untitled"
|
2191 |
msgstr ""
|
2192 |
|
2193 |
+
#: pro/app/controllers/PlpReportsController.php:14
|
2194 |
+
msgid "Pretty Links Pro | Reports"
|
2195 |
msgstr ""
|
2196 |
|
2197 |
+
#: pro/app/controllers/PlpReportsController.php:51
|
2198 |
msgid "Create a custom link report and analyze your data."
|
2199 |
msgstr ""
|
2200 |
|
2201 |
+
#: pro/app/controllers/PlpReportsController.php:94
|
|
|
|
|
|
|
|
|
2202 |
msgid "Your Pretty Link Report was Successfully Created"
|
2203 |
msgstr ""
|
2204 |
|
2205 |
+
#: pro/app/controllers/PlpReportsController.php:130
|
2206 |
msgid "Your Pretty Link Report was Successfully Updated"
|
2207 |
msgstr ""
|
2208 |
|
2209 |
+
#: pro/app/controllers/PlpReportsController.php:139
|
2210 |
msgid "Your Pretty Link Report was Successfully Deleted"
|
2211 |
msgstr ""
|
2212 |
|
2213 |
+
#: pro/app/controllers/PlpAppController.php:169
|
2214 |
+
msgid "ERROR: Your Pretty Link was unable to be created"
|
2215 |
msgstr ""
|
2216 |
|
2217 |
+
#: pro/app/controllers/PlpAppController.php:173
|
2218 |
+
msgid "Unauthorized"
|
2219 |
msgstr ""
|
2220 |
|
2221 |
+
#: pro/app/controllers/PlpPublicLinksController.php:37
|
2222 |
+
#: app/controllers/PrliLinksController.php:572
|
2223 |
+
msgid "Security check failed"
|
2224 |
msgstr ""
|
2225 |
|
2226 |
+
#: pro/app/controllers/PlpLinkTagsController.php:13
|
2227 |
+
msgctxt "taxonomy general name"
|
2228 |
+
msgid "Link Tags"
|
2229 |
msgstr ""
|
2230 |
|
2231 |
+
#: pro/app/controllers/PlpLinkTagsController.php:14
|
2232 |
+
msgctxt "taxonomy singular name"
|
2233 |
+
msgid "Link Tag"
|
|
|
|
|
|
|
2234 |
msgstr ""
|
2235 |
|
2236 |
+
#: pro/app/controllers/PlpLinkTagsController.php:15
|
2237 |
+
msgid "Search Link Tags"
|
2238 |
msgstr ""
|
2239 |
|
2240 |
+
#: pro/app/controllers/PlpLinkTagsController.php:16
|
2241 |
+
msgid "All Link Tags"
|
2242 |
msgstr ""
|
2243 |
|
2244 |
+
#: pro/app/controllers/PlpLinkTagsController.php:19
|
2245 |
+
msgid "Edit Link Tag"
|
2246 |
msgstr ""
|
2247 |
|
2248 |
+
#: pro/app/controllers/PlpLinkTagsController.php:20
|
2249 |
+
msgid "Update Link Tag"
|
2250 |
msgstr ""
|
2251 |
|
2252 |
+
#: pro/app/controllers/PlpLinkTagsController.php:21
|
2253 |
+
msgid "Add New Link Tag"
|
|
|
|
|
2254 |
msgstr ""
|
2255 |
|
2256 |
+
#: pro/app/controllers/PlpLinkTagsController.php:22
|
2257 |
+
msgid "New Link Tag Name"
|
2258 |
msgstr ""
|
2259 |
|
2260 |
+
#: pro/app/controllers/PlpLinkTagsController.php:23
|
2261 |
+
msgid "Separate Link Tags with commas"
|
2262 |
msgstr ""
|
2263 |
|
2264 |
+
#: pro/app/controllers/PlpLinkTagsController.php:24
|
2265 |
+
msgid "Add or remove Link Tags"
|
2266 |
msgstr ""
|
2267 |
|
2268 |
+
#: pro/app/controllers/PlpLinkTagsController.php:25
|
2269 |
+
msgid "Choose from the most used Link Tags"
|
2270 |
msgstr ""
|
2271 |
|
2272 |
+
#: pro/app/controllers/PlpLinkTagsController.php:26
|
2273 |
+
msgid "No Link Tags found."
|
2274 |
msgstr ""
|
2275 |
|
2276 |
+
#: pro/app/controllers/PlpLinkTagsController.php:27
|
2277 |
+
#: app/controllers/PrliLinksController.php:371
|
2278 |
+
msgid "Tags"
|
2279 |
msgstr ""
|
2280 |
|
2281 |
+
#: pro/app/controllers/PlpImportExportController.php:14
|
2282 |
+
msgid "Pretty Links Pro | Import / Export"
|
2283 |
msgstr ""
|
2284 |
|
2285 |
+
#: pro/app/controllers/PlpImportExportController.php:15
|
2286 |
+
msgid "Import / Export"
|
2287 |
msgstr ""
|
2288 |
|
2289 |
+
#: pro/app/controllers/PlpOptionsController.php:97
|
2290 |
+
msgid "Keywords Per Page is required"
|
2291 |
msgstr ""
|
2292 |
|
2293 |
+
#: pro/app/controllers/PlpOptionsController.php:101
|
2294 |
+
msgid "Keyword Links Per Page is required"
|
2295 |
msgstr ""
|
2296 |
|
2297 |
+
#: pro/app/controllers/PlpOptionsController.php:106
|
2298 |
+
msgid "You need to enter a valid Pretty Link Base URL now that you have selected \"Use an alternate base url for your Pretty Links\""
|
2299 |
msgstr ""
|
2300 |
|
2301 |
+
#: pro/app/controllers/PlpOptionsController.php:111
|
2302 |
+
msgid "You need to enter a valid Public Link Display URL now that you have selected \"Use a custom public link display page\""
|
2303 |
msgstr ""
|
2304 |
|
2305 |
+
#: pro/app/controllers/PlpOptionsController.php:117
|
2306 |
+
msgid "Pretty Bar Attribution URL must be a correctly formatted URL"
|
2307 |
msgstr ""
|
2308 |
|
2309 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:11
|
2310 |
+
msgid "Create a Short URL"
|
2311 |
msgstr ""
|
2312 |
|
2313 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:13
|
2314 |
+
msgid "Displays a form to create a Pretty Link."
|
2315 |
msgstr ""
|
2316 |
|
2317 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:60
|
2318 |
+
msgid "Enter a URL: "
|
2319 |
msgstr ""
|
2320 |
|
2321 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:64
|
2322 |
+
msgid "Label Text:"
|
|
|
|
|
|
|
|
|
2323 |
msgstr ""
|
2324 |
|
2325 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:65
|
2326 |
+
msgid "Button Text:"
|
2327 |
msgstr ""
|
2328 |
|
2329 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:65
|
2330 |
+
msgid "if left blank, no button will display"
|
|
|
2331 |
msgstr ""
|
2332 |
|
2333 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:71
|
2334 |
+
msgid "Permanent/301"
|
2335 |
msgstr ""
|
2336 |
|
2337 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:72
|
2338 |
+
msgid "Temporary/302"
|
2339 |
msgstr ""
|
2340 |
|
2341 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:73
|
2342 |
+
msgid "Temporary/307"
|
2343 |
msgstr ""
|
2344 |
|
2345 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:74
|
2346 |
+
msgid "PrettyBar"
|
|
|
2347 |
msgstr ""
|
2348 |
|
2349 |
+
#: pro/app/widgets/PlpPublicLinksWidget.php:80
|
2350 |
+
msgid "Tracking Enabled:"
|
2351 |
msgstr ""
|
2352 |
|
2353 |
+
#: pro/i18n/countries.php:5
|
2354 |
+
msgid "Afghanistan"
|
2355 |
msgstr ""
|
2356 |
|
2357 |
+
#: pro/i18n/countries.php:6
|
2358 |
+
msgid "Åland Islands"
|
|
|
2359 |
msgstr ""
|
2360 |
|
2361 |
+
#: pro/i18n/countries.php:7
|
2362 |
+
msgid "Albania"
|
|
|
|
|
|
|
|
|
|
|
2363 |
msgstr ""
|
2364 |
|
2365 |
+
#: pro/i18n/countries.php:8
|
2366 |
+
msgid "Algeria"
|
2367 |
msgstr ""
|
2368 |
|
2369 |
+
#: pro/i18n/countries.php:9
|
2370 |
+
msgid "Andorra"
|
2371 |
msgstr ""
|
2372 |
|
2373 |
+
#: pro/i18n/countries.php:10
|
2374 |
+
msgid "Angola"
|
|
|
|
|
2375 |
msgstr ""
|
2376 |
|
2377 |
+
#: pro/i18n/countries.php:11
|
2378 |
+
msgid "Anguilla"
|
2379 |
msgstr ""
|
2380 |
|
2381 |
+
#: pro/i18n/countries.php:12
|
2382 |
+
msgid "Antarctica"
|
2383 |
msgstr ""
|
2384 |
|
2385 |
+
#: pro/i18n/countries.php:13
|
2386 |
+
msgid "Antigua and Barbuda"
|
2387 |
msgstr ""
|
2388 |
|
2389 |
+
#: pro/i18n/countries.php:14
|
2390 |
+
msgid "Argentina"
|
2391 |
msgstr ""
|
2392 |
|
2393 |
+
#: pro/i18n/countries.php:15
|
2394 |
+
msgid "Armenia"
|
2395 |
msgstr ""
|
2396 |
|
2397 |
+
#: pro/i18n/countries.php:16
|
2398 |
+
msgid "Aruba"
|
2399 |
msgstr ""
|
2400 |
|
2401 |
+
#: pro/i18n/countries.php:17
|
2402 |
+
msgid "Australia"
|
2403 |
msgstr ""
|
2404 |
|
2405 |
+
#: pro/i18n/countries.php:18
|
2406 |
+
msgid "Austria"
|
2407 |
msgstr ""
|
2408 |
|
2409 |
+
#: pro/i18n/countries.php:19
|
2410 |
+
msgid "Azerbaijan"
|
2411 |
msgstr ""
|
2412 |
|
2413 |
+
#: pro/i18n/countries.php:20
|
2414 |
+
msgid "Bahamas"
|
2415 |
msgstr ""
|
2416 |
|
2417 |
+
#: pro/i18n/countries.php:21
|
2418 |
+
msgid "Bahrain"
|
2419 |
msgstr ""
|
2420 |
|
2421 |
+
#: pro/i18n/countries.php:22
|
2422 |
+
msgid "Bangladesh"
|
2423 |
msgstr ""
|
2424 |
|
2425 |
+
#: pro/i18n/countries.php:23
|
2426 |
+
msgid "Barbados"
|
2427 |
msgstr ""
|
2428 |
|
2429 |
+
#: pro/i18n/countries.php:24
|
2430 |
+
msgid "Belarus"
|
2431 |
msgstr ""
|
2432 |
|
2433 |
+
#: pro/i18n/countries.php:25
|
2434 |
+
msgid "Belgium"
|
2435 |
msgstr ""
|
2436 |
|
2437 |
+
#: pro/i18n/countries.php:26
|
2438 |
+
msgid "Belau"
|
2439 |
msgstr ""
|
2440 |
|
2441 |
+
#: pro/i18n/countries.php:27
|
2442 |
+
msgid "Belize"
|
|
|
|
|
|
|
|
|
2443 |
msgstr ""
|
2444 |
|
2445 |
+
#: pro/i18n/countries.php:28
|
2446 |
+
msgid "Benin"
|
2447 |
msgstr ""
|
2448 |
|
2449 |
+
#: pro/i18n/countries.php:29
|
2450 |
+
msgid "Bermuda"
|
|
|
|
|
|
|
|
|
2451 |
msgstr ""
|
2452 |
|
2453 |
+
#: pro/i18n/countries.php:30
|
2454 |
+
msgid "Bhutan"
|
2455 |
msgstr ""
|
2456 |
|
2457 |
+
#: pro/i18n/countries.php:31
|
2458 |
+
msgid "Bolivia"
|
|
|
|
|
2459 |
msgstr ""
|
2460 |
|
2461 |
+
#: pro/i18n/countries.php:32
|
2462 |
+
msgid "Bonaire, Saint Eustatius and Saba"
|
2463 |
msgstr ""
|
2464 |
|
2465 |
+
#: pro/i18n/countries.php:33
|
2466 |
+
msgid "Bosnia and Herzegovina"
|
2467 |
msgstr ""
|
2468 |
|
2469 |
+
#: pro/i18n/countries.php:34
|
2470 |
+
msgid "Botswana"
|
|
|
|
|
|
|
|
|
2471 |
msgstr ""
|
2472 |
|
2473 |
+
#: pro/i18n/countries.php:35
|
2474 |
+
msgid "Bouvet Island"
|
2475 |
msgstr ""
|
2476 |
|
2477 |
+
#: pro/i18n/countries.php:36
|
2478 |
+
msgid "Brazil"
|
2479 |
msgstr ""
|
2480 |
|
2481 |
+
#: pro/i18n/countries.php:37
|
2482 |
+
msgid "British Indian Ocean Territory"
|
|
|
|
|
2483 |
msgstr ""
|
2484 |
|
2485 |
+
#: pro/i18n/countries.php:38
|
2486 |
+
msgid "British Virgin Islands"
|
2487 |
msgstr ""
|
2488 |
|
2489 |
+
#: pro/i18n/countries.php:39
|
2490 |
+
msgid "Brunei"
|
|
|
|
|
2491 |
msgstr ""
|
2492 |
|
2493 |
+
#: pro/i18n/countries.php:40
|
2494 |
+
msgid "Bulgaria"
|
2495 |
msgstr ""
|
2496 |
|
2497 |
+
#: pro/i18n/countries.php:41
|
2498 |
+
msgid "Burkina Faso"
|
2499 |
msgstr ""
|
2500 |
|
2501 |
+
#: pro/i18n/countries.php:42
|
2502 |
+
msgid "Burundi"
|
|
|
|
|
|
|
|
|
2503 |
msgstr ""
|
2504 |
|
2505 |
+
#: pro/i18n/countries.php:43
|
2506 |
+
msgid "Cambodia"
|
2507 |
msgstr ""
|
2508 |
|
2509 |
+
#: pro/i18n/countries.php:44
|
2510 |
+
msgid "Cameroon"
|
|
|
|
|
|
|
|
|
|
|
2511 |
msgstr ""
|
2512 |
|
2513 |
+
#: pro/i18n/countries.php:45
|
2514 |
+
msgid "Canada"
|
2515 |
msgstr ""
|
2516 |
|
2517 |
+
#: pro/i18n/countries.php:46
|
2518 |
+
msgid "Cape Verde"
|
2519 |
msgstr ""
|
2520 |
|
2521 |
+
#: pro/i18n/countries.php:47
|
2522 |
+
msgid "Cayman Islands"
|
|
|
|
|
2523 |
msgstr ""
|
2524 |
|
2525 |
+
#: pro/i18n/countries.php:48
|
2526 |
+
msgid "Central African Republic"
|
2527 |
msgstr ""
|
2528 |
|
2529 |
+
#: pro/i18n/countries.php:49
|
2530 |
+
msgid "Chad"
|
2531 |
msgstr ""
|
2532 |
|
2533 |
+
#: pro/i18n/countries.php:50
|
2534 |
+
msgid "Chile"
|
2535 |
msgstr ""
|
2536 |
|
2537 |
+
#: pro/i18n/countries.php:51
|
2538 |
+
msgid "China"
|
2539 |
msgstr ""
|
2540 |
|
2541 |
+
#: pro/i18n/countries.php:52
|
2542 |
+
msgid "Christmas Island"
|
|
|
|
|
|
|
2543 |
msgstr ""
|
2544 |
|
2545 |
+
#: pro/i18n/countries.php:53
|
2546 |
+
msgid "Cocos/Keeling Islands"
|
2547 |
msgstr ""
|
2548 |
|
2549 |
+
#: pro/i18n/countries.php:54
|
2550 |
+
msgid "Colombia"
|
2551 |
msgstr ""
|
2552 |
|
2553 |
+
#: pro/i18n/countries.php:55
|
2554 |
+
msgid "Comoros"
|
2555 |
msgstr ""
|
2556 |
|
2557 |
+
#: pro/i18n/countries.php:56
|
2558 |
+
msgid "Congo (Brazzaville)"
|
2559 |
msgstr ""
|
2560 |
|
2561 |
+
#: pro/i18n/countries.php:57
|
2562 |
+
msgid "Congo (Kinshasa)"
|
|
|
|
|
|
|
2563 |
msgstr ""
|
2564 |
|
2565 |
+
#: pro/i18n/countries.php:58
|
2566 |
+
msgid "Cook Islands"
|
|
|
2567 |
msgstr ""
|
2568 |
|
2569 |
+
#: pro/i18n/countries.php:59
|
2570 |
+
msgid "Costa Rica"
|
2571 |
msgstr ""
|
2572 |
|
2573 |
+
#: pro/i18n/countries.php:60
|
2574 |
+
msgid "Croatia"
|
2575 |
+
msgstr ""
|
2576 |
|
2577 |
+
#: pro/i18n/countries.php:61
|
2578 |
+
msgid "Cuba"
|
2579 |
msgstr ""
|
2580 |
|
2581 |
+
#: pro/i18n/countries.php:62
|
2582 |
+
msgid "CuraÇao"
|
2583 |
msgstr ""
|
2584 |
|
2585 |
+
#: pro/i18n/countries.php:63
|
2586 |
+
msgid "Cyprus"
|
|
|
|
|
2587 |
msgstr ""
|
2588 |
|
2589 |
+
#: pro/i18n/countries.php:64
|
2590 |
+
msgid "Czech Republic"
|
|
|
2591 |
msgstr ""
|
2592 |
|
2593 |
+
#: pro/i18n/countries.php:65
|
2594 |
+
msgid "Denmark"
|
2595 |
msgstr ""
|
2596 |
|
2597 |
+
#: pro/i18n/countries.php:66
|
2598 |
+
msgid "Djibouti"
|
|
|
|
|
2599 |
msgstr ""
|
2600 |
|
2601 |
+
#: pro/i18n/countries.php:67
|
2602 |
+
msgid "Dominica"
|
2603 |
msgstr ""
|
2604 |
|
2605 |
+
#: pro/i18n/countries.php:68
|
2606 |
+
msgid "Dominican Republic"
|
|
|
|
|
|
|
|
|
2607 |
msgstr ""
|
2608 |
|
2609 |
+
#: pro/i18n/countries.php:69
|
2610 |
+
msgid "Ecuador"
|
2611 |
msgstr ""
|
2612 |
|
2613 |
+
#: pro/i18n/countries.php:70
|
2614 |
+
msgid "Egypt"
|
2615 |
msgstr ""
|
2616 |
|
2617 |
+
#: pro/i18n/countries.php:71
|
2618 |
+
msgid "El Salvador"
|
|
|
|
|
|
|
|
|
|
|
2619 |
msgstr ""
|
2620 |
|
2621 |
+
#: pro/i18n/countries.php:72
|
2622 |
+
msgid "Equatorial Guinea"
|
|
|
2623 |
msgstr ""
|
2624 |
|
2625 |
+
#: pro/i18n/countries.php:73
|
2626 |
+
msgid "Eritrea"
|
2627 |
msgstr ""
|
2628 |
|
2629 |
+
#: pro/i18n/countries.php:74
|
2630 |
+
msgid "Estonia"
|
|
|
|
|
2631 |
msgstr ""
|
2632 |
|
2633 |
+
#: pro/i18n/countries.php:75
|
2634 |
+
msgid "Ethiopia"
|
|
|
2635 |
msgstr ""
|
2636 |
|
2637 |
+
#: pro/i18n/countries.php:76
|
2638 |
+
msgid "Falkland Islands"
|
2639 |
msgstr ""
|
2640 |
|
2641 |
+
#: pro/i18n/countries.php:77
|
2642 |
+
msgid "Faroe Islands"
|
2643 |
msgstr ""
|
2644 |
|
2645 |
+
#: pro/i18n/countries.php:78
|
2646 |
+
msgid "Fiji"
|
|
|
2647 |
msgstr ""
|
2648 |
|
2649 |
+
#: pro/i18n/countries.php:79
|
2650 |
+
msgid "Finland"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2651 |
msgstr ""
|
2652 |
|
2653 |
+
#: pro/i18n/countries.php:80
|
2654 |
+
msgid "France"
|
|
|
|
|
2655 |
msgstr ""
|
2656 |
|
2657 |
+
#: pro/i18n/countries.php:81
|
2658 |
+
msgid "French Guiana"
|
|
|
2659 |
msgstr ""
|
2660 |
|
2661 |
+
#: pro/i18n/countries.php:82
|
2662 |
+
msgid "French Polynesia"
|
|
|
|
|
|
|
2663 |
msgstr ""
|
2664 |
|
2665 |
+
#: pro/i18n/countries.php:83
|
2666 |
+
msgid "French Southern Territories"
|
2667 |
msgstr ""
|
2668 |
|
2669 |
+
#: pro/i18n/countries.php:84
|
2670 |
+
msgid "Gabon"
|
2671 |
msgstr ""
|
2672 |
|
2673 |
+
#: pro/i18n/countries.php:85
|
2674 |
+
msgid "Gambia"
|
|
|
|
|
2675 |
msgstr ""
|
2676 |
|
2677 |
+
#: pro/i18n/countries.php:86
|
2678 |
+
msgid "Georgia"
|
|
|
2679 |
msgstr ""
|
2680 |
|
2681 |
+
#: pro/i18n/countries.php:87
|
2682 |
+
msgid "Germany"
|
|
|
|
|
|
|
|
|
2683 |
msgstr ""
|
2684 |
|
2685 |
+
#: pro/i18n/countries.php:88
|
2686 |
+
msgid "Ghana"
|
2687 |
msgstr ""
|
2688 |
|
2689 |
+
#: pro/i18n/countries.php:89
|
2690 |
+
msgid "Gibraltar"
|
2691 |
msgstr ""
|
2692 |
|
2693 |
+
#: pro/i18n/countries.php:90
|
2694 |
+
msgid "Greece"
|
2695 |
msgstr ""
|
2696 |
|
2697 |
+
#: pro/i18n/countries.php:91
|
2698 |
+
msgid "Greenland"
|
2699 |
msgstr ""
|
2700 |
|
2701 |
+
#: pro/i18n/countries.php:92
|
2702 |
+
msgid "Grenada"
|
|
|
|
|
|
|
|
|
2703 |
msgstr ""
|
2704 |
|
2705 |
+
#: pro/i18n/countries.php:93
|
2706 |
+
msgid "Guadeloupe"
|
|
|
2707 |
msgstr ""
|
2708 |
|
2709 |
+
#: pro/i18n/countries.php:94
|
2710 |
+
msgid "Guatemala"
|
2711 |
msgstr ""
|
2712 |
|
2713 |
+
#: pro/i18n/countries.php:95
|
2714 |
+
msgid "Guernsey"
|
2715 |
msgstr ""
|
2716 |
|
2717 |
+
#: pro/i18n/countries.php:96
|
2718 |
+
msgid "Guinea"
|
2719 |
msgstr ""
|
2720 |
|
2721 |
+
#: pro/i18n/countries.php:97
|
2722 |
+
msgid "Guinea-Bissau"
|
2723 |
msgstr ""
|
2724 |
|
2725 |
+
#: pro/i18n/countries.php:98
|
2726 |
+
msgid "Guyana"
|
2727 |
msgstr ""
|
2728 |
|
2729 |
+
#: pro/i18n/countries.php:99
|
2730 |
+
msgid "Haiti"
|
2731 |
msgstr ""
|
2732 |
|
2733 |
+
#: pro/i18n/countries.php:100
|
2734 |
+
msgid "Heard Island and McDonald Islands"
|
|
|
|
|
2735 |
msgstr ""
|
2736 |
|
2737 |
+
#: pro/i18n/countries.php:101
|
2738 |
+
msgid "Honduras"
|
2739 |
msgstr ""
|
2740 |
|
2741 |
+
#: pro/i18n/countries.php:102
|
2742 |
+
msgid "Hong Kong"
|
2743 |
msgstr ""
|
2744 |
|
2745 |
+
#: pro/i18n/countries.php:103
|
2746 |
+
msgid "Hungary"
|
2747 |
msgstr ""
|
2748 |
|
2749 |
+
#: pro/i18n/countries.php:104
|
2750 |
+
msgid "Iceland"
|
2751 |
msgstr ""
|
2752 |
|
2753 |
+
#: pro/i18n/countries.php:105
|
2754 |
+
msgid "India"
|
2755 |
+
msgstr ""
|
2756 |
+
|
2757 |
+
#: pro/i18n/countries.php:106
|
2758 |
+
msgid "Indonesia"
|
2759 |
+
msgstr ""
|
2760 |
+
|
2761 |
+
#: pro/i18n/countries.php:107
|
2762 |
+
msgid "Iran"
|
2763 |
+
msgstr ""
|
2764 |
+
|
2765 |
+
#: pro/i18n/countries.php:108
|
2766 |
+
msgid "Iraq"
|
2767 |
+
msgstr ""
|
2768 |
+
|
2769 |
+
#: pro/i18n/countries.php:109
|
2770 |
+
msgid "Republic of Ireland"
|
2771 |
+
msgstr ""
|
2772 |
+
|
2773 |
+
#: pro/i18n/countries.php:110
|
2774 |
+
msgid "Isle of Man"
|
2775 |
+
msgstr ""
|
2776 |
+
|
2777 |
+
#: pro/i18n/countries.php:111
|
2778 |
+
msgid "Israel"
|
2779 |
+
msgstr ""
|
2780 |
+
|
2781 |
+
#: pro/i18n/countries.php:112
|
2782 |
+
msgid "Italy"
|
2783 |
+
msgstr ""
|
2784 |
+
|
2785 |
+
#: pro/i18n/countries.php:113
|
2786 |
+
msgid "Ivory Coast"
|
2787 |
+
msgstr ""
|
2788 |
+
|
2789 |
+
#: pro/i18n/countries.php:114
|
2790 |
+
msgid "Jamaica"
|
2791 |
+
msgstr ""
|
2792 |
+
|
2793 |
+
#: pro/i18n/countries.php:115
|
2794 |
+
msgid "Japan"
|
2795 |
+
msgstr ""
|
2796 |
+
|
2797 |
+
#: pro/i18n/countries.php:116
|
2798 |
+
msgid "Jersey"
|
2799 |
+
msgstr ""
|
2800 |
+
|
2801 |
+
#: pro/i18n/countries.php:117
|
2802 |
+
msgid "Jordan"
|
2803 |
+
msgstr ""
|
2804 |
+
|
2805 |
+
#: pro/i18n/countries.php:118
|
2806 |
+
msgid "Kazakhstan"
|
2807 |
+
msgstr ""
|
2808 |
+
|
2809 |
+
#: pro/i18n/countries.php:119
|
2810 |
+
msgid "Kenya"
|
2811 |
+
msgstr ""
|
2812 |
+
|
2813 |
+
#: pro/i18n/countries.php:120
|
2814 |
+
msgid "Kiribati"
|
2815 |
+
msgstr ""
|
2816 |
+
|
2817 |
+
#: pro/i18n/countries.php:121
|
2818 |
+
msgid "Kuwait"
|
2819 |
+
msgstr ""
|
2820 |
+
|
2821 |
+
#: pro/i18n/countries.php:122
|
2822 |
+
msgid "Kyrgyzstan"
|
2823 |
+
msgstr ""
|
2824 |
+
|
2825 |
+
#: pro/i18n/countries.php:123
|
2826 |
+
msgid "Laos"
|
2827 |
+
msgstr ""
|
2828 |
+
|
2829 |
+
#: pro/i18n/countries.php:124
|
2830 |
+
msgid "Latvia"
|
2831 |
+
msgstr ""
|
2832 |
+
|
2833 |
+
#: pro/i18n/countries.php:125
|
2834 |
+
msgid "Lebanon"
|
2835 |
+
msgstr ""
|
2836 |
+
|
2837 |
+
#: pro/i18n/countries.php:126
|
2838 |
+
msgid "Lesotho"
|
2839 |
+
msgstr ""
|
2840 |
+
|
2841 |
+
#: pro/i18n/countries.php:127
|
2842 |
+
msgid "Liberia"
|
2843 |
+
msgstr ""
|
2844 |
+
|
2845 |
+
#: pro/i18n/countries.php:128
|
2846 |
+
msgid "Libya"
|
2847 |
+
msgstr ""
|
2848 |
+
|
2849 |
+
#: pro/i18n/countries.php:129
|
2850 |
+
msgid "Liechtenstein"
|
2851 |
+
msgstr ""
|
2852 |
+
|
2853 |
+
#: pro/i18n/countries.php:130
|
2854 |
+
msgid "Lithuania"
|
2855 |
+
msgstr ""
|
2856 |
+
|
2857 |
+
#: pro/i18n/countries.php:131
|
2858 |
+
msgid "Luxembourg"
|
2859 |
+
msgstr ""
|
2860 |
+
|
2861 |
+
#: pro/i18n/countries.php:132
|
2862 |
+
msgid "Macao S.A.R., China"
|
2863 |
+
msgstr ""
|
2864 |
+
|
2865 |
+
#: pro/i18n/countries.php:133
|
2866 |
+
msgid "Macedonia"
|
2867 |
+
msgstr ""
|
2868 |
+
|
2869 |
+
#: pro/i18n/countries.php:134
|
2870 |
+
msgid "Madagascar"
|
2871 |
+
msgstr ""
|
2872 |
+
|
2873 |
+
#: pro/i18n/countries.php:135
|
2874 |
+
msgid "Malawi"
|
2875 |
+
msgstr ""
|
2876 |
+
|
2877 |
+
#: pro/i18n/countries.php:136
|
2878 |
+
msgid "Malaysia"
|
2879 |
+
msgstr ""
|
2880 |
+
|
2881 |
+
#: pro/i18n/countries.php:137
|
2882 |
+
msgid "Maldives"
|
2883 |
+
msgstr ""
|
2884 |
+
|
2885 |
+
#: pro/i18n/countries.php:138
|
2886 |
+
msgid "Mali"
|
2887 |
+
msgstr ""
|
2888 |
+
|
2889 |
+
#: pro/i18n/countries.php:139
|
2890 |
+
msgid "Malta"
|
2891 |
+
msgstr ""
|
2892 |
+
|
2893 |
+
#: pro/i18n/countries.php:140
|
2894 |
+
msgid "Marshall Islands"
|
2895 |
+
msgstr ""
|
2896 |
+
|
2897 |
+
#: pro/i18n/countries.php:141
|
2898 |
+
msgid "Martinique"
|
2899 |
+
msgstr ""
|
2900 |
+
|
2901 |
+
#: pro/i18n/countries.php:142
|
2902 |
+
msgid "Mauritania"
|
2903 |
+
msgstr ""
|
2904 |
+
|
2905 |
+
#: pro/i18n/countries.php:143
|
2906 |
+
msgid "Mauritius"
|
2907 |
+
msgstr ""
|
2908 |
+
|
2909 |
+
#: pro/i18n/countries.php:144
|
2910 |
+
msgid "Mayotte"
|
2911 |
+
msgstr ""
|
2912 |
+
|
2913 |
+
#: pro/i18n/countries.php:145
|
2914 |
+
msgid "Mexico"
|
2915 |
+
msgstr ""
|
2916 |
+
|
2917 |
+
#: pro/i18n/countries.php:146
|
2918 |
+
msgid "Micronesia"
|
2919 |
+
msgstr ""
|
2920 |
+
|
2921 |
+
#: pro/i18n/countries.php:147
|
2922 |
+
msgid "Moldova"
|
2923 |
+
msgstr ""
|
2924 |
+
|
2925 |
+
#: pro/i18n/countries.php:148
|
2926 |
+
msgid "Monaco"
|
2927 |
+
msgstr ""
|
2928 |
+
|
2929 |
+
#: pro/i18n/countries.php:149
|
2930 |
+
msgid "Mongolia"
|
2931 |
+
msgstr ""
|
2932 |
+
|
2933 |
+
#: pro/i18n/countries.php:150
|
2934 |
+
msgid "Montenegro"
|
2935 |
+
msgstr ""
|
2936 |
+
|
2937 |
+
#: pro/i18n/countries.php:151
|
2938 |
+
msgid "Montserrat"
|
2939 |
+
msgstr ""
|
2940 |
+
|
2941 |
+
#: pro/i18n/countries.php:152
|
2942 |
+
msgid "Morocco"
|
2943 |
+
msgstr ""
|
2944 |
+
|
2945 |
+
#: pro/i18n/countries.php:153
|
2946 |
+
msgid "Mozambique"
|
2947 |
+
msgstr ""
|
2948 |
+
|
2949 |
+
#: pro/i18n/countries.php:154
|
2950 |
+
msgid "Myanmar"
|
2951 |
+
msgstr ""
|
2952 |
+
|
2953 |
+
#: pro/i18n/countries.php:155
|
2954 |
+
msgid "Namibia"
|
2955 |
+
msgstr ""
|
2956 |
+
|
2957 |
+
#: pro/i18n/countries.php:156
|
2958 |
+
msgid "Nauru"
|
2959 |
+
msgstr ""
|
2960 |
+
|
2961 |
+
#: pro/i18n/countries.php:157
|
2962 |
+
msgid "Nepal"
|
2963 |
+
msgstr ""
|
2964 |
+
|
2965 |
+
#: pro/i18n/countries.php:158
|
2966 |
+
msgid "Netherlands"
|
2967 |
+
msgstr ""
|
2968 |
+
|
2969 |
+
#: pro/i18n/countries.php:159
|
2970 |
+
msgid "Netherlands Antilles"
|
2971 |
+
msgstr ""
|
2972 |
+
|
2973 |
+
#: pro/i18n/countries.php:160
|
2974 |
+
msgid "New Caledonia"
|
2975 |
+
msgstr ""
|
2976 |
+
|
2977 |
+
#: pro/i18n/countries.php:161
|
2978 |
+
msgid "New Zealand"
|
2979 |
+
msgstr ""
|
2980 |
+
|
2981 |
+
#: pro/i18n/countries.php:162
|
2982 |
+
msgid "Nicaragua"
|
2983 |
+
msgstr ""
|
2984 |
+
|
2985 |
+
#: pro/i18n/countries.php:163
|
2986 |
+
msgid "Niger"
|
2987 |
+
msgstr ""
|
2988 |
+
|
2989 |
+
#: pro/i18n/countries.php:164
|
2990 |
+
msgid "Nigeria"
|
2991 |
+
msgstr ""
|
2992 |
+
|
2993 |
+
#: pro/i18n/countries.php:165
|
2994 |
+
msgid "Niue"
|
2995 |
+
msgstr ""
|
2996 |
+
|
2997 |
+
#: pro/i18n/countries.php:166
|
2998 |
+
msgid "Norfolk Island"
|
2999 |
+
msgstr ""
|
3000 |
+
|
3001 |
+
#: pro/i18n/countries.php:167
|
3002 |
+
msgid "North Korea"
|
3003 |
+
msgstr ""
|
3004 |
+
|
3005 |
+
#: pro/i18n/countries.php:168
|
3006 |
+
msgid "Norway"
|
3007 |
+
msgstr ""
|
3008 |
+
|
3009 |
+
#: pro/i18n/countries.php:169
|
3010 |
+
msgid "Oman"
|
3011 |
+
msgstr ""
|
3012 |
+
|
3013 |
+
#: pro/i18n/countries.php:170
|
3014 |
+
msgid "Pakistan"
|
3015 |
+
msgstr ""
|
3016 |
+
|
3017 |
+
#: pro/i18n/countries.php:171
|
3018 |
+
msgid "Palestinian Territory"
|
3019 |
+
msgstr ""
|
3020 |
+
|
3021 |
+
#: pro/i18n/countries.php:172
|
3022 |
+
msgid "Panama"
|
3023 |
+
msgstr ""
|
3024 |
+
|
3025 |
+
#: pro/i18n/countries.php:173
|
3026 |
+
msgid "Papua New Guinea"
|
3027 |
+
msgstr ""
|
3028 |
+
|
3029 |
+
#: pro/i18n/countries.php:174
|
3030 |
+
msgid "Paraguay"
|
3031 |
+
msgstr ""
|
3032 |
+
|
3033 |
+
#: pro/i18n/countries.php:175
|
3034 |
+
msgid "Peru"
|
3035 |
+
msgstr ""
|
3036 |
+
|
3037 |
+
#: pro/i18n/countries.php:176
|
3038 |
+
msgid "Philippines"
|
3039 |
+
msgstr ""
|
3040 |
+
|
3041 |
+
#: pro/i18n/countries.php:177
|
3042 |
+
msgid "Pitcairn"
|
3043 |
+
msgstr ""
|
3044 |
+
|
3045 |
+
#: pro/i18n/countries.php:178
|
3046 |
+
msgid "Poland"
|
3047 |
+
msgstr ""
|
3048 |
+
|
3049 |
+
#: pro/i18n/countries.php:179
|
3050 |
+
msgid "Portugal"
|
3051 |
+
msgstr ""
|
3052 |
+
|
3053 |
+
#: pro/i18n/countries.php:180
|
3054 |
+
msgid "Qatar"
|
3055 |
+
msgstr ""
|
3056 |
+
|
3057 |
+
#: pro/i18n/countries.php:181
|
3058 |
+
msgid "Reunion"
|
3059 |
+
msgstr ""
|
3060 |
+
|
3061 |
+
#: pro/i18n/countries.php:182
|
3062 |
+
msgid "Romania"
|
3063 |
+
msgstr ""
|
3064 |
+
|
3065 |
+
#: pro/i18n/countries.php:183
|
3066 |
+
msgid "Russia"
|
3067 |
+
msgstr ""
|
3068 |
+
|
3069 |
+
#: pro/i18n/countries.php:184
|
3070 |
+
msgid "Rwanda"
|
3071 |
+
msgstr ""
|
3072 |
+
|
3073 |
+
#: pro/i18n/countries.php:185
|
3074 |
+
msgid "Saint Barthélemy"
|
3075 |
+
msgstr ""
|
3076 |
+
|
3077 |
+
#: pro/i18n/countries.php:186
|
3078 |
+
msgid "Saint Helena"
|
3079 |
+
msgstr ""
|
3080 |
+
|
3081 |
+
#: pro/i18n/countries.php:187
|
3082 |
+
msgid "Saint Kitts and Nevis"
|
3083 |
+
msgstr ""
|
3084 |
+
|
3085 |
+
#: pro/i18n/countries.php:188
|
3086 |
+
msgid "Saint Lucia"
|
3087 |
+
msgstr ""
|
3088 |
+
|
3089 |
+
#: pro/i18n/countries.php:189
|
3090 |
+
msgid "Saint Martin (French part)"
|
3091 |
+
msgstr ""
|
3092 |
+
|
3093 |
+
#: pro/i18n/countries.php:190
|
3094 |
+
msgid "Saint Martin (Dutch part)"
|
3095 |
msgstr ""
|
3096 |
|
3097 |
+
#: pro/i18n/countries.php:191
|
3098 |
+
msgid "Saint Pierre and Miquelon"
|
3099 |
msgstr ""
|
3100 |
|
3101 |
+
#: pro/i18n/countries.php:192
|
3102 |
+
msgid "Saint Vincent and the Grenadines"
|
3103 |
msgstr ""
|
3104 |
|
3105 |
+
#: pro/i18n/countries.php:193
|
3106 |
+
msgid "San Marino"
|
3107 |
msgstr ""
|
3108 |
|
3109 |
+
#: pro/i18n/countries.php:194
|
3110 |
+
msgid "São Tomé and Príncipe"
|
3111 |
msgstr ""
|
3112 |
|
3113 |
+
#: pro/i18n/countries.php:195
|
3114 |
+
msgid "Saudi Arabia"
|
3115 |
msgstr ""
|
3116 |
|
3117 |
+
#: pro/i18n/countries.php:196
|
3118 |
+
msgid "Senegal"
|
3119 |
msgstr ""
|
3120 |
|
3121 |
+
#: pro/i18n/countries.php:197
|
3122 |
+
msgid "Serbia"
|
3123 |
msgstr ""
|
3124 |
|
3125 |
+
#: pro/i18n/countries.php:198
|
3126 |
+
msgid "Seychelles"
|
3127 |
msgstr ""
|
3128 |
|
3129 |
+
#: pro/i18n/countries.php:199
|
3130 |
+
msgid "Sierra Leone"
|
3131 |
msgstr ""
|
3132 |
|
3133 |
+
#: pro/i18n/countries.php:200
|
3134 |
+
msgid "Singapore"
|
3135 |
msgstr ""
|
3136 |
|
3137 |
+
#: pro/i18n/countries.php:201
|
3138 |
+
msgid "Slovakia"
|
3139 |
msgstr ""
|
3140 |
|
3141 |
+
#: pro/i18n/countries.php:202
|
3142 |
+
msgid "Slovenia"
|
3143 |
msgstr ""
|
3144 |
|
3145 |
+
#: pro/i18n/countries.php:203
|
3146 |
+
msgid "Solomon Islands"
|
3147 |
msgstr ""
|
3148 |
|
3149 |
+
#: pro/i18n/countries.php:204
|
3150 |
+
msgid "Somalia"
|
3151 |
msgstr ""
|
3152 |
|
3153 |
+
#: pro/i18n/countries.php:205
|
3154 |
+
msgid "South Africa"
|
|
|
|
|
3155 |
msgstr ""
|
3156 |
|
3157 |
+
#: pro/i18n/countries.php:206
|
3158 |
+
msgid "South Georgia/Sandwich Islands"
|
3159 |
msgstr ""
|
3160 |
|
3161 |
+
#: pro/i18n/countries.php:207
|
3162 |
+
msgid "South Korea"
|
3163 |
msgstr ""
|
3164 |
|
3165 |
+
#: pro/i18n/countries.php:208
|
3166 |
+
msgid "South Sudan"
|
|
|
3167 |
msgstr ""
|
3168 |
|
3169 |
+
#: pro/i18n/countries.php:209
|
3170 |
+
msgid "Spain"
|
3171 |
msgstr ""
|
3172 |
|
3173 |
+
#: pro/i18n/countries.php:210
|
3174 |
+
msgid "Sri Lanka"
|
3175 |
msgstr ""
|
3176 |
|
3177 |
+
#: pro/i18n/countries.php:211
|
3178 |
+
msgid "Sudan"
|
3179 |
msgstr ""
|
3180 |
|
3181 |
+
#: pro/i18n/countries.php:212
|
3182 |
+
msgid "Suriname"
|
3183 |
msgstr ""
|
3184 |
|
3185 |
+
#: pro/i18n/countries.php:213
|
3186 |
+
msgid "Svalbard and Jan Mayen"
|
|
|
|
|
3187 |
msgstr ""
|
3188 |
|
3189 |
+
#: pro/i18n/countries.php:214
|
3190 |
+
msgid "Swaziland"
|
3191 |
msgstr ""
|
3192 |
|
3193 |
+
#: pro/i18n/countries.php:215
|
3194 |
+
msgid "Sweden"
|
3195 |
msgstr ""
|
3196 |
|
3197 |
+
#: pro/i18n/countries.php:216
|
3198 |
+
msgid "Switzerland"
|
3199 |
msgstr ""
|
3200 |
|
3201 |
+
#: pro/i18n/countries.php:217
|
3202 |
+
msgid "Syria"
|
3203 |
msgstr ""
|
3204 |
|
3205 |
+
#: pro/i18n/countries.php:218
|
3206 |
+
msgid "Taiwan"
|
3207 |
msgstr ""
|
3208 |
|
3209 |
+
#: pro/i18n/countries.php:219
|
3210 |
+
msgid "Tajikistan"
|
3211 |
msgstr ""
|
3212 |
|
3213 |
+
#: pro/i18n/countries.php:220
|
3214 |
+
msgid "Tanzania"
|
3215 |
msgstr ""
|
3216 |
|
3217 |
+
#: pro/i18n/countries.php:221
|
3218 |
+
msgid "Thailand"
|
|
|
|
|
3219 |
msgstr ""
|
3220 |
|
3221 |
+
#: pro/i18n/countries.php:222
|
3222 |
+
msgid "Timor-Leste"
|
3223 |
msgstr ""
|
3224 |
|
3225 |
+
#: pro/i18n/countries.php:223
|
3226 |
+
msgid "Togo"
|
3227 |
msgstr ""
|
3228 |
|
3229 |
+
#: pro/i18n/countries.php:224
|
3230 |
+
msgid "Tokelau"
|
3231 |
msgstr ""
|
3232 |
|
3233 |
+
#: pro/i18n/countries.php:225
|
3234 |
+
msgid "Tonga"
|
|
|
|
|
|
|
3235 |
msgstr ""
|
3236 |
|
3237 |
+
#: pro/i18n/countries.php:226
|
3238 |
+
msgid "Trinidad and Tobago"
|
3239 |
msgstr ""
|
3240 |
|
3241 |
+
#: pro/i18n/countries.php:227
|
3242 |
+
msgid "Tunisia"
|
3243 |
msgstr ""
|
3244 |
|
3245 |
+
#: pro/i18n/countries.php:228
|
3246 |
+
msgid "Turkey"
|
|
|
|
|
3247 |
msgstr ""
|
3248 |
|
3249 |
+
#: pro/i18n/countries.php:229
|
3250 |
+
msgid "Turkmenistan"
|
3251 |
msgstr ""
|
3252 |
|
3253 |
+
#: pro/i18n/countries.php:230
|
3254 |
+
msgid "Turks and Caicos Islands"
|
3255 |
msgstr ""
|
3256 |
|
3257 |
+
#: pro/i18n/countries.php:231
|
3258 |
+
msgid "Tuvalu"
|
|
|
|
|
3259 |
msgstr ""
|
3260 |
|
3261 |
+
#: pro/i18n/countries.php:232
|
3262 |
+
msgid "Uganda"
|
3263 |
msgstr ""
|
3264 |
|
3265 |
+
#: pro/i18n/countries.php:233
|
3266 |
+
msgid "Ukraine"
|
3267 |
msgstr ""
|
3268 |
|
3269 |
+
#: pro/i18n/countries.php:234
|
3270 |
+
msgid "United Arab Emirates"
|
3271 |
msgstr ""
|
3272 |
|
3273 |
+
#: pro/i18n/countries.php:235
|
3274 |
+
msgid "United Kingdom (UK)"
|
3275 |
msgstr ""
|
3276 |
|
3277 |
+
#: pro/i18n/countries.php:236
|
3278 |
+
msgid "United States"
|
3279 |
msgstr ""
|
3280 |
|
3281 |
+
#: pro/i18n/countries.php:237
|
3282 |
+
msgid "Uruguay"
|
|
|
|
|
|
|
3283 |
msgstr ""
|
3284 |
|
3285 |
+
#: pro/i18n/countries.php:238
|
3286 |
+
msgid "Uzbekistan"
|
3287 |
msgstr ""
|
3288 |
|
3289 |
+
#: pro/i18n/countries.php:239
|
3290 |
+
msgid "Vanuatu"
|
3291 |
msgstr ""
|
3292 |
|
3293 |
+
#: pro/i18n/countries.php:240
|
3294 |
+
msgid "Vatican"
|
|
|
|
|
|
|
3295 |
msgstr ""
|
3296 |
|
3297 |
+
#: pro/i18n/countries.php:241
|
3298 |
+
msgid "Venezuela"
|
3299 |
msgstr ""
|
3300 |
|
3301 |
+
#: pro/i18n/countries.php:242
|
3302 |
+
msgid "Vietnam"
|
3303 |
msgstr ""
|
3304 |
|
3305 |
+
#: pro/i18n/countries.php:243
|
3306 |
+
msgid "Wallis and Futuna"
|
|
|
|
|
|
|
3307 |
msgstr ""
|
3308 |
|
3309 |
+
#: pro/i18n/countries.php:244
|
3310 |
+
msgid "Western Sahara"
|
3311 |
msgstr ""
|
3312 |
|
3313 |
+
#: pro/i18n/countries.php:245
|
3314 |
+
msgid "Western Samoa"
|
3315 |
msgstr ""
|
3316 |
|
3317 |
+
#: pro/i18n/countries.php:246
|
3318 |
+
msgid "Yemen"
|
|
|
|
|
|
|
3319 |
msgstr ""
|
3320 |
|
3321 |
+
#: pro/i18n/countries.php:247
|
3322 |
+
msgid "Zambia"
|
3323 |
msgstr ""
|
3324 |
|
3325 |
+
#: pro/i18n/countries.php:248
|
3326 |
+
msgid "Zimbabwe"
|
3327 |
msgstr ""
|
3328 |
|
3329 |
+
#: app/helpers/PrliAppHelper.php:20
|
3330 |
+
#: app/views/links/form.php:30
|
3331 |
+
#: app/controllers/PrliLinksController.php:383
|
3332 |
+
#: app/controllers/PrliLinksController.php:389
|
3333 |
+
#: app/controllers/PrliLinksController.php:395
|
3334 |
+
msgid "Pro"
|
3335 |
msgstr ""
|
3336 |
|
3337 |
+
#: app/helpers/PrliAppHelper.php:21
|
3338 |
+
msgid "Upgrade to Pro to unlock this feature"
|
3339 |
msgstr ""
|
3340 |
|
3341 |
+
#: app/helpers/PrliLinksHelper.php:14
|
3342 |
+
#: app/views/links/form_basic.php:15
|
3343 |
+
#: app/views/shared/tinymce_form_popup.php:32
|
3344 |
+
msgid "307 (Temporary)"
|
3345 |
msgstr ""
|
3346 |
|
3347 |
+
#: app/helpers/PrliLinksHelper.php:15
|
3348 |
+
#: app/views/links/form_basic.php:16
|
3349 |
+
#: app/views/shared/tinymce_form_popup.php:33
|
3350 |
+
msgid "302 (Temporary)"
|
3351 |
msgstr ""
|
3352 |
|
3353 |
+
#: app/helpers/PrliLinksHelper.php:16
|
3354 |
+
#: app/views/links/form_basic.php:17
|
3355 |
+
#: app/views/shared/tinymce_form_popup.php:34
|
3356 |
+
msgid "301 (Permanent)"
|
3357 |
msgstr ""
|
3358 |
|
3359 |
+
#: app/helpers/PrliLinksHelper.php:27
|
3360 |
+
msgid "PrettyBar Redirection"
|
|
|
|
|
3361 |
msgstr ""
|
3362 |
|
3363 |
+
#: app/helpers/PrliLinksHelper.php:30
|
3364 |
+
msgid "Cloaked Redirection"
|
3365 |
msgstr ""
|
3366 |
|
3367 |
+
#: app/helpers/PrliLinksHelper.php:33
|
3368 |
+
msgid "Pixel Tracking Redirection"
|
3369 |
msgstr ""
|
3370 |
|
3371 |
+
#: app/helpers/PrliLinksHelper.php:36
|
3372 |
+
msgid "Meta Refresh Redirection"
|
|
|
|
|
3373 |
msgstr ""
|
3374 |
|
3375 |
+
#: app/helpers/PrliLinksHelper.php:39
|
3376 |
+
msgid "Javascript Redirection"
|
3377 |
msgstr ""
|
3378 |
|
3379 |
+
#: app/helpers/PrliLinksHelper.php:42
|
3380 |
+
msgid "Temporary (307) Redirection"
|
3381 |
msgstr ""
|
3382 |
|
3383 |
+
#: app/helpers/PrliLinksHelper.php:45
|
3384 |
+
msgid "Temporary (302) Redirection"
|
3385 |
msgstr ""
|
3386 |
|
3387 |
+
#: app/helpers/PrliLinksHelper.php:48
|
3388 |
+
msgid "Permanent (301) Redirection"
|
3389 |
msgstr ""
|
3390 |
|
3391 |
+
#: app/helpers/PrliLinksHelper.php:52
|
3392 |
+
msgid "Nofollow Enabled"
|
3393 |
msgstr ""
|
3394 |
|
3395 |
+
#: app/helpers/PrliLinksHelper.php:56
|
3396 |
+
msgid "Parameter Forwarding Enabled"
|
|
|
|
|
|
|
3397 |
msgstr ""
|
3398 |
|
3399 |
+
#: app/helpers/PrliLinksHelper.php:68
|
3400 |
+
msgid "Are you sure you want to delete your %s Pretty Link? This will delete the Pretty Link and all of the statistical data about it in your database."
|
3401 |
msgstr ""
|
3402 |
|
3403 |
+
#: app/helpers/PrliLinksHelper.php:69
|
3404 |
+
msgid "Are you sure you want to reset your %s Pretty Link? This will delete all of the statistical data about this Pretty Link in your database."
|
3405 |
msgstr ""
|
3406 |
|
3407 |
+
#: app/helpers/PrliLinksHelper.php:69
|
3408 |
+
#: app/helpers/PrliLinksHelper.php:147
|
3409 |
+
msgid "Reset %s"
|
|
|
3410 |
msgstr ""
|
3411 |
|
3412 |
+
#: app/helpers/PrliLinksHelper.php:72
|
3413 |
+
#: app/views/clicks/list.php:161
|
3414 |
+
msgid "View clicks for %s"
|
3415 |
msgstr ""
|
3416 |
|
3417 |
+
#: app/helpers/PrliLinksHelper.php:77
|
3418 |
+
#: app/helpers/PrliLinksHelper.php:158
|
3419 |
+
msgid "Post %s to Twitter"
|
3420 |
msgstr ""
|
3421 |
|
3422 |
+
#: app/helpers/PrliLinksHelper.php:78
|
3423 |
+
#: app/helpers/PrliLinksHelper.php:169
|
3424 |
+
msgid "Send %s in an Email"
|
|
|
3425 |
msgstr ""
|
3426 |
|
3427 |
+
#: app/helpers/PrliLinksHelper.php:83
|
3428 |
+
#: app/helpers/PrliLinksHelper.php:180
|
3429 |
+
msgid "Visit Target URL: %s in a New Window"
|
3430 |
msgstr ""
|
3431 |
|
3432 |
+
#: app/helpers/PrliLinksHelper.php:84
|
3433 |
+
#: app/helpers/PrliLinksHelper.php:191
|
3434 |
+
msgid "Visit Short URL: %s in a New Window"
|
3435 |
msgstr ""
|
3436 |
|
3437 |
+
#: app/helpers/PrliLinksHelper.php:102
|
3438 |
+
msgid "%d Clicks / %d Uniques"
|
|
|
|
|
|
|
|
|
|
|
|
|
3439 |
msgstr ""
|
3440 |
|
3441 |
+
#: app/helpers/PrliLinksHelper.php:111
|
3442 |
+
msgid "This link isn't being tracked"
|
3443 |
msgstr ""
|
3444 |
|
3445 |
+
#: app/helpers/PrliLinksHelper.php:135
|
3446 |
+
msgid "Target URL:"
|
3447 |
msgstr ""
|
3448 |
|
3449 |
+
#: app/helpers/PrliLinksHelper.php:167
|
3450 |
+
#: app/views/links/form_basic.php:48
|
3451 |
+
#: app/views/shared/tinymce_form_popup.php:78
|
3452 |
+
#: app/views/widgets/widget.php:15
|
3453 |
+
#: app/controllers/PrliLinksController.php:44
|
3454 |
+
msgid "Pretty Link"
|
3455 |
msgstr ""
|
3456 |
|
3457 |
+
#: app/models/PrliUtils.php:88
|
3458 |
+
msgid "*** Pretty Links Debug: %s"
|
3459 |
msgstr ""
|
3460 |
|
3461 |
+
#: app/models/PrliUtils.php:98
|
3462 |
+
msgid "The Slug can't be empty"
|
3463 |
msgstr ""
|
3464 |
|
3465 |
+
#: app/models/PrliUtils.php:106
|
3466 |
+
msgid "There's a file this slug conflicts with: %s"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3467 |
msgstr ""
|
3468 |
|
3469 |
+
#: app/models/PrliUtils.php:115
|
3470 |
+
msgid "This Pretty Link Slug is already taken. There's already another pretty link with this slug: %s"
|
3471 |
msgstr ""
|
3472 |
|
3473 |
+
#: app/models/PrliUtils.php:133
|
3474 |
+
msgid "This Pretty Link Slug is already taken. The path resolved to URL: %s"
|
|
|
|
|
|
|
|
|
|
|
|
|
3475 |
msgstr ""
|
3476 |
|
3477 |
+
#: app/models/PrliUtils.php:138
|
3478 |
+
msgid "This Pretty Link Slug is already taken. The path redirected to URL: %s"
|
3479 |
msgstr ""
|
3480 |
|
3481 |
+
#. translators: %1$s: open link tag, %2$s: close link tag, %3$s: br tag
|
3482 |
+
#: app/models/PrliUtils.php:1107
|
3483 |
+
msgid "Get started by %1$sadding a URL%2$s that you want to turn into a pretty link.%3$sCome back to see how many times it was clicked."
|
|
|
3484 |
msgstr ""
|
3485 |
|
3486 |
+
#: app/models/PrliLink.php:495
|
3487 |
+
msgid "Target URL can't be blank"
|
3488 |
msgstr ""
|
3489 |
|
3490 |
+
#: app/models/PrliLink.php:499
|
3491 |
+
msgid "Target URL must be different than the Pretty Link"
|
3492 |
msgstr ""
|
3493 |
|
3494 |
+
#: app/models/PrliLink.php:503
|
3495 |
+
msgid "Link URL must be a correctly formatted url"
|
3496 |
msgstr ""
|
3497 |
|
3498 |
+
#: app/models/PrliLink.php:507
|
3499 |
+
msgid "Pretty Link slugs must not contain question marks, ampersands or number signs."
|
3500 |
msgstr ""
|
3501 |
|
3502 |
+
#: app/models/PrliLink.php:511
|
3503 |
+
msgid "Pretty Link slugs must not end with a slash (\"/\")"
|
|
|
|
|
3504 |
msgstr ""
|
3505 |
|
3506 |
+
#: app/models/PrliClick.php:237
|
3507 |
+
msgid "all links"
|
3508 |
msgstr ""
|
3509 |
|
3510 |
+
#: app/models/PrliClick.php:244
|
3511 |
+
msgid "All clicks"
|
3512 |
msgstr ""
|
3513 |
|
3514 |
+
#: app/models/PrliClick.php:247
|
3515 |
+
msgid "Unique hits"
|
3516 |
msgstr ""
|
3517 |
|
3518 |
+
#: app/models/PrliClick.php:251
|
3519 |
+
msgid "on"
|
3520 |
msgstr ""
|
3521 |
|
3522 |
+
#: app/models/PrliGroup.php:114
|
3523 |
+
msgid "Group must have a name."
|
|
|
|
|
3524 |
msgstr ""
|
3525 |
|
3526 |
+
#: app/views/links/form_advanced.php:6
|
3527 |
+
msgid "No Follow"
|
3528 |
msgstr ""
|
3529 |
|
3530 |
+
#: app/views/links/form_advanced.php:9
|
3531 |
+
msgid "Nofollow Link"
|
3532 |
msgstr ""
|
3533 |
|
3534 |
+
#: app/views/links/form_advanced.php:10
|
3535 |
+
msgid "Add a nofollow and noindex to this link's http redirect header"
|
|
|
|
|
|
|
3536 |
msgstr ""
|
3537 |
|
3538 |
+
#: app/views/links/form_advanced.php:19
|
3539 |
+
#: app/views/links/form_advanced.php:22
|
3540 |
+
msgid "Delay Redirect"
|
3541 |
msgstr ""
|
3542 |
|
3543 |
+
#: app/views/links/form_advanced.php:23
|
3544 |
+
msgid "Time in seconds to wait before redirecting"
|
3545 |
msgstr ""
|
3546 |
|
3547 |
+
#: app/views/links/form_advanced.php:32
|
3548 |
+
#: app/views/links/form_advanced.php:35
|
3549 |
+
msgid "Parameter Forwarding"
|
|
|
3550 |
msgstr ""
|
3551 |
|
3552 |
+
#: app/views/links/form_advanced.php:36
|
3553 |
+
msgid "Forward parameters passed to this link onto the Target URL"
|
3554 |
msgstr ""
|
3555 |
|
3556 |
+
#: app/views/links/form_advanced.php:45
|
3557 |
+
#: app/views/links/form_advanced.php:48
|
3558 |
+
#: app/views/shared/tinymce_form_popup.php:54
|
3559 |
+
msgid "Tracking"
|
3560 |
msgstr ""
|
3561 |
|
3562 |
+
#: app/views/links/form_advanced.php:49
|
3563 |
+
msgid "Enable Pretty Link's built-in hit (click) tracking"
|
|
|
|
|
3564 |
msgstr ""
|
3565 |
|
3566 |
+
#: app/views/links/form_advanced.php:61
|
3567 |
+
msgid "Google Analytics Tracking"
|
3568 |
msgstr ""
|
3569 |
|
3570 |
+
#: app/views/links/form_advanced.php:62
|
3571 |
+
msgid "Requires the Google Analyticator, Google Analytics by MonsterInsights (formerly Yoast) or Google Analytics Plugin installed and configured for this to work."
|
3572 |
msgstr ""
|
3573 |
|
3574 |
+
#: app/views/links/form_advanced.php:75
|
3575 |
+
msgid "It appears that %s is currently installed. Pretty Link will attempt to use its settings to track this link."
|
|
|
|
|
3576 |
msgstr ""
|
3577 |
|
3578 |
+
#: app/views/links/form_advanced.php:84
|
3579 |
+
msgid "No Google Analytics Plugin is currently installed. Pretty Link cannot track links using Google Analytics until one is."
|
3580 |
msgstr ""
|
3581 |
|
3582 |
+
#: app/views/links/form.php:28
|
3583 |
+
msgid "Basic"
|
3584 |
msgstr ""
|
3585 |
|
3586 |
+
#: app/views/links/form.php:29
|
3587 |
+
msgid "Advanced"
|
|
|
|
|
3588 |
msgstr ""
|
3589 |
|
3590 |
+
#: app/views/links/form_basic.php:6
|
3591 |
+
msgid "Redirection*"
|
3592 |
msgstr ""
|
3593 |
|
3594 |
+
#: app/views/links/form_basic.php:9
|
3595 |
+
#: app/views/options/form.php:77
|
3596 |
+
msgid "Redirection Type"
|
3597 |
msgstr ""
|
3598 |
|
3599 |
+
#: app/views/links/form_basic.php:10
|
3600 |
+
msgid "This is the method of redirection for your link."
|
|
|
|
|
3601 |
msgstr ""
|
3602 |
|
3603 |
+
#: app/views/links/form_basic.php:24
|
3604 |
+
#: app/views/options/form.php:87
|
3605 |
+
msgid "Get cloaked redirects, Javascript redirects and more when you %1$sUpgrade to PRO%2$s"
|
3606 |
msgstr ""
|
3607 |
|
3608 |
+
#: app/views/links/form_basic.php:32
|
3609 |
+
msgid "Target URL*"
|
3610 |
msgstr ""
|
3611 |
|
3612 |
+
#: app/views/links/form_basic.php:35
|
3613 |
+
#: app/views/shared/tinymce_form_popup.php:13
|
3614 |
+
#: app/views/shared/tinymce_form_popup.php:74
|
3615 |
+
#: app/views/widgets/widget.php:11
|
3616 |
+
msgid "Target URL"
|
|
|
3617 |
msgstr ""
|
3618 |
|
3619 |
+
#: app/views/links/form_basic.php:36
|
3620 |
+
msgid "This is the URL that your Pretty Link will redirect to."
|
3621 |
msgstr ""
|
3622 |
|
3623 |
+
#: app/views/links/form_basic.php:45
|
3624 |
+
msgid "Pretty Link*"
|
3625 |
msgstr ""
|
3626 |
|
3627 |
+
#: app/views/links/form_basic.php:49
|
3628 |
+
msgid "This is how your pretty link will appear. You can edit the Pretty Link slug here."
|
|
|
|
|
|
|
|
|
3629 |
msgstr ""
|
3630 |
|
3631 |
+
#: app/views/links/form_basic.php:58
|
3632 |
+
#: app/views/links/form_basic.php:61
|
3633 |
+
msgid "Notes"
|
3634 |
msgstr ""
|
3635 |
|
3636 |
+
#: app/views/links/form_basic.php:62
|
3637 |
+
msgid "This is a field where you can enter notes about a particular link. This notes field is mainly for your own link management needs. It isn't currently used anywhere on the front end."
|
3638 |
msgstr ""
|
3639 |
|
3640 |
+
#: app/views/links/form_pro.php:34
|
3641 |
+
msgid "Enter a comma separated list of keywords / keyword phrases that you'd like to replace with this link in your Posts & Pages."
|
|
|
|
|
|
|
3642 |
msgstr ""
|
3643 |
|
3644 |
+
#. translators: %1$s: open code tag, %2$s: close code tag
|
3645 |
+
#: app/views/links/form_pro.php:50
|
3646 |
+
msgid "Enter a comma separated list of the URLs that you'd like to replace with this Pretty Link in your Posts & Pages. These must be formatted as URLs for example: %1$shttp://example.com%2$s or %1$shttp://example.com?product_id=53%2$s"
|
3647 |
msgstr ""
|
3648 |
|
3649 |
+
#: app/views/shared/nav.php:6
|
3650 |
+
msgid "Pro Manual"
|
3651 |
msgstr ""
|
3652 |
|
3653 |
+
#: app/views/shared/nav.php:9
|
3654 |
+
#: app/views/admin/update/license.php:39
|
3655 |
+
#: app/views/admin/onboarding/welcome.php:116
|
3656 |
+
#: app/controllers/PrliAppController.php:276
|
3657 |
+
msgid "Upgrade to Pro"
|
3658 |
msgstr ""
|
3659 |
|
3660 |
+
#: app/views/shared/nav.php:14
|
3661 |
+
msgid "Connect:"
|
3662 |
msgstr ""
|
3663 |
|
3664 |
+
#: app/views/shared/nav.php:18
|
3665 |
+
msgid "Get Help:"
|
3666 |
msgstr ""
|
3667 |
|
3668 |
+
#: app/views/shared/nav.php:19
|
3669 |
+
msgid "Tutorials"
|
|
|
|
|
3670 |
msgstr ""
|
3671 |
|
3672 |
+
#: app/views/shared/public_link.php:22
|
3673 |
+
msgid "Here is your Pretty Link"
|
3674 |
msgstr ""
|
3675 |
|
3676 |
+
#: app/views/shared/public_link.php:30
|
3677 |
+
msgid "Here's your pretty link for"
|
3678 |
msgstr ""
|
3679 |
|
3680 |
+
#: app/views/shared/public_link.php:41
|
3681 |
+
msgid "send this link to:"
|
|
|
|
|
3682 |
msgstr ""
|
3683 |
|
3684 |
+
#: app/views/shared/public_link.php:45
|
3685 |
+
msgid "back"
|
3686 |
msgstr ""
|
3687 |
|
3688 |
+
#: app/views/shared/table-nav.php:14
|
3689 |
+
#: app/views/shared/link-table-nav.php:16
|
3690 |
+
#: app/views/shared/link-table-nav.php:106
|
3691 |
+
msgid "Displaying %1$s–%2$s of %3$s"
|
3692 |
msgstr ""
|
3693 |
|
3694 |
+
#: app/views/shared/tinymce_form_popup.php:4
|
3695 |
+
msgid "Insert Pretty Link"
|
|
|
|
|
3696 |
msgstr ""
|
3697 |
|
3698 |
+
#: app/views/shared/tinymce_form_popup.php:10
|
3699 |
+
#: js/editor/components/link-editor/index.js:377
|
3700 |
+
#: js/editor.js:12
|
3701 |
+
msgid "Create New Pretty Link"
|
3702 |
msgstr ""
|
3703 |
|
3704 |
+
#: app/views/shared/tinymce_form_popup.php:17
|
3705 |
+
msgid "Slug"
|
|
|
|
|
|
|
|
|
|
|
3706 |
msgstr ""
|
3707 |
|
3708 |
+
#: app/views/shared/tinymce_form_popup.php:20
|
3709 |
+
msgid "valid"
|
3710 |
msgstr ""
|
3711 |
|
3712 |
+
#: app/views/shared/tinymce_form_popup.php:21
|
3713 |
+
msgid "invalid"
|
3714 |
msgstr ""
|
3715 |
|
3716 |
+
#: app/views/shared/tinymce_form_popup.php:25
|
3717 |
+
#: app/views/shared/tinymce_form_popup.php:82
|
3718 |
+
msgid "Link Text"
|
|
|
|
|
3719 |
msgstr ""
|
3720 |
|
3721 |
+
#: app/views/shared/tinymce_form_popup.php:29
|
3722 |
+
msgid "Redirect Type"
|
3723 |
msgstr ""
|
3724 |
|
3725 |
+
#: app/views/shared/tinymce_form_popup.php:46
|
3726 |
+
msgid "Nofollow"
|
3727 |
msgstr ""
|
3728 |
|
3729 |
+
#: app/views/shared/tinymce_form_popup.php:49
|
3730 |
+
#: app/views/shared/tinymce_form_popup.php:57
|
3731 |
+
msgid "Enabled"
|
3732 |
msgstr ""
|
3733 |
|
3734 |
+
#: app/views/shared/tinymce_form_popup.php:50
|
3735 |
+
#: app/views/shared/tinymce_form_popup.php:58
|
3736 |
+
msgid "Disabled"
|
|
|
|
|
|
|
3737 |
msgstr ""
|
3738 |
|
3739 |
+
#: app/views/shared/tinymce_form_popup.php:63
|
3740 |
+
#: app/views/shared/tinymce_form_popup.php:87
|
3741 |
+
msgid "Open this Pretty Link in a new window/tab"
|
3742 |
msgstr ""
|
3743 |
|
3744 |
+
#: app/views/shared/tinymce_form_popup.php:66
|
3745 |
+
msgid "Insert New Pretty Link"
|
3746 |
msgstr ""
|
3747 |
|
3748 |
+
#: app/views/shared/tinymce_form_popup.php:70
|
3749 |
+
msgid "Use Existing Pretty Link"
|
|
|
|
|
|
|
|
|
3750 |
msgstr ""
|
3751 |
|
3752 |
+
#: app/views/shared/tinymce_form_popup.php:72
|
3753 |
+
msgid "Search by Slug, Title, or Target URL..."
|
3754 |
msgstr ""
|
3755 |
|
3756 |
+
#: app/views/shared/tinymce_form_popup.php:91
|
3757 |
+
msgid "Insert Existing Pretty Link"
|
|
|
|
|
|
|
|
|
3758 |
msgstr ""
|
3759 |
|
3760 |
+
#: app/views/shared/errors.php:12
|
3761 |
+
#: app/views/admin/errors.php:7
|
3762 |
+
msgid "ERROR"
|
3763 |
msgstr ""
|
3764 |
|
3765 |
+
#: app/views/admin/popups/upgrade.php:6
|
3766 |
+
msgid "Upgrade to Pretty Links PRO"
|
3767 |
msgstr ""
|
3768 |
|
3769 |
+
#: app/views/admin/popups/upgrade.php:7
|
3770 |
+
msgid "Unlock Pretty Links' PRO features and you'll be able to:"
|
3771 |
msgstr ""
|
3772 |
|
3773 |
+
#: app/views/admin/popups/upgrade.php:9
|
3774 |
+
msgid "Monetize existing content with automated Pretty Link placement"
|
|
|
|
|
|
|
|
|
|
|
3775 |
msgstr ""
|
3776 |
|
3777 |
+
#: app/views/admin/popups/upgrade.php:10
|
3778 |
+
msgid "Redirect with cloaking, Javascript or Meta-refresh"
|
3779 |
msgstr ""
|
3780 |
|
3781 |
+
#: app/views/admin/popups/upgrade.php:11
|
3782 |
+
msgid "Redirect by location, time, device or rotation"
|
3783 |
msgstr ""
|
3784 |
|
3785 |
+
#: app/views/admin/popups/upgrade.php:12
|
3786 |
+
msgid "Expire your Pretty Links"
|
|
|
|
|
|
|
|
|
|
|
3787 |
msgstr ""
|
3788 |
|
3789 |
+
#: app/views/admin/popups/upgrade.php:13
|
3790 |
+
msgid "Split-test your Pretty Links"
|
3791 |
msgstr ""
|
3792 |
|
3793 |
+
#: app/views/admin/popups/upgrade.php:14
|
3794 |
+
#: app/views/admin/update/license.php:60
|
3795 |
+
msgid "And much, much more!"
|
3796 |
msgstr ""
|
3797 |
|
3798 |
+
#: app/views/admin/popups/upgrade.php:17
|
3799 |
+
msgid "Plus, upgrading is fast, easy and won't disrupt any of your existing links or data."
|
|
|
|
|
|
|
|
|
|
|
3800 |
msgstr ""
|
3801 |
|
3802 |
+
#: app/views/admin/popups/upgrade.php:18
|
3803 |
+
#: app/views/admin/update/license.php:66
|
3804 |
+
msgid "We think you'll love it!"
|
3805 |
msgstr ""
|
3806 |
|
3807 |
+
#: app/views/admin/popups/upgrade.php:23
|
3808 |
+
msgid "Upgrade to Pretty Links Pro"
|
3809 |
msgstr ""
|
3810 |
|
3811 |
+
#: app/views/admin/popups/upgrade.php:24
|
3812 |
+
msgid "Maybe Later"
|
|
|
|
|
|
|
|
|
|
|
|
|
3813 |
msgstr ""
|
3814 |
|
3815 |
+
#: app/views/admin/popups/rating.php:8
|
3816 |
+
msgid "Are you enjoying using Pretty Links?"
|
3817 |
msgstr ""
|
3818 |
|
3819 |
+
#: app/views/admin/popups/rating.php:17
|
3820 |
+
msgid "Rate Pretty Links"
|
|
|
|
|
3821 |
msgstr ""
|
3822 |
|
3823 |
+
#: app/views/admin/popups/rating.php:18
|
3824 |
+
msgid "If you enjoy using Pretty Links would you mind taking a moment to rate it on WordPress.org? It won't take more than a minute."
|
3825 |
msgstr ""
|
3826 |
|
3827 |
+
#: app/views/admin/popups/rating.php:19
|
3828 |
+
#: app/views/admin/popups/rating.php:31
|
3829 |
+
msgid "Thanks for your support!"
|
3830 |
msgstr ""
|
3831 |
|
3832 |
+
#: app/views/admin/popups/rating.php:24
|
3833 |
+
#: app/views/admin/popups/rating.php:36
|
3834 |
+
msgid "Remind Me Later"
|
|
|
3835 |
msgstr ""
|
3836 |
|
3837 |
+
#: app/views/admin/popups/rating.php:25
|
3838 |
+
msgid "Review Pretty Links"
|
3839 |
msgstr ""
|
3840 |
|
3841 |
+
#: app/views/admin/popups/rating.php:29
|
3842 |
+
#: app/views/admin/popups/rating.php:37
|
3843 |
+
msgid "Leave Feedback"
|
3844 |
msgstr ""
|
3845 |
|
3846 |
+
#: app/views/admin/popups/rating.php:30
|
3847 |
+
msgid "To help us improve Pretty Links, would you mind taking a moment to leave feedback?"
|
3848 |
msgstr ""
|
3849 |
|
3850 |
+
#: app/views/admin/popups/rating.php:40
|
3851 |
+
msgid "Never Remind Me Again"
|
3852 |
msgstr ""
|
3853 |
|
3854 |
+
#: app/views/admin/update/addons.php:3
|
3855 |
+
msgid "Pretty Link Add-ons"
|
3856 |
msgstr ""
|
3857 |
|
3858 |
+
#: app/views/admin/update/addons.php:8
|
3859 |
+
msgid "There were no Add-ons found for your license or lack thereof..."
|
3860 |
msgstr ""
|
3861 |
|
3862 |
+
#: app/views/admin/update/addons.php:14
|
3863 |
+
msgid "Add-on"
|
3864 |
msgstr ""
|
3865 |
|
3866 |
+
#: app/views/admin/update/addons.php:15
|
3867 |
+
msgid "Description"
|
3868 |
msgstr ""
|
3869 |
|
3870 |
+
#: app/views/admin/update/addons.php:16
|
3871 |
+
#: app/views/admin/update/addons.php:54
|
3872 |
+
msgid "Install"
|
3873 |
msgstr ""
|
3874 |
|
3875 |
+
#: app/views/admin/update/addons.php:42
|
3876 |
+
msgid "(Update Available)"
|
3877 |
msgstr ""
|
3878 |
|
3879 |
+
#: app/views/admin/update/addons.php:50
|
3880 |
+
msgid "Installed & Active"
|
3881 |
msgstr ""
|
3882 |
|
3883 |
+
#: app/views/admin/update/addons.php:52
|
3884 |
+
msgid "Installed & Inactive"
|
3885 |
msgstr ""
|
3886 |
|
3887 |
+
#: app/views/admin/update/license.php:7
|
3888 |
+
msgid "Pretty Links Pro License"
|
3889 |
msgstr ""
|
3890 |
|
3891 |
+
#. translators: %1$s: link to pro site, %2$s: link to pro site login page
|
3892 |
+
#: app/views/admin/update/license.php:14
|
3893 |
+
msgid "You must have a License Key to enable automatic updates for Pretty Links Pro. If you don't have a License please go to %1$s to get one. If you do have a license you can login at %2$s to manage your licenses and site activations."
|
3894 |
msgstr ""
|
3895 |
|
3896 |
+
#: app/views/admin/update/license.php:25
|
3897 |
+
msgid "Enter Your Pretty Links Pro License Key:"
|
|
|
|
|
|
|
3898 |
msgstr ""
|
3899 |
|
3900 |
+
#: app/views/admin/update/license.php:32
|
3901 |
+
msgid "Activate License Key on %s"
|
3902 |
msgstr ""
|
3903 |
|
3904 |
+
#. translators: %1$s: open link tag, %2$s: close link tag
|
3905 |
+
#: app/views/admin/update/license.php:45
|
3906 |
+
msgid "It looks like you haven't %1$supgraded to Pretty Links Pro%2$s yet. Here are just a few things you could be doing with pro:"
|
3907 |
msgstr ""
|
3908 |
|
3909 |
+
#: app/views/admin/update/license.php:55
|
3910 |
+
msgid "Auto-replace keywords throughout your site with Pretty Links"
|
3911 |
msgstr ""
|
3912 |
|
3913 |
+
#: app/views/admin/update/license.php:56
|
3914 |
+
msgid "Protect your affiliate links by using Cloaked Redirects"
|
3915 |
msgstr ""
|
3916 |
|
3917 |
+
#: app/views/admin/update/license.php:57
|
3918 |
+
msgid "Redirect based on a visitor's location"
|
3919 |
msgstr ""
|
3920 |
|
3921 |
+
#: app/views/admin/update/license.php:58
|
3922 |
+
msgid "Auto-prettylink your Pages & Posts"
|
|
|
|
|
3923 |
msgstr ""
|
3924 |
|
3925 |
+
#: app/views/admin/update/license.php:59
|
3926 |
+
msgid "Find out what works and what doesn't by split testing your links"
|
3927 |
msgstr ""
|
3928 |
|
3929 |
+
#: app/views/admin/update/license.php:64
|
3930 |
+
msgid "Plus, upgrading is fast, easy and won't disrupt any of your existing links or data. And there's even a 14 day money back guarantee."
|
3931 |
msgstr ""
|
3932 |
|
3933 |
+
#: app/views/admin/update/license.php:68
|
3934 |
+
msgid "Upgrade to Pro today!"
|
3935 |
msgstr ""
|
3936 |
|
3937 |
+
#: app/views/admin/update/license.php:72
|
3938 |
+
msgid "Active License Key Information:"
|
3939 |
msgstr ""
|
3940 |
|
3941 |
+
#: app/views/admin/update/license.php:75
|
3942 |
+
msgid "License Key:"
|
3943 |
msgstr ""
|
3944 |
|
3945 |
+
#: app/views/admin/update/license.php:79
|
3946 |
+
msgid "Status:"
|
3947 |
msgstr ""
|
3948 |
|
3949 |
+
#: app/views/admin/update/license.php:80
|
3950 |
+
msgid "Active on %s"
|
3951 |
msgstr ""
|
3952 |
|
3953 |
+
#: app/views/admin/update/license.php:83
|
3954 |
+
msgid "Product:"
|
3955 |
msgstr ""
|
3956 |
|
3957 |
+
#: app/views/admin/update/license.php:87
|
3958 |
+
msgid "Activations:"
|
3959 |
msgstr ""
|
3960 |
|
3961 |
+
#. translators: %1$s: open b tag, %2$s: close b tag, %3$d: current activation count, %4$s: max activations
|
3962 |
+
#: app/views/admin/update/license.php:92
|
3963 |
+
msgid "%1$s%3$d of %4$s%2$s sites have been activated with this license key"
|
3964 |
msgstr ""
|
3965 |
|
3966 |
+
#: app/views/admin/update/license.php:102
|
3967 |
+
msgid "Are you sure? Pretty Links Pro will not be functional on %s if this License Key is deactivated."
|
3968 |
msgstr ""
|
3969 |
|
3970 |
+
#: app/views/admin/update/license.php:102
|
3971 |
+
msgid "Deactivate License Key on %s"
|
3972 |
msgstr ""
|
3973 |
|
3974 |
+
#: app/views/admin/update/license.php:105
|
3975 |
+
msgid "Upgrade plugin to Pro"
|
3976 |
msgstr ""
|
3977 |
|
3978 |
+
#: app/views/admin/update/license.php:110
|
3979 |
+
msgid "You're currently running version %s of Pretty Links Pro"
|
|
|
|
|
|
|
|
|
|
|
3980 |
msgstr ""
|
3981 |
|
3982 |
+
#: app/views/admin/update/addon_popup.php:4
|
3983 |
+
msgid "ACTION REQUIRED"
|
|
|
3984 |
msgstr ""
|
3985 |
|
3986 |
+
#: app/views/admin/update/addon_popup.php:5
|
3987 |
+
msgid "The %s features in your Pretty Link options have been moved from Pretty Link into a separate plugin."
|
3988 |
msgstr ""
|
3989 |
|
3990 |
+
#: app/views/admin/update/addon_popup.php:6
|
3991 |
+
msgid "Why you ask? Well, it's to streamline and increase the performance of Pretty Link for you."
|
|
|
3992 |
msgstr ""
|
3993 |
|
3994 |
+
#: app/views/admin/update/addon_popup.php:9
|
3995 |
+
msgid "And good for you, it looks like you've already got the %1$s Add-on installed. Just click the \"Activate %2$s Add-on\" button below and you'll get all these features back now."
|
3996 |
msgstr ""
|
3997 |
|
3998 |
+
#: app/views/admin/update/addon_popup.php:11
|
3999 |
+
msgid "Luckily it's easy to get these features back now. Just click the \"Install %s Add-on\" button below."
|
|
|
4000 |
msgstr ""
|
4001 |
|
4002 |
+
#. translators: %1$s: open link tag, %2$s: close link tag
|
4003 |
+
#: app/views/admin/update/addon_popup.php:16
|
4004 |
+
msgid "If you have problems with the auto-install please refer to %1$sthe user manual%2$s for manual install instructions."
|
4005 |
msgstr ""
|
4006 |
|
4007 |
+
#: app/views/admin/update/addon_popup.php:27
|
4008 |
+
msgid "Activate %s Add-on"
|
|
|
4009 |
msgstr ""
|
4010 |
|
4011 |
+
#: app/views/admin/update/addon_popup.php:29
|
4012 |
+
msgid "Install %s Add-on"
|
4013 |
msgstr ""
|
4014 |
|
4015 |
+
#: app/views/admin/update/addon_popup.php:31
|
4016 |
+
msgid "Don't Show This Message Again"
|
4017 |
msgstr ""
|
4018 |
|
4019 |
+
#: app/views/admin/update/ui.php:3
|
4020 |
+
msgid "Activate Pretty Links Pro"
|
4021 |
msgstr ""
|
4022 |
|
4023 |
+
#: app/views/admin/update/ui.php:16
|
4024 |
+
msgid "License"
|
4025 |
msgstr ""
|
4026 |
|
4027 |
+
#: app/views/admin/update/ui.php:17
|
4028 |
+
msgid "Add-Ons"
|
4029 |
msgstr ""
|
4030 |
|
4031 |
+
#: app/views/admin/update/edge_updates.php:4
|
4032 |
+
msgid "Include Pretty Links Pro edge (development) releases in automatic updates (not recommended for production websites)"
|
4033 |
msgstr ""
|
4034 |
|
4035 |
+
#: app/views/admin/update/edge_updates.php:4
|
4036 |
+
#: app/views/widgets/widget.php:22
|
4037 |
+
msgid "Loading..."
|
4038 |
msgstr ""
|
4039 |
|
4040 |
+
#: app/views/admin/update/activation_warning.php:7
|
4041 |
+
msgid "Error with PRETTYLINK_LICENSE_KEY: %s"
|
4042 |
msgstr ""
|
4043 |
|
4044 |
+
#: app/views/admin/update/activation_warning.php:14
|
4045 |
+
#: app/views/admin/update/activation_warning.php:41
|
4046 |
+
msgid "Pretty Links Pro isn't able to get critical automatic updates"
|
4047 |
msgstr ""
|
4048 |
|
4049 |
+
#: app/views/admin/update/activation_warning.php:15
|
4050 |
+
msgid "It looks like you used to have Pretty Links Pro activated with a username and password but now you need a license key to activate it."
|
4051 |
msgstr ""
|
4052 |
|
4053 |
+
#. translators: %1$s: open link tag, %2$s: close link tag
|
4054 |
+
#: app/views/admin/update/activation_warning.php:21
|
4055 |
+
msgid "You can get your license key by logging in at %1$sPrettyLinkPro.com.%2$s"
|
4056 |
msgstr ""
|
4057 |
|
4058 |
+
#. translators: %1$s: open link tag, %2$s: close link tag
|
4059 |
+
#: app/views/admin/update/activation_warning.php:32
|
4060 |
+
msgid "After you paste your license key on the %1$s\"Pretty Link\" -> \"Activate Pro\" admin page,%2$s you'll start getting updates again."
|
4061 |
msgstr ""
|
4062 |
|
4063 |
+
#. translators: %1$s: open link tag, %2$s: close link tag
|
4064 |
+
#: app/views/admin/update/activation_warning.php:47
|
4065 |
+
msgid "You can retrieve or purchase a license key at %1$sPrettyLinks.com%2$s to enable automatic updates today."
|
4066 |
msgstr ""
|
4067 |
|
4068 |
+
#. translators: %1$s: open link tag, %2$s: close link tag
|
4069 |
+
#: app/views/admin/update/activation_warning.php:58
|
4070 |
+
msgid "After you paste your license key on the %1$s\"Pretty Links\" -> \"Activate Pro\" admin page,%2$s you'll start getting automatic updates."
|
4071 |
msgstr ""
|
4072 |
|
4073 |
+
#: app/views/admin/onboarding/welcome.php:4
|
4074 |
+
#: app/views/admin/onboarding/welcome.php:7
|
4075 |
+
msgid "Welcome to Pretty Links!"
|
4076 |
msgstr ""
|
4077 |
|
4078 |
+
#: app/views/admin/onboarding/welcome.php:10
|
4079 |
+
msgid "Congratulations, you've just installed the most powerful link management platform for WordPress on Earth!"
|
4080 |
msgstr ""
|
4081 |
|
4082 |
+
#: app/views/admin/onboarding/welcome.php:11
|
4083 |
+
msgid "With Pretty Links, you'll no longer need to manage links from a spreadsheet and you'll be able to maximize the visibility of your links - these benefits (and more) will make it possible to make more money from your content like never before!"
|
4084 |
msgstr ""
|
4085 |
|
4086 |
+
#: app/views/admin/onboarding/welcome.php:17
|
4087 |
+
msgid "Getting Started"
|
4088 |
msgstr ""
|
4089 |
|
4090 |
+
#: app/views/admin/onboarding/welcome.php:18
|
4091 |
+
msgid "Start by creating your first Pretty Link:"
|
4092 |
msgstr ""
|
4093 |
|
4094 |
+
#: app/views/admin/onboarding/welcome.php:24
|
4095 |
+
msgid "Click \"Add New Link\""
|
4096 |
msgstr ""
|
4097 |
|
4098 |
+
#: app/views/admin/onboarding/welcome.php:25
|
4099 |
+
msgid "1. Click \"Add New Link\""
|
4100 |
msgstr ""
|
4101 |
|
4102 |
+
#: app/views/admin/onboarding/welcome.php:28
|
4103 |
+
msgid "Enter the URL of your Affiliate Link"
|
4104 |
msgstr ""
|
4105 |
|
4106 |
+
#: app/views/admin/onboarding/welcome.php:29
|
4107 |
+
msgid "2. Enter the URL of your Affiliate Link"
|
4108 |
msgstr ""
|
4109 |
|
4110 |
+
#: app/views/admin/onboarding/welcome.php:32
|
4111 |
+
msgid "Customize your Pretty Link Slug"
|
4112 |
msgstr ""
|
4113 |
|
4114 |
+
#: app/views/admin/onboarding/welcome.php:33
|
4115 |
+
msgid "3. Customize your Pretty Link Slug"
|
4116 |
msgstr ""
|
4117 |
|
4118 |
+
#: app/views/admin/onboarding/welcome.php:36
|
4119 |
+
msgid "Click \"Update\""
|
4120 |
msgstr ""
|
4121 |
|
4122 |
+
#: app/views/admin/onboarding/welcome.php:37
|
4123 |
+
msgid "4. Click \"Update\""
|
4124 |
msgstr ""
|
4125 |
|
4126 |
+
#: app/views/admin/onboarding/welcome.php:40
|
4127 |
+
msgid "Copy the Pretty Link URL"
|
4128 |
msgstr ""
|
4129 |
|
4130 |
+
#: app/views/admin/onboarding/welcome.php:41
|
4131 |
+
msgid "5. Copy the Pretty Link URL"
|
4132 |
msgstr ""
|
4133 |
|
4134 |
+
#: app/views/admin/onboarding/welcome.php:45
|
4135 |
+
msgid "Wasn't that easy? Now, you can use this link wherever you want!"
|
4136 |
msgstr ""
|
4137 |
|
4138 |
+
#: app/views/admin/onboarding/welcome.php:53
|
4139 |
+
msgid "The Power of Pretty Links Pro"
|
4140 |
msgstr ""
|
4141 |
|
4142 |
+
#: app/views/admin/onboarding/welcome.php:54
|
4143 |
+
msgid "There are many reasons that premium users of Pretty Links are able to take their business to the next level:"
|
4144 |
msgstr ""
|
4145 |
|
4146 |
+
#: app/views/admin/onboarding/welcome.php:59
|
4147 |
+
#: app/views/admin/onboarding/welcome.php:64
|
4148 |
+
msgid "Automated, Site-Wide Link Placement (Keyword Replacement)"
|
4149 |
msgstr ""
|
4150 |
|
4151 |
+
#: app/views/admin/onboarding/welcome.php:60
|
4152 |
+
msgid "Imagine if you never had to hand-edit links, copy and paste from a spreadsheet, or actively have to keep up with you links ever again. Well that time has come! Now with Pretty Links, all you have to do is create your links and let Pretty Links do the rest!"
|
4153 |
msgstr ""
|
4154 |
|
4155 |
+
#: app/views/admin/onboarding/welcome.php:61
|
4156 |
+
msgid "Pretty Links will scan your content for the keywords or URLs that you want to target and will replace them with Pretty Links automatically! This will save you tons of time so you can focus on growing your business!"
|
4157 |
msgstr ""
|
4158 |
|
4159 |
+
#: app/views/admin/onboarding/welcome.php:70
|
4160 |
+
#: app/views/admin/onboarding/welcome.php:73
|
4161 |
+
msgid "Categories & Tags"
|
4162 |
msgstr ""
|
4163 |
|
4164 |
+
#: app/views/admin/onboarding/welcome.php:74
|
4165 |
+
msgid "When you are dealing with a large number of links, it can be easy to be overwhelmed and confused by which links to you planned to use where. It's now easier than ever to organize your links and group them any way that you like for ultimate productivity and monetization!"
|
4166 |
msgstr ""
|
4167 |
|
4168 |
+
#: app/views/admin/onboarding/welcome.php:80
|
4169 |
+
#: app/views/admin/onboarding/welcome.php:85
|
4170 |
+
msgid "Advanced Redirect Types"
|
4171 |
msgstr ""
|
4172 |
|
4173 |
+
#: app/views/admin/onboarding/welcome.php:81
|
4174 |
+
msgid "Lite users can take advantage of 301 & 302 server side redirects but our pro users can also redirect with cloaking, JavaScript, Meta-refresh and more."
|
4175 |
msgstr ""
|
4176 |
|
4177 |
+
#: app/views/admin/onboarding/welcome.php:82
|
4178 |
+
msgid "So if you have social media links, a landing page, or a new page or post you'd like to redirect your customers to, this feature will definitely come in handy!"
|
4179 |
msgstr ""
|
4180 |
|
4181 |
+
#: app/views/admin/onboarding/welcome.php:91
|
4182 |
+
#: app/views/admin/onboarding/welcome.php:94
|
4183 |
+
msgid "Dynamic Redirect Types"
|
4184 |
msgstr ""
|
4185 |
|
4186 |
+
#: app/views/admin/onboarding/welcome.php:95
|
4187 |
+
msgid "Would you like your Pretty Link to redirect somewhere custom depending on what country your user is in, device they're using, time they're clicking the link or just randomly? Our pro users can do this easily with our Dynamic Redirections!"
|
4188 |
msgstr ""
|
4189 |
|
4190 |
+
#: app/views/admin/onboarding/welcome.php:96
|
4191 |
+
msgid "This feature is excellent if you are running a time-sensitive sales, want to create custom content for you customers, create stellar landing pages for customers in different countries!"
|
4192 |
msgstr ""
|
4193 |
|
4194 |
+
#: app/views/admin/onboarding/welcome.php:102
|
4195 |
+
#: app/views/admin/onboarding/welcome.php:106
|
4196 |
+
msgid "Import and Export Links"
|
4197 |
msgstr ""
|
4198 |
|
4199 |
+
#: app/views/admin/onboarding/welcome.php:103
|
4200 |
+
msgid "Export your links to a spreadsheet or import them en masse - our pro users can do this with ease. Simply download your spreadsheet, upload to WordPress, and your links are automatically added to Pretty Links!"
|
4201 |
msgstr ""
|
4202 |
|
4203 |
+
#: app/views/admin/onboarding/welcome.php:111
|
4204 |
+
msgid "The list goes on and on"
|
4205 |
msgstr ""
|
4206 |
|
4207 |
+
#: app/views/admin/onboarding/welcome.php:112
|
4208 |
+
msgid "Our premium editions of Pretty Links are a HUGE upgrade from Lite. Don’t miss out on our critical PRO benefits!"
|
4209 |
msgstr ""
|
4210 |
|
4211 |
+
#: app/views/admin/onboarding/welcome.php:117
|
4212 |
+
msgid "Upgrade NOW and get 50% off of your subscription!!!"
|
4213 |
msgstr ""
|
4214 |
|
4215 |
+
#: app/views/admin/onboarding/update.php:4
|
4216 |
+
#: app/views/admin/onboarding/update.php:7
|
4217 |
+
msgid "Get Some Quick Wins with Pretty Links 3.0!"
|
4218 |
msgstr ""
|
4219 |
|
4220 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4221 |
+
#: app/views/admin/onboarding/update.php:14
|
4222 |
+
msgid "We hope you know that here at Pretty Links, we work every day to deliver amazing tools for business owners to help them %1$swin more%2$s. We want our customers to make more money, easier through superior affiliate link strategy and management."
|
4223 |
msgstr ""
|
4224 |
|
4225 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4226 |
+
#: app/views/admin/onboarding/update.php:25
|
4227 |
+
msgid "That's why today, we're excited to announce that we're rolling out a major, new release. This release won't deliver any huge, new features but rather a set of incremental features & fixes that will %1$sinstantly give you some well deserved quick wins%2$s in your business."
|
4228 |
msgstr ""
|
4229 |
|
4230 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4231 |
+
#: app/views/admin/onboarding/update.php:36
|
4232 |
+
msgid "That's why we're calling Pretty Links 3.0 - %1$sQuick Wins!%2$s"
|
4233 |
msgstr ""
|
4234 |
|
4235 |
+
#: app/views/admin/onboarding/update.php:43
|
4236 |
+
msgid "What Changes Can You Expect, Exactly?"
|
4237 |
msgstr ""
|
4238 |
|
4239 |
+
#: app/views/admin/onboarding/update.php:45
|
4240 |
+
msgid "Check out these solid improvements that will make your experience with Pretty Links better in almost every way:"
|
4241 |
msgstr ""
|
4242 |
|
4243 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4244 |
+
#: app/views/admin/onboarding/update.php:53
|
4245 |
+
msgid "%1$sAn all-new Link Editor%2$s - We've completely overhauled our link editing experience. Our new, power-packed link editor will make creating and managing your affiliate links easier than ever before!"
|
4246 |
msgstr ""
|
4247 |
|
4248 |
+
#: app/views/admin/onboarding/update.php:61
|
4249 |
+
#: app/views/admin/onboarding/update.php:62
|
4250 |
+
#: app/views/admin/onboarding/update.php:66
|
4251 |
+
#: app/views/admin/onboarding/update.php:67
|
4252 |
+
msgid "An all-new Link Editor"
|
4253 |
msgstr ""
|
4254 |
|
4255 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4256 |
+
#: app/views/admin/onboarding/update.php:77
|
4257 |
+
msgid "%1$sAll new Link Listing%2$s - Gone is the clumsy, old Link Listing feature! You’ll now be able to send links to the \"Trash,\" customize what columns you see in your listing with \"Screen Options\" and change the number of rows displayed."
|
4258 |
msgstr ""
|
4259 |
|
4260 |
+
#: app/views/admin/onboarding/update.php:85
|
4261 |
+
#: app/views/admin/onboarding/update.php:86
|
4262 |
+
msgid "All new Link Listing"
|
4263 |
msgstr ""
|
4264 |
|
4265 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4266 |
+
#: app/views/admin/onboarding/update.php:96
|
4267 |
+
msgid "%1$sCustomizable Links Tags / Categories (Pro Only)%2$s - Once you upgrade to Quick Wins, you'll be able to categorize and tag your pretty links! This is a long-requested feature that will help you organize your links and group them any way that you'd like to for ultimate productivity and monetization!"
|
4268 |
msgstr ""
|
4269 |
|
4270 |
+
#: app/views/admin/onboarding/update.php:104
|
4271 |
+
#: app/views/admin/onboarding/update.php:105
|
4272 |
+
msgid "Customizable Links Tags / Categories (Pro Only)"
|
4273 |
msgstr ""
|
4274 |
|
4275 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4276 |
+
#: app/views/admin/onboarding/update.php:115
|
4277 |
+
msgid "%1$sGutenberg Block Link Integration%2$s - You can now use your Pretty Links directly inside the Gutenberg Paragraph Block. All you have to do is select the \"Pretty Link\" button from your Paragraph Block's formatting bar then you can search and insert Pretty Links instantly!"
|
4278 |
msgstr ""
|
4279 |
|
4280 |
+
#: app/views/admin/onboarding/update.php:123
|
4281 |
+
#: app/views/admin/onboarding/update.php:124
|
4282 |
+
msgid "Gutenberg Block Link Integration"
|
4283 |
msgstr ""
|
4284 |
|
4285 |
+
#: app/views/admin/onboarding/update.php:133
|
4286 |
+
msgid "Tons of Fixes and Enhancements"
|
4287 |
msgstr ""
|
4288 |
|
4289 |
+
#: app/views/admin/onboarding/update.php:135
|
4290 |
+
msgid "In addition to these streamlined, new features we’ve made hundreds of enhancements and numerous small fixes. Pretty Links Quick Wins is going to make your link experience easier, faster, more secure and more capable than ever before!"
|
4291 |
msgstr ""
|
4292 |
|
4293 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4294 |
+
#: app/views/admin/onboarding/update.php:141
|
4295 |
+
msgid "We're excited for you to start winning more today with %1$sPretty Link Quick Wins!%2$s"
|
4296 |
msgstr ""
|
4297 |
|
4298 |
+
#: app/views/options/form.php:3
|
4299 |
+
#: app/controllers/PrliAppController.php:125
|
4300 |
+
msgid "Options"
|
4301 |
msgstr ""
|
4302 |
|
4303 |
+
#: app/views/options/form.php:4
|
4304 |
+
msgid "User Manual"
|
4305 |
msgstr ""
|
4306 |
|
4307 |
+
#. translators: %1$s: open strong tag, %2$s: close strong tag
|
4308 |
+
#: app/views/options/form.php:17
|
4309 |
+
msgid "%1$sWordPress Must be Configured:%2$s Pretty Links won't work until you select a Permalink Structure other than 'Default'"
|
4310 |
msgstr ""
|
4311 |
|
4312 |
+
#: app/views/options/form.php:22
|
4313 |
+
msgid "Permalink Settings"
|
4314 |
msgstr ""
|
4315 |
|
4316 |
+
#: app/views/options/form.php:49
|
4317 |
+
msgid "General"
|
4318 |
msgstr ""
|
4319 |
|
4320 |
+
#: app/views/options/form.php:52
|
4321 |
+
msgid "Reporting"
|
4322 |
msgstr ""
|
4323 |
|
4324 |
+
#: app/views/options/form.php:53
|
4325 |
+
msgid "Replacements"
|
4326 |
msgstr ""
|
4327 |
|
4328 |
+
#: app/views/options/form.php:54
|
4329 |
+
msgid "Auto-Create Links"
|
4330 |
msgstr ""
|
4331 |
|
4332 |
+
#: app/views/options/form.php:56
|
4333 |
+
msgid "Social"
|
4334 |
msgstr ""
|
4335 |
|
4336 |
+
#: app/views/options/form.php:57
|
4337 |
+
msgid "Public"
|
4338 |
msgstr ""
|
4339 |
|
4340 |
+
#: app/views/options/form.php:64
|
4341 |
+
msgid "General Options"
|
4342 |
msgstr ""
|
4343 |
|
4344 |
+
#: app/views/options/form.php:70
|
4345 |
+
msgid "Default Link Options"
|
4346 |
msgstr ""
|
4347 |
|
4348 |
+
#: app/views/options/form.php:75
|
4349 |
+
msgid "Redirection"
|
4350 |
msgstr ""
|
4351 |
|
4352 |
+
#: app/views/options/form.php:78
|
4353 |
+
msgid "Select the type of redirection you want your newly created links to have."
|
4354 |
msgstr ""
|
4355 |
|
4356 |
+
#: app/views/options/form.php:95
|
4357 |
+
#: app/views/options/form.php:97
|
4358 |
+
msgid "Enable Tracking"
|
4359 |
msgstr ""
|
4360 |
|
4361 |
+
#: app/views/options/form.php:98
|
4362 |
+
msgid "Default all new links to be tracked."
|
4363 |
msgstr ""
|
4364 |
|
4365 |
+
#: app/views/options/form.php:107
|
4366 |
+
msgid "Enable No Follow"
|
4367 |
msgstr ""
|
4368 |
|
4369 |
+
#: app/views/options/form.php:109
|
4370 |
+
msgid "Add No Follow"
|
4371 |
msgstr ""
|
4372 |
|
4373 |
+
#: app/views/options/form.php:110
|
4374 |
+
msgid "Add the 'nofollow' attribute by default to new links."
|
4375 |
+
msgstr ""
|
4376 |
+
|
4377 |
+
#: app/views/options/form.php:119
|
4378 |
+
msgid "Enable Permalink Fix"
|
4379 |
msgstr ""
|
4380 |
|
4381 |
+
#: app/views/options/form.php:121
|
4382 |
+
msgid "Use fix for index.php Permalink Structure"
|
4383 |
msgstr ""
|
4384 |
|
4385 |
+
#: app/views/options/form.php:122
|
4386 |
+
msgid "This option should ONLY be checked if you have elements in your permalink structure that must be present in any link on your site. For example, some WordPress installs don't have the benefit of full rewrite capabilities and in this case you'd need an index.php included in each link (http://example.com/index.php/mycoolslug instead of http://example.com/mycoolslug). If this is the case for you then check this option but the vast majority of users will want to keep this unchecked."
|
4387 |
msgstr ""
|
4388 |
|
4389 |
+
#: app/views/options/form.php:180
|
4390 |
+
msgid "Enable %sQR Codes%s"
|
4391 |
msgstr ""
|
4392 |
|
4393 |
+
#: app/views/options/form.php:220
|
4394 |
+
msgid "Reporting Options"
|
4395 |
msgstr ""
|
4396 |
|
4397 |
+
#: app/views/options/form.php:225
|
4398 |
+
#: app/views/options/form.php:227
|
4399 |
+
msgid "Tracking Style"
|
4400 |
msgstr ""
|
4401 |
|
4402 |
+
#: app/views/options/form.php:228
|
4403 |
+
msgid "Changing your tracking style can affect the accuracy of your existing statistics. Extended mode must be used for Conversion reporting."
|
4404 |
msgstr ""
|
4405 |
|
4406 |
+
#: app/views/options/form.php:232
|
4407 |
+
msgid "Normal Tracking"
|
4408 |
msgstr ""
|
4409 |
|
4410 |
+
#: app/views/options/form.php:233
|
4411 |
+
msgid "Extended Tracking (more stats / slower performance)"
|
4412 |
msgstr ""
|
4413 |
|
4414 |
+
#: app/views/options/form.php:234
|
4415 |
+
msgid "Simple Click Count Tracking (less stats / faster performance)"
|
4416 |
msgstr ""
|
4417 |
|
4418 |
+
#: app/views/options/form.php:240
|
4419 |
+
msgid "Excluded IP Addresses:"
|
4420 |
msgstr ""
|
4421 |
|
4422 |
+
#: app/views/options/form.php:242
|
4423 |
+
msgid "Excluded IP Addresses"
|
4424 |
msgstr ""
|
4425 |
|
4426 |
+
#: app/views/options/form.php:243
|
4427 |
+
msgid "Enter IP Addresses or IP Ranges you want to exclude from your Click data and Stats. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*"
|
4428 |
msgstr ""
|
4429 |
|
4430 |
+
#: app/views/options/form.php:246
|
4431 |
+
msgid "FYI, your current IP address is %s."
|
4432 |
msgstr ""
|
4433 |
|
4434 |
+
#: app/views/options/form.php:257
|
4435 |
+
msgid "Auto-Trim Clicks"
|
4436 |
msgstr ""
|
4437 |
|
4438 |
+
#: app/views/options/form.php:259
|
4439 |
+
msgid "Automatically Trim Clicks"
|
4440 |
msgstr ""
|
4441 |
|
4442 |
+
#: app/views/options/form.php:260
|
4443 |
+
msgid "Will automatically delete all hits older than 90 days. We strongly recommend doing this to keep your database performance up. This will permanently delete this click data, and is not undo-able. "
|
4444 |
msgstr ""
|
4445 |
|
4446 |
+
#: app/views/options/form.php:269
|
4447 |
+
#: app/views/options/form.php:271
|
4448 |
+
msgid "Filter Robots"
|
4449 |
msgstr ""
|
4450 |
|
4451 |
+
#: app/views/options/form.php:272
|
4452 |
+
msgid "Filter known Robots and unidentifiable browser clients from your click data, stats and reports. Works best if Tracking Style above is set to 'Extended Tracking'."
|
4453 |
msgstr ""
|
4454 |
|
4455 |
+
#: app/views/options/form.php:288
|
4456 |
+
#: app/views/options/form.php:290
|
4457 |
+
msgid "Whitelist IP Addresses"
|
4458 |
msgstr ""
|
4459 |
|
4460 |
+
#: app/views/options/form.php:291
|
4461 |
+
msgid "Enter IP Addresses or IP Ranges you want to always include in your Click data and Stats even if they are flagged as robots. Each IP Address should be separated by commas. Example: 192.168.0.1, 192.168.2.1, 192.168.3.4 or 192.168.*.*"
|
4462 |
msgstr ""
|
4463 |
|
4464 |
+
#: app/views/options/form.php:556
|
4465 |
+
msgid "Post Shortlinks"
|
4466 |
msgstr ""
|
4467 |
|
4468 |
+
#: app/views/options/form.php:559
|
4469 |
+
msgid "Create Pretty Links for Posts"
|
4470 |
msgstr ""
|
4471 |
|
4472 |
+
#: app/views/options/form.php:560
|
4473 |
+
msgid "Automatically Create a Pretty Link for each of your published Posts"
|
4474 |
msgstr ""
|
4475 |
|
4476 |
+
#: app/views/options/form.php:573
|
4477 |
+
msgid "Page Shortlinks"
|
4478 |
msgstr ""
|
4479 |
|
4480 |
+
#: app/views/options/form.php:576
|
4481 |
+
msgid "Create Pretty Links for Pages"
|
4482 |
msgstr ""
|
4483 |
|
4484 |
+
#: app/views/options/form.php:577
|
4485 |
+
msgid "Automatically Create a Pretty Link for each of your published Pages"
|
4486 |
msgstr ""
|
4487 |
|
4488 |
+
#: app/views/groups/edit.php:10
|
4489 |
+
msgid "Edit Group"
|
4490 |
msgstr ""
|
4491 |
|
4492 |
+
#: app/views/groups/edit.php:23
|
4493 |
+
#: app/views/groups/new.php:24
|
4494 |
+
msgid "This is how you'll identify your Group."
|
4495 |
msgstr ""
|
4496 |
|
4497 |
+
#: app/views/groups/edit.php:26
|
4498 |
+
#: app/views/groups/new.php:27
|
4499 |
+
msgid "Description:"
|
4500 |
msgstr ""
|
4501 |
|
4502 |
+
#: app/views/groups/edit.php:28
|
4503 |
+
#: app/views/groups/new.php:29
|
4504 |
+
msgid "A Description of this group."
|
4505 |
msgstr ""
|
4506 |
|
4507 |
+
#: app/views/groups/edit.php:31
|
4508 |
+
#: app/views/groups/new.php:32
|
4509 |
+
msgid "Links:"
|
4510 |
msgstr ""
|
4511 |
|
4512 |
+
#: app/views/groups/edit.php:37
|
4513 |
+
#: app/views/groups/new.php:38
|
4514 |
+
msgid "Current Group"
|
4515 |
msgstr ""
|
4516 |
|
4517 |
+
#. translators: %1$s: open strong tag, %2$s close strong tag
|
4518 |
+
#: app/views/groups/edit.php:61
|
4519 |
+
#: app/views/groups/new.php:60
|
4520 |
+
msgid "Select some links for this group. %1$sNote: each link can only be in one group at a time.%2$s"
|
4521 |
msgstr ""
|
4522 |
|
4523 |
+
#: app/views/groups/list.php:6
|
4524 |
+
msgid "Groups"
|
4525 |
msgstr ""
|
4526 |
|
4527 |
+
#: app/views/groups/list.php:7
|
4528 |
+
msgid "Add Group"
|
4529 |
msgstr ""
|
4530 |
|
4531 |
+
#: app/views/groups/list.php:62
|
4532 |
+
msgid "No Pretty Link Groups were found"
|
4533 |
msgstr ""
|
4534 |
|
4535 |
+
#: app/views/groups/list.php:79
|
4536 |
+
msgid "Are you sure you want to delete your %s Pretty Link Group?"
|
4537 |
msgstr ""
|
4538 |
|
4539 |
+
#: app/views/groups/list.php:80
|
4540 |
+
#: app/views/groups/list.php:84
|
4541 |
+
msgid "View links in %s"
|
4542 |
msgstr ""
|
4543 |
|
4544 |
+
#: app/views/groups/list.php:81
|
4545 |
+
msgid "View hits in %s"
|
4546 |
msgstr ""
|
4547 |
|
4548 |
+
#: app/views/groups/new.php:10
|
4549 |
+
msgid "New Group"
|
4550 |
msgstr ""
|
4551 |
|
4552 |
+
#: app/views/tools/form.php:3
|
4553 |
+
#: app/controllers/PrliAppController.php:122
|
4554 |
+
msgid "Tools"
|
4555 |
msgstr ""
|
4556 |
|
4557 |
+
#: app/views/tools/form.php:18
|
4558 |
+
#: app/views/tools/form.php:25
|
4559 |
+
msgid "Bookmarklet"
|
4560 |
msgstr ""
|
4561 |
|
4562 |
+
#: app/views/tools/form.php:19
|
4563 |
+
#: app/views/tools/form.php:70
|
4564 |
+
msgid "Trim Clicks"
|
4565 |
msgstr ""
|
4566 |
|
4567 |
+
#: app/views/tools/form.php:28
|
4568 |
+
msgid "Install Pretty Link Bookmarklet"
|
4569 |
msgstr ""
|
4570 |
|
4571 |
+
#. translators: %1$s: open link tag, %2$s close link tag
|
4572 |
+
#: app/views/tools/form.php:31
|
4573 |
+
msgid "Just drag this \"Get PrettyLink\" link to your toolbar to install the bookmarklet. As you browse the web, you can just click this bookmarklet to create a pretty link from the current url you're looking at. %1$s(more help)%2$s"
|
4574 |
msgstr ""
|
4575 |
|
4576 |
+
#: app/views/tools/form.php:36
|
4577 |
+
msgid "Show iPhone Bookmarklet Instructions"
|
4578 |
msgstr ""
|
4579 |
|
4580 |
+
#. translators: %1$s: open strong tag, %2$s close strong tag
|
4581 |
+
#: app/views/tools/form.php:43
|
4582 |
+
msgid "%1$sNote:%2$s iPhone users can install this bookmarklet in their Safari to create Pretty Links with the following steps:"
|
4583 |
msgstr ""
|
4584 |
|
4585 |
+
#: app/views/tools/form.php:49
|
4586 |
+
msgid "Copy this text:"
|
4587 |
msgstr ""
|
4588 |
|
4589 |
+
#: app/views/tools/form.php:50
|
4590 |
+
msgid "Tap the + button at the bottom of the screen"
|
4591 |
msgstr ""
|
4592 |
|
4593 |
+
#: app/views/tools/form.php:51
|
4594 |
+
msgid "Choose to share the page, then click on \"Bookmark\". We recommend saving it in your Favorites folder. Rename your bookmark to \"Get PrettyLink\" (or whatever you want) and then \"Save\""
|
4595 |
msgstr ""
|
4596 |
|
4597 |
+
#: app/views/tools/form.php:52
|
4598 |
+
msgid "Navigate through your Bookmarks until you find the new bookmark and click \"Edit\""
|
4599 |
msgstr ""
|
4600 |
|
4601 |
+
#: app/views/tools/form.php:53
|
4602 |
+
msgid "Delete all the text from the address"
|
4603 |
msgstr ""
|
4604 |
|
4605 |
+
#: app/views/tools/form.php:54
|
4606 |
+
msgid "Paste the text you copied in Step 1 into the address field"
|
4607 |
msgstr ""
|
4608 |
|
4609 |
+
#. translators: %1$s: open strong tag, %2$s close strong tag
|
4610 |
+
#: app/views/tools/form.php:59
|
4611 |
+
msgid "To save the changes hit \"Bookmarks\" and %1$syou're done!%2$s"
|
4612 |
msgstr ""
|
4613 |
|
4614 |
+
#: app/views/tools/form.php:64
|
4615 |
+
msgid "Now when you find a page you want to save off as a Pretty Link, just click the \"Bookmarks\" icon at the bottom of the screen and select your \"Get PrettyLink\" bookmarklet."
|
4616 |
msgstr ""
|
4617 |
|
4618 |
+
#: app/views/tools/form.php:72
|
4619 |
+
msgid "Pretty Link is already automatically trimming Clicks older than 90 days. Although not necessary, you can still use the buttons below to force click trimming."
|
4620 |
msgstr ""
|
4621 |
|
4622 |
+
#: app/views/tools/form.php:75
|
4623 |
+
msgid "***WARNING*** If you click OK you will delete ALL of the Click data that is older than 30 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!"
|
4624 |
msgstr ""
|
4625 |
|
4626 |
+
#: app/views/tools/form.php:75
|
4627 |
+
msgid "Delete Clicks older than 30 days"
|
4628 |
msgstr ""
|
4629 |
|
4630 |
+
#: app/views/tools/form.php:77
|
4631 |
+
msgid "Clear clicks 30 days or older"
|
4632 |
msgstr ""
|
4633 |
|
4634 |
+
#: app/views/tools/form.php:78
|
4635 |
+
msgid "This will clear all clicks in your database that are older than 30 days."
|
4636 |
msgstr ""
|
4637 |
|
4638 |
+
#: app/views/tools/form.php:80
|
4639 |
+
msgid "***WARNING*** If you click OK you will delete ALL of the Click data that is older than 90 days. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete this data because there is no going back!"
|
4640 |
msgstr ""
|
4641 |
|
4642 |
+
#: app/views/tools/form.php:80
|
4643 |
+
msgid "Delete Clicks older than 90 days"
|
4644 |
msgstr ""
|
4645 |
|
4646 |
+
#: app/views/tools/form.php:82
|
4647 |
+
msgid "Clear clicks 90 days or older"
|
4648 |
msgstr ""
|
4649 |
|
4650 |
+
#: app/views/tools/form.php:83
|
4651 |
+
msgid "This will clear all clicks in your database that are older than 90 days."
|
4652 |
msgstr ""
|
4653 |
|
4654 |
+
#: app/views/tools/form.php:87
|
4655 |
+
msgid "***WARNING*** If you click OK you will delete ALL of the Click data in your Database. Your data will be gone forever -- no way to retreive it. Do not click OK unless you are absolutely sure you want to delete all your data because there is no going back!"
|
4656 |
msgstr ""
|
4657 |
|
4658 |
+
#: app/views/tools/form.php:87
|
4659 |
+
msgid "Delete All Clicks"
|
4660 |
msgstr ""
|
4661 |
|
4662 |
+
#: app/views/tools/form.php:89
|
4663 |
+
msgid "Clear all clicks"
|
4664 |
msgstr ""
|
4665 |
|
4666 |
+
#: app/views/tools/form.php:90
|
4667 |
+
msgid "Seriously, only click this link if you want to delete all the Click data in your database."
|
4668 |
msgstr ""
|
4669 |
|
4670 |
+
#: app/views/clicks/list.php:6
|
4671 |
+
#: app/views/clicks/csv_download.php:4
|
4672 |
+
msgid "For %s"
|
4673 |
msgstr ""
|
4674 |
|
4675 |
+
#: app/views/clicks/list.php:21
|
4676 |
+
msgid "Back to Clicks"
|
4677 |
msgstr ""
|
4678 |
|
4679 |
+
#: app/views/clicks/list.php:30
|
4680 |
+
msgid "Type:"
|
4681 |
msgstr ""
|
4682 |
|
4683 |
+
#: app/views/clicks/list.php:39
|
4684 |
+
msgid "to"
|
4685 |
msgstr ""
|
4686 |
|
4687 |
+
#: app/views/clicks/list.php:62
|
4688 |
+
msgid "Search Clicks"
|
4689 |
msgstr ""
|
4690 |
|
4691 |
+
#: app/views/clicks/list.php:73
|
4692 |
+
#: app/views/clicks/list.php:171
|
4693 |
+
msgid "Browser"
|
4694 |
msgstr ""
|
4695 |
|
4696 |
+
#: app/views/clicks/list.php:75
|
4697 |
+
#: app/views/clicks/list.php:172
|
4698 |
+
msgid "OS"
|
4699 |
msgstr ""
|
4700 |
|
4701 |
+
#: app/views/clicks/list.php:79
|
4702 |
+
#: app/views/clicks/list.php:174
|
4703 |
+
msgid "IP"
|
4704 |
msgstr ""
|
4705 |
|
4706 |
+
#: app/views/clicks/list.php:83
|
4707 |
+
#: app/views/clicks/list.php:176
|
4708 |
+
msgid "Visitor"
|
4709 |
msgstr ""
|
4710 |
|
4711 |
+
#: app/views/clicks/list.php:87
|
4712 |
+
#: app/views/clicks/list.php:178
|
4713 |
+
msgid "Timestamp"
|
4714 |
msgstr ""
|
4715 |
|
4716 |
+
#: app/views/clicks/list.php:91
|
4717 |
+
#: app/views/clicks/list.php:180
|
4718 |
+
msgid "Host"
|
4719 |
msgstr ""
|
4720 |
|
4721 |
+
#: app/views/clicks/list.php:95
|
4722 |
+
#: app/views/clicks/list.php:182
|
4723 |
+
msgid "URI"
|
4724 |
msgstr ""
|
4725 |
|
4726 |
+
#: app/views/clicks/list.php:98
|
4727 |
+
#: app/views/clicks/list.php:183
|
4728 |
+
msgid "Referrer"
|
4729 |
msgstr ""
|
4730 |
|
4731 |
+
#: app/views/clicks/list.php:111
|
4732 |
+
msgid "No Clicks have been recorded yet"
|
4733 |
msgstr ""
|
4734 |
|
4735 |
+
#: app/views/clicks/list.php:147
|
4736 |
+
msgid "View All Activity for IP Address: %s"
|
4737 |
msgstr ""
|
4738 |
|
4739 |
+
#: app/views/clicks/list.php:150
|
4740 |
+
msgid "View All Activity for Visitor: %s"
|
4741 |
msgstr ""
|
4742 |
|
4743 |
+
#: app/views/clicks/list.php:190
|
4744 |
+
msgid "Download CSV"
|
4745 |
msgstr ""
|
4746 |
|
4747 |
+
#: app/views/clicks/csv_download.php:3
|
4748 |
+
msgid "Download Clicks"
|
4749 |
msgstr ""
|
4750 |
|
4751 |
+
#: app/views/clicks/csv_download.php:6
|
4752 |
+
msgid "Click Reports:"
|
4753 |
msgstr ""
|
4754 |
|
4755 |
+
#: app/views/clicks/csv_download.php:7
|
4756 |
+
msgid "All clicks on %s"
|
4757 |
msgstr ""
|
4758 |
|
4759 |
+
#: app/views/clicks/csv_download.php:24
|
4760 |
+
msgid "Clicks %d-%d (%d Records)"
|
4761 |
msgstr ""
|
4762 |
|
4763 |
+
#: app/controllers/PrliUpdateController.php:72
|
4764 |
+
msgid "Why you creepin'?"
|
4765 |
msgstr ""
|
4766 |
|
4767 |
+
#: app/controllers/PrliUpdateController.php:305
|
4768 |
+
msgid "Check for Update"
|
4769 |
msgstr ""
|
4770 |
|
4771 |
+
#: app/controllers/PrliUpdateController.php:374
|
4772 |
+
msgid "You had an HTTP error connecting to Caseproof's Mothership API"
|
4773 |
msgstr ""
|
4774 |
|
4775 |
+
#: app/controllers/PrliUpdateController.php:386
|
4776 |
+
msgid "Your License Key was invalid"
|
4777 |
msgstr ""
|
4778 |
|
4779 |
+
#: app/controllers/PrliUpdateController.php:412
|
4780 |
+
msgid "You do not have access."
|
4781 |
msgstr ""
|
4782 |
|
4783 |
+
#: app/controllers/PrliUpdateController.php:416
|
4784 |
+
msgid "Edge updates couldn't be updated."
|
4785 |
msgstr ""
|
4786 |
|
4787 |
+
#: app/controllers/PrliToolsController.php:94
|
4788 |
+
msgid "Click Database was Cleared."
|
4789 |
msgstr ""
|
4790 |
|
4791 |
+
#: app/controllers/PrliToolsController.php:100
|
4792 |
+
msgid "Clicks older than %1$d days (%2$d Clicks) were deleted"
|
4793 |
msgstr ""
|
4794 |
|
4795 |
+
#: app/controllers/PrliToolsController.php:103
|
4796 |
+
msgid "No clicks older than %1$d days were found, so nothing was deleted"
|
4797 |
msgstr ""
|
4798 |
|
4799 |
+
#: app/controllers/PrliClicksController.php:89
|
4800 |
+
msgid "IP Address: "
|
4801 |
msgstr ""
|
4802 |
|
4803 |
+
#: app/controllers/PrliClicksController.php:94
|
4804 |
+
msgid "Visitor: "
|
4805 |
msgstr ""
|
4806 |
|
4807 |
+
#: app/controllers/PrliClicksController.php:99
|
4808 |
+
msgid "All Links"
|
4809 |
msgstr ""
|
4810 |
|
4811 |
+
#: app/controllers/PrliXmlRpcController.php:36
|
4812 |
+
#: app/controllers/PrliXmlRpcController.php:98
|
4813 |
+
#: app/controllers/PrliXmlRpcController.php:145
|
4814 |
+
#: app/controllers/PrliXmlRpcController.php:200
|
4815 |
+
#: app/controllers/PrliXmlRpcController.php:229
|
4816 |
+
#: app/controllers/PrliXmlRpcController.php:257
|
4817 |
+
#: app/controllers/PrliXmlRpcController.php:290
|
4818 |
+
#: app/controllers/PrliXmlRpcController.php:322
|
4819 |
+
msgid "Sorry, XML-RPC Not enabled for this website"
|
4820 |
msgstr ""
|
4821 |
|
4822 |
+
#: app/controllers/PrliXmlRpcController.php:39
|
4823 |
+
#: app/controllers/PrliXmlRpcController.php:101
|
4824 |
+
#: app/controllers/PrliXmlRpcController.php:148
|
4825 |
+
#: app/controllers/PrliXmlRpcController.php:203
|
4826 |
+
#: app/controllers/PrliXmlRpcController.php:232
|
4827 |
+
#: app/controllers/PrliXmlRpcController.php:260
|
4828 |
+
#: app/controllers/PrliXmlRpcController.php:293
|
4829 |
+
#: app/controllers/PrliXmlRpcController.php:325
|
4830 |
+
msgid "Sorry, Login failed"
|
4831 |
msgstr ""
|
4832 |
|
4833 |
+
#: app/controllers/PrliXmlRpcController.php:45
|
4834 |
+
#: app/controllers/PrliXmlRpcController.php:107
|
4835 |
+
#: app/controllers/PrliXmlRpcController.php:154
|
4836 |
+
#: app/controllers/PrliXmlRpcController.php:209
|
4837 |
+
#: app/controllers/PrliXmlRpcController.php:238
|
4838 |
+
#: app/controllers/PrliXmlRpcController.php:266
|
4839 |
+
#: app/controllers/PrliXmlRpcController.php:299
|
4840 |
+
#: app/controllers/PrliXmlRpcController.php:331
|
4841 |
+
msgid "Sorry, you must be an administrator to access this resource"
|
4842 |
msgstr ""
|
4843 |
|
4844 |
+
#: app/controllers/PrliXmlRpcController.php:111
|
4845 |
+
msgid "You must provide a target URL"
|
4846 |
msgstr ""
|
4847 |
|
4848 |
+
#: app/controllers/PrliXmlRpcController.php:137
|
4849 |
+
#: app/controllers/PrliXmlRpcController.php:185
|
4850 |
+
msgid "There was an error creating your Pretty Link"
|
4851 |
msgstr ""
|
4852 |
|
4853 |
+
#: app/controllers/PrliXmlRpcController.php:158
|
4854 |
+
msgid "You must provide the id of the link you want to update"
|
4855 |
msgstr ""
|
4856 |
|
4857 |
+
#: app/controllers/PrliXmlRpcController.php:214
|
4858 |
+
msgid "There was an error fetching the Pretty Link Groups"
|
4859 |
msgstr ""
|
4860 |
|
4861 |
+
#: app/controllers/PrliXmlRpcController.php:243
|
4862 |
+
msgid "There was an error fetching the Pretty Links"
|
4863 |
msgstr ""
|
4864 |
|
4865 |
+
#: app/controllers/PrliXmlRpcController.php:269
|
4866 |
+
msgid "Sorry, you must provide a slug to lookup"
|
4867 |
msgstr ""
|
4868 |
|
4869 |
+
#: app/controllers/PrliXmlRpcController.php:276
|
4870 |
+
#: app/controllers/PrliXmlRpcController.php:309
|
4871 |
+
msgid "There was an error fetching your Pretty Link"
|
4872 |
msgstr ""
|
4873 |
|
4874 |
+
#: app/controllers/PrliXmlRpcController.php:302
|
4875 |
+
#: app/controllers/PrliXmlRpcController.php:334
|
4876 |
+
msgid "Sorry, you must provide an id to lookup"
|
4877 |
msgstr ""
|
4878 |
|
4879 |
+
#: app/controllers/PrliXmlRpcController.php:341
|
4880 |
+
msgid "There was an error fetching your Pretty Link URL"
|
4881 |
msgstr ""
|
4882 |
|
4883 |
+
#: app/controllers/PrliOptionsController.php:61
|
4884 |
+
msgid "Options saved."
|
4885 |
msgstr ""
|
4886 |
|
4887 |
+
#: app/controllers/PrliOptionsController.php:75
|
4888 |
+
msgid "Excluded IP Addresses must be a comma separated list of IPv4 or IPv6 addresses or ranges."
|
4889 |
msgstr ""
|
4890 |
|
4891 |
+
#: app/controllers/PrliOptionsController.php:79
|
4892 |
+
msgid "Whitelist IP Addresses must be a comma separated list of IPv4 or IPv6 addresses or ranges."
|
4893 |
msgstr ""
|
4894 |
|
4895 |
+
#: app/controllers/PrliPopupController.php:63
|
4896 |
+
msgid "An unknown error occurred."
|
4897 |
msgstr ""
|
4898 |
|
4899 |
+
#: app/controllers/PrliPopupController.php:93
|
4900 |
+
#: app/controllers/PrliLinksController.php:338
|
4901 |
+
#: app/controllers/PrliLinksController.php:550
|
4902 |
+
msgid "Forbidden"
|
4903 |
msgstr ""
|
4904 |
|
4905 |
+
#: app/controllers/PrliPopupController.php:97
|
4906 |
+
msgid "Must specify a popup"
|
4907 |
msgstr ""
|
4908 |
|
4909 |
+
#: app/controllers/PrliPopupController.php:103
|
4910 |
+
msgid "Invalid popup"
|
4911 |
msgstr ""
|
4912 |
|
4913 |
+
#: app/controllers/PrliPopupController.php:108
|
4914 |
+
msgid "The popup was successfully delayed"
|
4915 |
msgstr ""
|
4916 |
|
4917 |
+
#: app/controllers/PrliPopupController.php:112
|
4918 |
+
msgid "The popup was successfully stopped"
|
4919 |
msgstr ""
|
4920 |
|
4921 |
+
#: app/controllers/PrliLocalApiController.php:100
|
4922 |
+
#: app/controllers/PrliLocalApiController.php:159
|
4923 |
+
msgid "An error prevented your Pretty Link from being created"
|
4924 |
msgstr ""
|
4925 |
|
4926 |
+
#: app/controllers/PrliLocalApiController.php:124
|
4927 |
+
msgid "Pretty Link ID must be set for successful update."
|
4928 |
msgstr ""
|
4929 |
|
4930 |
+
#: app/controllers/PrliLinksController.php:45
|
4931 |
+
msgid "Add New Pretty Link"
|
4932 |
msgstr ""
|
4933 |
|
4934 |
+
#: app/controllers/PrliLinksController.php:46
|
4935 |
+
msgid "Edit Pretty Link"
|
4936 |
msgstr ""
|
4937 |
|
4938 |
+
#: app/controllers/PrliLinksController.php:47
|
4939 |
+
#: js/editor/components/link-editor/index.js:324
|
4940 |
+
#: js/editor.js:12
|
4941 |
+
msgid "New Pretty Link"
|
4942 |
msgstr ""
|
4943 |
|
4944 |
+
#: app/controllers/PrliLinksController.php:48
|
4945 |
+
msgid "View Pretty Link"
|
4946 |
msgstr ""
|
4947 |
|
4948 |
+
#: app/controllers/PrliLinksController.php:49
|
4949 |
+
msgid "Search Pretty Links"
|
4950 |
msgstr ""
|
4951 |
|
4952 |
+
#: app/controllers/PrliLinksController.php:50
|
4953 |
+
msgid "No Pretty Links found"
|
4954 |
msgstr ""
|
4955 |
|
4956 |
+
#: app/controllers/PrliLinksController.php:51
|
4957 |
+
msgid "No Pretty Links found in Trash"
|
4958 |
msgstr ""
|
4959 |
|
4960 |
+
#: app/controllers/PrliLinksController.php:52
|
4961 |
+
msgid "Parent Pretty Link:"
|
4962 |
msgstr ""
|
4963 |
|
4964 |
+
#: app/controllers/PrliLinksController.php:97
|
4965 |
+
msgid "Pretty Link Settings"
|
4966 |
msgstr ""
|
4967 |
|
4968 |
+
#: app/controllers/PrliLinksController.php:326
|
4969 |
+
msgid "Pretty Link Cleanup Visitor Locks"
|
4970 |
msgstr ""
|
4971 |
|
4972 |
+
#: app/controllers/PrliLinksController.php:346
|
4973 |
+
msgid "Success!"
|
4974 |
msgstr ""
|
4975 |
|
4976 |
+
#: app/controllers/PrliLinksController.php:348
|
4977 |
+
msgid "Fix the following errors:"
|
4978 |
msgstr ""
|
4979 |
|
4980 |
+
#: app/controllers/PrliLinksController.php:384
|
4981 |
+
msgid "Upgrade to a Pretty Links premium plan to get Link Categories"
|
4982 |
msgstr ""
|
4983 |
|
4984 |
+
#: app/controllers/PrliLinksController.php:390
|
4985 |
+
msgid "Upgrade to a Pretty Links premium plan to get Link Tags"
|
4986 |
msgstr ""
|
4987 |
|
4988 |
+
#: app/controllers/PrliLinksController.php:396
|
4989 |
+
msgid "Upgrade to a Pretty Links premium plan to get Keyword Replacements"
|
4990 |
msgstr ""
|
4991 |
|
4992 |
+
#: app/controllers/PrliLinksController.php:402
|
4993 |
+
msgid "Settings"
|
4994 |
msgstr ""
|
4995 |
|
4996 |
+
#: app/controllers/PrliLinksController.php:403
|
4997 |
+
msgid "Link Title"
|
4998 |
msgstr ""
|
4999 |
|
5000 |
+
#: app/controllers/PrliLinksController.php:505
|
5001 |
+
msgid "Tweet"
|
5002 |
msgstr ""
|
5003 |
|
5004 |
+
#: app/controllers/PrliLinksController.php:507
|
5005 |
+
msgid "Target »"
|
5006 |
msgstr ""
|
5007 |
|
5008 |
+
#: app/controllers/PrliLinksController.php:508
|
5009 |
+
msgid "Pretty Link »"
|
5010 |
msgstr ""
|
5011 |
|
5012 |
+
#: app/controllers/PrliLinksController.php:530
|
5013 |
+
#: app/controllers/PrliLinksController.php:531
|
5014 |
+
msgid "View Split Test Report"
|
5015 |
msgstr ""
|
5016 |
|
5017 |
+
#: app/controllers/PrliLinksController.php:556
|
5018 |
+
msgid "Your Pretty Link was Successfully Reset"
|
5019 |
msgstr ""
|
5020 |
|
5021 |
+
#: app/controllers/PrliLinksController.php:564
|
5022 |
+
msgid "Bad request"
|
5023 |
msgstr ""
|
5024 |
|
5025 |
+
#: app/controllers/PrliLinksController.php:568
|
5026 |
+
msgid "Insufficient permissions"
|
5027 |
msgstr ""
|
5028 |
|
5029 |
+
#: app/controllers/PrliLinksController.php:597
|
5030 |
+
msgid "An error occurred creating the link"
|
5031 |
msgstr ""
|
5032 |
|
5033 |
+
#: app/controllers/PrliLinksController.php:629
|
5034 |
+
msgid "All Groups (Legacy)"
|
5035 |
msgstr ""
|
5036 |
|
5037 |
+
#: app/controllers/PrliAppController.php:84
|
5038 |
+
msgid "Link Categories [Pro Only]"
|
5039 |
msgstr ""
|
5040 |
|
5041 |
+
#: app/controllers/PrliAppController.php:85
|
5042 |
+
msgid "Categories [Pro]"
|
5043 |
msgstr ""
|
5044 |
|
5045 |
+
#: app/controllers/PrliAppController.php:92
|
5046 |
+
msgid "Link Tags [Pro Only]"
|
5047 |
msgstr ""
|
5048 |
|
5049 |
+
#: app/controllers/PrliAppController.php:93
|
5050 |
+
msgid "Tags [Pro]"
|
5051 |
msgstr ""
|
5052 |
|
5053 |
+
#: app/controllers/PrliAppController.php:100
|
5054 |
+
msgid "Link Reports [Pro Only]"
|
5055 |
msgstr ""
|
5056 |
|
5057 |
+
#: app/controllers/PrliAppController.php:101
|
5058 |
+
msgid "Reports [Pro]"
|
5059 |
msgstr ""
|
5060 |
|
5061 |
+
#: app/controllers/PrliAppController.php:108
|
5062 |
+
msgid "Import / Export [Pro Only]"
|
5063 |
msgstr ""
|
5064 |
|
5065 |
+
#: app/controllers/PrliAppController.php:109
|
5066 |
+
msgid "Import / Export [Pro]"
|
5067 |
msgstr ""
|
5068 |
|
5069 |
+
#: app/controllers/PrliAppController.php:118
|
5070 |
+
msgid "Pretty Links | Clicks"
|
5071 |
msgstr ""
|
5072 |
|
5073 |
+
#: app/controllers/PrliAppController.php:122
|
5074 |
+
msgid "Pretty Links | Tools"
|
5075 |
msgstr ""
|
5076 |
|
5077 |
+
#: app/controllers/PrliAppController.php:125
|
5078 |
+
msgid "Pretty Links | Options"
|
5079 |
msgstr ""
|
5080 |
|
5081 |
+
#: app/controllers/PrliAppController.php:129
|
5082 |
+
#: app/controllers/PrliAppController.php:132
|
5083 |
+
#: app/controllers/PrliAppController.php:268
|
5084 |
+
msgid "Activate"
|
5085 |
msgstr ""
|
5086 |
|
5087 |
+
#: app/controllers/PrliAppController.php:135
|
5088 |
+
msgid "Upgrade"
|
5089 |
msgstr ""
|
5090 |
|
5091 |
+
#: app/controllers/PrliAppController.php:140
|
5092 |
+
msgid "Welcome"
|
5093 |
msgstr ""
|
5094 |
|
5095 |
+
#: app/controllers/PrliAppController.php:141
|
5096 |
+
msgid "What's New"
|
5097 |
msgstr ""
|
5098 |
|
5099 |
+
#: app/controllers/PrliAppController.php:267
|
5100 |
+
#: app/controllers/PrliAppController.php:273
|
5101 |
+
#: app/controllers/PrliAppController.php:278
|
5102 |
+
msgid "Docs"
|
5103 |
msgstr ""
|
5104 |
|
5105 |
+
#: app/controllers/PrliAppController.php:271
|
5106 |
+
#: app/controllers/PrliAppController.php:277
|
5107 |
+
msgid "Activate Pro License"
|
5108 |
msgstr ""
|
5109 |
|
5110 |
+
#: app/controllers/PrliAppController.php:272
|
5111 |
+
msgid "Buy"
|
5112 |
msgstr ""
|
5113 |
|
5114 |
+
#: app/controllers/PrliAppController.php:397
|
5115 |
+
msgid "Are you sure you want to reset your Pretty Link? This will delete all of the statistical data about this Pretty Link in your database."
|
5116 |
msgstr ""
|
5117 |
|
5118 |
+
#. translators: %1$s: br tag, %2$s: open link tag, %3$s: close link tag
|
5119 |
+
#: app/controllers/PrliAppController.php:483
|
5120 |
+
msgid "You're almost done!%1$s%2$sFinish your Re-Install of Pretty Links Pro%3$s"
|
5121 |
msgstr ""
|
5122 |
|
5123 |
+
#: app/controllers/PrliAppController.php:498
|
5124 |
+
msgid "Pretty Links Pro Successfully Uninstalled."
|
5125 |
msgstr ""
|
5126 |
|
5127 |
+
#: app/controllers/PrliAppController.php:547
|
5128 |
+
msgid "Invalid server response"
|
5129 |
msgstr ""
|
5130 |
|
5131 |
+
#: app/controllers/PrliAppController.php:548
|
5132 |
+
msgid "Ajax error"
|
5133 |
msgstr ""
|
5134 |
|
5135 |
+
#: app/controllers/PrliAppController.php:565
|
5136 |
+
msgid "Pretty Link Quick Add"
|
5137 |
msgstr ""
|
5138 |
|
5139 |
+
#: app/controllers/PrliAppController.php:604
|
5140 |
+
msgid "Your Pretty Links Pro installation isn't quite complete yet. %1$sAutomatically Upgrade to Enable Pretty Links Pro%2$s"
|
|
|
5141 |
msgstr ""
|
5142 |
|
5143 |
+
#: app/controllers/PrliAppController.php:625
|
5144 |
+
msgid "Your Pretty Links Pro installation isn't quite complete yet.<br/>%1$sAutomatically Upgrade to Enable Pretty Links Pro%2$s"
|
5145 |
msgstr ""
|
5146 |
|
5147 |
+
#. translators: $1$s - Pretty Links plugin name; $2$s - WP.org review link; $3$s - WP.org review link.
|
5148 |
+
#: app/controllers/PrliAppController.php:672
|
5149 |
+
msgid "Enjoying %1$s? Please rate <a href=\"%2$s\" target=\"_blank\" rel=\"noopener noreferrer\">★★★★★</a> on <a href=\"%3$s\" target=\"_blank\" rel=\"noopener\">WordPress.org</a> to help us spread the word. Thanks from the Pretty Links team!"
|
5150 |
msgstr ""
|
images/dark_add_twitter_account.png
DELETED
Binary file
|
images/pbar_grad.png
DELETED
Binary file
|
images/pl-logo-horiz-RGB.png
DELETED
Binary file
|
images/pretty-links-logo-color-white.svg
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?xml version="1.0" encoding="utf-8"?>
|
2 |
+
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3 |
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4 |
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
5 |
+
viewBox="0 0 240 39" style="enable-background:new 0 0 240 39;" xml:space="preserve">
|
6 |
+
<style type="text/css">
|
7 |
+
.st0{fill:#4FD6F6;}
|
8 |
+
.st1{fill:#9AE8FA;}
|
9 |
+
.st2{fill:#03C5F2;}
|
10 |
+
.st3{fill:url(#SVGID_1_);}
|
11 |
+
.st4{fill:#FFFFFF;}
|
12 |
+
</style>
|
13 |
+
<g>
|
14 |
+
<path class="st0" d="M36.5,14.3c-0.8-0.8-1.2-1.9-1.2-3C28.9,11,22.5,11.2,15.7,12c-0.5,0.1-0.9,0.4-1,0.7
|
15 |
+
c-0.1,0.4,0.3,0.6,0.4,0.6c2.9,1.3,4.4,2,7.1,3.6c0.2,0.1,0.5,0.2,0.8,0.2c1.4-0.1,2.7-0.2,4-0.2c4.2-0.1,8.4,0,12.4,0.5L36.5,14.3
|
16 |
+
z"/>
|
17 |
+
<path class="st1" d="M43.2,21.3L42,20.1c-4.5-0.7-9.1-1-13.7-0.9c0,0,0,0,0,0c-0.4,0-0.8,0.2-0.9,0.5c-0.1,0.3,0.1,0.6,0.3,0.7
|
18 |
+
c2.4,1.7,3.6,2.6,5.9,4.5c0.2,0.1,0.3,0.2,0.5,0.2c2.7,0.2,4.9,0.3,6.9,0.7L43.2,21.3z"/>
|
19 |
+
<path class="st2" d="M39.5,7c0.2,0,0.5,0,0.7,0l9.8,1.2l1.5-3C34.3,1.8,18.2,2.4,1.1,7C0.5,7.2,0,7.6,0,8c0,0.3,0.4,0.4,0.5,0.5
|
20 |
+
c3.3,0.8,5,1.3,8.1,2.4c0.3,0.1,0.6,0.1,1,0c5.9-1.1,11.4-1.7,17-1.9c3.1-0.1,6.2,0,9.3,0.2C36.7,7.9,38,7.1,39.5,7z"/>
|
21 |
+
|
22 |
+
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="33.6324" y1="17.0546" x2="70.2706" y2="17.0546" gradientTransform="matrix(0.9992 -3.984763e-02 3.984763e-02 0.9992 3.8206 4.7075)">
|
23 |
+
<stop offset="0" style="stop-color:#FF8C00"/>
|
24 |
+
<stop offset="0.7" style="stop-color:#FFD200"/>
|
25 |
+
</linearGradient>
|
26 |
+
<path class="st3" d="M74.5,15c-0.2-0.8-0.8-1.4-1.6-1.5l-11.4-1.4L59.7,1.9c-0.1-0.8-0.8-1.4-1.6-1.5c-0.8-0.1-1.6,0.3-2,1
|
27 |
+
l-4.8,9.5L39.9,9.5c-0.8-0.1-1.6,0.3-1.9,1c-0.4,0.7-0.2,1.6,0.3,2.1l7.9,8.2l-5.8,11.8l0,0l0,0c0,0,0,0.1-0.1,0.1
|
28 |
+
c0,0,0,0.1-0.1,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0.1,0,0.1
|
29 |
+
c0,0,0,0.1,0,0.1c0,0.1,0,0.1,0,0.2c0,0,0,0.1,0.1,0.1c0,0.1,0,0.1,0.1,0.2c0,0,0,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1
|
30 |
+
c0,0,0.1,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,0.2,0.1,0.2,0.2c0,0,0.1,0,0.1,0c0.1,0,0.1,0.1,0.2,0.1
|
31 |
+
c0,0,0.1,0,0.1,0c0.1,0,0.1,0,0.2,0.1c0,0,0.1,0,0.1,0c0.1,0,0.1,0,0.2,0c0,0,0,0,0,0c0.1,0,0.1,0,0.2,0c0,0,0.1,0,0.1,0
|
32 |
+
c0.1,0,0.1,0,0.2,0c0,0,0.1,0,0.1,0c0.1,0,0.2,0,0.2-0.1c0,0,0,0,0.1,0c0.1,0,0.2-0.1,0.3-0.1l10.8-6.4l8.8,9.4
|
33 |
+
c0.3,0.3,0.7,0.5,1.1,0.6c0.4,0,0.7,0,1.1-0.2c0.7-0.4,1.2-1.2,1-2l-2.4-13.4l10.2-6C74.3,16.6,74.7,15.8,74.5,15z"/>
|
34 |
+
</g>
|
35 |
+
<g>
|
36 |
+
<path class="st4" d="M129.6,22.8c0.7,0,1.2-0.5,1.2-1.2c0-5.5-3.5-8.1-7.9-8.1c-4.8,0-8.2,3.4-8.2,8.2c0,5,3.4,8.2,8.3,8.2
|
37 |
+
c2.3,0,4.9-0.8,6.5-2.4c0.2-0.2,0.3-0.5,0.3-0.8c0-0.6-0.5-1.2-1.2-1.2c-0.3,0-0.6,0.1-0.8,0.4c-1.1,1.1-3.1,1.7-4.7,1.7
|
38 |
+
c-3,0-5.4-1.8-5.7-4.7L129.6,22.8z M117.3,20.6c0.4-3,2.8-4.7,5.6-4.7c3.1,0,5.2,1.6,5.3,4.7L117.3,20.6z"/>
|
39 |
+
<path class="st4" d="M91.7,13.6c-2.3,0-4.7,0.9-5.8,3l0-1.7c0-0.7-0.6-1.3-1.3-1.3c-0.7,0-1.3,0.6-1.3,1.3c0,0,0,20.2,0,21
|
40 |
+
c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3c0-0.7,0-9.1,0-9.1c1.1,2.1,3.7,3.1,5.9,3.1c4.5,0,8-2.8,8-8.2
|
41 |
+
C99.8,16.6,96.2,13.6,91.7,13.6z M91.6,27.5c-3.1,0-5.6-2.3-5.6-5.7c0-3.4,2.4-5.7,5.6-5.7c3.1,0,5.6,2.1,5.6,5.7
|
42 |
+
C97.1,25.5,94.6,27.5,91.6,27.5z"/>
|
43 |
+
<path class="st4" d="M112.9,14.2c-0.9-0.4-1.8-0.6-2.8-0.6c-1.9,0-3.9,0.7-4.9,2.4v-1.1c0-0.7-0.6-1.3-1.3-1.3
|
44 |
+
c-0.7,0-1.3,0.6-1.3,1.3c0,0,0,13.1,0,13.8c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3c0-0.7,0-7.8,0-7.8c0-3,1.7-4.7,4.7-4.7
|
45 |
+
c0.7,0,1.3,0.1,1.9,0.4c0.2,0.1,0.3,0.1,0.5,0.1c0.7,0,1.3-0.6,1.3-1.3C113.6,14.9,113.3,14.4,112.9,14.2z"/>
|
46 |
+
<path class="st4" d="M233.2,20.4c-2-0.2-3.9-0.6-4-2.2c0-1.7,1.7-2.6,3.9-2.5c1,0,2.7,0.2,3.5,0.7l0.7,0.3l0,0
|
47 |
+
c0.2,0.1,0.3,0.1,0.5,0.1c0.7,0,1.2-0.5,1.2-1.2c0-0.5-0.3-0.9-0.8-1.1c-0.2-0.1-0.5-0.2-0.7-0.3c-1.4-0.5-3-0.7-4.5-0.7
|
48 |
+
c-3,0-6.5,1.4-6.4,4.8c0,3.3,3.3,4.1,6.3,4.5c2.5,0.3,4.4,0.8,4.4,2.5c-0.1,2.1-2.6,2.4-4.1,2.4c-1.4,0-2.9-0.3-4.2-1l0,0
|
49 |
+
c-0.2-0.1-0.4-0.1-0.6-0.1c-0.7,0-1.3,0.6-1.3,1.3c0,0.5,0.3,0.9,0.7,1.1l0,0c0,0,0,0,0,0c0,0,0,0,0,0c1.6,0.8,3.2,1.1,5.2,1.1
|
50 |
+
c3.6,0,6.7-1.5,6.7-4.8C240.1,21.4,236.1,20.8,233.2,20.4z"/>
|
51 |
+
<path class="st4" d="M142.7,28.5c0-0.6-0.5-1.2-1.2-1.2c-0.1,0-0.2,0-0.3,0c0,0,0,0,0,0c-0.3,0.1-0.7,0.1-1,0.1
|
52 |
+
c-1.9,0-2.5-1.2-2.5-3v-8.3l3,0c0.6,0,1.1-0.5,1.1-1.1c0-0.6-0.5-1.1-1.1-1.1l-2.9,0l0-3.3c0-0.7-0.6-1.3-1.3-1.3s-1.3,0.6-1.3,1.3
|
53 |
+
V14l-2,0c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1l2,0v8.3c0,3.5,1.6,5.5,5,5.4c0.6,0,1.1-0.1,1.6-0.2c0,0,0,0,0,0
|
54 |
+
c0,0,0.1,0,0.1,0C142.4,29.5,142.7,29.1,142.7,28.5z"/>
|
55 |
+
<path class="st4" d="M154.3,28.5c0-0.6-0.5-1.2-1.2-1.2c-0.1,0-0.2,0-0.3,0c0,0,0,0,0,0c-0.3,0.1-0.7,0.1-1,0.1
|
56 |
+
c-1.9,0-2.5-1.2-2.5-3v-8.3l3.5,0c0.6,0,1.1-0.5,1.1-1.1c0-0.6-0.5-1.1-1.1-1.1l-3.4,0l0-3.3c0-0.7-0.6-1.3-1.3-1.3
|
57 |
+
c-0.7,0-1.3,0.6-1.3,1.3V14l-2,0c-0.6,0-1.1,0.5-1.1,1.1c0,0.6,0.5,1.1,1.1,1.1l2,0v8.3c0,3.5,1.6,5.5,5,5.4c0.6,0,1.1-0.1,1.6-0.2
|
58 |
+
c0,0,0,0,0,0c0,0,0.1,0,0.1,0C154,29.5,154.3,29.1,154.3,28.5z"/>
|
59 |
+
<path class="st4" d="M171.2,14.9c0-0.7-0.6-1.3-1.3-1.3c-0.6,0-1.1,0.4-1.3,0.9l-4.7,12.2l-5.1-12.3l0,0c-0.2-0.5-0.7-0.8-1.2-0.8
|
60 |
+
c-0.7,0-1.3,0.6-1.3,1.3c0,0.2,0,0.4,0.1,0.5l0,0l6,14.1l-1.5,3.8c-0.8,1.7-2.1,1.6-3.5,1c0,0,0,0,0,0c-0.2-0.1-0.3-0.1-0.5-0.1
|
61 |
+
c-0.7,0-1.2,0.5-1.2,1.2c0,0.5,0.3,0.9,0.7,1.1l0,0c2.9,1.4,5.6,0.9,7-2.4l7.7-18.7C171.2,15.3,171.2,15.1,171.2,14.9z"/>
|
62 |
+
<path class="st4" d="M202.1,13.7c-2.1,0-3.8,0.7-5.3,2.7l0-1.2c0-0.7-0.6-1.3-1.3-1.3c-0.7,0-1.3,0.6-1.3,1.3v13.5
|
63 |
+
c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3l0-7.5c0-3.1,2.1-5.1,5-5.1c3.2,0,4.5,1.5,4.5,4.9c0,0,0,7.6,0,7.6
|
64 |
+
c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3V21C209,16.3,206.7,13.7,202.1,13.7z"/>
|
65 |
+
<path class="st4" d="M219,20.5l5.5-4.6c0.2-0.2,0.4-0.5,0.4-0.8c0-0.6-0.5-1.1-1.1-1.1c-0.3,0-0.6,0.1-0.8,0.3l-7.7,6.7l0-12.2
|
66 |
+
c0-0.7-0.6-1.3-1.3-1.3c-0.7,0-1.3,0.6-1.3,1.3l0,20c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3l0-5.1l1.8-1.4l5.4,7.4
|
67 |
+
c0.2,0.3,0.6,0.5,1,0.5c0.7,0,1.3-0.6,1.3-1.3c0-0.3-0.1-0.6-0.3-0.8L219,20.5z"/>
|
68 |
+
<path class="st4" d="M180.9,7.4c-0.7,0-1.3,0.6-1.3,1.3l0,20c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3v-20
|
69 |
+
C182.2,8,181.7,7.4,180.9,7.4z"/>
|
70 |
+
<g>
|
71 |
+
<path class="st4" d="M190.2,10.5c0-2.1-3.1-2.1-3.1,0C187,12.6,190.2,12.6,190.2,10.5z"/>
|
72 |
+
<path class="st4" d="M188.5,14.5c-0.7,0-1.3,0.6-1.3,1.3v12.9c0,0.7,0.6,1.3,1.3,1.3c0.7,0,1.3-0.6,1.3-1.3V15.8
|
73 |
+
C189.9,15.1,189.3,14.5,188.5,14.5z"/>
|
74 |
+
</g>
|
75 |
+
</g>
|
76 |
+
</svg>
|
images/pretty-links-plugin-header.jpg
ADDED
Binary file
|
images/twitter.png
DELETED
Binary file
|
images/update-3-0.png
ADDED
Binary file
|
images/update-all-new-link-listing.png
ADDED
Binary file
|
images/update-categories-tags.png
ADDED
Binary file
|
images/update-gutenberg-editor.png
ADDED
Binary file
|
images/update-new-link-editor-1.png
ADDED
Binary file
|
images/update-new-link-editor-2.png
ADDED
Binary file
|
images/welcome-add-new.png
ADDED
Binary file
|
images/welcome-advanced-redirects.png
ADDED
Binary file
|
images/welcome-categories.png
ADDED
Binary file
|
images/welcome-click-update.png
ADDED
Binary file
|
images/welcome-copy-url.png
ADDED
Binary file
|
images/welcome-customize-slug.png
ADDED
Binary file
|
images/welcome-desk.png
ADDED
Binary file
|
images/welcome-dynamic-redirects.png
ADDED
Binary file
|
images/welcome-enter-url.png
ADDED
Binary file
|
images/welcome-import-export.png
ADDED
Binary file
|
images/welcome-link.png
ADDED
Binary file
|
js/admin_link_form.js
ADDED
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function($) {
|
2 |
+
$(document).ready(function() {
|
3 |
+
function prli_objectify_form(formArray, allowed) {//serialize data function
|
4 |
+
var returnArray = {};
|
5 |
+
|
6 |
+
for (var i = 0; i < formArray.length; i++){
|
7 |
+
var name = formArray[i]['name'],
|
8 |
+
value = formArray[i]['value'];
|
9 |
+
|
10 |
+
if(-1 !== $.inArray(name, allowed)) {
|
11 |
+
if (name.slice(-2) === '[]') {
|
12 |
+
if (typeof returnArray[name] === 'undefined') {
|
13 |
+
returnArray[name] = [];
|
14 |
+
}
|
15 |
+
|
16 |
+
returnArray[name].push(value);
|
17 |
+
} else {
|
18 |
+
returnArray[name] = value;
|
19 |
+
}
|
20 |
+
}
|
21 |
+
}
|
22 |
+
|
23 |
+
return returnArray;
|
24 |
+
}
|
25 |
+
|
26 |
+
$('form#post').submit(function(e) {
|
27 |
+
e.preventDefault();
|
28 |
+
|
29 |
+
$('#pretty_link_errors').hide();
|
30 |
+
$('.spinner').css('visibility','visible');
|
31 |
+
|
32 |
+
var fields_to_validate = [
|
33 |
+
'url', 'redirect_type', 'slug', 'url_replacements', 'enable_expire', 'expire_type', 'expire_date',
|
34 |
+
'expire_clicks', 'enable_expired_url', 'expired_url', 'dynamic_redirection', 'url_rotations[]',
|
35 |
+
'target_url_weight', 'url_rotation_weights[]', 'prli_geo_url[]', 'prli_geo_countries[]', 'prli_tech_url[]',
|
36 |
+
'prli_time_url[]', 'prli_time_start[]', 'prli_time_end[]', 'delay'
|
37 |
+
];
|
38 |
+
|
39 |
+
var args = prli_objectify_form($(this).serializeArray(), fields_to_validate);
|
40 |
+
args['id'] = PrliLinkValidation.args['id'];
|
41 |
+
args['action'] = PrliLinkValidation.args['action'];
|
42 |
+
args['security'] = PrliLinkValidation.args['security'];
|
43 |
+
|
44 |
+
var form = this;
|
45 |
+
|
46 |
+
$.post( ajaxurl, args, function(data) {
|
47 |
+
if(data.valid) {
|
48 |
+
$('#pretty_link_errors').hide();
|
49 |
+
$(form).triggerHandler('submit.edit-post');
|
50 |
+
form.submit();
|
51 |
+
}
|
52 |
+
else {
|
53 |
+
$('#pretty_link_errors p').html(data.message);
|
54 |
+
$('#pretty_link_errors').show();
|
55 |
+
|
56 |
+
$('.spinner').css('visibility','hidden');
|
57 |
+
}
|
58 |
+
}, 'json' );
|
59 |
+
});
|
60 |
+
|
61 |
+
if (window.adminpage === 'post-new-php' && window.typenow === 'pretty-link') {
|
62 |
+
$('#publish').val(PrliLinkValidation.args.update);
|
63 |
+
}
|
64 |
+
});
|
65 |
+
})(jQuery);
|
js/admin_popup.js
CHANGED
@@ -8,7 +8,8 @@ jQuery(document).ready(function($) {
|
|
8 |
type: 'inline'
|
9 |
},
|
10 |
closeOnBgClick: false,
|
11 |
-
closeBtnInside: false
|
|
|
12 |
});
|
13 |
});
|
14 |
|
@@ -69,5 +70,28 @@ jQuery(document).ready(function($) {
|
|
69 |
}
|
70 |
});
|
71 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
});
|
73 |
|
8 |
type: 'inline'
|
9 |
},
|
10 |
closeOnBgClick: false,
|
11 |
+
closeBtnInside: false,
|
12 |
+
mainClass: 'mfp-prli'
|
13 |
});
|
14 |
});
|
15 |
|
70 |
}
|
71 |
});
|
72 |
});
|
73 |
+
|
74 |
+
$('.prli-leave-feedback').on('click', function () {
|
75 |
+
var _this = this;
|
76 |
+
|
77 |
+
prli_delay_popup('rating', function() {
|
78 |
+
$(_this).trigger('prli-popup-delayed',['rating']);
|
79 |
+
$.magnificPopup.close();
|
80 |
+
});
|
81 |
+
});
|
82 |
+
|
83 |
+
$('.prli-rating-enjoy-yes-popup').on('click', function (e) {
|
84 |
+
e.preventDefault();
|
85 |
+
|
86 |
+
$('#prli-rating-stage-one').hide();
|
87 |
+
$('#prli-rating-stage-two-yes').show();
|
88 |
+
});
|
89 |
+
|
90 |
+
$('.prli-rating-enjoy-no-popup').on('click', function (e) {
|
91 |
+
e.preventDefault();
|
92 |
+
|
93 |
+
$('#prli-rating-stage-one').hide();
|
94 |
+
$('#prli-rating-stage-two-no').show();
|
95 |
+
});
|
96 |
});
|
97 |
|
js/admin_shared.js
CHANGED
@@ -4,5 +4,21 @@ function toggle_iphone_instructions() {
|
|
4 |
|
5 |
jQuery(document).ready(function($) {
|
6 |
$(".prli-social-button-checkboxes").sortable();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
});
|
8 |
|
4 |
|
5 |
jQuery(document).ready(function($) {
|
6 |
$(".prli-social-button-checkboxes").sortable();
|
7 |
+
|
8 |
+
if ($.fn.magnificPopup) {
|
9 |
+
$('.prli-update').magnificPopup({
|
10 |
+
delegate: '.prli-image-popup',
|
11 |
+
type: 'image',
|
12 |
+
mainClass: 'mfp-prli',
|
13 |
+
gallery: {
|
14 |
+
enabled: true
|
15 |
+
}
|
16 |
+
});
|
17 |
+
}
|
18 |
+
|
19 |
+
// Remove Status from Link quick edit
|
20 |
+
if (window.pagenow === 'edit-pretty-link' && $('#bulk-edit').length) {
|
21 |
+
$('#bulk-edit').find('select[name="_status"]').closest('.inline-edit-col').remove();
|
22 |
+
}
|
23 |
});
|
24 |
|
js/editor.deps.json
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
["lodash","wp-api-fetch","wp-block-editor","wp-components","wp-compose","wp-data","wp-dom","wp-element","wp-html-entities","wp-i18n","wp-keycodes","wp-polyfill","wp-rich-text","wp-url"]
|
js/editor.js
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
!function(t){var e={};function n(o){if(e[o])return e[o].exports;var r=e[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:o})},n.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=38)}([function(t,e){!function(){t.exports=this.wp.element}()},function(t,e){!function(){t.exports=this.wp.i18n}()},function(t,e){!function(){t.exports=this.wp.url}()},function(t,e){t.exports=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}},function(t,e){!function(){t.exports=this.wp.components}()},function(t,e){!function(){t.exports=this.wp.richText}()},function(t,e){!function(){t.exports=this.wp.keycodes}()},function(t,e){!function(){t.exports=this.wp.blockEditor}()},function(t,e,n){var o=n(35);t.exports=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&o(t,e)}},function(t,e){function n(e){return t.exports=n=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)},n(e)}t.exports=n},function(t,e,n){var o=n(36),r=n(3);t.exports=function(t,e){return!e||"object"!==o(e)&&"function"!=typeof e?r(t):e}},function(t,e){function n(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}t.exports=function(t,e,o){return e&&n(t.prototype,e),o&&n(t,o),t}},function(t,e){t.exports=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e){!function(){t.exports=this.lodash}()},function(t,e,n){"use strict";n.r(e);var o=n(12),r=n.n(o),i=n(11),s=n.n(i),a=n(10),c=n.n(a),u=n(9),l=n.n(u),f=n(3),p=n.n(f),d=n(8),h=n.n(d),v=n(21),b=n.n(v),g=n(26),m=n.n(g),y=n(0),k=n(13),w=n(15),O=n.n(w),j=n(25),L=n.n(j),S=n(1),x=n(6),E=n(4),_=n(17),C=n(24),R=n(19),T=n.n(R),P=n(2),N=n(20),A=function(t){return t.stopPropagation()},I=function(){var t=m()(b.a.mark(function t(e){var n;return b.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,T()({url:Object(P.addQueryArgs)(ajaxurl,{action:"prli_search_for_links",term:e})});case 2:return n=t.sent,t.abrupt("return",Object(k.map)(n,function(t){return{url:t.pretty_url,title:Object(N.decodeEntities)(t.value)+" ("+Object(N.decodeEntities)(t.slug)+")"||Object(S.__)("(no title)")}}));case 4:case"end":return t.stop()}},t)}));return function(e){return t.apply(this,arguments)}}(),U=function(t){function e(t){var n,o=t.autocompleteRef;return r()(this,e),(n=c()(this,l()(e).apply(this,arguments))).onChange=n.onChange.bind(p()(n)),n.onKeyDown=n.onKeyDown.bind(p()(n)),n.autocompleteRef=o||Object(y.createRef)(),n.inputRef=Object(y.createRef)(),n.updateSuggestions=Object(k.throttle)(n.updateSuggestions.bind(p()(n)),200),n.suggestionNodes=[],n.state={suggestions:[],showSuggestions:!1,selectedSuggestion:null},n}return h()(e,t),s()(e,[{key:"componentDidUpdate",value:function(){var t=this,e=this.state,n=e.showSuggestions,o=e.selectedSuggestion;n&&null!==o&&!this.scrollingIntoView&&(this.scrollingIntoView=!0,L()(this.suggestionNodes[o],this.autocompleteRef.current,{onlyScrollIfNeeded:!0}),this.props.setTimeout(function(){t.scrollingIntoView=!1},100))}},{key:"componentWillUnmount",value:function(){delete this.suggestionsRequest}},{key:"bindSuggestionNode",value:function(t){var e=this;return function(n){e.suggestionNodes[t]=n}}},{key:"updateSuggestions",value:function(t){var e=this;if(t.length<2||/^https?:/.test(t))this.setState({showSuggestions:!1,selectedSuggestion:null,loading:!1});else{this.setState({showSuggestions:!0,selectedSuggestion:null,loading:!0});var n=I(t);n.then(function(t){e.suggestionsRequest===n&&(e.setState({suggestions:t,loading:!1}),t.length?e.props.debouncedSpeak(Object(S.sprintf)(Object(S._n)("%d result found, use up and down arrow keys to navigate.","%d results found, use up and down arrow keys to navigate.",t.length),t.length),"assertive"):e.props.debouncedSpeak(Object(S.__)("No results."),"assertive"))}).catch(function(){e.suggestionsRequest===n&&e.setState({loading:!1})}),this.suggestionsRequest=n}}},{key:"onChange",value:function(t){var e=t.target.value;this.props.onChange(e),this.updateSuggestions(e)}},{key:"onKeyDown",value:function(t){var e=this.state,n=e.showSuggestions,o=e.selectedSuggestion,r=e.suggestions,i=e.loading;if(n&&r.length&&!i){var s=this.state.suggestions[this.state.selectedSuggestion];switch(t.keyCode){case x.UP:t.stopPropagation(),t.preventDefault();var a=o?o-1:r.length-1;this.setState({selectedSuggestion:a});break;case x.DOWN:t.stopPropagation(),t.preventDefault();var c=null===o||o===r.length-1?0:o+1;this.setState({selectedSuggestion:c});break;case x.TAB:null!==this.state.selectedSuggestion&&(this.selectLink(s),this.props.speak(Object(S.__)("Link selected.")));break;case x.ENTER:null!==this.state.selectedSuggestion&&(t.stopPropagation(),this.selectLink(s))}}else switch(t.keyCode){case x.UP:0!==t.target.selectionStart&&(t.stopPropagation(),t.preventDefault(),t.target.setSelectionRange(0,0));break;case x.DOWN:this.props.value.length!==t.target.selectionStart&&(t.stopPropagation(),t.preventDefault(),t.target.setSelectionRange(this.props.value.length,this.props.value.length))}}},{key:"selectLink",value:function(t){this.props.onChange(t.url,t),this.setState({selectedSuggestion:null,showSuggestions:!1})}},{key:"handleOnClick",value:function(t){this.selectLink(t),this.inputRef.current.focus()}},{key:"render",value:function(){var t=this,e=this.props,n=e.value,o=void 0===n?"":n,r=e.autoFocus,i=void 0===r||r,s=e.instanceId,a=e.className,c=this.state,u=c.showSuggestions,l=c.suggestions,f=c.selectedSuggestion,p=c.loading,d="block-editor-url-input-suggestions-".concat(s),h="block-editor-url-input-suggestion-".concat(s);return Object(y.createElement)("div",{className:O()("editor-url-input block-editor-url-input",a)},Object(y.createElement)("input",{autoFocus:i,type:"text","aria-label":Object(S.__)("URL"),required:!0,value:o,onChange:this.onChange,onInput:A,placeholder:Object(S.__)("Paste or type to search for your Pretty Link"),onKeyDown:this.onKeyDown,role:"combobox","aria-expanded":u,"aria-autocomplete":"list","aria-owns":d,"aria-activedescendant":null!==f?"".concat(h,"-").concat(f):void 0,ref:this.inputRef}),p&&Object(y.createElement)(E.Spinner,null),u&&!!l.length&&Object(y.createElement)(E.Popover,{position:"bottom",noArrow:!0,focusOnMount:!1},Object(y.createElement)("div",{className:"editor-url-input__suggestions block-editor-url-input__suggestions",id:d,ref:this.autocompleteRef,role:"listbox"},l.map(function(e,n){return Object(y.createElement)("button",{key:e.id,role:"option",tabIndex:"-1",id:"".concat(h,"-").concat(n),ref:t.bindSuggestionNode(n),className:O()("editor-url-input__suggestion block-editor-url-input__suggestion",{"is-selected":n===f}),onClick:function(){return t.handleOnClick(e)},"aria-selected":n===f},e.title)}))))}}]),e}(y.Component);e.default=Object(_.compose)(_.withSafeTimeout,E.withSpokenMessages,_.withInstanceId,Object(C.withSelect)(function(t){return{fetchLinkSuggestions:(0,t("core/block-editor").getSettings)().__experimentalFetchLinkSuggestions}}))(U)},function(t,e,n){var o;
|
2 |
+
/*!
|
3 |
+
Copyright (c) 2017 Jed Watson.
|
4 |
+
Licensed under the MIT License (MIT), see
|
5 |
+
http://jedwatson.github.io/classnames
|
6 |
+
*/
|
7 |
+
/*!
|
8 |
+
Copyright (c) 2017 Jed Watson.
|
9 |
+
Licensed under the MIT License (MIT), see
|
10 |
+
http://jedwatson.github.io/classnames
|
11 |
+
*/
|
12 |
+
!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var t=[],e=0;e<arguments.length;e++){var o=arguments[e];if(o){var i=typeof o;if("string"===i||"number"===i)t.push(o);else if(Array.isArray(o)&&o.length){var s=r.apply(null,o);s&&t.push(s)}else if("object"===i)for(var a in o)n.call(o,a)&&o[a]&&t.push(a)}}return t.join(" ")}void 0!==t&&t.exports?(r.default=r,t.exports=r):void 0===(o=function(){return r}.apply(e,[]))||(t.exports=o)}()},function(t,e,n){var o=n(32);t.exports=function(t,e){if(null==t)return{};var n,r,i=o(t,e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);for(r=0;r<s.length;r++)n=s[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(i[n]=t[n])}return i}},function(t,e){!function(){t.exports=this.wp.compose}()},function(t,e,n){"use strict";n.r(e);var o=n(12),r=n.n(o),i=n(11),s=n.n(i),a=n(10),c=n.n(a),u=n(9),l=n.n(u),f=n(3),p=n.n(f),d=n(8),h=n.n(d),v=n(23),b=n.n(v),g=n(16),m=n.n(g),y=n(0),k=n(15),w=n.n(k),O=n(1),j=n(4),L=n(6),S=n(22),x=n(2),E=n(5),_=n(7),C=(n(19),n(14)),R=(n(31),n(13));function T(t){if(!t)return!1;var e=t.trim();if(!e)return!1;if(/^\S+:/.test(e)){var n=Object(x.getProtocol)(e);if(!Object(x.isValidProtocol)(n))return!1;if(Object(R.startsWith)(n,"http")&&!/^https?:\/\/[^\/\s]/i.test(e))return!1;var o=Object(x.getAuthority)(e);if(!Object(x.isValidAuthority)(o))return!1;var r=Object(x.getPath)(e);if(r&&!Object(x.isValidPath)(r))return!1;var i=Object(x.getQueryString)(e);if(i&&!Object(x.isValidQueryString)(i))return!1;var s=Object(x.getFragment)(e);if(s&&!Object(x.isValidFragment)(s))return!1}return!(Object(R.startsWith)(e,"#")&&!Object(x.isValidFragment)(e))}function P(t){var e=t.url,n=t.opensInNewWindow,o=t.text,r={type:"core/link",attributes:{url:e}};if(n){var i=Object(O.sprintf)(Object(O.__)("%s (opens in a new tab)"),o);r.attributes.target="_blank",r.attributes.rel="noreferrer noopener",r.attributes["aria-label"]=i}return r}var N=function(t){return t.stopPropagation()};function A(t,e){return t.addingLink||e.editLink}var I=function(t){var e=t.value,n=t.onChangeInputValue,o=t.onKeyDown,r=t.submitLink,i=t.autocompleteRef;return Object(y.createElement)("form",{className:"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content",onKeyPress:N,onKeyDown:o,onSubmit:r},Object(y.createElement)(C.default,{value:e,onChange:n,autocompleteRef:i}),Object(y.createElement)(j.IconButton,{icon:"editor-break",label:Object(O.__)("Insert Pretty Link"),type:"submit"}))},U=function(t){var e=t.url,n=Object(x.prependHTTP)(e),o=w()("editor-format-toolbar__link-container-value block-editor-format-toolbar__link-container-value",{"has-invalid-link":!T(n)});return e?Object(y.createElement)(j.ExternalLink,{className:o,href:e},Object(x.filterURLForDisplay)(Object(x.safeDecodeURI)(e))):Object(y.createElement)("span",{className:o})},W=function(t){var e=t.isActive,n=t.addingLink,o=t.value,r=m()(t,["isActive","addingLink","value"]),i=Object(y.useMemo)(function(){var t=window.getSelection(),e=t.rangeCount>0?t.getRangeAt(0):null;if(e){if(n)return Object(S.getRectangleFromRange)(e);var o=e.startContainer;for(o=o.nextElementSibling||o;o.nodeType!==window.Node.ELEMENT_NODE;)o=o.parentNode;var r=o.closest("a");return r?r.getBoundingClientRect():void 0}},[e,n,o.start,o.end]);return i?Object(y.createElement)(_.URLPopover,b()({anchorRect:i},r)):null},D=function(t){var e=t.url,n=t.editLink;return Object(y.createElement)("div",{className:"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content",onKeyPress:N},Object(y.createElement)(U,{url:e}),Object(y.createElement)(j.IconButton,{icon:"edit",label:Object(O.__)("Edit"),onClick:n}))},F=function(t){function e(){var t;return r()(this,e),(t=c()(this,l()(e).apply(this,arguments))).editLink=t.editLink.bind(p()(t)),t.submitLink=t.submitLink.bind(p()(t)),t.onKeyDown=t.onKeyDown.bind(p()(t)),t.onChangeInputValue=t.onChangeInputValue.bind(p()(t)),t.setLinkTarget=t.setLinkTarget.bind(p()(t)),t.onClickOutside=t.onClickOutside.bind(p()(t)),t.resetState=t.resetState.bind(p()(t)),t.autocompleteRef=Object(y.createRef)(),t.state={opensInNewWindow:!1,inputValue:"",newLinkUrl:"",newLinkSlug:"",creatingLink:!1,createdLink:!1,createdLinkError:!1},t}return h()(e,t),s()(e,[{key:"onKeyDown",value:function(t){[L.LEFT,L.DOWN,L.RIGHT,L.UP,L.BACKSPACE,L.ENTER].indexOf(t.keyCode)>-1&&t.stopPropagation()}},{key:"onChangeInputValue",value:function(t){this.setState({inputValue:t})}},{key:"setLinkTarget",value:function(t){var e=this.props,n=e.activeAttributes.url,o=void 0===n?"":n,r=e.value,i=e.onChange;if(this.setState({opensInNewWindow:t}),!A(this.props,this.state)){var s=Object(E.getTextContent)(Object(E.slice)(r));i(Object(E.applyFormat)(r,P({url:o,opensInNewWindow:t,text:s})))}}},{key:"editLink",value:function(t){this.setState({editLink:!0}),t.preventDefault()}},{key:"submitLink",value:function(t){var e=this.props,n=e.isActive,o=e.value,r=e.onChange,i=e.speak,s=this.state,a=s.inputValue,c=s.opensInNewWindow,u=Object(x.prependHTTP)(a),l=P({url:u,opensInNewWindow:c,text:Object(E.getTextContent)(Object(E.slice)(o))});if(t.preventDefault(),Object(E.isCollapsed)(o)&&!n){var f=Object(E.applyFormat)(Object(E.create)({text:u}),l,0,u.length);r(Object(E.insert)(o,f))}else r(Object(E.applyFormat)(o,l));this.resetState(),T(u)?i(n?Object(O.__)("Link edited."):Object(O.__)("Link inserted."),"assertive"):i(Object(O.__)("Warning: the link has been inserted but may have errors. Please test it."),"assertive")}},{key:"onClickOutside",value:function(t){var e=this.autocompleteRef.current;e&&e.contains(t.target)||this.resetState()}},{key:"resetState",value:function(){this.props.stopAddingLink(),this.setState({editLink:!1})}},{key:"render",value:function(){var t=this,e=this.props,n=e.isActive,o=e.activeAttributes.url,r=e.addingLink,i=e.value;if(!n&&!r)return null;var s=this.state,a=s.inputValue,c=s.opensInNewWindow,u=s.newLinkUrl,l=s.newLinkSlug,f=s.creatingLink,p=s.createdLink,d=s.createdLinkError,h=A(this.props,this.state);return Object(y.createElement)(W,{className:"pretty-link-inserter",value:i,isActive:n,addingLink:r,onClickOutside:this.onClickOutside,onClose:this.resetState,focusOnMount:!!h&&"firstElement",renderSettings:function(){return Object(y.createElement)(y.Fragment,null,Object(y.createElement)("div",null,Object(y.createElement)(j.ToggleControl,{label:Object(O.__)("Open in New Tab"),checked:c,onChange:t.setLinkTarget})),Object(y.createElement)("div",{className:"pretty-link-inserter-form-container"},p&&Object(y.createElement)(j.Notice,{status:"success",onRemove:function(){return t.setState({createdLink:!1})}},Object(y.createElement)("p",null,Object(O.__)("Pretty Link created successfully.","memberpress"))),d&&Object(y.createElement)(j.Notice,{status:"error",onRemove:function(){return t.setState({createdLink:!1,createdLinkError:!1})}},Object(y.createElement)("p",null,Object(O.__)("Pretty Link could not be created. Please try a slug that is not already used.","memberpress"))),Object(y.createElement)("strong",null,Object(O.__)("New Pretty Link","pretty-link")),Object(y.createElement)("form",{onSubmit:function(e){e.preventDefault(),t.setState({creatingLink:!0,createdLinkError:!1}),function(t,e){return new Promise(function(n,o){jQuery.post(ajaxurl,{action:"prli_create_pretty_link",target:t,slug:e,redirect:"",nofollow:1,tracking:1},function(t,e,r){"true"===t?n(t):o(t)}).fail(function(t){o(t)})})}(u,l).then(function(e){t.setState({createdLink:!0,creatingLink:!1,inputValue:plEditor.homeUrl+l,newLinkUrl:"",newLinkSlug:""})}).catch(function(e){t.setState({createdLink:!1,creatingLink:!1,createdLinkError:!0})})}},Object(y.createElement)("p",null,Object(y.createElement)(j.TextControl,{placeholder:"URL",className:"pretty-link-new-link-url",value:u,onChange:function(e){t.setState({newLinkUrl:e})}})),Object(y.createElement)("p",null,Object(y.createElement)(j.TextControl,{placeholder:"Slug",className:"pretty-link-new-link-slug",value:l,onChange:function(e){t.setState({newLinkSlug:e})}})),Object(y.createElement)("p",null,Object(y.createElement)("button",{className:"pretty-link-submit-new-link components-button is-button is-primary",onClick:function(){console.log("Creating new Pretty Link...")}},Object(O.__)("Create New Pretty Link","pretty-link")),f&&Object(y.createElement)(j.Spinner,null)))))}},h?Object(y.createElement)(I,{value:a,onChangeInputValue:this.onChangeInputValue,onKeyDown:this.onKeyDown,submitLink:this.submitLink,autocompleteRef:this.autocompleteRef}):Object(y.createElement)(D,{url:o,editLink:this.editLink}))}}],[{key:"getDerivedStateFromProps",value:function(t,e){var n=t.activeAttributes,o=n.url,r="_blank"===n.target;if(!A(t,e)){if(o!==e.inputValue)return{inputValue:o};if(r!==e.opensInNewWindow)return{opensInNewWindow:r}}return null}}]),e}(y.Component);e.default=Object(j.withSpokenMessages)(F)},function(t,e){!function(){t.exports=this.wp.apiFetch}()},function(t,e){!function(){t.exports=this.wp.htmlEntities}()},function(t,e){!function(){t.exports=this.regeneratorRuntime}()},function(t,e){!function(){t.exports=this.wp.dom}()},function(t,e){function n(){return t.exports=n=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t},n.apply(this,arguments)}t.exports=n},function(t,e){!function(){t.exports=this.wp.data}()},function(t,e,n){"use strict";t.exports=n(34)},function(t,e){function n(t,e,n,o,r,i,s){try{var a=t[i](s),c=a.value}catch(t){return void n(t)}a.done?e(c):Promise.resolve(c).then(o,r)}t.exports=function(t){return function(){var e=this,o=arguments;return new Promise(function(r,i){var s=t.apply(e,o);function a(t){n(s,r,i,a,c,"next",t)}function c(t){n(s,r,i,a,c,"throw",t)}a(void 0)})}}},function(t,e,n){"use strict";n.r(e),n.d(e,"prettyLink",function(){return x});var o=n(16),r=n.n(o),i=n(12),s=n.n(i),a=n(11),c=n.n(a),u=n(10),l=n.n(u),f=n(9),p=n.n(f),d=n(3),h=n.n(d),v=n(8),b=n.n(v),g=n(0),m=n(1),y=n(4),k=n(5),w=n(2),O=n(7),j=n(18),L="pretty-link/pretty-link",S=Object(m.__)("Pretty Link"),x={name:L,title:S,tagName:"a",className:"pretty-link",attributes:{url:"href",target:"target"},edit:Object(y.withSpokenMessages)(function(t){function e(){var t;return s()(this,e),(t=l()(this,p()(e).apply(this,arguments))).addLink=t.addLink.bind(h()(t)),t.stopAddingLink=t.stopAddingLink.bind(h()(t)),t.onRemoveFormat=t.onRemoveFormat.bind(h()(t)),t.state={addingLink:!1},t}return b()(e,t),c()(e,[{key:"addLink",value:function(){var t=this.props,e=t.value,n=t.onChange,o=Object(k.getTextContent)(Object(k.slice)(e));o&&Object(w.isURL)(o)?n(Object(k.applyFormat)(e,{type:L,attributes:{url:o}})):this.setState({addingLink:!0})}},{key:"stopAddingLink",value:function(){this.setState({addingLink:!1})}},{key:"onRemoveFormat",value:function(){var t=this.props,e=t.value,n=t.onChange,o=t.speak;n(Object(k.removeFormat)(e,L)),o(Object(m.__)("Link removed."),"assertive")}},{key:"render",value:function(){var t=this.props,e=t.isActive,n=t.activeAttributes,o=t.value,r=t.onChange;return Object(g.createElement)(g.Fragment,null,Object(g.createElement)(O.RichTextShortcut,{type:"primary",character:"k",onUse:this.addLink}),Object(g.createElement)(O.RichTextShortcut,{type:"primaryShift",character:"k",onUse:this.onRemoveFormat}),e&&Object(g.createElement)(O.RichTextToolbarButton,{icon:"star-filled",title:Object(m.__)("Unlink"),onClick:this.onRemoveFormat,isActive:e,shortcutType:"primaryShift",shortcutCharacter:"k"}),!e&&Object(g.createElement)(O.RichTextToolbarButton,{icon:"star-filled",title:S,onClick:this.addLink,isActive:e,shortcutType:"primary",shortcutCharacter:"k"}),Object(g.createElement)(j.default,{addingLink:this.state.addingLink,stopAddingLink:this.stopAddingLink,isActive:e,activeAttributes:n,value:o,onChange:r}))}}]),e}(g.Component))};[x].forEach(function(t){var e=t.name,n=r()(t,["name"]);return Object(k.registerFormatType)(e,n)})},function(t,e){t.exports=function(t){var e="undefined"!=typeof window&&window.location;if(!e)throw new Error("fixUrls requires window.location");if(!t||"string"!=typeof t)return t;var n=e.protocol+"//"+e.host,o=n+e.pathname.replace(/\/[^\/]*$/,"/");return t.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(t,e){var r,i=e.trim().replace(/^"(.*)"$/,function(t,e){return e}).replace(/^'(.*)'$/,function(t,e){return e});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(i)?t:(r=0===i.indexOf("//")?i:0===i.indexOf("/")?n+i:o+i.replace(/^\.\//,""),"url("+JSON.stringify(r)+")")})}},function(t,e,n){var o={},r=function(t){var e;return function(){return void 0===e&&(e=t.apply(this,arguments)),e}}(function(){return window&&document&&document.all&&!window.atob}),i=function(t){var e={};return function(t,n){if("function"==typeof t)return t();if(void 0===e[t]){var o=function(t,e){return e?e.querySelector(t):document.querySelector(t)}.call(this,t,n);if(window.HTMLIFrameElement&&o instanceof window.HTMLIFrameElement)try{o=o.contentDocument.head}catch(t){o=null}e[t]=o}return e[t]}}(),s=null,a=0,c=[],u=n(28);function l(t,e){for(var n=0;n<t.length;n++){var r=t[n],i=o[r.id];if(i){i.refs++;for(var s=0;s<i.parts.length;s++)i.parts[s](r.parts[s]);for(;s<r.parts.length;s++)i.parts.push(b(r.parts[s],e))}else{var a=[];for(s=0;s<r.parts.length;s++)a.push(b(r.parts[s],e));o[r.id]={id:r.id,refs:1,parts:a}}}}function f(t,e){for(var n=[],o={},r=0;r<t.length;r++){var i=t[r],s=e.base?i[0]+e.base:i[0],a={css:i[1],media:i[2],sourceMap:i[3]};o[s]?o[s].parts.push(a):n.push(o[s]={id:s,parts:[a]})}return n}function p(t,e){var n=i(t.insertInto);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var o=c[c.length-1];if("top"===t.insertAt)o?o.nextSibling?n.insertBefore(e,o.nextSibling):n.appendChild(e):n.insertBefore(e,n.firstChild),c.push(e);else if("bottom"===t.insertAt)n.appendChild(e);else{if("object"!=typeof t.insertAt||!t.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var r=i(t.insertAt.before,n);n.insertBefore(e,r)}}function d(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t);var e=c.indexOf(t);e>=0&&c.splice(e,1)}function h(t){var e=document.createElement("style");if(void 0===t.attrs.type&&(t.attrs.type="text/css"),void 0===t.attrs.nonce){var o=function(){0;return n.nc}();o&&(t.attrs.nonce=o)}return v(e,t.attrs),p(t,e),e}function v(t,e){Object.keys(e).forEach(function(n){t.setAttribute(n,e[n])})}function b(t,e){var n,o,r,i;if(e.transform&&t.css){if(!(i="function"==typeof e.transform?e.transform(t.css):e.transform.default(t.css)))return function(){};t.css=i}if(e.singleton){var c=a++;n=s||(s=h(e)),o=m.bind(null,n,c,!1),r=m.bind(null,n,c,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(t){var e=document.createElement("link");return void 0===t.attrs.type&&(t.attrs.type="text/css"),t.attrs.rel="stylesheet",v(e,t.attrs),p(t,e),e}(e),o=function(t,e,n){var o=n.css,r=n.sourceMap,i=void 0===e.convertToAbsoluteUrls&&r;(e.convertToAbsoluteUrls||i)&&(o=u(o));r&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var s=new Blob([o],{type:"text/css"}),a=t.href;t.href=URL.createObjectURL(s),a&&URL.revokeObjectURL(a)}.bind(null,n,e),r=function(){d(n),n.href&&URL.revokeObjectURL(n.href)}):(n=h(e),o=function(t,e){var n=e.css,o=e.media;o&&t.setAttribute("media",o);if(t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}.bind(null,n),r=function(){d(n)});return o(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;o(t=e)}else r()}}t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(e=e||{}).attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||"boolean"==typeof e.singleton||(e.singleton=r()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var n=f(t,e);return l(n,e),function(t){for(var r=[],i=0;i<n.length;i++){var s=n[i];(a=o[s.id]).refs--,r.push(a)}t&&l(f(t,e),e);for(i=0;i<r.length;i++){var a;if(0===(a=r[i]).refs){for(var c=0;c<a.parts.length;c++)a.parts[c]();delete o[a.id]}}}};var g=function(){var t=[];return function(e,n){return t[e]=n,t.filter(Boolean).join("\n")}}();function m(t,e,n,o){var r=n?"":o.css;if(t.styleSheet)t.styleSheet.cssText=g(e,r);else{var i=document.createTextNode(r),s=t.childNodes;s[e]&&t.removeChild(s[e]),s.length?t.insertBefore(i,s[e]):t.appendChild(i)}}},function(t,e){t.exports=".pretty-link-inserter .block-editor-url-popover__settings {\n display: block; }\n\n.pretty-link-inserter .pretty-link-inserter-form-container {\n margin-top: 30px; }\n"},function(t,e,n){var o=n(30);"string"==typeof o&&(o=[[t.i,o,""]]);var r={hmr:!0,transform:void 0,insertInto:void 0};n(29)(o,r);o.locals&&(t.exports=o.locals)},function(t,e){t.exports=function(t,e){if(null==t)return{};var n,o,r={},i=Object.keys(t);for(o=0;o<i.length;o++)n=i[o],e.indexOf(n)>=0||(r[n]=t[n]);return r}},function(t,e,n){"use strict";var o=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t},r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t};function i(t,e){var n=t["page"+(e?"Y":"X")+"Offset"],o="scroll"+(e?"Top":"Left");if("number"!=typeof n){var r=t.document;"number"!=typeof(n=r.documentElement[o])&&(n=r.body[o])}return n}function s(t){return i(t)}function a(t){return i(t,!0)}function c(t){var e=function(t){var e,n=void 0,o=void 0,r=t.ownerDocument,i=r.body,s=r&&r.documentElement;return n=(e=t.getBoundingClientRect()).left,o=e.top,{left:n-=s.clientLeft||i.clientLeft||0,top:o-=s.clientTop||i.clientTop||0}}(t),n=t.ownerDocument,o=n.defaultView||n.parentWindow;return e.left+=s(o),e.top+=a(o),e}var u=new RegExp("^("+/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source+")(?!px)[a-z%]+$","i"),l=/^(top|right|bottom|left)$/,f="currentStyle",p="runtimeStyle",d="left",h="px";var v=void 0;function b(t,e){for(var n=0;n<t.length;n++)e(t[n])}function g(t){return"border-box"===v(t,"boxSizing")}"undefined"!=typeof window&&(v=window.getComputedStyle?function(t,e,n){var o="",r=t.ownerDocument,i=n||r.defaultView.getComputedStyle(t,null);return i&&(o=i.getPropertyValue(e)||i[e]),o}:function(t,e){var n=t[f]&&t[f][e];if(u.test(n)&&!l.test(e)){var o=t.style,r=o[d],i=t[p][d];t[p][d]=t[f][d],o[d]="fontSize"===e?"1em":n||0,n=o.pixelLeft+h,o[d]=r,t[p][d]=i}return""===n?"auto":n});var m=["margin","border","padding"],y=-1,k=2,w=1;function O(t,e,n){var o=0,r=void 0,i=void 0,s=void 0;for(i=0;i<e.length;i++)if(r=e[i])for(s=0;s<n.length;s++){var a=void 0;a="border"===r?r+n[s]+"Width":r+n[s],o+=parseFloat(v(t,a))||0}return o}function j(t){return null!=t&&t==t.window}var L={};function S(t,e,n){if(j(t))return"width"===e?L.viewportWidth(t):L.viewportHeight(t);if(9===t.nodeType)return"width"===e?L.docWidth(t):L.docHeight(t);var o="width"===e?["Left","Right"]:["Top","Bottom"],r="width"===e?t.offsetWidth:t.offsetHeight,i=(v(t),g(t)),s=0;(null==r||r<=0)&&(r=void 0,(null==(s=v(t,e))||Number(s)<0)&&(s=t.style[e]||0),s=parseFloat(s)||0),void 0===n&&(n=i?w:y);var a=void 0!==r||i,c=r||s;if(n===y)return a?c-O(t,["border","padding"],o):s;if(a){var u=n===k?-O(t,["border"],o):O(t,["margin"],o);return c+(n===w?0:u)}return s+O(t,m.slice(n),o)}b(["Width","Height"],function(t){L["doc"+t]=function(e){var n=e.document;return Math.max(n.documentElement["scroll"+t],n.body["scroll"+t],L["viewport"+t](n))},L["viewport"+t]=function(e){var n="client"+t,o=e.document,r=o.body,i=o.documentElement[n];return"CSS1Compat"===o.compatMode&&i||r&&r[n]||i}});var x={position:"absolute",visibility:"hidden",display:"block"};function E(t){var e=void 0,n=arguments;return 0!==t.offsetWidth?e=S.apply(void 0,n):function(t,e,n){var o={},r=t.style,i=void 0;for(i in e)e.hasOwnProperty(i)&&(o[i]=r[i],r[i]=e[i]);for(i in n.call(t),e)e.hasOwnProperty(i)&&(r[i]=o[i])}(t,x,function(){e=S.apply(void 0,n)}),e}function _(t,e,n){var o=n;if("object"!==(void 0===e?"undefined":r(e)))return void 0!==o?("number"==typeof o&&(o+="px"),void(t.style[e]=o)):v(t,e);for(var i in e)e.hasOwnProperty(i)&&_(t,i,e[i])}b(["width","height"],function(t){var e=t.charAt(0).toUpperCase()+t.slice(1);L["outer"+e]=function(e,n){return e&&E(e,t,n?0:w)};var n="width"===t?["Left","Right"]:["Top","Bottom"];L[t]=function(e,o){if(void 0===o)return e&&E(e,t,y);if(e){v(e);return g(e)&&(o+=O(e,["padding","border"],n)),_(e,t,o)}}}),t.exports=o({getWindow:function(t){var e=t.ownerDocument||t;return e.defaultView||e.parentWindow},offset:function(t,e){if(void 0===e)return c(t);!function(t,e){"static"===_(t,"position")&&(t.style.position="relative");var n=c(t),o={},r=void 0,i=void 0;for(i in e)e.hasOwnProperty(i)&&(r=parseFloat(_(t,i))||0,o[i]=r+e[i]-n[i]);_(t,o)}(t,e)},isWindow:j,each:b,css:_,clone:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);if(t.overflow)for(var n in t)t.hasOwnProperty(n)&&(e.overflow[n]=t.overflow[n]);return e},scrollLeft:function(t,e){if(j(t)){if(void 0===e)return s(t);window.scrollTo(e,a(t))}else{if(void 0===e)return t.scrollLeft;t.scrollLeft=e}},scrollTop:function(t,e){if(j(t)){if(void 0===e)return a(t);window.scrollTo(s(t),e)}else{if(void 0===e)return t.scrollTop;t.scrollTop=e}},viewportWidth:0,viewportHeight:0},L)},function(t,e,n){"use strict";var o=n(33);t.exports=function(t,e,n){n=n||{},9===e.nodeType&&(e=o.getWindow(e));var r=n.allowHorizontalScroll,i=n.onlyScrollIfNeeded,s=n.alignWithTop,a=n.alignWithLeft,c=n.offsetTop||0,u=n.offsetLeft||0,l=n.offsetBottom||0,f=n.offsetRight||0;r=void 0===r||r;var p=o.isWindow(e),d=o.offset(t),h=o.outerHeight(t),v=o.outerWidth(t),b=void 0,g=void 0,m=void 0,y=void 0,k=void 0,w=void 0,O=void 0,j=void 0,L=void 0,S=void 0;p?(O=e,S=o.height(O),L=o.width(O),j={left:o.scrollLeft(O),top:o.scrollTop(O)},k={left:d.left-j.left-u,top:d.top-j.top-c},w={left:d.left+v-(j.left+L)+f,top:d.top+h-(j.top+S)+l},y=j):(b=o.offset(e),g=e.clientHeight,m=e.clientWidth,y={left:e.scrollLeft,top:e.scrollTop},k={left:d.left-(b.left+(parseFloat(o.css(e,"borderLeftWidth"))||0))-u,top:d.top-(b.top+(parseFloat(o.css(e,"borderTopWidth"))||0))-c},w={left:d.left+v-(b.left+m+(parseFloat(o.css(e,"borderRightWidth"))||0))+f,top:d.top+h-(b.top+g+(parseFloat(o.css(e,"borderBottomWidth"))||0))+l}),k.top<0||w.top>0?!0===s?o.scrollTop(e,y.top+k.top):!1===s?o.scrollTop(e,y.top+w.top):k.top<0?o.scrollTop(e,y.top+k.top):o.scrollTop(e,y.top+w.top):i||((s=void 0===s||!!s)?o.scrollTop(e,y.top+k.top):o.scrollTop(e,y.top+w.top)),r&&(k.left<0||w.left>0?!0===a?o.scrollLeft(e,y.left+k.left):!1===a?o.scrollLeft(e,y.left+w.left):k.left<0?o.scrollLeft(e,y.left+k.left):o.scrollLeft(e,y.left+w.left):i||((a=void 0===a||!!a)?o.scrollLeft(e,y.left+k.left):o.scrollLeft(e,y.left+w.left)))}},function(t,e){function n(e,o){return t.exports=n=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},n(e,o)}t.exports=n},function(t,e){function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function o(e){return"function"==typeof Symbol&&"symbol"===n(Symbol.iterator)?t.exports=o=function(t){return n(t)}:t.exports=o=function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":n(t)},o(e)}t.exports=o},function(t,e,n){"use strict";n.r(e);var o=n(14);n.d(e,"URLInput",function(){return o.default})},function(t,e,n){n(37),n(18),n(14),t.exports=n(27)}]);
|
js/editor.js.map
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./js/editor/components/index.js","webpack:///./js/editor/components/link-editor/index.js","webpack:///./js/editor/components/link-editor/style.scss?a870","webpack:///./js/editor/components/link-editor/utils.js","webpack:///./js/editor/components/url-input/index.js","webpack:///./js/editor/formats/pretty-link/index.js","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack:///./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack:///./node_modules/@babel/runtime/helpers/createClass.js","webpack:///./node_modules/@babel/runtime/helpers/extends.js","webpack:///./node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack:///./node_modules/@babel/runtime/helpers/inherits.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutProperties.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack:///./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack:///./node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack:///./node_modules/@babel/runtime/helpers/typeof.js","webpack:///./node_modules/classnames/index.js","webpack:///./node_modules/dom-scroll-into-view/lib/dom-scroll-into-view.js","webpack:///./node_modules/dom-scroll-into-view/lib/index.js","webpack:///./node_modules/dom-scroll-into-view/lib/util.js","webpack:///./js/editor/components/link-editor/style.scss","webpack:///./node_modules/style-loader/lib/addStyles.js","webpack:///./node_modules/style-loader/lib/urls.js","webpack:///external {\"this\":\"regeneratorRuntime\"}","webpack:///external {\"this\":[\"wp\",\"apiFetch\"]}","webpack:///external {\"this\":[\"wp\",\"blockEditor\"]}","webpack:///external {\"this\":[\"wp\",\"components\"]}","webpack:///external {\"this\":[\"wp\",\"compose\"]}","webpack:///external {\"this\":[\"wp\",\"data\"]}","webpack:///external {\"this\":[\"wp\",\"dom\"]}","webpack:///external {\"this\":[\"wp\",\"element\"]}","webpack:///external {\"this\":[\"wp\",\"htmlEntities\"]}","webpack:///external {\"this\":[\"wp\",\"i18n\"]}","webpack:///external {\"this\":[\"wp\",\"keycodes\"]}","webpack:///external {\"this\":[\"wp\",\"richText\"]}","webpack:///external {\"this\":[\"wp\",\"url\"]}","webpack:///external {\"this\":\"lodash\"}"],"names":["stopKeyPropagation","event","stopPropagation","isShowingInput","props","state","addingLink","editLink","LinkEditor","value","onChangeInputValue","onKeyDown","submitLink","autocompleteRef","__","LinkViewerUrl","url","prependedURL","prependHTTP","linkClassName","classnames","isValidHref","filterURLForDisplay","safeDecodeURI","URLPopoverAtLink","isActive","anchorRect","useMemo","selection","window","getSelection","range","rangeCount","getRangeAt","getRectangleFromRange","element","startContainer","nextElementSibling","nodeType","Node","ELEMENT_NODE","parentNode","closest","getBoundingClientRect","start","end","LinkViewer","createNewPrettyLink","target","slug","Promise","resolve","reject","jQuery","post","ajaxurl","action","redirect","nofollow","tracking","data","textStatus","xhr","fail","error","InlineLinkUI","arguments","bind","setLinkTarget","onClickOutside","resetState","createRef","opensInNewWindow","inputValue","newLinkUrl","newLinkSlug","creatingLink","createdLink","createdLinkError","LEFT","DOWN","RIGHT","UP","BACKSPACE","ENTER","indexOf","keyCode","setState","activeAttributes","onChange","selectedText","getTextContent","slice","applyFormat","createLinkFormat","text","preventDefault","speak","format","isCollapsed","toInsert","create","length","insert","autocompleteElement","current","contains","stopAddingLink","showInput","then","plEditor","homeUrl","catch","console","log","Component","withSpokenMessages","href","trimmedHref","trim","test","protocol","getProtocol","isValidProtocol","startsWith","authority","getAuthority","isValidAuthority","path","getPath","isValidPath","queryString","getQueryString","isValidQueryString","fragment","getFragment","isValidFragment","type","attributes","label","sprintf","rel","stopEventPropagation","fetchLinkSuggestions","search","apiFetch","addQueryArgs","term","links","map","link","title","decodeEntities","URLInput","inputRef","updateSuggestions","throttle","suggestionNodes","suggestions","showSuggestions","selectedSuggestion","scrollingIntoView","scrollIntoView","onlyScrollIfNeeded","setTimeout","suggestionsRequest","index","ref","loading","request","debouncedSpeak","_n","selectionStart","setSelectionRange","suggestion","previousIndex","nextIndex","TAB","selectLink","focus","autoFocus","instanceId","className","suggestionsListboxId","suggestionOptionIdPrefix","undefined","id","bindSuggestionNode","handleOnClick","compose","withSafeTimeout","withInstanceId","withSelect","select","getSettings","__experimentalFetchLinkSuggestions","name","prettyLink","tagName","edit","addLink","onRemoveFormat","isURL","removeFormat","registerFormats","forEach","settings","registerFormatType"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;ACnEA;AAAA;AAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAA;;;AAGA;AAEA;;;;AAGA;AACA;AACA;AAUA;AACA;AACA;AACA;AAQA;AACA;AACA;AACA;AACA;AAEA;;;;AAGA;;AAEA,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAAEC,KAAF;AAAA,SAAaA,KAAK,CAACC,eAAN,EAAb;AAAA,CAA3B;;AAEA,SAASC,cAAT,CAAyBC,KAAzB,EAAgCC,KAAhC,EAAwC;AACvC,SAAOD,KAAK,CAACE,UAAN,IAAoBD,KAAK,CAACE,QAAjC;AACA;;AAED,IAAMC,UAAU,GAAG,SAAbA,UAAa;AAAA,MAAIC,KAAJ,QAAIA,KAAJ;AAAA,MAAWC,kBAAX,QAAWA,kBAAX;AAAA,MAA+BC,SAA/B,QAA+BA,SAA/B;AAAA,MAA0CC,UAA1C,QAA0CA,UAA1C;AAAA,MAAsDC,eAAtD,QAAsDA,eAAtD;AAAA,SAClB;;AACA;AACA;AACC,eAAS,EAAC,mGADX;AAEC,gBAAU,EAAGb,kBAFd;AAGC,eAAS,EAAGW,SAHb;AAIC,cAAQ,EAAGC;AAJZ,OAMC,yEAAC,mDAAD;AACC,WAAK,EAAGH,KADT;AAEC,cAAQ,EAAGC,kBAFZ;AAGC,qBAAe,EAAGG;AAHnB,MAND,EAWC,yEAAC,iEAAD;AAAY,UAAI,EAAC,cAAjB;AAAgC,WAAK,EAAGC,2DAAE,CAAE,oBAAF,CAA1C;AAAqE,UAAI,EAAC;AAA1E,MAXD;AAaA;;AAhBkB;AAAA,CAAnB;;AAmBA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,QAAe;AAAA,MAAXC,GAAW,SAAXA,GAAW;AACpC,MAAMC,YAAY,GAAGC,mEAAW,CAAEF,GAAF,CAAhC;AACA,MAAMG,aAAa,GAAGC,iDAAU,CAAE,+FAAF,EAAmG;AAClI,wBAAoB,CAAEC,2DAAW,CAAEJ,YAAF;AADiG,GAAnG,CAAhC;;AAIA,MAAK,CAAED,GAAP,EAAa;AACZ,WAAO;AAAM,eAAS,EAAGG;AAAlB,MAAP;AACA;;AAED,SACC,yEAAC,mEAAD;AACC,aAAS,EAAGA,aADb;AAEC,QAAI,EAAGH;AAFR,KAIGM,2EAAmB,CAAEC,qEAAa,CAAEP,GAAF,CAAf,CAJtB,CADD;AAQA,CAlBD;;AAoBA,IAAMQ,gBAAgB,GAAG,SAAnBA,gBAAmB,QAAiD;AAAA,MAA7CC,QAA6C,SAA7CA,QAA6C;AAAA,MAAnCnB,UAAmC,SAAnCA,UAAmC;AAAA,MAAvBG,KAAuB,SAAvBA,KAAuB;AAAA,MAAbL,KAAa;;AACzE,MAAMsB,UAAU,GAAGC,kEAAO,CAAE,YAAM;AACjC,QAAMC,SAAS,GAAGC,MAAM,CAACC,YAAP,EAAlB;AACA,QAAMC,KAAK,GAAGH,SAAS,CAACI,UAAV,GAAuB,CAAvB,GAA2BJ,SAAS,CAACK,UAAV,CAAsB,CAAtB,CAA3B,GAAuD,IAArE;;AACA,QAAK,CAAEF,KAAP,EAAe;AACd;AACA;;AAED,QAAKzB,UAAL,EAAkB;AACjB,aAAO4B,6EAAqB,CAAEH,KAAF,CAA5B;AACA;;AAED,QAAII,OAAO,GAAGJ,KAAK,CAACK,cAApB,CAXiC,CAajC;;AACAD,WAAO,GAAGA,OAAO,CAACE,kBAAR,IAA8BF,OAAxC;;AAEA,WAAQA,OAAO,CAACG,QAAR,KAAqBT,MAAM,CAACU,IAAP,CAAYC,YAAzC,EAAwD;AACvDL,aAAO,GAAGA,OAAO,CAACM,UAAlB;AACA;;AAED,QAAMC,OAAO,GAAGP,OAAO,CAACO,OAAR,CAAiB,GAAjB,CAAhB;;AACA,QAAKA,OAAL,EAAe;AACd,aAAOA,OAAO,CAACC,qBAAR,EAAP;AACA;AACD,GAxByB,EAwBvB,CAAElB,QAAF,EAAYnB,UAAZ,EAAwBG,KAAK,CAACmC,KAA9B,EAAqCnC,KAAK,CAACoC,GAA3C,CAxBuB,CAA1B;;AA0BA,MAAK,CAAEnB,UAAP,EAAoB;AACnB,WAAO,IAAP;AACA;;AAED,SAAO,yEAAC,mEAAD;AAAY,cAAU,EAAGA;AAAzB,KAA2CtB,KAA3C,EAAP;AACA,CAhCD;;AAkCA,IAAM0C,UAAU,GAAG,SAAbA,UAAa,QAAyB;AAAA,MAArB9B,GAAqB,SAArBA,GAAqB;AAAA,MAAhBT,QAAgB,SAAhBA,QAAgB;AAC3C,SACC;;AACA;AACA;AACC,eAAS,EAAC,mGADX;AAEC,gBAAU,EAAGP;AAFd,OAIC,yEAAC,aAAD;AAAe,SAAG,EAAGgB;AAArB,MAJD,EAKC,yEAAC,iEAAD;AAAY,UAAI,EAAC,MAAjB;AAAwB,WAAK,EAAGF,2DAAE,CAAE,MAAF,CAAlC;AAA+C,aAAO,EAAGP;AAAzD,MALD;AAOA;;AAVD;AAYA,CAbD;;AAeA,IAAMwC,mBAAmB,GAAG,SAAtBA,mBAAsB,CAACC,MAAD,EAASC,IAAT,EAAkB;AAC7C,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACvCC,UAAM,CAACC,IAAP,CACCC,OADD,EAEC;AACCC,YAAM,EAAE,yBADT;AAECR,YAAM,EAAEA,MAFT;AAGCC,UAAI,EAAEA,IAHP;AAICQ,cAAQ,EAAE,EAJX;AAKCC,cAAQ,EAAE,CALX;AAMCC,cAAQ,EAAE;AANX,KAFD,EAUC,UAACC,IAAD,EAAOC,UAAP,EAAmBC,GAAnB,EAA2B;AAC1B,iBAAWF,IAAX,GAAkBT,OAAO,CAACS,IAAD,CAAzB,GAAkCR,MAAM,CAACQ,IAAD,CAAxC;AACA,KAZF,EAaIG,IAbJ,CAaS,UAAAC,KAAK,EAAI;AACfZ,YAAM,CAACY,KAAD,CAAN;AACA,KAfH;AAgBA,GAjBM,CAAP;AAkBA,CAnBD;;IAqBMC,Y;;;;;AACL,0BAAc;AAAA;;AAAA;;AACb,iNAAUC,SAAV;AAEA,UAAK3D,QAAL,GAAgB,MAAKA,QAAL,CAAc4D,IAAd,4FAAhB;AACA,UAAKvD,UAAL,GAAkB,MAAKA,UAAL,CAAgBuD,IAAhB,4FAAlB;AACA,UAAKxD,SAAL,GAAiB,MAAKA,SAAL,CAAewD,IAAf,4FAAjB;AACA,UAAKzD,kBAAL,GAA0B,MAAKA,kBAAL,CAAwByD,IAAxB,4FAA1B;AACA,UAAKC,aAAL,GAAqB,MAAKA,aAAL,CAAmBD,IAAnB,4FAArB;AACA,UAAKE,cAAL,GAAsB,MAAKA,cAAL,CAAoBF,IAApB,4FAAtB;AACA,UAAKG,UAAL,GAAkB,MAAKA,UAAL,CAAgBH,IAAhB,4FAAlB;AACA,UAAKtD,eAAL,GAAuB0D,oEAAS,EAAhC;AAEA,UAAKlE,KAAL,GAAa;AACZmE,sBAAgB,EAAE,KADN;AAEZC,gBAAU,EAAE,EAFA;AAGZC,gBAAU,EAAE,EAHA;AAIZC,iBAAW,EAAE,EAJD;AAKZC,kBAAY,EAAE,KALF;AAMZC,iBAAW,EAAE,KAND;AAOZC,sBAAgB,EAAE;AAPN,KAAb;AAZa;AAqBb;;;;8BAmBU7E,K,EAAQ;AAClB,UAAK,CAAE8E,yDAAF,EAAQC,yDAAR,EAAcC,0DAAd,EAAqBC,uDAArB,EAAyBC,8DAAzB,EAAoCC,0DAApC,EAA4CC,OAA5C,CAAqDpF,KAAK,CAACqF,OAA3D,IAAuE,CAAC,CAA7E,EAAiF;AAChF;AACArF,aAAK,CAACC,eAAN;AACA;AACD;;;uCAEmBuE,U,EAAa;AAChC,WAAKc,QAAL,CAAe;AAAEd,kBAAU,EAAVA;AAAF,OAAf;AACA;;;kCAEcD,gB,EAAmB;AAAA,wBAC2B,KAAKpE,KADhC;AAAA,8CACzBoF,gBADyB,CACLxE,GADK;AAAA,UACLA,GADK,sCACC,EADD;AAAA,UACOP,KADP,eACOA,KADP;AAAA,UACcgF,QADd,eACcA,QADd;AAGjC,WAAKF,QAAL,CAAe;AAAEf,wBAAgB,EAAhBA;AAAF,OAAf,EAHiC,CAKjC;;AACA,UAAK,CAAErE,cAAc,CAAE,KAAKC,KAAP,EAAc,KAAKC,KAAnB,CAArB,EAAkD;AACjD,YAAMqF,YAAY,GAAGC,4EAAc,CAAEC,mEAAK,CAAEnF,KAAF,CAAP,CAAnC;AAEAgF,gBAAQ,CAAEI,yEAAW,CAAEpF,KAAF,EAASqF,gEAAgB,CAAE;AAC/C9E,aAAG,EAAHA,GAD+C;AAE/CwD,0BAAgB,EAAhBA,gBAF+C;AAG/CuB,cAAI,EAAEL;AAHyC,SAAF,CAAzB,CAAb,CAAR;AAKA;AACD;;;6BAESzF,K,EAAQ;AACjB,WAAKsF,QAAL,CAAe;AAAEhF,gBAAQ,EAAE;AAAZ,OAAf;AACAN,WAAK,CAAC+F,cAAN;AACA;;;+BAEW/F,K,EAAQ;AAAA,yBAC0B,KAAKG,KAD/B;AAAA,UACXqB,QADW,gBACXA,QADW;AAAA,UACDhB,KADC,gBACDA,KADC;AAAA,UACMgF,QADN,gBACMA,QADN;AAAA,UACgBQ,KADhB,gBACgBA,KADhB;AAAA,wBAEsB,KAAK5F,KAF3B;AAAA,UAEXoE,UAFW,eAEXA,UAFW;AAAA,UAECD,gBAFD,eAECA,gBAFD;AAGnB,UAAMxD,GAAG,GAAGE,mEAAW,CAAEuD,UAAF,CAAvB;AACA,UAAMiB,YAAY,GAAGC,4EAAc,CAAEC,mEAAK,CAAEnF,KAAF,CAAP,CAAnC;AACA,UAAMyF,MAAM,GAAGJ,gEAAgB,CAAE;AAChC9E,WAAG,EAAHA,GADgC;AAEhCwD,wBAAgB,EAAhBA,gBAFgC;AAGhCuB,YAAI,EAAEL;AAH0B,OAAF,CAA/B;AAMAzF,WAAK,CAAC+F,cAAN;;AAEA,UAAKG,yEAAW,CAAE1F,KAAF,CAAX,IAAwB,CAAEgB,QAA/B,EAA0C;AACzC,YAAM2E,QAAQ,GAAGP,yEAAW,CAAEQ,oEAAM,CAAE;AAAEN,cAAI,EAAE/E;AAAR,SAAF,CAAR,EAA2BkF,MAA3B,EAAmC,CAAnC,EAAsClF,GAAG,CAACsF,MAA1C,CAA5B;AACAb,gBAAQ,CAAEc,oEAAM,CAAE9F,KAAF,EAAS2F,QAAT,CAAR,CAAR;AACA,OAHD,MAGO;AACNX,gBAAQ,CAAEI,yEAAW,CAAEpF,KAAF,EAASyF,MAAT,CAAb,CAAR;AACA;;AAED,WAAK5B,UAAL;;AAEA,UAAK,CAAEjD,2DAAW,CAAEL,GAAF,CAAlB,EAA4B;AAC3BiF,aAAK,CAAEnF,2DAAE,CAAE,0EAAF,CAAJ,EAAoF,WAApF,CAAL;AACA,OAFD,MAEO,IAAKW,QAAL,EAAgB;AACtBwE,aAAK,CAAEnF,2DAAE,CAAE,cAAF,CAAJ,EAAwB,WAAxB,CAAL;AACA,OAFM,MAEA;AACNmF,aAAK,CAAEnF,2DAAE,CAAE,gBAAF,CAAJ,EAA0B,WAA1B,CAAL;AACA;AACD;;;mCAEeb,K,EAAQ;AACvB;AACA;AACA;AACA;AACA,UAAMuG,mBAAmB,GAAG,KAAK3F,eAAL,CAAqB4F,OAAjD;;AACA,UAAKD,mBAAmB,IAAIA,mBAAmB,CAACE,QAApB,CAA8BzG,KAAK,CAAC+C,MAApC,CAA5B,EAA2E;AAC1E;AACA;;AAED,WAAKsB,UAAL;AACA;;;iCAEY;AACZ,WAAKlE,KAAL,CAAWuG,cAAX;AACA,WAAKpB,QAAL,CAAe;AAAEhF,gBAAQ,EAAE;AAAZ,OAAf;AACA;;;6BAEQ;AAAA;;AAAA,yBAC2D,KAAKH,KADhE;AAAA,UACAqB,QADA,gBACAA,QADA;AAAA,UAC8BT,GAD9B,gBACUwE,gBADV,CAC8BxE,GAD9B;AAAA,UACqCV,UADrC,gBACqCA,UADrC;AAAA,UACiDG,KADjD,gBACiDA,KADjD;;AAGR,UAAK,CAAEgB,QAAF,IAAc,CAAEnB,UAArB,EAAkC;AACjC,eAAO,IAAP;AACA;;AALO,yBAOuG,KAAKD,KAP5G;AAAA,UAOAoE,UAPA,gBAOAA,UAPA;AAAA,UAOYD,gBAPZ,gBAOYA,gBAPZ;AAAA,UAO8BE,UAP9B,gBAO8BA,UAP9B;AAAA,UAO0CC,WAP1C,gBAO0CA,WAP1C;AAAA,UAOuDC,YAPvD,gBAOuDA,YAPvD;AAAA,UAOqEC,WAPrE,gBAOqEA,WAPrE;AAAA,UAOkFC,gBAPlF,gBAOkFA,gBAPlF;AAQR,UAAM8B,SAAS,GAAGzG,cAAc,CAAE,KAAKC,KAAP,EAAc,KAAKC,KAAnB,CAAhC;AAEA,aACC,yEAAC,gBAAD;AACC,iBAAS,EAAC,sBADX;AAEC,aAAK,EAAGI,KAFT;AAGC,gBAAQ,EAAGgB,QAHZ;AAIC,kBAAU,EAAGnB,UAJd;AAKC,sBAAc,EAAG,KAAK+D,cALvB;AAMC,eAAO,EAAG,KAAKC,UANhB;AAOC,oBAAY,EAAGsC,SAAS,GAAG,cAAH,GAAoB,KAP7C;AAQC,sBAAc,EAAG;AAAA,iBAChB,yEAAC,2DAAD,QACC,sFACC,yEAAC,oEAAD;AACC,iBAAK,EAAG9F,2DAAE,CAAE,iBAAF,CADX;AAEC,mBAAO,EAAG0D,gBAFX;AAGC,oBAAQ,EAAG,MAAI,CAACJ;AAHjB,YADD,CADD,EAQC;AAAK,qBAAS,EAAC;AAAf,aAEES,WAAW,IACV,yEAAC,6DAAD;AAAQ,kBAAM,EAAC,SAAf;AAAyB,oBAAQ,EAAE;AAAA,qBAAM,MAAI,CAACU,QAAL,CAAc;AAACV,2BAAW,EAAE;AAAd,eAAd,CAAN;AAAA;AAAnC,aACO,oFAAI/D,2DAAE,CAAE,mCAAF,EAAuC,aAAvC,CAAN,CADP,CAHH,EASEgE,gBAAgB,IACf,yEAAC,6DAAD;AAAQ,kBAAM,EAAC,OAAf;AAAuB,oBAAQ,EAAE;AAAA,qBAAM,MAAI,CAACS,QAAL,CAAc;AAACV,2BAAW,EAAE,KAAd;AAAqBC,gCAAgB,EAAE;AAAvC,eAAd,CAAN;AAAA;AAAjC,aACO,oFAAIhE,2DAAE,CAAE,+EAAF,EAAmF,aAAnF,CAAN,CADP,CAVH,EAeC,yFAASA,2DAAE,CAAC,iBAAD,EAAoB,aAApB,CAAX,CAfD,EAgBC;AAAM,oBAAQ,EAAE,kBAACb,KAAD,EAAW;AAC1BA,mBAAK,CAAC+F,cAAN,GAD0B,CAE1B;;AACA,oBAAI,CAACT,QAAL,CAAc;AACbX,4BAAY,EAAE,IADD;AAEbE,gCAAgB,EAAE;AAFL,eAAd;;AAIA/B,iCAAmB,CAAE2B,UAAF,EAAcC,WAAd,CAAnB,CACEkC,IADF,CACO,UAAAjD,IAAI,EAAI;AACb,sBAAI,CAAC2B,QAAL,CAAc;AACbV,6BAAW,EAAE,IADA;AAEbD,8BAAY,EAAE,KAFD;AAGbH,4BAAU,EAAEqC,QAAQ,CAACC,OAAT,GAAmBpC,WAHlB;AAIbD,4BAAU,EAAE,EAJC;AAKbC,6BAAW,EAAE;AALA,iBAAd;AAOA,eATF,EAUEqC,KAVF,CAUQ,UAAAhD,KAAK,EAAI;AACf,sBAAI,CAACuB,QAAL,CAAc;AACbV,6BAAW,EAAE,KADA;AAEbD,8BAAY,EAAE,KAFD;AAGbE,kCAAgB,EAAE;AAHL,iBAAd;AAKA,eAhBF;AAiBA;AAxBD,aAyBC,oFACC,yEAAC,kEAAD;AACO,uBAAW,EAAC,KADnB;AAEO,qBAAS,EAAC,0BAFjB;AAGO,iBAAK,EAAEJ,UAHd;AAIO,oBAAQ,EAAG,kBAAEA,UAAF,EAAkB;AAC5B,oBAAI,CAACa,QAAL,CAAe;AAAEb,0BAAU,EAAVA;AAAF,eAAf;AACA;AANR,YADD,CAzBD,EAmCI,oFACC,yEAAC,kEAAD;AACO,uBAAW,EAAC,MADnB;AAEO,qBAAS,EAAC,2BAFjB;AAGO,iBAAK,EAAEC,WAHd;AAIO,oBAAQ,EAAG,kBAAEA,WAAF,EAAmB;AAC7B,oBAAI,CAACY,QAAL,CAAe;AAAEZ,2BAAW,EAAXA;AAAF,eAAf;AACA;AANR,YADD,CAnCJ,EA6CI,oFACC;AACC,qBAAS,EAAC,oEADX;AAEC,mBAAO,EAAG,mBAAM;AACfsC,qBAAO,CAACC,GAAR,CAAY,6BAAZ;AACA;AAJF,aAMGpG,2DAAE,CAAE,wBAAF,EAA4B,aAA5B,CANL,CADD,EAUE8D,YAAY,IACX,yEAAC,8DAAD,OAXH,CA7CJ,CAhBD,CARD,CADgB;AAAA;AARlB,SAkGGgC,SAAS,GACV,yEAAC,UAAD;AACC,aAAK,EAAGnC,UADT;AAEC,0BAAkB,EAAG,KAAK/D,kBAF3B;AAGC,iBAAS,EAAG,KAAKC,SAHlB;AAIC,kBAAU,EAAG,KAAKC,UAJnB;AAKC,uBAAe,EAAG,KAAKC;AALxB,QADU,GASV,yEAAC,UAAD;AACC,WAAG,EAAGG,GADP;AAEC,gBAAQ,EAAG,KAAKT;AAFjB,QA3GF,CADD;AAmHA;;;6CAhOgCH,K,EAAOC,K,EAAQ;AAAA,kCACDD,KADC,CACvCoF,gBADuC;AAAA,UACnBxE,GADmB,yBACnBA,GADmB;AAAA,UACdgC,MADc,yBACdA,MADc;AAE/C,UAAMwB,gBAAgB,GAAGxB,MAAM,KAAK,QAApC;;AAEA,UAAK,CAAE7C,cAAc,CAAEC,KAAF,EAASC,KAAT,CAArB,EAAwC;AACvC,YAAKW,GAAG,KAAKX,KAAK,CAACoE,UAAnB,EAAgC;AAC/B,iBAAO;AAAEA,sBAAU,EAAEzD;AAAd,WAAP;AACA;;AAED,YAAKwD,gBAAgB,KAAKnE,KAAK,CAACmE,gBAAhC,EAAmD;AAClD,iBAAO;AAAEA,4BAAgB,EAAhBA;AAAF,WAAP;AACA;AACD;;AAED,aAAO,IAAP;AACA;;;;EAvCyB2C,4D;;AA2PZC,gJAAkB,CAAEnD,YAAF,CAAjC,E;;;;;;;;;;;;ACvZA,cAAc,mBAAO,CAAC,2QAAkI;;AAExJ,4CAA4C,QAAS;;AAErD;AACA;;;;AAIA,eAAe;;AAEf;AACA;;AAEA,aAAa,mBAAO,CAAC,4GAAyD;;AAE9E;;AAEA,GAAG,KAAU,EAAE,E;;;;;;;;;;;;ACnBf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAGA;AAEA;;;;AAGA;AAYA;AAEA;;;;;;;;AAOO,SAAS5C,WAAT,CAAsBgG,IAAtB,EAA6B;AACnC,MAAK,CAAEA,IAAP,EAAc;AACb,WAAO,KAAP;AACA;;AAED,MAAMC,WAAW,GAAGD,IAAI,CAACE,IAAL,EAApB;;AAEA,MAAK,CAAED,WAAP,EAAqB;AACpB,WAAO,KAAP;AACA,GATkC,CAWnC;;;AACA,MAAK,QAAQE,IAAR,CAAcF,WAAd,CAAL,EAAmC;AAClC,QAAMG,QAAQ,GAAGC,kEAAW,CAAEJ,WAAF,CAA5B;;AACA,QAAK,CAAEK,sEAAe,CAAEF,QAAF,CAAtB,EAAqC;AACpC,aAAO,KAAP;AACA,KAJiC,CAMlC;AACA;;;AACA,QAAKG,yDAAU,CAAEH,QAAF,EAAY,MAAZ,CAAV,IAAkC,CAAE,uBAAuBD,IAAvB,CAA6BF,WAA7B,CAAzC,EAAsF;AACrF,aAAO,KAAP;AACA;;AAED,QAAMO,SAAS,GAAGC,mEAAY,CAAER,WAAF,CAA9B;;AACA,QAAK,CAAES,uEAAgB,CAAEF,SAAF,CAAvB,EAAuC;AACtC,aAAO,KAAP;AACA;;AAED,QAAMG,IAAI,GAAGC,8DAAO,CAAEX,WAAF,CAApB;;AACA,QAAKU,IAAI,IAAI,CAAEE,kEAAW,CAAEF,IAAF,CAA1B,EAAqC;AACpC,aAAO,KAAP;AACA;;AAED,QAAMG,WAAW,GAAGC,qEAAc,CAAEd,WAAF,CAAlC;;AACA,QAAKa,WAAW,IAAI,CAAEE,yEAAkB,CAAEF,WAAF,CAAxC,EAA0D;AACzD,aAAO,KAAP;AACA;;AAED,QAAMG,QAAQ,GAAGC,kEAAW,CAAEjB,WAAF,CAA5B;;AACA,QAAKgB,QAAQ,IAAI,CAAEE,sEAAe,CAAEF,QAAF,CAAlC,EAAiD;AAChD,aAAO,KAAP;AACA;AACD,GA3CkC,CA6CnC;;;AACA,MAAKV,yDAAU,CAAEN,WAAF,EAAe,GAAf,CAAV,IAAkC,CAAEkB,sEAAe,CAAElB,WAAF,CAAxD,EAA0E;AACzE,WAAO,KAAP;AACA;;AAED,SAAO,IAAP;AACA;AAED;;;;;;;;;;AASO,SAASxB,gBAAT,OAA6D;AAAA,MAAhC9E,GAAgC,QAAhCA,GAAgC;AAAA,MAA3BwD,gBAA2B,QAA3BA,gBAA2B;AAAA,MAATuB,IAAS,QAATA,IAAS;AACnE,MAAMG,MAAM,GAAG;AACduC,QAAI,EAAE,WADQ;AAEdC,cAAU,EAAE;AACX1H,SAAG,EAAHA;AADW;AAFE,GAAf;;AAOA,MAAKwD,gBAAL,EAAwB;AACvB;AACA,QAAMmE,KAAK,GAAGC,+DAAO,CAAE9H,0DAAE,CAAE,yBAAF,CAAJ,EAAmCiF,IAAnC,CAArB;AAEAG,UAAM,CAACwC,UAAP,CAAkB1F,MAAlB,GAA2B,QAA3B;AACAkD,UAAM,CAACwC,UAAP,CAAkBG,GAAlB,GAAwB,qBAAxB;AACA3C,UAAM,CAACwC,UAAP,CAAmB,YAAnB,IAAoCC,KAApC;AACA;;AAED,SAAOzC,MAAP;AACA,C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7GD;;;AAGA;AACA;AACA;AAEA;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CAGA;AACA;AACA;;AACA,IAAM4C,oBAAoB,GAAG,SAAvBA,oBAAuB,CAAE7I,KAAF;AAAA,SAAaA,KAAK,CAACC,eAAN,EAAb;AAAA,CAA7B;;AAEA,IAAM6I,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,yEAAG,iBAAQC,MAAR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAERC,4DAAQ,CAAE;AAC7BjI,iBAAG,EAAEkI,oEAAY,CAAE3F,OAAF,EAAW;AAC3BC,sBAAM,EAAE,uBADmB;AAE3B2F,oBAAI,EAAEH;AAFqB,eAAX;AADY,aAAF,CAFA;;AAAA;AAEtBI,iBAFsB;AAAA,6CASrBC,kDAAG,CAAED,KAAF,EAAS,UAAEE,IAAF;AAAA,qBAAc;AAChCtI,mBAAG,EAAE8F,QAAQ,CAACC,OAAT,GAAmBuC,IAAI,CAACrG,IADG;AAEhCsG,qBAAK,EAAEC,gFAAc,CAAEF,IAAI,CAAC7I,KAAP,CAAd,GAA+B,IAA/B,GAAsC+I,gFAAc,CAAEF,IAAI,CAACrG,IAAP,CAApD,GAAoE,GAApE,IAA2EnC,2DAAE,CAAE,YAAF;AAFpD,eAAd;AAAA,aAAT,CATkB;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAH;;AAAA,kBAApBiI,oBAAoB;AAAA;AAAA;AAAA,GAA1B;;IAeMU,Q;;;;;AACL,2BAAmC;AAAA;;AAAA,QAApB5I,eAAoB,SAApBA,eAAoB;;AAAA;;AAClC,6MAAUqD,SAAV;AAEA,UAAKuB,QAAL,GAAgB,MAAKA,QAAL,CAActB,IAAd,4FAAhB;AACA,UAAKxD,SAAL,GAAiB,MAAKA,SAAL,CAAewD,IAAf,4FAAjB;AACA,UAAKtD,eAAL,GAAuBA,eAAe,IAAI0D,oEAAS,EAAnD;AACA,UAAKmF,QAAL,GAAgBnF,oEAAS,EAAzB;AACA,UAAKoF,iBAAL,GAAyBC,uDAAQ,CAAE,MAAKD,iBAAL,CAAuBxF,IAAvB,4FAAF,EAAuC,GAAvC,CAAjC;AAEA,UAAK0F,eAAL,GAAuB,EAAvB;AAEA,UAAKxJ,KAAL,GAAa;AACZyJ,iBAAW,EAAE,EADD;AAEZC,qBAAe,EAAE,KAFL;AAGZC,wBAAkB,EAAE;AAHR,KAAb;AAXkC;AAgBlC;;;;yCAEoB;AAAA;;AAAA,wBAC4B,KAAK3J,KADjC;AAAA,UACZ0J,eADY,eACZA,eADY;AAAA,UACKC,kBADL,eACKA,kBADL,EAEpB;AACA;;AACA,UAAKD,eAAe,IAAIC,kBAAkB,KAAK,IAA1C,IAAkD,CAAE,KAAKC,iBAA9D,EAAkF;AACjF,aAAKA,iBAAL,GAAyB,IAAzB;AACAC,oEAAc,CAAE,KAAKL,eAAL,CAAsBG,kBAAtB,CAAF,EAA8C,KAAKnJ,eAAL,CAAqB4F,OAAnE,EAA4E;AACzF0D,4BAAkB,EAAE;AADqE,SAA5E,CAAd;AAIA,aAAK/J,KAAL,CAAWgK,UAAX,CAAuB,YAAM;AAC5B,gBAAI,CAACH,iBAAL,GAAyB,KAAzB;AACA,SAFD,EAEG,GAFH;AAGA;AACD;;;2CAEsB;AACtB,aAAO,KAAKI,kBAAZ;AACA;;;uCAEmBC,K,EAAQ;AAAA;;AAC3B,aAAO,UAAEC,GAAF,EAAW;AACjB,cAAI,CAACV,eAAL,CAAsBS,KAAtB,IAAgCC,GAAhC;AACA,OAFD;AAGA;;;sCAEkB9J,K,EAAQ;AAAA;;AAE1B;AACA;AACA,UAAKA,KAAK,CAAC6F,MAAN,GAAe,CAAf,IAAoB,WAAWkB,IAAX,CAAiB/G,KAAjB,CAAzB,EAAoD;AACnD,aAAK8E,QAAL,CAAe;AACdwE,yBAAe,EAAE,KADH;AAEdC,4BAAkB,EAAE,IAFN;AAGdQ,iBAAO,EAAE;AAHK,SAAf;AAMA;AACA;;AAED,WAAKjF,QAAL,CAAe;AACdwE,uBAAe,EAAE,IADH;AAEdC,0BAAkB,EAAE,IAFN;AAGdQ,eAAO,EAAE;AAHK,OAAf;AAMA,UAAMC,OAAO,GAAG1B,oBAAoB,CAAEtI,KAAF,CAApC;AAEAgK,aAAO,CAAC5D,IAAR,CAAc,UAAEiD,WAAF,EAAmB;AAChC;AACA;AACA;AACA,YAAK,MAAI,CAACO,kBAAL,KAA4BI,OAAjC,EAA2C;AAC1C;AACA;;AAED,cAAI,CAAClF,QAAL,CAAe;AACduE,qBAAW,EAAXA,WADc;AAEdU,iBAAO,EAAE;AAFK,SAAf;;AAKA,YAAK,CAAC,CAAEV,WAAW,CAACxD,MAApB,EAA6B;AAC5B,gBAAI,CAAClG,KAAL,CAAWsK,cAAX,CAA2B9B,gEAAO,CAAE+B,2DAAE,CACrC,0DADqC,EAErC,2DAFqC,EAGrCb,WAAW,CAACxD,MAHyB,CAAJ,EAI/BwD,WAAW,CAACxD,MAJmB,CAAlC,EAIyB,WAJzB;AAKA,SAND,MAMO;AACN,gBAAI,CAAClG,KAAL,CAAWsK,cAAX,CAA2B5J,2DAAE,CAAE,aAAF,CAA7B,EAAgD,WAAhD;AACA;AACD,OAtBD,EAsBIkG,KAtBJ,CAsBW,YAAM;AAChB,YAAK,MAAI,CAACqD,kBAAL,KAA4BI,OAAjC,EAA2C;AAC1C,gBAAI,CAAClF,QAAL,CAAe;AACdiF,mBAAO,EAAE;AADK,WAAf;AAGA;AACD,OA5BD;AA8BA,WAAKH,kBAAL,GAA0BI,OAA1B;AACA;;;6BAESxK,K,EAAQ;AACjB,UAAMwE,UAAU,GAAGxE,KAAK,CAAC+C,MAAN,CAAavC,KAAhC;AACA,WAAKL,KAAL,CAAWqF,QAAX,CAAqBhB,UAArB;AACA,WAAKkF,iBAAL,CAAwBlF,UAAxB;AACA;;;8BAEUxE,K,EAAQ;AAAA,yBACoD,KAAKI,KADzD;AAAA,UACV0J,eADU,gBACVA,eADU;AAAA,UACOC,kBADP,gBACOA,kBADP;AAAA,UAC2BF,WAD3B,gBAC2BA,WAD3B;AAAA,UACwCU,OADxC,gBACwCA,OADxC,EAElB;AACA;;AACA,UAAK,CAAET,eAAF,IAAqB,CAAED,WAAW,CAACxD,MAAnC,IAA6CkE,OAAlD,EAA4D;AAC3D;AACA;AACA;AACA;AACA;AACA,gBAASvK,KAAK,CAACqF,OAAf;AACC;AACA;AACA,eAAKJ,uDAAL;AAAS;AACR,kBAAK,MAAMjF,KAAK,CAAC+C,MAAN,CAAa4H,cAAxB,EAAyC;AACxC3K,qBAAK,CAACC,eAAN;AACAD,qBAAK,CAAC+F,cAAN,GAFwC,CAIxC;;AACA/F,qBAAK,CAAC+C,MAAN,CAAa6H,iBAAb,CAAgC,CAAhC,EAAmC,CAAnC;AACA;;AACD;AACA;AACD;AACA;;AACA,eAAK7F,yDAAL;AAAW;AACV,kBAAK,KAAK5E,KAAL,CAAWK,KAAX,CAAiB6F,MAAjB,KAA4BrG,KAAK,CAAC+C,MAAN,CAAa4H,cAA9C,EAA+D;AAC9D3K,qBAAK,CAACC,eAAN;AACAD,qBAAK,CAAC+F,cAAN,GAF8D,CAI9D;;AACA/F,qBAAK,CAAC+C,MAAN,CAAa6H,iBAAb,CAAgC,KAAKzK,KAAL,CAAWK,KAAX,CAAiB6F,MAAjD,EAAyD,KAAKlG,KAAL,CAAWK,KAAX,CAAiB6F,MAA1E;AACA;;AACD;AACA;AAxBF;;AA2BA;AACA;;AAED,UAAMwE,UAAU,GAAG,KAAKzK,KAAL,CAAWyJ,WAAX,CAAwB,KAAKzJ,KAAL,CAAW2J,kBAAnC,CAAnB;;AAEA,cAAS/J,KAAK,CAACqF,OAAf;AACC,aAAKJ,uDAAL;AAAS;AACRjF,iBAAK,CAACC,eAAN;AACAD,iBAAK,CAAC+F,cAAN;AACA,gBAAM+E,aAAa,GAAG,CAAEf,kBAAF,GAAuBF,WAAW,CAACxD,MAAZ,GAAqB,CAA5C,GAAgD0D,kBAAkB,GAAG,CAA3F;AACA,iBAAKzE,QAAL,CAAe;AACdyE,gCAAkB,EAAEe;AADN,aAAf;AAGA;AACA;;AACD,aAAK/F,yDAAL;AAAW;AACV/E,iBAAK,CAACC,eAAN;AACAD,iBAAK,CAAC+F,cAAN;AACA,gBAAMgF,SAAS,GAAGhB,kBAAkB,KAAK,IAAvB,IAAiCA,kBAAkB,KAAKF,WAAW,CAACxD,MAAZ,GAAqB,CAA7E,GAAmF,CAAnF,GAAuF0D,kBAAkB,GAAG,CAA9H;AACA,iBAAKzE,QAAL,CAAe;AACdyE,gCAAkB,EAAEgB;AADN,aAAf;AAGA;AACA;;AACD,aAAKC,wDAAL;AAAU;AACT,gBAAK,KAAK5K,KAAL,CAAW2J,kBAAX,KAAkC,IAAvC,EAA8C;AAC7C,mBAAKkB,UAAL,CAAiBJ,UAAjB,EAD6C,CAE7C;;AACA,mBAAK1K,KAAL,CAAW6F,KAAX,CAAkBnF,2DAAE,CAAE,gBAAF,CAApB;AACA;;AACD;AACA;;AACD,aAAKsE,0DAAL;AAAY;AACX,gBAAK,KAAK/E,KAAL,CAAW2J,kBAAX,KAAkC,IAAvC,EAA8C;AAC7C/J,mBAAK,CAACC,eAAN;AACA,mBAAKgL,UAAL,CAAiBJ,UAAjB;AACA;;AACD;AACA;AAjCF;AAmCA;;;+BAEWA,U,EAAa;AACxB,WAAK1K,KAAL,CAAWqF,QAAX,CAAqBqF,UAAU,CAAC9J,GAAhC,EAAqC8J,UAArC;AACA,WAAKvF,QAAL,CAAe;AACdyE,0BAAkB,EAAE,IADN;AAEdD,uBAAe,EAAE;AAFH,OAAf;AAIA;;;kCAEce,U,EAAa;AAC3B,WAAKI,UAAL,CAAiBJ,UAAjB,EAD2B,CAE3B;;AACA,WAAKpB,QAAL,CAAcjD,OAAd,CAAsB0E,KAAtB;AACA;;;6BAEQ;AAAA;;AAAA,wBACwD,KAAK/K,KAD7D;AAAA,0CACAK,KADA;AAAA,UACAA,KADA,kCACQ,EADR;AAAA,8CACY2K,SADZ;AAAA,UACYA,SADZ,sCACwB,IADxB;AAAA,UAC8BC,UAD9B,eAC8BA,UAD9B;AAAA,UAC0CC,SAD1C,eAC0CA,SAD1C;AAAA,yBAE8D,KAAKjL,KAFnE;AAAA,UAEA0J,eAFA,gBAEAA,eAFA;AAAA,UAEiBD,WAFjB,gBAEiBA,WAFjB;AAAA,UAE8BE,kBAF9B,gBAE8BA,kBAF9B;AAAA,UAEkDQ,OAFlD,gBAEkDA,OAFlD;AAIR,UAAMe,oBAAoB,gDAA0CF,UAA1C,CAA1B;AACA,UAAMG,wBAAwB,+CAAyCH,UAAzC,CAA9B;AAEA;;AACA,aACC;AAAK,iBAAS,EAAGjK,kDAAU,CAAE,yCAAF,EAA6CkK,SAA7C;AAA3B,SACC;AACC,iBAAS,EAAGF,SADb;AAEC,YAAI,EAAC,MAFN;AAGC,sBAAatK,2DAAE,CAAE,KAAF,CAHhB;AAIC,gBAAQ,MAJT;AAKC,aAAK,EAAGL,KALT;AAMC,gBAAQ,EAAG,KAAKgF,QANjB;AAOC,eAAO,EAAGqD,oBAPX;AAQC,mBAAW,EAAGhI,2DAAE,CAAE,8CAAF,CARjB;AASC,iBAAS,EAAG,KAAKH,SATlB;AAUC,YAAI,EAAC,UAVN;AAWC,yBAAgBoJ,eAXjB;AAYC,6BAAkB,MAZnB;AAaC,qBAAYwB,oBAbb;AAcC,iCAAwBvB,kBAAkB,KAAK,IAAvB,aAAkCwB,wBAAlC,cAAgExB,kBAAhE,IAAwFyB,SAdjH;AAeC,WAAG,EAAG,KAAK/B;AAfZ,QADD,EAmBKc,OAAF,IAAe,yEAAC,8DAAD,OAnBlB,EAqBGT,eAAe,IAAI,CAAC,CAAED,WAAW,CAACxD,MAAlC,IACD,yEAAC,8DAAD;AAAS,gBAAQ,EAAC,QAAlB;AAA2B,eAAO,MAAlC;AAAmC,oBAAY,EAAG;AAAlD,SACC;AACC,iBAAS,EAAC,mEADX;AAEC,UAAE,EAAGiF,oBAFN;AAGC,WAAG,EAAG,KAAK1K,eAHZ;AAIC,YAAI,EAAC;AAJN,SAMGiJ,WAAW,CAACT,GAAZ,CAAiB,UAAEyB,UAAF,EAAcR,KAAd;AAAA,eAClB;AACC,aAAG,EAAGQ,UAAU,CAACY,EADlB;AAEC,cAAI,EAAC,QAFN;AAGC,kBAAQ,EAAC,IAHV;AAIC,YAAE,YAAOF,wBAAP,cAAqClB,KAArC,CAJH;AAKC,aAAG,EAAG,MAAI,CAACqB,kBAAL,CAAyBrB,KAAzB,CALP;AAMC,mBAAS,EAAGlJ,kDAAU,CAAE,iEAAF,EAAqE;AAC1F,2BAAekJ,KAAK,KAAKN;AADiE,WAArE,CANvB;AASC,iBAAO,EAAG;AAAA,mBAAM,MAAI,CAAC4B,aAAL,CAAoBd,UAApB,CAAN;AAAA,WATX;AAUC,2BAAgBR,KAAK,KAAKN;AAV3B,WAYGc,UAAU,CAACvB,KAZd,CADkB;AAAA,OAAjB,CANH,CADD,CAtBF,CADD;AAmDA;AACA;;;;EAnQqBpC,4D;AAsQvB;;;;;AAGe0E,kIAAO,CACrBC,mEADqB,EAErB1E,yEAFqB,EAGrB2E,kEAHqB,EAIrBC,mEAAU,CAAE,UAAEC,MAAF,EAAc;AAAA,gBACDA,MAAM,CAAE,mBAAF,CADL;AAAA,MACjBC,WADiB,WACjBA,WADiB;;AAEzB,SAAO;AACNnD,wBAAoB,EAAEmD,WAAW,GAAGC;AAD9B,GAAP;AAGA,CALS,CAJW,CAAP,CAUZ1C,QAVY,CAAf,E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjTA;;;AAGA;AACA;AACA;AACA;AAOA;AACA;AACA;AAEA;;;;AAGA,IAAM2C,IAAI,GAAG,yBAAb;;AACA,IAAM7C,KAAK,GAAGzI,0DAAE,CAAE,aAAF,CAAhB;;AAEO,IAAMuL,UAAU,GAAG;AACxBD,MAAI,EAAJA,IADwB;AAExB7C,OAAK,EAALA,KAFwB;AAGxB+C,SAAO,EAAE,GAHe;AAIxBhB,WAAS,EAAE,aAJa;AAKxB5C,YAAU,EAAE;AACV1H,OAAG,EAAE,MADK;AAEVgC,UAAM,EAAE;AAFE,GALY;AASxBuJ,MAAI,EAAEnF,gFAAkB;AAAA;AAAA;AAAA;;AACtB,wBAAc;AAAA;;AAAA;;AACZ,+MAAUlD,SAAV;AAEA,YAAKsI,OAAL,GAAe,MAAKA,OAAL,CAAarI,IAAb,4FAAf;AACA,YAAKwC,cAAL,GAAsB,MAAKA,cAAL,CAAoBxC,IAApB,4FAAtB;AACA,YAAKsI,cAAL,GAAsB,MAAKA,cAAL,CAAoBtI,IAApB,4FAAtB;AACA,YAAK9D,KAAL,GAAa;AACXC,kBAAU,EAAE;AADD,OAAb;AANY;AASb;;AAVqB;AAAA;AAAA,gCAYZ;AAAA,0BACoB,KAAKF,KADzB;AAAA,YACAK,KADA,eACAA,KADA;AAAA,YACOgF,QADP,eACOA,QADP;AAER,YAAMM,IAAI,GAAGJ,4EAAc,CAAEC,mEAAK,CAAEnF,KAAF,CAAP,CAA3B;;AAEA,YAAKsF,IAAI,IAAI2G,6DAAK,CAAE3G,IAAF,CAAlB,EAA6B;AAC3BN,kBAAQ,CAAEI,yEAAW,CAAEpF,KAAF,EAAS;AAAEgI,gBAAI,EAAE2D,IAAR;AAAc1D,sBAAU,EAAE;AAAE1H,iBAAG,EAAE+E;AAAP;AAA1B,WAAT,CAAb,CAAR;AACD,SAFD,MAEO;AACL,eAAKR,QAAL,CAAe;AAAEjF,sBAAU,EAAE;AAAd,WAAf;AACD;AACF;AArBqB;AAAA;AAAA,uCAuBL;AACf,aAAKiF,QAAL,CAAe;AAAEjF,oBAAU,EAAE;AAAd,SAAf;AACD;AAzBqB;AAAA;AAAA,uCA2BL;AAAA,2BACoB,KAAKF,KADzB;AAAA,YACPK,KADO,gBACPA,KADO;AAAA,YACAgF,QADA,gBACAA,QADA;AAAA,YACUQ,KADV,gBACUA,KADV;AAGfR,gBAAQ,CAAEkH,0EAAY,CAAElM,KAAF,EAAS2L,IAAT,CAAd,CAAR;AACAnG,aAAK,CAAEnF,0DAAE,CAAE,eAAF,CAAJ,EAAyB,WAAzB,CAAL;AACD;AAhCqB;AAAA;AAAA,+BAkCb;AAAA,2BACiD,KAAKV,KADtD;AAAA,YACCqB,QADD,gBACCA,QADD;AAAA,YACW+D,gBADX,gBACWA,gBADX;AAAA,YAC6B/E,KAD7B,gBAC6BA,KAD7B;AAAA,YACoCgF,QADpC,gBACoCA,QADpC;AAGP,eACE,4IACE,yEAAC,yEAAD;AACE,cAAI,EAAC,SADP;AAEE,mBAAS,EAAC,GAFZ;AAGE,eAAK,EAAG,KAAK+G;AAHf,UADF,EAME,yEAAC,yEAAD;AACE,cAAI,EAAC,cADP;AAEE,mBAAS,EAAC,GAFZ;AAGE,eAAK,EAAG,KAAKC;AAHf,UANF,EAWIhL,QAAQ,IAAI,yEAAC,8EAAD;AACZ,cAAI,EAAC,aADO;AAEZ,eAAK,EAAGX,0DAAE,CAAE,QAAF,CAFE;AAGZ,iBAAO,EAAG,KAAK2L,cAHH;AAIZ,kBAAQ,EAAGhL,QAJC;AAKZ,sBAAY,EAAC,cALD;AAMZ,2BAAiB,EAAC;AANN,UAXhB,EAmBI,CAAEA,QAAF,IAAc,yEAAC,8EAAD;AACd,cAAI,EAAC,aADS;AAEd,eAAK,EAAG8H,KAFM;AAGd,iBAAO,EAAG,KAAKiD,OAHD;AAId,kBAAQ,EAAG/K,QAJG;AAKd,sBAAY,EAAC,SALC;AAMd,2BAAiB,EAAC;AANJ,UAnBlB,EA2BE,yEAAC,gEAAD;AACE,oBAAU,EAAG,KAAKpB,KAAL,CAAWC,UAD1B;AAEE,wBAAc,EAAG,KAAKqG,cAFxB;AAGE,kBAAQ,EAAGlF,QAHb;AAIE,0BAAgB,EAAG+D,gBAJrB;AAKE,eAAK,EAAG/E,KALV;AAME,kBAAQ,EAAGgF;AANb,UA3BF,CADF;AAsCD;AA3EqB;;AAAA;AAAA,IAAyB0B,4DAAzB;AATA,CAAnB;;AAyFP,SAASyF,eAAT,GAA4B;AAC1B,GACEP,UADF,EAEEQ,OAFF,CAEW;AAAA,QAAIT,IAAJ,QAAIA,IAAJ;AAAA,QAAaU,QAAb;;AAAA,WAA6BC,gFAAkB,CAAEX,IAAF,EAAQU,QAAR,CAA/C;AAAA,GAFX;AAGD;;AAAA;AACDF,eAAe,G;;;;;;;;;;;ACrHf;AACA;AACA;AACA;;AAEA;AACA;;AAEA,wC;;;;;;;;;;;ACRA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,KAAK;AACL;AACA;;AAEA,mC;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;;;;;ACNA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,8B;;;;;;;;;;;AChBA;AACA;AACA,mBAAmB,sBAAsB;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA,0B;;;;;;;;;;;AClBA;AACA;AACA;AACA;AACA;AACA;;AAEA,iC;;;;;;;;;;;ACPA,qBAAqB,mBAAO,CAAC,iFAAkB;;AAE/C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;;AAEA,2B;;;;;;;;;;;ACjBA,mCAAmC,mBAAO,CAAC,6GAAgC;;AAE3E;AACA;AACA;AACA;;AAEA;AACA;;AAEA,eAAe,6BAA6B;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,0C;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;;AAEA,aAAa,uBAAuB;AACpC;AACA;AACA;AACA;;AAEA;AACA;;AAEA,+C;;;;;;;;;;;ACfA,cAAc,mBAAO,CAAC,0EAAmB;;AAEzC,4BAA4B,mBAAO,CAAC,+FAAyB;;AAE7D;AACA;AACA;AACA;;AAEA;AACA;;AAEA,4C;;;;;;;;;;;ACZA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,iC;;;;;;;;;;;ACTA,wBAAwB,2EAA2E,oCAAoC,mBAAmB,GAAG,EAAE,OAAO,oCAAoC,8HAA8H,GAAG,EAAE,sBAAsB;;AAEnW;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA,yB;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA,gBAAgB;;AAEhB;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;AACA;;AAEA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAE,UAAU,IAA4E;AACxF;AACA,EAAE,iCAAqB,EAAE,mCAAE;AAC3B;AACA,GAAG;AAAA,oGAAC;AACJ,EAAE,MAAM,EAEN;AACF,CAAC;;;;;;;;;;;;;ACnDY;;AAEb,WAAW,mBAAO,CAAC,+DAAQ;;AAE3B;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;;AAEA,gC;;;;;;;;;;;;AChIa;;AAEb,iBAAiB,mBAAO,CAAC,+FAAwB,E;;;;;;;;;;;;ACFpC;;AAEb,mDAAmD,gBAAgB,sBAAsB,OAAO,2BAA2B,0BAA0B,yDAAyD,2BAA2B,EAAE,EAAE,EAAE,eAAe;;AAE9P,oGAAoG,mBAAmB,EAAE,mBAAmB,kGAAkG;;AAE9O;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,iBAAiB,gBAAgB;AACjC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,kBAAkB;AAC/B;AACA;AACA,iBAAiB,kBAAkB;AACnC;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,SAAS,OAAO;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;AACA,CAAC,Y;;;;;;;;;;;ACtbD,6EAA6E,mBAAmB,EAAE,gEAAgE,qBAAqB,EAAE,G;;;;;;;;;;;ACAzL;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;;AAEA,cAAc,mBAAO,CAAC,uDAAQ;;AAE9B;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;AACA;;AAEA,iBAAiB,mBAAmB;AACpC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,iBAAiB,sBAAsB;AACvC;;AAEA;AACA,mBAAmB,2BAA2B;;AAE9C;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB,mBAAmB;AACnC;AACA;;AAEA;AACA;;AAEA,iBAAiB,2BAA2B;AAC5C;AACA;;AAEA,QAAQ,uBAAuB;AAC/B;AACA;AACA,GAAG;AACH;;AAEA,iBAAiB,uBAAuB;AACxC;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;AACA,cAAc;;AAEd,kDAAkD,sBAAsB;AACxE;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA;AACA,EAAE;AACF;AACA,EAAE;AACF;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,EAAE;AACF;;AAEA;AACA,KAAK,KAAwC,EAAE,EAE7C;;AAEF,QAAQ,sBAAiB;AACzB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;;AAEA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,EAAE;AACF;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uDAAuD;AACvD;;AAEA,6BAA6B,mBAAmB;;AAEhD;;AAEA;;AAEA;AACA;;;;;;;;;;;;;AC9YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,WAAW,EAAE;AACrD,wCAAwC,WAAW,EAAE;;AAErD;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA,sCAAsC;AACtC,GAAG;AACH;AACA,8DAA8D;AAC9D;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxFA,aAAa,6CAA6C,EAAE,I;;;;;;;;;;;ACA5D,aAAa,yCAAyC,EAAE,I;;;;;;;;;;;ACAxD,aAAa,4CAA4C,EAAE,I;;;;;;;;;;;ACA3D,aAAa,2CAA2C,EAAE,I;;;;;;;;;;;ACA1D,aAAa,wCAAwC,EAAE,I;;;;;;;;;;;ACAvD,aAAa,qCAAqC,EAAE,I;;;;;;;;;;;ACApD,aAAa,oCAAoC,EAAE,I;;;;;;;;;;;ACAnD,aAAa,wCAAwC,EAAE,I;;;;;;;;;;;ACAvD,aAAa,6CAA6C,EAAE,I;;;;;;;;;;;ACA5D,aAAa,qCAAqC,EAAE,I;;;;;;;;;;;ACApD,aAAa,yCAAyC,EAAE,I;;;;;;;;;;;ACAxD,aAAa,yCAAyC,EAAE,I;;;;;;;;;;;ACAxD,aAAa,oCAAoC,EAAE,I;;;;;;;;;;;ACAnD,aAAa,iCAAiC,EAAE,I","file":"editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","export { default as URLInput } from './url-input';","/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { Component, Fragment, createRef, useMemo } from '@wordpress/element';\nimport {\n\tExternalLink,\n\tIconButton,\n\tToggleControl,\n\tButton,\n\tTextControl,\n\tNotice,\n\tSpinner,\n\twithSpokenMessages,\n} from '@wordpress/components';\nimport { LEFT, RIGHT, UP, DOWN, BACKSPACE, ENTER } from '@wordpress/keycodes';\nimport { getRectangleFromRange } from '@wordpress/dom';\nimport { prependHTTP, safeDecodeURI, filterURLForDisplay } from '@wordpress/url';\nimport {\n\tcreate,\n\tinsert,\n\tisCollapsed,\n\tapplyFormat,\n\tgetTextContent,\n\tslice,\n} from '@wordpress/rich-text';\nimport { URLPopover } from '@wordpress/block-editor';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport URLInput from '../url-input';\nimport './style.scss';\n\n/**\n * Internal dependencies\n */\nimport { createLinkFormat, isValidHref } from './utils';\n\nconst stopKeyPropagation = ( event ) => event.stopPropagation();\n\nfunction isShowingInput( props, state ) {\n\treturn props.addingLink || state.editLink;\n}\n\nconst LinkEditor = ( { value, onChangeInputValue, onKeyDown, submitLink, autocompleteRef } ) => (\n\t// Disable reason: KeyPress must be suppressed so the block doesn't hide the toolbar\n\t/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */\n\t<form\n\t\tclassName=\"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content\"\n\t\tonKeyPress={ stopKeyPropagation }\n\t\tonKeyDown={ onKeyDown }\n\t\tonSubmit={ submitLink }\n\t>\n\t\t<URLInput\n\t\t\tvalue={ value }\n\t\t\tonChange={ onChangeInputValue }\n\t\t\tautocompleteRef={ autocompleteRef }\n\t\t/>\n\t\t<IconButton icon=\"editor-break\" label={ __( 'Insert Pretty Link' ) } type=\"submit\" />\n\t</form>\n\t/* eslint-enable jsx-a11y/no-noninteractive-element-interactions */\n);\n\nconst LinkViewerUrl = ( { url } ) => {\n\tconst prependedURL = prependHTTP( url );\n\tconst linkClassName = classnames( 'editor-format-toolbar__link-container-value block-editor-format-toolbar__link-container-value', {\n\t\t'has-invalid-link': ! isValidHref( prependedURL ),\n\t} );\n\n\tif ( ! url ) {\n\t\treturn <span className={ linkClassName }></span>;\n\t}\n\n\treturn (\n\t\t<ExternalLink\n\t\t\tclassName={ linkClassName }\n\t\t\thref={ url }\n\t\t>\n\t\t\t{ filterURLForDisplay( safeDecodeURI( url ) ) }\n\t\t</ExternalLink>\n\t);\n};\n\nconst URLPopoverAtLink = ( { isActive, addingLink, value, ...props } ) => {\n\tconst anchorRect = useMemo( () => {\n\t\tconst selection = window.getSelection();\n\t\tconst range = selection.rangeCount > 0 ? selection.getRangeAt( 0 ) : null;\n\t\tif ( ! range ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( addingLink ) {\n\t\t\treturn getRectangleFromRange( range );\n\t\t}\n\n\t\tlet element = range.startContainer;\n\n\t\t// If the caret is right before the element, select the next element.\n\t\telement = element.nextElementSibling || element;\n\n\t\twhile ( element.nodeType !== window.Node.ELEMENT_NODE ) {\n\t\t\telement = element.parentNode;\n\t\t}\n\n\t\tconst closest = element.closest( 'a' );\n\t\tif ( closest ) {\n\t\t\treturn closest.getBoundingClientRect();\n\t\t}\n\t}, [ isActive, addingLink, value.start, value.end ] );\n\n\tif ( ! anchorRect ) {\n\t\treturn null;\n\t}\n\n\treturn <URLPopover anchorRect={ anchorRect } { ...props } />;\n};\n\nconst LinkViewer = ( { url, editLink } ) => {\n\treturn (\n\t\t// Disable reason: KeyPress must be suppressed so the block doesn't hide the toolbar\n\t\t/* eslint-disable jsx-a11y/no-static-element-interactions */\n\t\t<div\n\t\t\tclassName=\"editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content\"\n\t\t\tonKeyPress={ stopKeyPropagation }\n\t\t>\n\t\t\t<LinkViewerUrl url={ url } />\n\t\t\t<IconButton icon=\"edit\" label={ __( 'Edit' ) } onClick={ editLink } />\n\t\t</div>\n\t\t/* eslint-enable jsx-a11y/no-static-element-interactions */\n\t);\n};\n\nconst createNewPrettyLink = (target, slug) => {\n\treturn new Promise((resolve, reject) => {\n\t\tjQuery.post(\n\t\t\tajaxurl, \n\t\t\t{\n\t\t\t\taction: 'prli_create_pretty_link',\n\t\t\t\ttarget: target,\n\t\t\t\tslug: slug,\n\t\t\t\tredirect: '',\n\t\t\t\tnofollow: 1,\n\t\t\t\ttracking: 1\n\t\t\t}, \n\t\t\t(data, textStatus, xhr) => {\n\t\t\t\t'true' === data ? resolve(data) : reject(data);\n\t\t\t}\n\t \t).fail(error => {\n\t \t\treject(error);\n\t \t});\n\t});\n}\n\nclass InlineLinkUI extends Component {\n\tconstructor() {\n\t\tsuper( ...arguments );\n\n\t\tthis.editLink = this.editLink.bind( this );\n\t\tthis.submitLink = this.submitLink.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\t\tthis.onChangeInputValue = this.onChangeInputValue.bind( this );\n\t\tthis.setLinkTarget = this.setLinkTarget.bind( this );\n\t\tthis.onClickOutside = this.onClickOutside.bind( this );\n\t\tthis.resetState = this.resetState.bind( this );\n\t\tthis.autocompleteRef = createRef();\n\n\t\tthis.state = {\n\t\t\topensInNewWindow: false,\n\t\t\tinputValue: '',\n\t\t\tnewLinkUrl: '',\n\t\t\tnewLinkSlug: '',\n\t\t\tcreatingLink: false,\n\t\t\tcreatedLink: false,\n\t\t\tcreatedLinkError: false\n\t\t};\n\t}\n\n\tstatic getDerivedStateFromProps( props, state ) {\n\t\tconst { activeAttributes: { url, target } } = props;\n\t\tconst opensInNewWindow = target === '_blank';\n\n\t\tif ( ! isShowingInput( props, state ) ) {\n\t\t\tif ( url !== state.inputValue ) {\n\t\t\t\treturn { inputValue: url };\n\t\t\t}\n\n\t\t\tif ( opensInNewWindow !== state.opensInNewWindow ) {\n\t\t\t\treturn { opensInNewWindow };\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tonKeyDown( event ) {\n\t\tif ( [ LEFT, DOWN, RIGHT, UP, BACKSPACE, ENTER ].indexOf( event.keyCode ) > -1 ) {\n\t\t\t// Stop the key event from propagating up to ObserveTyping.startTypingInTextField.\n\t\t\tevent.stopPropagation();\n\t\t}\n\t}\n\n\tonChangeInputValue( inputValue ) {\n\t\tthis.setState( { inputValue } );\n\t}\n\n\tsetLinkTarget( opensInNewWindow ) {\n\t\tconst { activeAttributes: { url = '' }, value, onChange } = this.props;\n\n\t\tthis.setState( { opensInNewWindow } );\n\n\t\t// Apply now if URL is not being edited.\n\t\tif ( ! isShowingInput( this.props, this.state ) ) {\n\t\t\tconst selectedText = getTextContent( slice( value ) );\n\n\t\t\tonChange( applyFormat( value, createLinkFormat( {\n\t\t\t\turl,\n\t\t\t\topensInNewWindow,\n\t\t\t\ttext: selectedText,\n\t\t\t} ) ) );\n\t\t}\n\t}\n\n\teditLink( event ) {\n\t\tthis.setState( { editLink: true } );\n\t\tevent.preventDefault();\n\t}\n\n\tsubmitLink( event ) {\n\t\tconst { isActive, value, onChange, speak } = this.props;\n\t\tconst { inputValue, opensInNewWindow } = this.state;\n\t\tconst url = prependHTTP( inputValue );\n\t\tconst selectedText = getTextContent( slice( value ) );\n\t\tconst format = createLinkFormat( {\n\t\t\turl,\n\t\t\topensInNewWindow,\n\t\t\ttext: selectedText,\n\t\t} );\n\n\t\tevent.preventDefault();\n\n\t\tif ( isCollapsed( value ) && ! isActive ) {\n\t\t\tconst toInsert = applyFormat( create( { text: url } ), format, 0, url.length );\n\t\t\tonChange( insert( value, toInsert ) );\n\t\t} else {\n\t\t\tonChange( applyFormat( value, format ) );\n\t\t}\n\n\t\tthis.resetState();\n\n\t\tif ( ! isValidHref( url ) ) {\n\t\t\tspeak( __( 'Warning: the link has been inserted but may have errors. Please test it.' ), 'assertive' );\n\t\t} else if ( isActive ) {\n\t\t\tspeak( __( 'Link edited.' ), 'assertive' );\n\t\t} else {\n\t\t\tspeak( __( 'Link inserted.' ), 'assertive' );\n\t\t}\n\t}\n\n\tonClickOutside( event ) {\n\t\t// The autocomplete suggestions list renders in a separate popover (in a portal),\n\t\t// so onClickOutside fails to detect that a click on a suggestion occurred in the\n\t\t// LinkContainer. Detect clicks on autocomplete suggestions using a ref here, and\n\t\t// return to avoid the popover being closed.\n\t\tconst autocompleteElement = this.autocompleteRef.current;\n\t\tif ( autocompleteElement && autocompleteElement.contains( event.target ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.resetState();\n\t}\n\n\tresetState() {\n\t\tthis.props.stopAddingLink();\n\t\tthis.setState( { editLink: false } );\n\t}\n\n\trender() {\n\t\tconst { isActive, activeAttributes: { url }, addingLink, value } = this.props;\n\n\t\tif ( ! isActive && ! addingLink ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst { inputValue, opensInNewWindow, newLinkUrl, newLinkSlug, creatingLink, createdLink, createdLinkError } = this.state;\n\t\tconst showInput = isShowingInput( this.props, this.state );\n\n\t\treturn (\n\t\t\t<URLPopoverAtLink\n\t\t\t\tclassName=\"pretty-link-inserter\"\n\t\t\t\tvalue={ value }\n\t\t\t\tisActive={ isActive }\n\t\t\t\taddingLink={ addingLink }\n\t\t\t\tonClickOutside={ this.onClickOutside }\n\t\t\t\tonClose={ this.resetState }\n\t\t\t\tfocusOnMount={ showInput ? 'firstElement' : false }\n\t\t\t\trenderSettings={ () => (\n\t\t\t\t\t<Fragment>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\t\t\tlabel={ __( 'Open in New Tab' ) }\n\t\t\t\t\t\t\t\tchecked={ opensInNewWindow }\n\t\t\t\t\t\t\t\tonChange={ this.setLinkTarget }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"pretty-link-inserter-form-container\">\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcreatedLink && (\n\t\t\t\t\t\t\t\t\t<Notice status=\"success\" onRemove={() => this.setState({createdLink: false})}>\n\t\t\t\t\t\t\t\t <p>{__( 'Pretty Link created successfully.', 'memberpress' )}</p>\n\t\t\t\t\t\t\t\t </Notice>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcreatedLinkError && (\n\t\t\t\t\t\t\t\t\t<Notice status=\"error\" onRemove={() => this.setState({createdLink: false, createdLinkError: false})}>\n\t\t\t\t\t\t\t\t <p>{__( 'Pretty Link could not be created. Please try a slug that is not already used.', 'memberpress' )}</p>\n\t\t\t\t\t\t\t\t </Notice>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t<strong>{__('New Pretty Link', 'pretty-link')}</strong>\n\t\t\t\t\t\t\t<form onSubmit={(event) => {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t// Send request to create new Pretty Link\n\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\tcreatingLink: true,\n\t\t\t\t\t\t\t\t\tcreatedLinkError: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tcreateNewPrettyLink( newLinkUrl, newLinkSlug )\n\t\t\t\t\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\t\t\tcreatedLink: true,\n\t\t\t\t\t\t\t\t\t\t\tcreatingLink: false,\n\t\t\t\t\t\t\t\t\t\t\tinputValue: plEditor.homeUrl + newLinkSlug,\n\t\t\t\t\t\t\t\t\t\t\tnewLinkUrl: '',\n\t\t\t\t\t\t\t\t\t\t\tnewLinkSlug: ''\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\t\t\t\t\tthis.setState({\n\t\t\t\t\t\t\t\t\t\t\tcreatedLink: false,\n\t\t\t\t\t\t\t\t\t\t\tcreatingLink: false,\n\t\t\t\t\t\t\t\t\t\t\tcreatedLinkError: true,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\t\t<TextControl\n\t\t\t\t\t\t\t\t placeholder=\"URL\"\n\t\t\t\t\t\t\t\t className=\"pretty-link-new-link-url\"\n\t\t\t\t\t\t\t\t value={newLinkUrl}\n\t\t\t\t\t\t\t\t onChange={ ( newLinkUrl ) => {\n\t\t\t\t\t\t\t\t \tthis.setState( { newLinkUrl } );\n\t\t\t\t\t\t\t\t } }\n\t\t\t\t\t\t\t\t />\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t \t<p>\n\t\t\t\t \t\t\t\t<TextControl\n\t\t\t\t \t\t\t placeholder=\"Slug\"\n\t\t\t\t \t\t\t className=\"pretty-link-new-link-slug\"\n\t\t\t\t \t\t\t value={newLinkSlug}\n\t\t\t\t \t\t\t onChange={ ( newLinkSlug ) => {\n\t\t\t\t \t\t\t \tthis.setState( { newLinkSlug } );\n\t\t\t\t \t\t\t } }\n\t\t\t\t \t\t\t />\n\t\t\t\t\t\t \t</p>\n\t\t\t\t\t\t \t<p>\n\t\t\t\t\t\t \t\t<button \n\t\t\t\t\t\t \t\t\tclassName=\"pretty-link-submit-new-link components-button is-button is-primary\"\n\t\t\t\t\t\t \t\t\tonClick={ () => {\n\t\t\t\t\t\t \t\t\t\tconsole.log('Creating new Pretty Link...');\n\t\t\t\t\t\t \t\t\t} }\n\t\t\t\t\t\t \t\t>\n\t\t\t\t\t\t \t\t\t{ __( 'Create New Pretty Link', 'pretty-link' ) }\n\t\t\t\t\t\t \t\t</button>\n\t\t\t\t\t\t \t\t{\n\t\t\t\t\t\t \t\t\tcreatingLink && (\n\t\t\t\t\t\t \t\t\t\t<Spinner />\n\t\t\t\t\t\t \t\t\t)\n\t\t\t\t\t\t \t\t}\n\t\t\t\t\t\t \t</p>\n\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Fragment>\n\t\t\t\t) }\n\t\t\t>\n\t\t\t\t{ showInput ? (\n\t\t\t\t\t<LinkEditor\n\t\t\t\t\t\tvalue={ inputValue }\n\t\t\t\t\t\tonChangeInputValue={ this.onChangeInputValue }\n\t\t\t\t\t\tonKeyDown={ this.onKeyDown }\n\t\t\t\t\t\tsubmitLink={ this.submitLink }\n\t\t\t\t\t\tautocompleteRef={ this.autocompleteRef }\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<LinkViewer\n\t\t\t\t\t\turl={ url }\n\t\t\t\t\t\teditLink={ this.editLink }\n\t\t\t\t\t/>\n\t\t\t\t) }\n\t\t\t</URLPopoverAtLink>\n\t\t);\n\t}\n}\n\nexport default withSpokenMessages( InlineLinkUI );\n","\nvar content = require(\"!!../../../../node_modules/postcss-loader/src/index.js??ref--6-1!../../../../node_modules/sass-loader/lib/loader.js!./style.scss\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../../node_modules/postcss-loader/src/index.js??ref--6-1!../../../../node_modules/sass-loader/lib/loader.js!./style.scss\", function() {\n\t\tvar newContent = require(\"!!../../../../node_modules/postcss-loader/src/index.js??ref--6-1!../../../../node_modules/sass-loader/lib/loader.js!./style.scss\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","/**\n * External dependencies\n */\nimport { startsWith } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tgetProtocol,\n\tisValidProtocol,\n\tgetAuthority,\n\tisValidAuthority,\n\tgetPath,\n\tisValidPath,\n\tgetQueryString,\n\tisValidQueryString,\n\tgetFragment,\n\tisValidFragment,\n} from '@wordpress/url';\nimport { __, sprintf } from '@wordpress/i18n';\n\n/**\n * Check for issues with the provided href.\n *\n * @param {string} href The href.\n *\n * @return {boolean} Is the href invalid?\n */\nexport function isValidHref( href ) {\n\tif ( ! href ) {\n\t\treturn false;\n\t}\n\n\tconst trimmedHref = href.trim();\n\n\tif ( ! trimmedHref ) {\n\t\treturn false;\n\t}\n\n\t// Does the href start with something that looks like a URL protocol?\n\tif ( /^\\S+:/.test( trimmedHref ) ) {\n\t\tconst protocol = getProtocol( trimmedHref );\n\t\tif ( ! isValidProtocol( protocol ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Add some extra checks for http(s) URIs, since these are the most common use-case.\n\t\t// This ensures URIs with an http protocol have exactly two forward slashes following the protocol.\n\t\tif ( startsWith( protocol, 'http' ) && ! /^https?:\\/\\/[^\\/\\s]/i.test( trimmedHref ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst authority = getAuthority( trimmedHref );\n\t\tif ( ! isValidAuthority( authority ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst path = getPath( trimmedHref );\n\t\tif ( path && ! isValidPath( path ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst queryString = getQueryString( trimmedHref );\n\t\tif ( queryString && ! isValidQueryString( queryString ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst fragment = getFragment( trimmedHref );\n\t\tif ( fragment && ! isValidFragment( fragment ) ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Validate anchor links.\n\tif ( startsWith( trimmedHref, '#' ) && ! isValidFragment( trimmedHref ) ) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Generates the format object that will be applied to the link text.\n *\n * @param {string} url The href of the link.\n * @param {boolean} opensInNewWindow Whether this link will open in a new window.\n * @param {Object} text The text that is being hyperlinked.\n *\n * @return {Object} The final format object.\n */\nexport function createLinkFormat( { url, opensInNewWindow, text } ) {\n\tconst format = {\n\t\ttype: 'core/link',\n\t\tattributes: {\n\t\t\turl,\n\t\t},\n\t};\n\n\tif ( opensInNewWindow ) {\n\t\t// translators: accessibility label for external links, where the argument is the link text\n\t\tconst label = sprintf( __( '%s (opens in a new tab)' ), text );\n\n\t\tformat.attributes.target = '_blank';\n\t\tformat.attributes.rel = 'noreferrer noopener';\n\t\tformat.attributes[ 'aria-label' ] = label;\n\t}\n\n\treturn format;\n}\n","/**\n * External dependencies\n */\nimport { throttle, map, pick, defaultTo } from 'lodash';\nimport classnames from 'classnames';\nimport scrollIntoView from 'dom-scroll-into-view';\n\n/**\n * WordPress dependencies\n */\nimport { __, sprintf, _n } from '@wordpress/i18n';\nimport { Component, createRef } from '@wordpress/element';\nimport { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';\nimport { Spinner, withSpokenMessages, Popover } from '@wordpress/components';\nimport { withInstanceId, withSafeTimeout, compose } from '@wordpress/compose';\nimport { withSelect } from '@wordpress/data';\nimport apiFetch from '@wordpress/api-fetch';\nimport { addQueryArgs } from '@wordpress/url';\nimport { decodeEntities } from '@wordpress/html-entities';\n\n// Since URLInput is rendered in the context of other inputs, but should be\n// considered a separate modal node, prevent keyboard events from propagating\n// as being considered from the input.\nconst stopEventPropagation = ( event ) => event.stopPropagation();\n\nconst fetchLinkSuggestions = async ( search ) => {\n\n\tconst links = await apiFetch( {\n\t\turl: addQueryArgs( ajaxurl, {\n\t\t\taction: 'prli_search_for_links',\n\t\t\tterm: search,\n\t\t} ),\n\t} );\n\n\treturn map( links, ( link ) => ( {\n\t\turl: plEditor.homeUrl + link.slug,\n\t\ttitle: decodeEntities( link.value ) + ' (' + decodeEntities( link.slug ) + ')' || __( '(no title)' ),\n\t} ) );\n};\n\nclass URLInput extends Component {\n\tconstructor( { autocompleteRef } ) {\n\t\tsuper( ...arguments );\n\n\t\tthis.onChange = this.onChange.bind( this );\n\t\tthis.onKeyDown = this.onKeyDown.bind( this );\n\t\tthis.autocompleteRef = autocompleteRef || createRef();\n\t\tthis.inputRef = createRef();\n\t\tthis.updateSuggestions = throttle( this.updateSuggestions.bind( this ), 200 );\n\n\t\tthis.suggestionNodes = [];\n\n\t\tthis.state = {\n\t\t\tsuggestions: [],\n\t\t\tshowSuggestions: false,\n\t\t\tselectedSuggestion: null,\n\t\t};\n\t}\n\n\tcomponentDidUpdate() {\n\t\tconst { showSuggestions, selectedSuggestion } = this.state;\n\t\t// only have to worry about scrolling selected suggestion into view\n\t\t// when already expanded\n\t\tif ( showSuggestions && selectedSuggestion !== null && ! this.scrollingIntoView ) {\n\t\t\tthis.scrollingIntoView = true;\n\t\t\tscrollIntoView( this.suggestionNodes[ selectedSuggestion ], this.autocompleteRef.current, {\n\t\t\t\tonlyScrollIfNeeded: true,\n\t\t\t} );\n\n\t\t\tthis.props.setTimeout( () => {\n\t\t\t\tthis.scrollingIntoView = false;\n\t\t\t}, 100 );\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tdelete this.suggestionsRequest;\n\t}\n\n\tbindSuggestionNode( index ) {\n\t\treturn ( ref ) => {\n\t\t\tthis.suggestionNodes[ index ] = ref;\n\t\t};\n\t}\n\n\tupdateSuggestions( value ) {\n\n\t\t// Show the suggestions after typing at least 2 characters\n\t\t// and also for URLs\n\t\tif ( value.length < 2 || /^https?:/.test( value ) ) {\n\t\t\tthis.setState( {\n\t\t\t\tshowSuggestions: false,\n\t\t\t\tselectedSuggestion: null,\n\t\t\t\tloading: false,\n\t\t\t} );\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState( {\n\t\t\tshowSuggestions: true,\n\t\t\tselectedSuggestion: null,\n\t\t\tloading: true,\n\t\t} );\n\n\t\tconst request = fetchLinkSuggestions( value );\n\n\t\trequest.then( ( suggestions ) => {\n\t\t\t// A fetch Promise doesn't have an abort option. It's mimicked by\n\t\t\t// comparing the request reference in on the instance, which is\n\t\t\t// reset or deleted on subsequent requests or unmounting.\n\t\t\tif ( this.suggestionsRequest !== request ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setState( {\n\t\t\t\tsuggestions,\n\t\t\t\tloading: false,\n\t\t\t} );\n\n\t\t\tif ( !! suggestions.length ) {\n\t\t\t\tthis.props.debouncedSpeak( sprintf( _n(\n\t\t\t\t\t'%d result found, use up and down arrow keys to navigate.',\n\t\t\t\t\t'%d results found, use up and down arrow keys to navigate.',\n\t\t\t\t\tsuggestions.length\n\t\t\t\t), suggestions.length ), 'assertive' );\n\t\t\t} else {\n\t\t\t\tthis.props.debouncedSpeak( __( 'No results.' ), 'assertive' );\n\t\t\t}\n\t\t} ).catch( () => {\n\t\t\tif ( this.suggestionsRequest === request ) {\n\t\t\t\tthis.setState( {\n\t\t\t\t\tloading: false,\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\tthis.suggestionsRequest = request;\n\t}\n\n\tonChange( event ) {\n\t\tconst inputValue = event.target.value;\n\t\tthis.props.onChange( inputValue );\n\t\tthis.updateSuggestions( inputValue );\n\t}\n\n\tonKeyDown( event ) {\n\t\tconst { showSuggestions, selectedSuggestion, suggestions, loading } = this.state;\n\t\t// If the suggestions are not shown or loading, we shouldn't handle the arrow keys\n\t\t// We shouldn't preventDefault to allow block arrow keys navigation\n\t\tif ( ! showSuggestions || ! suggestions.length || loading ) {\n\t\t\t// In the Windows version of Firefox the up and down arrows don't move the caret\n\t\t\t// within an input field like they do for Mac Firefox/Chrome/Safari. This causes\n\t\t\t// a form of focus trapping that is disruptive to the user experience. This disruption\n\t\t\t// only happens if the caret is not in the first or last position in the text input.\n\t\t\t// See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\t// When UP is pressed, if the caret is at the start of the text, move it to the 0\n\t\t\t\t// position.\n\t\t\t\tcase UP: {\n\t\t\t\t\tif ( 0 !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to position 0\n\t\t\t\t\t\tevent.target.setSelectionRange( 0, 0 );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// When DOWN is pressed, if the caret is not at the end of the text, move it to the\n\t\t\t\t// last position.\n\t\t\t\tcase DOWN: {\n\t\t\t\t\tif ( this.props.value.length !== event.target.selectionStart ) {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Set the input caret to the last position\n\t\t\t\t\t\tevent.target.setSelectionRange( this.props.value.length, this.props.value.length );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst suggestion = this.state.suggestions[ this.state.selectedSuggestion ];\n\n\t\tswitch ( event.keyCode ) {\n\t\t\tcase UP: {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst previousIndex = ! selectedSuggestion ? suggestions.length - 1 : selectedSuggestion - 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: previousIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase DOWN: {\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tevent.preventDefault();\n\t\t\t\tconst nextIndex = selectedSuggestion === null || ( selectedSuggestion === suggestions.length - 1 ) ? 0 : selectedSuggestion + 1;\n\t\t\t\tthis.setState( {\n\t\t\t\t\tselectedSuggestion: nextIndex,\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase TAB: {\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tthis.selectLink( suggestion );\n\t\t\t\t\t// Announce a link has been selected when tabbing away from the input field.\n\t\t\t\t\tthis.props.speak( __( 'Link selected.' ) );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ENTER: {\n\t\t\t\tif ( this.state.selectedSuggestion !== null ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tthis.selectLink( suggestion );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tselectLink( suggestion ) {\n\t\tthis.props.onChange( suggestion.url, suggestion );\n\t\tthis.setState( {\n\t\t\tselectedSuggestion: null,\n\t\t\tshowSuggestions: false,\n\t\t} );\n\t}\n\n\thandleOnClick( suggestion ) {\n\t\tthis.selectLink( suggestion );\n\t\t// Move focus to the input field when a link suggestion is clicked.\n\t\tthis.inputRef.current.focus();\n\t}\n\n\trender() {\n\t\tconst { value = '', autoFocus = true, instanceId, className } = this.props;\n\t\tconst { showSuggestions, suggestions, selectedSuggestion, loading } = this.state;\n\n\t\tconst suggestionsListboxId = `block-editor-url-input-suggestions-${ instanceId }`;\n\t\tconst suggestionOptionIdPrefix = `block-editor-url-input-suggestion-${ instanceId }`;\n\n\t\t/* eslint-disable jsx-a11y/no-autofocus */\n\t\treturn (\n\t\t\t<div className={ classnames( 'editor-url-input block-editor-url-input', className ) }>\n\t\t\t\t<input\n\t\t\t\t\tautoFocus={ autoFocus }\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\taria-label={ __( 'URL' ) }\n\t\t\t\t\trequired\n\t\t\t\t\tvalue={ value }\n\t\t\t\t\tonChange={ this.onChange }\n\t\t\t\t\tonInput={ stopEventPropagation }\n\t\t\t\t\tplaceholder={ __( 'Paste or type to search for your Pretty Link' ) }\n\t\t\t\t\tonKeyDown={ this.onKeyDown }\n\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\taria-expanded={ showSuggestions }\n\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\taria-owns={ suggestionsListboxId }\n\t\t\t\t\taria-activedescendant={ selectedSuggestion !== null ? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }` : undefined }\n\t\t\t\t\tref={ this.inputRef }\n\t\t\t\t/>\n\n\t\t\t\t{ ( loading ) && <Spinner /> }\n\n\t\t\t\t{ showSuggestions && !! suggestions.length &&\n\t\t\t\t\t<Popover position=\"bottom\" noArrow focusOnMount={ false }>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"editor-url-input__suggestions block-editor-url-input__suggestions\"\n\t\t\t\t\t\t\tid={ suggestionsListboxId }\n\t\t\t\t\t\t\tref={ this.autocompleteRef }\n\t\t\t\t\t\t\trole=\"listbox\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ suggestions.map( ( suggestion, index ) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={ suggestion.id }\n\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\ttabIndex=\"-1\"\n\t\t\t\t\t\t\t\t\tid={ `${ suggestionOptionIdPrefix }-${ index }` }\n\t\t\t\t\t\t\t\t\tref={ this.bindSuggestionNode( index ) }\n\t\t\t\t\t\t\t\t\tclassName={ classnames( 'editor-url-input__suggestion block-editor-url-input__suggestion', {\n\t\t\t\t\t\t\t\t\t\t'is-selected': index === selectedSuggestion,\n\t\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t\tonClick={ () => this.handleOnClick( suggestion ) }\n\t\t\t\t\t\t\t\t\taria-selected={ index === selectedSuggestion }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ suggestion.title }\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</Popover>\n\t\t\t\t}\n\t\t\t</div>\n\t\t);\n\t\t/* eslint-enable jsx-a11y/no-autofocus */\n\t}\n}\n\n/**\n * @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/url-input/README.md\n */\nexport default compose(\n\twithSafeTimeout,\n\twithSpokenMessages,\n\twithInstanceId,\n\twithSelect( ( select ) => {\n\t\tconst { getSettings } = select( 'core/block-editor' );\n\t\treturn {\n\t\t\tfetchLinkSuggestions: getSettings().__experimentalFetchLinkSuggestions,\n\t\t};\n\t} )\n)( URLInput );\n","/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { withSpokenMessages } from '@wordpress/components';\nimport { Component, Fragment } from '@wordpress/element';\nimport {\n getTextContent,\n applyFormat,\n removeFormat,\n slice,\n registerFormatType\n} from '@wordpress/rich-text';\nimport { isURL, isEmail } from '@wordpress/url';\nimport { RichTextToolbarButton, RichTextShortcut } from '@wordpress/block-editor';\nimport InlineLinkUI from '../../components/link-editor';\n\n/**\n * Block constants\n */\nconst name = 'pretty-link/pretty-link';\nconst title = __( 'Pretty Link' );\n\nexport const prettyLink = {\n name,\n title,\n tagName: 'a',\n className: 'pretty-link',\n attributes: {\n url: 'href',\n target: 'target'\n },\n edit: withSpokenMessages( class LinkEdit extends Component {\n constructor() {\n super( ...arguments );\n\n this.addLink = this.addLink.bind( this );\n this.stopAddingLink = this.stopAddingLink.bind( this );\n this.onRemoveFormat = this.onRemoveFormat.bind( this );\n this.state = {\n addingLink: false,\n };\n }\n\n addLink() {\n const { value, onChange } = this.props;\n const text = getTextContent( slice( value ) );\n\n if ( text && isURL( text ) ) {\n onChange( applyFormat( value, { type: name, attributes: { url: text } } ) );\n } else {\n this.setState( { addingLink: true } );\n }\n }\n\n stopAddingLink() {\n this.setState( { addingLink: false } );\n }\n\n onRemoveFormat() {\n const { value, onChange, speak } = this.props;\n\n onChange( removeFormat( value, name ) );\n speak( __( 'Link removed.' ), 'assertive' );\n }\n\n render() {\n const { isActive, activeAttributes, value, onChange } = this.props;\n\n return (\n <>\n <RichTextShortcut\n type=\"primary\"\n character=\"k\"\n onUse={ this.addLink }\n />\n <RichTextShortcut\n type=\"primaryShift\"\n character=\"k\"\n onUse={ this.onRemoveFormat }\n />\n { isActive && <RichTextToolbarButton\n icon=\"star-filled\"\n title={ __( 'Unlink' ) }\n onClick={ this.onRemoveFormat }\n isActive={ isActive }\n shortcutType=\"primaryShift\"\n shortcutCharacter=\"k\"\n /> }\n { ! isActive && <RichTextToolbarButton\n icon=\"star-filled\"\n title={ title }\n onClick={ this.addLink }\n isActive={ isActive }\n shortcutType=\"primary\"\n shortcutCharacter=\"k\"\n /> }\n <InlineLinkUI\n addingLink={ this.state.addingLink }\n stopAddingLink={ this.stopAddingLink }\n isActive={ isActive }\n activeAttributes={ activeAttributes }\n value={ value }\n onChange={ onChange }\n />\n </>\n );\n }\n } ),\n \n};\n\nfunction registerFormats () {\n [\n prettyLink,\n ].forEach( ( { name, ...settings } ) => registerFormatType( name, settings ) );\n};\nregisterFormats();","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n\nmodule.exports = _assertThisInitialized;","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}\n\nmodule.exports = _asyncToGenerator;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","function _getPrototypeOf(o) {\n module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","var objectWithoutPropertiesLoose = require(\"./objectWithoutPropertiesLoose\");\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutProperties;","function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;","var _typeof = require(\"../helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","function _typeof2(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof2(obj); }\n\nfunction _typeof(obj) {\n if (typeof Symbol === \"function\" && _typeof2(Symbol.iterator) === \"symbol\") {\n module.exports = _typeof = function _typeof(obj) {\n return _typeof2(obj);\n };\n } else {\n module.exports = _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : _typeof2(obj);\n };\n }\n\n return _typeof(obj);\n}\n\nmodule.exports = _typeof;","/*!\n Copyright (c) 2017 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","'use strict';\n\nvar util = require('./util');\n\nfunction scrollIntoView(elem, container, config) {\n config = config || {};\n // document 归一化到 window\n if (container.nodeType === 9) {\n container = util.getWindow(container);\n }\n\n var allowHorizontalScroll = config.allowHorizontalScroll;\n var onlyScrollIfNeeded = config.onlyScrollIfNeeded;\n var alignWithTop = config.alignWithTop;\n var alignWithLeft = config.alignWithLeft;\n var offsetTop = config.offsetTop || 0;\n var offsetLeft = config.offsetLeft || 0;\n var offsetBottom = config.offsetBottom || 0;\n var offsetRight = config.offsetRight || 0;\n\n allowHorizontalScroll = allowHorizontalScroll === undefined ? true : allowHorizontalScroll;\n\n var isWin = util.isWindow(container);\n var elemOffset = util.offset(elem);\n var eh = util.outerHeight(elem);\n var ew = util.outerWidth(elem);\n var containerOffset = undefined;\n var ch = undefined;\n var cw = undefined;\n var containerScroll = undefined;\n var diffTop = undefined;\n var diffBottom = undefined;\n var win = undefined;\n var winScroll = undefined;\n var ww = undefined;\n var wh = undefined;\n\n if (isWin) {\n win = container;\n wh = util.height(win);\n ww = util.width(win);\n winScroll = {\n left: util.scrollLeft(win),\n top: util.scrollTop(win)\n };\n // elem 相对 container 可视视窗的距离\n diffTop = {\n left: elemOffset.left - winScroll.left - offsetLeft,\n top: elemOffset.top - winScroll.top - offsetTop\n };\n diffBottom = {\n left: elemOffset.left + ew - (winScroll.left + ww) + offsetRight,\n top: elemOffset.top + eh - (winScroll.top + wh) + offsetBottom\n };\n containerScroll = winScroll;\n } else {\n containerOffset = util.offset(container);\n ch = container.clientHeight;\n cw = container.clientWidth;\n containerScroll = {\n left: container.scrollLeft,\n top: container.scrollTop\n };\n // elem 相对 container 可视视窗的距离\n // 注意边框, offset 是边框到根节点\n diffTop = {\n left: elemOffset.left - (containerOffset.left + (parseFloat(util.css(container, 'borderLeftWidth')) || 0)) - offsetLeft,\n top: elemOffset.top - (containerOffset.top + (parseFloat(util.css(container, 'borderTopWidth')) || 0)) - offsetTop\n };\n diffBottom = {\n left: elemOffset.left + ew - (containerOffset.left + cw + (parseFloat(util.css(container, 'borderRightWidth')) || 0)) + offsetRight,\n top: elemOffset.top + eh - (containerOffset.top + ch + (parseFloat(util.css(container, 'borderBottomWidth')) || 0)) + offsetBottom\n };\n }\n\n if (diffTop.top < 0 || diffBottom.top > 0) {\n // 强制向上\n if (alignWithTop === true) {\n util.scrollTop(container, containerScroll.top + diffTop.top);\n } else if (alignWithTop === false) {\n util.scrollTop(container, containerScroll.top + diffBottom.top);\n } else {\n // 自动调整\n if (diffTop.top < 0) {\n util.scrollTop(container, containerScroll.top + diffTop.top);\n } else {\n util.scrollTop(container, containerScroll.top + diffBottom.top);\n }\n }\n } else {\n if (!onlyScrollIfNeeded) {\n alignWithTop = alignWithTop === undefined ? true : !!alignWithTop;\n if (alignWithTop) {\n util.scrollTop(container, containerScroll.top + diffTop.top);\n } else {\n util.scrollTop(container, containerScroll.top + diffBottom.top);\n }\n }\n }\n\n if (allowHorizontalScroll) {\n if (diffTop.left < 0 || diffBottom.left > 0) {\n // 强制向上\n if (alignWithLeft === true) {\n util.scrollLeft(container, containerScroll.left + diffTop.left);\n } else if (alignWithLeft === false) {\n util.scrollLeft(container, containerScroll.left + diffBottom.left);\n } else {\n // 自动调整\n if (diffTop.left < 0) {\n util.scrollLeft(container, containerScroll.left + diffTop.left);\n } else {\n util.scrollLeft(container, containerScroll.left + diffBottom.left);\n }\n }\n } else {\n if (!onlyScrollIfNeeded) {\n alignWithLeft = alignWithLeft === undefined ? true : !!alignWithLeft;\n if (alignWithLeft) {\n util.scrollLeft(container, containerScroll.left + diffTop.left);\n } else {\n util.scrollLeft(container, containerScroll.left + diffBottom.left);\n }\n }\n }\n }\n}\n\nmodule.exports = scrollIntoView;","'use strict';\n\nmodule.exports = require('./dom-scroll-into-view');","'use strict';\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar RE_NUM = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source;\n\nfunction getClientPosition(elem) {\n var box = undefined;\n var x = undefined;\n var y = undefined;\n var doc = elem.ownerDocument;\n var body = doc.body;\n var docElem = doc && doc.documentElement;\n // 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式\n box = elem.getBoundingClientRect();\n\n // 注:jQuery 还考虑减去 docElem.clientLeft/clientTop\n // 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确\n // 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin\n\n x = box.left;\n y = box.top;\n\n // In IE, most of the time, 2 extra pixels are added to the top and left\n // due to the implicit 2-pixel inset border. In IE6/7 quirks mode and\n // IE6 standards mode, this border can be overridden by setting the\n // document element's border to zero -- thus, we cannot rely on the\n // offset always being 2 pixels.\n\n // In quirks mode, the offset can be determined by querying the body's\n // clientLeft/clientTop, but in standards mode, it is found by querying\n // the document element's clientLeft/clientTop. Since we already called\n // getClientBoundingRect we have already forced a reflow, so it is not\n // too expensive just to query them all.\n\n // ie 下应该减去窗口的边框吧,毕竟默认 absolute 都是相对窗口定位的\n // 窗口边框标准是设 documentElement ,quirks 时设置 body\n // 最好禁止在 body 和 html 上边框 ,但 ie < 9 html 默认有 2px ,减去\n // 但是非 ie 不可能设置窗口边框,body html 也不是窗口 ,ie 可以通过 html,body 设置\n // 标准 ie 下 docElem.clientTop 就是 border-top\n // ie7 html 即窗口边框改变不了。永远为 2\n // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框,即使设了 border-top 也为 0\n\n x -= docElem.clientLeft || body.clientLeft || 0;\n y -= docElem.clientTop || body.clientTop || 0;\n\n return {\n left: x,\n top: y\n };\n}\n\nfunction getScroll(w, top) {\n var ret = w['page' + (top ? 'Y' : 'X') + 'Offset'];\n var method = 'scroll' + (top ? 'Top' : 'Left');\n if (typeof ret !== 'number') {\n var d = w.document;\n // ie6,7,8 standard mode\n ret = d.documentElement[method];\n if (typeof ret !== 'number') {\n // quirks mode\n ret = d.body[method];\n }\n }\n return ret;\n}\n\nfunction getScrollLeft(w) {\n return getScroll(w);\n}\n\nfunction getScrollTop(w) {\n return getScroll(w, true);\n}\n\nfunction getOffset(el) {\n var pos = getClientPosition(el);\n var doc = el.ownerDocument;\n var w = doc.defaultView || doc.parentWindow;\n pos.left += getScrollLeft(w);\n pos.top += getScrollTop(w);\n return pos;\n}\nfunction _getComputedStyle(elem, name, computedStyle_) {\n var val = '';\n var d = elem.ownerDocument;\n var computedStyle = computedStyle_ || d.defaultView.getComputedStyle(elem, null);\n\n // https://github.com/kissyteam/kissy/issues/61\n if (computedStyle) {\n val = computedStyle.getPropertyValue(name) || computedStyle[name];\n }\n\n return val;\n}\n\nvar _RE_NUM_NO_PX = new RegExp('^(' + RE_NUM + ')(?!px)[a-z%]+$', 'i');\nvar RE_POS = /^(top|right|bottom|left)$/;\nvar CURRENT_STYLE = 'currentStyle';\nvar RUNTIME_STYLE = 'runtimeStyle';\nvar LEFT = 'left';\nvar PX = 'px';\n\nfunction _getComputedStyleIE(elem, name) {\n // currentStyle maybe null\n // http://msdn.microsoft.com/en-us/library/ms535231.aspx\n var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];\n\n // 当 width/height 设置为百分比时,通过 pixelLeft 方式转换的 width/height 值\n // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19\n // 在 ie 下不对,需要直接用 offset 方式\n // borderWidth 等值也有问题,但考虑到 borderWidth 设为百分比的概率很小,这里就不考虑了\n\n // From the awesome hack by Dean Edwards\n // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n // If we're not dealing with a regular pixel number\n // but a number that has a weird ending, we need to convert it to pixels\n // exclude left right for relativity\n if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {\n // Remember the original values\n var style = elem.style;\n var left = style[LEFT];\n var rsLeft = elem[RUNTIME_STYLE][LEFT];\n\n // prevent flashing of content\n elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];\n\n // Put in the new values to get a computed value out\n style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;\n ret = style.pixelLeft + PX;\n\n // Revert the changed values\n style[LEFT] = left;\n\n elem[RUNTIME_STYLE][LEFT] = rsLeft;\n }\n return ret === '' ? 'auto' : ret;\n}\n\nvar getComputedStyleX = undefined;\nif (typeof window !== 'undefined') {\n getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;\n}\n\nfunction each(arr, fn) {\n for (var i = 0; i < arr.length; i++) {\n fn(arr[i]);\n }\n}\n\nfunction isBorderBoxFn(elem) {\n return getComputedStyleX(elem, 'boxSizing') === 'border-box';\n}\n\nvar BOX_MODELS = ['margin', 'border', 'padding'];\nvar CONTENT_INDEX = -1;\nvar PADDING_INDEX = 2;\nvar BORDER_INDEX = 1;\nvar MARGIN_INDEX = 0;\n\nfunction swap(elem, options, callback) {\n var old = {};\n var style = elem.style;\n var name = undefined;\n\n // Remember the old values, and insert the new ones\n for (name in options) {\n if (options.hasOwnProperty(name)) {\n old[name] = style[name];\n style[name] = options[name];\n }\n }\n\n callback.call(elem);\n\n // Revert the old values\n for (name in options) {\n if (options.hasOwnProperty(name)) {\n style[name] = old[name];\n }\n }\n}\n\nfunction getPBMWidth(elem, props, which) {\n var value = 0;\n var prop = undefined;\n var j = undefined;\n var i = undefined;\n for (j = 0; j < props.length; j++) {\n prop = props[j];\n if (prop) {\n for (i = 0; i < which.length; i++) {\n var cssProp = undefined;\n if (prop === 'border') {\n cssProp = prop + which[i] + 'Width';\n } else {\n cssProp = prop + which[i];\n }\n value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;\n }\n }\n }\n return value;\n}\n\n/**\n * A crude way of determining if an object is a window\n * @member util\n */\nfunction isWindow(obj) {\n // must use == for ie8\n /* eslint eqeqeq:0 */\n return obj != null && obj == obj.window;\n}\n\nvar domUtils = {};\n\neach(['Width', 'Height'], function (name) {\n domUtils['doc' + name] = function (refWin) {\n var d = refWin.document;\n return Math.max(\n // firefox chrome documentElement.scrollHeight< body.scrollHeight\n // ie standard mode : documentElement.scrollHeight> body.scrollHeight\n d.documentElement['scroll' + name],\n // quirks : documentElement.scrollHeight 最大等于可视窗口多一点?\n d.body['scroll' + name], domUtils['viewport' + name](d));\n };\n\n domUtils['viewport' + name] = function (win) {\n // pc browser includes scrollbar in window.innerWidth\n var prop = 'client' + name;\n var doc = win.document;\n var body = doc.body;\n var documentElement = doc.documentElement;\n var documentElementProp = documentElement[prop];\n // 标准模式取 documentElement\n // backcompat 取 body\n return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp;\n };\n});\n\n/*\n 得到元素的大小信息\n @param elem\n @param name\n @param {String} [extra] 'padding' : (css width) + padding\n 'border' : (css width) + padding + border\n 'margin' : (css width) + padding + border + margin\n */\nfunction getWH(elem, name, extra) {\n if (isWindow(elem)) {\n return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);\n } else if (elem.nodeType === 9) {\n return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem);\n }\n var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n var borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight;\n var computedStyle = getComputedStyleX(elem);\n var isBorderBox = isBorderBoxFn(elem, computedStyle);\n var cssBoxValue = 0;\n if (borderBoxValue == null || borderBoxValue <= 0) {\n borderBoxValue = undefined;\n // Fall back to computed then un computed css if necessary\n cssBoxValue = getComputedStyleX(elem, name);\n if (cssBoxValue == null || Number(cssBoxValue) < 0) {\n cssBoxValue = elem.style[name] || 0;\n }\n // Normalize '', auto, and prepare for extra\n cssBoxValue = parseFloat(cssBoxValue) || 0;\n }\n if (extra === undefined) {\n extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;\n }\n var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox;\n var val = borderBoxValue || cssBoxValue;\n if (extra === CONTENT_INDEX) {\n if (borderBoxValueOrIsBorderBox) {\n return val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle);\n }\n return cssBoxValue;\n }\n if (borderBoxValueOrIsBorderBox) {\n var padding = extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which, computedStyle) : getPBMWidth(elem, ['margin'], which, computedStyle);\n return val + (extra === BORDER_INDEX ? 0 : padding);\n }\n return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle);\n}\n\nvar cssShow = {\n position: 'absolute',\n visibility: 'hidden',\n display: 'block'\n};\n\n// fix #119 : https://github.com/kissyteam/kissy/issues/119\nfunction getWHIgnoreDisplay(elem) {\n var val = undefined;\n var args = arguments;\n // in case elem is window\n // elem.offsetWidth === undefined\n if (elem.offsetWidth !== 0) {\n val = getWH.apply(undefined, args);\n } else {\n swap(elem, cssShow, function () {\n val = getWH.apply(undefined, args);\n });\n }\n return val;\n}\n\nfunction css(el, name, v) {\n var value = v;\n if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n for (var i in name) {\n if (name.hasOwnProperty(i)) {\n css(el, i, name[i]);\n }\n }\n return undefined;\n }\n if (typeof value !== 'undefined') {\n if (typeof value === 'number') {\n value += 'px';\n }\n el.style[name] = value;\n return undefined;\n }\n return getComputedStyleX(el, name);\n}\n\neach(['width', 'height'], function (name) {\n var first = name.charAt(0).toUpperCase() + name.slice(1);\n domUtils['outer' + first] = function (el, includeMargin) {\n return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX);\n };\n var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n\n domUtils[name] = function (elem, val) {\n if (val !== undefined) {\n if (elem) {\n var computedStyle = getComputedStyleX(elem);\n var isBorderBox = isBorderBoxFn(elem);\n if (isBorderBox) {\n val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle);\n }\n return css(elem, name, val);\n }\n return undefined;\n }\n return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);\n };\n});\n\n// 设置 elem 相对 elem.ownerDocument 的坐标\nfunction setOffset(elem, offset) {\n // set position first, in-case top/left are set even on static elem\n if (css(elem, 'position') === 'static') {\n elem.style.position = 'relative';\n }\n\n var old = getOffset(elem);\n var ret = {};\n var current = undefined;\n var key = undefined;\n\n for (key in offset) {\n if (offset.hasOwnProperty(key)) {\n current = parseFloat(css(elem, key)) || 0;\n ret[key] = current + offset[key] - old[key];\n }\n }\n css(elem, ret);\n}\n\nmodule.exports = _extends({\n getWindow: function getWindow(node) {\n var doc = node.ownerDocument || node;\n return doc.defaultView || doc.parentWindow;\n },\n offset: function offset(el, value) {\n if (typeof value !== 'undefined') {\n setOffset(el, value);\n } else {\n return getOffset(el);\n }\n },\n\n isWindow: isWindow,\n each: each,\n css: css,\n clone: function clone(obj) {\n var ret = {};\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n ret[i] = obj[i];\n }\n }\n var overflow = obj.overflow;\n if (overflow) {\n for (var i in obj) {\n if (obj.hasOwnProperty(i)) {\n ret.overflow[i] = obj.overflow[i];\n }\n }\n }\n return ret;\n },\n scrollLeft: function scrollLeft(w, v) {\n if (isWindow(w)) {\n if (v === undefined) {\n return getScrollLeft(w);\n }\n window.scrollTo(v, getScrollTop(w));\n } else {\n if (v === undefined) {\n return w.scrollLeft;\n }\n w.scrollLeft = v;\n }\n },\n scrollTop: function scrollTop(w, v) {\n if (isWindow(w)) {\n if (v === undefined) {\n return getScrollTop(w);\n }\n window.scrollTo(getScrollLeft(w), v);\n } else {\n if (v === undefined) {\n return w.scrollTop;\n }\n w.scrollTop = v;\n }\n },\n\n viewportWidth: 0,\n viewportHeight: 0\n}, domUtils);","module.exports = \".pretty-link-inserter .block-editor-url-popover__settings {\\n display: block; }\\n\\n.pretty-link-inserter .pretty-link-inserter-form-container {\\n margin-top: 30px; }\\n\"","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n\nvar stylesInDom = {};\n\nvar\tmemoize = function (fn) {\n\tvar memo;\n\n\treturn function () {\n\t\tif (typeof memo === \"undefined\") memo = fn.apply(this, arguments);\n\t\treturn memo;\n\t};\n};\n\nvar isOldIE = memoize(function () {\n\t// Test for IE <= 9 as proposed by Browserhacks\n\t// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n\t// Tests for existence of standard globals is to allow style-loader\n\t// to operate correctly into non-standard environments\n\t// @see https://github.com/webpack-contrib/style-loader/issues/177\n\treturn window && document && document.all && !window.atob;\n});\n\nvar getTarget = function (target, parent) {\n if (parent){\n return parent.querySelector(target);\n }\n return document.querySelector(target);\n};\n\nvar getElement = (function (fn) {\n\tvar memo = {};\n\n\treturn function(target, parent) {\n // If passing function in options, then use it for resolve \"head\" element.\n // Useful for Shadow Root style i.e\n // {\n // insertInto: function () { return document.querySelector(\"#foo\").shadowRoot }\n // }\n if (typeof target === 'function') {\n return target();\n }\n if (typeof memo[target] === \"undefined\") {\n\t\t\tvar styleTarget = getTarget.call(this, target, parent);\n\t\t\t// Special case to return head of iframe instead of iframe itself\n\t\t\tif (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n\t\t\t\ttry {\n\t\t\t\t\t// This will throw an exception if access to iframe is blocked\n\t\t\t\t\t// due to cross-origin restrictions\n\t\t\t\t\tstyleTarget = styleTarget.contentDocument.head;\n\t\t\t\t} catch(e) {\n\t\t\t\t\tstyleTarget = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmemo[target] = styleTarget;\n\t\t}\n\t\treturn memo[target]\n\t};\n})();\n\nvar singleton = null;\nvar\tsingletonCounter = 0;\nvar\tstylesInsertedAtTop = [];\n\nvar\tfixUrls = require(\"./urls\");\n\nmodule.exports = function(list, options) {\n\tif (typeof DEBUG !== \"undefined\" && DEBUG) {\n\t\tif (typeof document !== \"object\") throw new Error(\"The style-loader cannot be used in a non-browser environment\");\n\t}\n\n\toptions = options || {};\n\n\toptions.attrs = typeof options.attrs === \"object\" ? options.attrs : {};\n\n\t// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n\t// tags it will allow on a page\n\tif (!options.singleton && typeof options.singleton !== \"boolean\") options.singleton = isOldIE();\n\n\t// By default, add <style> tags to the <head> element\n if (!options.insertInto) options.insertInto = \"head\";\n\n\t// By default, add <style> tags to the bottom of the target\n\tif (!options.insertAt) options.insertAt = \"bottom\";\n\n\tvar styles = listToStyles(list, options);\n\n\taddStylesToDom(styles, options);\n\n\treturn function update (newList) {\n\t\tvar mayRemove = [];\n\n\t\tfor (var i = 0; i < styles.length; i++) {\n\t\t\tvar item = styles[i];\n\t\t\tvar domStyle = stylesInDom[item.id];\n\n\t\t\tdomStyle.refs--;\n\t\t\tmayRemove.push(domStyle);\n\t\t}\n\n\t\tif(newList) {\n\t\t\tvar newStyles = listToStyles(newList, options);\n\t\t\taddStylesToDom(newStyles, options);\n\t\t}\n\n\t\tfor (var i = 0; i < mayRemove.length; i++) {\n\t\t\tvar domStyle = mayRemove[i];\n\n\t\t\tif(domStyle.refs === 0) {\n\t\t\t\tfor (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();\n\n\t\t\t\tdelete stylesInDom[domStyle.id];\n\t\t\t}\n\t\t}\n\t};\n};\n\nfunction addStylesToDom (styles, options) {\n\tfor (var i = 0; i < styles.length; i++) {\n\t\tvar item = styles[i];\n\t\tvar domStyle = stylesInDom[item.id];\n\n\t\tif(domStyle) {\n\t\t\tdomStyle.refs++;\n\n\t\t\tfor(var j = 0; j < domStyle.parts.length; j++) {\n\t\t\t\tdomStyle.parts[j](item.parts[j]);\n\t\t\t}\n\n\t\t\tfor(; j < item.parts.length; j++) {\n\t\t\t\tdomStyle.parts.push(addStyle(item.parts[j], options));\n\t\t\t}\n\t\t} else {\n\t\t\tvar parts = [];\n\n\t\t\tfor(var j = 0; j < item.parts.length; j++) {\n\t\t\t\tparts.push(addStyle(item.parts[j], options));\n\t\t\t}\n\n\t\t\tstylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};\n\t\t}\n\t}\n}\n\nfunction listToStyles (list, options) {\n\tvar styles = [];\n\tvar newStyles = {};\n\n\tfor (var i = 0; i < list.length; i++) {\n\t\tvar item = list[i];\n\t\tvar id = options.base ? item[0] + options.base : item[0];\n\t\tvar css = item[1];\n\t\tvar media = item[2];\n\t\tvar sourceMap = item[3];\n\t\tvar part = {css: css, media: media, sourceMap: sourceMap};\n\n\t\tif(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});\n\t\telse newStyles[id].parts.push(part);\n\t}\n\n\treturn styles;\n}\n\nfunction insertStyleElement (options, style) {\n\tvar target = getElement(options.insertInto)\n\n\tif (!target) {\n\t\tthrow new Error(\"Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.\");\n\t}\n\n\tvar lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];\n\n\tif (options.insertAt === \"top\") {\n\t\tif (!lastStyleElementInsertedAtTop) {\n\t\t\ttarget.insertBefore(style, target.firstChild);\n\t\t} else if (lastStyleElementInsertedAtTop.nextSibling) {\n\t\t\ttarget.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);\n\t\t} else {\n\t\t\ttarget.appendChild(style);\n\t\t}\n\t\tstylesInsertedAtTop.push(style);\n\t} else if (options.insertAt === \"bottom\") {\n\t\ttarget.appendChild(style);\n\t} else if (typeof options.insertAt === \"object\" && options.insertAt.before) {\n\t\tvar nextSibling = getElement(options.insertAt.before, target);\n\t\ttarget.insertBefore(style, nextSibling);\n\t} else {\n\t\tthrow new Error(\"[Style Loader]\\n\\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\\n Must be 'top', 'bottom', or Object.\\n (https://github.com/webpack-contrib/style-loader#insertat)\\n\");\n\t}\n}\n\nfunction removeStyleElement (style) {\n\tif (style.parentNode === null) return false;\n\tstyle.parentNode.removeChild(style);\n\n\tvar idx = stylesInsertedAtTop.indexOf(style);\n\tif(idx >= 0) {\n\t\tstylesInsertedAtTop.splice(idx, 1);\n\t}\n}\n\nfunction createStyleElement (options) {\n\tvar style = document.createElement(\"style\");\n\n\tif(options.attrs.type === undefined) {\n\t\toptions.attrs.type = \"text/css\";\n\t}\n\n\tif(options.attrs.nonce === undefined) {\n\t\tvar nonce = getNonce();\n\t\tif (nonce) {\n\t\t\toptions.attrs.nonce = nonce;\n\t\t}\n\t}\n\n\taddAttrs(style, options.attrs);\n\tinsertStyleElement(options, style);\n\n\treturn style;\n}\n\nfunction createLinkElement (options) {\n\tvar link = document.createElement(\"link\");\n\n\tif(options.attrs.type === undefined) {\n\t\toptions.attrs.type = \"text/css\";\n\t}\n\toptions.attrs.rel = \"stylesheet\";\n\n\taddAttrs(link, options.attrs);\n\tinsertStyleElement(options, link);\n\n\treturn link;\n}\n\nfunction addAttrs (el, attrs) {\n\tObject.keys(attrs).forEach(function (key) {\n\t\tel.setAttribute(key, attrs[key]);\n\t});\n}\n\nfunction getNonce() {\n\tif (typeof __webpack_nonce__ === 'undefined') {\n\t\treturn null;\n\t}\n\n\treturn __webpack_nonce__;\n}\n\nfunction addStyle (obj, options) {\n\tvar style, update, remove, result;\n\n\t// If a transform function was defined, run it on the css\n\tif (options.transform && obj.css) {\n\t result = typeof options.transform === 'function'\n\t\t ? options.transform(obj.css) \n\t\t : options.transform.default(obj.css);\n\n\t if (result) {\n\t \t// If transform returns a value, use that instead of the original css.\n\t \t// This allows running runtime transformations on the css.\n\t \tobj.css = result;\n\t } else {\n\t \t// If the transform function returns a falsy value, don't add this css.\n\t \t// This allows conditional loading of css\n\t \treturn function() {\n\t \t\t// noop\n\t \t};\n\t }\n\t}\n\n\tif (options.singleton) {\n\t\tvar styleIndex = singletonCounter++;\n\n\t\tstyle = singleton || (singleton = createStyleElement(options));\n\n\t\tupdate = applyToSingletonTag.bind(null, style, styleIndex, false);\n\t\tremove = applyToSingletonTag.bind(null, style, styleIndex, true);\n\n\t} else if (\n\t\tobj.sourceMap &&\n\t\ttypeof URL === \"function\" &&\n\t\ttypeof URL.createObjectURL === \"function\" &&\n\t\ttypeof URL.revokeObjectURL === \"function\" &&\n\t\ttypeof Blob === \"function\" &&\n\t\ttypeof btoa === \"function\"\n\t) {\n\t\tstyle = createLinkElement(options);\n\t\tupdate = updateLink.bind(null, style, options);\n\t\tremove = function () {\n\t\t\tremoveStyleElement(style);\n\n\t\t\tif(style.href) URL.revokeObjectURL(style.href);\n\t\t};\n\t} else {\n\t\tstyle = createStyleElement(options);\n\t\tupdate = applyToTag.bind(null, style);\n\t\tremove = function () {\n\t\t\tremoveStyleElement(style);\n\t\t};\n\t}\n\n\tupdate(obj);\n\n\treturn function updateStyle (newObj) {\n\t\tif (newObj) {\n\t\t\tif (\n\t\t\t\tnewObj.css === obj.css &&\n\t\t\t\tnewObj.media === obj.media &&\n\t\t\t\tnewObj.sourceMap === obj.sourceMap\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tupdate(obj = newObj);\n\t\t} else {\n\t\t\tremove();\n\t\t}\n\t};\n}\n\nvar replaceText = (function () {\n\tvar textStore = [];\n\n\treturn function (index, replacement) {\n\t\ttextStore[index] = replacement;\n\n\t\treturn textStore.filter(Boolean).join('\\n');\n\t};\n})();\n\nfunction applyToSingletonTag (style, index, remove, obj) {\n\tvar css = remove ? \"\" : obj.css;\n\n\tif (style.styleSheet) {\n\t\tstyle.styleSheet.cssText = replaceText(index, css);\n\t} else {\n\t\tvar cssNode = document.createTextNode(css);\n\t\tvar childNodes = style.childNodes;\n\n\t\tif (childNodes[index]) style.removeChild(childNodes[index]);\n\n\t\tif (childNodes.length) {\n\t\t\tstyle.insertBefore(cssNode, childNodes[index]);\n\t\t} else {\n\t\t\tstyle.appendChild(cssNode);\n\t\t}\n\t}\n}\n\nfunction applyToTag (style, obj) {\n\tvar css = obj.css;\n\tvar media = obj.media;\n\n\tif(media) {\n\t\tstyle.setAttribute(\"media\", media)\n\t}\n\n\tif(style.styleSheet) {\n\t\tstyle.styleSheet.cssText = css;\n\t} else {\n\t\twhile(style.firstChild) {\n\t\t\tstyle.removeChild(style.firstChild);\n\t\t}\n\n\t\tstyle.appendChild(document.createTextNode(css));\n\t}\n}\n\nfunction updateLink (link, options, obj) {\n\tvar css = obj.css;\n\tvar sourceMap = obj.sourceMap;\n\n\t/*\n\t\tIf convertToAbsoluteUrls isn't defined, but sourcemaps are enabled\n\t\tand there is no publicPath defined then lets turn convertToAbsoluteUrls\n\t\ton by default. Otherwise default to the convertToAbsoluteUrls option\n\t\tdirectly\n\t*/\n\tvar autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;\n\n\tif (options.convertToAbsoluteUrls || autoFixUrls) {\n\t\tcss = fixUrls(css);\n\t}\n\n\tif (sourceMap) {\n\t\t// http://stackoverflow.com/a/26603875\n\t\tcss += \"\\n/*# sourceMappingURL=data:application/json;base64,\" + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + \" */\";\n\t}\n\n\tvar blob = new Blob([css], { type: \"text/css\" });\n\n\tvar oldSrc = link.href;\n\n\tlink.href = URL.createObjectURL(blob);\n\n\tif(oldSrc) URL.revokeObjectURL(oldSrc);\n}\n","\n/**\n * When source maps are enabled, `style-loader` uses a link element with a data-uri to\n * embed the css on the page. This breaks all relative urls because now they are relative to a\n * bundle instead of the current page.\n *\n * One solution is to only use full urls, but that may be impossible.\n *\n * Instead, this function \"fixes\" the relative urls to be absolute according to the current page location.\n *\n * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.\n *\n */\n\nmodule.exports = function (css) {\n // get current location\n var location = typeof window !== \"undefined\" && window.location;\n\n if (!location) {\n throw new Error(\"fixUrls requires window.location\");\n }\n\n\t// blank or null?\n\tif (!css || typeof css !== \"string\") {\n\t return css;\n }\n\n var baseUrl = location.protocol + \"//\" + location.host;\n var currentDir = baseUrl + location.pathname.replace(/\\/[^\\/]*$/, \"/\");\n\n\t// convert each url(...)\n\t/*\n\tThis regular expression is just a way to recursively match brackets within\n\ta string.\n\n\t /url\\s*\\( = Match on the word \"url\" with any whitespace after it and then a parens\n\t ( = Start a capturing group\n\t (?: = Start a non-capturing group\n\t [^)(] = Match anything that isn't a parentheses\n\t | = OR\n\t \\( = Match a start parentheses\n\t (?: = Start another non-capturing groups\n\t [^)(]+ = Match anything that isn't a parentheses\n\t | = OR\n\t \\( = Match a start parentheses\n\t [^)(]* = Match anything that isn't a parentheses\n\t \\) = Match a end parentheses\n\t ) = End Group\n *\\) = Match anything and then a close parens\n ) = Close non-capturing group\n * = Match anything\n ) = Close capturing group\n\t \\) = Match a close parens\n\n\t /gi = Get all matches, not the first. Be case insensitive.\n\t */\n\tvar fixedCss = css.replace(/url\\s*\\(((?:[^)(]|\\((?:[^)(]+|\\([^)(]*\\))*\\))*)\\)/gi, function(fullMatch, origUrl) {\n\t\t// strip quotes (if they exist)\n\t\tvar unquotedOrigUrl = origUrl\n\t\t\t.trim()\n\t\t\t.replace(/^\"(.*)\"$/, function(o, $1){ return $1; })\n\t\t\t.replace(/^'(.*)'$/, function(o, $1){ return $1; });\n\n\t\t// already a full url? no change\n\t\tif (/^(#|data:|http:\\/\\/|https:\\/\\/|file:\\/\\/\\/|\\s*$)/i.test(unquotedOrigUrl)) {\n\t\t return fullMatch;\n\t\t}\n\n\t\t// convert the url to a full url\n\t\tvar newUrl;\n\n\t\tif (unquotedOrigUrl.indexOf(\"//\") === 0) {\n\t\t \t//TODO: should we add protocol?\n\t\t\tnewUrl = unquotedOrigUrl;\n\t\t} else if (unquotedOrigUrl.indexOf(\"/\") === 0) {\n\t\t\t// path should be relative to the base url\n\t\t\tnewUrl = baseUrl + unquotedOrigUrl; // already starts with '/'\n\t\t} else {\n\t\t\t// path should be relative to current directory\n\t\t\tnewUrl = currentDir + unquotedOrigUrl.replace(/^\\.\\//, \"\"); // Strip leading './'\n\t\t}\n\n\t\t// send back the fixed url(...)\n\t\treturn \"url(\" + JSON.stringify(newUrl) + \")\";\n\t});\n\n\t// send back the fixed css\n\treturn fixedCss;\n};\n","(function() { module.exports = this[\"regeneratorRuntime\"]; }());","(function() { module.exports = this[\"wp\"][\"apiFetch\"]; }());","(function() { module.exports = this[\"wp\"][\"blockEditor\"]; }());","(function() { module.exports = this[\"wp\"][\"components\"]; }());","(function() { module.exports = this[\"wp\"][\"compose\"]; }());","(function() { module.exports = this[\"wp\"][\"data\"]; }());","(function() { module.exports = this[\"wp\"][\"dom\"]; }());","(function() { module.exports = this[\"wp\"][\"element\"]; }());","(function() { module.exports = this[\"wp\"][\"htmlEntities\"]; }());","(function() { module.exports = this[\"wp\"][\"i18n\"]; }());","(function() { module.exports = this[\"wp\"][\"keycodes\"]; }());","(function() { module.exports = this[\"wp\"][\"richText\"]; }());","(function() { module.exports = this[\"wp\"][\"url\"]; }());","(function() { module.exports = this[\"lodash\"]; }());"],"sourceRoot":""}
|
js/editor/components/index.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
export { default as URLInput } from './url-input';
|
js/editor/components/link-editor/index.js
ADDED
@@ -0,0 +1,409 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import classnames from 'classnames';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* WordPress dependencies
|
8 |
+
*/
|
9 |
+
import { __ } from '@wordpress/i18n';
|
10 |
+
import { Component, Fragment, createRef, useMemo } from '@wordpress/element';
|
11 |
+
import {
|
12 |
+
ExternalLink,
|
13 |
+
IconButton,
|
14 |
+
ToggleControl,
|
15 |
+
Button,
|
16 |
+
TextControl,
|
17 |
+
Notice,
|
18 |
+
Spinner,
|
19 |
+
withSpokenMessages,
|
20 |
+
} from '@wordpress/components';
|
21 |
+
import { LEFT, RIGHT, UP, DOWN, BACKSPACE, ENTER } from '@wordpress/keycodes';
|
22 |
+
import { getRectangleFromRange } from '@wordpress/dom';
|
23 |
+
import { prependHTTP, safeDecodeURI, filterURLForDisplay } from '@wordpress/url';
|
24 |
+
import {
|
25 |
+
create,
|
26 |
+
insert,
|
27 |
+
isCollapsed,
|
28 |
+
applyFormat,
|
29 |
+
getTextContent,
|
30 |
+
slice,
|
31 |
+
} from '@wordpress/rich-text';
|
32 |
+
import { URLPopover } from '@wordpress/block-editor';
|
33 |
+
import apiFetch from '@wordpress/api-fetch';
|
34 |
+
import { addQueryArgs } from '@wordpress/url';
|
35 |
+
import URLInput from '../url-input';
|
36 |
+
import './style.scss';
|
37 |
+
|
38 |
+
/**
|
39 |
+
* Internal dependencies
|
40 |
+
*/
|
41 |
+
import { createLinkFormat, isValidHref } from './utils';
|
42 |
+
|
43 |
+
const stopKeyPropagation = ( event ) => event.stopPropagation();
|
44 |
+
|
45 |
+
function isShowingInput( props, state ) {
|
46 |
+
return props.addingLink || state.editLink;
|
47 |
+
}
|
48 |
+
|
49 |
+
const LinkEditor = ( { value, onChangeInputValue, onKeyDown, submitLink, autocompleteRef } ) => (
|
50 |
+
// Disable reason: KeyPress must be suppressed so the block doesn't hide the toolbar
|
51 |
+
/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
|
52 |
+
<form
|
53 |
+
className="editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content"
|
54 |
+
onKeyPress={ stopKeyPropagation }
|
55 |
+
onKeyDown={ onKeyDown }
|
56 |
+
onSubmit={ submitLink }
|
57 |
+
>
|
58 |
+
<URLInput
|
59 |
+
value={ value }
|
60 |
+
onChange={ onChangeInputValue }
|
61 |
+
autocompleteRef={ autocompleteRef }
|
62 |
+
/>
|
63 |
+
<IconButton icon="editor-break" label={ __( 'Insert Pretty Link' ) } type="submit" />
|
64 |
+
</form>
|
65 |
+
/* eslint-enable jsx-a11y/no-noninteractive-element-interactions */
|
66 |
+
);
|
67 |
+
|
68 |
+
const LinkViewerUrl = ( { url } ) => {
|
69 |
+
const prependedURL = prependHTTP( url );
|
70 |
+
const linkClassName = classnames( 'editor-format-toolbar__link-container-value block-editor-format-toolbar__link-container-value', {
|
71 |
+
'has-invalid-link': ! isValidHref( prependedURL ),
|
72 |
+
} );
|
73 |
+
|
74 |
+
if ( ! url ) {
|
75 |
+
return <span className={ linkClassName }></span>;
|
76 |
+
}
|
77 |
+
|
78 |
+
return (
|
79 |
+
<ExternalLink
|
80 |
+
className={ linkClassName }
|
81 |
+
href={ url }
|
82 |
+
>
|
83 |
+
{ filterURLForDisplay( safeDecodeURI( url ) ) }
|
84 |
+
</ExternalLink>
|
85 |
+
);
|
86 |
+
};
|
87 |
+
|
88 |
+
const URLPopoverAtLink = ( { isActive, addingLink, value, ...props } ) => {
|
89 |
+
const anchorRect = useMemo( () => {
|
90 |
+
const selection = window.getSelection();
|
91 |
+
const range = selection.rangeCount > 0 ? selection.getRangeAt( 0 ) : null;
|
92 |
+
if ( ! range ) {
|
93 |
+
return;
|
94 |
+
}
|
95 |
+
|
96 |
+
if ( addingLink ) {
|
97 |
+
return getRectangleFromRange( range );
|
98 |
+
}
|
99 |
+
|
100 |
+
let element = range.startContainer;
|
101 |
+
|
102 |
+
// If the caret is right before the element, select the next element.
|
103 |
+
element = element.nextElementSibling || element;
|
104 |
+
|
105 |
+
while ( element.nodeType !== window.Node.ELEMENT_NODE ) {
|
106 |
+
element = element.parentNode;
|
107 |
+
}
|
108 |
+
|
109 |
+
const closest = element.closest( 'a' );
|
110 |
+
if ( closest ) {
|
111 |
+
return closest.getBoundingClientRect();
|
112 |
+
}
|
113 |
+
}, [ isActive, addingLink, value.start, value.end ] );
|
114 |
+
|
115 |
+
if ( ! anchorRect ) {
|
116 |
+
return null;
|
117 |
+
}
|
118 |
+
|
119 |
+
return <URLPopover anchorRect={ anchorRect } { ...props } />;
|
120 |
+
};
|
121 |
+
|
122 |
+
const LinkViewer = ( { url, editLink } ) => {
|
123 |
+
return (
|
124 |
+
// Disable reason: KeyPress must be suppressed so the block doesn't hide the toolbar
|
125 |
+
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
126 |
+
<div
|
127 |
+
className="editor-format-toolbar__link-container-content block-editor-format-toolbar__link-container-content"
|
128 |
+
onKeyPress={ stopKeyPropagation }
|
129 |
+
>
|
130 |
+
<LinkViewerUrl url={ url } />
|
131 |
+
<IconButton icon="edit" label={ __( 'Edit' ) } onClick={ editLink } />
|
132 |
+
</div>
|
133 |
+
/* eslint-enable jsx-a11y/no-static-element-interactions */
|
134 |
+
);
|
135 |
+
};
|
136 |
+
|
137 |
+
const createNewPrettyLink = (target, slug) => {
|
138 |
+
return new Promise((resolve, reject) => {
|
139 |
+
jQuery.post(
|
140 |
+
ajaxurl,
|
141 |
+
{
|
142 |
+
action: 'prli_create_pretty_link',
|
143 |
+
target: target,
|
144 |
+
slug: slug,
|
145 |
+
redirect: '',
|
146 |
+
nofollow: 1,
|
147 |
+
tracking: 1
|
148 |
+
},
|
149 |
+
(data, textStatus, xhr) => {
|
150 |
+
'true' === data ? resolve(data) : reject(data);
|
151 |
+
}
|
152 |
+
).fail(error => {
|
153 |
+
reject(error);
|
154 |
+
});
|
155 |
+
});
|
156 |
+
}
|
157 |
+
|
158 |
+
class InlineLinkUI extends Component {
|
159 |
+
constructor() {
|
160 |
+
super( ...arguments );
|
161 |
+
|
162 |
+
this.editLink = this.editLink.bind( this );
|
163 |
+
this.submitLink = this.submitLink.bind( this );
|
164 |
+
this.onKeyDown = this.onKeyDown.bind( this );
|
165 |
+
this.onChangeInputValue = this.onChangeInputValue.bind( this );
|
166 |
+
this.setLinkTarget = this.setLinkTarget.bind( this );
|
167 |
+
this.onClickOutside = this.onClickOutside.bind( this );
|
168 |
+
this.resetState = this.resetState.bind( this );
|
169 |
+
this.autocompleteRef = createRef();
|
170 |
+
|
171 |
+
this.state = {
|
172 |
+
opensInNewWindow: false,
|
173 |
+
inputValue: '',
|
174 |
+
newLinkUrl: '',
|
175 |
+
newLinkSlug: '',
|
176 |
+
creatingLink: false,
|
177 |
+
createdLink: false,
|
178 |
+
createdLinkError: false
|
179 |
+
};
|
180 |
+
}
|
181 |
+
|
182 |
+
static getDerivedStateFromProps( props, state ) {
|
183 |
+
const { activeAttributes: { url, target } } = props;
|
184 |
+
const opensInNewWindow = target === '_blank';
|
185 |
+
|
186 |
+
if ( ! isShowingInput( props, state ) ) {
|
187 |
+
if ( url !== state.inputValue ) {
|
188 |
+
return { inputValue: url };
|
189 |
+
}
|
190 |
+
|
191 |
+
if ( opensInNewWindow !== state.opensInNewWindow ) {
|
192 |
+
return { opensInNewWindow };
|
193 |
+
}
|
194 |
+
}
|
195 |
+
|
196 |
+
return null;
|
197 |
+
}
|
198 |
+
|
199 |
+
onKeyDown( event ) {
|
200 |
+
if ( [ LEFT, DOWN, RIGHT, UP, BACKSPACE, ENTER ].indexOf( event.keyCode ) > -1 ) {
|
201 |
+
// Stop the key event from propagating up to ObserveTyping.startTypingInTextField.
|
202 |
+
event.stopPropagation();
|
203 |
+
}
|
204 |
+
}
|
205 |
+
|
206 |
+
onChangeInputValue( inputValue ) {
|
207 |
+
this.setState( { inputValue } );
|
208 |
+
}
|
209 |
+
|
210 |
+
setLinkTarget( opensInNewWindow ) {
|
211 |
+
const { activeAttributes: { url = '' }, value, onChange } = this.props;
|
212 |
+
|
213 |
+
this.setState( { opensInNewWindow } );
|
214 |
+
|
215 |
+
// Apply now if URL is not being edited.
|
216 |
+
if ( ! isShowingInput( this.props, this.state ) ) {
|
217 |
+
const selectedText = getTextContent( slice( value ) );
|
218 |
+
|
219 |
+
onChange( applyFormat( value, createLinkFormat( {
|
220 |
+
url,
|
221 |
+
opensInNewWindow,
|
222 |
+
text: selectedText,
|
223 |
+
} ) ) );
|
224 |
+
}
|
225 |
+
}
|
226 |
+
|
227 |
+
editLink( event ) {
|
228 |
+
this.setState( { editLink: true } );
|
229 |
+
event.preventDefault();
|
230 |
+
}
|
231 |
+
|
232 |
+
submitLink( event ) {
|
233 |
+
const { isActive, value, onChange, speak } = this.props;
|
234 |
+
const { inputValue, opensInNewWindow } = this.state;
|
235 |
+
const url = prependHTTP( inputValue );
|
236 |
+
const selectedText = getTextContent( slice( value ) );
|
237 |
+
const format = createLinkFormat( {
|
238 |
+
url,
|
239 |
+
opensInNewWindow,
|
240 |
+
text: selectedText,
|
241 |
+
} );
|
242 |
+
|
243 |
+
event.preventDefault();
|
244 |
+
|
245 |
+
if ( isCollapsed( value ) && ! isActive ) {
|
246 |
+
const toInsert = applyFormat( create( { text: url } ), format, 0, url.length );
|
247 |
+
onChange( insert( value, toInsert ) );
|
248 |
+
} else {
|
249 |
+
onChange( applyFormat( value, format ) );
|
250 |
+
}
|
251 |
+
|
252 |
+
this.resetState();
|
253 |
+
|
254 |
+
if ( ! isValidHref( url ) ) {
|
255 |
+
speak( __( 'Warning: the link has been inserted but may have errors. Please test it.' ), 'assertive' );
|
256 |
+
} else if ( isActive ) {
|
257 |
+
speak( __( 'Link edited.' ), 'assertive' );
|
258 |
+
} else {
|
259 |
+
speak( __( 'Link inserted.' ), 'assertive' );
|
260 |
+
}
|
261 |
+
}
|
262 |
+
|
263 |
+
onClickOutside( event ) {
|
264 |
+
// The autocomplete suggestions list renders in a separate popover (in a portal),
|
265 |
+
// so onClickOutside fails to detect that a click on a suggestion occurred in the
|
266 |
+
// LinkContainer. Detect clicks on autocomplete suggestions using a ref here, and
|
267 |
+
// return to avoid the popover being closed.
|
268 |
+
const autocompleteElement = this.autocompleteRef.current;
|
269 |
+
if ( autocompleteElement && autocompleteElement.contains( event.target ) ) {
|
270 |
+
return;
|
271 |
+
}
|
272 |
+
|
273 |
+
this.resetState();
|
274 |
+
}
|
275 |
+
|
276 |
+
resetState() {
|
277 |
+
this.props.stopAddingLink();
|
278 |
+
this.setState( { editLink: false } );
|
279 |
+
}
|
280 |
+
|
281 |
+
render() {
|
282 |
+
const { isActive, activeAttributes: { url }, addingLink, value } = this.props;
|
283 |
+
|
284 |
+
if ( ! isActive && ! addingLink ) {
|
285 |
+
return null;
|
286 |
+
}
|
287 |
+
|
288 |
+
const { inputValue, opensInNewWindow, newLinkUrl, newLinkSlug, creatingLink, createdLink, createdLinkError } = this.state;
|
289 |
+
const showInput = isShowingInput( this.props, this.state );
|
290 |
+
|
291 |
+
return (
|
292 |
+
<URLPopoverAtLink
|
293 |
+
className="pretty-link-inserter"
|
294 |
+
value={ value }
|
295 |
+
isActive={ isActive }
|
296 |
+
addingLink={ addingLink }
|
297 |
+
onClickOutside={ this.onClickOutside }
|
298 |
+
onClose={ this.resetState }
|
299 |
+
focusOnMount={ showInput ? 'firstElement' : false }
|
300 |
+
renderSettings={ () => (
|
301 |
+
<Fragment>
|
302 |
+
<div>
|
303 |
+
<ToggleControl
|
304 |
+
label={ __( 'Open in New Tab' ) }
|
305 |
+
checked={ opensInNewWindow }
|
306 |
+
onChange={ this.setLinkTarget }
|
307 |
+
/>
|
308 |
+
</div>
|
309 |
+
<div className="pretty-link-inserter-form-container">
|
310 |
+
{
|
311 |
+
createdLink && (
|
312 |
+
<Notice status="success" onRemove={() => this.setState({createdLink: false})}>
|
313 |
+
<p>{__( 'Pretty Link created successfully.', 'memberpress' )}</p>
|
314 |
+
</Notice>
|
315 |
+
)
|
316 |
+
}
|
317 |
+
{
|
318 |
+
createdLinkError && (
|
319 |
+
<Notice status="error" onRemove={() => this.setState({createdLink: false, createdLinkError: false})}>
|
320 |
+
<p>{__( 'Pretty Link could not be created. Please try a slug that is not already used.', 'memberpress' )}</p>
|
321 |
+
</Notice>
|
322 |
+
)
|
323 |
+
}
|
324 |
+
<strong>{__('New Pretty Link', 'pretty-link')}</strong>
|
325 |
+
<form onSubmit={(event) => {
|
326 |
+
event.preventDefault();
|
327 |
+
// Send request to create new Pretty Link
|
328 |
+
this.setState({
|
329 |
+
creatingLink: true,
|
330 |
+
createdLinkError: false,
|
331 |
+
});
|
332 |
+
createNewPrettyLink( newLinkUrl, newLinkSlug )
|
333 |
+
.then(data => {
|
334 |
+
this.setState({
|
335 |
+
createdLink: true,
|
336 |
+
creatingLink: false,
|
337 |
+
inputValue: plEditor.homeUrl + newLinkSlug,
|
338 |
+
newLinkUrl: '',
|
339 |
+
newLinkSlug: ''
|
340 |
+
});
|
341 |
+
})
|
342 |
+
.catch(error => {
|
343 |
+
this.setState({
|
344 |
+
createdLink: false,
|
345 |
+
creatingLink: false,
|
346 |
+
createdLinkError: true,
|
347 |
+
});
|
348 |
+
});
|
349 |
+
}}>
|
350 |
+
<p>
|
351 |
+
<TextControl
|
352 |
+
placeholder="URL"
|
353 |
+
className="pretty-link-new-link-url"
|
354 |
+
value={newLinkUrl}
|
355 |
+
onChange={ ( newLinkUrl ) => {
|
356 |
+
this.setState( { newLinkUrl } );
|
357 |
+
} }
|
358 |
+
/>
|
359 |
+
</p>
|
360 |
+
<p>
|
361 |
+
<TextControl
|
362 |
+
placeholder="Slug"
|
363 |
+
className="pretty-link-new-link-slug"
|
364 |
+
value={newLinkSlug}
|
365 |
+
onChange={ ( newLinkSlug ) => {
|
366 |
+
this.setState( { newLinkSlug } );
|
367 |
+
} }
|
368 |
+
/>
|
369 |
+
</p>
|
370 |
+
<p>
|
371 |
+
<button
|
372 |
+
className="pretty-link-submit-new-link components-button is-button is-primary"
|
373 |
+
onClick={ () => {
|
374 |
+
console.log('Creating new Pretty Link...');
|
375 |
+
} }
|
376 |
+
>
|
377 |
+
{ __( 'Create New Pretty Link', 'pretty-link' ) }
|
378 |
+
</button>
|
379 |
+
{
|
380 |
+
creatingLink && (
|
381 |
+
<Spinner />
|
382 |
+
)
|
383 |
+
}
|
384 |
+
</p>
|
385 |
+
</form>
|
386 |
+
</div>
|
387 |
+
</Fragment>
|
388 |
+
) }
|
389 |
+
>
|
390 |
+
{ showInput ? (
|
391 |
+
<LinkEditor
|
392 |
+
value={ inputValue }
|
393 |
+
onChangeInputValue={ this.onChangeInputValue }
|
394 |
+
onKeyDown={ this.onKeyDown }
|
395 |
+
submitLink={ this.submitLink }
|
396 |
+
autocompleteRef={ this.autocompleteRef }
|
397 |
+
/>
|
398 |
+
) : (
|
399 |
+
<LinkViewer
|
400 |
+
url={ url }
|
401 |
+
editLink={ this.editLink }
|
402 |
+
/>
|
403 |
+
) }
|
404 |
+
</URLPopoverAtLink>
|
405 |
+
);
|
406 |
+
}
|
407 |
+
}
|
408 |
+
|
409 |
+
export default withSpokenMessages( InlineLinkUI );
|
js/editor/components/link-editor/style.scss
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
.pretty-link-inserter {
|
2 |
+
.block-editor-url-popover__settings {
|
3 |
+
display: block;
|
4 |
+
}
|
5 |
+
.pretty-link-inserter-form-container {
|
6 |
+
margin-top: 30px;
|
7 |
+
}
|
8 |
+
}
|
js/editor/components/link-editor/utils.js
ADDED
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { startsWith } from 'lodash';
|
5 |
+
|
6 |
+
/**
|
7 |
+
* WordPress dependencies
|
8 |
+
*/
|
9 |
+
import {
|
10 |
+
getProtocol,
|
11 |
+
isValidProtocol,
|
12 |
+
getAuthority,
|
13 |
+
isValidAuthority,
|
14 |
+
getPath,
|
15 |
+
isValidPath,
|
16 |
+
getQueryString,
|
17 |
+
isValidQueryString,
|
18 |
+
getFragment,
|
19 |
+
isValidFragment,
|
20 |
+
} from '@wordpress/url';
|
21 |
+
import { __, sprintf } from '@wordpress/i18n';
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Check for issues with the provided href.
|
25 |
+
*
|
26 |
+
* @param {string} href The href.
|
27 |
+
*
|
28 |
+
* @return {boolean} Is the href invalid?
|
29 |
+
*/
|
30 |
+
export function isValidHref( href ) {
|
31 |
+
if ( ! href ) {
|
32 |
+
return false;
|
33 |
+
}
|
34 |
+
|
35 |
+
const trimmedHref = href.trim();
|
36 |
+
|
37 |
+
if ( ! trimmedHref ) {
|
38 |
+
return false;
|
39 |
+
}
|
40 |
+
|
41 |
+
// Does the href start with something that looks like a URL protocol?
|
42 |
+
if ( /^\S+:/.test( trimmedHref ) ) {
|
43 |
+
const protocol = getProtocol( trimmedHref );
|
44 |
+
if ( ! isValidProtocol( protocol ) ) {
|
45 |
+
return false;
|
46 |
+
}
|
47 |
+
|
48 |
+
// Add some extra checks for http(s) URIs, since these are the most common use-case.
|
49 |
+
// This ensures URIs with an http protocol have exactly two forward slashes following the protocol.
|
50 |
+
if ( startsWith( protocol, 'http' ) && ! /^https?:\/\/[^\/\s]/i.test( trimmedHref ) ) {
|
51 |
+
return false;
|
52 |
+
}
|
53 |
+
|
54 |
+
const authority = getAuthority( trimmedHref );
|
55 |
+
if ( ! isValidAuthority( authority ) ) {
|
56 |
+
return false;
|
57 |
+
}
|
58 |
+
|
59 |
+
const path = getPath( trimmedHref );
|
60 |
+
if ( path && ! isValidPath( path ) ) {
|
61 |
+
return false;
|
62 |
+
}
|
63 |
+
|
64 |
+
const queryString = getQueryString( trimmedHref );
|
65 |
+
if ( queryString && ! isValidQueryString( queryString ) ) {
|
66 |
+
return false;
|
67 |
+
}
|
68 |
+
|
69 |
+
const fragment = getFragment( trimmedHref );
|
70 |
+
if ( fragment && ! isValidFragment( fragment ) ) {
|
71 |
+
return false;
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
// Validate anchor links.
|
76 |
+
if ( startsWith( trimmedHref, '#' ) && ! isValidFragment( trimmedHref ) ) {
|
77 |
+
return false;
|
78 |
+
}
|
79 |
+
|
80 |
+
return true;
|
81 |
+
}
|
82 |
+
|
83 |
+
/**
|
84 |
+
* Generates the format object that will be applied to the link text.
|
85 |
+
*
|
86 |
+
* @param {string} url The href of the link.
|
87 |
+
* @param {boolean} opensInNewWindow Whether this link will open in a new window.
|
88 |
+
* @param {Object} text The text that is being hyperlinked.
|
89 |
+
*
|
90 |
+
* @return {Object} The final format object.
|
91 |
+
*/
|
92 |
+
export function createLinkFormat( { url, opensInNewWindow, text } ) {
|
93 |
+
const format = {
|
94 |
+
type: 'core/link',
|
95 |
+
attributes: {
|
96 |
+
url,
|
97 |
+
},
|
98 |
+
};
|
99 |
+
|
100 |
+
if ( opensInNewWindow ) {
|
101 |
+
// translators: accessibility label for external links, where the argument is the link text
|
102 |
+
const label = sprintf( __( '%s (opens in a new tab)' ), text );
|
103 |
+
|
104 |
+
format.attributes.target = '_blank';
|
105 |
+
format.attributes.rel = 'noreferrer noopener';
|
106 |
+
format.attributes[ 'aria-label' ] = label;
|
107 |
+
}
|
108 |
+
|
109 |
+
return format;
|
110 |
+
}
|
js/editor/components/url-input/index.js
ADDED
@@ -0,0 +1,316 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* External dependencies
|
3 |
+
*/
|
4 |
+
import { throttle, map, pick, defaultTo } from 'lodash';
|
5 |
+
import classnames from 'classnames';
|
6 |
+
import scrollIntoView from 'dom-scroll-into-view';
|
7 |
+
|
8 |
+
/**
|
9 |
+
* WordPress dependencies
|
10 |
+
*/
|
11 |
+
import { __, sprintf, _n } from '@wordpress/i18n';
|
12 |
+
import { Component, createRef } from '@wordpress/element';
|
13 |
+
import { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';
|
14 |
+
import { Spinner, withSpokenMessages, Popover } from '@wordpress/components';
|
15 |
+
import { withInstanceId, withSafeTimeout, compose } from '@wordpress/compose';
|
16 |
+
import { withSelect } from '@wordpress/data';
|
17 |
+
import apiFetch from '@wordpress/api-fetch';
|
18 |
+
import { addQueryArgs } from '@wordpress/url';
|
19 |
+
import { decodeEntities } from '@wordpress/html-entities';
|
20 |
+
|
21 |
+
// Since URLInput is rendered in the context of other inputs, but should be
|
22 |
+
// considered a separate modal node, prevent keyboard events from propagating
|
23 |
+
// as being considered from the input.
|
24 |
+
const stopEventPropagation = ( event ) => event.stopPropagation();
|
25 |
+
|
26 |
+
const fetchLinkSuggestions = async ( search ) => {
|
27 |
+
|
28 |
+
const links = await apiFetch( {
|
29 |
+
url: addQueryArgs( ajaxurl, {
|
30 |
+
action: 'prli_search_for_links',
|
31 |
+
term: search,
|
32 |
+
} ),
|
33 |
+
} );
|
34 |
+
|
35 |
+
return map( links, ( link ) => ( {
|
36 |
+
url: link.pretty_url,
|
37 |
+
title: decodeEntities( link.value ) + ' (' + decodeEntities( link.slug ) + ')' || __( '(no title)' ),
|
38 |
+
} ) );
|
39 |
+
};
|
40 |
+
|
41 |
+
class URLInput extends Component {
|
42 |
+
constructor( { autocompleteRef } ) {
|
43 |
+
super( ...arguments );
|
44 |
+
|
45 |
+
this.onChange = this.onChange.bind( this );
|
46 |
+
this.onKeyDown = this.onKeyDown.bind( this );
|
47 |
+
this.autocompleteRef = autocompleteRef || createRef();
|
48 |
+
this.inputRef = createRef();
|
49 |
+
this.updateSuggestions = throttle( this.updateSuggestions.bind( this ), 200 );
|
50 |
+
|
51 |
+
this.suggestionNodes = [];
|
52 |
+
|
53 |
+
this.state = {
|
54 |
+
suggestions: [],
|
55 |
+
showSuggestions: false,
|
56 |
+
selectedSuggestion: null,
|
57 |
+
};
|
58 |
+
}
|
59 |
+
|
60 |
+
componentDidUpdate() {
|
61 |
+
const { showSuggestions, selectedSuggestion } = this.state;
|
62 |
+
// only have to worry about scrolling selected suggestion into view
|
63 |
+
// when already expanded
|
64 |
+
if ( showSuggestions && selectedSuggestion !== null && ! this.scrollingIntoView ) {
|
65 |
+
this.scrollingIntoView = true;
|
66 |
+
scrollIntoView( this.suggestionNodes[ selectedSuggestion ], this.autocompleteRef.current, {
|
67 |
+
onlyScrollIfNeeded: true,
|
68 |
+
} );
|
69 |
+
|
70 |
+
this.props.setTimeout( () => {
|
71 |
+
this.scrollingIntoView = false;
|
72 |
+
}, 100 );
|
73 |
+
}
|
74 |
+
}
|
75 |
+
|
76 |
+
componentWillUnmount() {
|
77 |
+
delete this.suggestionsRequest;
|
78 |
+
}
|
79 |
+
|
80 |
+
bindSuggestionNode( index ) {
|
81 |
+
return ( ref ) => {
|
82 |
+
this.suggestionNodes[ index ] = ref;
|
83 |
+
};
|
84 |
+
}
|
85 |
+
|
86 |
+
updateSuggestions( value ) {
|
87 |
+
|
88 |
+
// Show the suggestions after typing at least 2 characters
|
89 |
+
// and also for URLs
|
90 |
+
if ( value.length < 2 || /^https?:/.test( value ) ) {
|
91 |
+
this.setState( {
|
92 |
+
showSuggestions: false,
|
93 |
+
selectedSuggestion: null,
|
94 |
+
loading: false,
|
95 |
+
} );
|
96 |
+
|
97 |
+
return;
|
98 |
+
}
|
99 |
+
|
100 |
+
this.setState( {
|
101 |
+
showSuggestions: true,
|
102 |
+
selectedSuggestion: null,
|
103 |
+
loading: true,
|
104 |
+
} );
|
105 |
+
|
106 |
+
const request = fetchLinkSuggestions( value );
|
107 |
+
|
108 |
+
request.then( ( suggestions ) => {
|
109 |
+
// A fetch Promise doesn't have an abort option. It's mimicked by
|
110 |
+
// comparing the request reference in on the instance, which is
|
111 |
+
// reset or deleted on subsequent requests or unmounting.
|
112 |
+
if ( this.suggestionsRequest !== request ) {
|
113 |
+
return;
|
114 |
+
}
|
115 |
+
|
116 |
+
this.setState( {
|
117 |
+
suggestions,
|
118 |
+
loading: false,
|
119 |
+
} );
|
120 |
+
|
121 |
+
if ( !! suggestions.length ) {
|
122 |
+
this.props.debouncedSpeak( sprintf( _n(
|
123 |
+
'%d result found, use up and down arrow keys to navigate.',
|
124 |
+
'%d results found, use up and down arrow keys to navigate.',
|
125 |
+
suggestions.length
|
126 |
+
), suggestions.length ), 'assertive' );
|
127 |
+
} else {
|
128 |
+
this.props.debouncedSpeak( __( 'No results.' ), 'assertive' );
|
129 |
+
}
|
130 |
+
} ).catch( () => {
|
131 |
+
if ( this.suggestionsRequest === request ) {
|
132 |
+
this.setState( {
|
133 |
+
loading: false,
|
134 |
+
} );
|
135 |
+
}
|
136 |
+
} );
|
137 |
+
|
138 |
+
this.suggestionsRequest = request;
|
139 |
+
}
|
140 |
+
|
141 |
+
onChange( event ) {
|
142 |
+
const inputValue = event.target.value;
|
143 |
+
this.props.onChange( inputValue );
|
144 |
+
this.updateSuggestions( inputValue );
|
145 |
+
}
|
146 |
+
|
147 |
+
onKeyDown( event ) {
|
148 |
+
const { showSuggestions, selectedSuggestion, suggestions, loading } = this.state;
|
149 |
+
// If the suggestions are not shown or loading, we shouldn't handle the arrow keys
|
150 |
+
// We shouldn't preventDefault to allow block arrow keys navigation
|
151 |
+
if ( ! showSuggestions || ! suggestions.length || loading ) {
|
152 |
+
// In the Windows version of Firefox the up and down arrows don't move the caret
|
153 |
+
// within an input field like they do for Mac Firefox/Chrome/Safari. This causes
|
154 |
+
// a form of focus trapping that is disruptive to the user experience. This disruption
|
155 |
+
// only happens if the caret is not in the first or last position in the text input.
|
156 |
+
// See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747
|
157 |
+
switch ( event.keyCode ) {
|
158 |
+
// When UP is pressed, if the caret is at the start of the text, move it to the 0
|
159 |
+
// position.
|
160 |
+
case UP: {
|
161 |
+
if ( 0 !== event.target.selectionStart ) {
|
162 |
+
event.stopPropagation();
|
163 |
+
event.preventDefault();
|
164 |
+
|
165 |
+
// Set the input caret to position 0
|
166 |
+
event.target.setSelectionRange( 0, 0 );
|
167 |
+
}
|
168 |
+
break;
|
169 |
+
}
|
170 |
+
// When DOWN is pressed, if the caret is not at the end of the text, move it to the
|
171 |
+
// last position.
|
172 |
+
case DOWN: {
|
173 |
+
if ( this.props.value.length !== event.target.selectionStart ) {
|
174 |
+
event.stopPropagation();
|
175 |
+
event.preventDefault();
|
176 |
+
|
177 |
+
// Set the input caret to the last position
|
178 |
+
event.target.setSelectionRange( this.props.value.length, this.props.value.length );
|
179 |
+
}
|
180 |
+
break;
|
181 |
+
}
|
182 |
+
}
|
183 |
+
|
184 |
+
return;
|
185 |
+
}
|
186 |
+
|
187 |
+
const suggestion = this.state.suggestions[ this.state.selectedSuggestion ];
|
188 |
+
|
189 |
+
switch ( event.keyCode ) {
|
190 |
+
case UP: {
|
191 |
+
event.stopPropagation();
|
192 |
+
event.preventDefault();
|
193 |
+
const previousIndex = ! selectedSuggestion ? suggestions.length - 1 : selectedSuggestion - 1;
|
194 |
+
this.setState( {
|
195 |
+
selectedSuggestion: previousIndex,
|
196 |
+
} );
|
197 |
+
break;
|
198 |
+
}
|
199 |
+
case DOWN: {
|
200 |
+
event.stopPropagation();
|
201 |
+
event.preventDefault();
|
202 |
+
const nextIndex = selectedSuggestion === null || ( selectedSuggestion === suggestions.length - 1 ) ? 0 : selectedSuggestion + 1;
|
203 |
+
this.setState( {
|
204 |
+
selectedSuggestion: nextIndex,
|
205 |
+
} );
|
206 |
+
break;
|
207 |
+
}
|
208 |
+
case TAB: {
|
209 |
+
if ( this.state.selectedSuggestion !== null ) {
|
210 |
+
this.selectLink( suggestion );
|
211 |
+
// Announce a link has been selected when tabbing away from the input field.
|
212 |
+
this.props.speak( __( 'Link selected.' ) );
|
213 |
+
}
|
214 |
+
break;
|
215 |
+
}
|
216 |
+
case ENTER: {
|
217 |
+
if ( this.state.selectedSuggestion !== null ) {
|
218 |
+
event.stopPropagation();
|
219 |
+
this.selectLink( suggestion );
|
220 |
+
}
|
221 |
+
break;
|
222 |
+
}
|
223 |
+
}
|
224 |
+
}
|
225 |
+
|
226 |
+
selectLink( suggestion ) {
|
227 |
+
this.props.onChange( suggestion.url, suggestion );
|
228 |
+
this.setState( {
|
229 |
+
selectedSuggestion: null,
|
230 |
+
showSuggestions: false,
|
231 |
+
} );
|
232 |
+
}
|
233 |
+
|
234 |
+
handleOnClick( suggestion ) {
|
235 |
+
this.selectLink( suggestion );
|
236 |
+
// Move focus to the input field when a link suggestion is clicked.
|
237 |
+
this.inputRef.current.focus();
|
238 |
+
}
|
239 |
+
|
240 |
+
render() {
|
241 |
+
const { value = '', autoFocus = true, instanceId, className } = this.props;
|
242 |
+
const { showSuggestions, suggestions, selectedSuggestion, loading } = this.state;
|
243 |
+
|
244 |
+
const suggestionsListboxId = `block-editor-url-input-suggestions-${ instanceId }`;
|
245 |
+
const suggestionOptionIdPrefix = `block-editor-url-input-suggestion-${ instanceId }`;
|
246 |
+
|
247 |
+
/* eslint-disable jsx-a11y/no-autofocus */
|
248 |
+
return (
|
249 |
+
<div className={ classnames( 'editor-url-input block-editor-url-input', className ) }>
|
250 |
+
<input
|
251 |
+
autoFocus={ autoFocus }
|
252 |
+
type="text"
|
253 |
+
aria-label={ __( 'URL' ) }
|
254 |
+
required
|
255 |
+
value={ value }
|
256 |
+
onChange={ this.onChange }
|
257 |
+
onInput={ stopEventPropagation }
|
258 |
+
placeholder={ __( 'Paste or type to search for your Pretty Link' ) }
|
259 |
+
onKeyDown={ this.onKeyDown }
|
260 |
+
role="combobox"
|
261 |
+
aria-expanded={ showSuggestions }
|
262 |
+
aria-autocomplete="list"
|
263 |
+
aria-owns={ suggestionsListboxId }
|
264 |
+
aria-activedescendant={ selectedSuggestion !== null ? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }` : undefined }
|
265 |
+
ref={ this.inputRef }
|
266 |
+
/>
|
267 |
+
|
268 |
+
{ ( loading ) && <Spinner /> }
|
269 |
+
|
270 |
+
{ showSuggestions && !! suggestions.length &&
|
271 |
+
<Popover position="bottom" noArrow focusOnMount={ false }>
|
272 |
+
<div
|
273 |
+
className="editor-url-input__suggestions block-editor-url-input__suggestions"
|
274 |
+
id={ suggestionsListboxId }
|
275 |
+
ref={ this.autocompleteRef }
|
276 |
+
role="listbox"
|
277 |
+
>
|
278 |
+
{ suggestions.map( ( suggestion, index ) => (
|
279 |
+
<button
|
280 |
+
key={ suggestion.id }
|
281 |
+
role="option"
|
282 |
+
tabIndex="-1"
|
283 |
+
id={ `${ suggestionOptionIdPrefix }-${ index }` }
|
284 |
+
ref={ this.bindSuggestionNode( index ) }
|
285 |
+
className={ classnames( 'editor-url-input__suggestion block-editor-url-input__suggestion', {
|
286 |
+
'is-selected': index === selectedSuggestion,
|
287 |
+
} ) }
|
288 |
+
onClick={ () => this.handleOnClick( suggestion ) }
|
289 |
+
aria-selected={ index === selectedSuggestion }
|
290 |
+
>
|
291 |
+
{ suggestion.title }
|
292 |
+
</button>
|
293 |
+
) ) }
|
294 |
+
</div>
|
295 |
+
</Popover>
|
296 |
+
}
|
297 |
+
</div>
|
298 |
+
);
|
299 |
+
/* eslint-enable jsx-a11y/no-autofocus */
|
300 |
+
}
|
301 |
+
}
|
302 |
+
|
303 |
+
/**
|
304 |
+
* @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/url-input/README.md
|
305 |
+
*/
|
306 |
+
export default compose(
|
307 |
+
withSafeTimeout,
|
308 |
+
withSpokenMessages,
|
309 |
+
withInstanceId,
|
310 |
+
withSelect( ( select ) => {
|
311 |
+
const { getSettings } = select( 'core/block-editor' );
|
312 |
+
return {
|
313 |
+
fetchLinkSuggestions: getSettings().__experimentalFetchLinkSuggestions,
|
314 |
+
};
|
315 |
+
} )
|
316 |
+
)( URLInput );
|
js/editor/formats/pretty-link/index.js
ADDED
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* WordPress dependencies
|
3 |
+
*/
|
4 |
+
import { __ } from '@wordpress/i18n';
|
5 |
+
import { withSpokenMessages } from '@wordpress/components';
|
6 |
+
import { Component, Fragment } from '@wordpress/element';
|
7 |
+
import {
|
8 |
+
getTextContent,
|
9 |
+
applyFormat,
|
10 |
+
removeFormat,
|
11 |
+
slice,
|
12 |
+
registerFormatType
|
13 |
+
} from '@wordpress/rich-text';
|
14 |
+
import { isURL, isEmail } from '@wordpress/url';
|
15 |
+
import { RichTextToolbarButton, RichTextShortcut } from '@wordpress/block-editor';
|
16 |
+
import InlineLinkUI from '../../components/link-editor';
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Block constants
|
20 |
+
*/
|
21 |
+
const name = 'pretty-link/pretty-link';
|
22 |
+
const title = __( 'Pretty Link' );
|
23 |
+
|
24 |
+
export const prettyLink = {
|
25 |
+
name,
|
26 |
+
title,
|
27 |
+
tagName: 'a',
|
28 |
+
className: 'pretty-link',
|
29 |
+
attributes: {
|
30 |
+
url: 'href',
|
31 |
+
target: 'target'
|
32 |
+
},
|
33 |
+
edit: withSpokenMessages( class LinkEdit extends Component {
|
34 |
+
constructor() {
|
35 |
+
super( ...arguments );
|
36 |
+
|
37 |
+
this.addLink = this.addLink.bind( this );
|
38 |
+
this.stopAddingLink = this.stopAddingLink.bind( this );
|
39 |
+
this.onRemoveFormat = this.onRemoveFormat.bind( this );
|
40 |
+
this.state = {
|
41 |
+
addingLink: false,
|
42 |
+
};
|
43 |
+
}
|
44 |
+
|
45 |
+
addLink() {
|
46 |
+
const { value, onChange } = this.props;
|
47 |
+
const text = getTextContent( slice( value ) );
|
48 |
+
|
49 |
+
if ( text && isURL( text ) ) {
|
50 |
+
onChange( applyFormat( value, { type: name, attributes: { url: text } } ) );
|
51 |
+
} else {
|
52 |
+
this.setState( { addingLink: true } );
|
53 |
+
}
|
54 |
+
}
|
55 |
+
|
56 |
+
stopAddingLink() {
|
57 |
+
this.setState( { addingLink: false } );
|
58 |
+
}
|
59 |
+
|
60 |
+
onRemoveFormat() {
|
61 |
+
const { value, onChange, speak } = this.props;
|
62 |
+
|
63 |
+
onChange( removeFormat( value, name ) );
|
64 |
+
speak( __( 'Link removed.' ), 'assertive' );
|
65 |
+
}
|
66 |
+
|
67 |
+
render() {
|
68 |
+
const { isActive, activeAttributes, value, onChange } = this.props;
|
69 |
+
|
70 |
+
return (
|
71 |
+
<>
|
72 |
+
<RichTextShortcut
|
73 |
+
type="primary"
|
74 |
+
character="k"
|
75 |
+
onUse={ this.addLink }
|
76 |
+
/>
|
77 |
+
<RichTextShortcut
|
78 |
+
type="primaryShift"
|
79 |
+
character="k"
|
80 |
+
onUse={ this.onRemoveFormat }
|
81 |
+
/>
|
82 |
+
{ isActive && <RichTextToolbarButton
|
83 |
+
icon="star-filled"
|
84 |
+
title={ __( 'Unlink' ) }
|
85 |
+
onClick={ this.onRemoveFormat }
|
86 |
+
isActive={ isActive }
|
87 |
+
shortcutType="primaryShift"
|
88 |
+
shortcutCharacter="k"
|
89 |
+
/> }
|
90 |
+
{ ! isActive && <RichTextToolbarButton
|
91 |
+
icon="star-filled"
|
92 |
+
title={ title }
|
93 |
+
onClick={ this.addLink }
|
94 |
+
isActive={ isActive }
|
95 |
+
shortcutType="primary"
|
96 |
+
shortcutCharacter="k"
|
97 |
+
/> }
|
98 |
+
<InlineLinkUI
|
99 |
+
addingLink={ this.state.addingLink }
|
100 |
+
stopAddingLink={ this.stopAddingLink }
|
101 |
+
isActive={ isActive }
|
102 |
+
activeAttributes={ activeAttributes }
|
103 |
+
value={ value }
|
104 |
+
onChange={ onChange }
|
105 |
+
/>
|
106 |
+
</>
|
107 |
+
);
|
108 |
+
}
|
109 |
+
} ),
|
110 |
+
|
111 |
+
};
|
112 |
+
|
113 |
+
function registerFormats () {
|
114 |
+
[
|
115 |
+
prettyLink,
|
116 |
+
].forEach( ( { name, ...settings } ) => registerFormatType( name, settings ) );
|
117 |
+
};
|
118 |
+
registerFormats();
|
js/prli-admin-links.js
CHANGED
@@ -62,43 +62,6 @@ function prli_toggle_link_options() {
|
|
62 |
return false;
|
63 |
});
|
64 |
|
65 |
-
$("#add_group_textbox").keypress(function(e) {
|
66 |
-
// Apparently 13 is the enter key
|
67 |
-
if(e.which == 13) {
|
68 |
-
e.preventDefault();
|
69 |
-
|
70 |
-
var add_new_group_data = {
|
71 |
-
action: 'add_new_prli_group',
|
72 |
-
new_group_name: $('#add_group_textbox').val(),
|
73 |
-
_prli_nonce: $('#add_group_textbox').attr('prli_nonce')
|
74 |
-
};
|
75 |
-
|
76 |
-
$.post(ajaxurl, add_new_group_data, function(data) {
|
77 |
-
if(data['status']=='success') {
|
78 |
-
$('#group_dropdown').append(data['group_option']);
|
79 |
-
$('#group_dropdown').val(data['group_id']);
|
80 |
-
$('#add_group_textbox').val('');
|
81 |
-
$("#add_group_textbox").blur();
|
82 |
-
$("#add_group_message").addClass('updated');
|
83 |
-
$("#add_group_message").text(data['message']);
|
84 |
-
$("#add_group_message").show();
|
85 |
-
|
86 |
-
$("#add_group_message").fadeOut(5000, function(e) {
|
87 |
-
$("#add_group_message").removeClass('updated');
|
88 |
-
});
|
89 |
-
}
|
90 |
-
else {
|
91 |
-
$("#add_group_message").addClass('error');
|
92 |
-
$("#add_group_message").text(data['message']);
|
93 |
-
|
94 |
-
$("#add_group_message").fadeOut(5000, function(e) {
|
95 |
-
$("#add_group_message").removeClass('error');
|
96 |
-
});
|
97 |
-
}
|
98 |
-
});
|
99 |
-
}
|
100 |
-
});
|
101 |
-
|
102 |
$(".defaultText").focus(function(srcc) {
|
103 |
if ($(this).val() == $(this)[0].title) {
|
104 |
$(this).removeClass("defaultTextActive");
|
@@ -116,101 +79,31 @@ function prli_toggle_link_options() {
|
|
116 |
|
117 |
$(".defaultText").blur();
|
118 |
|
119 |
-
$(".link_row").hover( function() {
|
120 |
-
$(this).find(".link_actions").show();
|
121 |
-
},
|
122 |
-
function() {
|
123 |
-
$(this).find(".link_actions").hide();
|
124 |
-
});
|
125 |
-
|
126 |
-
$('.prli_bulk_action_apply').click( function() {
|
127 |
-
if($('.prli_bulk_action').val()=='edit') {
|
128 |
-
if($('.link-action-checkbox:checkbox:checked').length > 0)
|
129 |
-
$('#bulk-edit').slideDown('slow');
|
130 |
-
}
|
131 |
-
else if($('.prli_bulk_action').val()=='delete') {
|
132 |
-
var confmsg = $(this).attr('data-confmsg');
|
133 |
-
if(confirm(confmsg)) {
|
134 |
-
var ids = $('.link-action-checkbox:checkbox:checked').map(function() {
|
135 |
-
return $(this).attr('data-id');
|
136 |
-
}).get().join(',');
|
137 |
-
var delurl = $('.prli_bulk_action_apply').attr('data-url') +
|
138 |
-
window.location.search +
|
139 |
-
'&action=bulk-destroy' +
|
140 |
-
'&_wpnonce=' + $('.prli_bulk_action_apply').attr('data-wpnonce') +
|
141 |
-
'&ids=' + ids;
|
142 |
-
|
143 |
-
window.location = delurl;
|
144 |
-
}
|
145 |
-
}
|
146 |
-
});
|
147 |
-
|
148 |
-
$('.bulk-edit-cancel').click( function() {
|
149 |
-
$('#bulk-edit').slideUp('slow');
|
150 |
-
});
|
151 |
-
|
152 |
-
$('.bulk-edit-update').click( function() {
|
153 |
-
var ids = $('.link-action-checkbox:checkbox:checked').map(function() {
|
154 |
-
return $(this).attr('data-id');
|
155 |
-
}).get().join(',');
|
156 |
-
var editurl = $('.prli_bulk_action_apply').attr('data-url') +
|
157 |
-
window.location.search +
|
158 |
-
'&action=bulk-update' +
|
159 |
-
'&_wpnonce=' + $('.prli_bulk_action_apply').attr('data-wpnonce') +
|
160 |
-
'&ids=' + ids;
|
161 |
-
|
162 |
-
$('.bulk-edit-select').each( function() {
|
163 |
-
if($(this).val() != '##nochange##')
|
164 |
-
editurl += '&' + $(this).attr('name') + '=' + encodeURIComponent($(this).val());
|
165 |
-
});
|
166 |
-
|
167 |
-
$('.bulk-edit-text').each( function() {
|
168 |
-
editurl += '&' + $(this).attr('name') + '=' + encodeURIComponent($(this).val());
|
169 |
-
});
|
170 |
-
|
171 |
-
window.location = editurl;
|
172 |
-
});
|
173 |
|
174 |
-
$('
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
$('#bulk-titles').html('');
|
179 |
-
$('.link-action-checkbox:checkbox:checked').each( function() {
|
180 |
-
var nid = $(this).attr('data-id');
|
181 |
-
var ntitle = $(this).attr('data-title');
|
182 |
-
$('#bulk-titles').append('<div id="ttle'+nid+'"><a data-id="'+nid+'" class="ntdelbutton" title="Remove From Bulk Edit">X</a>"'+ntitle+'"</div>');
|
183 |
-
$('.ntdelbutton').click( function() {
|
184 |
-
var nid = $(this).attr('data-id');
|
185 |
-
$('.link-action-checkbox[data-id='+nid+']').prop('checked',false);
|
186 |
-
$('.link-action-checkbox[data-id='+nid+']').trigger('change');
|
187 |
-
});
|
188 |
-
});
|
189 |
});
|
190 |
|
191 |
-
|
192 |
-
|
193 |
-
if($(this).prop('checked'))
|
194 |
-
$('.link-action-checkbox').prop('checked',true);
|
195 |
-
else
|
196 |
-
$('.link-action-checkbox').prop('checked',false);
|
197 |
|
198 |
-
|
199 |
-
|
|
|
|
|
|
|
|
|
200 |
|
201 |
-
|
202 |
-
|
203 |
-
// keyword column to this table -- so it has to be dynamic
|
204 |
-
$('.prli-edit-table td.colspanchange').attr('colspan', $('table.prli-edit-table thead tr th').length);
|
205 |
|
206 |
-
|
207 |
-
|
208 |
-
|
|
|
|
|
209 |
});
|
210 |
|
211 |
-
//PAGE TOGGLING IN LIST MODE
|
212 |
-
$('.prli-page-size').change(function() {
|
213 |
-
window.location.href = $(this).data("url") + $(this).val();
|
214 |
-
});
|
215 |
});
|
216 |
})(jQuery);
|
62 |
return false;
|
63 |
});
|
64 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
$(".defaultText").focus(function(srcc) {
|
66 |
if ($(this).val() == $(this)[0].title) {
|
67 |
$(this).removeClass("defaultTextActive");
|
79 |
|
80 |
$(".defaultText").blur();
|
81 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
82 |
|
83 |
+
$('#prli_add_link_rotation').on('click', function(e) {
|
84 |
+
e.preventDefault();
|
85 |
+
$('#prli_link_rotations').append(PlpLink.rotation_row_html);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
});
|
87 |
|
88 |
+
$('.prli_reset_pretty_link').on('click', function(e) {
|
89 |
+
e.preventDefault();
|
|
|
|
|
|
|
|
|
90 |
|
91 |
+
if(confirm(PrliLinkList.reset_str)) {
|
92 |
+
var args = {
|
93 |
+
'action' : 'reset_pretty_link',
|
94 |
+
'id' : $(this).data('id'),
|
95 |
+
'security' : PrliLinkList.reset_security
|
96 |
+
};
|
97 |
|
98 |
+
$.post( ajaxurl, args, function(data) {
|
99 |
+
$('.clicks.column-clicks a#link_clicks_' + args.id).html('0/0');
|
|
|
|
|
100 |
|
101 |
+
// show message coming from the server indicating
|
102 |
+
// whether or not the reset was successful or not
|
103 |
+
alert(data.message);
|
104 |
+
}, 'json' );
|
105 |
+
}
|
106 |
});
|
107 |
|
|
|
|
|
|
|
|
|
108 |
});
|
109 |
})(jQuery);
|
js/quick_create.js
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
jQuery(function ($) {
|
2 |
+
var $error = $('#prli-quick-create-error'),
|
3 |
+
$loading = $('#prli-quick-create-loading'),
|
4 |
+
showError = function (message) {
|
5 |
+
$error.html(
|
6 |
+
$('<div class="notice notice-error">').append(
|
7 |
+
$('<p>').text(message)
|
8 |
+
)
|
9 |
+
).show();
|
10 |
+
};
|
11 |
+
|
12 |
+
$('#prli-quick-create').on('submit', function (e) {
|
13 |
+
e.preventDefault();
|
14 |
+
|
15 |
+
$error.hide();
|
16 |
+
$loading.show();
|
17 |
+
|
18 |
+
$.ajax({
|
19 |
+
type: 'POST',
|
20 |
+
url: PrliQuickCreate.ajaxUrl,
|
21 |
+
data: {
|
22 |
+
action: 'prli_quick_create',
|
23 |
+
_ajax_nonce: PrliQuickCreate.nonce,
|
24 |
+
url: $('#prli-quick-create-url').val(),
|
25 |
+
slug: $('#prli-quick-create-slug').val()
|
26 |
+
},
|
27 |
+
dataType: 'json'
|
28 |
+
}).done(function (response) {
|
29 |
+
if (response && typeof response === 'object') {
|
30 |
+
if (response.success) {
|
31 |
+
window.location = response.data.redirect;
|
32 |
+
} else {
|
33 |
+
showError(response.data.message);
|
34 |
+
}
|
35 |
+
} else {
|
36 |
+
showError(PrliQuickCreate.invalidServerResponse);
|
37 |
+
}
|
38 |
+
}).fail(function () {
|
39 |
+
showError(PrliQuickCreate.ajaxError);
|
40 |
+
}).always(function () {
|
41 |
+
$loading.hide();
|
42 |
+
});
|
43 |
+
});
|
44 |
+
});
|
js/tinymce_form_popup.js
CHANGED
@@ -6,7 +6,7 @@ function prliHasWhiteSpace(s) {
|
|
6 |
var PrliPopUpHandler = {
|
7 |
init : function() {
|
8 |
//Used in our insert function for link text
|
9 |
-
prli_selected_text = parent.tinymce.activeEditor.selection.getContent({format: 'text'});
|
10 |
},
|
11 |
insert_new : function() {
|
12 |
jQuery('#errors').html('');
|
@@ -23,13 +23,13 @@ var PrliPopUpHandler = {
|
|
23 |
|
24 |
//Change vars to actual defaults if default was chosen
|
25 |
if(redirect == 'default') {
|
26 |
-
redirect = default_redirect;
|
27 |
}
|
28 |
if(nofollow == 'default') {
|
29 |
-
nofollow = default_nofollow;
|
30 |
}
|
31 |
if(tracking == 'default') {
|
32 |
-
tracking = default_tracking;
|
33 |
}
|
34 |
|
35 |
//Some validations
|
@@ -58,12 +58,12 @@ var PrliPopUpHandler = {
|
|
58 |
jQuery("#insert").hide();
|
59 |
jQuery("#insert_loading").fadeIn();
|
60 |
|
61 |
-
jQuery.post(ajaxurl, data, function(response) {
|
62 |
var trimmed_data = response.replace(/^\s+|\s+$/g, ''); //Trim whitespace
|
63 |
|
64 |
if(trimmed_data == 'true') {
|
65 |
var output = '';
|
66 |
-
var pretty_link = home_url + slug;
|
67 |
|
68 |
//Set the link text to the link itself
|
69 |
if(link_text.length === 0) {
|
@@ -144,19 +144,19 @@ var PrliPopUpHandler = {
|
|
144 |
//Add a small delay so that prli_selected_text will be avaiable
|
145 |
setTimeout(function() {
|
146 |
//Nothing selected
|
147 |
-
if(prli_selected_text.length === 0) {
|
148 |
$("#prli_insert_link_link_text").val("Click Here");
|
149 |
$("#existing_link_link_text").val("Click Here");
|
150 |
}
|
151 |
//If selected text is a link, make it the target URL
|
152 |
-
else if(prli_selected_text.match(/https?:\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/)) {
|
153 |
-
$("#prli_insert_link_target").val(prli_selected_text);
|
154 |
$("#prli_insert_link_link_text").val("Click Here");
|
155 |
$("#existing_link_link_text").val("Click Here");
|
156 |
//Show selected text
|
157 |
} else {
|
158 |
-
$("#prli_insert_link_link_text").val(prli_selected_text);
|
159 |
-
$("#existing_link_link_text").val(prli_selected_text);
|
160 |
}
|
161 |
}, 200); //200ms
|
162 |
|
@@ -177,7 +177,7 @@ var PrliPopUpHandler = {
|
|
177 |
$("#prlitinymce-bad-slug").hide();
|
178 |
$("#prlitinymce-thinking").show();
|
179 |
|
180 |
-
$.post(ajaxurl, data, function(response) {
|
181 |
var trimmed_data = response.replace(/^\s+|\s+$/g, ''); //Trim whitespace
|
182 |
|
183 |
if(trimmed_data == 'true') {
|
@@ -222,12 +222,12 @@ var PrliPopUpHandler = {
|
|
222 |
|
223 |
//Load the autocomplete stuff
|
224 |
$('#prli_search_box').autocomplete({
|
225 |
-
source: ajaxurl + "?action=prli_search_for_links",
|
226 |
minLength: 2,
|
227 |
select: function(event, ui) {
|
228 |
$("#existing_link_target").html(ui.item.target);
|
229 |
$("#existing_link_nofollow").val(ui.item.nofollow);
|
230 |
-
$("#existing_link_slug").html(home_url + ui.item.slug);
|
231 |
}
|
232 |
});
|
233 |
});
|
6 |
var PrliPopUpHandler = {
|
7 |
init : function() {
|
8 |
//Used in our insert function for link text
|
9 |
+
prliTinymceL10n.prli_selected_text = parent.tinymce.activeEditor.selection.getContent({format: 'text'});
|
10 |
},
|
11 |
insert_new : function() {
|
12 |
jQuery('#errors').html('');
|
23 |
|
24 |
//Change vars to actual defaults if default was chosen
|
25 |
if(redirect == 'default') {
|
26 |
+
redirect = prliTinymceL10n.default_redirect;
|
27 |
}
|
28 |
if(nofollow == 'default') {
|
29 |
+
nofollow = prliTinymceL10n.default_nofollow;
|
30 |
}
|
31 |
if(tracking == 'default') {
|
32 |
+
tracking = prliTinymceL10n.default_tracking;
|
33 |
}
|
34 |
|
35 |
//Some validations
|
58 |
jQuery("#insert").hide();
|
59 |
jQuery("#insert_loading").fadeIn();
|
60 |
|
61 |
+
jQuery.post(prliTinymceL10n.ajaxurl, data, function(response) {
|
62 |
var trimmed_data = response.replace(/^\s+|\s+$/g, ''); //Trim whitespace
|
63 |
|
64 |
if(trimmed_data == 'true') {
|
65 |
var output = '';
|
66 |
+
var pretty_link = prliTinymceL10n.home_url + slug;
|
67 |
|
68 |
//Set the link text to the link itself
|
69 |
if(link_text.length === 0) {
|
144 |
//Add a small delay so that prli_selected_text will be avaiable
|
145 |
setTimeout(function() {
|
146 |
//Nothing selected
|
147 |
+
if(prliTinymceL10n.prli_selected_text.length === 0) {
|
148 |
$("#prli_insert_link_link_text").val("Click Here");
|
149 |
$("#existing_link_link_text").val("Click Here");
|
150 |
}
|
151 |
//If selected text is a link, make it the target URL
|
152 |
+
else if(prliTinymceL10n.prli_selected_text.match(/https?:\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/)) {
|
153 |
+
$("#prli_insert_link_target").val(prliTinymceL10n.prli_selected_text);
|
154 |
$("#prli_insert_link_link_text").val("Click Here");
|
155 |
$("#existing_link_link_text").val("Click Here");
|
156 |
//Show selected text
|
157 |
} else {
|
158 |
+
$("#prli_insert_link_link_text").val(prliTinymceL10n.prli_selected_text);
|
159 |
+
$("#existing_link_link_text").val(prliTinymceL10n.prli_selected_text);
|
160 |
}
|
161 |
}, 200); //200ms
|
162 |
|
177 |
$("#prlitinymce-bad-slug").hide();
|
178 |
$("#prlitinymce-thinking").show();
|
179 |
|
180 |
+
$.post(prliTinymceL10n.ajaxurl, data, function(response) {
|
181 |
var trimmed_data = response.replace(/^\s+|\s+$/g, ''); //Trim whitespace
|
182 |
|
183 |
if(trimmed_data == 'true') {
|
222 |
|
223 |
//Load the autocomplete stuff
|
224 |
$('#prli_search_box').autocomplete({
|
225 |
+
source: prliTinymceL10n.ajaxurl + "?action=prli_search_for_links",
|
226 |
minLength: 2,
|
227 |
select: function(event, ui) {
|
228 |
$("#existing_link_target").html(ui.item.target);
|
229 |
$("#existing_link_nofollow").val(ui.item.nofollow);
|
230 |
+
$("#existing_link_slug").html(prliTinymceL10n.home_url + ui.item.slug);
|
231 |
}
|
232 |
});
|
233 |
});
|
js/vendor/jquery.form-validator.min.js
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/** File generated by Grunt -- do not modify
|
2 |
+
* JQUERY-FORM-VALIDATOR
|
3 |
+
*
|
4 |
+
* @version 2.3.79
|
5 |
+
* @website http://formvalidator.net/
|
6 |
+
* @author Victor Jonsson, http://victorjonsson.se
|
7 |
+
* @license MIT
|
8 |
+
*/
|
9 |
+
!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a,b,c){function d(a,b){this.$form=a,this.$input=b,this.reset(),b.on("change paste",this.reset.bind(this))}var e=function(){return!1},f=null,g={numHalted:0,haltValidation:function(b){this.numHalted++,a.formUtils.haltValidation=!0,b.unbind("submit",e).bind("submit",e).find('*[type="submit"]').addClass("disabled").attr("disabled","disabled")},unHaltValidation:function(b){this.numHalted--,0===this.numHalted&&(a.formUtils.haltValidation=!1,b.unbind("submit",e).find('*[type="submit"]').removeClass("disabled").removeAttr("disabled","disabled"))}};d.prototype.reset=function(){this.haltedFormValidation=!1,this.hasRun=!1,this.isRunning=!1,this.result=c},d.prototype.run=function(a,b){return"keyup"===a?null:this.isRunning?(f=a,this.haltedFormValidation||(g.haltValidation(),this.haltedFormValidation=!0),null):this.hasRun?this.result:(f=a,g.haltValidation(this.$form),this.haltedFormValidation=!0,this.isRunning=!0,this.$input.attr("disabled","disabled").addClass("async-validation"),this.$form.addClass("async-validation"),b(function(a){this.done(a)}.bind(this)),null)},d.prototype.done=function(a){this.result=a,this.hasRun=!0,this.isRunning=!1,this.$input.removeAttr("disabled").removeClass("async-validation"),this.$form.removeClass("async-validation"),this.haltedFormValidation&&(g.unHaltValidation(this.$form),"submit"===f?this.$form.trigger("submit"):this.$input.trigger("validation.revalidate"))},d.loadInstance=function(a,b,c){var e,f=b.get(0);return f.asyncValidators||(f.asyncValidators={}),f.asyncValidators[a]?e=f.asyncValidators[a]:(e=new d(c,b),f.asyncValidators[a]=e),e},a.formUtils=a.extend(a.formUtils||{},{asyncValidation:function(a,b,c){return this.warn("Use of deprecated function $.formUtils.asyncValidation, use $.formUtils.addAsyncValidator() instead"),d.loadInstance(a,b,c)},addAsyncValidator:function(b){var c=a.extend({},b),e=c.validatorFunction;c.async=!0,c.validatorFunction=function(a,b,f,g,h,i){var j=d.loadInstance(this.name,b,h);return j.run(i,function(d){e.apply(c,[d,a,b,f,g,h,i])})},this.addValidator(c)}}),a(b).bind("validatorsLoaded formValidationSetup",function(b,c){c||(c=a("form")),c.find("[data-validation]").each(function(){var b=a(this);b.valAttr("async",!1),a.each(a.split(b.attr("data-validation")),function(c,d){var e=a.formUtils.validators["validate_"+d];e&&e.async&&b.valAttr("async","yes")})})})}(a,window),function(a,b){"use strict";function c(b){b&&"custom"===b.errorMessagePosition&&"function"==typeof b.errorMessageCustom&&(a.formUtils.warn("Use of deprecated function errorMessageCustom, use config.submitErrorMessageCallback instead"),b.submitErrorMessageCallback=function(a,c){b.errorMessageCustom(a,b.language.errorTitle,c,b)})}function d(b){if(b.errorMessagePosition&&"object"==typeof b.errorMessagePosition){a.formUtils.warn("Deprecated use of config parameter errorMessagePosition, use config.submitErrorMessageCallback instead");var c=b.errorMessagePosition;b.errorMessagePosition="top",b.submitErrorMessageCallback=function(){return c}}}function e(b){var c=b.find("[data-validation-if-checked]");c.length&&a.formUtils.warn('Detected use of attribute "data-validation-if-checked" which is deprecated. Use "data-validation-depends-on" provided by module "logic"'),c.on("beforeValidation",function(){var c=a(this),d=c.valAttr("if-checked"),e=a('input[name="'+d+'"]',b),f=e.is(":checked"),g=(a.formUtils.getValue(e)||"").toString(),h=c.valAttr("if-checked-value");(!f||h&&h!==g)&&c.valAttr("skipped",!0)})}function f(b){var c={se:"sv",cz:"cs",dk:"da"};if(b.lang in c){var d=c[b.lang];a.formUtils.warn('Deprecated use of lang code "'+b.lang+'" use "'+d+'" instead'),b.lang=d}}a.fn.validateForm=function(b,c){return a.formUtils.warn("Use of deprecated function $.validateForm, use $.isValid instead"),this.isValid(b,c,!0)},a(window).on("formValidationPluginInit",function(a,b){f(b),c(b),d(b)}).on("validatorsLoaded formValidationSetup",function(b,c){c||(c=a("form")),e(c)})}(a),function(a){"use strict";var b={resolveErrorMessage:function(a,b,c,d,e){var f=d.validationErrorMsgAttribute+"-"+c.replace("validate_",""),g=a.attr(f);return g||(g=a.attr(d.validationErrorMsgAttribute),g||(g="function"!=typeof b.errorMessageKey?e[b.errorMessageKey]:e[b.errorMessageKey(d)],g||(g=b.errorMessage))),g},getParentContainer:function(b){if(b.valAttr("error-msg-container"))return a(b.valAttr("error-msg-container"));var c=b.parent();return"checkbox"===b.attr("type")&&b.closest(".checkbox").length?c=b.closest(".checkbox").parent():"radio"===b.attr("type")&&b.closest(".radio").length&&(c=b.closest(".radio").parent()),c.closest(".input-group").length&&(c=c.closest(".input-group").parent()),c},applyInputErrorStyling:function(a,b){a.addClass(b.errorElementClass).removeClass(b.successElementClass),this.getParentContainer(a).addClass(b.inputParentClassOnError).removeClass(b.inputParentClassOnSuccess),""!==b.borderColorOnError&&a.css("border-color",b.borderColorOnError)},applyInputSuccessStyling:function(a,b){a.addClass(b.successElementClass),this.getParentContainer(a).addClass(b.inputParentClassOnSuccess)},removeInputStylingAndMessage:function(a,c){a.removeClass(c.successElementClass).removeClass(c.errorElementClass).css("border-color","");var d=b.getParentContainer(a);if(d.removeClass(c.inputParentClassOnError).removeClass(c.inputParentClassOnSuccess),"function"==typeof c.inlineErrorMessageCallback){var e=c.inlineErrorMessageCallback(a,!1,c);e&&e.html("")}else d.find("."+c.errorMessageClass).remove()},removeAllMessagesAndStyling:function(c,d){if("function"==typeof d.submitErrorMessageCallback){var e=d.submitErrorMessageCallback(c,!1,d);e&&e.html("")}else c.find("."+d.errorMessageClass+".alert").remove();c.find("."+d.errorElementClass+",."+d.successElementClass).each(function(){b.removeInputStylingAndMessage(a(this),d)})},setInlineMessage:function(b,c,d){this.applyInputErrorStyling(b,d);var e,f=document.getElementById(b.attr("name")+"_err_msg"),g=!1,h=function(d){a.formUtils.$win.trigger("validationErrorDisplay",[b,d]),d.html(c)},i=function(){var f=!1;g.find("."+d.errorMessageClass).each(function(){if(this.inputReferer===b[0])return f=a(this),!1}),f?c?h(f):f.remove():""!==c&&(e=a('<div class="'+d.errorMessageClass+' alert"></div>'),h(e),e[0].inputReferer=b[0],g.prepend(e))};if(f)a.formUtils.warn("Using deprecated element reference "+f.id),g=a(f),i();else if("function"==typeof d.inlineErrorMessageCallback){if(g=d.inlineErrorMessageCallback(b,c,d),!g)return;i()}else{var j=this.getParentContainer(b);e=j.find("."+d.errorMessageClass+".help-block"),0===e.length&&(e=a("<span></span>").addClass("help-block").addClass(d.errorMessageClass),e.appendTo(j)),h(e)}},setMessageInTopOfForm:function(b,c,d,e){var f='<div class="{errorMessageClass} alert alert-danger"><strong>{errorTitle}</strong><ul>{fields}</ul></div>',g=!1;if("function"!=typeof d.submitErrorMessageCallback||(g=d.submitErrorMessageCallback(b,c,d))){var h={errorTitle:e.errorTitle,fields:"",errorMessageClass:d.errorMessageClass};a.each(c,function(a,b){h.fields+="<li>"+b+"</li>"}),a.each(h,function(a,b){f=f.replace("{"+a+"}",b)}),g?g.html(f):b.children().eq(0).before(a(f))}}};a.formUtils=a.extend(a.formUtils||{},{dialogs:b})}(a),function(a,b,c){"use strict";var d=0;a.fn.validateOnBlur=function(b,c){var d=this,e=this.find("*[data-validation]");return e.each(function(){var e=a(this);if(e.is("[type=radio]")){var f=d.find('[type=radio][name="'+e.attr("name")+'"]');f.bind("blur.validation",function(){e.validateInputOnBlur(b,c,!0,"blur")}),c.validateCheckboxRadioOnClick&&f.bind("click.validation",function(){e.validateInputOnBlur(b,c,!0,"click")})}}),e.bind("blur.validation",function(){a(this).validateInputOnBlur(b,c,!0,"blur")}),c.validateCheckboxRadioOnClick&&this.find("input[type=checkbox][data-validation],input[type=radio][data-validation]").bind("click.validation",function(){a(this).validateInputOnBlur(b,c,!0,"click")}),this},a.fn.validateOnEvent=function(b,c){if(0!==this.length){var d="FORM"===this[0].nodeName?this.find("*[data-validation-event]"):this;return d.each(function(){var d=a(this),e=d.valAttr("event");e&&d.unbind(e+".validation").bind(e+".validation",function(d){9!==(d||{}).keyCode&&a(this).validateInputOnBlur(b,c,!0,e)})}),this}},a.fn.showHelpOnFocus=function(b){return b||(b="data-validation-help"),this.find("textarea,input").each(function(){var c=a(this),e="jquery_form_help_"+ ++d,f=c.attr(b);c.removeClass("has-help-text").unbind("focus.help").unbind("blur.help"),f&&c.addClass("has-help-txt").bind("focus.help",function(){var b=c.parent().find("."+e);0===b.length&&(b=a("<span />").addClass(e).addClass("help").addClass("help-block").text(f).hide(),c.after(b)),b.fadeIn()}).bind("blur.help",function(){a(this).parent().find("."+e).fadeOut("slow")})}),this},a.fn.validate=function(b,c,d){var e=a.extend({},a.formUtils.LANG,d||{});this.each(function(){var d=a(this),f=d.closest("form").get(0)||{},g=f.validationConfig||a.formUtils.defaultConfig();d.one("validation",function(a,c){"function"==typeof b&&b(c,this,a)}),d.validateInputOnBlur(e,a.extend({},g,c||{}),!0)})},a.fn.willPostponeValidation=function(){return(this.valAttr("suggestion-nr")||this.valAttr("postpone")||this.hasClass("hasDatepicker"))&&!b.postponedValidation},a.fn.validateInputOnBlur=function(c,d,e,f){if(a.formUtils.eventType=f,this.willPostponeValidation()){var g=this,h=this.valAttr("postpone")||200;return b.postponedValidation=function(){g.validateInputOnBlur(c,d,e,f),b.postponedValidation=!1},setTimeout(function(){b.postponedValidation&&b.postponedValidation()},h),this}c=a.extend({},a.formUtils.LANG,c||{}),a.formUtils.dialogs.removeInputStylingAndMessage(this,d);var i=this,j=i.closest("form"),k=a.formUtils.validateInput(i,c,d,j,f),l=function(){i.validateInputOnBlur(c,d,!1,"blur.revalidated")};return"blur"===f&&i.unbind("validation.revalidate",l).one("validation.revalidate",l),e&&i.removeKeyUpValidation(),k.shouldChangeDisplay&&(k.isValid?a.formUtils.dialogs.applyInputSuccessStyling(i,d):a.formUtils.dialogs.setInlineMessage(i,k.errorMsg,d)),!k.isValid&&e&&i.validateOnKeyUp(c,d),this},a.fn.validateOnKeyUp=function(b,c){return this.each(function(){var d=a(this);d.valAttr("has-keyup-event")||d.valAttr("has-keyup-event","true").bind("keyup.validation",function(a){9!==a.keyCode&&d.validateInputOnBlur(b,c,!1,"keyup")})}),this},a.fn.removeKeyUpValidation=function(){return this.each(function(){a(this).valAttr("has-keyup-event",!1).unbind("keyup.validation")}),this},a.fn.valAttr=function(a,b){return b===c?this.attr("data-validation-"+a):b===!1||null===b?this.removeAttr("data-validation-"+a):(a=a.length>0?"-"+a:"",this.attr("data-validation"+a,b))},a.fn.isValid=function(b,c,d){if(a.formUtils.isLoadingModules){var e=this;return setTimeout(function(){e.isValid(b,c,d)},200),null}c=a.extend({},a.formUtils.defaultConfig(),c||{}),b=a.extend({},a.formUtils.LANG,b||{}),d=d!==!1,a.formUtils.errorDisplayPreventedWhenHalted&&(delete a.formUtils.errorDisplayPreventedWhenHalted,d=!1);var f=function(b,e){a.inArray(b,h)<0&&h.push(b),i.push(e),e.valAttr("current-error",b),d&&a.formUtils.dialogs.applyInputErrorStyling(e,c)},g=[],h=[],i=[],j=this,k=function(b,d){return"submit"===d||"button"===d||"reset"===d||a.inArray(b,c.ignore||[])>-1};if(d&&a.formUtils.dialogs.removeAllMessagesAndStyling(j,c),j.find("input,textarea,select").filter(':not([type="submit"],[type="button"])').each(function(){var d=a(this),e=d.attr("type"),h="radio"===e||"checkbox"===e,i=d.attr("name");if(!k(i,e)&&(!h||a.inArray(i,g)<0)){h&&g.push(i);var l=a.formUtils.validateInput(d,b,c,j,"submit");l.isValid?l.isValid&&l.shouldChangeDisplay&&(d.valAttr("current-error",!1),a.formUtils.dialogs.applyInputSuccessStyling(d,c)):f(l.errorMsg,d)}}),"function"==typeof c.onValidate){var l=c.onValidate(j);a.isArray(l)?a.each(l,function(a,b){f(b.message,b.element)}):l&&l.element&&l.message&&f(l.message,l.element)}return a.formUtils.isValidatingEntireForm=!1,i.length>0&&d&&("top"===c.errorMessagePosition?a.formUtils.dialogs.setMessageInTopOfForm(j,h,c,b):a.each(i,function(b,d){a.formUtils.dialogs.setInlineMessage(d,d.valAttr("current-error"),c)}),c.scrollToTopOnError&&a.formUtils.$win.scrollTop(j.offset().top-20)),!d&&a.formUtils.haltValidation&&(a.formUtils.errorDisplayPreventedWhenHalted=!0),0===i.length&&!a.formUtils.haltValidation},a.fn.restrictLength=function(b){return new a.formUtils.lengthRestriction(this,b),this},a.fn.addSuggestions=function(b){var c=!1;return this.find("input").each(function(){var d=a(this);c=a.split(d.attr("data-suggestions")),c.length>0&&!d.hasClass("has-suggestions")&&(a.formUtils.suggest(d,c,b),d.addClass("has-suggestions"))}),this}}(a,window),function(a){"use strict";a.formUtils=a.extend(a.formUtils||{},{isLoadingModules:!1,loadedModules:{},registerLoadedModule:function(b){this.loadedModules[a.trim(b).toLowerCase()]=!0},hasLoadedModule:function(b){return a.trim(b).toLowerCase()in this.loadedModules},loadModules:function(b,c,d){if(a.formUtils.isLoadingModules)return void setTimeout(function(){a.formUtils.loadModules(b,c,d)},100);var e=function(b,c){var e=a.split(b),f=e.length,g=function(){f--,0===f&&(a.formUtils.isLoadingModules=!1,"function"==typeof d&&d())};f>0&&(a.formUtils.isLoadingModules=!0);var h="?_="+(new Date).getTime(),i=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0];a.each(e,function(b,d){if(d=a.trim(d),0===d.length||a.formUtils.hasLoadedModule(d))g();else{var e=c+d+(".js"===d.slice(-3)?"":".js"),f=document.createElement("SCRIPT");"function"==typeof define&&define.amd?require([e+(".dev.js"===e.slice(-7)?h:"")],g):(f.type="text/javascript",f.onload=g,f.src=e+(".dev.js"===e.slice(-7)?h:""),f.onerror=function(){a.formUtils.warn("Unable to load form validation module "+e,!0),g()},f.onreadystatechange=function(){"complete"!==this.readyState&&"loaded"!==this.readyState||(g(),this.onload=null,this.onreadystatechange=null)},i.appendChild(f))}})};if(c)e(b,c);else{var f=function(){var c=!1;return a('script[src*="form-validator"]').each(function(){var a=this.src.split("form-validator")[1].split("node_modules").length>1;if(!a)return c=this.src.substr(0,this.src.lastIndexOf("/"))+"/","/"===c&&(c=""),!1}),c!==!1&&(e(b,c),!0)};f()||a(function(){var a=f();a||"function"==typeof d&&d()})}}})}(a),function(a){"use strict";a.split=function(b,c,d){d=void 0===d||d===!0;var e="[,|"+(d?"\\s":"")+"-]\\s*",f=new RegExp(e,"g");if("function"!=typeof c){if(!b)return[];var g=[];return a.each(b.split(c?c:f),function(b,c){c=a.trim(c),c.length&&g.push(c)}),g}b&&a.each(b.split(f),function(b,d){if(d=a.trim(d),d.length)return c(d,b)})},a.validate=function(b){var c=a.extend(a.formUtils.defaultConfig(),{form:"form",validateOnEvent:!1,validateOnBlur:!0,validateCheckboxRadioOnClick:!0,showHelpOnFocus:!0,addSuggestions:!0,modules:"",onModulesLoaded:null,language:!1,onSuccess:!1,onError:!1,onElementValidate:!1});if(b=a.extend(c,b||{}),a(window).trigger("formValidationPluginInit",[b]),b.lang&&"en"!==b.lang){var d="lang/"+b.lang+".js";b.modules+=b.modules.length?","+d:d}a(b.form).each(function(c,d){d.validationConfig=b;var e=a(d);e.trigger("formValidationSetup",[e,b]),e.find(".has-help-txt").unbind("focus.validation").unbind("blur.validation"),e.removeClass("has-validation-callback").unbind("submit.validation").unbind("reset.validation").find("input[data-validation],textarea[data-validation]").unbind("blur.validation"),e.bind("submit.validation",function(c){var d=a(this),e=function(){return c.stopImmediatePropagation(),!1};if(a.formUtils.haltValidation)return e();if(a.formUtils.isLoadingModules)return setTimeout(function(){d.trigger("submit.validation")},200),e();var f=d.isValid(b.language,b);if(a.formUtils.haltValidation)return e();if(!f||"function"!=typeof b.onSuccess)return f||"function"!=typeof b.onError?!!f||e():(b.onError(d),e());var g=b.onSuccess(d);return g===!1?e():void 0}).bind("reset.validation",function(){a.formUtils.dialogs.removeAllMessagesAndStyling(e,b)}).addClass("has-validation-callback"),b.showHelpOnFocus&&e.showHelpOnFocus(),b.addSuggestions&&e.addSuggestions(),b.validateOnBlur&&(e.validateOnBlur(b.language,b),e.bind("html5ValidationAttrsFound",function(){e.validateOnBlur(b.language,b)})),b.validateOnEvent&&e.validateOnEvent(b.language,b)}),""!==b.modules&&a.formUtils.loadModules(b.modules,null,function(){"function"==typeof b.onModulesLoaded&&b.onModulesLoaded();var c="string"==typeof b.form?a(b.form):b.form;a.formUtils.$win.trigger("validatorsLoaded",[c,b])})}}(a),function(a,b){"use strict";var c=a(b);a.formUtils=a.extend(a.formUtils||{},{$win:c,defaultConfig:function(){return{ignore:[],errorElementClass:"error",successElementClass:"valid",borderColorOnError:"#b94a48",errorMessageClass:"form-error",validationRuleAttribute:"data-validation",validationErrorMsgAttribute:"data-validation-error-msg",errorMessagePosition:"inline",errorMessageTemplate:{container:'<div class="{errorMessageClass} alert alert-danger">{messages}</div>',messages:"<strong>{errorTitle}</strong><ul>{fields}</ul>",field:"<li>{msg}</li>"},scrollToTopOnError:!0,dateFormat:"yyyy-mm-dd",addValidClassOnAll:!1,decimalSeparator:".",inputParentClassOnError:"has-error",inputParentClassOnSuccess:"has-success",validateHiddenInputs:!1,inlineErrorMessageCallback:!1,submitErrorMessageCallback:!1}},validators:{},sanitizers:{},_events:{load:[],valid:[],invalid:[]},haltValidation:!1,addValidator:function(a){var b=0===a.name.indexOf("validate_")?a.name:"validate_"+a.name;void 0===a.validateOnKeyUp&&(a.validateOnKeyUp=!0),this.validators[b]=a},addSanitizer:function(a){this.sanitizers[a.name]=a},warn:function(a,c){"console"in b?"function"==typeof b.console.warn?b.console.warn(a):"function"==typeof b.console.log&&b.console.log(a):c&&alert(a)},getValue:function(a,b){var c=b?b.find(a):a;if(c.length>0){var d=c.eq(0).attr("type");return"radio"===d||"checkbox"===d?c.filter(":checked").val()||"":c.val()||""}return!1},validateInput:function(b,c,d,e,f){d=d||a.formUtils.defaultConfig(),c=c||a.formUtils.LANG,e.length||(e=b.parent());var g=this.getValue(b);b.valAttr("skipped",!1).one("beforeValidation",function(){(b.attr("disabled")||!b.is(":visible")&&!d.validateHiddenInputs)&&b.valAttr("skipped",1)}).trigger("beforeValidation",[g,c,d]);var h="true"===b.valAttr("optional"),i=!g&&h,j=b.attr(d.validationRuleAttribute),k=!0,l="",m={isValid:!0,shouldChangeDisplay:!0,errorMsg:""};if(!j||i||b.valAttr("skipped"))return m.shouldChangeDisplay=d.addValidClassOnAll,m;var n=b.valAttr("ignore");return n&&a.each(n.split(""),function(a,b){g=g.replace(new RegExp("\\"+b,"g"),"")}),a.split(j,function(h){0!==h.indexOf("validate_")&&(h="validate_"+h);var i=a.formUtils.validators[h];if(!i)throw new Error('Using undefined validator "'+h+'". Maybe you have forgotten to load the module that "'+h+'" belongs to?');if("validate_checkbox_group"===h&&(b=e.find('[name="'+b.attr("name")+'"]:eq(0)')),("keyup"!==f||i.validateOnKeyUp)&&(k=i.validatorFunction(g,b,d,c,e,f)),!k)return d.validateOnBlur&&b.validateOnKeyUp(c,d),l=a.formUtils.dialogs.resolveErrorMessage(b,i,h,d,c),!1}),k===!1?(b.trigger("validation",!1),m.errorMsg=l,m.isValid=!1,m.shouldChangeDisplay=!0):null===k?m.shouldChangeDisplay=!1:(b.trigger("validation",!0),m.shouldChangeDisplay=!0),"function"==typeof d.onElementValidate&&null!==l&&d.onElementValidate(m.isValid,b,e,l),b.trigger("afterValidation",[m,f]),m},parseDate:function(b,c,d){var e,f,g,h,i=c.replace(/[a-zA-Z]/gi,"").substring(0,1),j="^",k=c.split(i||null);if(a.each(k,function(a,b){j+=(a>0?"\\"+i:"")+"(\\d{"+b.length+"})"}),j+="$",d){var l=[];a.each(b.split(i),function(a,b){1===b.length&&(b="0"+b),l.push(b)}),b=l.join(i)}if(e=b.match(new RegExp(j)),null===e)return!1;var m=function(b,c,d){for(var e=0;e<c.length;e++)if(c[e].substring(0,1)===b)return a.formUtils.parseDateInt(d[e+1]);return-1};return g=m("m",k,e),f=m("d",k,e),h=m("y",k,e),!(2===g&&f>28&&(h%4!==0||h%100===0&&h%400!==0)||2===g&&f>29&&(h%4===0||h%100!==0&&h%400===0)||g>12||0===g)&&(!(this.isShortMonth(g)&&f>30||!this.isShortMonth(g)&&f>31||0===f)&&[h,g,f])},parseDateInt:function(a){return 0===a.indexOf("0")&&(a=a.replace("0","")),parseInt(a,10)},isShortMonth:function(a){return a%2===0&&a<7||a%2!==0&&a>7},lengthRestriction:function(b,c){var d=parseInt(c.text(),10),e=0,f=function(){var a=b.val().length;if(a>d){var f=b.scrollTop();b.val(b.val().substring(0,d)),b.scrollTop(f)}e=d-a,e<0&&(e=0),c.text(e)};a(b).bind("keydown keyup keypress focus blur",f).bind("cut paste",function(){setTimeout(f,100)}),a(document).bind("ready",f)},numericRangeCheck:function(b,c){var d=a.split(c),e=parseInt(c.substr(3),10);return 1===d.length&&c.indexOf("min")===-1&&c.indexOf("max")===-1&&(d=[c,c]),2===d.length&&(b<parseInt(d[0],10)||b>parseInt(d[1],10))?["out",d[0],d[1]]:0===c.indexOf("min")&&b<e?["min",e]:0===c.indexOf("max")&&b>e?["max",e]:["ok"]},_numSuggestionElements:0,_selectedSuggestion:null,_previousTypedVal:null,suggest:function(b,d,e){var f={css:{maxHeight:"150px",background:"#FFF",lineHeight:"150%",textDecoration:"underline",overflowX:"hidden",overflowY:"auto",border:"#CCC solid 1px",borderTop:"none",cursor:"pointer"},activeSuggestionCSS:{background:"#E9E9E9"}},g=function(a,b){var c=b.offset();a.css({width:b.outerWidth(),left:c.left+"px",top:c.top+b.outerHeight()+"px"})};e&&a.extend(f,e),f.css.position="absolute",f.css["z-index"]=9999,b.attr("autocomplete","off"),0===this._numSuggestionElements&&c.bind("resize",function(){a(".jquery-form-suggestions").each(function(){var b=a(this),c=b.attr("data-suggest-container");g(b,a(".suggestions-"+c).eq(0))})}),this._numSuggestionElements++;var h=function(b){var c=b.valAttr("suggestion-nr");a.formUtils._selectedSuggestion=null,a.formUtils._previousTypedVal=null,a(".jquery-form-suggestion-"+c).fadeOut("fast")};return b.data("suggestions",d).valAttr("suggestion-nr",this._numSuggestionElements).unbind("focus.suggest").bind("focus.suggest",function(){a(this).trigger("keyup"),a.formUtils._selectedSuggestion=null}).unbind("keyup.suggest").bind("keyup.suggest",function(){var c=a(this),d=[],e=a.trim(c.val()).toLocaleLowerCase();if(e!==a.formUtils._previousTypedVal){a.formUtils._previousTypedVal=e;var i=!1,j=c.valAttr("suggestion-nr"),k=a(".jquery-form-suggestion-"+j);if(k.scrollTop(0),""!==e){var l=e.length>2;a.each(c.data("suggestions"),function(a,b){var c=b.toLocaleLowerCase();return c===e?(d.push("<strong>"+b+"</strong>"),i=!0,!1):void((0===c.indexOf(e)||l&&c.indexOf(e)>-1)&&d.push(b.replace(new RegExp(e,"gi"),"<strong>$&</strong>")))})}i||0===d.length&&k.length>0?k.hide():d.length>0&&0===k.length?(k=a("<div></div>").css(f.css).appendTo("body"),b.addClass("suggestions-"+j),k.attr("data-suggest-container",j).addClass("jquery-form-suggestions").addClass("jquery-form-suggestion-"+j)):d.length>0&&!k.is(":visible")&&k.show(),d.length>0&&e.length!==d[0].length&&(g(k,c),k.html(""),a.each(d,function(b,d){a("<div></div>").append(d).css({overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",padding:"5px"}).addClass("form-suggest-element").appendTo(k).click(function(){c.focus(),c.val(a(this).text()),c.trigger("change"),h(c)})}))}}).unbind("keydown.validation").bind("keydown.validation",function(b){var c,d,e=b.keyCode?b.keyCode:b.which,g=a(this);if(13===e&&null!==a.formUtils._selectedSuggestion){if(c=g.valAttr("suggestion-nr"),d=a(".jquery-form-suggestion-"+c),d.length>0){var i=d.find("div").eq(a.formUtils._selectedSuggestion).text();g.val(i),g.trigger("change"),h(g),b.preventDefault()}}else{c=g.valAttr("suggestion-nr"),d=a(".jquery-form-suggestion-"+c);var j=d.children();if(j.length>0&&a.inArray(e,[38,40])>-1){38===e?(null===a.formUtils._selectedSuggestion?a.formUtils._selectedSuggestion=j.length-1:a.formUtils._selectedSuggestion--,a.formUtils._selectedSuggestion<0&&(a.formUtils._selectedSuggestion=j.length-1)):40===e&&(null===a.formUtils._selectedSuggestion?a.formUtils._selectedSuggestion=0:a.formUtils._selectedSuggestion++,a.formUtils._selectedSuggestion>j.length-1&&(a.formUtils._selectedSuggestion=0));var k=d.innerHeight(),l=d.scrollTop(),m=d.children().eq(0).outerHeight(),n=m*a.formUtils._selectedSuggestion;return(n<l||n>l+k)&&d.scrollTop(n),j.removeClass("active-suggestion").css("background","none").eq(a.formUtils._selectedSuggestion).addClass("active-suggestion").css(f.activeSuggestionCSS),b.preventDefault(),!1}}}).unbind("blur.suggest").bind("blur.suggest",function(){h(a(this))}),b},LANG:{errorTitle:"Form submission failed!",requiredField:"This is a required field",requiredFields:"You have not answered all required fields",badTime:"You have not given a correct time",badEmail:"You have not given a correct e-mail address",badTelephone:"You have not given a correct phone number",badSecurityAnswer:"You have not given a correct answer to the security question",badDate:"You have not given a correct date",lengthBadStart:"The input value must be between ",lengthBadEnd:" characters",lengthTooLongStart:"The input value is longer than ",lengthTooShortStart:"The input value is shorter than ",notConfirmed:"Input values could not be confirmed",badDomain:"Incorrect domain value",badUrl:"The input value is not a correct URL",badCustomVal:"The input value is incorrect",andSpaces:" and spaces ",badInt:"The input value was not a correct number",badSecurityNumber:"Your social security number was incorrect",badUKVatAnswer:"Incorrect UK VAT Number",badUKNin:"Incorrect UK NIN",badUKUtr:"Incorrect UK UTR Number",badStrength:"The password isn't strong enough",badNumberOfSelectedOptionsStart:"You have to choose at least ",badNumberOfSelectedOptionsEnd:" answers",badAlphaNumeric:"The input value can only contain alphanumeric characters ",badAlphaNumericExtra:" and ",wrongFileSize:"The file you are trying to upload is too large (max %s)",wrongFileType:"Only files of type %s is allowed",groupCheckedRangeStart:"Please choose between ",groupCheckedTooFewStart:"Please choose at least ",groupCheckedTooManyStart:"Please choose a maximum of ",groupCheckedEnd:" item(s)",badCreditCard:"The credit card number is not correct",badCVV:"The CVV number was not correct",wrongFileDim:"Incorrect image dimensions,",imageTooTall:"the image can not be taller than",imageTooWide:"the image can not be wider than",imageTooSmall:"the image was too small",min:"min",max:"max",imageRatioNotAccepted:"Image ratio is not be accepted",badBrazilTelephoneAnswer:"The phone number entered is invalid",badBrazilCEPAnswer:"The CEP entered is invalid",badBrazilCPFAnswer:"The CPF entered is invalid",badPlPesel:"The PESEL entered is invalid",badPlNip:"The NIP entered is invalid",badPlRegon:"The REGON entered is invalid",badreCaptcha:"Please confirm that you are not a bot",passwordComplexityStart:"Password must contain at least ",passwordComplexitySeparator:", ",passwordComplexityUppercaseInfo:" uppercase letter(s)",passwordComplexityLowercaseInfo:" lowercase letter(s)",passwordComplexitySpecialCharsInfo:" special character(s)",passwordComplexityNumericCharsInfo:" numeric character(s)",passwordComplexityEnd:"."}})}(a,window),function(a){a.formUtils.addValidator({name:"email",validatorFunction:function(b){var c=b.toLowerCase().split("@"),d=c[0],e=c[1];if(d&&e){if(0===d.indexOf('"')){var f=d.length;if(d=d.replace(/\"/g,""),d.length!==f-2)return!1}return a.formUtils.validators.validate_domain.validatorFunction(c[1])&&0!==d.indexOf(".")&&"."!==d.substring(d.length-1,d.length)&&d.indexOf("..")===-1&&!/[^\w\+\.\-\#\-\_\~\!\$\&\'\(\)\*\+\,\;\=\:]/.test(d)}return!1},errorMessage:"",errorMessageKey:"badEmail"}),a.formUtils.addValidator({name:"domain",validatorFunction:function(a){return a.length>0&&a.length<=253&&!/[^a-zA-Z0-9]/.test(a.slice(-2))&&!/[^a-zA-Z0-9]/.test(a.substr(0,1))&&!/[^a-zA-Z0-9\.\-]/.test(a)&&1===a.split("..").length&&a.split(".").length>1},errorMessage:"",errorMessageKey:"badDomain"}),a.formUtils.addValidator({name:"required",validatorFunction:function(b,c,d,e,f){switch(c.attr("type")){case"checkbox":return c.is(":checked");case"radio":return f.find('input[name="'+c.attr("name")+'"]').filter(":checked").length>0;default:return""!==a.trim(b)}},errorMessage:"",errorMessageKey:function(a){return"top"===a.errorMessagePosition||"function"==typeof a.errorMessagePosition?"requiredFields":"requiredField"}}),a.formUtils.addValidator({name:"length",validatorFunction:function(b,c,d,e){var f=c.valAttr("length"),g=c.attr("type");if(void 0===f)return alert('Please add attribute "data-validation-length" to '+c[0].nodeName+" named "+c.attr("name")),!0;var h,i="file"===g&&void 0!==c.get(0).files?c.get(0).files.length:b.length,j=a.formUtils.numericRangeCheck(i,f);switch(j[0]){case"out":this.errorMessage=e.lengthBadStart+f+e.lengthBadEnd,h=!1;break;case"min":this.errorMessage=e.lengthTooShortStart+j[1]+e.lengthBadEnd,h=!1;break;case"max":this.errorMessage=e.lengthTooLongStart+j[1]+e.lengthBadEnd,h=!1;break;default:h=!0}return h},errorMessage:"",errorMessageKey:""}),a.formUtils.addValidator({name:"url",validatorFunction:function(b){var c=/^(https?|ftp):\/\/((((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])(\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|\[|\]|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#(((\w|-|\.|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i;if(c.test(b)){var d=b.split("://")[1],e=d.indexOf("/");return e>-1&&(d=d.substr(0,e)),a.formUtils.validators.validate_domain.validatorFunction(d)}return!1},errorMessage:"",errorMessageKey:"badUrl"}),a.formUtils.addValidator({name:"number",validatorFunction:function(a,b,c){if(""!==a){var d,e,f=b.valAttr("allowing")||"",g=b.valAttr("decimal-separator")||c.decimalSeparator,h=!1,i=b.valAttr("step")||"",j=!1,k=b.attr("data-sanitize")||"",l=k.match(/(^|[\s])numberFormat([\s]|$)/i);if(l){if(!window.numeral)throw new ReferenceError("The data-sanitize value numberFormat cannot be used without the numeral library. Please see Data Validation in http://www.formvalidator.net for more information.");a.length&&(a=String(numeral().unformat(a)))}if(f.indexOf("number")===-1&&(f+=",number"),f.indexOf("negative")===-1&&0===a.indexOf("-"))return!1;if(f.indexOf("range")>-1&&(d=parseFloat(f.substring(f.indexOf("[")+1,f.indexOf(";"))),e=parseFloat(f.substring(f.indexOf(";")+1,f.indexOf("]"))),h=!0),""!==i&&(j=!0),","===g){if(a.indexOf(".")>-1)return!1;a=a.replace(",",".")}if(""===a.replace(/[0-9-]/g,"")&&(!h||a>=d&&a<=e)&&(!j||a%i===0))return!0;if(f.indexOf("float")>-1&&null!==a.match(new RegExp("^([0-9-]+)\\.([0-9]+)$"))&&(!h||a>=d&&a<=e)&&(!j||a%i===0))return!0}return!1},errorMessage:"",errorMessageKey:"badInt"}),a.formUtils.addValidator({name:"alphanumeric",validatorFunction:function(b,c,d,e){var f="^([a-zA-Z0-9",g="]+)$",h=c.valAttr("allowing"),i="",j=!1;if(h){i=f+h+g;var k=h.replace(/\\/g,"");k.indexOf(" ")>-1&&(j=!0,k=k.replace(" ",""),k+=e.andSpaces||a.formUtils.LANG.andSpaces),e.badAlphaNumericAndExtraAndSpaces&&e.badAlphaNumericAndExtra?j?this.errorMessage=e.badAlphaNumericAndExtraAndSpaces+k:this.errorMessage=e.badAlphaNumericAndExtra+k+e.badAlphaNumericExtra:this.errorMessage=e.badAlphaNumeric+e.badAlphaNumericExtra+k;
|
10 |
+
}else i=f+g,this.errorMessage=e.badAlphaNumeric;return new RegExp(i).test(b)},errorMessage:"",errorMessageKey:""}),a.formUtils.addValidator({name:"custom",validatorFunction:function(a,b){var c=new RegExp(b.valAttr("regexp"));return c.test(a)},errorMessage:"",errorMessageKey:"badCustomVal"}),a.formUtils.addValidator({name:"date",validatorFunction:function(b,c,d){var e=c.valAttr("format")||d.dateFormat||"yyyy-mm-dd",f="false"===c.valAttr("require-leading-zero");return a.formUtils.parseDate(b,e,f)!==!1},errorMessage:"",errorMessageKey:"badDate"}),a.formUtils.addValidator({name:"checkbox_group",validatorFunction:function(b,c,d,e,f){var g=!0,h=c.attr("name"),i=a('input[type=checkbox][name^="'+h+'"]',f),j=i.filter(":checked").length,k=c.valAttr("qty");if(void 0===k){var l=c.get(0).nodeName;alert('Attribute "data-validation-qty" is missing from '+l+" named "+c.attr("name"))}var m=a.formUtils.numericRangeCheck(j,k);switch(m[0]){case"out":this.errorMessage=e.groupCheckedRangeStart+k+e.groupCheckedEnd,g=!1;break;case"min":this.errorMessage=e.groupCheckedTooFewStart+m[1]+(e.groupCheckedTooFewEnd||e.groupCheckedEnd),g=!1;break;case"max":this.errorMessage=e.groupCheckedTooManyStart+m[1]+(e.groupCheckedTooManyEnd||e.groupCheckedEnd),g=!1;break;default:g=!0}if(!g){var n=function(){i.unbind("click",n),i.filter("*[data-validation]").validateInputOnBlur(e,d,!1,"blur")};i.bind("click",n)}return g}})}(a)});
|
pretty-link.php
CHANGED
@@ -3,11 +3,11 @@
|
|
3 |
Plugin Name: Pretty Links
|
4 |
Plugin URI: https://prettylinks.com/pl/plugin-uri
|
5 |
Description: Shrink, track and share any URL on the Internet from your WordPress website!
|
6 |
-
Version:
|
7 |
Author: Blair Williams
|
8 |
Author URI: http://blairwilliams.com
|
9 |
Text Domain: pretty-link
|
10 |
-
Copyright: 2004-
|
11 |
|
12 |
GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
|
13 |
This program is free software; you can redistribute it and/or modify
|
@@ -151,7 +151,7 @@ global $prli_options;
|
|
151 |
$prli_options = PrliOptions::get_options();
|
152 |
|
153 |
// i18n
|
154 |
-
add_action('
|
155 |
function prli_load_textdomain() {
|
156 |
$plugin_dir = basename(dirname(__FILE__));
|
157 |
load_plugin_textdomain('pretty-link', false, $plugin_dir.'/i18n/');
|
@@ -167,8 +167,8 @@ $prli_utils = new PrliUtils();
|
|
167 |
|
168 |
global $prli_db_version, $plp_db_version;
|
169 |
|
170 |
-
$prli_db_version =
|
171 |
-
$plp_db_version =
|
172 |
|
173 |
global $prli_app_controller;
|
174 |
|
3 |
Plugin Name: Pretty Links
|
4 |
Plugin URI: https://prettylinks.com/pl/plugin-uri
|
5 |
Description: Shrink, track and share any URL on the Internet from your WordPress website!
|
6 |
+
Version: 3.0.0
|
7 |
Author: Blair Williams
|
8 |
Author URI: http://blairwilliams.com
|
9 |
Text Domain: pretty-link
|
10 |
+
Copyright: 2004-2019, Caseproof, LLC
|
11 |
|
12 |
GNU General Public License, Free Software Foundation <http://creativecommons.org/licenses/GPL/2.0/>
|
13 |
This program is free software; you can redistribute it and/or modify
|
151 |
$prli_options = PrliOptions::get_options();
|
152 |
|
153 |
// i18n
|
154 |
+
add_action('plugins_loaded', 'prli_load_textdomain');
|
155 |
function prli_load_textdomain() {
|
156 |
$plugin_dir = basename(dirname(__FILE__));
|
157 |
load_plugin_textdomain('pretty-link', false, $plugin_dir.'/i18n/');
|
167 |
|
168 |
global $prli_db_version, $plp_db_version;
|
169 |
|
170 |
+
$prli_db_version = 21; // this is the version of the database we're moving to
|
171 |
+
$plp_db_version = 9; // this is the version of the database we're moving to
|
172 |
|
173 |
global $prli_app_controller;
|
174 |
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Donate link: https://prettylinks.com
|
|
4 |
Tags: links, link, url, urls, affiliate, affiliates, pretty, marketing, redirect, redirection, forward, plugin, twitter, tweet, rewrite, shorturl, hoplink, hop, shortlink, short, shorten, shortening, click, clicks, track, tracking, tiny, tinyurl, budurl, shrinking, domain, shrink, mask, masking, cloak, cloaking, slug, slugs, admin, administration, stats, statistics, stat, statistic, email, ajax, javascript, ui, csv, download, page, post, pages, posts, shortcode, seo, automation, widget, widgets, dashboard
|
5 |
Requires at least: 5.1
|
6 |
Tested up to: 5.2.2
|
7 |
-
Stable tag:
|
8 |
|
9 |
Shrink, beautify, track, manage and share any URL on or off of your WordPress website. Create links that look how you want using your own domain name!
|
10 |
|
@@ -14,7 +14,7 @@ Shrink, beautify, track, manage and share any URL on or off of your WordPress we
|
|
14 |
|
15 |
[Upgrade to Pretty Links Pro](https://prettylinks.com/why-upgrade/ "Upgrade to Pretty Links Pro")
|
16 |
|
17 |
-
*Pretty Links Pro* is a **significant upgrade** that adds many tools and redirection types that will allow you to create pretty links automatically, cloak links, replace keywords thoughout your blog with pretty links and much more. You can learn more about *Pretty Links Pro* here:
|
18 |
|
19 |
[Learn More](https://prettylinks.com/about "Learn More") | [Pricing](https://prettylinks.com/pricing/plans/ "Pricing")
|
20 |
|
@@ -51,7 +51,6 @@ http://blairwilliams.com/w7a
|
|
51 |
* Enables you to send your pretty links via Email directly from your WordPress admin
|
52 |
* Select Temporary (302 or 307) or Permanent (301) redirection for your pretty links
|
53 |
* Cookie based system for tracking visitor activity across clicks
|
54 |
-
* Organize Links into Groups
|
55 |
* Create nofollow/noindex links
|
56 |
* Turn tracking on / off on each link
|
57 |
* Pretty Links Bookmarklet
|
@@ -65,6 +64,17 @@ http://blairwilliams.com/w7a
|
|
65 |
3. Make sure you have changed your permalink Common Settings in Settings -> Permalinks away from "Default" to something else. I prefer using custom and then "/%year%/%month%/%postname%/" for the simplest possible URL slugs with the best performance.
|
66 |
|
67 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
68 |
= 2.1.10 =
|
69 |
* More security hardening
|
70 |
|
4 |
Tags: links, link, url, urls, affiliate, affiliates, pretty, marketing, redirect, redirection, forward, plugin, twitter, tweet, rewrite, shorturl, hoplink, hop, shortlink, short, shorten, shortening, click, clicks, track, tracking, tiny, tinyurl, budurl, shrinking, domain, shrink, mask, masking, cloak, cloaking, slug, slugs, admin, administration, stats, statistics, stat, statistic, email, ajax, javascript, ui, csv, download, page, post, pages, posts, shortcode, seo, automation, widget, widgets, dashboard
|
5 |
Requires at least: 5.1
|
6 |
Tested up to: 5.2.2
|
7 |
+
Stable tag: 3.0.0
|
8 |
|
9 |
Shrink, beautify, track, manage and share any URL on or off of your WordPress website. Create links that look how you want using your own domain name!
|
10 |
|
14 |
|
15 |
[Upgrade to Pretty Links Pro](https://prettylinks.com/why-upgrade/ "Upgrade to Pretty Links Pro")
|
16 |
|
17 |
+
*Pretty Links Pro* is a **significant upgrade** that adds many tools and redirection types that will allow you to create pretty links automatically, cloak links, replace keywords thoughout your blog with pretty links, categorize & tag your pretty links and much more. You can learn more about *Pretty Links Pro* here:
|
18 |
|
19 |
[Learn More](https://prettylinks.com/about "Learn More") | [Pricing](https://prettylinks.com/pricing/plans/ "Pricing")
|
20 |
|
51 |
* Enables you to send your pretty links via Email directly from your WordPress admin
|
52 |
* Select Temporary (302 or 307) or Permanent (301) redirection for your pretty links
|
53 |
* Cookie based system for tracking visitor activity across clicks
|
|
|
54 |
* Create nofollow/noindex links
|
55 |
* Turn tracking on / off on each link
|
56 |
* Pretty Links Bookmarklet
|
64 |
3. Make sure you have changed your permalink Common Settings in Settings -> Permalinks away from "Default" to something else. I prefer using custom and then "/%year%/%month%/%postname%/" for the simplest possible URL slugs with the best performance.
|
65 |
|
66 |
== Changelog ==
|
67 |
+
= 3.0.0 =
|
68 |
+
* Re-designed Admin UI especially the Admin Links UI including links listing, adding new links and editing links
|
69 |
+
* Added an Insert Pretty Link button for Gutenberg Paragraph Blocks
|
70 |
+
* Security fixes and hardening
|
71 |
+
* Fixed Slug is not Available Error
|
72 |
+
* Removed Pretty Links Groups (lite users will still be able to access legacy groups on the links listing page but pro users & lite users who upgrade to pro will have their groups migrated to become link categories)
|
73 |
+
* PRO ONLY: Added Pretty Link Categories
|
74 |
+
* PRO ONLY: Added Pretty Link Tags
|
75 |
+
* PRO ONLY: Fixed some issues with Pretty Link Imports and Exports
|
76 |
+
* Many other small fixes and enhancements
|
77 |
+
|
78 |
= 2.1.10 =
|
79 |
* More security hardening
|
80 |
|
vendor/lib/bootstrap/bootstrap-theme.min.css
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Bootstrap v3.3.6 (http://getbootstrap.com)
|
3 |
+
* Copyright 2011-2015 Twitter, Inc.
|
4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
+
*/.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
|
vendor/lib/bootstrap/bootstrap.min.css
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Bootstrap v3.3.6 (http://getbootstrap.com)
|
3 |
+
* Copyright 2011-2015 Twitter, Inc.
|
4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
+
*//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{
|