* * A set of replace-on-edit rules for automatically converting * HTML to PmWiki markup * * Requires PmWiki 2.2.58 or more recent. * * To install, add the following line to your configuration file : include_once("$FarmD/cookbook/convert-html.php"); * * For more information, please see the online documentation at * http://www.pmwiki.org/wiki/Cookbook/ConvertHTML * * 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 * * Updated for PHP 5.5-8.0 by Petko Yotov www.pmwiki.org/petko */ $RecipeInfo['ConvertHTML']['Version'] = '20210207'; SDVA($ROEPatterns, array( '#\[([=@]).*?\1\]#s' => 'ch_keeph0', '#[ \t]*(\n?)\n*#i' => '$1', '#\s*(.*?)\s*\n*#is' => "(: title $1:)\n", '#\n*#i' => "(:$2 $4:)\n", '##' => "%comment% $1 %%", '#<(ul|ol|dl)\s+([^>]+)>\s*(<(li|dt)\b[^>]*>)#i' => '<$1>$3%apply=list $2% ', '#<(li|dt)\s+([^>]+)>#i' => "<$1>%apply=item $2% ", '#\s*(<(ul|ol)\s*>\s*)\n?#is' => 'ch_lists', '#\s*(.*?)(?:)?\s*\s*(.*?)(?:)?\n#is' => "\n:$1:$2\n", '#\s*#i' => '', '#\s*]*)?>(.*?)\s*#is' => "\n(:table$1:)$2\n(:tableend:)", '#\s*]*)?>(.*?)#is' => "\n(:cell$1:)$2", '#\s*]*)?>\s*\(:cell\b(.*?)#is' => "\n(:cellnr$1$2", '#<(p|h\d)\s+([^>]+)>#i' => "<$1>%block $2% ", '#\s*(.*?)\n*#is' => 'ch_headings', '#\s*\s*(.*?)

\n?#is' => "\n\n$1\n", '#\s*\s*#is' => "\n\n", '#\s*]*)?>\s*(.*?)\n?\n*#is' => "\n(:div$1:)\n$2\n(:divend:)\n", '#]*)>(.*?)#is' => 'ch_spans', '#\s*
\s*(.*?)
\n*#is' => "\n->$1\n", '#\n*#i' => "[[<<]]\n", '#
\n*#i' => "\\\\\\\n", '#\s*
\n*#i' => "\n----\n", '##i' => "''", '##i' => "'''", '##i' => "@@", '#
(.*?)
#is' => "[@$1@]", '#(.*?)#is' => "'+$1+'", '#(.*?)#is' => "'-$1-'", '#(.*?)#is' => "'^$1^'", '#(.*?)#is' => "'_$1_'", '#<(ins|u)>(.*?)#is' => "{+$2+}", '#(.*?)#is' => "{-$1-}", '#(<(?:a|img)\b[^>]+\b(href|src)=)([\'"])([./][^\'"]*?)\3#i' => "$1$3Path:$4$3", '#(<(?:a|img)\b[^>]+\b(href|src)=)([\'"])([^/:\'"]+\.[^/:\'"]+?)\3#i' => "$1$3Attach:$4$3", '#]*\bname=([\'"])([^\'"]*?)\1[^>]*>(.*?)#is' => 'ch_anchors', '#]*)>(.*?)#is' => 'ch_links', '#]*)\bsrc=([\'"])([^\'"]*?)\2\s([^>]*?)\s*(?:/?|>\n?#i' => "%apply=img $1$4%$3%%\n", '#(.*%apply=img\b[^%]+)\balign=([\'"]?)(l|r)(?:eft|ight)\2([^%]*%[^%]+)%%#i' => '%$3float% $1$4%%', '#(%apply=img\b[^%]+)\b(?:alt|title)=([\'"])([^\'"]+?)\2([^%]*%[^%]+)%%#i' => '$1$4"$3"%%', '#%apply=img\b(?:\s+(?:alt|title)=([\'"])\s*\1)*\s*%([^%]+)%%#' => '$2', '#]*)>#i' => '(:input form $1:)', '##i' => '(:input end:)', '#]*)\stype=([\'"]?)(\w+)\2([^>]*?)/?>#i' => '(:input $3$1$4:)', '#]*)>\s*(.*?)\s*#i' => '(:input textarea$1 value=\'$2\':)', '#]*)>(.*?)#is' => 'ch_selectopt', "#$KeepToken(\d.*?H)$KeepToken#" => 'cb_expandkpv', )); function ch_keeph0($m) { return Keep($m[0], 'H'); } function ch_lists($m) { return ConvertHtmlList($m[1]); } function ch_headings($m) { return "\n\n".str_repeat('!',$m[1]).' '.$m[2]."\n"; } function ch_spans($m) { return "%".ConvertHtmlSpan($m[1])."% ".$m[2]." %%"; } function ch_anchors($m) { return "[[#".preg_replace("/\\s+/","_",$m[2]).']] '.$m[3]; } function ch_links($m) { return ConvertHtmlLink($m[1], $m[2]); } function ch_selectopt($m) { return preg_replace("!]*)>\\s*(.*?)\\s*!is","(:input select".$m[1]."$1 label=\"$2\":)",$m[2]); } function ConvertHtmlLink($param, $txt) { $opt = array_change_key_case(ParseArgs($param), CASE_LOWER); if (empty($opt['href'])) return "$txt"; $link = "[[{$opt['href']}|$txt]]"; $ws = ''; foreach( array('target','rel','accesskey') as $p ) if (!empty($opt[$p])) $ws .= "$p=\"{$opt[$p]}\" "; if (empty($ws)) return $link; $ws = str_replace('target="_blank"', 'newwin', rtrim($ws, ' ')); return "%$ws%$link"; } function ConvertHtmlSpan($param) { return preg_replace( array( '/%/', '/(?:class|style)=([\'"])(.*?)\1/' ), array( 'pct', '$2' ), $param ); } function ConvertHtmlList($html) { $out = ''; $lit = array(); $strip = FALSE; $html = preg_replace('#(]+)>#i','$1>',$html); $lia = preg_split( '#\s*()\s*#i', $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); foreach( $lia as $n ) switch($n) { case '
    ': case '
      ': $lit[] = "\n".str_repeat( '*', count($lit)+1 ).' '; break; case '
        ': case '
          ': $lit[] = "\n".str_repeat( '#', count($lit)+1 ).' '; break; case '
    ': case '
': case '': case '': array_pop($lit); $strip = FALSE; break; case '
  • ': case '
  • ': if($lit) $out .= end($lit); $strip = TRUE; break; case '
  • ': case '': $strip = FALSE; break; default: if ($strip) { $out .= preg_replace('/\s+/',' ',$n); $strip = FALSE; } else $out .= $n; } return $out; }