[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Weblib tests. 19 * 20 * @package core 21 * @category phpunit 22 * @copyright © 2006 The Open University 23 * @author [email protected] 24 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License 25 */ 26 27 defined('MOODLE_INTERNAL') || die(); 28 29 30 class core_weblib_testcase extends advanced_testcase { 31 32 public function test_format_string() { 33 global $CFG; 34 35 // Ampersands. 36 $this->assertSame("& &&&&& &&", format_string("& &&&&& &&")); 37 $this->assertSame("ANother & &&&&& Category", format_string("ANother & &&&&& Category")); 38 $this->assertSame("ANother & &&&&& Category", format_string("ANother & &&&&& Category", true)); 39 $this->assertSame("Nick's Test Site & Other things", format_string("Nick's Test Site & Other things", true)); 40 41 // String entities. 42 $this->assertSame(""", format_string(""")); 43 44 // Digital entities. 45 $this->assertSame("&11234;", format_string("&11234;")); 46 47 // Unicode entities. 48 $this->assertSame("ᅻ", format_string("ᅻ")); 49 50 // < and > signs. 51 $originalformatstringstriptags = $CFG->formatstringstriptags; 52 53 $CFG->formatstringstriptags = false; 54 $this->assertSame('x < 1', format_string('x < 1')); 55 $this->assertSame('x > 1', format_string('x > 1')); 56 $this->assertSame('x < 1 and x > 0', format_string('x < 1 and x > 0')); 57 58 $CFG->formatstringstriptags = true; 59 $this->assertSame('x < 1', format_string('x < 1')); 60 $this->assertSame('x > 1', format_string('x > 1')); 61 $this->assertSame('x < 1 and x > 0', format_string('x < 1 and x > 0')); 62 63 $CFG->formatstringstriptags = $originalformatstringstriptags; 64 } 65 66 public function test_s() { 67 // Special cases. 68 $this->assertSame('0', s(0)); 69 $this->assertSame('0', s('0')); 70 $this->assertSame('0', s(false)); 71 $this->assertSame('', s(null)); 72 73 // Normal cases. 74 $this->assertSame('This Breaks " Strict', s('This Breaks " Strict')); 75 $this->assertSame('This Breaks <a>" Strict</a>', s('This Breaks <a>" Strict</a>')); 76 77 // Unicode characters. 78 $this->assertSame('Café', s('Café')); 79 $this->assertSame('一, 二, 三', s('一, 二, 三')); 80 81 // Don't escape already-escaped numeric entities. (Note, this behaviour 82 // may not be desirable. Perhaps we should remove these tests and that 83 // functionality, but we can only do that if we understand why it was added.) 84 $this->assertSame('An entity: ৿.', s('An entity: ৿.')); 85 $this->assertSame('An entity: б.', s('An entity: б.')); 86 $this->assertSame('An entity: &amp;.', s('An entity: &.')); 87 $this->assertSame('Not an entity: &amp;#x09ff;.', s('Not an entity: &#x09ff;.')); 88 } 89 90 public function test_format_text_email() { 91 $this->assertSame("This is a TEST", 92 format_text_email('<p>This is a <strong>test</strong></p>', FORMAT_HTML)); 93 $this->assertSame("This is a TEST", 94 format_text_email('<p class="frogs">This is a <strong class=\'fishes\'>test</strong></p>', FORMAT_HTML)); 95 $this->assertSame('& so is this', 96 format_text_email('& so is this', FORMAT_HTML)); 97 $this->assertSame('Two bullets: '.core_text::code2utf8(8226).' *', 98 format_text_email('Two bullets: • •', FORMAT_HTML)); 99 $this->assertSame(core_text::code2utf8(0x7fd2).core_text::code2utf8(0x7fd2), 100 format_text_email('習習', FORMAT_HTML)); 101 } 102 103 public function test_obfuscate_email() { 104 $email = '[email protected]'; 105 $obfuscated = obfuscate_email($email); 106 $this->assertNotSame($email, $obfuscated); 107 $back = core_text::entities_to_utf8(urldecode($email), true); 108 $this->assertSame($email, $back); 109 } 110 111 public function test_obfuscate_text() { 112 $text = 'Žluťoučký koníček 32131'; 113 $obfuscated = obfuscate_text($text); 114 $this->assertNotSame($text, $obfuscated); 115 $back = core_text::entities_to_utf8($obfuscated, true); 116 $this->assertSame($text, $back); 117 } 118 119 public function test_highlight() { 120 $this->assertSame('This is <span class="highlight">good</span>', 121 highlight('good', 'This is good')); 122 123 $this->assertSame('<span class="highlight">span</span>', 124 highlight('SpaN', 'span')); 125 126 $this->assertSame('<span class="highlight">SpaN</span>', 127 highlight('span', 'SpaN')); 128 129 $this->assertSame('<span><span class="highlight">span</span></span>', 130 highlight('span', '<span>span</span>')); 131 132 $this->assertSame('He <span class="highlight">is</span> <span class="highlight">good</span>', 133 highlight('good is', 'He is good')); 134 135 $this->assertSame('This is <span class="highlight">good</span>', 136 highlight('+good', 'This is good')); 137 138 $this->assertSame('This is good', 139 highlight('-good', 'This is good')); 140 141 $this->assertSame('This is goodness', 142 highlight('+good', 'This is goodness')); 143 144 $this->assertSame('This is <span class="highlight">good</span>ness', 145 highlight('good', 'This is goodness')); 146 147 $this->assertSame('<p><b>test</b> <b>1</b></p><p><b>1</b></p>', 148 highlight('test 1', '<p>test 1</p><p>1</p>', false, '<b>', '</b>')); 149 150 $this->assertSame('<p><b>test</b> <b>1</b></p><p><b>1</b></p>', 151 highlight('test +1', '<p>test 1</p><p>1</p>', false, '<b>', '</b>')); 152 153 $this->assertSame('<p><b>test</b> 1</p><p>1</p>', 154 highlight('test -1', '<p>test 1</p><p>1</p>', false, '<b>', '</b>')); 155 } 156 157 public function test_replace_ampersands() { 158 $this->assertSame("This & that ", replace_ampersands_not_followed_by_entity("This & that ")); 159 $this->assertSame("This &nbsp that ", replace_ampersands_not_followed_by_entity("This   that ")); 160 } 161 162 public function test_strip_links() { 163 $this->assertSame('this is a link', strip_links('this is a <a href="http://someaddress.com/query">link</a>')); 164 } 165 166 public function test_wikify_links() { 167 $this->assertSame('this is a link [ http://someaddress.com/query ]', wikify_links('this is a <a href="http://someaddress.com/query">link</a>')); 168 } 169 170 /** 171 * Test basic moodle_url construction. 172 */ 173 public function test_moodle_url_constructor() { 174 global $CFG; 175 176 $url = new moodle_url('/index.php'); 177 $this->assertSame($CFG->wwwroot.'/index.php', $url->out()); 178 179 $url = new moodle_url('/index.php', array()); 180 $this->assertSame($CFG->wwwroot.'/index.php', $url->out()); 181 182 $url = new moodle_url('/index.php', array('id' => 2)); 183 $this->assertSame($CFG->wwwroot.'/index.php?id=2', $url->out()); 184 185 $url = new moodle_url('/index.php', array('id' => 'two')); 186 $this->assertSame($CFG->wwwroot.'/index.php?id=two', $url->out()); 187 188 $url = new moodle_url('/index.php', array('id' => 1, 'cid' => '2')); 189 $this->assertSame($CFG->wwwroot.'/index.php?id=1&cid=2', $url->out()); 190 $this->assertSame($CFG->wwwroot.'/index.php?id=1&cid=2', $url->out(false)); 191 192 $url = new moodle_url('/index.php', null, 'test'); 193 $this->assertSame($CFG->wwwroot.'/index.php#test', $url->out()); 194 195 $url = new moodle_url('/index.php', array('id' => 2), 'test'); 196 $this->assertSame($CFG->wwwroot.'/index.php?id=2#test', $url->out()); 197 } 198 199 /** 200 * Tests moodle_url::get_path(). 201 */ 202 public function test_moodle_url_get_path() { 203 $url = new moodle_url('http://www.example.org:447/my/file/is/here.txt?really=1'); 204 $this->assertSame('/my/file/is/here.txt', $url->get_path()); 205 206 $url = new moodle_url('http://www.example.org/'); 207 $this->assertSame('/', $url->get_path()); 208 209 $url = new moodle_url('http://www.example.org/pluginfile.php/slash/arguments'); 210 $this->assertSame('/pluginfile.php/slash/arguments', $url->get_path()); 211 $this->assertSame('/pluginfile.php', $url->get_path(false)); 212 } 213 214 public function test_moodle_url_round_trip() { 215 $strurl = 'http://moodle.org/course/view.php?id=5'; 216 $url = new moodle_url($strurl); 217 $this->assertSame($strurl, $url->out(false)); 218 219 $strurl = 'http://moodle.org/user/index.php?contextid=53&sifirst=M&silast=D'; 220 $url = new moodle_url($strurl); 221 $this->assertSame($strurl, $url->out(false)); 222 } 223 224 /** 225 * Test Moodle URL objects created with a param with empty value. 226 */ 227 public function test_moodle_url_empty_param_values() { 228 $strurl = 'http://moodle.org/course/view.php?id=0'; 229 $url = new moodle_url($strurl, array('id' => 0)); 230 $this->assertSame($strurl, $url->out(false)); 231 232 $strurl = 'http://moodle.org/course/view.php?id'; 233 $url = new moodle_url($strurl, array('id' => false)); 234 $this->assertSame($strurl, $url->out(false)); 235 236 $strurl = 'http://moodle.org/course/view.php?id'; 237 $url = new moodle_url($strurl, array('id' => null)); 238 $this->assertSame($strurl, $url->out(false)); 239 240 $strurl = 'http://moodle.org/course/view.php?id'; 241 $url = new moodle_url($strurl, array('id' => '')); 242 $this->assertSame($strurl, $url->out(false)); 243 244 $strurl = 'http://moodle.org/course/view.php?id'; 245 $url = new moodle_url($strurl); 246 $this->assertSame($strurl, $url->out(false)); 247 } 248 249 public function test_moodle_url_round_trip_array_params() { 250 $strurl = 'http://example.com/?a%5B1%5D=1&a%5B2%5D=2'; 251 $url = new moodle_url($strurl); 252 $this->assertSame($strurl, $url->out(false)); 253 254 $url = new moodle_url('http://example.com/?a[1]=1&a[2]=2'); 255 $this->assertSame($strurl, $url->out(false)); 256 257 // For un-keyed array params, we expect 0..n keys to be returned. 258 $strurl = 'http://example.com/?a%5B0%5D=0&a%5B1%5D=1'; 259 $url = new moodle_url('http://example.com/?a[]=0&a[]=1'); 260 $this->assertSame($strurl, $url->out(false)); 261 } 262 263 public function test_compare_url() { 264 $url1 = new moodle_url('index.php', array('var1' => 1, 'var2' => 2)); 265 $url2 = new moodle_url('index2.php', array('var1' => 1, 'var2' => 2, 'var3' => 3)); 266 267 $this->assertFalse($url1->compare($url2, URL_MATCH_BASE)); 268 $this->assertFalse($url1->compare($url2, URL_MATCH_PARAMS)); 269 $this->assertFalse($url1->compare($url2, URL_MATCH_EXACT)); 270 271 $url2 = new moodle_url('index.php', array('var1' => 1, 'var3' => 3)); 272 273 $this->assertTrue($url1->compare($url2, URL_MATCH_BASE)); 274 $this->assertFalse($url1->compare($url2, URL_MATCH_PARAMS)); 275 $this->assertFalse($url1->compare($url2, URL_MATCH_EXACT)); 276 277 $url2 = new moodle_url('index.php', array('var1' => 1, 'var2' => 2, 'var3' => 3)); 278 279 $this->assertTrue($url1->compare($url2, URL_MATCH_BASE)); 280 $this->assertTrue($url1->compare($url2, URL_MATCH_PARAMS)); 281 $this->assertFalse($url1->compare($url2, URL_MATCH_EXACT)); 282 283 $url2 = new moodle_url('index.php', array('var2' => 2, 'var1' => 1)); 284 285 $this->assertTrue($url1->compare($url2, URL_MATCH_BASE)); 286 $this->assertTrue($url1->compare($url2, URL_MATCH_PARAMS)); 287 $this->assertTrue($url1->compare($url2, URL_MATCH_EXACT)); 288 } 289 290 public function test_out_as_local_url() { 291 global $CFG; 292 // Test http url. 293 $url1 = new moodle_url('/lib/tests/weblib_test.php'); 294 $this->assertSame('/lib/tests/weblib_test.php', $url1->out_as_local_url()); 295 296 // Test https url. 297 $httpswwwroot = str_replace("http://", "https://", $CFG->wwwroot); 298 $url2 = new moodle_url($httpswwwroot.'/login/profile.php'); 299 $this->assertSame('/login/profile.php', $url2->out_as_local_url()); 300 301 // Test http url matching wwwroot. 302 $url3 = new moodle_url($CFG->wwwroot); 303 $this->assertSame('', $url3->out_as_local_url()); 304 305 // Test http url matching wwwroot ending with slash (/). 306 $url3 = new moodle_url($CFG->wwwroot.'/'); 307 $this->assertSame('/', $url3->out_as_local_url()); 308 } 309 310 /** 311 * @expectedException coding_exception 312 * @return void 313 */ 314 public function test_out_as_local_url_error() { 315 $url2 = new moodle_url('http://www.google.com/lib/tests/weblib_test.php'); 316 $url2->out_as_local_url(); 317 } 318 319 /** 320 * You should get error with modified url 321 * 322 * @expectedException coding_exception 323 * @return void 324 */ 325 public function test_modified_url_out_as_local_url_error() { 326 global $CFG; 327 328 $modifiedurl = $CFG->wwwroot.'1'; 329 $url3 = new moodle_url($modifiedurl.'/login/profile.php'); 330 $url3->out_as_local_url(); 331 } 332 333 /** 334 * Try get local url from external https url and you should get error 335 * 336 * @expectedException coding_exception 337 */ 338 public function test_https_out_as_local_url_error() { 339 $url4 = new moodle_url('https://www.google.com/lib/tests/weblib_test.php'); 340 $url4->out_as_local_url(); 341 } 342 343 public function test_moodle_url_get_scheme() { 344 // Should return the scheme only. 345 $url = new moodle_url('http://www.example.org:447/my/file/is/here.txt?really=1'); 346 $this->assertSame('http', $url->get_scheme()); 347 348 // Should work for secure URLs. 349 $url = new moodle_url('https://www.example.org:447/my/file/is/here.txt?really=1'); 350 $this->assertSame('https', $url->get_scheme()); 351 352 // Should return an empty string if no scheme is specified. 353 $url = new moodle_url('www.example.org:447/my/file/is/here.txt?really=1'); 354 $this->assertSame('', $url->get_scheme()); 355 } 356 357 public function test_moodle_url_get_host() { 358 // Should return the host part only. 359 $url = new moodle_url('http://www.example.org:447/my/file/is/here.txt?really=1'); 360 $this->assertSame('www.example.org', $url->get_host()); 361 } 362 363 public function test_moodle_url_get_port() { 364 // Should return the port if one provided. 365 $url = new moodle_url('http://www.example.org:447/my/file/is/here.txt?really=1'); 366 $this->assertSame(447, $url->get_port()); 367 368 // Should return an empty string if port not specified. 369 $url = new moodle_url('http://www.example.org/some/path/here.php'); 370 $this->assertSame('', $url->get_port()); 371 } 372 373 public function test_clean_text() { 374 $text = "lala <applet>xx</applet>"; 375 $this->assertSame($text, clean_text($text, FORMAT_PLAIN)); 376 $this->assertSame('lala xx', clean_text($text, FORMAT_MARKDOWN)); 377 $this->assertSame('lala xx', clean_text($text, FORMAT_MOODLE)); 378 $this->assertSame('lala xx', clean_text($text, FORMAT_HTML)); 379 } 380 381 public function test_qualified_me() { 382 global $PAGE, $FULLME, $CFG; 383 $this->resetAfterTest(); 384 385 $PAGE = new moodle_page(); 386 387 $FULLME = $CFG->wwwroot.'/course/view.php?id=1&xx=yy'; 388 $this->assertSame($FULLME, qualified_me()); 389 390 $PAGE->set_url('/course/view.php', array('id'=>1)); 391 $this->assertSame($CFG->wwwroot.'/course/view.php?id=1', qualified_me()); 392 } 393 394 public function test_null_progres_trace() { 395 $this->resetAfterTest(false); 396 397 $trace = new null_progress_trace(); 398 $trace->output('do'); 399 $trace->output('re', 1); 400 $trace->output('mi', 2); 401 $trace->finished(); 402 $output = ob_get_contents(); 403 $this->assertSame('', $output); 404 $this->expectOutputString(''); 405 } 406 407 public function test_text_progres_trace() { 408 $this->resetAfterTest(false); 409 410 $trace = new text_progress_trace(); 411 $trace->output('do'); 412 $trace->output('re', 1); 413 $trace->output('mi', 2); 414 $trace->finished(); 415 $this->expectOutputString("do\n re\n mi\n"); 416 } 417 418 public function test_html_progres_trace() { 419 $this->resetAfterTest(false); 420 421 $trace = new html_progress_trace(); 422 $trace->output('do'); 423 $trace->output('re', 1); 424 $trace->output('mi', 2); 425 $trace->finished(); 426 $this->expectOutputString("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n"); 427 } 428 429 public function test_html_list_progress_trace() { 430 $this->resetAfterTest(false); 431 432 $trace = new html_list_progress_trace(); 433 $trace->output('do'); 434 $trace->output('re', 1); 435 $trace->output('mi', 2); 436 $trace->finished(); 437 $this->expectOutputString("<ul>\n<li>do<ul>\n<li>re<ul>\n<li>mi</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n"); 438 } 439 440 public function test_progres_trace_buffer() { 441 $this->resetAfterTest(false); 442 443 $trace = new progress_trace_buffer(new html_progress_trace()); 444 ob_start(); 445 $trace->output('do'); 446 $trace->output('re', 1); 447 $trace->output('mi', 2); 448 $trace->finished(); 449 $output = ob_get_contents(); 450 ob_end_clean(); 451 $this->assertSame("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n", $output); 452 $this->assertSame($output, $trace->get_buffer()); 453 454 $trace = new progress_trace_buffer(new html_progress_trace(), false); 455 $trace->output('do'); 456 $trace->output('re', 1); 457 $trace->output('mi', 2); 458 $trace->finished(); 459 $this->assertSame("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n", $trace->get_buffer()); 460 $this->assertSame("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n", $trace->get_buffer()); 461 $trace->reset_buffer(); 462 $this->assertSame('', $trace->get_buffer()); 463 $this->expectOutputString(''); 464 } 465 466 public function test_combined_progres_trace() { 467 $this->resetAfterTest(false); 468 469 $trace1 = new progress_trace_buffer(new html_progress_trace(), false); 470 $trace2 = new progress_trace_buffer(new text_progress_trace(), false); 471 472 $trace = new combined_progress_trace(array($trace1, $trace2)); 473 $trace->output('do'); 474 $trace->output('re', 1); 475 $trace->output('mi', 2); 476 $trace->finished(); 477 $this->assertSame("<p>do</p>\n<p>  re</p>\n<p>    mi</p>\n", $trace1->get_buffer()); 478 $this->assertSame("do\n re\n mi\n", $trace2->get_buffer()); 479 $this->expectOutputString(''); 480 } 481 482 public function test_set_debugging() { 483 global $CFG; 484 485 $this->resetAfterTest(); 486 487 $this->assertEquals(DEBUG_DEVELOPER, $CFG->debug); 488 $this->assertTrue($CFG->debugdeveloper); 489 $this->assertNotEmpty($CFG->debugdisplay); 490 491 set_debugging(DEBUG_DEVELOPER, true); 492 $this->assertEquals(DEBUG_DEVELOPER, $CFG->debug); 493 $this->assertTrue($CFG->debugdeveloper); 494 $this->assertNotEmpty($CFG->debugdisplay); 495 496 set_debugging(DEBUG_DEVELOPER, false); 497 $this->assertEquals(DEBUG_DEVELOPER, $CFG->debug); 498 $this->assertTrue($CFG->debugdeveloper); 499 $this->assertEmpty($CFG->debugdisplay); 500 501 set_debugging(-1); 502 $this->assertEquals(-1, $CFG->debug); 503 $this->assertTrue($CFG->debugdeveloper); 504 505 set_debugging(DEBUG_ALL); 506 $this->assertEquals(DEBUG_ALL, $CFG->debug); 507 $this->assertFalse($CFG->debugdeveloper); 508 509 set_debugging(DEBUG_NORMAL); 510 $this->assertEquals(DEBUG_NORMAL, $CFG->debug); 511 $this->assertFalse($CFG->debugdeveloper); 512 513 set_debugging(DEBUG_MINIMAL); 514 $this->assertEquals(DEBUG_MINIMAL, $CFG->debug); 515 $this->assertFalse($CFG->debugdeveloper); 516 517 set_debugging(DEBUG_NONE); 518 $this->assertEquals(DEBUG_NONE, $CFG->debug); 519 $this->assertFalse($CFG->debugdeveloper); 520 } 521 522 public function test_strip_pluginfile_content() { 523 $source = <<<SOURCE 524 Hello! 525 526 I'm writing to you from the Moodle Majlis in Muscat, Oman, where we just had several days of Moodle community goodness. 527 528 URL outside a tag: https://moodle.org/logo/logo-240x60.gif 529 Plugin url outside a tag: @@PLUGINFILE@@/logo-240x60.gif 530 531 External link 1:<img src='https://moodle.org/logo/logo-240x60.gif' alt='Moodle'/> 532 External link 2:<img alt="Moodle" src="https://moodle.org/logo/logo-240x60.gif"/> 533 Internal link 1:<img src='@@PLUGINFILE@@/logo-240x60.gif' alt='Moodle'/> 534 Internal link 2:<img alt="Moodle" src="@@PLUGINFILE@@logo-240x60.gif"/> 535 Anchor link 1:<a href="@@PLUGINFILE@@logo-240x60.gif" alt="bananas">Link text</a> 536 Anchor link 2:<a title="bananas" href="../logo-240x60.gif">Link text</a> 537 Anchor + ext. img:<a title="bananas" href="../logo-240x60.gif"><img alt="Moodle" src="@@PLUGINFILE@@logo-240x60.gif"/></a> 538 Ext. anchor + img:<a href="@@PLUGINFILE@@logo-240x60.gif"><img alt="Moodle" src="https://moodle.org/logo/logo-240x60.gif"/></a> 539 SOURCE; 540 $expected = <<<EXPECTED 541 Hello! 542 543 I'm writing to you from the Moodle Majlis in Muscat, Oman, where we just had several days of Moodle community goodness. 544 545 URL outside a tag: https://moodle.org/logo/logo-240x60.gif 546 Plugin url outside a tag: @@PLUGINFILE@@/logo-240x60.gif 547 548 External link 1:<img src="https://moodle.org/logo/logo-240x60.gif" alt="Moodle" /> 549 External link 2:<img alt="Moodle" src="https://moodle.org/logo/logo-240x60.gif" /> 550 Internal link 1: 551 Internal link 2: 552 Anchor link 1:Link text 553 Anchor link 2:<a title="bananas" href="../logo-240x60.gif">Link text</a> 554 Anchor + ext. img:<a title="bananas" href="../logo-240x60.gif"></a> 555 Ext. anchor + img:<img alt="Moodle" src="https://moodle.org/logo/logo-240x60.gif" /> 556 EXPECTED; 557 $this->assertSame($expected, strip_pluginfile_content($source)); 558 } 559 560 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |