Blog posts
If you run a public Foswiki site, you need to be aware of - and take action against - spammers. This post describes how.
We’ve carried on with the Foswiki Camp today, and wow, has it been a productive camp!
We’ve been having fun at the 2011 Foswiki Camp! As well as some great discussions (and surprisingly few arguments) we have turned our hands to some hardcore hacking. Here’s some of what we’ve been working on.
The Foswiki Association is pleased to announce its 3rd General Assembly and Birthday Celebration, 19th-20th November 2011, at CERN Geneva.
%STARTSECTION{"all"}%<a name="BlogPosts"></a><noautolink><div class="blogAddOnViewOptions foswikiFormSteps">
<div class="foswikiFormStep">
<!-- Subscribe RSS -->
<span class="foswikiRight">%ICON{rss-small}%<a class="blogPostAddOnViewOptionsSubscribeLink" title='%IF{"defined pcategory and $pcategory!=''" then="%MAKETEXT{"RSS newsfeed: subscribe to blog posts in category [_1]" args="%pcategory%"}%" else="%MAKETEXT{"RSS newsfeed: subscribe to blog posts in all categories"}%"}%' href='%SCRIPTURLPATH{"view"}%/%BASEWEB%/BlogRss?author=%pauthor%;category=%pcategory%;tag=%ptag%'>%MAKETEXT{"Subscribe"}%</a>
</span>
<form name="blogAddOnViewOptionsForm" action="%SCRIPTURLPATH{"view"}%/%BASEWEB%/%BASETOPIC%" method="get">
<!-- ###########################################################################
Filter options
-->
<!--
<span class="blogAddOnViewOption">
%MAKETEXT{"View category:"}%
<select class="foswikiSelect" name="category" onchange="document.forms.blogAddOnViewOptionsForm.submit()">
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="pcategory"
value=""
label="%MAKETEXT{"any category"}%"
}%%SEARCH{
" *\s*.*?"
topic="BlogCategory"
web="%WEB%"
type="regex"
multiple="on"
casesensitive="on"
nonoise="on"
format="$percntINCLUDE{$quot%TOPIC%$quot section=$quotfilterOption$quot
paramname=$quotpcategory$quot
value=$quot$pattern(.* \*\s([^\n]*).*)$quot
label=$quot$pattern(.* \*\s([^\n]*).*)$quot
}$percnt"
}%
</select>
</span>
-->
<!--
<span class="blogAddOnViewOption">
%MAKETEXT{"Results per page:"}%
<select class="foswikiSelect" name="pagesize" onchange="document.forms.blogAddOnViewOptionsForm.submit()">
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="ppagesize"
value="10"
label="%MAKETEXT{"10"}%"
}%
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="ppagesize"
value="25"
label="%MAKETEXT{"25"}%"
}%
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="ppagesize"
value="50"
label="%MAKETEXT{"50"}%"
}%
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="ppagesize"
value="100"
label="%MAKETEXT{"100"}%"
}%
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="ppagesize"
value="all"
label="%MAKETEXT{"everything"}%"
}%
</select>
</span>
-->
<!-- ###########################################################################
Sort options
-->
<span class="blogAddOnViewOption">
%MAKETEXT{"Sort by:"}%
<select class="foswikiSelect" name="sort" onchange="document.forms.blogAddOnViewOptionsForm.submit()">
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="psort"
value="formfield(Title)"
label="%MAKETEXT{"Title"}%"
}%
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="psort"
value="formfield(Category)"
label="%MAKETEXT{"Category"}%"
}%
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="psort"
value="formfield(Author)"
label="%MAKETEXT{"Author"}%"
}%
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="psort"
value="formfield(PublishingDate)"
label="%MAKETEXT{"Publishing date"}%"
}%
%INCLUDE{"%TOPIC%" section="filterOption"
paramname="psort"
value="modified"
label="%MAKETEXT{"Last modified"}%"
}%
</select>
</span>
<noscript><span class="blogAddOnViewOptionsFilter"> <input type="submit" class="foswikiButton" value='%MAKETEXT{"Update"}%' /></span></noscript>
</form>
<div class="foswikiClear"></div>
</div>
</div>
</noautolink>%STARTSECTION{"posts"}%<noautolink><div class="blogPostAddOnPosts">
<!-- title of selected category -->
%IF{"(defined pcategory) OR (defined pauthor) OR (defined tag)" then="$percntINCLUDE{$quot%TOPIC%$quot section=$quotfilters$quot}$percnt"}%%STARTSECTION{"list"}%%SEARCH{
type="query"
"form.name='BlogPostForm'%IF{"defined pcategory and $pcategory!=''" then=" AND fields[name='Category'].value='%pcategory%'"}%%IF{"defined ptag and $ptag!=''" then="%FORMAT{
type="string"
"%ptag%"
format=" AND fields[name='Tags'].value=~'\b$item\b' "
}%"}%%IF{"defined pauthor and $pauthor!=''" then=" AND fields[name='Author'].value=~'\b%pauthor%\b'"}%"
web="%WEB%"
zeroresults="<div class='blogPostAddOnItem'>%MAKETEXT{"No posts found"}%</div>"
nosummary="on"
nosearch="on"
nototal="on"
excludetopic="*Template"
casesensitive="on"
format="%INCLUDE{
"%TOPIC%"
section="blogPostAddOnItem"
}%"
header="<div class='blogAddOnList'>"
footer="</div>"
order="%psort%"
reverse="%IF{"$psortdirection='descending'" then="on" else="off"}%"
pagesize="%ppagesize%"
pager="on"
}%%STARTSECTION{"styles"}%%ADDTOZONE{
"head"
id="blogPost"
text="<literal><style type=\"text/css\" media=\"all\">
.blogPost,
.blogPostAddOnItem {
border-bottom: 1px solid #ccc;
margin-bottom: 10px;
width: 700px;
height:1%; /* for IE */
}
.blogPost img {
max-width: 700px;
}
.blogAddOnViewOptions {
font-size:13px;
}
.blogAddOnViewOption {
margin-right:10px;
}
.blogPostAddOnItem {
padding: 0 0 10px 0;
}
.blogAddOnList {
margin:5px 0 0 0;
}
.blogPostAddOnExcerpt {%IF{
"defined BLOGADDON_AUTHOR_PICTURE_FIELD and $BLOGADDON_AUTHOR_PICTURE_FIELD!=''"
then="
margin-left:%ppicsizeauthor%px;
padding-left:10px;
"}%}
.blogPostAddOnItem h2 {
font-size:145%;
}
.blogPostAddOnSummary {
margin:10px 0 0 0;
}
.blogPostAddOnHasSummaryImage .blogPostAddOnSummaryText {
margin-left:%ppicsizesummary%px; /* image width %ppicsizesummary%px */
padding-left:15px;
}
.blogPostAddOnSummaryPicture {
float:left;
width:%ppicsizesummary%px;
min-height:%ppicsizesummary%px;
border:none;
margin:0 10px 5px 0;
}
.blogPostAddOnPicture {
float:left;
}
ul.blogPostAddOnCommentStatus {
margin:.5em 0 0 0;
padding:0;
list-style:none;
position:relative;
background: #ddd;
}
ul.blogPostAddOnCommentStatus li {
display:block;
background:#f6f6f5;
padding:3px 0;
margin:0 0 1px 0;
font-size:86%;
}
ul.blogPostAddOnCommentStatus li .blogPostAddOnPicture {
margin:0 10px;
}
.blogPostAddOnCommentStatusText {
padding: 5px 10px;
max-height: 90px;
overflow: hidden;
overflow-y: auto;
}
.blogPostAddOnCommentStatusText hr {
margin-right: 90%;
background-color: #ddd;
border-color: #ddd;
}
.blogPostAddOnLatestCommentCount {}
/* list of posts */
.blogPostAddOnPosts {}
.blogAddOnFilters {
margin:10px 0 0 0;
border-bottom: 1px solid #ccc;
}
a.blogAddOnRemoveFilterButton:link,
a.blogAddOnRemoveFilterButton:visited {
display:inline-block;
padding:0;
line-height:1.8em;
position:relative;
margin:0 10px 3px 0;
text-decoration:none;
font-size:13px;
font-weight:normal;
border: none;
background: none;
}
a.blogAddOnRemoveFilterButton:active,
a.blogAddOnRemoveFilterButton:focus {
outline:none;
-moz-outline-style:none;
}
a.blogAddOnRemoveFilterButton:hover {
cursor:pointer;
text-decoration:none;
color:#000;
}
a.blogAddOnRemoveFilterButton .blogAddOnFilterButtonIcon {
padding-left:22px;
width:13px;
height:13px;
background-repeat:no-repeat;
background-position:0 0;
background-image:url(%PUBURLPATH%/%SYSTEMWEB%/BlogAddOn/icon_tag_delete_btn.png);
}
a.blogAddOnRemoveFilterButton:link,
a.blogAddOnRemoveFilterButton:visited {
color:#000;
}
a.blogAddOnRemoveFilterButton:hover .blogAddOnFilterButtonIcon {
background-position:0 -16px;
}
.blogAddOnFilterButtonType {
font-size:90%;
padding:0 6px 0 0;
text-transform:uppercase;
}
a.blogSelectedCategory {
font-weight: bold;
background-color: #D9F5D9;
}
</style></literal>"
}%%ENDSECTION{"styles"}%%ENDSECTION{"list"}%</div></noautolink>%ENDSECTION{"posts"}%%ENDSECTION{"all"}%
<!-- ###########################################################################
filters
-->
%STARTSECTION{"filters"}%%IF{
"(defined pauthor and $pauthor!='') OR (defined pcategory and $pcategory!='') OR (defined ptag and $ptag!='')"
then="<div class='blogAddOnFilters'>"
}%%IF{
"defined pauthor and $pauthor!=''"
then="<a class='blogAddOnRemoveFilterButton' href='%SCRIPTURLPATH{view}%/%BASEWEB%/%BASETOPIC%?author=;category=%pcategory%;tag=%ptag%'><span class='blogAddOnFilterButtonIcon'></span><span class='blogAddOnFilterButtonType'>author:</span>$percntFORMFIELD{\"FirstName\" topic=\"%USERSWEB%.%pauthor%\"}$percnt $percntFORMFIELD{\"LastName\" topic=\"%USERSWEB%.%pauthor%\"}$percnt</a>"
}%%IF{
"defined pcategory and $pcategory!=''"
then="<a class='blogAddOnRemoveFilterButton' href='%SCRIPTURLPATH{view}%/%BASEWEB%/%BASETOPIC%?author=%pauthor%;category=;tag=%ptag%'><span class='blogAddOnFilterButtonIcon'></span><span class='blogAddOnFilterButtonType'>category:</span>%pcategory%</a>"
}%%IF{
"defined ptag and $ptag!=''"
then="%FORMAT{
type="string"
"%ptag%"
separator=""
format="<a class='blogAddOnRemoveFilterButton' href='%SCRIPTURLPATH{view}%/%BASEWEB%/%BASETOPIC%?tag=$percntFORMAT{$quot%ptag%$quot type=$quotstring$quot separator=$quot$quot format=$quot$dollarpercntIF{$dollarquot'$item'='$dollaritem'$dollarquot else=$dollarquot$dollaritem,$dollarquot}$dollarpercnt$quot}$percnt;category=%pcategory%;author=%pauthor%'><span class='blogAddOnFilterButtonIcon'></span><span class='blogAddOnFilterButtonType'>tag:</span>$item</a>"
}%"
}%%IF{
"(defined pauthor and $pauthor!='') OR (defined pcategory and $pcategory!='') OR (defined ptag and $ptag!='')"
then="</div>"
}%%ENDSECTION{"filters"}%
<!-- ###########################################################################
blogPostAddOnItem
-->
%STARTSECTION{"blogPostAddOnItem"}%<div class='blogPostAddOnItem'>
%IF{
"defined BLOGADDON_AUTHOR_PICTURE_FIELD and $BLOGADDON_AUTHOR_PICTURE_FIELD!=''"
then="$percntINCLUDE{$quot%WEB%.BlogPost$quot section=$quotblogPostAuthorPicture$quot imgWeb=$quot%USERSWEB%$quot imgTopic=$quot$formfield(Author)$quot imgWidth=$quot%ppicsizeauthor%$quot}$percnt"
}%<div class='blogPostAddOnExcerpt'><h2>[[$web.$topic][$formfield(Title)]]</h2>
<!-- author, category, tags -->
<div class='blogPostAddOnHeaderInfo foswikiUnvisited'>$percntINCLUDE{$quot%WEB%.%TOPIC%$quot section=$quotblogPostInfo$quot web=$quot$web$quot topic=$quot$topic$quot author=$quot$formfield(Author)$quot}$percnt</div>
<!-- summary -->
<div class='blogPostAddOnSummary$percntIF{$quot'$formfield(SummaryImage)'!=''$quot then=$quot blogPostAddOnHasSummaryImage$quot}$percnt'>$percntIF{$quot'$formfield(SummaryImage)'!=''$quot then=$quot$percntINCLUDE{$quot%WEB%.%TOPIC%$quot section=$quotsummaryPicture$quot imgWeb=$quot$web$quot imgTopic=$quot$topic$quot imgName=$quot$formfield(SummaryImage)$quot}$percnt$quot}$percnt<div class='blogPostAddOnSummaryText'>$percntIF{$quot'%poutline%'!=''$quot then=$quot$%poutline%$quot else=$quot$%pdefaultoutline%$quot}$percnt$percntINCLUDE{$quot%TOPIC%$quot section=$quot_comments$quot web=$quot$web$quot topic=$quot$topic$quot}$percnt</div></div>
</div><div class='foswikiClear'></div></div>%ENDSECTION{"blogPostAddOnItem"}%
<!-- ###########################################################################
blogPostInfo
params: web, topic, context, author
-->
%STARTSECTION{"blogPostInfo"}%%INCLUDE{
"%WEB%.%TOPIC%"
section="_info"
includeSection="_blogPostInfo"
}%%INCLUDE{
"%WEB%.%TOPIC%"
section="_info"
includeSection="_blogPostTags"
}%%ENDSECTION{"blogPostInfo"}%
<!--
_comments
params: web, topic
-->
%STARTSECTION{"_comments"}%%SEARCH{
"%topic%Comments%IF{
"($WIKINAME = '%BLOGADDON_HIDE_COMMENTS%') OR (($WIKINAME ingroup '%BLOGADDON_HIDE_COMMENTS%')"
then="n0nEToP1C"
}%"
web="%IF{
"defined BLOGADDON_COMMENTS_WEB and $BLOGADDON_COMMENTS_WEB!=''"
then="%BLOGADDON_COMMENTS_WEB%"
else="%web%"
}%"
scope="topic"
nonoise="on"
zeroresults=""
format="<ul class='blogPostAddOnCommentStatus'>
<li><div class='blogPostAddOnCommentStatusText'>
$percntINCLUDE{$quot$web.$topic$quot}$percnt</div></li><li><div class='blogPostAddOnCommentStatusText'>[[%web%.%topic%#BlogPostComments][Leave a comment]]</div></li></ul>"
}%%ENDSECTION{"_comments"}%
<!--
_info
params: web, topic, author, includeSection, context
-->
%STARTSECTION{"_info"}%%INCLUDE{
"%WEB%.%TOPIC%"
section="%includeSection%"
listtopic="%IF{"defined BLOGADDON_LIST_TOPIC and $BLOGADDON_LIST_TOPIC!=''" then="%BLOGADDON_LIST_TOPIC%" else="%WEB%.BlogPost"}%"
authortopic="%author%"
}%%ENDSECTION{"_info"}%
<!--
_blogPostInfo
params: web, topic, context, listtopic, authortopic
-->
%STARTSECTION{"_blogPostInfo"}%%MAKETEXT{"[_1] [_2] [_3]" args="
%FORMFIELD{
"PublishingDate"
topic="%web%.%topic%"
default="%REVINFO{rev="1" format="$date" topic="%web%.%topic%"}%"
alttext="%REVINFO{rev="1" format="$date" topic="%web%.%topic%"}%"
}%
,
%IF{
"istopic '%USERSWEB%.%CALC{$SUBSTITUTE(%author%,%USERSWEB%.,)}%' AND '%USERSWEB%/%CALC{$SUBSTITUTE(%author%,%USERSWEB%.,)}%'/fields[name='FirstName']"
then="by [[%SCRIPTURLPATH{view}%/%listtopic%?author=%CALC{$SUBSTITUTE(%author%,%USERSWEB%.,)}%%IF{"defined pcategory" then=";category=%ENCODE{"%pcategory%"}%"}%%IF{"defined ptag" then=";tag=%ENCODE{"%ptag%"}%"}%][%QUERY{
"'%USERSWEB%/%CALC{$SUBSTITUTE(%author%,%USERSWEB%.,)}%'/fields[name='FirstName'].value"}% %QUERY{"'%USERSWEB%/%CALC{$SUBSTITUTE(%author%,%USERSWEB%.,)}%'/fields[name='LastName'].value"
}%]]"
else="by [[%SCRIPTURLPATH{view}%/%listtopic%?%IF{"defined pauthor" then="author=%ENCODE{"%pauthor%"}%"}%%IF{"defined pcategory" then=";category=%ENCODE{"%pcategory%"}%"}%%IF{"defined ptag" then=";tag=%ENCODE{"%ptag%"}%"}%][%author%]]"
}%
,
%FORMFIELD{
"Category"
topic="%web%.%topic%"
format="in [[%SCRIPTURLPATH{view}%/%listtopic%?category=$value%IF{"defined ptag" then=";tag=%ENCODE{"%ptag%"}%"}%%IF{"defined pauthor" then=";author=%ENCODE{"%pauthor%"}%"}%][$value]]"
}%"
}%%ENDSECTION{"_blogPostInfo"}%
<!-- ###########################################################################
_blogPostTags
params: web, topic, listtopic
-->
%STARTSECTION{"_blogPostTags"}%%FORMAT{
"%FORMFIELD{"Tags" topic="%web%.%topic%"}%"
header=" <img src='%ICONURLPATH{tag}%' width='16' alt='tagged' /> "
type="string"
format="[[%SCRIPTURLPATH{view}%/%listtopic%?tag=$percntCALC{$LISTJOIN($dollarcomma,$LISTSORT($LISTUNIQUE($item,%ptag%)))}$percnt;category=%pcategory%;author=%pauthor%][$item]]"
separator=", "
}%%ENDSECTION{"_blogPostTags"}%
<!-- ###########################################################################
blogPostAuthorPicture
params: imgWeb, imgTopic
-->
%STARTSECTION{"blogPostAuthorPicture"}%<div class='blogPostAddOnPicture'>%INCLUDE{
"%TOPIC%"
section="%IF{"context ImagePluginEnabled" then="imagePluginImage" else="pubImage"}%"
}%
</div>%ENDSECTION{"blogPostAuthorPicture"}%
%STARTSECTION{"pubImage"}%$percntIF{$quot'%imgWeb%/%CALC{$SUBSTITUTE(%imgTopic%,%USERSWEB%.,)}%'/%BLOGADDON_AUTHOR_PICTURE_FIELD%$quot then=$quot<a href='%SCRIPTURLPATH{view}%/%imgWeb%/%CALC{$SUBSTITUTE(%imgTopic%,%USERSWEB%.,)}%'><img src='%PUBURL%/%imgWeb%/%CALC{$SUBSTITUTE(%imgTopic%,%USERSWEB%.,)}%/$percntQUERY{\"'%imgWeb%/%CALC{$SUBSTITUTE(%imgTopic%,%USERSWEB%.,)}%'/%BLOGADDON_AUTHOR_PICTURE_FIELD%\"}$percnt' width='%imgWidth%' title='%MAKETEXT{"Author page"}%' alt='%MAKETEXT{"Author picture"}%' /></a>$quot else=$quot<img src='%PUBURL%/%SYSTEMWEB%/PersonalInfoAddOn/silhouette.gif' width='%imgWidth%' alt='' />$quot}$percnt%ENDSECTION{"pubImage"}%
%STARTSECTION{"imagePluginImage"}%$percntIF{$quot'%imgWeb%/%CALC{$SUBSTITUTE(%imgTopic%,%USERSWEB%.,)}%'/%BLOGADDON_AUTHOR_PICTURE_FIELD%$quot then=$quot$percntIMAGE{web=\"%imgWeb%\" topic=\"%CALC{$SUBSTITUTE(%imgTopic%,%USERSWEB%.,)}%\" href=\"%SCRIPTURLPATH{view}%/%imgWeb%/%CALC{$SUBSTITUTE(%imgTopic%,%USERSWEB%.,)}%\" \"$percntQUERY{\"'%imgWeb%/%CALC{$SUBSTITUTE(%imgTopic%,%USERSWEB%.,)}%'/%BLOGADDON_AUTHOR_PICTURE_FIELD%\"}$percnt\" align=\"none\" zoom=\"on\" title=\"%MAKETEXT{"Author page"}%\" alt=\"%MAKETEXT{"Author picture"}%\" size=\"%imgWidth%\"}$percnt$quot else=$quot$percntIMAGE{web=\"%SYSTEMWEB%\" topic=\"PersonalInfoAddOn\" \"silhouette.gif\" align=\"none\" alt=\"\" size=\"%imgWidth%\"}$percnt$quot}$percnt%ENDSECTION{"imagePluginImage"}%
<!-- ###########################################################################
summaryPicture
params: imgWeb, imgTopic, imgName
-->
%STARTSECTION{"summaryPicture"}%<div class='blogPostAddOnSummaryPicture'>%INCLUDE{
"%TOPIC%"
section="%IF{"context ImagePluginEnabled" then="summaryImagePluginImage" else="summaryPubImage"}%"
imgWidth="%ppicsizesummary%"
}%
</div>%ENDSECTION{"summaryPicture"}%
%STARTSECTION{"summaryPubImage"}%<a href='%SCRIPTURLPATH{view}%/%imgWeb%/%imgTopic%'><img src='%PUBURL%/%imgWeb%/%imgTopic%/%imgName%' width='%imgWidth%' alt='' /></a>%ENDSECTION{"summaryPubImage"}%
%STARTSECTION{"summaryImagePluginImage"}%$percntIMAGE{web=\"%imgWeb%\" topic=\"%imgTopic%\" \"%imgName%\" align=\"center\" alt=\"\" size=\"%imgWidth%x%imgWidth%\" zoom=\"on\" href=\"%SCRIPTURLPATH{view}%/%imgWeb%/%imgTopic%\"}$percnt%ENDSECTION{"summaryImagePluginImage"}%
<!-- ###########################################################################
filterOption
params:paramname, value, label
-->
%STARTSECTION{"filterOption"}%<option value="%value%"%IF{"defined %paramname% and $%paramname% = '%value%'" then=" selected=\"selected\""}%>%label%</option>%ENDSECTION{"filterOption"}%
<!-- ###########################################################################
createButton
params:label
-->
%STARTSECTION{"createButton"}%<form method="get" action="%SCRIPTURLPATH{view}%/%WEB%/BlogPostCreator">
<input type="submit" class="foswikiButton" value="%IF{"defined label AND '%label%'!=''" then="%label%" else="%MAKETEXT{"Write a new blog post"}%"}%" /></form>%ENDSECTION{"createButton"}%