Below is an idea to enhance PluginArchiveBuilder to distribute source code.


Perhaps they could also be deployable via TRIM?

Related: Using profiles to replace mods


This could be a mods alternative to deploy custom code / themes / translations like we have for http://profiles.tiki.org/Cartograf all while having Web-based source code editor and versionning in wiki pages 😊

An example of what the code could look like
Copy to clipboard
{ARCHIVEBUILDER(name=cartograf.zip)} plugincode-as-file:styles/cartograf/custom.js:Cartograf_files:custom.js plugincode-as-file:templates/styles/cartograf/map_edit_sharecode.tpl:Cartograf_files:map_edit_sharecode.tpl wiki-attach:styles/cartograf/header_map.jpg:65 file-gallery:styles/cartograf/test.zip:9999 page-as-pdf:CartoGraf_Setup.pdf:CartoGraf_Setup {ARCHIVEBUILDER}


Maybe PluginCode would need a new ID param or something? so as to make it possible to distinguish them when there are many on a wiki page.

JavaScript example

JavaScript example
Copy to clipboard
/** * Cartograf custom js for Tiki10 */ if (!!!document.createElementNS || !!!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect) { $("<div />") .text("Your browser does not support SVG (required for drawing), please upgrade.") .addClass("browser-error") .prependTo("#main") .slideDown(); }

Smarty template

Smarty template example
Copy to clipboard
<form id="map-legend" method="get" action="tiki-searchindex.php"> <h3>{tr}Legend{/tr}</h3> <input type="hidden" name="filter~tracker_id" value="{$input.trackerId|escape}"/> <input type="hidden" name="sort_mode" value="title_asc"/> {if $input.shareCode} <input type="hidden" name="filter~tracker_field_map_shareCode" value="{$input.shareCode|escape}"/> {else} <input type="hidden" name="filter~tracker_field_map" value="{$input.mapId|escape}"/> {/if} <ul> </ul> </form> <form id="map-legend-add" method="post" action="{service controller=tracker action=insert_item trackerId=$input.trackerId}"> <input type="hidden" name="trackerId" value="{$input.trackerId|escape}"/> <input type="hidden" name="forced~finder" value="{$user|escape}"/> <input type="hidden" name="forced~map" value="{$input.mapId|escape}"/> <input type="submit" value="{tr}New Entry{/tr}"/> </form> {jq} var mapId = {{$input.mapId|json_encode}}; function refresh_legend() { var $form = $('#map-legend'); $.getJSON($form.attr('action'), $form.serialize()) .success(function (data) { var ul = $form.find('ul').empty(); $.each(data, function (k, entry) { var item = $('<li/>') .text(entry.title) .prepend($('<img/>').attr('src', entry.tracker_field_legendIcon)) .appendTo(ul); if (mapId == entry.tracker_field_map) { item.append($('<a class="editlink"/>') .text(tr('Edit')) .attr('href', $.service('tracker', 'update_item', { trackerId: entry.tracker_id, itemId: entry.object_id }))); item.append($('<a class="deletelink"/>') .text(tr('Delete')) .attr('href', $.service('tracker', 'remove_item', { trackerId: entry.tracker_id, itemId: entry.object_id }))); item.find('a') .click(function () { $(this).serviceDialog({ success: refresh_legend }); return false; }); } }); }); } refresh_legend(); setInterval(refresh_legend, 120*1000); $('#map-legend-add').submit(function () { $(this).serviceDialog({ title: $(':submit', this).val(), controller: 'tracker', action: 'insert_item', data: $(this).serialize(), success: refresh_legend }); return false; }); {/jq}


CSS example

CSS example
Copy to clipboard
/* * CartoGraf Tiki Theme v1.1 (build 4) - theme created by luci (copyright 2012 Æt luciash.cz) * Theme tested for Tiki 10.x but should work fine in Tiki 9.x too. */ /* First import the layout foundation *lite CSS framework file */ @import url("lite/lite.css"); /* Then import the default Tiki layout properties file */ @import url("layout/layout.css"); /* And design defaults */ @import url("layout/design.css"); * a { color: #06609C; } * a:visited { color: #690; } * a:hover, * a:visited:hover { color: #999 } h1, h2, h3, h4, h5, h6 { margin: 5px 0; } input[type=text], input[type=password] { border: solid 1px #cfcfcf; box-shadow: inset 0 5px 15px rgba(0,0,0,.2); padding: 4px 0; } .highlight { padding: .5em; border-radius: 10px; } /* ***** Common Menus ***** */ /* Some default values for basic CSS menus design */ .menuLevel1 a { background: #fff; line-height: 2em; } /* END Common Menus */ /* Modules reset */ .modules { position: static; } /* ***** Header ***** */ .header_outer { background: transparent; } #header { background: transparent url("CartoGraf/menuFond.gif") repeat-x; height: 230px; } /* Site Logo module */ .box-logo { position: relative; } #sitelogo { position: absolute; z-index: 1000; } #sitelogo a { display: block; margin-left: 52px; width: 292; height: 91px; } #sitelogo a img {margin-top: 0} .siteloginbar_popup .tabmark { background: transparent; margin: 0; } .siteloginbar_poppedup { background: rgba(139,139,139,0.8) !important; border: solid 6px rgba(255,255,255,1); border-top: none; border-radius: 0 0 10px 10px; box-shadow: 0 5px 3px -3px rgba(0, 0, 0, .5); left: 8em !important; top: 0 !important; padding: 5px !important; width: 22em !important; } .siteloginbar_poppedup * {line-height: 2em;} .siteloginbar_poppedup label { color: #fff; font-size: 10px; text-align: right; width: 25% } #login-user_1, #login-pass_1 {width: 60%} .siteloginbar_poppedup div.register, .siteloginbar_poppedup div.pass {font-size: 10px; line-height: 1em; width: auto;} .siteloginbar_poppedup a {color: #fff !important} .siteloginbar_poppedup input { border: none; border-top: solid 1px #999; border-radius: 10px; height: 20px; padding: 0 10px; } .siteloginbar_poppedup input, .siteloginbar_poppedup .button:hover, .siteloginbar_poppedup button:hover, .siteloginbar_poppedup input[type=reset]:hover, .siteloginbar_poppedup input[type=submit]:hover { margin: inherit; padding: 0 10px; } .siteloginbar_poppedup .tabcontent { background: transparent; padding: 0 } .tabmark a.login_link { text-decoration: underline; } a.login_link .sf-sub-indicator { display: none; bottom: 7px; } /* ***** Live OpenStreet Map module in the header ***** */ #LiveHeaderMap { background: url("CartoGraf/img/header_map.jpg") center -130px repeat-x; } #TheLiveHeaderMap {/* live map not used anymore - replaced by the above default static map image */ /* cursor: move;*/ height: 188px } /* Overwrite OpenLayers Maps CSS */ #TheLiveHeaderMap .olControlPanZoom { display: none !important; } #TheLiveHeaderMap .olControlAttribution { bottom: 5px; } #top_modules .box-LiveHeaderMap { position: absolute; top: 42px; left: 0; width: 100%; height: 188px; /* z-index: -1;*/ } /* make sure h3 title of module is not displayed */ #top_modules .box-LiveHeaderMap h3 { display: none; } /* END Live OpenStreet Map module */ #top_modules .box-login_box { float: left; position: static; } /* Map Location Search */ #top_modules .map-location-search { float: right; margin: 7px 15px; } #top_modules .map-location-search label, #top_modules .map-location-search img {display: none} #top_modules .map-location-search input { background: #fff url("CartoGraf/menuRecherche_loupe.gif") no-repeat center right; border: none; border-top: solid 1px #999; border-radius: 10px; height: 20px; padding: 0 10px; } #top_modules .map-location-search input[type=submit] {display: none} /* END Map Location Search */ #top_modules .cssmenu_horiz a, #top_modules .box-login_box a { color: #333; line-height: 38px; padding: 0 15px; } #TopMenu { margin: 0 15px; } #quickadmin { background: #fff; border-radius: 10px 10px 0 0; margin-top: 1px; padding: 5px 10px 7px 5px; } #top_modules .box-quickadmin { bottom: 0; padding: 0; position: fixed; right: 10px; top: auto; z-index: 1100; } /* END Header */ /* ***** Middle ***** */ #middle { background: #E8E8E8 url("CartoGraf/pageFond.gif") repeat-x; padding: 5px 0; } #loginbox-tiki-login fieldset {padding: 1em; min-width: 25em} #loginbox-tiki-login fieldset * {padding: .5em} #loginbox-tiki-login label {float: left;} #login-user_tiki-login, #login-pass_tiki-login {width: 60%; float: right} #loginbox-tiki-login div {clear: both} /* UI dialogs, e.g. for the Tiki Draw too */ .ui-widget-overlay { z-index: 100000 !important; } .ui-dialog { z-index: 100001 !important; } /* Errors boxes should be visible on top of all */ #error_report { margin: auto; position: relative !important; width: 90%; z-index: 999999 !important; } #role_main { min-height: 400px; padding: 10px 10px 50px; } #page_3 #role_main { padding: 0; } #role_main fieldset { border-radius: 0 15px 15px 15px; } /* Left map controls under the zoom bar need a little tweak not to overlap (when using OpenStreetMap it has larger zoom scale) */ .olControlNavToolbar { top: 315px !important; } /* Where the actual Lat/Lon displays over the map */ .olControlMousePosition { bottom: 20px !important; left: 120px !important; width: 120px; height: 15px; line-height: 15px; padding: 2px 5px; background: rgba(0, 0, 0, .75); border-radius: 10px; color: #fff; text-align: center; } .olControlOverviewMapElement { background: rgba(0, 0, 0, .75) !important; } /* This sprite overwrites the default map controls icons */ .olControlNavToolbar div, .olControlEditingToolbar div { background-image: url("CartoGraf/img/editing_tool_bar.png") !important; } /* Hide the default ControlNavigation icon on the left */ .olControlNavigationItemActive, .olControlNavigationItemInactive { display: none; } /* CSS for our Maps AppFrame and Overlays */ #appframe { position: absolute !important; top: -42px !important; bottom: 42px !important; margin-top: 82px !important; } .overlay a.active img.icon { background-color: #fff; border-radius: 5px; } .overlay img.icon { width: 22px !important; height: 19px !important; padding: 2px; } #marker_contentDiv th {display: none} /* Layer Selector at the bottom */ .layer_selector { position: fixed !important; bottom: 57px !important; left: 300px !important; } .layer_selector h4 {display: none} .layer_selector select { background: rgba(0,0,0,.75) !important; color: #fff !important; border: none !important; border-radius: 10px !important; box-shadow: 0 10px 15px rgba(0,0,0,.25); /*height: 25px !important*/ padding: 5px 5px !important; outline: none !important; } .layer_selector select * { background: #333 !important; color: #fff !important; border: none !important; } .layer_selector select:active { outline: 0 none; } .layer_selector option { border: none; } .layer_selector option:selected { background-color: rgb(95, 139, 5) !important; color: #fff !important; } /* Map in Edit dialog */ .ui-dialog .map-container { width: 100% !important; height: 220px !important; } .ui-dialog .edit-zone textarea {height: 100px} .ui-dialog fieldset {padding: 10px} .ui-dialog fieldset input[type=text], .ui-dialog fieldset input[type=url] {width: 99% !important} /* Map Anchors */ .anchor-container { top: 25px !important; } h3.anchor-head { clear: both; float: right; line-height: 61px; height: 61px; margin: 10px 0 0; padding: 0; } h3.anchor-head a { display: block; float: left; line-height: 61px; height: 61px; vertical-align: middle; } h3.anchor-head span { background: rgb(5, 111, 138); border-bottom: solid 4px rgb(125, 169, 178); border-top: solid 4px rgb(125, 169, 178); color: rgb(223, 246, 253); display: block; float: right; font-variant: small-caps; font-weight: bold; font-size: 20px; line-height: 53px; height: 53px; padding: 0 20px; vertical-align: middle; min-width: 180px; } .anchor-content { background-color: rgba(255,255,255,1); border-radius: 0 0 0 20px; box-shadow: 0 5px 3px -3px rgba(0, 0, 0, .5); clear: both; float: right; padding: 5px 10px 20px; width: 220px; overflow: hidden; } .anchor-content h2 { font-size: 19px; } .anchor-content h3 { font-size: 16px; } .anchor-content h4 { font-size: 13px; } .anchor-content ul { list-style-type: none; margin-left: 0; padding-left: 0; } #map-legend li { font-size: 10px; min-height: 40px; line-height: 18px; padding: 0 8em 0 40px; position: relative; } #map-legend li img { clear: both; margin-right: 5px; position: absolute; top: 1px; left: 1px; vertical-align: middle; } #map-legend li a.editlink { background: rgba(95, 139, 5, .5); border-radius: 15px; color: #fff; float: right; font-size: 9px; line-height: 12px; margin: 5px; padding: 5px; position: absolute; top: 0; right: 45px; /* TODO: do differently - it will probably overlap the deletelink when in different language/font size later */ text-decoration: none; } #map-legend li a.editlink:hover { background: rgba(95, 139, 5, 1); } #map-legend li a.deletelink { background: rgba(139, 30, 5, .5); border-radius: 15px; color: #fff; float: right; font-size: 9px; line-height: 12px; margin: 5px; padding: 5px; position: absolute; top: 0; right: 0; text-decoration: none; } #map-legend li a.deletelink:hover { background: rgba(139, 30, 5, 1); } a.map-custom-print { background: rgba(5, 111, 138, .5); border-radius: 15px; color: #fff !important; float: right; font-size: 9px; line-height: 12px; margin: 5px; padding: 5px; text-decoration: none; } a.map-custom-print:hover { background: rgb(5, 111, 138); } .anchor-content .icon_edit_section { display: none; } #map-legend-add { clear: both; text-align: center; } #map-legend-add input { background: rgb(95, 139, 5); border: none; border-radius: 15px; color: #fff; margin: 0 5px; padding: 5px 10px; text-decoration: none; } #permalink {width: 100%} /* Home Page content */ #AboutCartoGraf { background: #5f8b05 url("CartoGraf/vertPlanete.png") no-repeat top right; border: solid 6px #a7c664; border-radius: 20px; color: #cedbaf; margin: 0 !important; margin-top: 30px !important; min-height: 250px; text-align: left; width: 58%; } #AboutCartoGraf .cbox-title { background: #a7c664; color: #5f8b05; margin-top: 15px; font-variant: small-caps; font-weight: bold; font-size: 20px; line-height: 50px; padding-left: 40px; } #AboutCartoGraf .cbox-data, #CardOfDay .cbox-data { padding-left: 40px; } #AboutCartoGraf .cbox-data ul { font-size: 16px; list-style-type: none; margin-left: 0; padding-left: 0; line-height: 24px; } #AboutCartoGraf .cbox-data a { color: #cedbaf !important; text-decoration: underline; } #CardOfDay { background: #05708b; border: solid 6px #b5c6c9; border-radius: 20px; color: #b5c6c9; margin: 0 !important; margin-top: 30px !important; min-height: 250px; height: 100%; text-align: left; width: 38%; } #CardOfDay .cbox-title { background: #b5c6c9; color: #05708b; margin-top: 15px; font-variant: small-caps; font-weight: bold; font-size: 20px; line-height: 50px; padding-left: 40px; } #CardOfDay .cbox-data a { color: #b5c6c9 !important; text-decoration: underline; } /* ***** Tabs ***** */ .tabactive { border-bottom: none; } .tabcontent { } /* END Tabs */ /* END Middle */ /* Col2 */ #col2 .modules { padding: 5px } /* Footer */ #footer { position: fixed; background: #fff; bottom: 0; padding: 5px 0; z-index: 1; } #footer .modules { font-size: 9px; line-height: 10px; margin: 0; padding: 0 5px; } .power { text-align: center } /* ***** Right Edge menu ***** */ #RightEdgeMenu { margin-top: 40px; position: fixed; } #RightEdgeMenu a { background-color: rgb(139,87,5); font-variant: small-caps; font-weight: bold; font-size: 20px; color: #dfcfaf; border: solid 5px rgb(215,207,174); border-radius: 20px 0 0 20px; line-height: 50px; margin-bottom: 10px; padding-left: 40px; border-right: none; width: 135px; overflow: hidden; } /* Map print view */ #main div div.olMap { margin-right: 5px !important; margin-bottom: 5px !important; }


SVG

Just use Draw

Other binairies

Perhaos use File Gallery include a simple version control system (VCS), which adds revision information to file versions. (Ref. r38587, r38596 in trunk)