/i',$line)) { $pre = true; } foreach($find as $tag){ $line = ($pre==false) ? preg_replace_callback("/^($tag)($textile_a$textile_c)\.(?::(\S+))? (.*)$/", "fBlock",$line) : $line; } $line = preg_replace('/^(?!\t|<\/?pre|<\/?code|$| )(.*)/',"\t$1
",$line); $line=($pre==true) ? str_replace("
","\n",$line):$line; if (preg_match('/<\/pre>/i',$line)) { $pre = false; } $out[] = $line; } return join("\n",$out); } // ------------------------------------------------------------- function fBlock($m) { # dump($m); list(,$tag,$atts,$cite,$content) = $m; $atts = pba($atts); if(preg_match("/fn(\d+)/",$tag,$fns)){ $tag = 'p'; $atts.= ' id="fn'.$fns[1].'"'; $content = ''.$fns[1].' '.$content; } $start = "\t<$tag"; $end = "$tag>"; if ($tag=="bq") { $cite = checkRefs($cite); $cite = ($cite!='') ? ' cite="'.$cite.'"' : ''; $start = "\t\n\t\t"; } return "$start$atts>$content$end"; } // ------------------------------------------------------------- function span($text) { global $textile_c,$pnct; $qtags = array('\*\*','\*','\?\?','-','__','_','%','\+','~'); foreach($qtags as $f) { $text = preg_replace_callback( "/(?<=^|\s|\>|[[:punct:]]|[{(\[]) ($f) ($textile_c) (?::(\S+))? (\w.+\w) ([[:punct:]]*) $f (?=[])}]|[[:punct:]]+|\s|$) /xmU","fSpan",$text); } return $text; } // ------------------------------------------------------------- function fSpan($m) { # dump($m); global $textile_c; $qtags = array( '*' => 'b', '**' => 'strong', '??' => 'cite', '_' => 'em', '__' => 'i', '-' => 'del', '%' => 'span', '+' => 'ins', '~' => 'sub'); list(,$tag,$atts,$cite,$content,$end) = $m; $tag = $qtags[$tag]; $atts = pba($atts); $atts.= ($cite!='') ? 'cite="'.$cite.'"' : ''; return "<$tag$atts>$content$end$tag>"; } // ------------------------------------------------------------- function links($text) { global $textile_c; return preg_replace_callback('/ ([\s[{(]|[[:punct:]])? # $pre " # start ('.$textile_c.') # $atts ([^"]+) # $text \s? (?:\(([^)]+)\)(?="))? # $title ": (\S+\b) # $url (\/)? # $slash ([^\w\/;]*) # $post (?=\s|$) /Ux',"fLink",$text); } // ------------------------------------------------------------- function fLink($m) { list(,$pre,$atts,$text,$title,$url,$slash,$post) = $m; $url = checkRefs($url); $atts = pba($atts); $atts.= ($title!='') ? ' title="'.$title.'"' : ''; $atts = ($atts!='') ? shelve($atts) : ''; return $pre.''.$text.''.$post; } // ------------------------------------------------------------- function getRefs($text) { return preg_replace_callback("/(?<=^|\s)\[(.+)\]((?:http:\/\/|\/)\S+)(?=\s|$)/U", "refs",$text); } // ------------------------------------------------------------- function refs($m) { list(,$flag,$url) = $m; $GLOBALS['urlrefs'][$flag] = $url; return ''; } // ------------------------------------------------------------- function checkRefs($text) { global $urlrefs; return (isset($urlrefs[$text])) ? $urlrefs[$text] : $text; } // ------------------------------------------------------------- function image($text) { global $textile_c; return preg_replace_callback("/ \! # opening (\<|\=|\>)? # optional alignment atts ($textile_c) # optional style,class atts (?:\. )? # optional dot-space ([^\s(!]+) # presume this is the src \s? # optional space (?:\(([^\)]+)\))? # optional title \! # closing (?::(\S+))? # optional href (?=\s|$) # lookahead: space or end of string /Ux","fImage",$text); } // ------------------------------------------------------------- function fImage($m) { list(,$algn,$atts,$url) = $m; $atts = pba($atts); $atts.= ($algn!='') ? ' align="'.iAlign($algn).'"' : ''; $atts.= (isset($m[4])) ? ' title="'.$m[4].'"' : ''; $size = @getimagesize($url); if($size) $atts.= " $size[3]"; $href = (isset($m[5])) ? checkRefs($m[5]) : ''; $url = checkRefs($url); $out = ''; $out.= ($href!='') ? '' : ''; $out.= ''; $out.= ($href!='') ? '' : ''; return $out; } // ------------------------------------------------------------- function code($text) { global $pnct; return preg_replace_callback("/ (?:^|(?<=[\s\(])|([[{])) # 1 open bracket? @ # opening (?:\|(\w+)\|)? # 2 language (.+) # 3 code @ # closing (?:$|([\]}])| (?=[[:punct:]]{1,2}| \s)) # 4 closing bracket? /Ux","fCode",$text); } // ------------------------------------------------------------- function fCode($m) { list(,$before,$lang,$code,$after) = $m; $lang = ($lang!='') ? ' language="'.$lang.'"' : ''; return $before.'\n\t
'.detextile($code).'
'.$after; } // ------------------------------------------------------------- function shelve($val) { $GLOBALS['shelf'][] = $val; return ' <'.count($GLOBALS['shelf']).'>'; } // ------------------------------------------------------------- function retrieve($text) { global $shelf; $i = 0; if(is_array($shelf)) { foreach($shelf as $r){ $i++; $text = str_replace("<$i>",$r,$text); } } return $text; } // ------------------------------------------------------------- function incomingEntities($text) { /* turn any incoming ampersands into a dummy character for now. This uses a negative lookahead for alphanumerics followed by a semicolon, implying an incoming html entity, to be skipped */ return preg_replace("/&(?![a-z]+;|#[0-9]+;)/i","x%x%",$text); } // ------------------------------------------------------------- function encodeEntities($text) { /* Convert high and low ascii to entities. If multibyte string functions are available (on by default in php 4.3+), we convert using unicode mapping as defined in the function encode_high(). If not, we use php's nasty built-in htmlentities() */ return (function_exists('mb_encode_numericentity')) ? encode_high($text) : htmlentities($text,ENT_NOQUOTES,"utf-8"); } // ------------------------------------------------------------- function fixEntities($text) { /* de-entify any remaining angle brackets or ampersands */ return str_replace(array(">", "<", "&"), array(">", "<", "&"), $text); } // ------------------------------------------------------------- function cleanWhiteSpace($text) { $out = str_replace(array("\r\n","\t"), array("\n",''), $text); $out = preg_replace("/\n{3,}/","\n\n",$out); $out = preg_replace("/\n *\n/","\n\n",$out); $out = preg_replace('/"$/',"\" ", $out); return $out; } // ------------------------------------------------------------- function noTextile($text) { return preg_replace('/(^|\s)==(.*)==(\s|$)?/msU', '$1$2 $3',$text); } // ------------------------------------------------------------- function superscript($text) { return preg_replace('/\^(.*)\^/mU','$1',$text); } // ------------------------------------------------------------- function footnoteRef($text) { return preg_replace('/\b\[([0-9]+)\](\s)?/U', '$1$2',$text); } // ------------------------------------------------------------- function glyphs($text) { // fix: hackish $text = preg_replace('/"\z/',"\" ", $text); $glyph_search = array( '/([^\s[{(>])?\'(?(1)|(?=\s|s\b|[[:punct:]]))/', // single closing '/\'/', // single opening '/([^\s[{(>])?"(?(1)|(?=\s|[[:punct:]]))/', // double closing '/"/', // double opening '/\b( )?\.{3}/', // ellipsis '/\b([A-Z][A-Z0-9]{2,})\b(?:[(]([^)]*)[)])/', // 3+ uppercase acronym '/(^|[^"][>\s])([A-Z][A-Z0-9 ]{2,})([^$1', // 3+ uppercase acronym '$1$2$3', // 3+ uppercase caps '—', // em dash ' – ', // en dash '$1×$2', // dimension sign '™', // trademark '®', // registered '©'); // copyright $codepre = false; /* if no html, do a simple search and replace... */ if (!preg_match("/<.*>/",$text)) { $text = preg_replace($glyph_search,$glyph_replace,$text); return $text; } else { $text = preg_split("/(<.*>)/U",$text,-1,PREG_SPLIT_DELIM_CAPTURE); foreach($text as $line) { $offtags = ('code|pre|kbd|notextile'); /* matches are off if we're between ,
etc. */ if (preg_match('/<('.$offtags.')>/i',$line)) $codepre = true; if (preg_match('/<\/('.$offtags.')>/i',$line)) $codepre = false; if (!preg_match("/<.*>/",$line) && $codepre == false) { $line = preg_replace($glyph_search,$glyph_replace,$line); } /* do htmlspecial if between*/ if ($codepre == true) { $line = htmlspecialchars($line,ENT_NOQUOTES,"UTF-8"); $line = preg_replace('/<(\/?'.$offtags.')>/',"<$1>",$line); } $glyph_out[] = $line; } return join('',$glyph_out); } } // ------------------------------------------------------------- function iAlign($in) { $vals = array( '<'=>'left', '='=>'center', '>'=>'right'); return (isset($vals[$in])) ? $vals[$in] : ''; } // ------------------------------------------------------------- function hAlign($in) { $vals = array( '<'=>'left', '='=>'center', '>'=>'right', '<>'=>'justify'); return (isset($vals[$in])) ? $vals[$in] : ''; } // ------------------------------------------------------------- function vAlign($in) { $vals = array( '^'=>'top', '-'=>'middle', '~'=>'bottom'); return (isset($vals[$in])) ? $vals[$in] : ''; } // ------------------------------------------------------------- function encode_high($text,$charset="UTF-8") { $cmap = cmap(); return mb_encode_numericentity($text, $cmap, $charset); } // ------------------------------------------------------------- function decode_high($text,$charset="UTF-8") { $cmap = cmap(); return mb_decode_numericentity($text, $cmap, $charset); } // ------------------------------------------------------------- function cmap() { $f = 0xffff; $cmap = array( 160, 255, 0, $f, 402, 402, 0, $f, 913, 929, 0, $f, 931, 937, 0, $f, 945, 969, 0, $f, 977, 978, 0, $f, 982, 982, 0, $f, 8226, 8226, 0, $f, 8230, 8230, 0, $f, 8242, 8243, 0, $f, 8254, 8254, 0, $f, 8260, 8260, 0, $f, 8465, 8465, 0, $f, 8472, 8472, 0, $f, 8476, 8476, 0, $f, 8482, 8482, 0, $f, 8501, 8501, 0, $f, 8592, 8596, 0, $f, 8629, 8629, 0, $f, 8656, 8660, 0, $f, 8704, 8704, 0, $f, 8706, 8707, 0, $f, 8709, 8709, 0, $f, 8711, 8713, 0, $f, 8715, 8715, 0, $f, 8719, 8719, 0, $f, 8721, 8722, 0, $f, 8727, 8727, 0, $f, 8730, 8730, 0, $f, 8733, 8734, 0, $f, 8736, 8736, 0, $f, 8743, 8747, 0, $f, 8756, 8756, 0, $f, 8764, 8764, 0, $f, 8773, 8773, 0, $f, 8776, 8776, 0, $f, 8800, 8801, 0, $f, 8804, 8805, 0, $f, 8834, 8836, 0, $f, 8838, 8839, 0, $f, 8853, 8853, 0, $f, 8855, 8855, 0, $f, 8869, 8869, 0, $f, 8901, 8901, 0, $f, 8968, 8971, 0, $f, 9001, 9002, 0, $f, 9674, 9674, 0, $f, 9824, 9824, 0, $f, 9827, 9827, 0, $f, 9829, 9830, 0, $f, 338, 339, 0, $f, 352, 353, 0, $f, 376, 376, 0, $f, 710, 710, 0, $f, 732, 732, 0, $f, 8194, 8195, 0, $f, 8201, 8201, 0, $f, 8204, 8207, 0, $f, 8211, 8212, 0, $f, 8216, 8218, 0, $f, 8218, 8218, 0, $f, 8220, 8222, 0, $f, 8224, 8225, 0, $f, 8240, 8240, 0, $f, 8249, 8250, 0, $f, 8364, 8364, 0, $f); return $cmap; } // ------------------------------------------------------------- function textile_popup_help($name,$helpvar,$windowW,$windowH) { return ' '.$name.'
'; return $out; } function txtgps($thing) { if (isset($_POST[$thing])){ if (get_magic_quotes_gpc()==1){ return stripslashes($_POST[$thing]); } else { return $_POST[$thing]; } } else { return ''; } } // WordPress users. If you want to change what is textiled, do so here! // Default filters we don't want because of Textile 2 remove_filter('the_content', 'wpautop'); remove_filter('the_excerpt', 'wpautop'); remove_filter('comment_text', 'wpautop'); remove_filter('the_content', 'wptexturize'); remove_filter('the_excerpt', 'wptexturize'); remove_filter('comment_text', 'wptexturize'); add_filter('the_content', 'textile', 6); add_filter('the_excerpt', 'textile', 6); add_filter('comment_text', 'textile', 6); ?>