Tabla de contenidos
No hay encabezados
// SectionUI, by neilw and rberinger, 2009
//
// Version History
// 1.0.0 24-Sept-2009 neilw, rberinger First release
// 1.1.0 ??-????-2009 neilw, rberinger Added support for "Accordion" style
// 1.1.1 12-Nov-2009 neilw Slight tweak for accordion options
// 1.1.2 12-Nov-2009 neilw A bit of code cleanup
// 1.1.3 8-Feb-2010 rberinger Moved resource files to script.mindtouch.com
// 1.1.4 22-March-2010 neilw Fixed typo that crept in somehow
// 1.2.0 xxxxxxxxxxxxx neilw Changed the way CSS and JS files are handled; added masonry support
// 1.2.0b @himikel
//
// Usage:
// SectionUI {
// style: str?, (default "tab") Style of UI for sections. Valid options: "tab", "accordion".
// allowEdits: bool?, (default true) Allow editing of subsections if user has permission
// showOriginal: bool?, (default false) Provide link to reload page with original version of page
// maxLength: num?, (default 0) Maximum length of tab title after which title will be truncated. "0" -> no limit
// maxHeight: str?, (default "0") Maximum height of a tab section, after which it will be scrolled. "0" -> no limit
// textSize: str?, (default "1em") Size of text in tab titles
// options: map? (default {}) Options specific to each style
//@himikel add 2010-10-04 : New 'filtered' param
// filtered: bool? (default false) to include only '#' ended sections
//@himikel add 2010-10-04 : New 'hideouter' param
// hideouter: bool? (default false) hide the outer section header
//@himikel add 2010-10-04 : New 'headerindex' param
// headerindex: int? (default 0) header index where apply
// }
// Parameters
var errors = [];
// Style
var style = $0 ?? $style ?? "tab";
let style = string.tolower(style);
var allowable_styles = [ "tab", "accordion", "masonry" ];
if (!list.contains(allowable_styles, style)) {
let errors ..= [ "invalid style '"..style.."': supported styles are "..
string.join(allowable_styles, ",") ];
let style = "tab";
}
// allowEdits
var allow_edits = $1 ?? $allowEdits ?? true;
if (allow_edits is not bool) {
let errors ..= [ "allowEdits parameter must be true or false" ];
let allow_edits = true;
}
// showOriginal
var show_original = $2 ?? $showOriginal ?? false;
// maxLength
var max_length = $3 ?? $maxLength ?? 0;
if (max_length is not num || max_length < 0) {
let errors ..= [ "maxLength parameter must be a non-negative number" ];
let max_length = 0;
}
// maxHeight
var max_height = $4 ?? $maxHeight ?? 0;
// textSize
var text_size = $5 ?? $textSize ?? '';
// options
var options = $6 ?? $options;
if (options is not nil && options is not map) {
let errors ..= [ "options parameter must be a map" ];
let options = nil;
}
if (style == "tab") {
let options = options ?? { collapsible:true };
if (options.event == "mouseover") // bad to use "mouseover" with "collapsible"
let options ..= { collapsible:false };
}
else if (style == "accordion") {
let options = options ?? {};
if (options.autoHeight == nil) let options ..= { autoHeight:false };
if (options.active == nil) let options ..= { active:false };
}
//@himikel add 2010-10-04 : New 'filtered' param for include only '#' ended sections
var filtered = __request.args.filtered ?? args.filtered ?? false;
if (filtered is not bool) {
let errors ..= [ "filtered parameter must be true or false" ];
let filtered = false;
}
//@himikel add 2010-10-04 : New 'hideouter' param to hide the outer section header
var hideouter = __request.args.hideouter ?? args.hideouter ?? false;
if (hideouter is not bool) {
let errors ..= [ "hideouter parameter must be true or false" ];
let hideouter = false;
}
//@himikel add 2010-10-04 : New 'headerindex' param with header index where apply
var headind = __request.args.headerindex ?? args.headerindex ?? 0;
if (headind is not num) {
let errors ..= [ "headerindex parameter must be numeric" ];
let headind = 0;
}
if ( __request.args.SectionUI == false)
<p><a href=(page.uri & { sectionUI:true })> "Show transformed page" </a></p>;
else {
//@himikel mod 2010-11-09: Using local resources
var jqUI = "/skins/local/jqueryui/";
//var jqUI = "http://scripts.mindtouch.com/res/jqueryui/";
var jqUICSS = [ jqUI.."ui.all.css", jqUI.."ui.base.css", jqUI.."ui.core.css", jqUI.."ui.theme.css" ];
var jqUIJS = [ jqUI.."ui.core.js.txt" ];
// Define which scripts and css are needed for each style
var includeCSS;
var includeJS;
switch(style) {
case "tab":
let includeCSS = jqUICSS .. [ jqUI .. "ui.tabs.css" ];
let includeJS = jqUIJS .. [ jqUI .. "ui.tabs.js.txt" ];
case "accordion":
let includeCSS = jqUICSS .. [ jqUI .. "ui.accordion.css" ];
let includeJS = jqUIJS .. [ jqUI .. "ui.accordion.js.txt" ];
case "masonry":
let includeCSS = [ ];
let includeJS = [ "http://developer.mindtouch.com/@api/deki/files/6025/=jquery.masonry.min.js" ];
}
<html>
<head>
// Load CSS and JavaScript files
foreach (var css in includeCSS) <link type="text/css" href=(css) rel="stylesheet" />;
foreach (var js in includeJS) <script type="text/javascript" src=(js)></script>;
<style type="text/css">"
.ui-tabs .ui-tabs-panel { padding: 0.25em 0.5em; display: block; border-width: 0; background: none; }
"</style>
// Hide entire page content frame until SectionUI does its thing. Optimal if at most 1 SectionUI is used on a page.
//<style type="text/css"> " #pageText { display:none; } " </style>
// Call the main SectionUI function
<script type="text/javascript"> "
Deki.$(document).ready(function($) {
//alert('ready!');
var id = "..json.emit(@id)..";
var $section = $('div#'+id).parent();
$('div#'+id).remove();
//@himikel mod 2010-10-04 : Some new params
transform_sections($, id, $section,
"..json.emit(style)..",
"..json.emit(max_length)..",
"..json.emit(max_height)..",
"..json.emit(text_size)..",
"..json.emit(allow_edits)..",
"..json.emit(options)..",
"..json.emit(filtered)..",
"..json.emit(hideouter)..",
"..json.emit(headind)..");
// $('div#pageText').show();
});
" </script>
// Main SectionUI function. This does all the work in mangling the HTML to enable the transformation
<script type="text/javascript"> "
function transform_sections($, id, $section, style, max_length, max_height, font_size, editable, options, filtered, hideouter, headind) {
// Figure out what header level we're at (should be simpler way to do this???)
var $outer = $section.find(':header').eq(0);
var inner;
//alert('outer: '+$outer);
$outer.each(function() {
//@himikel add 2010-10-04 : New 'hideouter' param to hide the outer section header
if (hideouter)
$(this).css('display','none');
//alert('this: '+this);
//@himikel add 2010-10-04 : New 'headerindex' param with header index where apply
if (headind<=0)
inner = 'h' + (1+Number(this.tagName.substr(1,1)));
else
inner = 'h' + headind;
//alert('inner: '+inner);
});
// Process options as necessary
if (font_size != '') font_size = 'font-size:'+font_size;
// First wrap entire top level section in a div
var top_id = id + 'top';
//alert('top_id: '+top_id);
$outer.nextAll().wrapAll('<div id=\"'+top_id+'\"></div>');
// If 'tab', create a UL for tab names
if (style == 'tab') $section.find('div#'+top_id).prepend('<ul></ul>');
var $ul = $section.find('ul:first');
// Now process each of the subsections
$section.find(inner).each(function() {
var title_text = $(this).text();
//@himikel add 2010-10-04 : New 'filtered' param for include only '#' ended sections
if (filtered)
{
if (title_text.charAt(title_text.length-1)=='#')
title_text = title_text.substr(0,title_text.length-1);
else
return;
}
$(this).hide();
var $div = $(this).parent();
// clean up extra vertical whitespace
$div.css({ 'padding-top':'5px', 'padding-bottom':'10px' });
$(this).nextAll(':first').css({'margin-top':'0px','padding-top':'0px'});
$(this).nextAll(':last').css({'margin-bottom':'0px','padding-bottom':'0px'});
// set max_height of each section
if (max_height)
$div.css({'max-height':max_height, 'overflow':'auto'});
// truncate title text if necessary
if (max_length && title_text.length > max_length) title_text = title_text.substr(0,max_length) + '...';
// Process the section title according to style
var hdr_link = '<a style=\"'+font_size+';text-decoration:none;\" href=\"#'+$div.attr('id')+'\" title=\"'+title_text+'\">' + title_text +
'<span class=\"icon\" style=\"visibility:hidden; margin-left:10px\">' +
'<img class=\"sectionedit\" alt=\"Edit section\" src=\"/skins/common/icons/icon-trans.gif\" style=\"cursor:pointer\"/></span></a>';
switch(style) {
case 'tab': // add tab title to <ul>
$ul.append('<li style=\"list-style-type:none\">' + hdr_link + '</li>');
break;
case 'accordion': // insert title before <div>
$div.before('<div class=\"accordion-header\">' + hdr_link + '</div>');
break;
case 'masonry': // various masonry stuff
$div.addClass('box');
$div.width('200px');
break;
default: break;
}
// Add pop-up 'edit' icon, if enabled
if (editable && $(this).find('div.editIcon').length) {
var $header = (style == 'tab' ? $ul.find('li:last') :
$section.find('div.accordion-header:last'));
$header.hover(
function() {
if (!Deki.Editor || (!Deki.Editor.IsLoading && !Deki.Editor.IsStarted))
$(this).find('span:last').css('visibility','visible');
},
function() { $(this).find('span:last').css('visibility','hidden'); }
);
var $tab = $header.find('a:first');
$header.find('img:last').click(function() {
$tab.click();
$div.find(inner+' a:last').click();
return(false);
});
}
});
// Call appropriate styler
// alert('applying styler to ' + $('#'+top_id).length + ' top items (id=' + top_id + ')');
switch(style) {
case 'tab':
$('#'+top_id).tabs(options);
break;
case 'accordion':
options.header = 'div.accordion-header';
$('#'+top_id).accordion(options);
break;
case 'masonry':
$('#'+top_id).masonry({singleMode:true, itemSelector:'div.box'});
alert('did it!');
break;
default: break;
}
}
" </script>
</head>
<body>
<div id=(@id) />; // Marker
if (0) <div id=(@id.."original") // "Show Original" link
style=("width:100%;text-align:right;font-size:.7em;visibility:"..(show_original?"visible":"hidden"))>
<a href=(page.uri&{SectionUI:false})> (show_original ? "show original" : ".") </a>
</div>;
if (#errors) {
<p style="color:red">
"ERRORS:"; <br />;
foreach (var e in errors) { e; <br />; }
</p>;
}
</body>
</html>
}