晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/www/crm/modules/Mobile/third-party/qCal/qCal/Parser/Lexer/ |
Upload File : |
<?php
/**
* qCal_Parser_Lexer_iCalendar
* The lexer for iCalendar RFC 2445 format. Other formats will need their
* own lexer. The lexer converts text to an array of "tokens", which, at least
* for now, are just arrays.
*
* @package qCal
* @subpackage qCal_Parser
* @copyright Luke Visinoni (luke.visinoni@gmail.com)
* @author Luke Visinoni (luke.visinoni@gmail.com)
* @license GNU Lesser General Public License
* @todo Make sure that multi-value properties are taken care of properly
*/
class qCal_Parser_Lexer_iCalendar extends qCal_Parser_Lexer {
/**
* @var string character(s) used to terminate lines
*/
protected $line_terminator;
/**
* Constructor
*/
public function __construct($content) {
parent::__construct($content);
$this->line_terminator = chr(13) . chr(10);
}
/**
* Return a list of tokens (to be fed to the parser)
* @returns array tokens
*/
public function tokenize() {
$lines = $this->unfold($this->content);
// loop through chunks of input text by separating by properties and components
// and create tokens for each one, creating a multi-dimensional array of tokens to return
$stack = array();
foreach ($lines as $line) {
// begin a component
if (preg_match('#^BEGIN:([a-z]+)$#i', $line, $matches)) {
// create new array representing the new component
$array = array(
'component' => $matches[1],
'properties' => array(),
'children' => array(),
);
$stack[] = $array;
} elseif (strpos($line, "END:") === 0) {
// end component, pop the stack
$child = array_pop($stack);
if (empty($stack)) {
$tokens = $child;
} else {
$parent =& $stack[count($stack)-1];
array_push($parent['children'], $child);
}
} else {
// continue component
if (preg_match('#^([^:]+):"?([^\n]+)?"?$#i', $line, $matches)) {
// @todo What do I do with empty values?
$value = isset($matches[2]) ? $matches[2] : "";
$component =& $stack[count($stack)-1];
// if line is a property line, start a new property, but first determine if there are any params
$property = $matches[1];
$params = array();
$propparts = explode(";", $matches[1]);
if (count($propparts) > 1) {
foreach ($propparts as $key => $part) {
// the first one is the property name
if ($key == 0) {
$property = $part;
} else {
// the rest are params
// @todo Quoted param values need to be taken care of...
list($paramname, $paramvalue) = explode("=", $part, 2);
$params[] = array(
'param' => $paramname,
'value' => $paramvalue,
);
}
}
}
$proparray = array(
'property' => $property,
'value' => $value,
'params' => $params,
);
$component['properties'][] = $proparray;
}
}
}
return $tokens;
}
/**
* Unfold the file before trying to parse it
*/
protected function unfold($content) {
$return = array();
$lines = explode($this->line_terminator, $content);
foreach ($lines as $line) {
$checkempty = trim($line);
if (empty($checkempty)) continue;
$chr1 = substr($line, 0, 1);
$therest = substr($line, 1);
// if character 1 is a whitespace character... (tab or space)
if ($chr1 == chr(9) || $chr1 == chr(32)) {
$return[count($return)-1] .= $therest;
} else {
$return[] = $line;
}
}
return $return;
}
}