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
{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
/**
 * 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
<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
/* 
 * 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)