![]() |
Search:
|
Page last modified 15:36, 29 Mar 2012 by tehmina.khan
Template:WikiForum > Controls > InteractiveComments
InteractiveCommentsTable of contentsNo headers/*
This template will display page comments in a threaded layout with avatar icons
Parameters:
None
To Do:
Check with carles.coll to see if this is the most recent code
Credits:
carles.coll - This is 100% written by carles.coll
*/
// + INCLUDES
dekiapi();
// + PARAMETERS
var par = {
number: __request.args.number ?? args.number ?? 10,
language: __request.args.language ?? args.language ?? ( wiki.language ? wiki.language() : (page.language .. site.languge .. 'en-us') ),
ajax_action: String.tolower( __request.args.ajax_action ?? args.ajax_action ?? 'load')
};
if ((par.ajax_action=='load') || (par.ajax_action=='reload_gestorcomentarios')) {
// -- Added carles.coll 2010/03/31
if (par.number=='all') {
let par ..= { number: #page.comments };
}
// -- End Addition carles.coll 2010 /03/31
// + CONSTANTS
//var NO_AVATAR = Site.Api..'/files/966/=NoAvatar.jpg';
var NO_AVATAR = '';
var LANGUAGE_ES = {
see_all: 'Ver Todos',
see_more: 'Ver mas...',
at: 'a',
add_msg: 'Añadir mensaje:',
edit_msg: 'Edición del mensaje:',
msg_reply: 'Respuesta al mensaje:',
write_msg: 'Escribe el mensaje a añadir.',
question_delete_message: 'Seguro que quiere eliminar este mensaje?',
error_msg_edit_mode_unknown: 'Modo de edición desconocido',
add_msg_button: 'Adjuntar Mensaje',
cancel_msg_button: 'Cancelar',
reply_msg_button: 'Responder',
edit_msg_button: 'Editar',
delete_msg_button: 'Borrrar',
save_msg_button: 'Guardar Cambios'
};
var LANGUAGE_EN = {
see_all: 'Show all',
see_more: 'Show more...',
at: 'at',
add_msg: 'Add message:',
edit_msg: 'Edit message:',
msg_reply: 'Message answer:',
write_msg: 'Write message text here.',
question_delete_message: 'Do you want to delete the message?',
error_msg_edit_mode_unknown: 'ERROR: Unknown edit mode',
add_msg_button: 'Add message',
cancel_msg_button: 'Cancel',
reply_msg_button: 'Reply',
edit_msg_button: 'Edit',
delete_msg_button: 'Delete',
save_msg_button: 'Save changes'
};
var TXTS = { 'es-es': LANGUAGE_ES, 'en-us': LANGUAGE_EN , 'en': LANGUAGE_EN };
var lg = par.language;
/** It needs a closing DIV */
var HTML_COMMENT = ""..
" <div id='gc_comment_[cindex]' class='gc_comment'>"..
" <div id='gc_comment_content_[cindex]' class='gc_comment_content[cnew]'>"..
" <table width='100%' class='gc_table'>"..
" <tr id='gc_comment_tr_[cindex]'>"..
" <td style='width: 35px; text-align: center' valign='top'><a name='comment[cindex]'>[uavatar]<BR />#[cindex]</a></td>"..
" <td valign='top'>"..
" <span class='gc_comment_title'><a href=[uuri] rel='internal' id='gc_author_[cindex]'>[uname]</a> "..TXTS[lg].at.." [cdate]</span>"..
" <div id='gc_comment_text_[cindex]' class='gc_comment_text'>[ctext]</div>"..
" </td>"..
" </tr>"..
" </table>"..
" </div>";
// -- !!!! It need's a closing DIV, but i can't put it in the CONSTANT becouse it depends on the "recursive" calls !!!!
// + VARS
var cache_avatars = {};
var avatar,source,n,a;
// + DYNAMIC HTML CONTENT
<div id="gc_comentarios" width="100%">
var comments = page.comments;
var xcomments = [ k .. { index: (String.Replace(String.Split(k.uri,'#')[1],'comment','')), aindex: __index } foreach var k in comments ];
var ncomments = #xcomments;
var ccomments;
var ccomment;
var htmlout = "";
var thtmlout = "";
// -- Push on the stack on reverse order;
var trobat;
var stack = [];
var new_messages = [];
var roots = [ ];
var lastpage = false;
var previous; // -- added carles.coll 2010/03/31
/* commented carles.coll 2010/03/31
if ((ncomments<=par.number) || (par.number=='all')) {
let stack = [ List.Splice(xcomments,0,__index) foreach var k in xcomments where !String.StartsWith(k.text,'#')];
let roots = [ (k[0].index) foreach var k in stack];
let lastpage = true;
let stack = List.Reverse(stack);
}
else
{
*/
var rxcomments = List.Reverse(xcomments);
var parent;
foreach(var k in rxcomments) {
let new_messages ..= [ (k.index) ];
let trobat = k;
// -- Let's search for the root of this comment
foreach(var tonto in Num.Series(0,k.aindex)) {
if (String.StartsWith(trobat.text,'#')) {
let parent = String.SubStr(trobat.text,1,String.IndexOf(trobat.text,':')-1);
let previous = trobat; // -- added carles.coll 2010/03/31
let trobat = List.Select(xcomments,'$.index=='..parent);
if (#trobat>0)
{ let trobat = trobat[0]; }
else
{ let trobat = previous; break; } // -- added carles.coll 2010/03/31
}
else { break; }
}
if (!List.Contains(roots,trobat.index)) {
let roots ..= [ (trobat.index) ];
let stack ..= [ List.Splice(xcomments,0,trobat.aindex) ];
}
if (__index==(par.number-1)) { break; }
}
/* commented carles.coll 2010/03/31
}
*/
if (lastpage) {
<a href="#" id='gc_ver_mas' number=(par.number) style='display: none'>TXTS[lg].see_more</a>
" ";
<a href="#" id='gc_ver_todos' style='display: none'>TXTS[lg].see_all</a><br />
}
else
{
<a href="#" id='gc_ver_mas' number=(par.number)>TXTS[lg].see_more</a>
" ";
<a href="#" id='gc_ver_todos'>TXTS[lg].see_all</a><br />
}
var tstack = [];
let max_iterations = #xcomments*#xcomments; // Crec que seria n-log n pero ara no estic per calcular el logaritme
foreach (var i in Num.Series(0,max_iterations)) {
if (#stack==0) { break; }
// -- Pop on the stack
let ccomments = stack[#stack-1];
let stack = List.Splice(stack,#stack-1,1);
// -- End Pop
let ccomment = ccomments[0];
if ( ccomment.index==-400) { let htmlout ..="</div>"; }
else
{
if (List.Contains(roots,ccomment.index)) { let htmlout ..='<hr />'; }
let ccomments = List.Splice(ccomments,0,1);
// -- Let Search for the avatar and save it to the cache.
let un = ccomment.author.name;
if (!Map.Contains(cache_avatars,un)) {
let source=wiki.getpage('/User:' .. un).files;
let avatar=NO_AVATAR;
foreach (var f in source) {
let n=f.name;
let a=f.api;
if (String.tolower(n) == 'avatar.jpg') { let avatar=f.api; }
}
if (avatar==NO_AVATAR) { let avatar = ccomment.author.gravatar; }
let cache_avatars ..= {(un): ("<img src='"..avatar.."' width='30px' valing='top' />") };
}
// -- Let search hyperlinks and add href - #add @himikel
var comhref=ccomment.text;
var imov=0;
// foreach (var ihl in String.IndexesOf(comhref,"http://")) {
foreach (var ihl in String.IndexesOf(comhref,"http")) { // #mod @carles.coll 2010/02/15
let ihl+=imov;
var href=String.SubStr(comhref,ihl);
var endpos=List.Min(List.Select([String.IndexOf(href," "),String.IndexOf(href,"\n"),String.Length(href)],"$>0"));
var shltxt=String.SubStr(href,0,endpos);
var shlref="<a href='"..shltxt.."'>"..shltxt.."</a>";
let imov+=String.Length(shlref)-String.Length(shltxt);
let comhref=String.SubStr(comhref,0,ihl)..shlref..String.SubStr(comhref,ihl+String.Length(shltxt));
}
// -- Let fill the comment template
let thtmlout = String.Replace(HTML_COMMENT,'[cindex]',ccomment.index);
let thtmlout = String.Replace(thtmlout,'[cnew]',(List.Contains(new_messages,ccomment.index)?'_new':''));
let thtmlout = String.Replace(thtmlout,'[uavatar]',cache_avatars[un]);
let thtmlout = String.Replace(thtmlout,'[uuri]',ccomment.author.uri);
let thtmlout = String.Replace(thtmlout,'[uname]',ccomment.author.name);
// let thtmlout = String.Replace(thtmlout,'[cdate]',date.format(date.changetimezone(ccomment.date,user.timezone),"dd/MM/yyyy - HH:mm"));
let thtmlout = String.Replace(thtmlout,'[cdate]',date.format(date.addhours(ccomment.date,2),"dd/MM/yyyy - HH:mm"));
let thtmlout = String.Replace(thtmlout,'[ctext]',comhref); //#mod @himikel
//let thtmlout = String.Replace(thtmlout,'[ctext]',ccomment.text); //#del @himikel
// -- Let concatenate the comment template to the whole comments html out
let htmlout ..= thtmlout;
// -- Let's do the "recursive" thing (iterating).
let tstack = [];
foreach (var knext in xcomments) {
if (String.StartsWith(knext.text,"#"..ccomment.index..":")) {
// -- Push on the stack
let tstack ..= [ (List.Splice(xcomments,0,__index)) ];
}
}
if (#tstack)
{
let tstack ..= [ [{ index: -400 } ]];
let stack ..= List.Reverse(tstack);
}
else
{ let stack ..= [ [{ index: -400} ]]; }
}
}
web.html(htmlout);
</div>
if (par.ajax_action=='load') {
// + STATIC HTML CONTENT
// -- Sending messages Form
<form id="gc_messageform" onsubmit="#gc_messagetext.value='';" style='display: inline'>
<span id="messageheaderspan1">TXTS[lg].add_msg</span>
<BR />
<textarea id="gc_messagetext" class='gc_messagetext_class' rows='10'>TXTS[lg].write_msg</textarea>
<br />
<input type="button" id="gc_sendmessage" value=(TXTS[lg].add_msg_button) />
</form>
// -- Reply & Edit Messages Form
<div id='gc_f_load_messageform' style='display: none; position: absolute;'>
<form id="gc_f_messageform" onsubmit="#gc_f_messagetext.value='';">
<span id="messageheaderspan2">TXTS[lg].msg_reply</span>
<BR />
<textarea id="gc_f_messagetext" class='gc_messagetext_class' rows='10' ></textarea>
<br />
<input type="button" id="gc_f_sendmessage" value=(TXTS[lg].add_msg_button) />
<input type="button" id="gc_f_cancelmessage" value=(TXTS[lg].cancel_msg_button) />
</form>
</div>
// -- Button Bars
<div id='gc_button_bar' style='display: none; position: absolute;' >
<a id='gc_reply'><span class='icon'><img src='/skins/common/icons/icon-trans.gif' class='move' alt='' /><span class='text'>TXTS[lg].reply_msg_button</span></span></a>
" ";
<a id='gc_edit'><span class='icon'><img src='/skins/common/icons/icon-trans.gif' class='edit' alt='' /><span class='text'>TXTS[lg].edit_msg_button</span></span></a>
" ";
<a id='gc_delete'><span class='icon'><img src='/skins/common/icons/icon-trans.gif' class='delete' alt='' /><span class='text'>TXTS[lg].delete_msg_button</span></span></a>
</div>
// ++ EVENT MESSAGE MANAGER
<script type="text/jem">"
var message_id = 0;
|
|
Powered by MindTouch Core |