/[cvs]/bareface/yakka/library/YakkaTextProcessor.php
ViewVC logotype

Annotation of /bareface/yakka/library/YakkaTextProcessor.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Sun Jan 5 00:22:26 2003 UTC (21 years, 10 months ago) by bareface
Branch: MAIN
CVS Tags: HEAD
init;

1 bareface 1.1 <?php
2    
3     class YakkaTextProcessor {
4     var $engine;
5    
6     var $pattern;
7    
8     var $tagState;
9     var $tagCount;
10    
11     function YakkaTextProcessor(&$engine) {
12     $this->engine = &$engine;
13    
14     $this->pattern = "/(\%\%.*?\%\%|\"\".*?\"\"|\[\[.*?\]\]|<|>|&|\*\*.*?\*\*|\/\/.*?\/\/|__.*?__|\#\#.*?\#\#|======.*?======|=====.*?=====|====.*?====|===.*?===|==.*?==|----|---|\n[\t\|]+(-|[0-9,a-z,A-Z]+\))?|\{\{.*?\}\}|\b[A-Z][A-Z,a-z]+[:]([A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*)\b|\b([A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*)\b|\n)/ms";
15     }
16    
17     function Process($source) {
18     $source = str_replace("\r", "", $source);
19     $source = trim($source)."\n";
20     $source = $this->ExecuteBuilder($source);
21     $source = preg_replace("/<br \/>$/", "", trim($source));
22     return $source;
23     }
24    
25    
26     function ExecuteBuilder($source) {
27     return preg_replace_callback($this->pattern, array(&$this, "Build"), $source);
28     }
29    
30     function Build($things) {
31     $thing = $things[1];
32    
33     static $oldIndentLevel = 0;
34     static $indentClosers = array();
35     static $br = 1;
36    
37     global $wakka;
38    
39     // convert HTML thingies
40     if ($thing == "<")
41     return "&lt;";
42     else if ($thing == ">")
43     return "&gt;";
44     else if ($thing == "&")
45     return "&amp;";
46     // bold
47     else if (preg_match("/^\*\*(.*)\*\*$/s", $thing, $matches))
48     {
49     return "<b>".$this->ExecuteBuilder($matches[1])."</b>";
50     }
51     // italic
52     else if (preg_match("/^\/\/(.*)\/\/$/s", $thing, $matches))
53     {
54     return "<i>".$this->ExecuteBuilder($matches[1])."</i>";
55     }
56     // underlinue
57     else if (preg_match("/^__(.*)__$/s", $thing, $matches))
58     {
59     return "<u>".$this->ExecuteBuilder($matches[1])."</u>";
60     }
61     // monospace
62     else if (preg_match("/^\#\#(.*)\#\#$/s", $thing, $matches))
63     {
64     return "<tt>".$this->ExecuteBuilder($matches[1])."</tt>";
65     }
66     // headers
67     else if (preg_match("/^======(.*)======$/s", $thing, $matches))
68     {
69     $br = 0;
70     return "<h1>".$this->ExecuteBuilder($matches[1])."</h1>";
71     }
72     else if (preg_match("/^=====(.*)=====$/s", $thing, $matches))
73     {
74     $br = 0;
75     return "<h2>".$this->ExecuteBuilder($matches[1])."</h2>";
76     }
77     else if (preg_match("/^====(.*)====$/s", $thing, $matches))
78     {
79     $br = 0;
80     return "<h3>".$this->ExecuteBuilder($matches[1])."</h3>";
81     }
82     else if (preg_match("/^===(.*)===$/s", $thing, $matches))
83     {
84     $br = 0;
85     return "<h4>".$this->ExecuteBuilder($matches[1])."</h4>";
86     }
87     else if (preg_match("/^==(.*)==$/s", $thing, $matches))
88     {
89     $br = 0;
90     return "<h5>".$this->ExecuteBuilder($matches[1])."</h5>";
91     }
92     // separators
93     else if ($thing == "----")
94     {
95     // TODO: This could probably be improved for situations where someone puts text on the same line as a separator.
96     // Which is a stupid thing to do anyway! HAW HAW! Ahem.
97     $br = 0;
98     return "<hr/>";
99     }
100     // forced line breaks
101     else if ($thing == "---")
102     {
103     return "<br />";
104     }
105     // escaped text
106     else if (preg_match("/^\"\"(.*)\"\"$/s", $thing, $matches))
107     {
108     return $matches[1];
109     }
110     // code text
111     else if (preg_match("/^\%\%(.*)\%\%$/s", $thing, $matches))
112     {
113     // check if a language has been specified
114     $code = $matches[1];
115     if (preg_match("/^\((.+?)\)(.*)$/s", $code, $matches))
116     {
117     list(, $language, $code) = $matches;
118     }
119     switch ($language)
120     {
121     case "php":
122     $formatter = "php";
123     break;
124     default:
125     $formatter = "code";
126     }
127    
128     $output = "<div class=\"code\">";
129     $output .= "CODE";//$wakka->Format(trim($code), $formatter);
130     $output .= "</div>";
131    
132     return $output;
133     }
134     // forced links
135     else if (preg_match("/^\[\[(\S*)(\s+(.+))?\]\]$/", $thing, $matches))
136     {
137     list (, $url, , $text) = $matches;
138     if ($url)
139     {
140     if (!$text) $text = $url;
141     return $this->CreateLink($url, "", $text);
142     }
143     else
144     {
145     return "";
146     }
147     }
148     // indented text
149     else if (preg_match("/\n([\t\|]+)(-|([0-9,a-z,A-Z]+)\))?/s", $thing, $matches))
150     {
151     // new line
152     $result .= ($br ? "<br />\n" : "\n");
153    
154     // we definitely want no line break in this one.
155     $br = 0;
156    
157     // find out which indent type we want
158     $newIndentType = $matches[2];
159     if (!$newIndentType) { $opener = "<blockquote>"; $closer = "</blockquote>"; $br = 1; }
160     else if ($newIndentType == "-") { $opener = "<ul>"; $closer = "</ul>"; $li = 1; }
161     else { $opener = "<ol type=\"".$newIndentType."\">"; $closer = "</ol>"; $li = 1; }
162    
163     // get new indent level
164     $newIndentLevel = strlen($matches[1]);
165     if ($newIndentLevel > $oldIndentLevel)
166     {
167     for ($i = 0; $i < $newIndentLevel - $oldIndentLevel; $i++)
168     {
169     $result .= $opener;
170     array_push($indentClosers, $closer);
171     }
172     }
173     else if ($newIndentLevel < $oldIndentLevel)
174     {
175     for ($i = 0; $i < $oldIndentLevel - $newIndentLevel; $i++)
176     {
177     $result .= array_pop($indentClosers);
178     }
179     }
180    
181     $oldIndentLevel = $newIndentLevel;
182    
183     if ($li) $result .= "<li/>";
184    
185     return $result;
186     }
187     // new lines
188     else if ($thing == "\n")
189     {
190     // if we got here, there was no tab in the next line; this means that we can close all open indents.
191     $c = count($indentClosers);
192     for ($i = 0; $i < $c; $i++)
193     {
194     $result .= array_pop($indentClosers);
195     $br = 0;
196     }
197     $oldIndentLevel = 0;
198    
199     $result .= ($br ? "<br />\n" : "\n");
200     $br = 1;
201     return $result;
202     }
203     // events
204     else if (preg_match("/^\{\{(.*?)\}\}$/s", $thing, $matches))
205     {
206     if ($matches[1])
207     return $this->engine->runAction($matches[1]);
208     else
209     return "{{}}";
210     }
211     // interwiki links!
212     else if (preg_match("/^[A-Z][A-Z,a-z]+[:]([A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*)$/s", $thing))
213     {
214     return $this->CreateLink($thing);
215     }
216     // wakka links!
217     else if (preg_match("/^[A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*$/s", $thing))
218     {
219     return $this->CreateLink($thing);
220     }
221     // if we reach this point, it must have been an accident.
222     return $thing;
223     }
224    
225     function CreateLink($tag, $method = null, $text = null) {
226     $track = 1;
227     if (!$text) $text = $tag;
228    
229     // is this an interwiki link?
230     if (preg_match("/^([A-Z][A-Z,a-z]+)[:]([A-Z][a-z]+[A-Z,0-9][A-Z,a-z,0-9]*)$/", $tag, $matches))
231     {
232     //$tag = $this->GetInterWikiUrl($matches[1], $matches[2]);
233     //return "<a href=\"$tag\">$text</a>";
234     return "--interwikiurl--";
235     }
236     // is this a full link? ie, does it contain alpha-numeric characters?
237     else if (preg_match("/[^[:alnum:]]/", $tag))
238     {
239     // check for email addresses
240     if (preg_match("/^.+\@.+$/", $tag))
241     {
242     $tag = "mailto:".$tag;
243     }
244     // check for protocol-less URLs
245     else if (!preg_match("/:/", $tag))
246     {
247     $tag = "http://".$tag;
248     }
249     return "<a href=\"$tag\">$text</a>";
250     }
251     else
252     {
253     // it's a Wakka link!
254     return ($this->engine->pageStorage->hasPage($tag) ? "<a href=\"".$this->engine->buildCommand($tag, $method)."\">".$text."</a>" : "<span class=\"missingpage\">".$text."<a href=\"".$this->engine->buildCommand($tag, "Create")."\">?</a></span>");
255     }
256     }
257    
258     }
259    
260     ?>

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed