<?php if (!defined('PmWiki')) exit();

/*	=== Javascript preview ===
 *	Copyright 2009 Eemeli Aro <eemeli@gmail.com>
 *
 *	Real-time editing
 *
 *	Developed and tested using PmWiki 2.2.0,
 *
 *	To install, add the following to your config file:

  		include_once("$FarmD/cookbook/js-preview.php");

 *	For more information, please see the online documentation at
 *		http://www.pmwiki.org/wiki/Cookbook/...
 *
 *	This program is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU General Public License,
 *	Version 2, as published by the Free Software Foundation.
 *	http://www.gnu.org/copyleft/gpl.html
 */

$RecipeInfo['js-preview']['Version'] = '2009-03-';

SDV( $HandleActions['js-markuprules'], 'HandleJavascriptMarkupRules' );
SDV( $HandleAuth['js-markuprules'], 'edit' );

if ( $action == 'edit' ) $HTMLHeaderFmt['js-preview'] = "
<script type='text/javascript' src='/css/edit-markup.js'></script>
<script type='text/javascript' src='{\$PageUrl}?action=js-markuprules'></script>\n";

function HandleJavascriptMarkupRules( $pagename, $auth = 'edit' ) {
	global $Charset, $BlockMarkups, $HTMLVSpace, $HTMLPNewline, $SuffixPattern, $LinkPattern, $UrlExcludeChars;

	header("Content-type: text/javascript; charset=$Charset;");

	$page = RetrieveAuthPage( $pagename, $auth, FALSE, READPAGE_CURRENT );
	if (!$page) exit();

	$mr = array(
		'/&/g' => '"&amp;"', '/</g' => '"&lt;"', '/>/g' => '"&gt;"',
		'/^[ \t]*$/gm' => '"<:vspace>"' );
	foreach ( BuildMarkupRules() as $pat => $rep ) if (preg_match( '#^(.)(.*)\1([a-df-z]*)$#is', $pat, $match )) {
		$exp = str_replace( array( "\n", '(?>', '(?<!~)', '[[:alnum:]]' ), array( '\n', '(?:', '', '\w' ), $match[2] );
		$flags = 'gm'.preg_replace( '/[^i]/', '', $match[3] );
		$mr["/$exp/$flags"] = '"'.str_replace( array( '$0', "\n", '"' ), array( '$&', '\n', '\"' ), $rep ) . '"';;
		if ( $rep == '<:block>' ) {
			$mr["/^\\(:(cell|cellnr|(?:div|table)\\d*(?:end)?)(\\s.*?)?:\\)/gim"] = 'MarkupCells';
			$mr["/^(!{1,6})[ \t]?(.*)$/gm"] = "function( str, p1, p2 ) { return '<:block,1><h'+p1.length+'>'+p2+'</h'+p1.length+'>'; }";
			$mr["/^(?=[ \t]*\\S)(?:<:([^>]+)>)?/gm"] = 'MarkupBlock';
			$mr[str_replace( '[[:alnum:]]', '\w', "/\\[\\[\\s*(.+?)\\s*\\]\\]($SuffixPattern)/g" )] = 'MarkupLink';
			$mr["/\\b((?:$LinkPattern)[^\\s$UrlExcludeChars]*[^\\s.,?!$UrlExcludeChars])()/g"] = 'MarkupLink';
		} else if ( $exp == '\(:nl:\)' ) {
			$mr['/\\\\(\\\\+)\n/g'] = 'function( str, p1 ) { return new Array(p1.length+1).join("<br />"); }';
		}
	}

	//echo "/*".print_r($GLOBALS['MarkupRules'],1)."*/\n\n";

	echo "var HTMLVSpace = \"$HTMLVSpace\";\nvar HTMLPNewline = \"$HTMLPNewline\";\nvar markup_pat = [";
	echo implode( ",\n", array_keys($mr) );
	echo "];\n\nvar markup_rep = [";
	echo implode( ",\n", array_values($mr) );
	echo '];';
}