Plugin CommentCenter has proved to be very useful and therefore becomes part of the FP standard distribution.

This commit is contained in:
azett 2020-01-03 21:30:16 +01:00
parent eed50e31e8
commit 8ddcfda7ce
31 changed files with 5009 additions and 0 deletions

View File

@ -0,0 +1,70 @@
This icons are taken from the Tango Icon Theme (packed by Debian).
The package is tango-icon-theme and here's its copyright file.
============
This package was debianized by Daniel Holbach <daniel.holbach@ubuntu.com> on
Mon, 10 Oct 2005 20:50:20 +0200.
It was downloaded from http://tango.freedesktop.org/releases/
Upstream Authors: 2005-2009
Ulisse Perusin <uli.peru@gmail.com>
Steven Garrity <sgarrity@silverorange.com>
Lapo Calamandrei <calamandrei@gmail.com>
Ryan Collier <rcollier@novell.com>
Rodney Dawes <dobey@novell.com>
Andreas Nilsson <nisses.mail@home.se>
Tuomas Kuosmanen <tigert@tigert.com>
Garrett LeSage <garrett@novell.com>
Jakub Steiner <jimmac@novell.com>
Copyright:
In the preparation of the 0.8.90 release Novell took care of tracking
down all the contributors to get them to relicense their artwork
into Public Domain.
The COPYING file of the tarball states the following:
| The icons in this repository are herefore released into the Public Domain.
Additionally the copyright status of the files was tracked in the CVS and the
rdf properties of the SVGs adjusted for all files that were put into Public
Domain (see rdf:about and rdf:resource). Both fields contain a link to the
Creative Commons Public Domain Dediciation[0] as reproduced below:
| Public Domain Dedication
|
| Copyright-Only Dedication (based on United States law) or Public Domain
| Certification
|
| The person or persons who have associated work with this document (the
| "Dedicator" or "Certifier") hereby either (a) certifies that, to the best
| of his knowledge, the work of authorship identified is in the public
| domain of the country from which the work is published, or (b)
| hereby dedicates whatever copyright the dedicators holds in the work
| of authorship identified below (the "Work") to the public domain. A
| certifier, moreover, dedicates any copyright interest he may have in
| the associated work, and for these purposes, is described as a
| "dedicator" below.
|
| A certifier has taken reasonable steps to verify the copyright
| status of this work. Certifier recognizes that his good faith efforts
| may not shield him from liability if in fact the work certified is not
| in the public domain.
|
| Dedicator makes this dedication for the benefit of the public at
| large and to the detriment of the Dedicator's heirs and successors.
| Dedicator intends this dedication to be an overt act of relinquishment
| in perpetuity of all present and future rights under copyright law,
| whether vested or contingent, in the Work. Dedicator understands that
| such relinquishment of all rights includes the relinquishment of all
| rights to enforce (by lawsuit or otherwise) those copyrights in the
| Work.
|
| Dedicator recognizes that, once placed in the public domain, the Work
| may be freely reproduced, distributed, transmitted, used, modified,
| built upon, or otherwise exploited by anyone for any purpose, commercial
| or non-commercial, and in any way, including by methods that have not
| yet been invented or conceived.
[0] http://creativecommons.org/licenses/publicdomain/

Binary file not shown.

After

Width:  |  Height:  |  Size: 848 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 539 B

View File

@ -0,0 +1,508 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="48"
id="svg23883"
sodipodi:version="0.32"
inkscape:version="0.46"
version="1.0"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
sodipodi:docname="edit-cut.svg"
inkscape:export-filename="/home/garrett/edit-cut.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs23885">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective70" />
<linearGradient
inkscape:collect="always"
id="linearGradient2269">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2271" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop2273" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2259">
<stop
style="stop-color:#9a0c00;stop-opacity:1;"
offset="0"
id="stop2261" />
<stop
style="stop-color:#9a0c00;stop-opacity:0;"
offset="1"
id="stop2263" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2251">
<stop
style="stop-color:#df2a2a;stop-opacity:1;"
offset="0"
id="stop2253" />
<stop
style="stop-color:#df2a2a;stop-opacity:0;"
offset="1"
id="stop2255" />
</linearGradient>
<linearGradient
id="linearGradient2229">
<stop
style="stop-color:#e2e2e2;stop-opacity:1;"
offset="0"
id="stop2231" />
<stop
style="stop-color:#d8d8d8;stop-opacity:1;"
offset="1"
id="stop2233" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,1.010300,1.007969e-18,-0.159801)"
r="7.2848282"
cy="23.333008"
cx="165.06104"
id="radialGradient16850">
<stop
id="stop16852"
style="stop-color:#EF3535"
offset="0" />
<stop
id="stop16854"
style="stop-color:#a40000;stop-opacity:0"
offset="1" />
</radialGradient>
<linearGradient
id="XMLID_897_"
gradientUnits="userSpaceOnUse"
x1="292.97168"
y1="4.7592773"
x2="296.93979"
y2="10.711433">
<stop
offset="0"
style="stop-color:#EEEEEC"
id="stop45093" />
<stop
offset="1"
style="stop-color:#ffffff;stop-opacity:1;"
id="stop45095" />
</linearGradient>
<linearGradient
id="path3230_2_"
gradientUnits="userSpaceOnUse"
x1="1668.7646"
y1="185.30176"
x2="1679.5989"
y2="175.78883"
gradientTransform="matrix(1.213800,0.000000,0.282500,-1.671200,46.72625,447.9442)">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop4977" />
<stop
offset="1"
style="stop-color:#CFCFCF"
id="stop4979" />
</linearGradient>
<linearGradient
id="path3311_1_"
gradientUnits="userSpaceOnUse"
x1="1420.5474"
y1="-50.919434"
x2="1420.6542"
y2="-79.574341"
gradientTransform="matrix(2.051000,0.000000,0.167200,-0.989000,-799.2049,221.0724)">
<stop
offset="0"
style="stop-color:#C4A000"
id="stop4970" />
<stop
offset="1"
style="stop-color:#957A00"
id="stop4972" />
</linearGradient>
<radialGradient
id="XMLID_52_"
cx="165.06104"
cy="23.333008"
r="7.2848282"
gradientTransform="matrix(1.000000,0.000000,0.000000,1.010300,1.007969e-18,-0.159801)"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#EF3535"
id="stop812" />
<stop
id="stop2239"
style="stop-color:#c91a1a;stop-opacity:1;"
offset="0" />
<stop
offset="1"
style="stop-color:#ff4c4c;stop-opacity:1;"
id="stop814" />
</radialGradient>
<linearGradient
id="XMLID_45_"
gradientUnits="userSpaceOnUse"
x1="68.175293"
y1="21.424805"
x2="74.587158"
y2="27.836672">
<stop
offset="0"
style="stop-color:#BABDB6"
id="stop695" />
<stop
offset="1"
style="stop-color:#EEEEEC"
id="stop697" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#path3230_2_"
id="linearGradient142876"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.213781,0,0.282495,-1.671173,-1712.251,391.532)"
x1="1668.7646"
y1="185.30176"
x2="1679.5989"
y2="175.78883" />
<linearGradient
inkscape:collect="always"
xlink:href="#path3230_2_"
id="linearGradient142884"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.213781,0.000000,0.282495,-1.671173,-1385.251,394.5320)"
x1="1668.7646"
y1="185.30176"
x2="1679.5989"
y2="175.78883" />
<linearGradient
inkscape:collect="always"
xlink:href="#path3311_1_"
id="linearGradient142892"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.050967,0.000000,0.167197,-0.988984,-2231.169,167.6639)"
x1="1420.5474"
y1="-50.919434"
x2="1420.6542"
y2="-79.574341" />
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_45_"
id="linearGradient16739"
x1="22.225399"
y1="23.843431"
x2="24.190449"
y2="22.860907"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_52_"
id="linearGradient16769"
x1="294.59497"
y1="12.187603"
x2="297.18515"
y2="13.3396"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_52_"
id="linearGradient16894"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.624438,0.000000,0.000000,3.624438,-1053.179,-16.84720)"
x1="296.76199"
y1="12.012225"
x2="297.79822"
y2="10.946587" />
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_52_"
id="linearGradient16946"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.637893,0.000000,0.000000,3.470375,-1056.116,-16.00724)"
x1="296.48611"
y1="15.506916"
x2="296.52905"
y2="9.8769522" />
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_897_"
id="linearGradient16968"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-4.127761,0.000000,0.000000,4.136601,1244.465,-11.90495)"
x1="292.97168"
y1="4.7592773"
x2="296.93979"
y2="10.711433" />
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_897_"
id="linearGradient16974"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.053427,0.000000,0.000000,4.136601,-1175.535,-11.90495)"
x1="292.97168"
y1="4.7592773"
x2="296.93979"
y2="10.711433" />
<linearGradient
inkscape:collect="always"
xlink:href="#radialGradient16850"
id="linearGradient17028"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.161878,0.000000,0.000000,0.992497,-5.112111,6.400522e-2)"
x1="39.619942"
y1="44.540932"
x2="-3.532515"
y2="-11.889042" />
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_52_"
id="linearGradient17034"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.161878,0.000000,0.000000,0.992497,-2.666967,6.400522e-2)"
x1="13.82536"
y1="40.068752"
x2="7.6700611"
y2="2.3262277" />
<linearGradient
inkscape:collect="always"
xlink:href="#XMLID_52_"
id="linearGradient17037"
gradientUnits="userSpaceOnUse"
x1="7.184845"
y1="31.056622"
x2="25.152235"
y2="50.774887"
gradientTransform="matrix(1.161878,0.000000,0.000000,0.992497,-2.430779,0.265761)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2229"
id="linearGradient2235"
x1="20.288025"
y1="6.4603648"
x2="24.32597"
y2="23.942537"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2229"
id="linearGradient2237"
x1="20.288025"
y1="6.4603648"
x2="24.32597"
y2="23.942537"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#XMLID_52_"
id="radialGradient2241"
cx="34.376091"
cy="37.50008"
fx="34.376091"
fy="37.50008"
r="8.3887873"
gradientTransform="matrix(1.000000,0.000000,0.000000,1.060381,0.000000,-2.299514)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2251"
id="linearGradient2257"
x1="298.47852"
y1="13.599585"
x2="298.86948"
y2="13.802949"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2259"
id="linearGradient2265"
x1="298.47852"
y1="13.599585"
x2="298.86948"
y2="13.802949"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2269"
id="radialGradient2275"
cx="25.1875"
cy="41.625"
fx="25.1875"
fy="41.625"
r="18.0625"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.325260,2.029626e-16,28.08607)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.13333333"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="11.313708"
inkscape:cx="32.034218"
inkscape:cy="23.0589"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
gridtolerance="0.5px"
inkscape:window-width="1011"
inkscape:window-height="818"
inkscape:window-x="177"
inkscape:window-y="30"
stroke="#a40000"
inkscape:showpageshadow="false">
<inkscape:grid
id="GridFromPre046Settings"
type="xygrid"
originx="0px"
originy="0px"
spacingx="1px"
spacingy="1px"
color="#0000ff"
empcolor="#0000ff"
opacity="0.2"
empopacity="0.4"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata23888">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Edit Cut</dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Garrett Le Sage</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>edit</rdf:li>
<rdf:li>cut</rdf:li>
<rdf:li>clipboard</rdf:li>
</rdf:Bag>
</dc:subject>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="fill:url(#linearGradient16968);stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 34.174311,1.6249997 C 34.386261,1.6935355 34.59157,1.7696619 34.798294,1.842502 C 35.449709,4.0395037 38.469777,6.2612218 37.321354,8.4491328 C 33.495509,14.82952 29.697021,21.294565 25.899759,27.72527 C 25.154013,27.872172 24.401732,27.952183 23.647995,27.96996 C 22.061603,28.01017 20.433063,27.775465 18.927431,27.23589 C 23.978303,18.684616 29.031301,10.114483 34.174311,1.6249997 z "
id="path16717" />
<path
style="fill:url(#linearGradient2237);fill-opacity:1;stroke:none;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 34.288823,4.25 C 34.057702,4.5574529 33.839208,5.120942 33.602793,5.40625 C 29.555938,12.158979 25.440784,18.900329 21.378976,25.625 C 21.318425,25.878117 20.565047,26.637291 21.366935,26.567963 C 22.478492,26.765843 23.638682,26.918567 24.746762,26.625 C 28.505752,20.407794 32.192639,14.142582 35.943048,7.9231779 C 36.285519,7.5359043 36.352163,6.9979201 35.992403,6.611197 C 35.462387,5.7945892 34.925464,4.9364821 34.382373,4.15625 L 34.311813,4.2269607 L 34.288823,4.25 z "
id="path16719" />
<polygon
style="fill:url(#linearGradient16769);fill-opacity:1;stroke:#9a0c00;stroke-width:0.28144068;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="polygon45129"
points="297.04443,12.300293 296.39941,13.384766 295.13281,14.71875 294.73242,13.672852 295.74658,11.960449 297.04443,12.300293 "
transform="matrix(3.637893,0.000000,0.000000,3.470375,-1056.116,-16.00724)" />
<path
style="fill:url(#linearGradient16946);fill-opacity:1;stroke:none;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 20.40625,26.96875 C 19.183905,27.455468 19.192232,29.003929 18.481272,29.932762 C 18.138949,30.648557 17.537483,31.278989 17.28125,32.03125 C 17.271571,32.546641 17.729203,33.391474 18.3125,32.9375 C 19.697476,31.791172 20.876866,30.398821 21.756725,28.810629 C 21.989088,28.320596 22.552476,27.916466 22.625,27.40625 C 22.086431,26.835441 21.112182,26.873225 20.40625,26.96875 z "
id="polygon16896" />
<path
style="fill:url(#linearGradient16974);stroke:#888a85;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 12.960099,1.6249997 C 12.751966,1.6935355 12.550355,1.7696619 12.347353,1.842502 C 11.707669,4.0395037 8.7419877,6.2612218 9.8697297,8.4491328 C 13.626677,14.82952 17.35676,21.294565 21.085639,27.72527 C 21.817956,27.872172 22.55669,27.952183 23.296853,27.96996 C 24.854677,28.01017 26.453889,27.775465 27.932407,27.23589 C 22.972493,18.684616 18.010492,10.114483 12.960099,1.6249997 z "
id="polygon45097" />
<path
style="fill:url(#linearGradient2235);fill-opacity:1;stroke:none;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 12.719667,4.25 C 12.336632,5.3766793 11.270006,6.2059645 11.004855,7.40625 C 14.713376,13.800362 18.475798,20.175378 22.181757,26.5625 C 23.380123,26.820799 24.610198,26.655657 25.795112,26.40625 C 25.606339,25.665807 25.056911,25.075319 24.765129,24.3767 C 20.870526,17.806174 16.941429,11.242872 13.087127,4.65625 C 13.072466,4.5046403 12.870425,4.1721152 12.719667,4.25 z "
id="path16635" />
<path
sodipodi:type="arc"
style="opacity:1;color:#000000;fill:url(#linearGradient16739);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.25;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="path16731"
sodipodi:cx="23.207924"
sodipodi:cy="23.843431"
sodipodi:rx="0.98252523"
sodipodi:ry="0.98252523"
d="M 24.190449 23.843431 A 0.98252523 0.98252523 0 1 1 22.225399,23.843431 A 0.98252523 0.98252523 0 1 1 24.190449 23.843431 z"
transform="matrix(0.979893,0.000000,0.000000,1.000000,0.311384,0.174043)" />
<path
sodipodi:type="arc"
style="opacity:0.26704544;color:#000000;fill:url(#radialGradient2275);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="path2267"
sodipodi:cx="25.1875"
sodipodi:cy="41.625"
sodipodi:rx="18.0625"
sodipodi:ry="5.875"
d="M 43.25 41.625 A 18.0625 5.875 0 1 1 7.125,41.625 A 18.0625 5.875 0 1 1 43.25 41.625 z"
transform="matrix(1.256055,0.000000,0.000000,0.819149,-7.199394,9.090421)" />
<path
id="path45138"
style="fill:url(#linearGradient17037);fill-opacity:1;stroke:#a40000;stroke-opacity:1"
d="M 17.700393,30.286934 C 20.935404,32.013583 21.196229,36.899851 18.278338,41.201286 C 15.360479,45.50525 10.373849,47.596472 7.1373807,45.877418 C 3.9008825,44.150767 3.6415462,39.267032 6.5594356,34.965597 C 9.4758075,30.664166 14.463925,28.572944 17.700393,30.286934 z M 15.845268,33.029079 C 14.408745,32.26545 11.33781,33.569599 9.3789266,36.463107 C 7.4160164,39.356612 7.5560293,42.376624 8.991202,43.137951 C 10.426348,43.906181 13.499985,42.597432 15.458868,39.703925 C 17.42313,36.81042 17.281765,33.792709 15.845268,33.029079 z " />
<path
style="fill:url(#linearGradient17034);fill-opacity:1;stroke:none;stroke-opacity:1"
d="M 14.3255,30.583289 C 12.400369,30.97051 10.691041,32.037306 9.2785926,33.064531 C 8.5268294,33.759433 8.0350294,34.514452 7.3629449,35.31874 C 5.6546178,37.670805 4.9387067,40.762168 6.2901069,43.388409 C 6.90956,44.841515 8.9327419,45.435852 10.658323,45.067542 C 12.110236,44.819078 13.339639,43.906473 14.470735,43.268641 C 15.391637,42.47786 16.024749,41.642131 16.803626,40.677364 C 18.612986,38.202962 19.595537,34.928687 18.101604,32.165081 C 17.377898,31.022952 15.866963,30.41829 14.3255,30.583289 z M 14.797513,31.54477 C 16.814017,31.795124 18.154487,33.577585 17.92006,35.266634 C 17.940833,37.553573 16.774038,39.710728 15.196909,41.500756 C 13.779705,42.902737 11.848294,44.229027 9.5327534,44.137076 C 8.1738996,44.134209 7.100179,43.224779 6.7169325,42.176618 C 6.1002938,39.644695 6.9116496,36.911389 8.6831288,34.83862 C 10.041367,33.315308 11.877976,31.95152 14.150642,31.596926 C 14.366331,31.581652 14.581522,31.554432 14.797513,31.54477 z "
id="path16771" />
<path
d="M 30.331764,30.286934 C 27.096753,32.013583 26.835929,36.899851 29.75382,41.201286 C 32.671679,45.50525 37.658309,47.596472 40.894777,45.877418 C 44.131276,44.150767 44.390611,39.267032 41.472722,34.965597 C 38.55635,30.664166 33.568233,28.572944 30.331764,30.286934 z M 32.18689,33.029079 C 33.623412,32.26545 36.694348,33.569599 38.653231,36.463107 C 40.616141,39.356612 40.476128,42.376624 39.040956,43.137951 C 37.60581,43.906181 34.532173,42.597432 32.57329,39.703925 C 30.609028,36.81042 30.750393,33.792709 32.18689,33.029079 z "
style="fill:url(#radialGradient2241);fill-opacity:1;stroke:#a40000;stroke-opacity:1"
id="path11967" />
<polygon
style="fill:url(#linearGradient2257);fill-opacity:1;stroke:url(#linearGradient2265);stroke-width:0.27590489;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="polygon45101"
points="296.95605,12.300293 297.6001,13.384766 298.86719,14.71875 299.26807,13.672852 298.25391,11.960449 296.95605,12.300293 "
transform="matrix(3.624438,0.000000,0.000000,3.624438,-1053.179,-16.84720)" />
<path
style="fill:url(#linearGradient16894);fill-opacity:1;stroke:none;stroke-width:0.27590489;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 26.15625,27.9375 C 25.729502,28.136321 25.139436,28.138981 24.8125,28.4375 C 25.76252,29.838889 26.702412,31.352161 27.663379,32.650077 C 28.331933,33.404621 29.019194,34.150303 29.78125,34.8125 C 30.516527,33.421076 29.91641,31.751292 28.96875,30.625 C 28.366215,29.725307 28.138928,28.512038 27.125,28.03125 C 26.820951,27.912839 26.474385,27.853373 26.15625,27.9375 z "
id="polygon16860" />
<path
style="fill:url(#linearGradient17028);fill-opacity:1;stroke:none;stroke-opacity:1"
d="M 32.280087,30.449093 C 30.759703,30.678844 29.385141,31.534748 29.039639,32.837057 C 27.908495,35.232508 28.824763,37.950571 30.319418,40.063908 C 31.421345,41.40911 32.259488,42.993821 33.959001,43.837878 C 35.429654,44.761502 37.300143,45.728452 39.176641,45.138766 C 40.689956,44.705317 41.547313,43.4582 41.856813,42.166912 C 42.461243,39.856882 41.561117,37.490951 40.149846,35.530428 C 39.491173,34.616722 38.816861,33.647222 38.036528,32.835783 C 36.841969,31.932329 35.398614,31.184254 33.947688,30.603431 C 33.41359,30.493019 32.832464,30.37069 32.280087,30.449093 z M 32.715792,31.658699 C 34.473095,31.591923 35.950305,32.398157 37.092162,33.427664 C 38.124459,34.396792 39.113817,35.23287 39.754673,36.426541 C 40.831856,38.24711 41.142534,40.4065 40.594777,42.390073 C 40.066397,43.714585 38.368623,44.362109 36.803657,44.006518 C 34.821776,43.77769 33.586317,42.335503 32.277091,41.198158 C 30.771344,39.766768 29.83647,37.719532 29.76651,35.715783 C 29.780622,34.698114 29.740042,33.53736 30.464653,32.682212 C 30.876926,32.139062 31.84466,31.627886 32.715792,31.658699 z "
id="path16795" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

View File

@ -0,0 +1,200 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="go-down.svg"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg11300"
height="48px"
width="48px"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective24" />
<linearGradient
id="linearGradient1442">
<stop
id="stop1444"
offset="0"
style="stop-color:#73d216" />
<stop
id="stop1446"
offset="1.0000000"
style="stop-color:#4e9a06" />
</linearGradient>
<linearGradient
id="linearGradient8662"
inkscape:collect="always">
<stop
id="stop8664"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop8666"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient8650"
inkscape:collect="always">
<stop
id="stop8652"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop8654"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient1444"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,1.614716e-15,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient1442"
id="radialGradient1469"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.871885e-16,-0.843022,1.020168,2.265228e-16,0.606436,42.58614)"
cx="35.292667"
cy="20.494493"
fx="35.292667"
fy="20.494493"
r="16.956199" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8650"
id="radialGradient1471"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(3.749427e-16,-2.046729,-1.557610,-2.853404e-16,44.11559,66.93275)"
cx="15.987216"
cy="1.5350308"
fx="15.987216"
fy="1.5350308"
r="17.171415" />
</defs>
<sodipodi:namedview
inkscape:window-y="30"
inkscape:window-x="0"
inkscape:window-height="818"
inkscape:window-width="1280"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="23.239067"
inkscape:cx="15.972815"
inkscape:zoom="11.313708"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#4e9a06"
stroke="#4e9a06" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Go Down</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>go</rdf:li>
<rdf:li>lower</rdf:li>
<rdf:li>down</rdf:li>
<rdf:li>arrow</rdf:li>
<rdf:li>pointer</rdf:li>
<rdf:li>&gt;</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
transform="matrix(1.214466,0.000000,0.000000,0.595458,-6.163846,16.31275)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.20454545;color:#000000;fill:url(#radialGradient1444);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<g
id="g1464"
transform="matrix(-1.000000,0.000000,0.000000,-1.000000,47.02856,43.99921)">
<path
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1469);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
d="M 14.519136,38.500000 L 32.524165,38.496094 L 32.524165,25.504468 L 40.519531,25.496656 L 23.374809,5.4992135 L 6.5285585,25.497284 L 14.524440,25.501074 L 14.519136,38.500000 z "
id="path8643"
sodipodi:nodetypes="cccccccc" />
<path
style="opacity:0.50802141;color:#000000;fill:url(#radialGradient1471);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 39.429889,24.993467 L 32.023498,25.005186 L 32.026179,37.998023 L 16.647623,37.98887 C 17.417545,19.64788 27.370272,26.995797 32.029282,16.341991 L 39.429889,24.993467 z "
id="path8645"
sodipodi:nodetypes="cccccc" />
<path
sodipodi:nodetypes="cccccccc"
id="path8658"
d="M 15.520704,37.496094 L 31.522109,37.500000 L 31.522109,24.507050 L 38.338920,24.491425 L 23.384644,7.0388396 L 8.6781173,24.495782 L 15.518018,24.501029 L 15.520704,37.496094 z "
style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@ -0,0 +1,196 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docname="go-up.svg"
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg11300"
height="48px"
width="48px"
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
inkscape:export-xdpi="90.000000"
inkscape:export-ydpi="90.000000"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective23" />
<linearGradient
id="linearGradient2304">
<stop
id="stop2306"
offset="0"
style="stop-color:#73d216" />
<stop
id="stop2308"
offset="1.0000000"
style="stop-color:#4e9a06" />
</linearGradient>
<linearGradient
id="linearGradient8662"
inkscape:collect="always">
<stop
id="stop8664"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop8666"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient8650"
inkscape:collect="always">
<stop
id="stop8652"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop8654"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8650"
id="radialGradient1438"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-3.749427e-16,-2.046729,1.557610,-2.853404e-16,2.767009,66.93275)"
cx="24.53788"
cy="0.40010813"
fx="24.53788"
fy="0.40010813"
r="17.171415" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2304"
id="radialGradient1441"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.871885e-16,-0.843022,1.020168,2.265228e-16,0.606436,42.58614)"
cx="11.319205"
cy="22.454971"
fx="11.319205"
fy="22.454971"
r="16.956199" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient1444"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,1.614716e-15,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
</defs>
<sodipodi:namedview
inkscape:window-y="30"
inkscape:window-x="0"
inkscape:window-height="818"
inkscape:window-width="1280"
inkscape:showpageshadow="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="false"
inkscape:current-layer="layer1"
inkscape:cy="25.620377"
inkscape:cx="9.6380363"
inkscape:zoom="13.059378"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.25490196"
bordercolor="#666666"
pagecolor="#ffffff"
id="base"
fill="#73d216"
stroke="#73d216" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://jimmac.musichall.cz</dc:source>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:title>Go Up</dc:title>
<dc:subject>
<rdf:Bag>
<rdf:li>go</rdf:li>
<rdf:li>higher</rdf:li>
<rdf:li>up</rdf:li>
<rdf:li>arrow</rdf:li>
<rdf:li>pointer</rdf:li>
<rdf:li>&gt;</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:contributor>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
inkscape:label="Layer 1"
id="layer1">
<path
transform="matrix(1.214466,0.000000,0.000000,0.595458,-6.163846,16.31275)"
d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1 9.1923885,36.421127 A 15.644737 8.3968935 0 1 1 40.481863 36.421127 z"
sodipodi:ry="8.3968935"
sodipodi:rx="15.644737"
sodipodi:cy="36.421127"
sodipodi:cx="24.837126"
id="path8660"
style="opacity:0.29946521;color:#000000;fill:url(#radialGradient1444);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<path
sodipodi:nodetypes="cccccccc"
id="path8643"
d="M 14.491792,38.500000 L 32.469477,38.500000 L 32.469477,25.547437 L 40.500000,25.547437 L 23.374809,5.4992135 L 6.5285585,25.489471 L 14.497096,25.555762 L 14.491792,38.500000 z "
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1441);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
sodipodi:nodetypes="cccscc"
id="path8645"
d="M 7.5855237,25.03253 L 14.995821,25.03253 L 15.062422,31.594339 C 20.718034,20.593878 31.055517,22.749928 31.656768,15.966674 C 31.656768,15.966674 23.366938,6.4219692 23.366938,6.4219692 L 7.5855237,25.03253 z "
style="opacity:0.50802141;color:#000000;fill:url(#radialGradient1438);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
<path
style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
d="M 15.602735,37.500000 L 31.502578,37.500000 L 31.502578,24.507050 L 38.311576,24.507050 L 23.361206,7.0700896 L 8.6546798,24.550470 L 15.475049,24.528373 L 15.602735,37.500000 z "
id="path8658"
sodipodi:nodetypes="cccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -0,0 +1,436 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48px"
height="48px"
id="svg6431"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/actions"
sodipodi:docname="list-add.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs6433">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective70" />
<linearGradient
inkscape:collect="always"
id="linearGradient2091">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2093" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop2095" />
</linearGradient>
<linearGradient
id="linearGradient7916">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop7918" />
<stop
style="stop-color:#ffffff;stop-opacity:0.34020618;"
offset="1.0000000"
id="stop7920" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient8662">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop8664" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop8666" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient8662"
id="radialGradient1503"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,-1.018989e-13,16.87306)"
cx="24.837126"
cy="36.421127"
fx="24.837126"
fy="36.421127"
r="15.644737" />
<linearGradient
inkscape:collect="always"
id="linearGradient2847">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2849" />
<stop
style="stop-color:#3465a4;stop-opacity:0;"
offset="1"
id="stop2851" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2847"
id="linearGradient1488"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,-1.242480,40.08170)"
x1="37.128052"
y1="29.729605"
x2="37.065414"
y2="26.194071" />
<linearGradient
id="linearGradient2831">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2833" />
<stop
id="stop2855"
offset="0.33333334"
style="stop-color:#5b86be;stop-opacity:1;" />
<stop
style="stop-color:#83a8d8;stop-opacity:0;"
offset="1"
id="stop2835" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2831"
id="linearGradient1486"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-48.30498,-6.043298)"
x1="13.478554"
y1="10.612206"
x2="15.419417"
y2="19.115122" />
<linearGradient
id="linearGradient2380">
<stop
style="stop-color:#b9cfe7;stop-opacity:1"
offset="0"
id="stop2382" />
<stop
style="stop-color:#729fcf;stop-opacity:1"
offset="1"
id="stop2384" />
</linearGradient>
<linearGradient
id="linearGradient2682">
<stop
style="stop-color:#3977c3;stop-opacity:1;"
offset="0"
id="stop2684" />
<stop
style="stop-color:#89aedc;stop-opacity:0;"
offset="1"
id="stop2686" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2682"
id="linearGradient2688"
x1="36.713837"
y1="31.455952"
x2="37.124462"
y2="24.842253"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-48.77039,-5.765705)" />
<linearGradient
inkscape:collect="always"
id="linearGradient2690">
<stop
style="stop-color:#c4d7eb;stop-opacity:1;"
offset="0"
id="stop2692" />
<stop
style="stop-color:#c4d7eb;stop-opacity:0;"
offset="1"
id="stop2694" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2690"
id="linearGradient2696"
x1="32.647972"
y1="30.748846"
x2="37.124462"
y2="24.842253"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-48.77039,-5.765705)" />
<linearGradient
inkscape:collect="always"
id="linearGradient2871">
<stop
style="stop-color:#3465a4;stop-opacity:1;"
offset="0"
id="stop2873" />
<stop
style="stop-color:#3465a4;stop-opacity:1"
offset="1"
id="stop2875" />
</linearGradient>
<linearGradient
id="linearGradient2402">
<stop
style="stop-color:#729fcf;stop-opacity:1;"
offset="0"
id="stop2404" />
<stop
style="stop-color:#528ac5;stop-opacity:1;"
offset="1"
id="stop2406" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2797"
id="linearGradient1493"
gradientUnits="userSpaceOnUse"
x1="5.9649176"
y1="26.048164"
x2="52.854097"
y2="26.048164" />
<linearGradient
inkscape:collect="always"
id="linearGradient2797">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2799" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2801" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2797"
id="linearGradient1491"
gradientUnits="userSpaceOnUse"
x1="5.9649176"
y1="26.048164"
x2="52.854097"
y2="26.048164" />
<linearGradient
inkscape:collect="always"
id="linearGradient7179">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop7181" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop7183" />
</linearGradient>
<linearGradient
id="linearGradient2316">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2318" />
<stop
style="stop-color:#ffffff;stop-opacity:0.65979379;"
offset="1"
id="stop2320" />
</linearGradient>
<linearGradient
id="linearGradient1322">
<stop
id="stop1324"
offset="0.0000000"
style="stop-color:#729fcf" />
<stop
id="stop1326"
offset="1.0000000"
style="stop-color:#5187d6;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1322"
id="linearGradient4975"
x1="34.892849"
y1="36.422989"
x2="45.918697"
y2="48.547989"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-18.01785,-13.57119)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7179"
id="linearGradient7185"
x1="13.435029"
y1="13.604306"
x2="22.374878"
y2="23.554308"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7179"
id="linearGradient7189"
gradientUnits="userSpaceOnUse"
x1="13.435029"
y1="13.604306"
x2="22.374878"
y2="23.554308"
gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,47.93934,50.02474)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2380"
id="linearGradient7180"
gradientUnits="userSpaceOnUse"
x1="62.513836"
y1="36.061237"
x2="15.984863"
y2="20.60858" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2871"
id="linearGradient7182"
gradientUnits="userSpaceOnUse"
x1="46.834816"
y1="45.264122"
x2="45.380436"
y2="50.939667" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2402"
id="linearGradient7184"
gradientUnits="userSpaceOnUse"
x1="18.935766"
y1="23.667896"
x2="53.588622"
y2="26.649362" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2871"
id="linearGradient7186"
gradientUnits="userSpaceOnUse"
x1="46.834816"
y1="45.264122"
x2="45.380436"
y2="50.939667" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7916"
id="linearGradient7922"
x1="16.874998"
y1="22.851799"
x2="27.900846"
y2="34.976799"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2091"
id="radialGradient2097"
cx="23.070683"
cy="35.127438"
fx="23.070683"
fy="35.127438"
r="10.319340"
gradientTransform="matrix(0.914812,1.265023e-2,-8.21502e-3,0.213562,2.253914,27.18889)"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.15686275"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-123.56934"
inkscape:cy="0.031886897"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="1280"
inkscape:window-height="818"
inkscape:window-x="0"
inkscape:window-y="30"
showguides="true"
inkscape:guide-bbox="true"
inkscape:showpageshadow="false" />
<metadata
id="metadata6436">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Add</dc:title>
<dc:date>2006-01-04</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:creator>
<dc:source>http://tango-project.org</dc:source>
<dc:subject>
<rdf:Bag>
<rdf:li>add</rdf:li>
<rdf:li>plus</rdf:li>
</rdf:Bag>
</dc:subject>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="opacity:0.10824742;fill:url(#radialGradient2097);fill-opacity:1;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path1361"
sodipodi:cx="22.958872"
sodipodi:cy="34.94062"
sodipodi:rx="10.31934"
sodipodi:ry="2.320194"
d="M 33.278212 34.94062 A 10.31934 2.320194 0 1 1 12.639532,34.94062 A 10.31934 2.320194 0 1 1 33.278212 34.94062 z"
transform="matrix(1.550487,0,0,1.978714,-12.4813,-32.49103)" />
<path
style="font-size:59.901077px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#75a1d0;fill-opacity:1.0000000;stroke:#3465a4;stroke-width:1.0000004px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
d="M 27.514356,37.542682 L 27.514356,28.515722 L 37.492820,28.475543 L 37.492820,21.480219 L 27.523285,21.480219 L 27.514356,11.520049 L 20.498082,11.531210 L 20.502546,21.462362 L 10.512920,21.536022 L 10.477206,28.504561 L 20.511475,28.475543 L 20.518171,37.515896 L 27.514356,37.542682 z "
id="text1314"
sodipodi:nodetypes="ccccccccccccc" />
<path
style="font-size:59.901077px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;opacity:0.40860215;fill:url(#linearGradient4975);fill-opacity:1.0000000;stroke:url(#linearGradient7922);stroke-width:1.0000006px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
d="M 26.498702,36.533920 L 26.498702,27.499738 L 36.501304,27.499738 L 36.494607,22.475309 L 26.507630,22.475309 L 26.507630,12.480335 L 21.512796,12.498193 L 21.521725,22.475309 L 11.495536,22.493166 L 11.468750,27.466256 L 21.533143,27.475185 L 21.519750,36.502670 L 26.498702,36.533920 z "
id="path7076"
sodipodi:nodetypes="ccccccccccccc" />
<path
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;opacity:0.31182796"
d="M 11.000000,25.000000 C 11.000000,26.937500 36.984375,24.031250 36.984375,24.968750 L 36.984375,21.968750 L 27.000000,22.000000 L 27.000000,12.034772 L 21.000000,12.034772 L 21.000000,22.000000 L 11.000000,22.000000 L 11.000000,25.000000 z "
id="path7914"
sodipodi:nodetypes="ccccccccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,336 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48.000000px"
height="48.000000px"
id="svg6361"
sodipodi:version="0.32"
inkscape:version="0.46"
sodipodi:docbase="/home/jimmac/gfx/ximian/tango-icon-theme/scalable/actions"
sodipodi:docname="process-stop.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective52" />
<linearGradient
id="linearGradient2256">
<stop
style="stop-color:#ff0202;stop-opacity:1;"
offset="0"
id="stop2258" />
<stop
style="stop-color:#ff9b9b;stop-opacity:1;"
offset="1"
id="stop2260" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient2248">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2250" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop2252" />
</linearGradient>
<linearGradient
id="linearGradient9647">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop9649" />
<stop
style="stop-color:#dbdbdb;stop-opacity:1;"
offset="1"
id="stop9651" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient21644">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop21646" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop21648" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient21644"
id="radialGradient21650"
cx="25.125"
cy="36.75"
fx="25.125"
fy="36.75"
r="15.75"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.595238,-2.300678e-15,14.87500)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient7895">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop7897" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop7899" />
</linearGradient>
<linearGradient
id="linearGradient4981">
<stop
style="stop-color:#cc0000;stop-opacity:1;"
offset="0"
id="stop4983" />
<stop
style="stop-color:#b30000;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop4985" />
</linearGradient>
<linearGradient
id="linearGradient15762"
inkscape:collect="always">
<stop
id="stop15764"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop15766"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient14236">
<stop
id="stop14238"
offset="0.0000000"
style="stop-color:#ed4040;stop-opacity:1.0000000;" />
<stop
id="stop14240"
offset="1.0000000"
style="stop-color:#a40000;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient11780">
<stop
style="stop-color:#ff8b8b;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop11782" />
<stop
style="stop-color:#ec1b1b;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop11784" />
</linearGradient>
<linearGradient
id="linearGradient11014">
<stop
style="stop-color:#a80000;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop11016" />
<stop
style="stop-color:#c60000;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop13245" />
<stop
style="stop-color:#e50000;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop11018" />
</linearGradient>
<linearGradient
y2="9.6507530"
x2="9.8940229"
y1="5.3855424"
x1="5.7365270"
gradientTransform="matrix(-1.000000,0.000000,0.000000,-1.000000,31.72170,31.29079)"
gradientUnits="userSpaceOnUse"
id="linearGradient15772"
xlink:href="#linearGradient15762"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient11780"
id="linearGradient2057"
x1="15.737001"
y1="12.503600"
x2="53.570126"
y2="47.374317"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0.000000,-2.000000)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4981"
id="linearGradient4987"
x1="23.995985"
y1="20.105337"
x2="41.047836"
y2="37.959785"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0.000000,-2.000000)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7895"
id="linearGradient7901"
x1="15.578875"
y1="16.285088"
x2="32.166405"
y2="28.394291"
gradientUnits="userSpaceOnUse" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient9647"
id="radialGradient2239"
cx="24.30225"
cy="33.30225"
fx="24.30225"
fy="33.30225"
r="12.30225"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.693981,-5.775714e-16,5.775714e-16,1.693981,-16.86529,-25.11111)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4981"
id="linearGradient2243"
gradientUnits="userSpaceOnUse"
x1="23.995985"
y1="20.105337"
x2="41.047836"
y2="37.959785"
gradientTransform="matrix(0.988373,0.000000,0.000000,0.988373,0.279002,0.278984)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2248"
id="radialGradient2254"
cx="16.75"
cy="10.666344"
fx="16.75"
fy="10.666344"
r="21.25"
gradientTransform="matrix(4.154957,-2.979206e-24,3.255657e-24,3.198723,-52.84553,-23.50921)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2256"
id="linearGradient2262"
x1="21.75"
y1="15.80225"
x2="24.30225"
y2="35.05225"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0.000000,-2.000000)" />
</defs>
<sodipodi:namedview
inkscape:guide-bbox="true"
showguides="true"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.15294118"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="4"
inkscape:cx="0.007276"
inkscape:cy="7.0544576"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:grid-bbox="true"
inkscape:document-units="px"
inkscape:window-width="786"
inkscape:window-height="688"
inkscape:window-x="488"
inkscape:window-y="160"
inkscape:showpageshadow="false" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Stop</dc:title>
<dc:date>2005-10-16</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Andreas Nilsson</dc:title>
</cc:Agent>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>stop</rdf:li>
<rdf:li>halt</rdf:li>
<rdf:li>error</rdf:li>
</rdf:Bag>
</dc:subject>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
sodipodi:type="arc"
style="opacity:0.63068183;color:#000000;fill:url(#radialGradient21650);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
id="path21642"
sodipodi:cx="25.125"
sodipodi:cy="36.75"
sodipodi:rx="15.75"
sodipodi:ry="9.375"
d="M 40.875 36.75 A 15.75 9.375 0 1 1 9.375,36.75 A 15.75 9.375 0 1 1 40.875 36.75 z"
transform="matrix(1.173803,0.000000,0.000000,0.600000,-5.265866,19.57500)" />
<path
style="fill:url(#linearGradient4987);fill-opacity:1;fill-rule:evenodd;stroke:#860000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 15.591006,0.4919213 L 32.676311,0.4919213 L 45.497585,13.586385 L 45.497585,31.48003 L 32.848986,43.496929 L 15.418649,43.496929 L 2.4943857,30.658264 L 2.4943857,13.464078 L 15.591006,0.4919213 z "
id="path9480"
sodipodi:nodetypes="ccccccccc" />
<path
style="opacity:0.81318683;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2057);stroke-width:1.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
d="M 16.020655,1.5003424 L 32.248563,1.5003424 L 44.496456,13.922717 L 44.496456,31.037001 L 32.638472,42.48783 L 15.870253,42.48783 L 3.5090792,30.208718 L 3.5090792,13.84561 L 16.020655,1.5003424 z "
id="path9482"
sodipodi:nodetypes="ccccccccc" />
<path
style="opacity:0.28977272;fill:url(#radialGradient2254);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 15.6875,0.75 L 2.75,13.5625 L 2.75,30.5625 L 5.6875,33.46875 C 22.450041,33.526299 22.164665,20.450067 45.25,21.59375 L 45.25,13.6875 L 32.5625,0.75 L 15.6875,0.75 z "
id="path2241"
sodipodi:nodetypes="cccccccc" />
<path
style="fill:url(#radialGradient2239);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2262);stroke-width:0.99999958;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 16.767175,10.5 L 12.5,14.767175 L 20.035075,22.30225 L 12.5,29.837325 L 16.767175,34.104501 L 24.30225,26.569425 L 31.837325,34.104501 L 36.104501,29.837325 L 28.569425,22.30225 L 36.104501,14.767175 L 31.837325,10.5 L 24.30225,18.035075 L 16.767175,10.5 z "
id="path2787" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 828 B

View File

@ -0,0 +1,648 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="30"
inkscape:export-xdpi="30"
inkscape:export-filename="/home/garrett/edit-find-replace-16.png"
sodipodi:docname="stock_search-and-replace.svg"
inkscape:version="0.47 r22583"
sodipodi:version="0.32"
id="svg249"
height="48.000000px"
width="48.000000px"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.1">
<defs
id="defs3">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective144" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5031"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
inkscape:collect="always"
id="linearGradient5060">
<stop
style="stop-color:black;stop-opacity:1;"
offset="0"
id="stop5062" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5064" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient5060"
id="radialGradient5029"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
cx="605.71429"
cy="486.64789"
fx="605.71429"
fy="486.64789"
r="117.14286" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5048"
id="linearGradient5027"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
x1="302.85715"
y1="366.64789"
x2="302.85715"
y2="609.50507" />
<linearGradient
inkscape:collect="always"
id="linearGradient4542">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop4544" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop4546" />
</linearGradient>
<linearGradient
id="linearGradient15662">
<stop
id="stop15664"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
<stop
id="stop15666"
offset="1.0000000"
style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient
id="aigrd3"
cx="20.8921"
cy="64.5679"
r="5.257"
fx="20.8921"
fy="64.5679"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15573" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15575" />
</radialGradient>
<radialGradient
id="aigrd2"
cx="20.8921"
cy="114.5684"
r="5.256"
fx="20.8921"
fy="114.5684"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#F0F0F0"
id="stop15566" />
<stop
offset="1.0000000"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
id="stop15568" />
</radialGradient>
<linearGradient
id="linearGradient269">
<stop
id="stop270"
offset="0.0000000"
style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
<stop
id="stop271"
offset="1.0000000"
style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient259">
<stop
id="stop260"
offset="0.0000000"
style="stop-color:#fafafa;stop-opacity:1.0000000;" />
<stop
id="stop261"
offset="1.0000000"
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient269"
id="radialGradient15656"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.968273,0,0,1.032767,3.353553,0.646447)"
cx="8.8244190"
cy="3.7561285"
fx="8.8244190"
fy="3.7561285"
r="37.751713" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient259"
id="radialGradient15658"
gradientUnits="userSpaceOnUse"
gradientTransform="scale(0.960493,1.041132)"
cx="33.966679"
cy="35.736916"
fx="33.966679"
fy="35.736916"
r="86.708450" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient15662"
id="radialGradient15668"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.968273,0,0,1.032767,3.353553,0.646447)"
cx="8.1435566"
cy="7.2678967"
fx="8.1435566"
fy="7.2678967"
r="38.158695" />
<radialGradient
r="5.256"
fy="114.5684"
fx="20.8921"
cy="114.5684"
cx="20.8921"
gradientTransform="matrix(0.229703,0.000000,0.000000,0.229703,4.613529,3.979808)"
gradientUnits="userSpaceOnUse"
id="radialGradient2283"
xlink:href="#aigrd2"
inkscape:collect="always" />
<radialGradient
r="5.257"
fy="64.5679"
fx="20.8921"
cy="64.5679"
cx="20.8921"
gradientTransform="matrix(0.229703,0.000000,0.000000,0.229703,4.613529,3.979808)"
gradientUnits="userSpaceOnUse"
id="radialGradient2285"
xlink:href="#aigrd3"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4542"
id="radialGradient4548"
cx="24.306795"
cy="42.07798"
fx="24.306795"
fy="42.07798"
r="15.821514"
gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,0.000000,30.08928)"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4440">
<stop
id="stop4442"
offset="0"
style="stop-color:#7d7d7d;stop-opacity:1;" />
<stop
style="stop-color:#b1b1b1;stop-opacity:1.0000000;"
offset="0.50000000"
id="stop4448" />
<stop
id="stop4444"
offset="1.0000000"
style="stop-color:#686868;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient4454">
<stop
id="stop4456"
offset="0.0000000"
style="stop-color:#729fcf;stop-opacity:0.20784314;" />
<stop
id="stop4458"
offset="1.0000000"
style="stop-color:#729fcf;stop-opacity:0.67619050;" />
</linearGradient>
<linearGradient
id="linearGradient4467">
<stop
id="stop4469"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop4471"
offset="1.0000000"
style="stop-color:#ffffff;stop-opacity:0.24761905;" />
</linearGradient>
<linearGradient
id="linearGradient4477"
inkscape:collect="always">
<stop
id="stop4479"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop4481"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient2366">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop2368" />
<stop
id="stop2374"
offset="0.50000000"
style="stop-color:#ffffff;stop-opacity:0.21904762;" />
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop2370" />
</linearGradient>
<linearGradient
id="linearGradient2846">
<stop
style="stop-color:#8a8a8a;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop2848" />
<stop
style="stop-color:#484848;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop2850" />
</linearGradient>
<linearGradient
id="linearGradient2865"
inkscape:collect="always">
<stop
id="stop2867"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop2869"
offset="1"
style="stop-color:#000000;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient2966">
<stop
id="stop2968"
offset="0"
style="stop-color:#ffd1d1;stop-opacity:1;" />
<stop
style="stop-color:#ff1d1d;stop-opacity:1;"
offset="0.5"
id="stop3006" />
<stop
id="stop2970"
offset="1"
style="stop-color:#6f0000;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient2974">
<stop
id="stop2976"
offset="0"
style="stop-color:#c1c1c1;stop-opacity:1;" />
<stop
id="stop2978"
offset="1"
style="stop-color:#acacac;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient2984"
inkscape:collect="always">
<stop
id="stop2986"
offset="0"
style="stop-color:#e7e2b8;stop-opacity:1;" />
<stop
id="stop2988"
offset="1"
style="stop-color:#e7e2b8;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient2994">
<stop
id="stop2996"
offset="0"
style="stop-color:#000000;stop-opacity:1;" />
<stop
id="stop2998"
offset="1"
style="stop-color:#c9c9c9;stop-opacity:1;" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4477"
id="radialGradient2504"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.237968,-1.591178e-15,28.93278)"
cx="24.130018"
cy="37.967922"
fx="24.130018"
fy="37.967922"
r="16.528622" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2865"
id="radialGradient2552"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.348243,0,26.35543)"
cx="23.5625"
cy="40.4375"
fx="23.5625"
fy="40.4375"
r="19.5625" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2966"
id="linearGradient2554"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-5.669292,0)"
x1="48.90625"
y1="17.376184"
x2="50.988335"
y2="22.250591" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2974"
id="linearGradient2556"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-5.669292,0)"
x1="46"
y1="19.8125"
x2="47.6875"
y2="22.625" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2984"
id="radialGradient2558"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.923565,0,0,2.029717,-61.55532,-27.88417)"
cx="29.053354"
cy="27.640751"
fx="29.053354"
fy="27.640751"
r="3.2408544" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2994"
id="linearGradient2560"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-5.825542,0.125)"
x1="25.71875"
y1="31.046875"
x2="25.514589"
y2="30.703125" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2846"
id="linearGradient2730"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,48.18409,-6.22072e-15)"
x1="27.366341"
y1="26.580296"
x2="31.335964"
y2="30.557772" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4440"
id="linearGradient2732"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1.334593,0,0,1.291292,55.15793,-7.460658)"
x1="30.656250"
y1="34.000000"
x2="33.218750"
y2="31.062500" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2366"
id="linearGradient2734"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,44.17827,-7.045146e-16)"
x1="18.292673"
y1="13.602121"
x2="17.500893"
y2="25.743469" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4454"
id="radialGradient2736"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-1,0,0,1,43.352,1.032377e-15)"
cx="18.240929"
cy="21.817987"
fx="18.240929"
fy="21.817987"
r="8.3085051" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4467"
id="radialGradient2738"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.592963,-7.7469e-24,-5.714443e-24,2.252104,-25.05976,-18.941)"
cx="15.414371"
cy="13.078408"
fx="15.414371"
fy="13.078408"
r="6.6562500" />
</defs>
<sodipodi:namedview
inkscape:window-y="25"
inkscape:window-x="0"
inkscape:window-height="949"
inkscape:window-width="1280"
inkscape:document-units="px"
inkscape:grid-bbox="true"
showgrid="true"
inkscape:current-layer="layer5"
inkscape:cy="22.784511"
inkscape:cx="32.576122"
inkscape:zoom="16"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="0.59607843"
bordercolor="#434343"
pagecolor="#ffffff"
id="base"
inkscape:showpageshadow="false"
borderlayer="true"
inkscape:window-maximized="1" />
<metadata
id="metadata4">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:subject>
<rdf:Bag>
<rdf:li>edit</rdf:li>
<rdf:li>find</rdf:li>
<rdf:li>locate</rdf:li>
<rdf:li>search</rdf:li>
</rdf:Bag>
</dc:subject>
<cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
<dc:creator>
<cc:Agent>
<dc:title>Garrett LeSage</dc:title>
</cc:Agent>
</dc:creator>
<dc:source />
<dc:contributor>
<cc:Agent>
<dc:title>Jakub Steiner, Steven Garrity</dc:title>
</cc:Agent>
</dc:contributor>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="Shadow"
style="display:inline" />
<g
style="display:inline"
inkscape:groupmode="layer"
inkscape:label="Base"
id="layer1">
<path
style="fill:none;stroke:#000000;stroke-width:0.98855311;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.01754384"
d="m 11.505723,5.4942766 0,37.9065924"
id="path15672"
sodipodi:nodetypes="cc" />
</g>
<g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="Magnifying Glass"
style="display:inline">
<path
inkscape:r_cy="true"
inkscape:r_cx="true"
transform="matrix(1.0734824,0,0,0.51109813,-0.2939296,22.850613)"
d="m 43.125,40.4375 a 19.5625,6.8125 0 1 1 -39.125,0 19.5625,6.8125 0 1 1 39.125,0 z"
sodipodi:ry="6.8125"
sodipodi:rx="19.5625"
sodipodi:cy="40.4375"
sodipodi:cx="23.5625"
id="path3008"
style="opacity:0.2;color:#000000;fill:url(#radialGradient2552);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
sodipodi:type="arc" />
<g
id="g1574"
transform="matrix(1.7305364,-0.48312911,0.46369613,1.8030612,-0.54253358,-56.70978)"
inkscape:r_cx="true"
inkscape:r_cy="true">
<path
transform="translate(-29.75546,19)"
sodipodi:nodetypes="cccccc"
id="path2960"
d="m 17.34116,32.5 5.625,-5.625 20.093749,-9.75 c 3.25,-1.25 5.1875,3.375 2.3125,5 L 25.34116,31.5 l -8,1 z"
style="color:#000000;fill:#cb9022;fill-opacity:1;fill-rule:evenodd;stroke:#5c410c;stroke-width:0.93443578;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
transform="translate(-29.75546,19)"
style="color:#000000;fill:url(#linearGradient2554);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
d="m 38.330708,20 c 0,0 1.4375,0.09375 2,1.34375 0.579493,1.287761 0,2.65625 0,2.65625 l 5.03125,-2.46875 c 0,0 1.452032,-0.881367 0.65625,-2.84375 -0.784912,-1.935577 -2.6875,-1.15625 -2.6875,-1.15625 l -5,2.46875 z"
id="path2964"
sodipodi:nodetypes="czcczcc"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
transform="translate(-29.75546,19)"
sodipodi:nodetypes="czcczcc"
id="path2962"
d="m 38.330708,20 c 0,0 1.4375,0.09375 2,1.34375 0.579493,1.287761 0,2.65625 0,2.65625 l 2,-1 c 0,0 0.827032,-1.318867 0.21875,-2.6875 C 41.924458,18.90625 40.330708,19 40.330708,19 l -2,1 z"
style="color:#000000;fill:url(#linearGradient2556);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
transform="translate(-29.75546,19)"
sodipodi:nodetypes="cccc"
id="path2982"
d="m 18.768208,31.78125 4.5,-4.5 c 1.5,0.8125 2.28125,2.15625 1.875,3.71875 l -6.375,0.78125 z"
style="color:#000000;fill:url(#radialGradient2558);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
transform="translate(-29.75546,19)"
sodipodi:nodetypes="cccc"
id="path2992"
d="m 20.111958,30.375 -1.625,1.59375 2.34375,-0.3125 c 0.21875,-0.71875 -0.1875,-1.0625 -0.71875,-1.28125 z"
style="color:#000000;fill:url(#linearGradient2560);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
transform="translate(-29.75546,19)"
sodipodi:nodetypes="ccccc"
id="path3002"
d="m 23.268208,27.25 1.5625,1.25 15.38734,-7.31867 C 39.773616,20.325286 38.976281,20.096733 38.314669,20.019068 L 23.268208,27.25 z"
style="color:#000000;fill:#ffffff;fill-opacity:0.36363639;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
<path
transform="translate(-29.75546,19)"
sodipodi:nodetypes="ccccc"
id="path3004"
d="m 25.143208,31.0625 0.1875,-0.75 15.23109,-7.1296 c 0,0 -0.11016,0.613627 -0.215879,0.74935 L 25.143208,31.0625 z"
style="color:#000000;fill:#000000;fill-opacity:0.36363639;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
inkscape:r_cx="true"
inkscape:r_cy="true" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

View File

@ -0,0 +1,814 @@
<?php
/**
* This is the administration panel for the plugin Flatpress Comment Center.
*/
if(!class_exists('plugin_commentcenter')) {
die('Don\'t try to hack us.');
}
class admin_entry_commentcenter extends AdminPanelAction {
# The language files
var $langres='plugin:commentcenter';
# The commands
var $commands=array('configure', 'polup', 'poldown', 'poledit', 'poldelete', 'approve_list',
'publishcomm', 'pubnoham', 'deletecomm', 'manage', 'deletecomm2', 'commspam');
# The submits
var $events=array('configure', 'edit_policy', 'delok', 'cancel', 'multidel', 'mpubcomm', 'mdelcomm',
'commdelok', 'ccancel', 'entry_search', 'mdelcomm_2', 'commdelok_2', 'ccancel_2');
/**
* This function is used as a callback when the panel is loaded.
* It indicates the Smarty template and it saves by reference the
* main class of the plugin Comment Center.
*/
function setup() {
global $lang;
$this->plugin=&$GLOBALS['plugin_commentcenter'];
$smarty=&$this->smarty;
# The default TPL
$smarty->assign('admin_resource', 'plugin:commentcenter/policies');
$smarty->assign('plugin_url', plugin_geturl('commentcenter'));
$smarty->register_modifier('idToSubject', array(&$this, '_idToTitle'));
add_filter('wp_title', array(&$this, '_title'), 15, 2);
add_action('wp_head', array(&$this, '_head'), 10);
}
/**
* This function is the callback for the hook system.
* It sets the title.
*
* @param string $val: The current title
* @param string $sep: The separator
* @return string: The title
*/
function _title($val, $sep) {
return "{$val} {$sep} Comment Center";
}
/**
* This function is the callback for the hook system.
* It adds the javascript of the plugin.
*/
function _head() {
if(!function_exists('plugin_jquery_head')) {
return;
}
$src1=plugin_geturl('commentcenter').'res/ajax.js';
$src2=BLOG_BASEURL.'admin.php?jslang=commentcenter';
echo '<script type="text/javascript" src="'.$src1."\"></script>\n";
echo '<script type="text/javascript" src="'.$src2."\"></script>\n";
}
/**
* This function return the entry title from the id.
* It's made to be called from Smarty.
*
* @param string $id: The entry id
* @return string: The output
*/
function _idToTitle($id) {
$o=new FPDB_Query(array('start'=>0, 'count'=>1, 'fullparse'=>false, 'id'=>$id), null);
if(!$o->hasMore()) {
return false;
}
$arr=$o->getEntry();
return wp_specialchars($arr[1]['subject']);
}
/**
* This function is an advanced redirect option.
*
* @param string $cmd: The command
* @param mixed $cmdval: The value for the command
* @param boolean $nosuccess: Don't save the success?
*/
function _redirect($cmd, $cmdval=1, $nosuccess=false) {
global $panel;
$smarty=&$this->smarty;
sess_add("success_{$panel}", $smarty->get_template_vars('success'));
$action_url=$smarty->get_template_vars('action_url');
$url=admin_filter_command($action_url, $cmd, $cmdval);
$url=html_entity_decode($url);
$url=substr($url, strlen(BLOG_BASEURL));
utils_redirect($url);
die;
}
/**
* This is the main function of the panel.
*/
function main() {
$smarty=&$this->smarty;
$plugin=&$this->plugin;
$plugin->loadPolicies();
$smarty->assign('policies', $plugin->policies);
}
/**
* This is the callback for the configure command.
*/
function doconfigure() {
global $lang;
$plugin=&$this->plugin;
$conf=$plugin->getConf();
$smarty=&$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/configure');
$smarty->assign('pl_conf', $conf);
$conf=$plugin->getConf();
if($conf['akismet_check']) {
$akismet=$plugin->akismetLoad();
if(is_numeric($akismet)) {
$error=$lang['admin']['entry']['commentcenter']['akismet_errors'][$akismet];
$smarty->assign('warnings', $error);
}
}
}
/**
* This callback is used when the configuration is saved.
*/
function onconfigure() {
if(!empty($_POST['akismet_url'])) {
$pos=strpos($_POST['akismet_url'], '//');
if($pos===FALSE || $pos>8) {
$_POST['akismet_url']='http://'.$_POST['akismet_url'];
}
}
$save=array('log_all'=>isset($_POST['log_all']),
'email_alert'=>isset($_POST['email_alert']),
'akismet_check'=>isset($_POST['akismet_check']),
'akismet_key'=>$_POST['akismet_key'],
'akismet_url'=>$_POST['akismet_url']);
// It doesn't make very sense: I could just use array_merge but...
foreach($save as $key=>$value) {
plugin_addoption('commentcenter', $key, $value);
}
$success=plugin_saveoptions() ? 1 : -1;
$this->smarty->assign('success', $success);
$this->_redirect('configure');
}
/**
* The edit policy/new policy action callback.
*
* @param integer $id: The policy id. -1 means a new one
* @return integer: The redirect option
*/
function dopoledit($id) {
global $lang;
$plugin=&$this->plugin;
$smarty=&$this->smarty;
$plang=&$lang['admin']['entry']['commentcenter'];
$plugin->loadPolicies();
$smarty->assign('policy', array());
$smarty->assign('admin_resource', 'plugin:commentcenter/editpol');
$smarty->assign('pol_id', $id);
if($id!=-1 && isset($plugin->policies[$id])) {
$smarty->assign('policy', $plugin->policies[$id]);
} elseif($id!=-1) {
# Inexistent policy
$smarty->assign('errors', $plang['errors']['pol_nonex']);
} else {
$smarty->assign('polnew', true);
}
return 0;
}
/**
* The edit policy/new policy save callback.
*
* @return integer: The redirect option
*/
function onedit_policy() {
$plugin=&$this->plugin;
$success=2;
$policy=array();
@$id=$_POST['policy_id'];
$plugin->loadPolicies();
if($id!=-1 && !isset($plugin->policies[$id])) {
$success=-2;
}
while(true && $success==2) {
if(empty($_POST['apply_to'])) {
$success=-2;
break;
}
if(!isset($_POST['behavoir'])) {
$success=-2;
break;
}
$behavoir=$_POST['behavoir'];
if($behavoir!=1 && $behavoir!=0 && $behavoir!=-1) {
$success=-2;
break;
}
$policy['do']=$behavoir;
switch($_POST['apply_to']) {
case 'all_entries':
$policy['is_all']=true;
break 2;
case 'some_entries':
if(empty($_POST['entries'])) {
$success=-2;
} else {
$entries=array();
foreach($_POST['entries'] as $entry) {
if(entry_exists($entry)) {
$entries[]=$entry;
}
}
if(count($entries)==0) {
$success=-2;
} else {
$entries=array_unique($entries);
$policy['entry']=$entries;
}
}
break 2;
case 'properties':
$policy['is_all']=true;
if(isset($_POST['cats'])) {
$policy['categories']=array_keys($_POST['cats']);
$policy['is_all']=false;
}
if(is_numeric($_POST['older'])) {
# Save in seconds
$policy['older']=$_POST['older']*86400;
$policy['is_all']=false;
}
if(isset($policy['is_all']) && @!$policy['is_all']) {
unset($policy['is_all']);
}
break 2;
default:
$success=-2;
break 2;
}
break;
}
if($success==2) {
if($id==-1) {
$plugin->policies[]=$policy;
} else {
$plugin->policies[$id]=$policy;
}
$success=$plugin->savePolicies() ? 2 : -2;
}
$this->smarty->assign('success', $success);
return 2;
}
/**
* This function is the callback for the poldelete action.
*
* @param integer $id: The id of policy you wish to delete
* @return integer: Redirect option
*/
function dopoldelete($id) {
$plugin=&$this->plugin;
$smarty=&$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/deletepol');
$plugin->loadPolicies();
if(isset($plugin->policies[$id])) {
$smarty->assign('policies', array($id=>$plugin->policies[$id]));
}
$smarty->assign('single', true);
return 0;
}
/**
* This function is like dopoldelete but it's for multiple policies.
*
* @return integer: Redirect option
*/
function onmultidel() {
$plugin=&$this->plugin;
$smarty=&$this->smarty;
if(@!count($_POST['select'])) {
$smarty->assign('success', -4);
return 2;
}
$smarty->assign('admin_resource', 'plugin:commentcenter/deletepol');
$plugin->loadPolicies();
$policies=array();
foreach($_POST['select'] as $polid=>$checkvalue) {
if(isset($plugin->policies[$polid])) {
$policies[$polid]=$plugin->policies[$polid];
}
}
if(count($policies)>0) {
$smarty->assign('policies', $policies);
} else {
$smarty->assign('success', -4);
return 2;
}
if(count($policies)==1) {
$smarty->assign('single', true);
}
return 0;
}
/**
* This is the delete ok command.
*
* @return integer: The redirect option
*/
function ondelok() {
if(empty($_POST['del_policy'])) {
$s=-4;
} else {
$plugin=$this->plugin;
$plugin->loadPolicies();
foreach($_POST['del_policy'] as $polid) {
if(isset($plugin->policies[$polid])) {
unset($plugin->policies[$polid]);
}
}
$s=$plugin->savePolicies() ? 4 : -4;
}
$this->smarty->assign('success', $s);
return 2;
}
/**
* This is the cancel callback. It just makes the redirect.
*
* @return integer: The redirect option
*/
function oncancel() {
return 2;
}
/**
* This function is the callback for the polup action.
*
* @param integer $id: The id of policy you wish to delete
* @return integer: Redirect option
*/
function dopolup($id) {
$s=-3;
if($id>0) {
$plugin=&$this->plugin;
$plugin->loadPolicies();
$plugin->policyMove($id, $id-1);
$s=$plugin->savePolicies() ? 3 : -3;
}
$this->smarty->assign('success', $s);
return 2;
}
/**
* This function is the callback for the poldown action.
*
* @param integer $id: The id of policy you wish to delete
* @return integer: Redirect option
*/
function dopoldown($id) {
$s=-3;
$plugin=&$this->plugin;
$plugin->loadPolicies();
if($id<count($plugin->policies)-1) {
$plugin->policyMove($id, $id+1);
$s=$plugin->savePolicies() ? 3 : -3;
}
$this->smarty->assign('success', $s);
return 2;
}
/**
* This function is the callback for the approve_list command
*
* @return integer: The redirect option
*/
function doapprove_list() {
$plugin=&$this->plugin;
$smarty=&$this->smarty;
$conf=$plugin->getConf();
$smarty->assign('use_akismet', @$conf['akismet_check']);
$smarty->assign('other', @$conf['log_all']);
$smarty->assign('admin_resource', 'plugin:commentcenter/approvelist');
$lister=new commentcenter_list($plugin->pl_dir);
$smarty->assign('entries', $lister->toDetails());
return 0;
}
/**
* This function is the callback for the publishcomm command
*
* @param string $id: The comment id
* @param boolean $noredirect: If true, don't redirect
* @param boolean $noham: If it was blocked from Akismet, don't submit as ham
* @return integer: The redirect option
*/
function dopublishcomm($id, $noredirect=false, $noham=false) {
$plugin=&$this->plugin;
$smarty=&$this->smarty;
$f=$plugin->pl_dir.$id.'.txt';
if(!file_exists($f)) {
$smarty->assign('success', -5);
$succ=-5;
} else {
include $f;
$entry=substr($id, 1, 18);
$ham=false;
if(isset($comment['log_reason'])) {
$ham=$comment['log_reason']=='akismet' && !$noham;
unset($comment['log_reason']);
}
if(isset($comment['id'])) {
unset($comment['id']);
}
if($ham) {
$clean=$plugin->akismetClean($comment, $entry);
$akismet=&$plugin->akismetLoad();
if(is_object($akismet)) {
$akismet->setComment($clean);
$akismet->submitHam();
}
}
$id=comment_save($entry, $comment);
do_action('comment_post', $entry, array($id, $comment));
$succ=$id ? 5 : -5;
$smarty->assign('success', $succ);
if($succ==5) {
@unlink($f);
}
}
if($noredirect) {
return $succ==5;
}
$this->_redirect('approve_list');
return 0;
}
/**
* This is the callback for the action pubnoham.
*
* @param string $id: The comment id
* @return integer: The redirect option.
*/
function dopubnoham($id) {
return $this->dopublishcomm($id, false, true);
}
/**
* This is the callback to publish multiple comments.
*
* @return integer: The redirect option
*/
function onmpubcomm() {
if(!isset($_POST['select'])) {
$this->dopublishcomm('fake');
}
$target=count($_POST['select']);
$noham=!isset($_POST['submitham']);
$i=0;
foreach((array)$_POST['select'] as $comm=>$check) {
$i++;
$this->dopublishcomm($comm, $i!=$target, $noham);
}
// If it's correct, we should exited the script before
$this->smarty->assign('success', -5);
$this->_redirect('approve_list');
return 0;
}
/**
* This function is the callback for the deletecomm action.
*
* @param integer $id: The id of the comment you wish to delete
* @return integer: Redirect option
*/
function dodeletecomm($id) {
$plugin=&$this->plugin;
$smarty=&$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
$entry=substr($id, 1, 18);
$commid=substr($id, 21, 20);
$f=$plugin->pl_dir.$id.'.txt';
if(file_exists($f)) {
include $f;
$delete[$entry]['del'][$commid]=$comment;
$smarty->assign('entries', $delete);
} else {
$smarty->assign('success', -6);
$this->_redirect('approve_list');
}
$smarty->assign('single', true);
return 0;
}
/**
* This function is like dopoldelete but it's for multiple policies.
*
* @return integer: Redirect option
*/
function onmdelcomm() {
$plugin=&$this->plugin;
$smarty=&$this->smarty;
if(@!count($_POST['select'])) {
$smarty->assign('success', -6);
$this->_redirect('approve_list');
return 0;
}
$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
$remove=array();
foreach($_POST['select'] as $commbig=>$check) {
$entry=substr($commbig, 1, 18);
$commid=substr($commbig, 21, 20);
$f=$plugin->pl_dir.$commbig.'.txt';
if(file_exists($f)) {
include $f;
$remove[$entry]['del'][$commid]=$comment;
}
}
if(count($remove)>0) {
$smarty->assign('entries', $remove);
} else {
$smarty->assign('success', -6);
$this->_redirect('approve_list');
return 0;
}
if(count($remove)==1) {
$smarty->assign('single', true);
}
return 0;
}
/**
* This is the delete ok command.
*
* @return integer: The redirect option
*/
function oncommdelok() {
if(empty($_POST['select'])) {
$s=-6;
} else {
foreach($_POST['select'] as $commid=>$check) {
$f=$this->plugin->pl_dir.$commid.'.txt';
@unlink($f);
}
$s=6;
}
$this->smarty->assign('success', $s);
$this->_redirect('approve_list');
return 2;
}
/**
* This is the cancel callback. It just makes the redirect.
*
* @return integer: The redirect option
*/
function onccancel() {
$this->_redirect('approve_list');
return 2;
}
/**
* This function is the callback for the action "manage".
*
* @param string $entry: The entry id
* @return integer: The redirect option
*/
function domanage($entry) {
global $lang, $fpdb;
$smarty=&$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/manage');
$smarty->assign('is_managing', true);
$conf=$this->plugin->getConf();
if(@$conf['akismet_check']) {
$smarty->assign('use_akismet', true);
}
if($entry!='search' && !entry_exists($entry)) {
$smarty->assign('error', $lang['admin']['entry']['commentcenter']['errors']['entry_nf']);
} elseif($entry!='search') {
$smarty->assign('entry_id', $entry);
$smarty->assign('fetch', 'list');
$fpdb->query("id:{$entry},fullparse:true,comments:true");
$q=&$fpdb->getQuery();
$q->getEntry();
$list=array();
while($q->comments->hasMore()) {
list($id, $comment)=$q->comments->getComment();
$list[$entry]['list'][$id]=$comment;
}
$smarty->assign('entries', $list);
}
return 0;
}
/**
* Since it's impossible to use a GET form in Flatpress, to search entries
* we have to use a POST form, and here's its callback.
*
* @return integer: The redirect option
*/
function onentry_search() {
if(!isset($_POST['entry'])) {
$_POST['entry']='';
}
// In the function we call 'search' isn't an error, but here yes, so delete it
if($_POST['entry']=='search') {
$_POST['entry']='';
}
return @$this->domanage($_POST['entry']);
}
/**
* This function is the callback for the deletecomm2 action.
*
* @param integer $id: The id of the comment you wish to delete
* @return integer: Redirect option
*/
function dodeletecomm2($id) {
$smarty=&$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
$smarty->assign('is_managing', true);
$entry=substr($id, 1, 18);
$commid=substr($id, 21, 20);
$smarty->assign('entry', $entry);
if(comment_exists($entry, $commid)) {
$delete[$entry]['del'][$commid]=comment_parse($entry, $commid);
$smarty->assign('entries', $delete);
} else {
$smarty->assign('success', -6);
$this->_redirect('manage', $entry);
}
$smarty->assign('single', true);
return 0;
}
/**
* This function is like dopoldelete but it's for multiple policies.
*
* @return integer: Redirect option
*/
function onmdelcomm_2() {
$smarty=&$this->smarty;
if(@!count($_POST['select'])) {
$smarty->assign('success', -6);
$this->_redirect('manage', @$_POST['entry_hid']);
return 0;
}
$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
$smarty->assign('is_managing', true);
$smarty->assign('entry', @$_POST['entry_hid']);
$remove=array();
foreach($_POST['select'] as $commbig=>$check) {
$entry=substr($commbig, 1, 18);
$commid=substr($commbig, 21, 20);
$comment=comment_parse($entry, $commid);
if($comment!==false) {
$remove[$entry]['del'][$commid]=$comment;
}
}
if(count($remove)>0) {
$smarty->assign('entries', $remove);
} else {
$smarty->assign('success', -6);
$this->_redirect('manage', @$_POST['entry_hid']);
return 0;
}
if(count($remove)==1) {
$smarty->assign('single', true);
}
return 0;
}
/**
* This is the delete ok command.
*
* @return integer: The redirect option
*/
function oncommdelok_2() {
if(empty($_POST['select'])) {
$s=-6;
} else {
$i=0;
foreach($_POST['select'] as $commid=>$check) {
$entry=substr($commid, 1, 18);
$commid=substr($commid, 21, 20);
$i+=comment_delete($entry, $commid) ? 1 : 0;
}
$s=$i>0 ? 6 : -6;
}
$this->smarty->assign('success', $s);
$this->_redirect('manage', @$_POST['entry']);
return 2;
}
/**
* This is the cancel callback. It just makes the redirect.
*
* @return integer: The redirect option
*/
function onccancel_2() {
$this->_redirect('manage', @$_POST['entry']);
return 2;
}
/**
* This function is the callback for the action commspam.
*
* @param string $id: The comment id
* @return integer: The redirect option
*/
function docommspam($id) {
$smarty=&$this->smarty;
$plugin=&$this->plugin;
$entry=substr($id, 1, 18);
$commid=substr($id, 21, 20);
if(!comment_exists($entry, $commid)) {
$smarty->assign('success', -7);
} else {
$comment=comment_parse($entry, $commid);
$clean=$plugin->akismetClean($comment, $entry);
$akismet=&$plugin->akismetLoad();
if(is_object($akismet)) {
$akismet->setComment($clean);
$akismet->submitSpam();
$smarty->assign('success', $akismet->errorsExist() ? -7 : 7);
} else {
$smarty->assign('success', -7);
}
}
$this->_redirect('manage', $entry);
return 0;
}
}
admin_addpanelaction('entry', 'commentcenter', true);

View File

@ -0,0 +1,388 @@
<?php
/**
* 08.11.2010 22:25:17est
*
* Akismet PHP4 class
*
* <b>Usage</b>
* <code>
* $comment = array(
* 'author' => 'viagra-test-123',
* 'email' => 'test@example.com',
* 'website' => 'http://www.example.com/',
* 'body' => 'This is a test comment',
* 'permalink' => 'http://yourdomain.com/yourblogpost.url',
* );
*
* $akismet = new Akismet('http://www.yourdomain.com/', 'YOUR_WORDPRESS_API_KEY', $comment);
*
* if($akismet->errorsExist()) {
* echo"Couldn't connected to Akismet server!";
* } else {
* if($akismet->isSpam()) {
* echo"Spam detected";
* } else {
* echo"yay, no spam!";
* }
* }
* </code>
*
* @author Bret Kuhns {@link www.bretkuhns.com}
* @link http://code.google.com/p/akismet-php4
* @version 0.3.5
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
// Error constants
define("AKISMET_SERVER_NOT_FOUND", 0);
define("AKISMET_RESPONSE_FAILED", 1);
define("AKISMET_INVALID_KEY", 2);
// Base class to assist in error handling between Akismet classes
class AkismetObject {
var $errors = array();
/**
* Add a new error to the errors array in the object
*
* @param String $name A name (array key) for the error
* @param String $string The error message
* @return void
*/
// Set an error in the object
function setError($name, $message) {
$this->errors[$name] = $message;
}
/**
* Return a specific error message from the errors array
*
* @param String $name The name of the error you want
* @return mixed Returns a String if the error exists, a false boolean if it does not exist
*/
function getError($name) {
if($this->isError($name)) {
return $this->errors[$name];
} else {
return false;
}
}
/**
* Return all errors in the object
*
* @return String[]
*/
function getErrors() {
return (array)$this->errors;
}
/**
* Check if a certain error exists
*
* @param String $name The name of the error you want
* @return boolean
*/
function isError($name) {
return isset($this->errors[$name]);
}
/**
* Check if any errors exist
*
* @return boolean
*/
function errorsExist() {
return (count($this->errors) > 0);
}
}
// Used by the Akismet class to communicate with the Akismet service
class AkismetHttpClient extends AkismetObject {
var $akismetVersion = '1.1';
var $con;
var $host;
var $port;
var $apiKey;
var $blogUrl;
var $errors = array();
// Constructor
function __construct($host, $blogUrl, $apiKey, $port = 80) {
$this->host = $host;
$this->port = $port;
$this->blogUrl = $blogUrl;
$this->apiKey = $apiKey;
}
// Use the connection active in $con to get a response from the server and return that response
function getResponse($request, $path, $type = "post", $responseLength = 1160) {
$this->_connect();
if($this->con && !$this->isError(AKISMET_SERVER_NOT_FOUND)) {
$request =
strToUpper($type)." /{$this->akismetVersion}/$path HTTP/1.0\r\n" .
"Host: ".((!empty($this->apiKey)) ? $this->apiKey."." : null)."{$this->host}\r\n" .
"Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n" .
"Content-Length: ".strlen($request)."\r\n" .
"User-Agent: Akismet PHP4 Class\r\n" .
"\r\n" .
$request
;
$response = "";
@fwrite($this->con, $request);
while(!feof($this->con)) {
$response .= @fgets($this->con, $responseLength);
}
$response = explode("\r\n\r\n", $response, 2);
return $response[1];
} else {
$this->setError(AKISMET_RESPONSE_FAILED, "The response could not be retrieved.");
}
$this->_disconnect();
}
// Connect to the Akismet server and store that connection in the instance variable $con
function _connect() {
if(!($this->con = @fsockopen($this->host, $this->port))) {
$this->setError(AKISMET_SERVER_NOT_FOUND, "Could not connect to akismet server.");
}
}
// Close the connection to the Akismet server
function _disconnect() {
@fclose($this->con);
}
}
// The controlling class. This is the ONLY class the user should instantiate in
// order to use the Akismet service!
class Akismet extends AkismetObject {
var $apiPort = 80;
var $akismetServer = 'rest.akismet.com';
var $akismetVersion = '1.1';
var $http;
var $ignore = array(
'HTTP_COOKIE',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED_HOST',
'HTTP_MAX_FORWARDS',
'HTTP_X_FORWARDED_SERVER',
'REDIRECT_STATUS',
'SERVER_PORT',
'PATH',
'DOCUMENT_ROOT',
'SERVER_ADMIN',
'QUERY_STRING',
'PHP_SELF',
'argv'
);
var $blogUrl = "";
var $apiKey = "";
var $comment = array();
/**
* Constructor
*
* Set instance variables, connect to Akismet, and check API key
*
* @param String $blogUrl The URL to your own blog
* @param String $apiKey Your wordpress API key
* @param String[] $comment A formatted comment array to be examined by the Akismet service
* @return Akismet
*/
function __construct($blogUrl, $apiKey, $comment = array()) {
$this->blogUrl = $blogUrl;
$this->apiKey = $apiKey;
$this->setComment($comment);
// Connect to the Akismet server and populate errors if they exist
$this->http = new AkismetHttpClient($this->akismetServer, $blogUrl, $apiKey);
if($this->http->errorsExist()) {
$this->errors = array_merge($this->errors, $this->http->getErrors());
}
// Check if the API key is valid
if(!$this->_isValidApiKey($apiKey)) {
$this->setError(AKISMET_INVALID_KEY, "Your Akismet API key is not valid.");
}
}
/**
* Query the Akismet and determine if the comment is spam or not
*
* @return boolean
*/
function isSpam() {
$response = $this->http->getResponse($this->_getQueryString(), 'comment-check');
return ($response == "true");
}
/**
* Submit this comment as an unchecked spam to the Akismet server
*
* @return void
*/
function submitSpam() {
$this->http->getResponse($this->_getQueryString(), 'submit-spam');
}
/**
* Submit a false-positive comment as "ham" to the Akismet server
*
* @return void
*/
function submitHam() {
$this->http->getResponse($this->_getQueryString(), 'submit-ham');
}
/**
* Manually set the comment value of the instantiated object.
*
* @param Array $comment
* @return void
*/
function setComment($comment) {
$this->comment = $comment;
if(!empty($comment)) {
$this->_formatCommentArray();
$this->_fillCommentValues();
}
}
/**
* Returns the current value of the object's comment array.
*
* @return Array
*/
function getComment() {
return $this->comment;
}
/**
* Check with the Akismet server to determine if the API key is valid
*
* @access Protected
* @param String $key The Wordpress API key passed from the constructor argument
* @return boolean
*/
function _isValidApiKey($key) {
$keyCheck = $this->http->getResponse("key=".$this->apiKey."&blog=".$this->blogUrl, 'verify-key');
return ($keyCheck == "valid");
}
/**
* Format the comment array in accordance to the Akismet API
*
* @access Protected
* @return void
*/
function _formatCommentArray() {
$format = array(
'type' => 'comment_type',
'author' => 'comment_author',
'email' => 'comment_author_email',
'website' => 'comment_author_url',
'body' => 'comment_content'
);
foreach($format as $short => $long) {
if(isset($this->comment[$short])) {
$this->comment[$long] = $this->comment[$short];
unset($this->comment[$short]);
}
}
}
/**
* Fill any values not provided by the developer with available values.
*
* @return void
*/
function _fillCommentValues() {
if(!isset($this->comment['user_ip'])) {
$this->comment['user_ip'] = ($_SERVER['REMOTE_ADDR'] != getenv('SERVER_ADDR')) ? $_SERVER['REMOTE_ADDR'] : getenv('HTTP_X_FORWARDED_FOR');
}
if(!isset($this->comment['user_agent'])) {
$this->comment['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
if(!isset($this->comment['referrer'])) {
$this->comment['referrer'] = $_SERVER['HTTP_REFERER'];
}
if(!isset($this->comment['blog'])) {
$this->comment['blog'] = $this->blogUrl;
}
}
/**
* Build a query string for use with HTTP requests
*
* @access Protected
* @return String
*/
function _getQueryString() {
foreach($_SERVER as $key => $value) {
if(!in_array($key, $this->ignore)) {
if($key == 'REMOTE_ADDR') {
$this->comment[$key] = $this->comment['user_ip'];
} else {
$this->comment[$key] = $value;
}
}
}
$query_string = '';
foreach($this->comment as $key => $data) {
$query_string .= $key . '=' . urlencode(stripslashes($data)) . '&';
}
return $query_string;
}
}
?>

View File

@ -0,0 +1,44 @@
<?php
/**
* This file integrates the plugin into the entry editor.
*/
if(!class_exists('plugin_commentcenter')) {
die('Don\'t try to hack us.');
}
/**
* This function is called by the simple_edit_form hook to add
* the Commentcenter options on the entry editor.
*/
function plugin_commentcenter_editor() {
// Just on existent entries
if(empty($_REQUEST['entry'])) {
return;
}
global $smarty, $lang, $action;
$entry=$_REQUEST['entry'];
$plugin=&$GLOBALS['plugin_commentcenter'];
$plang=&$lang['admin']['entry']['commentcenter'];
$arr=$smarty->get_template_vars('post');
$panel_url=$smarty->get_template_vars('panel_url');
$plugin->loadPolicies();
$do=$plugin->behavoirFromPolicies($entry, @$arr['categories']);
$do='simple_'.$do;
$oldact=$action;
$action='commentcenter';
$policies=admin_filter_action($panel_url, 'commentcenter');
$manage=admin_filter_command($policies, 'manage', $entry);
$action=$oldact;
echo "<fieldset id=\"commentcenter\">\n";
echo "<legend>Comment Center</legend>\n<ul>\n<li>";
echo "<a href=\"{$policies}\" title=\"{$plang['simple_edit']}\">";
echo "{$plang['simple_pre']}{$plang[$do]}</a></li>\n";
echo "<li><a href=\"{$manage}\">{$plang['simple_manage']}</a></li>\n";
echo "\n</ul></fieldset>\n";
}
add_filter('simple_edit_form', 'plugin_commentcenter_editor');

View File

@ -0,0 +1,33 @@
<?php
/**
* This function prints some localized strings in javascript.
* It's called by the init hook.
*/
function plugin_commentcenter_jslang() {
if(empty($_GET['jslang'])) {
return;
}
if($_GET['jslang']!='commentcenter') {
return;
}
global $lang;
header('Content-type: text/javascript');
echo "commentcenter_lang={\n";
foreach($lang['admin']['entry']['commentcenter']['msgs'] as $key=>$value) {
$key=str_replace('-', '_', $key);
$value=str_replace("\n", "\\n", $value);
$value=str_replace("\r", "\\r", $value);
$value=str_replace("\t", "\\t", $value);
$value=str_replace('"', '\\"', $value);
echo "\t'msg{$key}' : \"{$value}\",\n";
}
echo '}';
die;
}
add_action('init', 'plugin_commentcenter_jslang');

View File

@ -0,0 +1,187 @@
<?php
$lang['admin']['entry']['submenu']['commentcenter']='Comment Center';
$lang['admin']['entry']['commentcenter']=array(
# Header of the panel
'title'=>'Comment Center',
'desc1'=>'This panel allows you to manage the comments on your blog.',
'desc2'=>'Here you can do several things:',
# Links
'lpolicies'=>'Manage the policies',
'lapprove'=>'Show blocked comments',
'lmanage'=>'Manage comments',
'lconfig'=>'Configure the plugin',
# Policies
'policies'=>'Policies',
'desc_pol'=>'Here you can edit the policies of comments.',
'select'=>'Select',
'criteria'=>'Criteria',
'behavoir'=>'Behavoir',
'options'=>'Options',
'entry'=>'Entry',
'entries'=>'Entries',
'categories'=>'Categories',
'nopolicies'=>'There isn\'t any policy.',
'all_entries'=>'All Entries',
'fol_entries'=>'The policy is applied to the following entries:',
'fol_cats'=>'The policy is applied to entries in the following categories:',
'older'=>'The policy is applied to entries older than %d day(s).',
'allow'=>'Allow to comment',
'block'=>'Block comments',
'approvation'=>'Comments need to be approved',
'up'=>'Move up',
'down'=>'Move down',
'edit'=>'Edit',
'delete'=>'Delete',
'newpol'=>'Add a new policy',
'del_selected'=>'Delete selected policy(ies)',
'select_all'=>'Select All',
'deselect_all'=>'Deselect All',
# Configuration page
'configure'=>'Configure the plugin',
'desc_conf'=>'Here you can modify the options of the plugin.',
'log_all'=>'Log blocked comments',
'log_all_long'=>'Check it if you want to log also comments that are blocked.',
'email_alert'=>'Notify comments via email',
'email_alert_long'=>'Check it if you want that when there is a comment to approve you want to be '.
'informed via email.',
'akismet'=>'Akismet',
'akismet_use'=>'Enable Akismet check',
'akismet_key'=>'Akismet Key',
'akismet_key_long'=>'The Akismet service provide you a key to use it. Insert here.',
'akismet_url'=>'Blog base URL for Akismet',
'akismet_url_long'=>'I think for Akismet free service you should use just a domain. '.
'You can leave blank this field, <code>%s</code> will be used.',
'save_conf'=>'Save Configuration',
# Edit policy page
'apply_to'=>'Apply to',
'editpol'=>'Edit a policy',
'createpol'=>'Create a policy',
'some_entries'=>'Some Entries',
'properties'=>'Entry with certain properties',
'se_desc'=>'If you selected the %s option, please insert entries you want to apply to this policy.',
'se_fill'=>'Please fill the fields with the id of the entries (<code>entryYYMMDD-HHMMSS</code>).',
'po_title'=>'Properties',
'po_desc'=>'If you selected the %s option, please fill the properties.',
'po_comp'=>'The fields aren\'t compulsory but you must fill at least one or the policy '.
'will apply on all entries.',
'po_time'=>'Time options',
'po_older'=>'Apply to entries older than ',
'days'=>'days.',
'save_policy'=>'Save Policy',
# Delete policies page
'del_policies'=>'Delete Policies',
'del_descs'=>'You are going to delete this policy: ',
'del_descm'=>'You are going to delete these policies: ',
'sure'=>'Are you sure?',
'del_subs'=>'Yes, please delete it',
'del_subm'=>'Yes, please delete them',
'del_cancel'=>'No, take me back to the panel',
# Approve comments page
'app_title'=>'Approve comment',
'app_desc'=>'Here you can approve comments.',
'app_date'=>'Date',
'app_content'=>'Comment',
'app_author'=>'Author',
'app_email'=>'Email',
'app_ip'=>'IP',
'app_actions'=>'Actions',
'app_publish'=>'Publish',
'app_delete'=>'Delete',
'app_nocomms'=>'There isn\'t any comment.',
'app_pselected'=>'Publish selected comment(s)',
'app_dselected'=>'Remove selected comment(s)',
'app_other'=>'Other Comments',
'app_akismet'=>'Signed as spam',
'app_spamdesc'=>'These comments were blocked by Akismet.',
'app_hamsubmit'=>'Submit to Akismet as ham when you publish them.',
'app_pubnotham'=>'Publish it but dont\'submit as ham',
# Delete comments page
'delc_title'=>'Delete Comments',
'delc_descs'=>'You are going to delete this comment: ',
'delc_descm'=>'You are going to delete these comments: ',
# Manage comments page
'man_searcht'=>'Search an entry',
'man_searchd'=>'Insert the id of the entry whose you want to manage comments.',
'man_search'=>'Search',
'man_commfor'=>'Comments for %s',
'man_spam'=>'Submit as spam to Akismet',
# The simple edit
'simple_pre'=>'Comments for this entry will ',
'simple_1'=>'be allowed.',
'simple_0'=>'require your approval.',
'simple_-1'=>'be blocked.',
'simple_manage'=>'Manage the comments of this entry.',
'simple_edit'=>'Edit Policies',
# Akismet warnings
'akismet_errors'=>array(
-1=>'The Akismet key is empty. Please insert it.',
-2=>'We couldn\'t call Akismet servers.',
-3=>'The Akismet response failed.',
-4=>'The Akismet key is not valid.',
),
# Messages
'msgs'=>array(
1=>'Configuration saved.',
-1=>'An error occurred while trying to save the configuration.',
2=>'Policy saved.',
-2=>'An error occurred while trying to save the policy (maybe your settings are wrong).',
3=>'Policy moved.',
-3=>'An error occurred while trying to move the policy (or it can\'t be moved).',
4=>'Policy(ies) removed.',
-4=>'An error occurred while trying to remove the policy(ies) (or you haven\'t selected any policy).',
5=>'Comment(s) published.',
-5=>'An error occurred while trying to publish the comment(s).',
6=>'Comment(s) removed.',
-6=>'An error occurred while trying to remove the comment(s) (or you haven\'t selected any comment).',
7=>'Comment submitted.',
-7=>'An error occurred while trying to submit the comment.',
),
# Errors
'errors'=>array(
'pol_nonex'=>'The policy you want to edit does not exist.',
'entry_nf'=>'The entry you have selected does not exist.',
),
);
$lang['plugin']['commentcenter']=array(
'akismet_error'=>'Sorry, we\'re encountering technical difficulties.',
'lock'=>'Comments for this entry are blocked, sorry.',
'approvation'=>'The comments has been saved but the Administrator must approve it before showing it.',
# Mail for comments
'mail_subj'=>'New comment to approve on %s',
);
$lang['plugin']['commentcenter']['mail_text']=<<<MAIL
Dear %toname%,
"%fromname%" %frommail% has just posted a comment to the entry entitled "%entrytitle%"
but it need your approval before showing it.
Here is the comment that has just been posted:
***************
%content%
***************
All the best,
%blogtitle%
MAIL;

View File

@ -0,0 +1,187 @@
<?php
$lang['admin']['entry']['submenu']['commentcenter']='Comment Center';
$lang['admin']['entry']['commentcenter']=array(
# Header of the panel
'title'=>'Comment Center',
'desc1'=>'Questo pannello ti consente di gestire i commenti del tuo blog.',
'desc2'=>'Qui puoi fare numerose cose:',
# Links
'lpolicies'=>'Gestire le regole',
'lapprove'=>'Elencare i commenti bloccati',
'lmanage'=>'Gestire i commenti',
'lconfig'=>'Configurare il plugin',
# Policies
'policies'=>'Regole',
'desc_pol'=>'Qui puoi modificare le regole sui commenti.',
'select'=>'Seleziona',
'criteria'=>'Criteri',
'behavoir'=>'Comportamento',
'options'=>'Opzioni',
'entry'=>'Post',
'entries'=>'Post',
'categories'=>'Categorie',
'nopolicies'=>'Non c\'è nessuna regola.',
'all_entries'=>'Tutti i post',
'fol_entries'=>'La regola è applicata ai seguenti post:',
'fol_cats'=>'La regola è applicata ai post nelle seguenti categorie:',
'older'=>'La regola è applicata ai post più vecchi di %d giorno/i.',
'allow'=>'Permetti di commentare',
'block'=>'Blocca i commenti',
'approvation'=>'I commenti devono essere approvati',
'up'=>'Sposta in su',
'down'=>'Sposta in giù',
'edit'=>'Modifica',
'delete'=>'Elimina',
'newpol'=>'Aggiungi una nuova regola',
'del_selected'=>'Elimina le regole selezionate',
'select_all'=>'Seleziona tutto',
'deselect_all'=>'Deseleziona tutto',
# Configuration page
'configure'=>'Configura il plugin',
'desc_conf'=>'Qui puoi modificare le impostazioni del plugin.',
'log_all'=>'Registra i commenti bloccati',
'log_all_long'=>'Selezionala se vuoi registrare anche i commenti che sono bloccati.',
'email_alert'=>'Notifica commenti via email',
'email_alert_long'=>'Selezionala se vuoi essere informato via email quando c\'è un nuovo commento '.
'da approvare.',
'akismet'=>'Akismet',
'akismet_use'=>'Abilita il controllo di Akismet',
'akismet_key'=>'Chiave di Akismet',
'akismet_key_long'=>'Per usare Akismet ti viene fornita una chiave. Inseriscila qui.',
'akismet_url'=>'Indirizzo di base per Akismet',
'akismet_url_long'=>'Penso che per il servizio gratuito di Akismet si possa usare un solo indirizzo. '.
'Puoi anche lasciare vuoto questo campo, al suo posto si utilizzerà <code>%s</code>.',
'save_conf'=>'Salva configurazione',
# Edit policy page
'apply_to'=>'Applica a',
'editpol'=>'Modifica una regola',
'createpol'=>'Crea una regola',
'some_entries'=>'Alcuni post',
'properties'=>'Post con precise caratteristiche',
'se_desc'=>'Se hai selezionato l\'opzione %s, per favore inserisci i post a cui la vuoi applicare.',
'se_fill'=>'Per favore riempi i campi con gli id dei post (<code>entryYYMMDD-HHMMSS</code>).',
'po_title'=>'Caratteristiche',
'po_desc'=>'Se hai selezionato l\'opzione %s, per seleziona le caratteristiche.',
'po_comp'=>'I campi non sono obbligatori ma ne devi selezionare almeno uno, altrimenti la regola '.
'sarà applicata a tutti i post.',
'po_time'=>'Opzioni sulle date',
'po_older'=>'Applica ai post più vecchi di ',
'days'=>'giorni.',
'save_policy'=>'Salva regola',
# Delete policies page
'del_policies'=>'Elimina regole',
'del_descs'=>'Stai per eliminare la seguente regola: ',
'del_descm'=>'Stai per eliminare la seguenti regoli: ',
'sure'=>'Sei sicuro?',
'del_subs'=>'Sì, continua l\'eliminazione',
'del_subm'=>'Sì, continua l\'eliminazione',
'del_cancel'=>'No, riportami al pannello',
# Approve comments page
'app_title'=>'Approva commenti',
'app_desc'=>'Qui puoi approvare i commenti.',
'app_date'=>'Data',
'app_content'=>'Commento',
'app_author'=>'Autore',
'app_email'=>'Email',
'app_ip'=>'IP',
'app_actions'=>'Azioni',
'app_publish'=>'Pubblica',
'app_delete'=>'Elimina',
'app_nocomms'=>'Non c\'è nessun commento.',
'app_pselected'=>'Pubblica i commenti selezionati',
'app_dselected'=>'Elimina i commenti selezionati',
'app_other'=>'Alti Commenti',
'app_akismet'=>'Segnalati come spam',
'app_spamdesc'=>'Questi commenti sono stati bloccati da Akismet.',
'app_hamsubmit'=>'Inviali ad Akismet come ham quando li pubblichi.',
'app_pubnotham'=>'Pubblica senza inviarlo come ham',
# Delete comments page
'delc_title'=>'Elimina Commenti',
'delc_descs'=>'Stai per eliminare questo commento: ',
'delc_descm'=>'Stai per eliminare questi commenti: ',
# Manage comments page
'man_searcht'=>'Cerca un post',
'man_searchd'=>'Inserisci l\'id del post di cui vuoi gestire i commenti.',
'man_search'=>'Cerca',
'man_commfor'=>'Commenti di %s',
'man_spam'=>'Segnala come spam ad Akismet',
# The simple edit
'simple_pre'=>'In questo post i commenti ',
'simple_1'=>'sono ammessi.',
'simple_0'=>'richiedono la tua approvazione.',
'simple_-1'=>'sono bloccati.',
'simple_manage'=>'Gestisci i commenti di questo post.',
'simple_edit'=>'Modifica le regole',
# Akismet warnings
'akismet_errors'=>array(
-1=>'La chiave di Akismet è vuota. Per favore inseriscila.',
-2=>'Non abbiamo potuto chiamare i server di Akismet.',
-3=>'La risposta di Akismet è fallita.',
-4=>'La chiave di Akismet non è valida.',
),
# Messages
'msgs'=>array(
1=>'Configurazione salvata.',
-1=>'Si è verificato un errore durante il salvataggio della configurazione.',
2=>'Regola salvata.',
-2=>'Si è verificato un errore durante il salvataggio della regola (forse le tue opzioni sono scorrette).',
3=>'Regola spostata.',
-3=>'Si è verificato un errore nello spostamento della regola (o non la si può muovere).',
4=>'Regole rimosse.',
-4=>'Si è verificato un errore durante la rimozione delle regole (o non hai selezionato nessuna regola).',
5=>'Commenti pubblicati.',
-5=>'Si è verificato un errore durante la pubblicazione del commento.',
6=>'Commenti rimossi.',
-6=>'Si è verificato un errore durante la rimozione dei commenti (o non hai selezionato nessun commento).',
7=>'Commento segnalato.',
-7=>'Si è verificato un errore durante la segnalazione del commento.',
),
# Errors
'errors'=>array(
'pol_nonex'=>'La regola che vuoi modificare non esiste.',
'entry_nf'=>'Il post da te selezionato non esiste.',
),
);
$lang['plugin']['commentcenter']=array(
'akismet_error'=>'Akismet ha rilevato il tuo commento come SPAM.',
'lock'=>'Siamo spiacenti ma i commenti per questo post sono chiusi.',
'approvation'=>'Il commento è stato salvato ma l\'Amministratore lo deve approvare prima di farlo vedere.',
# Mail for comments
'mail_subj'=>'Nuovo commento da approvare su %s',
);
$lang['plugin']['commentcenter']['mail_text']=<<<MAIL
Caro %toname%,
"%fromname%" %frommail% ha appena postato un commento nel post intitolato "%entrytitle%"
ma tu devi approvarlo.
Questo è il suo contenuto:
***************
%content%
***************
Cordiali saluti,
%blogtitle%
MAIL;

View File

@ -0,0 +1,444 @@
<?php
/*
Plugin Name: Flatpress Comment Center
Version: 1.1.1.azifix
Plugin URI: http://www.vdfn.altervista.org/redirect/plugin_commentcenter.html
Description: This plugin is a Comment Center for Flatpress
Author: Piero VDFN
Author URI: http://www.vdfn.altervista.org/
*/
/**
* This class interacts with Flaptress comment system.
*/
class plugin_commentcenter {
# The plugin configuration
var $conf=array();
# The policies
var $policies=array();
# The plugin_dir
var $pl_dir='fp-content/plugin_commentcenter/';
/**
* This is the constructor.
*/
function __construct() {
add_action('entry_block', array(&$this, 'lock'));
add_filter('comment_validate', array(&$this, 'validate'), 5, 2);
$this->pl_dir=FP_CONTENT.'plugin_commentcenter/';
if(!file_exists($this->pl_dir)) {
fs_mkdir($this->pl_dir);
}
}
/**
* This function loads the configuration of the plugin.
*
* @param boolean $foce: Force to load it?
* @return array: The configuration
*/
function getConf($force=false) {
if(!empty($this->conf) && $force) {
return $this->conf;
}
$this->conf=plugin_getoptions('commentcenter');
return $this->conf;
}
/**
* This function check if comment must be locked.
*/
function lock() {
global $fp_params, $post, $smarty;
$this->loadPolicies();
$cats=is_array($post['categories']) ? $post['categories'] : array();
$behavoir=$this->behavoirFromPolicies($fp_params['entry'], $cats);
if($behavoir==-1 && !user_loggedin()) {
$smarty->assign('entry_commslock', true);
}
}
/**
* This function validates a comment.
*
* @param boolean $status: The current status of the comment validation
* @param array $comment: The comment data
* @return boolean: Is the comment valid?
*/
function validate($status, $comment) {
global $smarty, $fp_params, $lang;
# If the comment has been already stopped or this is the contact page, stop here our check
if(!$status || function_exists('contact_display')) {
return $status;
}
# If the comment has been made from an administrator, don't check it
if(@$comment['loggedin']) {
return true;
}
$entry=$fp_params['entry'];
if (!isset($comment['date'])) {
$comment['date'] = date_time();
}
$comment['id']=bdb_idfromtime(BDB_COMMENT, $comment['date']);
$conf=$this->getConf();
# This variables defines how the system has to behave.
$behavoir=1;
$this->loadPolicies();
# To get categories of the entry, we use the same method of PrettyURLs...
global $post;
$behavoir=$this->behavoirFromPolicies($entry, $post['categories']);
// If comments are locked we don't send to Akismet
if(@$conf['akismet_check'] && $behavoir!=-1) {
$akismet=$this->akismetCheck($comment, $entry);
if(!$akismet) {
$smarty->append('error', $lang['plugin']['commentcenter']['akismet_error']);
$this->logComment($comment, $entry, 'akismet');
return false;
}
}
if($behavoir==0) {
$this->logComment($comment, $entry, 'confirm');
$smarty->append('warnings', $lang['plugin']['commentcenter']['approvation']);
if(@$conf['email_alert']) {
$this->commentMail($comment, $post['subject']);
}
} elseif($behavoir==-1 && @$conf['log_all']) {
$this->logComment($comment, $entry, 'denided');
$smarty->append('error', $lang['plugin']['commentcenter']['lock']);
}
if($behavoir!=1) {
// Delete the comment content
$_POST['content']='';
}
# Also if the comment need to be approved, we return false.
return $behavoir==1;
}
/**
* This function create an akismet instance.
* An Akismet object is returned by reference. But if an error
* happens, the function return a negative integer:
* -1 if we can't find the key
* -2 if we can't contact Akismet servers
* -3 if the response failed
* -4 if the key isn't valid
*
* @param string $key: A key for the service
* @return object: The akismet object
*/
function &akismetLoad($key='') {
$conf=$this->getConf();
if(!empty($key)) {
} elseif(empty($conf['akismet_key'])) {
$e=-1;
return $e;
} else {
$key=$conf['akismet_key'];
}
$url=empty($conf['akismet_url']) ? BLOG_BASEURL : $conf['akismet_url'];
include_once dirname(__FILE__).'/inc/akismet.class.php';
$akismet=new Akismet($url, $key);
if($akismet->errorsExist()) {
$e=0;
switch(true) {
case $akismet->isError(AKISMET_SERVER_NOT_FOUND):
$e=-2;
break;
case $akismet->isError(AKISMET_RESPONSE_FAILED):
$e=-3;
break;
case $akismet->isError(AKISMET_INVALID_KEY):
$e=-4;
break;
}
return $e;
} else {
return $akismet;
}
}
/**
* This function clean a comment to send it to Akismet.
*
* @param array $comment: The comment data
* @param string $entry: The entry id
* @return array: $comment cleaned
*/
function akismetClean($comment, $entry) {
global $post;
$conf=$this->getConf();
$oldpost=$post;
$o=new FPDB_Query("id:{$entry},fullparse:false", null);
$arr=$o->getEntry();
$post=$arr[1];
$link=get_permalink($entry);
if(!empty($conf['akismet_url'])) {
$link=$conf['akismet_url'].substr($link, strlen(BLOG_BASEURL));
}
$post=$oldpost;
$clean=array(
'author'=>$comment['name'],
'email'=>@$comment['email'],
'website'=>@$comment['url'],
'body'=>$comment['content'],
'user_ip'=>@$comment['ip-address'],
'permalink'=>$link
);
return $clean;
}
/**
* This function manages the Akismet Check
*
* @param array $comment: The comment data
* @param string $entry: The entry id
* @return boolean: Is the comment allowed?
*/
function akismetCheck($comment, $entry) {
$akismet=&$this->akismetLoad();
if(!is_object($akismet)) {
# Failed to load it. We return true, but the comment isn't checked
// TODO: Add an error logger? Or make different, configurable behaves?
return true;
}
$clean=$this->akismetClean($comment, $entry);
$akismet->setComment($clean);
if($akismet->isSpam()) {
# Akismet sign the comment as spam. Let's stop it.
return false;
} else {
return true;
}
}
/**
* This function loads the comment policies.
*
* @param boolean $force: Force to load them?
* @return array: The policies
*/
function &loadPolicies($force=false) {
if(!$force && !empty($this->policies)) {
return $this->policies;
}
if(!file_exists($f=$this->pl_dir.'policies.txt')) {
$this->policies=array();
return $this->policies;
}
include $f;
$this->policies=$policies;
return $this->policies;
}
/**
* This function saves the policies.
*
* @return boolean
*/
function savePolicies() {
$this->policies=array_values($this->policies);
return system_save($this->pl_dir.'policies.txt', array('policies'=>$this->policies));
}
/**
* This function adds a policy in a certain position.
*
* @param mixed $policy: The policy
* @param integer $position: The position
*/
function addPolicyAt($policy, $position) {
if($position<0) {
$position=count($this->policies)+$position+1;
}
$before=array_slice($this->policies, 0, $position);
$after=array_slice($this->policies, $position);
$this->policies=array_merge($before, array($policy), $after);
}
/**
* This function moves a policy from a postition to another one.
*
* @param integer $old: The old position
* @param integer $new: The new position
*/
function policyMove($old, $new) {
if(!isset($this->policies[$old])) {
return false;
}
$new=$new>$old ? $new+1 : $new;
$del=$new>$old ? $old : $old+1;
$this->addPolicyAt($this->policies[$old], $new);
if(isset($this->policies[$del])) {
unset($this->policies[$del]);
}
$this->policies=array_values($this->policies);
return true;
}
/**
* Get behavoir from policies.
* 1: The user can comment
* 0: The comment need to be approved
* -1: The user can't comment
*
* @param string $entry: The entry id
* @param array $cats: The categories
* @return integer: The behavoir
*/
function behavoirFromPolicies($entry, $cats=array()) {
$date=date_from_id($entry);
$time=$date['time'];
$return=1;
$pols=&$this->policies;
if(count($pols)) {
foreach($pols as $policy) {
if(@$policy['is_all']) {
$return=$policy['do'];
} elseif(!empty($policy['entry']) && is_array($policy['entry'])) {
if(in_array($entry, $policy['entry'])) {
$return=$policy['do'];
}
} elseif(!empty($policy['entry'])) {
if($entry==$policy['entry']) {
$return=$policy['do'];
}
} else {
$consider=true;
if(!empty($policy['categories'])) {
$consider=count(array_intersect($policy['categories'], $cats))>0;
}
if(!empty($policy['older'])) {
$consider=(time()-$time)>$policy['older'];
} else {
if(!empty($policy['time_less'])) {
$consider=$time>$policy['time_less'];
}
if(!empty($policy['time_more'])) {
$consider=$time<$policy['time_more'];
}
}
$return=$consider ? $policy['do'] : $return;
}
}
}
return $return;
}
/**
* This function saves a comment into the plugin directory.
* Maybe it's considered SPAM by Akismet or the comment requires
* the Administrator's approvation.
*
* @param array $comment: The comment data
* @param string $entry: The entry id
* @param string $why: The reason of the log
* @return boolean: Can it saves the log?
*/
function logComment($comment, $entry, $why='') {
$f=$this->pl_dir."e{$entry}_c{$comment['id']}.txt";
if(!empty($why)) {
$comment['log_reason']=$why;
}
return system_save($f, array('comment'=>$comment));
}
/**
* This function send an email to the administrator with the comment data.
* It's based on the code of comment.php
*
* @param array $comment: The comment data
* @param string $entry_title: The title of the entry
* @return boolean
*/
function commentMail($comment, $entry_title) {
global $lang, $fp_config;
$subject=$lang['plugin']['commentcenter']['mail_subj'];
$subject=sprintf($subject, $fp_config['general']['title']);
$comm_mail=empty($comment['email'])? '' : "<{$comment['email']}>";
$from_mail=$fp_config['general']['email'];
$text=$lang['plugin']['commentcenter']['mail_text'];
$text=str_replace(array('%toname%', '%fromname%', '%frommail%',
'%entrytitle%', '%content%', '%blogtitle%'
), array($fp_config['general']['author'], $comment['name'], $comm_mail,
$entry_title, $comment['content'], $fp_config['general']['title']
), $text
);
return @utils_mail($from_mail, $subject, $text);
}
}
$GLOBALS['plugin_commentcenter']=new plugin_commentcenter();
/**
* This class makes the list of comments that needs to be approved.
*/
class commentcenter_list extends fs_filelister {
/**
* This is the constructor of the class.
*
* @params string $dir: The directory to list
*/
function commentcenter_list($dir) {
parent::__construct($dir);
}
function _checkFile($directory, $file) {
if(fnmatch('eentry*.txt', $file)) {
$entry=substr($file, 1, 18);
$comment=substr($file, 21, 20);
$this->_list[$entry][]=$comment;
}
return 0;
}
function toDetails($entry=null) {
$list=array();
if(!is_null($entry) && @is_array($this->_list[$entry])) {
foreach($this->_list[$entry] as $commentid) {
include $this->_directory."/e{$entry}_c{$commentid}.txt";
if(empty($comment['log_reason'])) {
$comment['log_reason']='nd';
}
$list[$comment['log_reason']][$commentid]=$comment;
}
} else {
foreach($this->_list as $key=>$comments) {
$list[$key]=$this->toDetails($key);
}
}
return $list;
}
}
# If we're in administration area, we load admin panel
if(defined('MOD_ADMIN_PANEL')) {
include dirname(__FILE__).'/inc/admin.php';
include dirname(__FILE__).'/inc/jslang.php';
include dirname(__FILE__).'/inc/editor.php';
}

View File

@ -0,0 +1,174 @@
/**
* This function adds an error or a success to Flatpress standard place.
*/
function fpNotify(msg, type) {
$('#errorlist').hide().html('<ul class="msgs '+type+"\">\n<li>"+msg+"</li>\n</ul>").fadeIn('slow');
window.setTimeout(fpRemoveNotifies, 3000);
}
/**
* This function removes the FP Notifies
*/
function fpRemoveNotifies() {
$('#errorlist ul[class!="msgs warnings"]').fadeOut('slow');
}
/**
* This function moves a policy.
*
* @param integer id: The policy id
* @param integer how: The size of the movement
*/
function movePolicy(id, how) {
tarid=parseInt(id)+parseInt(how);
original='tr_policy'+id;
target='tr_policy'+tarid;
tmp='tmp'+target;
if(how<0) {
$('.'+original).insertBefore('.'+target);
} else if(how>0) {
$('.'+original).insertAfter('.'+target);
}
$('.'+original).removeClass(original).addClass(tmp);
$('.'+target).removeClass(target).addClass(original).attr('href');
$('.'+tmp).removeClass(tmp).addClass(target)
$('.'+target+' td').animate({'background-color' : '#78ba91'}, {
'complete' : function() {
$(this).attr('style', '');
}
});
oruh=$('a[rel=polup\\['+id+'\\]]').attr('rel', 'tmpup').attr('href');
ordh=$('a[rel=poldown\\['+id+'\\]]').attr('rel', 'tmpdown').attr('href');
tauh=$('a[rel=polup\\['+tarid+'\\]]').attr('rel', 'polup['+id+']').attr('href');
tadh=$('a[rel=poldown\\['+tarid+'\\]]').attr('rel', 'poldown['+id+']').attr('href');
$('a[rel=polup\\['+id+'\\]]').attr('href', oruh);
$('a[rel=poldown\\['+id+'\\]]').attr('href', ordh);
$('a[rel=tmpup]').attr('rel', 'polup['+tarid+']').attr('href', tauh);
$('a[rel=tmpdown]').attr('rel', 'poldown['+tarid+']').attr('href', tadh);
}
/**
* This function is called on the click event to move up/down with AJAX the policies.
*/
function clickPolicy() {
rel=$(this).attr('rel');
start_id=rel.indexOf('[');
end_id=rel.indexOf(']');
id=rel.substr(start_id+1, end_id-start_id-1);
dir=rel.substr(3, start_id-3);
how=dir=='up' ? -1 : 1;
url=$(this).attr('href')+'&mod=ajax';
succ=0;
$.ajax({
'url' : url,
'success' : function(data) {
succ=1;
if(data==3) {
fpNotify(commentcenter_lang.msg3, 'notifications');
movePolicy(id, how);
} else if(data==-3) {
fpNotify(commentcenter_lang.msg_3, 'errors');
} else {
fpNotify(data, 'errors');
}
}
});
return succ==1;
}
/**
* This is the callback for the event click to select all checkbox
*/
function checkboxa() {
rel=$(this).attr('rel');
tdbegin=rel.indexOf('[');
tdend=rel.indexOf(']');
td=rel.substr(tdbegin+1, tdend-tdbegin-1);
check=rel.substr(0, tdbegin)=='selectAll';
$('.'+td+' input[type=checkbox]').attr('checked', check);
return false;
}
/**
* This function checks for the radio buttons in the edit policy page.
*/
function radioEdit() {
if($('#fill_entries').length<1) {
return;
}
reDone=false;
$('input[type=radio]').click(radioClick).each(function() {
if($(this).attr('checked')) {
reDone=true;
$(this).click();
}
});
if(!reDone) {
$('input[value=all_entries]').click().attr('checked', false);
}
}
/**
* This function is the callback for the event click on radio buttons.
*/
function radioClick() {
val=$(this).attr('value');
entries='#fill_entries';
prop='#fill_properties';
if(val=='some_entries') {
show=entries;
hide=prop;
} else if(val=='properties') {
show=prop;
hide=entries;
} else {
$(entries).hide();
$(prop).hide();
return true;
}
$(show).show();
$(hide).hide();
}
/**
* This function shows/hides the Akismet options at the startup.
*/
function akismetOptionsReady() {
if($('label[for=akismet_check]').length<1) {
return;
}
$('input[name=akismet_check]').click(akismetOptionsReady);
status=$('input[name=akismet_check]').attr('checked');
el=$('.akismet_opts');
if(status) {
el.show();
} else {
el.hide();
}
return true;
}
$(document).ready(function() {
window.setTimeout(fpRemoveNotifies, 3000);
$('a[rel*="polup"]').click(clickPolicy);
$('a[rel*="poldown"]').click(clickPolicy);
$('.commentcenter_select').css('display', 'block').find('a').click(checkboxa);
radioEdit();
akismetOptionsReady();
});

View File

@ -0,0 +1,24 @@
{include file=plugin:commentcenter/header}
{html_form}
<h2>{$plang.app_title}</h2>
<p>{$plang.app_desc}</p>
{assign var="fetch" value="confirm"}
{include file=plugin:commentcenter/listcomments}
{if $use_akismet}
<h3>{$plang.app_akismet}</h3>
<p>{$plang.app_spamdesc}</p>
{assign var="fetch" value="akismet"}
{include file=plugin:commentcenter/listcomments}
<p><input type="checkbox" name="submitham" id="submitham" checked="checked" />
<label for="submitham">{$plang.app_hamsubmit}</label></p>
{/if}
{if $other}
<h3>{$plang.app_other}</h3>
{assign var="fetch" value="denided"}
{include file=plugin:commentcenter/listcomments}
{/if}
<div class="buttonbar">
{html_submit name="mpubcomm" id="mpubcomm" value=$plang.app_pselected}
{html_submit name="mdelcomm" id="mdelcomm" value=$plang.app_dselected}
</div>
{/html_form}

View File

@ -0,0 +1,42 @@
{include file=plugin:commentcenter/header}
{html_form}
<h2>{$plang.configure}</h2>
<p>{$plang.desc_conf}</p>
<dl class="option-set">
<dt><label for="log_all">{$plang.log_all}</label></dt>
<dd>
<input type="checkbox" name="log_all" id="log_all"{if $pl_conf.log_all} checked="checked"{/if} /><br />
{$plang.log_all_long}
</dd>
<dt><label for="email_alert">{$plang.email_alert}</label></dt>
<dd>
<input type="checkbox" name="email_alert" id="email_alert"{if $pl_conf.email_alert} checked="checked"{/if} /><br />
{$plang.email_alert_long}
</dd>
</dl>
<h2>{$plang.akismet}</h2>
<dl class="option-set">
<dt><label for="akismet_check">{$plang.akismet_use}</label></dt>
<dd>
<input type="checkbox" name="akismet_check" id="akismet_check"{if $pl_conf.akismet_check} checked="checked"{/if} />
</dd>
<dt class="akismet_opts"><label for="akismet_key">{$plang.akismet_key}</label></dt>
<dd class="akismet_opts">
<input type="text" name="akismet_key" id="akismet_key" value="{$pl_conf.akismet_key}" /><br />
{$plang.akismet_key_long}
</dd>
<dt class="akismet_opts"><label for="akismet_url">{$plang.akismet_url}</label></dt>
<dd class="akismet_opts">
<input type="text" name="akismet_url" id="akismet_url" value="{$pl_conf.akismet_url}" /><br />
{$plang.akismet_url_long|sprintf:$smarty.const.BLOG_BASEURL}
</dd>
</dl>
<div class="buttonbar">
{html_submit name="configure" id="configure" value=$plang.save_conf}
</div>
{/html_form}

View File

@ -0,0 +1,23 @@
{include file=plugin:commentcenter/header}
<h2>{$plang.delc_title}</h2>
<p>{if $single}{$plang.delc_descs}{else}{$plang.delc_descm}{/if}</p>
{html_form}
{assign var="delete" value=true}
{assign var="fetch" value="del"}
{include file=plugin:commentcenter/listcomments}
<p>{$plang.sure}</p>
<div class="buttonbar">
{if $is_managing}
<input type="hidden" name="entry" value="{$entry}" />
{assign var="button_suff" value="_2"}
{else}
{assign var="button_suff" value=""}
{/if}
{if $single}
{html_submit name="commdelok$button_suff" id="commdelok$button_suff" value=$plang.del_subs}
{else}
{html_submit name="commdelok$button_suff" id="commdelok$button_suff" value=$plang.del_subm}
{/if}
{html_submit name="ccancel$button_suff" id="ccancel$button_suff" value=$plang.del_cancel}
</div>
{/html_form}

View File

@ -0,0 +1,16 @@
{include file=plugin:commentcenter/header}
<h2>{$plang.del_policies}</h2>
<p>{if $single}{$plang.del_descs}{else}{$plang.del_descm}{/if}</p>
{html_form}
{assign var="delete" value=true}
{include file=plugin:commentcenter/listpolicies}
<p>{$plang.sure}</p>
<div class="buttonbar">
{if $single}
{html_submit name="delok" id="delok" value=$plang.del_subs}
{else}
{html_submit name="delok" id="delok" value=$plang.del_subm}
{/if}
{html_submit name="cancel" id="cancel" value=$plang.del_cancel}
</div>
{/html_form}

View File

@ -0,0 +1,72 @@
{include file=plugin:commentcenter/header}
{html_form}
<h2>{if $polnew}{$plang.newpol}{else}{$plang.editpol}{/if}</h2>
<dl class="option-set">
<dt>{$plang.apply_to}</dt>
<dd>
<input type="radio" name="apply_to" id="all_entries" value="all_entries"{if $policy.is_all} checked="checked"{/if} />
<label for="all_entries">{$plang.all_entries}</label><br />
<input type="radio" name="apply_to" id="some_entries" value="some_entries"{if !empty($policy.entry)} checked="checked"{/if} />
<label for="some_entries">{$plang.some_entries}</label><br />
<input type="radio" name="apply_to" id="properties" value="properties"{if !$polnew && !$policy.is_all & empty($policy.entry)} checked="checked"{/if} />
<label for="properties">{$plang.properties}</label><br />
</dd>
<dt><label for="behavoir">{$plang.behavoir}</label></dt>
<dd>
<select name="behavoir" id="behavoir">
<option value="1"{if $policy.do==1} selected="selected"{/if}>{$plang.allow}</option>
<option value="0"{if $policy.do==0 && !$polnew} selected="selected"{/if}>{$plang.approvation}</option>
<option value="-1"{if $policy.do==-1} selected="selected"{/if}>{$plang.block}</option>
</select>
</dd>
</dl>
<!-- Maybe here I could add a JS to hide the unused sections -->
<div id="fill_entries">
<h3>{$plang.entries}</h3>
<p>{$plang.se_desc|sprintf:"<i>`$plang.some_entries`</i>"}</p>
<p>{$plang.se_fill}</p>
{if !empty($policy.entry) && !is_array($policy.entry)}
{assign var="parity" value=1}
<input type="text" name="entries[]" value="{$policy.entry|wp_specialchars}" />
{elseif !empty($policy.entry)}
{foreach name=entries_foreach from=$policy.entry item=entry}
<input type="text" name="entries[]" value="{$entry|wp_specialchars}" /> {if ($smarty.foreach.entries_foreach.iteration % 2)==0}<br />{/if}
{if ($smarty.foreach.entries_foreach.iteration % 2)==1 && $smarty.foreach.entries_foreach.last}{assign var="parity" value=1}{/if}
{/foreach}
{/if}
{if $parity==1} <input type="text" name="entries[]" value="" /><br />{/if}
<input type="text" name="entries[]" value="" />
<input type="text" name="entries[]" value="" /><br />
<input type="text" name="entries[]" value="" />
<input type="text" name="entries[]" value="" /><br />
</div>
<div id="fill_properties" class="option-set">
<h3>{$plang.po_title}</h3>
<p>{$plang.po_desc|sprintf:"<i>`$plang.properties`</i>"}</p>
<p>{$plang.po_comp}</p>
<!-- That isn't the real id but... -->
<fieldset id="admin-entry-categories">
<legend>{$plang.categories}</legend>
{list_categories type=form selected=$policy.categories}
</fieldset>
<fieldset>
<legend>{$plang.po_time}</legend>
<p><label for="older">{$plang.po_older}</label>
<input type="text" name="older" id="older" value="{if !empty($policy.older)}{$policy.older/86400}{/if}" class="smalltextinput" />
{$plang.days}</p>
<!-- TODO: add the option for timestamp -->
</fiedlset>
</div>
<div class="buttonbar">
<input type="hidden" name="policy_id" value="{$pol_id}" />
{html_submit name="edit_policy" id="edit_policy" value=$plang.save_policy}
</div>
{/html_form}

View File

@ -0,0 +1,13 @@
<h2>{$plang.title}</h2>
<p>{$plang.desc1}</p>
<p>{$plang.desc2}</p>
<ul>
<li><a href="{$panel_url|action_link:commentcenter}" title="{$plang.lpolicies}">{$plang.lpolicies}</a></li>
<li><a href="{$action_url|cmd_link:approve_list:1}" title="{$plang.lapprove}">{$plang.lapprove}</a></li>
<li><a href="{$action_url|cmd_link:manage:'search'}" title="{$plang.lmanage}">{$plang.lmanage}</a></li>
<li><a href="{$action_url|cmd_link:configure:1}" title="{$plang.lconfig}">{$plang.lconfig}</a></li>
</ul>
{include file='shared:errorlist.tpl'}

View File

@ -0,0 +1,59 @@
<table class="entrylist">
<thead><tr>
{if !$delete}<th></th>{/if}
<th>{$plang.app_date}</th>
<th>{$plang.app_content}</th>
<th>{$plang.app_author}</th>
<th>{$plang.app_email}</th>
<th>{$plang.app_ip}</th>
{if !$delete}<th>{$plang.app_actions}</th>{/if}
</tr></thead>
<tbody>
{assign var="i" value=0}
{foreach from=$entries key=entryid item=entry}
{if count($entry.$fetch)>0 && !$is_managing}<tr><td colspan="{if $delete}5{else}7{/if}">{$entryid|idToSubject} ({$entryid})</td></tr>
{/if}
{foreach from=$entry.$fetch item=comm key=comm_id}
{assign var="i" value=$i+1}
<tr>
{if !$delete}<td class="td_select_{$fetch}"><input type="checkbox" name="select[e{$entryid}_c{$comm_id}]" /></td>{/if}
<td>{$comm.date|date_format:"%D, %T"}</td>
<td class="main_cell">
{$comm.content|strip_tags}
{if $delete}<input type="hidden" value="on" name="select[e{$entryid}_c{$comm_id}]" />
{/if}
</td>
<td>{if $comm.url}<a href="{$comm.url|wp_specialchars}">{$comm.name|wp_specialchars}</a>{else}{$comm.name|wp_specialchars}{/if}</td>
<td><a href="mailto:{$comm.email|wp_specialchars}">{$comm.email|wp_specialchars}</a></td>
<td>{$comm.ip-address}</td>
{if !$delete}<td>
{if $is_managing && $use_akismet}
<a href="{$action_url|cmd_link:commspam:"e`$entryid`_c`$comm_id`"}" title="{$plang.man_spam}"><img src="{$plugin_url}imgs/spam.png" alt="{$plang.man_spam}" /></a>
{elseif !$is_managing}
<a href="{$action_url|cmd_link:publishcomm:"e`$entryid`_c`$comm.id`"}" title="{$plang.app_publish}"><img src="{$plugin_url}imgs/publish.png" alt="{$plang.app_publish}" /></a>
{if $fetch=='akismet'}
<a href="{$action_url|cmd_link:pubnoham:"e`$entryid`_c`$comm.id`"}" title="{$plang.app_pubnotham}"><img src="{$plugin_url}imgs/publish.png" alt="{$plang.app_pubnotham}" /></a>
{/if}
{/if}
{if $is_managing}
{assign var="rm_url" value=$action_url|cmd_link:deletecomm2:"e`$entryid`_c`$comm_id`"}
{else}
{assign var="rm_url" value=$action_url|cmd_link:deletecomm:"e`$entryid`_c`$comm_id`"}
{/if}
<a href="{$rm_url}" title="{$plang.app_delete}"><img src="{$plugin_url}imgs/delete.png" alt="{$plang.app_delete}" /></a>
</td>
{/if}
</tr>
{/foreach}
{/foreach}
{if $i==0}
<tr><td colspan="{if $delete}5{else}7{/if}">{$plang.app_nocomms}</td></tr>{/if}
</tbody>
</table>
{if !$delete}
<div class="commentcenter_select" style="display: none;">
<a href="#" rel="selectAll[td_select_{$fetch}]">{$plang.select_all}</a>
<a href="#" rel="deselectAll[td_select_{$fetch}]">{$plang.deselect_all}</a>
</div>
{/if}

View File

@ -0,0 +1,61 @@
<table id="commencenter-table">
<thead id="commencenter-table-head">
<tr>
{if !$delete} <th style="width: 10%;">{$plang.select}</th>{/if}
<th class="main-cell">{$plang.criteria}</th>
<th style="width: 20%;">{$plang.behavoir}</th>
{if !$delete} <th style="width: 25%;">{$plang.options}</th>{/if}
</tr>
</thead>
<tbody id="commencenter-table-body">
{foreach name=policies from=$policies key=id item=policy}
<tr class="tr_policy{$id}">
{if !$delete} <td class="td_select"><input type="checkbox" name="select[{$id}]" /></td>{/if}
<td class="main-cell">
{if $delete}<input type="hidden" name="del_policy[]" value="{$id}" />
{/if}
{if $policy.is_all}
{$plang.all_entries}
{elseif is_array($policy.entry) && count($policy.entry)>0}
{$plang.fol_entries}
<ul>
{foreach from=$policy.entry item=entry}
<li><span title="{$entry}">{$entry|idToSubject}</span></li>
{/foreach}
</ul>
{elseif !empty($policy.entry)}
{$plang.fol_entries}
<ul>
<li><span title="{$policy.entry}">{$policy.entry|idToSubject}</span></li>
</ul>
{else}
{if count($policy.categories)>0}
<p>{$plang.fol_cats}
{$policy.categories|@filed}</p>
{/if}
{if !empty($policy.older)}
<p>{$plang.older|sprintf:"`$policy.older/86400`"}</p>
{/if}
{/if}
</td>
{if $policy.do==1}
<td>{$plang.allow}</td>
{elseif $policy.do==0}
<td>{$plang.approvation}</td>
{elseif $policy.do==-1}
<td>{$plang.block}</td>
{/if}
{if !$delete} <td>
<a href="{$action_url|cmd_link:polup:$id}" title="{$plang.up}" rel="polup[{$id}]"><img src="{$plugin_url}imgs/up.png" alt="{$plang.up}" /></a>
<a href="{$action_url|cmd_link:poldown:$id}" title="{$plang.down}" rel="poldown[{$id}]"><img src="{$plugin_url}imgs/down.png" alt="{$plang.down}" /></a>
<a href="{$action_url|cmd_link:poledit:$id}" title="{$plang.edit}"><img src="{$plugin_url}imgs/edit.png" alt="{$plang.edit}" /></a>
<a href="{$action_url|cmd_link:poldelete:$id}" title="{$plang.delete}"><img src="{$plugin_url}imgs/delete.png" alt="{$plang.delete}" /></a>
</td>{/if}
</tr>
{foreachelse}
<tr>
<td colspan="{if $delete}2{else}4{/if}">{$plang.nopolicies}</td>
</tr>
{/foreach}
</tbody>
</table>

View File

@ -0,0 +1,18 @@
{include file=plugin:commentcenter/header}
{html_form}
<h2>{$plang.man_searcht}</h2>
<p>{$plang.man_searchd}</p>
<p><input type="text" name="entry" value="{$entry_id}" />
{html_submit name="entry_search" id="entry_search" value=$plang.man_search}</p>
{if !empty($entry_id)}
{assign var="titleok" value=$entry_id|idToSubject|wp_specialchars}
<h2>{$plang.man_commfor|sprintf:$titleok}</h2>
{include file=plugin:commentcenter/listcomments}
<input type="hidden" name="entry_hid" value="{$entry_id}" />
<div class="buttonbar">
{html_submit name="mdelcomm_2" id="mdelcomm_2" value=$plang.app_dselected}
</div>
{/if}
{/html_form}

View File

@ -0,0 +1,16 @@
{include file=plugin:commentcenter/header}
<h2>{$plang.policies}</h2>
<p>{$plang.desc_pol}</p>
{html_form}
{include file=plugin:commentcenter/listpolicies}
<div class="commentcenter_select" style="display: none;">
<a href="#" rel="selectAll[td_select]">{$plang.select_all}</a>
<a href="#" rel="deselectAll[td_select]">{$plang.deselect_all}</a>
</div>
<div id="commentcenter_options">
<a href="{$action_url|cmd_link:poledit:-1}"><img src="{$plugin_url}imgs/edit.png" alt="{$plang.newpol}" />{$plang.newpol}</a>
</div>
<div class="buttonbar">
{html_submit name="multidel" id="multidel" value=$plang.del_selected}
</div>
{/html_form}