PageRenderTime 68ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/src/apps/mtg/cards-html/parse.php

https://github.com/straccio/Vault
PHP | 846 lines | 599 code | 105 blank | 142 comment | 40 complexity | bae7c4be1e489096cac9d61440efcbc7 MD5 | raw file
  1. <?php
  2. require_once 'propel/Propel.php';
  3. $include_path=get_include_path();
  4. $include_path.=':../propel/build/classes/:.';
  5. set_include_path($include_path);
  6. Propel::init('../propel/build/conf/mtg-conf.php');
  7. $xsl = new DomDocument;
  8. $xsl->substituteEntities = true;
  9. $xsl->load('parse.xslt');
  10. $numbers_ar = array('zero','one','two','three','four','five','six','seven','eight','nine','ten');
  11. $colors_ar=array('white','black','red','green','blue','basic','multicolored','monocolored','colorless','any colors?','all colors?');
  12. $colors_r=implode('|',$colors_ar);
  13. $manas_ar=array('G','B','R','W','U','X','Y','Z');
  14. $manas_r=implode('|',$manas_ar);
  15. $abilities_ar = array(
  16. 'Deathtouch','Defender','Double Strike','Enchant','Equip','First Strike','Flying','Haste','Intimidate','Landwalk','Lifelink','Protection','Reach','Shroud',
  17. 'Trample','Vigilance','Banding','Rampage','Cumulative Upkeep','Flanking','Phasing','Buyback','Shadow','Cycling','Echo','Horsemanship','Fading','Kicker','Flashback','Flash',
  18. 'Madness','Fear','Morph','Amplify','Provoke','Storm','Affinity','Entwine','Modular','Sunburst','Bushido','Soulshift','Splice','Offering','Ninjutsu','Epic','Convoke',
  19. 'Dredge','Transmute','Bloodthirst','Haunt','Replicate','Forecast','Graft','Recover','Ripple','Split Second','Suspend','Vanishing','Absorb','Aura Swap','Delve',
  20. 'Fortify','Frenzy','Gravestorm','Poisonous','Transfigure','Champion','Changeling','Evoke','Hideaway','Prowl','Reinforce','Conspire','Persist','Wither','Retrace',
  21. 'Devour','Exalted','Unearth','Cascade','Annihilator','Level Up','Rebound','Totem Armor','Infect','Battle Cry','Living Weapon','mana ability',
  22. 'bands','channels?', 'chromas?', 'domains?', 'grandeurs?', 'hellbents?', 'imprints?', 'kinships?', 'landfalls?', 'metalcrafts?', 'radiances?', 'sweeps?', 'thresholds?' //Italics
  23. );
  24. $abilities_r=implode('|',$abilities_ar);
  25. $types_ar = array(
  26. 'Artifacts?','Creatures?','Enchantments?','Instants?','Lands?','Planeswalkers?','Sorceries?','Tribals?','Planes?','Vanguards?',
  27. 'Schemes?','Spells?','Mana Abilities','Abilities','Sorcery','Walls?','permanents?','Ability','Equipments?'
  28. );
  29. $types_r=implode('|',$types_ar);
  30. $players_ar=array('Opponents?','Players?','he or she','Owners?'.'controllers?','your control','yours?','you control','you','his or her');
  31. $players_r=implode('|', $players_ar);
  32. $lands_ar=array('forests?','swamps?','islands?','plains?','mountains?','basic lands?');
  33. $lands_r=implode('|',$lands_ar);
  34. $zones_ar = array(
  35. 'Librarys?','Hands?','Battlefields?','Graveyards?','Stacks?','Antes?','Mana Pools?'
  36. );
  37. $zones_r=implode('|',$zones_ar);
  38. $turnStructures_ar = array(
  39. 'Beginning Phases?','Untap Steps?','Upkeep Steps?','Draw Steps?','Main Phases?','Combat Phases?','Beginning of Combat Steps?','Declare Attackers Steps?',
  40. 'Declare Blockers Steps?','Combat Damage Steps?','End of Combat Steps?','Ending Phases?','End Steps?','End Of Turns?','Turns?','Upkeeps?'
  41. );
  42. $turnStructures_r=implode('|',$turnStructures_ar);
  43. $actions_ar = array(
  44. 'Activates?','Attachs?','Attacks?','Blocks?','Casts?','NONFARLOCounter','Destroy','Exchange','Exiles?','Play','Regenerates?','Reveals?','Sacrifices?','Search','Shuffle',
  45. 'Tapp,','Untapp','Taps?','Untaps?','Scry','Fateseal','Clashs?','Planeswalk','Set in Motions?','Abandon','Proliferates?','Discards?','Draws?','Defends?','Flips?'
  46. );
  47. $actions_r=implode('|',$actions_ar);
  48. $counters_ar=array(
  49. 'charges?','quests?','dooms?','ages?','golds?','kis?','pages?','arrows?','bloods?','fuses?','storages?','bountys?','devotions?','screams?','omens?','pupas?',
  50. 'rustas?','intervention?','ices?','wishs?','paralyzations?','energys?','delays?','elixirs?','depletions?','vitalitys?','winchs?','ores?','times?','fates?',
  51. 'floods?','plagues?','shells?','spores?','pains?','sleeps?','mines?'
  52. );
  53. $counters_r=implode('|',$counters_ar);
  54. $selectors_ar=array('all','each');
  55. $selectors_r=implode('|',$selectors_ar);
  56. /*
  57. array_multisort($abilities_ar,SORT_DESC);
  58. array_multisort($types_ar,SORT_DESC);
  59. array_multisort($types_ar,SORT_DESC);
  60. array_multisort($actions_ar,SORT_DESC);
  61. */
  62. $status_ar = array('exiled','regenerated','Equipped','unblockable','Enchanted','Exchanges','Activated','Proliferated');
  63. foreach ($actions_ar as &$action){
  64. array_push($status_ar, str_replace('\?', '', $action).'ed');
  65. }
  66. $status_r =implode('|',$status_ar );
  67. $active_ar = array();
  68. foreach ($actions_ar as &$action){
  69. array_push($active_ar,str_replace('s?', '', $action).'ing');
  70. }
  71. $active_r =implode('|',$active_ar );
  72. $subtypes_ar=array('Saprolings?','Spawns?','Graveborns?|green|bears?|Pentavites?|Phages?');//array('Urzas','Legendary','Zombie','snow','Spirit','Vampire','Elf','Faerie','Eye');
  73. $p = CardsQuery::create();
  74. $subtypes_ar_tmp =$p->setFormatter(ModelCriteria::FORMAT_ARRAY)->groupBy('Typeen')->select(array('Typeen'))->find();
  75. foreach($subtypes_ar_tmp as &$st){
  76. parseRepairSomeText($st);
  77. $st=str_replace(' - ',' ',$st);
  78. reSpace($st);
  79. $st = explode(' ', $st);
  80. foreach ($st as &$sti){
  81. $sti = trim($sti);
  82. if(strlen( $sti)>1){
  83. array_push($subtypes_ar,$sti);
  84. }
  85. }
  86. }
  87. unset($subtypes_ar_tmp);
  88. $subtypes_ar=array_unique($subtypes_ar);
  89. $subtypes_ar = explode('|', str_replace('|s?|','|' , implode('s?|',$subtypes_ar)));
  90. $subtypes_r=implode('|', $subtypes_ar);
  91. $filter = "";
  92. if(count($argv)<=1){
  93. $filter = "*";
  94. }else{
  95. for($i=1;$i<count($argv);$i++){
  96. $filter .= $argv[$i].' ';
  97. }
  98. $filter = trim($filter);
  99. }
  100. exec('find -L . -type f -name "' . $filter . '.html"',$dirlist);
  101. echo "\ntrovate " .count($dirlist) . " carte da elaborare\n";
  102. foreach ($dirlist as $d){
  103. $xp = new XsltProcessor();
  104. $xp->importStylesheet($xsl);
  105. $d = substr($d, 2);
  106. if(preg_match('/\.html$/', $d)){
  107. $d='./'.$d;
  108. //echo 'html: '.$d.';';
  109. shell_exec('./parseImages.sh '. escapeshellarg(str_replace('"','\"',$d)));
  110. //$fname=iconv("UTF-8", "ISO-8859-1//TRANSLIT//IGNORE", str_replace(":","/",preg_replace('/\.html$/', '',preg_replace('/\^.\/html\/','',$d))));
  111. $fname=str_replace(":","/",preg_replace('/\.html$/', '',preg_replace('/^\.\/html\//','',$d)));
  112. //$fname = str_replace(":","/",preg_replace('/\.html$/', '',$d));
  113. $xml_doc = new DomDocument;
  114. $xml_doc->strictErrorChecking=false;
  115. $xml_doc->loadHTMLFile($d.".ok");
  116. //echo "html loaded;";
  117. $html = $xp->transformToXml($xml_doc);
  118. if ($html) {
  119. //echo "html transformed;";
  120. $aa=json_decode($html);
  121. //var_dump($aa);
  122. //echo "json decoded;";
  123. if(is_array($aa)){
  124. foreach($aa as $a){
  125. if($fname==$a->CardName){
  126. updateCard($a, $fname);
  127. }
  128. }
  129. }else{
  130. //echo "updating card;";
  131. updateCard($aa, $fname);
  132. }
  133. //echo "updated card;";
  134. unset($aa);
  135. unset($html);
  136. }else{
  137. echo $d.": ko in xslt\n";
  138. }
  139. unset($xml_doc);
  140. unset($fname);
  141. shell_exec('rm -f "'.$d.'.ok"');
  142. }
  143. unset($xp);
  144. }
  145. function updateCard($jCard,$cname){
  146. if($jCard->Url<>""){
  147. shell_exec('wget "'.$jCard->Url.'" -O '. escapeshellarg($cname.'.html'));
  148. echo $cname.": ko download html\n";
  149. }else{
  150. $q = CardsQuery::create();
  151. //echo "db search;";
  152. $cards= $q->findByNameen(str_replace('"', '', $cname ));
  153. //echo "search founded " . count($cards) .";";
  154. //$cards = $q->where(CardsPeer::NAMEEN, '=', $cname)->find();
  155. if(count($cards)==0){
  156. $con = Propel::getConnection(CardsPeer::DATABASE_NAME);
  157. $stmt = $con->prepare("select * from Cards where nameEN sounds like :name");
  158. $stmt->execute(array(':name' => str_replace('"', '', $cname )));
  159. $formatter = new PropelObjectFormatter();
  160. $formatter->setClass('Cards');
  161. $cards = $formatter->format($stmt);
  162. if(count($cards)==0){
  163. echo $cname.": ko no card found\n";
  164. }
  165. unset($con);
  166. unset($stmt);
  167. unset ($formatter);
  168. }
  169. foreach($cards as $card){
  170. if($card){
  171. $card->setTypeen(parseOutputText($jCard->Types));
  172. $card->setTexten(parseOutputText($jCard->CardText));
  173. $card->setCost(parseOutputText($jCard->ManaCost));
  174. $card->setConvertedCost(parseOutputText($jCard->ConvertedManaCost));
  175. //$card->setScript(parseTextForScript($jCard));
  176. $card->setScript(parseScript(parseOutputText($jCard->CardScript),$jCard->CardName));
  177. if($jCard->FlavorText){
  178. $card->setFlavor(parseOutputText($jCard->FlavorText));
  179. }
  180. if($jCard->Artist){
  181. $card->setArtist(parseOutputText($jCard->Artist));
  182. }
  183. $card->save();
  184. //insertAbility($card->getScript());
  185. echo $cname.": ok set ".$card->getSetid()."\n";
  186. }else{
  187. echo $cname.": ko no card found\n";
  188. }
  189. }
  190. unset($cards);
  191. unset($q);
  192. }
  193. //flush();
  194. //print_r($card->toArray());
  195. }
  196. function parseScript($text,$name){
  197. if($name){
  198. $text = preg_replace('/'.parseOutputText($name).'s?/i', '$Me',$text);
  199. }
  200. preg_match_all('/@\[[^\]]*\],?/', $text, $actions_ar);
  201. $text='';
  202. foreach($actions_ar[0] as &$abs){
  203. parseRepairSomeText($abs);
  204. $abs=explode(' ; ', $abs);
  205. foreach($abs as &$action){
  206. $cost = parseCost($action);
  207. parseFC($action);
  208. parseNumbers($action);
  209. parseChoose($action);
  210. parseManas($action);
  211. parseCoins($action);
  212. parsePlayers($action);
  213. parseStatus($action);
  214. parseActives($action);
  215. parseZones($action);
  216. parseCounters($action);
  217. parseTypes($action);
  218. parseAbilitys($action);
  219. parseTurnStructures($action);
  220. parseActions($action);
  221. parseSelectors($action);
  222. //parseTargets($action);
  223. $parsers_ar=array('FC','Number','Mana','Status','Active','TurnStructure','Zone','Ability','Type','Action','Coin');
  224. foreach($parsers_ar as $pa){
  225. $rx='/\{type:\\\''.$pa.'\\\',\s?value:\\\'([^\\\']*)\\\'\}\s?(and| )\s?{type:\\\''.$pa.'\\\',\s?value:\\\'([^\\\']*)\\\'\}/i';
  226. while(preg_match($rx, $action)){
  227. $action = preg_replace($rx, '{type:\''.$pa.'\',value:\'$1,$3\'}', $action);
  228. }
  229. }
  230. foreach($parsers_ar as $pa){
  231. $rx='/\{type:\\\''.$pa.'\\\',\s?value:\[?([^\}^\]]*)\]?\}\s?,?\s?(or)\s?(the)?\s?{type:\\\''.$pa.'\\\',\s?value:\[?([^\}^\]]*)\]?\}/i';
  232. while(preg_match($rx, $action)){
  233. $action = preg_replace($rx, '{type:\''.$pa.'\',value:[$1,$4]}', $action);
  234. }
  235. }
  236. parseFunctions($action);
  237. parseDoActions($action);
  238. insertSingleAbility($action,$cost);
  239. $text.=$cost.' : '.$action .'';
  240. }
  241. }
  242. //$text = preg_replace('/([@mcavpslts]\([^\)]*\))/',' $1 ',$text);
  243. unset ($action);
  244. return $text;
  245. /*
  246. $ret= parseFunctions(
  247. parseEvents(
  248. parseDuration(
  249. trim($text)
  250. )
  251. )
  252. );
  253. return $ret;
  254. *
  255. */
  256. }
  257. function parseRepairSomeText(&$text){
  258. $ret=&$text;
  259. $ret=preg_replace('/^@\[([^\]]*)\],?/', '$1', $ret);
  260. $ret=preg_replace('/\([^\)]*\)\s?$/','',$ret);
  261. $ret=str_ireplace('Urza-s', '$Urzas', $ret);
  262. $ret=str_ireplace('non-', 'non ', $ret);
  263. $ret=preg_replace('/(puts?) a /i','$1 one ',$ret);
  264. $ret=preg_replace('/(remove) a /i','$1 one ',$ret);
  265. $ret=preg_replace('/(draws?) a card/i','$1 one card',$ret);
  266. $ret=preg_replace('/(discards?) a card/i','$1 one card',$ret);
  267. $ret=preg_replace('/(flips?) a coin/i','$1 one coin',$ret);
  268. $ret=preg_replace('/power and toughness/i','power/toughness',$ret);
  269. $ret=preg_replace('/([.]); or/','$1 ; or',$ret);
  270. $ret=preg_replace('/([A-Za-z])-([^-])/', '$1 - $2', $ret);
  271. $ret=preg_replace('/-([A-Za-z])/', '- $1', $ret);
  272. return $ret;
  273. }
  274. function parsePlayers(&$text){
  275. global
  276. $players_r;
  277. $ret = &$text;
  278. //$ret = preg_replace('/(each)?\s?('.$players_r.')/i',' {type:\'Player\',value:\'$1$2\'}) ',$ret);
  279. parser('Player', '('.$players_r.')', '$1', $ret);
  280. }
  281. function parseActions(&$text){
  282. global
  283. $actions_r;
  284. $ret = &$text;
  285. //$ret = preg_replace('/^[\s\.,]?('.$actions_r.')[\s\.,]/i',' {type:\'Action\',value:\'$1 $2\'}) ',$ret);
  286. //$ret = preg_replace('/[\s\.,]('.$actions_r.')[\s\.,]?$/i',' {type:\'Action\',value:\'$1 $2\'}) ',$ret);
  287. //$ret = preg_replace('/[\s\.,]('.$actions_r.')[\s\.,]/i',' {type:\'Action\',value:\'$1 $2\'}) ',$ret);
  288. parser('Action', '('.$actions_r.')', '$1', $ret);
  289. return $ret;
  290. }
  291. function parseActives(&$text){
  292. global
  293. $active_r;
  294. $ret = &$text;
  295. //$ret = preg_replace('/(this|isnt|is|non)?-?\s?('.$active_r.')/i','{type:\'Active\',value:\'$2$1\'}) ',$ret);
  296. parser('Active', '(isnt|non)?(this|is)?\s?('.$active_r.')', '$1$3', $ret);
  297. return $ret;
  298. }
  299. function parseTypes(&$text){
  300. global
  301. $colors_r,
  302. $lands_r,
  303. $subtypes_r,
  304. $types_r;
  305. $ret=&$text;
  306. //$ret=preg_replace('/^[\s\.,]?(this|isnt|is|non)?-?\s?a?\s?('. $types_r.'|'. $subtypes_r .'|'.$lands_r.'|'.$colors_r.')[\s\.\,;]/i', ' {type:\'Type\',value:\'$1$2\'} ', $ret);
  307. //$ret=preg_replace('/[\s\.,;](this|isnt|is|non)?-?\s?a?\s?('. $types_r.'|'. $subtypes_r .'|'.$lands_r.'|'.$colors_r.')[\s\.\,;]?$/i', ' {type:\'Type\',value:\'$1$2\'} ', $ret);
  308. //$ret=preg_replace('/[\s\.,;](this|isnt|is|non)?-?\s?a?\s?('. $types_r.'|'. $subtypes_r .'|'.$lands_r.'|'.$colors_r.')[\s\.\,;]/i', ' {type:\'Type\',value:\'$1$2\'} ', $ret);
  309. parser('Type', '(isnt|non)?(this|is)?\s?a?\s?('. $types_r.'|'. $subtypes_r .'|'.$lands_r.'|'.$colors_r.')', '$1$3', $ret);
  310. }
  311. function parseFC(&$text){
  312. $ret=&$text;
  313. //F/C
  314. //$ret = preg_replace('/([+-]?[0-9XYZ]*\/[+-]?[0-9XYZ])/', ' {type:\'FC\',value:\'$1\'} ', $ret);
  315. parser('FC', '([+-]?[0-9XYZ][0-9XYZ]?\/[+-]?[0-9XYZ][0-9XYZ]?)', '$1', $ret);
  316. }
  317. function parseManas(&$text){
  318. global
  319. $manas_r;
  320. $ret=&$text;
  321. //Mana
  322. //$ret = preg_replace('/\{([0-9]?['. implode('',$manas_ar) .']?)\}/i', ' {type:\'Mana\',value:[\'$1\']} ', $ret);
  323. parser('Mana', '\{([0-9])?('. $manas_r .')?\}', '$1$2', $ret,false);
  324. //$ret = preg_replace('/\]\}\{type:\'Mana\',value\:\[/', '\',\'', $ret);
  325. }
  326. function parseNumbers(&$text){
  327. global
  328. $numbers_ar;
  329. $ret=&$text;
  330. $i=0;
  331. foreach($numbers_ar as $n){
  332. $ret=preg_replace('/ '.$n.'[\s\,\.\:\-;]/i',' '. $i . ' ',$ret);
  333. $i++;
  334. }
  335. //$ret = preg_replace('/^([+\-]?[0-9XYZ][\s,\.;])/', ' {type:\'Number\',value:\'$1\'} ', $ret);
  336. //$ret = preg_replace('/[\s,\.;:]([+\-]?[0-9XYZ][\s,\.;]?Ã¥$)/', ' {type:\'Number\',value:\'$1\'} ', $ret);
  337. //$ret = preg_replace('/[\s,\.;:]([+\-]?[0-9XYZ][\s,\.;])/', ' {type:\'Number\',value:\'$1\'} ', $ret);
  338. parser('Number', '([+-]?[0-9XYZ][0-9XYZ]?)', '$1', $ret);
  339. }
  340. function parseChoose(&$text){
  341. $ret=&$text;
  342. if(preg_match('/^Choose ([^\-]*) - /i',$ret)){
  343. $ret = preg_replace('/^Choose ([^\-]*) - /i',' {type:\'Choose\',value:\'$1\'} ; ', $ret);
  344. }
  345. }
  346. function parseCost(&$text){
  347. $ret=&$text;
  348. if(preg_match('/Add one mana of any color to your mana pool\./',$ret) ){
  349. $ret=&$ret;
  350. }
  351. if(preg_match('/^\{[^:]*:/',$ret)){
  352. $cost = preg_replace('/^([^:]*): .*/','$1', $ret);
  353. $cost = str_replace('{tap}','{TAP}',$cost);
  354. parseRepairSomeText($cost);
  355. parseNumbers($cost);
  356. parseFC($cost);
  357. parseActions($cost);
  358. parseManas($cost);
  359. //$cost = str_replace('{', '\'', $cost);
  360. //$cost = str_replace('}', '\'', $cost);
  361. //$cost = str_replace('$\'me\'','${me}',$cost);
  362. $cost = str_replace('\'\'', '\',\'', $cost);
  363. $cost = ' {type:\'Cost\',value:['.$cost.']} : ';
  364. $ret = preg_replace('/(^{[^:]*): /',$cost, $ret);
  365. $ret = str_replace($cost,'',$ret);
  366. return $cost;
  367. }
  368. }
  369. function parseAbilitys(&$text){
  370. global
  371. $colors_r,
  372. $abilities_r;// _ar;
  373. $ret=&$text;
  374. //$rx='(isnt|non)?(this|is)??\s?a?\s?('.$abilities_r.')\s?(from)?\s?(the)?\s?('.$colors_r.')?';
  375. //$ret=preg_replace('/^'.$rx.'/i',' {type:\'Ability\',value:\'$1$5$2\'} ' , $ret);
  376. //$ret=preg_replace('/'.$rx.'$/i',' {type:\'Ability\',value:\'$1$5$2\'} ' , $ret);
  377. //$ret=preg_replace('/[\s,\.;^:]'.$rx.'[\s,\.;]/i',' {type:\'Ability\',value:\'$1$5$2\'} ' , $ret);
  378. parser('Ability', '(isnt|non)?(this|is)?\s?a?\s?('.$abilities_r.')', '$1$3', $ret);
  379. parser('Ability', '\{type:\'Ability\',value:\'(protections?|affinitys?)\'\}\s?(from)?\s?(the)?\s?\{type:\'Type\',value:\'([^\']*)\'\}', '$4$1', $ret);
  380. //$ret = preg_replace('/[Pp]rotection from the ([^\s^,^\.^;^:\]]*)/i',' {type:\'Ability\',value:\'$1Protection\'} ',$ret);
  381. //$ret = parser('Ability', '[Pp]rotection from ([^\s^,^\.^;^:\]]*)', '$1Protection', $ret);
  382. //$ret = preg_replace('/[Pp]rotection from ([^\s^,^\.^;^:\]]*)/i',' {type:\'Ability\',value:\'$1Protection\'} ',$ret);
  383. //$ret = preg_replace('/(a\([^\}]*[Pp]rotection\)) and from ([^\s^,^\.^;^:\]]*)/i','$1 {type:\'Ability\',value:\'$2Protection\'} ',$ret);
  384. //$ret = parser('Ability', '[Pp]rotection from ([^\s^,^\.^;^:\]]*)', '$1Protection', $ret);
  385. //$ret = preg_replace('/[Aa]ffinity for ([^\s^,^\.^;^:\]]*)/i',' {type:\'Ability\',value:\'$1Affinity\'} ',$ret);
  386. //$ret = parser('Ability', '[Aa]ffinity for ([^\s^,^\.^;^:\]]*)', '$1Protection', $ret);
  387. //$ret = preg_replace('/(a\([^\}]*[Aa]ffinity\)) and from ([^\s^,^\.^;^:\]]*)/i','$1 {type:\'Ability\',value:\'$2Affinity\'} ',$ret);
  388. return $ret;
  389. }
  390. function parseTurnStructures(&$text){
  391. global
  392. $turnStructures_r;
  393. $ret=&$text;
  394. //$ret = preg_replace('/\s('.$turnStructures_r.')[\s,\.;]/i',' {type:\'TurnStructures\',value:\'$1\'} ',$ret);
  395. parser('TurnStructure','('.$turnStructures_r.')','$1',$ret);
  396. }
  397. function parseZones(&$text){
  398. global
  399. $zones_r;
  400. $ret=&$text;
  401. //$ret = preg_replace('/ ('.$zones_r.')/i', ' {type:\'Zones\',value:\'$1\'} ' , $ret);
  402. parser('Zone', '('.$zones_r.')', '$1', $ret);
  403. }
  404. function parseStatus(&$text){
  405. global
  406. $status_r;
  407. $ret=&$text;
  408. //$ret = preg_replace('/(this|isnt|is|non)?-?\s?a?\s??('.$status_r.')/i', ' {type:\'Status\',value:\'$1$2\'} ' , $ret);
  409. parser('Status', '(isnt|non)?(this|is)?\s?a?\s?('.$status_r.')', '$1$3', $ret);
  410. }
  411. function parseCounters(&$text){
  412. global
  413. $counters_r;
  414. $ret=&$text;
  415. //$ret = preg_replace('/(this|isnt|is|non)?-?\s?a?\s??('.$status_r.')/i', ' {type:\'Status\',value:\'$1$2\'} ' , $ret);
  416. parser('Counter', '('.$counters_r.') counters?', '$1', $ret);
  417. }
  418. function parseSelectors(&$text){
  419. global
  420. $selectors_r;
  421. $ret=&$text;
  422. //$ret = preg_replace('/(this|isnt|is|non)?-?\s?a?\s??('.$status_r.')/i', ' {type:\'Status\',value:\'$1$2\'} ' , $ret);
  423. parser('Selector', '('.$selectors_r.')', '$1', $ret);
  424. }
  425. function parseCoins(&$text){
  426. $ret=&$text;
  427. parser('Coin', '\{(C)\}', '$1' , $ret,false);
  428. //parser('Coin', '(Flip a coin)', '$1', $ret,false);
  429. }
  430. function insertSingleAbility($text,$cost){
  431. //$abs=explode(' ; ', $text);
  432. //foreach ($abs as &$ab){
  433. $ab=$text;
  434. if($ab){
  435. $s = new Abscript();
  436. $t=parseAbility(trim($ab));
  437. if($t!=''){
  438. $s->setAbility(parseAbility(trim($t)));
  439. $s->setSample(trim($cost.$ab));
  440. try {
  441. $s->save();
  442. } catch (Exception $e) {
  443. unset($e);
  444. }
  445. unset($s);
  446. preg_match('/a\([^\)]*\)/',$ab,$sabs);
  447. foreach ($sabs as $sab){
  448. //$s = AbscriptQuery::create()->findPk($sab);
  449. if($sab ){
  450. $s = new Abscript();
  451. $s->setAbility(parseAbility(trim($sab)));
  452. $s->setSample(trim($cost.$sab));
  453. try {
  454. $s->save();
  455. } catch (Exception $e) {
  456. unset($e);
  457. }
  458. unset($s);
  459. }
  460. }
  461. }
  462. }
  463. //}
  464. }
  465. function insertAbility($text){
  466. preg_match_all('/@\[[^\]]*\],?/', $text, $abs);
  467. //$abs = preg_split('/\], /', $text);
  468. foreach($abs[0] as $ab){
  469. //$s = AbscriptQuery::create()->findPk($ab."]");
  470. if($ab){
  471. $s = new Abscript();
  472. $t=parseAbility(substr(trim($ab),2));
  473. if($t!=''){
  474. $s->setAbility(parseAbility(trim($t)));
  475. $s->setSample(trim($ab."]"));
  476. try {
  477. $s->save();
  478. } catch (Exception $e) {
  479. unset($e);
  480. }
  481. unset($s);
  482. preg_match('/a\([^\)]*\)/',$ab,$sabs);
  483. foreach ($sabs as $sab){
  484. //$s = AbscriptQuery::create()->findPk($sab);
  485. if($sab ){
  486. $s = new Abscript();
  487. $s->setAbility(parseAbility(trim($sab)));
  488. $s->setSample(trim($sab));
  489. try {
  490. $s->save();
  491. } catch (Exception $e) {
  492. unset($e);
  493. }
  494. unset($s);
  495. }
  496. }
  497. }
  498. }
  499. }
  500. unset($abs);
  501. unset($ab);
  502. unset($sabs);
  503. unset($sab);
  504. }
  505. function parseAbility(&$text){
  506. $ret = $text;
  507. /*
  508. $ret = preg_replace_callback(
  509. '/@\([^\)]*\)/',
  510. 'escapeFC',
  511. $ret);
  512. */
  513. $ret = preg_replace('/\{type:\'([^\']*)\'[^\}]*\}/',' ${$1} ',$ret);
  514. $ret = preg_replace('/\$Me/',' ${Me} ',$ret);
  515. /*
  516. $ret = preg_replace('/@\([^\)]*\)/',' ${FC} ',$ret);
  517. $ret = preg_replace('/m\([^\)]*\)/',' ${Mana} ', $ret);
  518. $ret=str_replace(' ', ' ', $ret);
  519. //$ret = preg_replace('/m\([^\)]*\)([^:]?):/','${cost}$1:', $ret);
  520. //$ret = preg_replace('/c\([^\)]*\)/',' ${condition} ', $ret);
  521. $ret = preg_replace('/a\([^\)]*\)/',' ${Ability} ', $ret);
  522. $ret = preg_replace('/v\([^\)]*\)/',' ${Val} ', $ret);
  523. //$ret = preg_replace('/p\([^\)]*\)/',' ${phase} ', $ret);
  524. //$ret = preg_replace('/s\([^\)]*\)/',' ${step} ', $ret);
  525. //$ret = preg_replace('/l\([^\)]*\)/',' ${loc} ', $ret);
  526. //$ret = preg_replace('/t\([^\)]*\)/',' ${target} ', $ret);
  527. //$ret = preg_replace('/t\(v\([^\)\)]*\)/',' ${target} ', $ret);
  528. //$ret = preg_replace('/\s\([^\)]*\)/','',$ret);
  529. */
  530. $ret=str_replace(' ', ' ', $ret);
  531. return $ret;
  532. /*
  533. if(trim(preg_replace('/\$\{ability\}[\.,\s]?/','',$ret))!=''){
  534. return $ret;
  535. }else{
  536. return '';
  537. }
  538. */
  539. }
  540. function parseOutputText($text){
  541. $ret = preg_replace('/[^[:print:]]/', '', $text);
  542. $ret = str_replace(chr(226) , '-', $ret);
  543. $ret = str_replace(chr(195), 'AE', $ret);
  544. //$ret = iconv("UTF-8", "ISO-8859-1//IGNORE",$ret);
  545. return $ret;
  546. }
  547. function parseFunctionArgs(&$m,$rown){
  548. $ret = '{';
  549. $i=0;
  550. foreach ($m as $k => &$mm){
  551. if(!is_numeric($k)){
  552. if($i>0) $ret.=',';
  553. $mm[$rown]=trim($mm[$rown]);
  554. if($mm[$rown]){
  555. if(substr($mm[$rown],0,1) != '{'){
  556. $mm[$rown] = '\''.$mm[$rown].'\'';
  557. }
  558. if(preg_match_all('/\}[\s,]?\{/', $mm[$rown],$p)){
  559. $ret.=$k.':['.preg_replace('/\}[\s,]?\{/','},{',$mm[$rown]).']';
  560. }else{
  561. $ret.=$k.':'.$mm[$rown];
  562. }
  563. }else{
  564. $ret.=$k.':null';
  565. }
  566. $i++;
  567. }
  568. }
  569. $ret.='}';
  570. return $ret;
  571. }
  572. function parseFunctions(&$text){
  573. $ns='MTG.cardAbilities';
  574. $tappo='[\s\.,;:]';
  575. $ret = &$text;
  576. $funcs_ar=array(
  577. // \{type:\'Selector\'[^\}]*\}
  578. //gets (?p<turnStructure>\{type:\'TurnStructure\'[^\}]*\})?
  579. 'gets'=>array(
  580. //'/(Target)?\s?(?P<target>\$Me|\{type:\'Type\'[^\}]*\})\s*gets?\s*(?P<fc>\{type:\'FC\'[^\}]*\})\s?(?P<timeEvent>until)?\s?(?P<turnStructure>\{type:\'TurnStructure\'[^\}]*\})?'.$tappo.'/i'
  581. '/(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(Target)?\s?(?P<target>\$Me|(\{type:\'(Type|Player)\'[^\}]*\}\s?)*)\s?gets?\s*(?P<fc>\{type:\'FC\'[^\}]*\})\s?(?P<timeEvent>until)?\s?(?P<turnStructure>\{type:\'TurnStructure\'[^\}]*\})?'.$tappo.'/i'
  582. ),
  583. 'has'=>array(
  584. '/(targets?)?\s?(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(Target)?\s?(?P<target>\$Me|(\{type:\'(Type|Player|Status)\'[^\}]*\}\s?)*)\s?(has|have)\s?(?P<ability>\{type:\'Ability\'[^\}]*\})\s?(?P<timeEvent>until)?\s?(?P<turnStructure>\{type:\'TurnStructure\'[^\}]*\})?'.$tappo.'/i'
  585. ),
  586. 'lose'=>array(
  587. '/(targets?)?\s?(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(Target)?\s?(?P<target>\$Me|(\{type:\'(Type|Player|Status)\'[^\}]*\}\s?)*)\s?(loses)\s?(?P<effectSelector>{type:\'Selector\'[^\}]*\})?\s?(?P<ability>\{type:\'Ability\'[^\}]*\})\s?(?P<timeEvent>until)?\s?(?P<turnStructure>\{type:\'TurnStructure\'[^\}]*\})?'.$tappo.'/i'
  588. ),
  589. 'pay,'=>array(
  590. '/(targets?)?\s?(?P<target>(\{type:\'(Player|Type)\'[^\}]*\}\s)*)?\s?(Pay\s?|Loses?)\s?(?P<howMany>\$Me|\{type:\'(Number|Mana)\'[^\}]*\})\s?(?P<what>life|mana cost)?'.$tappo.'/i',
  591. //'/(target)?\s?(?P<target>(\{type:\'Player\'[^\}]*\}\s)*)?\s?Gain\s?(?P<howMany>\$Me|\{type:\'(Number|Mana)\'[^\}]*\})\s?(?<what>life)?'.$tappo.'/i'
  592. ),
  593. 'gain'=>array(
  594. '/(target)?\s?(?P<target>\{type:\'Player\'[^\}]*\})?\s?Gains?\s?(?P<howMany>\{type:\'(Number)\'[^\}]*\})\s?(?<what>life)?'.$tappo.'/i'
  595. ),
  596. 'putCounters'=>array(
  597. /*
  598. * Remove {type:'Number',value:'1'} {type:'FC',value:'-1/-1'} counter from target {type:'Type',value:'creature'} .
  599. */
  600. '/(puts?)\s?(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(?P<howMany>\{type:\'Number\'[^\}]*\})?\s?(?P<what>((\{type:\'(FC|Type|Counter)\'[^\}]*\}\s?)*))?\s?(counters?|tokens?)?\s?(with|onto|on|from)\s?(the|for)?\s?(?P<with>\{type:\'Ability\'[^\}]*\})?\s?(?P<target>\$Me|\{type:\'Type\'[^\}]*\})?(?P<where>\{type:\'Zone\'[^\}]*\})?'.$tappo.'/i'
  601. ),
  602. //(?P<selector>{type:\'Selector\'[^\}]*\})?
  603. // remove {type:'Selector',value:'all'} {type:'FC',value:'+1/+1'} counters from $Me
  604. 'removeCounters'=>array(
  605. '/remove\s?(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(?P<howMany>\{type:\'Number\'[^\}]*\})?\s?(?P<what>((\{type:\'(FC|Type|Counter)\'[^\}]*\}\s?)*))?\s?(counters?|tokens?)?\s?(with|onto|on|from)\s?(the|for)?\s?(?P<with>\{type:\'Ability\'[^\}]*\})?\s?(?P<target>\$Me|\{type:\'Type\'[^\}]*\})?(?P<where>\{type:\'Zone\'[^\}]*\})?'.$tappo.'/i'
  606. ),
  607. 'counterSpell'=>array(
  608. '/Counter target (?P<target>\$Me|(\{type:\'(Type)\'[^\}]*\}\s?)*)'.$tappo.'/i'
  609. ),
  610. 'deal'=>array(
  611. '/(?P<who>\$Me)?\s?deals?\s?(?P<howmany>\{type:\'Number\'[^\}]*\})\s?(?P<what>combat damage|damage)\s?to\s?(targets?|thats?|a)?\s?(?P<target>\{type:\'(Type|Player)\'[^\}]*\})'.$tappo.'/i'
  612. ),
  613. 'prevent'=>array(
  614. //Prevent the next ${Number} damage that would be dealt to target ${Type} this ${TurnStructure} .
  615. '/prevents?\s?(the\s?next)?\s?(?P<homany>\{type:\'(Selector|Number)\'[^\}]*\})\s?(?P<what>combat damage|damage)\s?(that)?\s?(would\s?be\s?dealt\s?to)\s?(targets?)?\s?(?P<target>\{type:\'(Type|Player)\'[^\}]*\})\s?(this)?\s?(?P<turnStructure>\{type:\'TurnStructure\'[^\}]*\})?'.$tappo.'/i'
  616. ),
  617. 'addMana'=>array(
  618. //Add {type:'Mana',value:'W'} to {type:'Player',value:'your'} {type:'Zone',value:'mana pool'} .
  619. '/Add (?P<mana>\{type:\'Mana\'[^\}]*\})\s?to\s?(?P<target>\{type:\'Player\'[^\}]*\})\s?(?P<where>\{type:\'Zone\'[^\}]*\})?'.$tappo.'/i'
  620. )
  621. );
  622. foreach ($funcs_ar as $fname=> &$func){
  623. foreach ($func as &$rfunc){
  624. if(preg_match_all($rfunc, $ret,$f)){
  625. for($i=0;$i<count($f[0]);$i++){
  626. //foreach($m as $k=>&$mm){
  627. //if(!is_numeric($k)){
  628. $ret=str_replace($f[0],"\n". $ns.'.'. $fname.'(/*card*/$this,'.parseFunctionArgs($f, $i).");\n", $ret);
  629. //}
  630. //}
  631. }
  632. }
  633. }
  634. }
  635. }
  636. function parseDoActions(&$text){
  637. $ns='MTG.cardAbilities';
  638. $tappo='[\s\.,;:]';
  639. $ret = &$text;
  640. $funcs_ar=array(
  641. // \{type:\'Selector\'[^\}]*\}
  642. //gets (?p<turnStructure>\{type:\'TurnStructure\'[^\}]*\})?
  643. 'drawCards'=>array(
  644. //'/(target)?\s?(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(?P<target>\{type:\'Player\'[^\}]*\})?\s?\{type:\'Action\',value:\'(Draws?)\'\}\s?(?P<howmany>\{type:\'Number\'[^\}]*\})\s?cards?'.$tappo.'/i',
  645. '/(target)?\s?(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(?P<target>\{type:\'Player\'[^\}]*\})?\s?\{type:\'Action\',value:\'(Draws?)\'\}\s?(?P<howmany>\{type:\'Number\'[^\}]*\})\s?cards?'.$tappo.'/i'
  646. ),
  647. 'discardCards'=>array(
  648. '/(target)?\s?(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(?P<target>\{type:\'Player\'[^\}]*\})?\s?\{type:\'Action\',value:\'(Discards?)\'\}\s?(?P<howmany>\{type:\'Number\'[^\}]*\})\s?cards?'.$tappo.'/i'
  649. ),
  650. 'sacrifice'=>array(
  651. '/\{type:\'Action\',value:\'Sacrifices?\'\}\s?(targets?)?\s?(?P<selector>{type:\'Selector\'[^\}]*\})?\s?(?P<target>\$Me|\{type:\'Type\'[^\}]*\})'.$tappo.'/i'
  652. ),
  653. 'flip'=>array(
  654. '/(targets?)?\s?(?P<target>\{type:\'Player\'[^\}]*\})?\s?\{type:\'Action\',value:\'Flip\'\}\s?(?P<howmany>\{type:\'Number\'[^\}]*\})\s?coin'.$tappo.'/i'
  655. )
  656. );
  657. foreach ($funcs_ar as $fname=> &$func){
  658. foreach ($func as &$rfunc){
  659. if(preg_match_all($rfunc, $ret,$f)){
  660. for($i=0;$i<count($f[0]);$i++){
  661. //foreach($m as $k=>&$mm){
  662. //if(!is_numeric($k)){
  663. $ret=str_replace($f[0],"\n". $ns.'.'. $fname.'(/*card*/$this,'.parseFunctionArgs($f, $i).");\n", $ret);
  664. //}
  665. //}
  666. }
  667. }
  668. }
  669. }
  670. }
  671. function parseEvents(&$text){
  672. //$ns='MTG.cardAbilities';
  673. $tappo='[\s\.,;:]';
  674. $ret = &$text;
  675. $evs_ar=array(
  676. //gets (?p<turnStructure>\{type:\'TurnStructure\'[^\}]*\})?
  677. 'on'=>array(
  678. '/zzz'.$tappo.'/i'
  679. ),
  680. );
  681. if(preg_match('/ pay /i', $ret)){
  682. $a=true;
  683. }
  684. foreach ($funcs_ar as $fname=> &$func){
  685. foreach ($func as &$rfunc){
  686. if(preg_match_all($rfunc, $ret,$m)){
  687. for($i=0;$i<count($m[0]);$i++){
  688. //$ret=str_replace($m[0],' '. $ns.'.'. $fname.parseFunctionArgs($m, $i).'; ', $ret);
  689. }
  690. }
  691. }
  692. }
  693. }
  694. function parseDuration($text){
  695. $ret=&$text;
  696. $ret=preg_replace('/until ([\$sp][\(\{][^\}^\)]*[\}\)])/i','duration_until :$1',$ret);
  697. return $ret;
  698. }
  699. function parser($type,$regExp,$value,&$text,$useTappo = true){
  700. $ret=&$text;
  701. if(preg_match('/'.$regExp.'/i', $ret)){
  702. //reSpace($ret);
  703. if($useTappo){
  704. $tappo='[\s\.,;:]';
  705. $valueTappo=preg_replace_callback('/\$[0-9][0-9]?/', "reposRegExpValues_Callback", $value);
  706. preg_match_all('/[^\)]?\(/', $regExp,$m);
  707. $ret=preg_replace('/^'.$regExp.'$/i', ' {type:\''.$type.'\',value:\''.$value.'\'} ', $ret );
  708. reSpace($ret);
  709. $ret=preg_replace('/^('.$tappo.')?'.$regExp.'('.$tappo.')/i', '$1 {type:\''.$type.'\',value:\''.$valueTappo.'\'} $'.(count($m[0])+2), $ret);
  710. reSpace($ret);
  711. $ret=preg_replace('/('.$tappo.')'.$regExp.'('.$tappo.')?$/i', '$1 {type:\''.$type.'\',value:\''.$valueTappo.'\'} $'.(count($m[0])+2), $ret );
  712. reSpace($ret);
  713. while (preg_match('/('.$tappo.')'.$regExp.'('.$tappo.')/i', $ret)){
  714. $ret=preg_replace('/('.$tappo.')'.$regExp.'('.$tappo.')/i', '$1 {type:\''.$type.'\',value:\''.$valueTappo.'\'} $'.(count($m[0])+2), $ret );
  715. reSpace($ret);
  716. }
  717. }else{
  718. $ret=preg_replace('/'.$regExp.'/i', ' {type:\''.$type.'\',value:\''.$value.'\'} ', $ret );
  719. }
  720. $ret = preg_replace('/\}\{/', '} {', $ret);
  721. }
  722. //return $ret;
  723. }
  724. function reSpace(&$text){
  725. while (preg_match('/\s\s/', $text)){
  726. $text = str_replace(' ', ' ', $text);
  727. }
  728. }
  729. function reposRegExpValues_Callback($m){
  730. $v=str_replace("$", '', $m[0]);
  731. $ret = '$'.($v+1);
  732. return $ret;
  733. }
  734. ?>