Huge FML Update
This commit is contained in:
23
application/core/FML/Script/Builder.php
Normal file
23
application/core/FML/Script/Builder.php
Normal file
@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script;
|
||||
|
||||
/**
|
||||
* Builder Class offering Methods to build ManiaScript
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
abstract class Builder {
|
||||
|
||||
/**
|
||||
* Build a Label Implementation Block
|
||||
*
|
||||
* @param string $labelName
|
||||
* @param string $implementationCode
|
||||
* @return string
|
||||
*/
|
||||
public static function getLabelImplementationBlock($labelName, $implementationCode) {
|
||||
$labelText = PHP_EOL . "***{$labelName}***" . PHP_EOL . "***{$implementationCode}***" . PHP_EOL;
|
||||
return $labelText;
|
||||
}
|
||||
}
|
@ -1,100 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script;
|
||||
|
||||
use FML\Controls\Control;
|
||||
use FML\Script\Sections\Constants;
|
||||
use FML\Script\Sections\Labels;
|
||||
use FML\Types\Scriptable;
|
||||
|
||||
/**
|
||||
* ScriptFeature class offering menu behaviors
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
class Menus implements Constants, Labels, ScriptFeature {
|
||||
/**
|
||||
* Constants
|
||||
*/
|
||||
const C_MENUIDS = 'C_FML_MenuIds';
|
||||
|
||||
/**
|
||||
* Protected properties
|
||||
*/
|
||||
protected $menus = array();
|
||||
|
||||
/**
|
||||
* Add menu behavior defined by the given relationships
|
||||
*
|
||||
* @param array $menuRelationships
|
||||
* @return \FML\Script\Menus
|
||||
*/
|
||||
public function add(array $menuRelationships) {
|
||||
$menus = array();
|
||||
$subMenus = array();
|
||||
foreach ($menuRelationships as $relationship) {
|
||||
$menuItemControl = $relationship[0];
|
||||
$subMenuControl = $relationship[1];
|
||||
|
||||
if (!($menuItemControl instanceof Scriptable)) {
|
||||
trigger_error('No Scriptable instance given as menu item.', E_USER_ERROR);
|
||||
}
|
||||
if (!($subMenuControl instanceof Control)) {
|
||||
trigger_error('No Control instance given as sub menu.', E_USER_ERROR);
|
||||
}
|
||||
|
||||
$menuItemControl->assignId();
|
||||
$menuItemControl->setScriptEvents(true);
|
||||
$subMenuControl->assignId();
|
||||
|
||||
array_push($menus, array($menuItemControl->getId(), $subMenuControl->getId()));
|
||||
array_push($subMenus, $subMenuControl->getId());
|
||||
}
|
||||
array_push($this->menus, array($menus, $subMenus));
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see \FML\Script\Sections\Constants::getConstants()
|
||||
*/
|
||||
public function getConstants() {
|
||||
$constant = '[';
|
||||
$index = 0;
|
||||
foreach ($this->menus as $menu) {
|
||||
$constant .= '[';
|
||||
foreach ($menu[0] as $menuRel) {
|
||||
$constant .= '"' . $menuRel[0] . '" => ["' . $menuRel[1] . '"], ';
|
||||
}
|
||||
$constant .= '"__FML__Sub__Menus__" => [';
|
||||
$subIndex = 0;
|
||||
foreach ($menu[1] as $subMenu) {
|
||||
$constant .= '"' . $subMenu . '"';
|
||||
if ($subIndex < count($menu[1]) - 1) {
|
||||
$constant .= ', ';
|
||||
}
|
||||
$subIndex++;
|
||||
}
|
||||
$constant .= ']]';
|
||||
if ($index < count($this->menus) - 1) {
|
||||
$constant .= ', ';
|
||||
}
|
||||
$index++;
|
||||
}
|
||||
$constant .= ']';
|
||||
$constants = array();
|
||||
$constants[self::C_MENUIDS] = $constant;
|
||||
return $constants;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see \FML\Script\Sections\Labels::getLabels()
|
||||
*/
|
||||
public function getLabels() {
|
||||
$labels = array();
|
||||
$labelMouseClick = file_get_contents(__DIR__ . '/Templates/MenuMouseClick.txt');
|
||||
$labels[Labels::MOUSECLICK] = $labelMouseClick;
|
||||
return $labels;
|
||||
}
|
||||
}
|
@ -1,147 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script;
|
||||
|
||||
use FML\Controls\Control;
|
||||
use FML\Script\Sections\Constants;
|
||||
use FML\Script\Sections\Globals;
|
||||
use FML\Script\Sections\Includes;
|
||||
use FML\Script\Sections\Labels;
|
||||
use FML\Types\Scriptable;
|
||||
use FML\Controls\Label;
|
||||
|
||||
/**
|
||||
* ScriptFeature class offering paging
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
class Pages implements Constants, Globals, Includes, Labels, ScriptFeature {
|
||||
/**
|
||||
* Constants
|
||||
*/
|
||||
const C_PAGEIDS = 'C_FML_PageIds';
|
||||
|
||||
/**
|
||||
* Protected properties
|
||||
*/
|
||||
protected $pages = array();
|
||||
|
||||
/**
|
||||
* Add paging behavior
|
||||
*
|
||||
* @param array $pageButtons
|
||||
* @param array $pages
|
||||
* @param Label $counterLabel
|
||||
* @return \FML\Script\Pages
|
||||
*/
|
||||
public function add(array $pageButtons, array $pages, Label $counterLabel = null) {
|
||||
$actionIds = array();
|
||||
foreach ($pageButtons as $action => $pageButton) {
|
||||
if (!($pageButton instanceof Control)) {
|
||||
trigger_error('No Control instance given.', E_USER_ERROR);
|
||||
}
|
||||
$pageButton->assignId();
|
||||
if (!($pageButton instanceof Scriptable)) {
|
||||
trigger_error('No Scriptable instance given.', E_USER_ERROR);
|
||||
}
|
||||
$pageButton->setScriptEvents(true);
|
||||
|
||||
$actionIds[$pageButton->getId()] = $action;
|
||||
}
|
||||
|
||||
$pageIds = array();
|
||||
foreach ($pages as $page) {
|
||||
if (!($page instanceof Control)) {
|
||||
trigger_error('No Control instance given.', E_USER_ERROR);
|
||||
}
|
||||
$page->assignId();
|
||||
if (!empty($pageIds)) {
|
||||
$page->setVisible(false);
|
||||
}
|
||||
array_push($pageIds, $page->getId());
|
||||
}
|
||||
|
||||
if ($counterLabel) {
|
||||
$counterLabel->assignId();
|
||||
$counterId = $counterLabel->getId();
|
||||
}
|
||||
else {
|
||||
$counterId = uniqid();
|
||||
}
|
||||
|
||||
array_push($this->pages, array($actionIds, $pageIds, $counterId));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see \FML\Script\Sections\Includes::getIncludes()
|
||||
*/
|
||||
public function getIncludes() {
|
||||
$includes = array();
|
||||
$includes["TextLib"] = "TextLib";
|
||||
return $includes;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see \FML\Script\Sections\Constants::getConstants()
|
||||
*/
|
||||
public function getConstants() {
|
||||
$constant = '[';
|
||||
$index = 0;
|
||||
foreach ($this->pages as $page) {
|
||||
$constant .= '[';
|
||||
$actionIds = $page[0];
|
||||
foreach ($actionIds as $actionId => $action) {
|
||||
$constant .= '"' . $actionId . '" => ["' . $action . '"], ';
|
||||
}
|
||||
$constant .= '"__FML__Pages__Id__" => ["' . $page[2] . '"], ';
|
||||
$constant .= '"__FML__Pages__Ids__" => [';
|
||||
if (count($page[1]) <= 0) {
|
||||
$constant .= '""';
|
||||
}
|
||||
else {
|
||||
$subIndex = 0;
|
||||
foreach ($page[1] as $pageId) {
|
||||
$constant .= '"' . $pageId . '"';
|
||||
if ($subIndex < count($page[1]) - 1) {
|
||||
$constant .= ', ';
|
||||
}
|
||||
$subIndex++;
|
||||
}
|
||||
}
|
||||
$constant .= ']]';
|
||||
if ($index < count($this->pages) - 1) {
|
||||
$constant .= ', ';
|
||||
}
|
||||
$index++;
|
||||
}
|
||||
$constant .= ']';
|
||||
$constants = array();
|
||||
$constants[self::C_PAGEIDS] = $constant;
|
||||
return $constants;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see \FML\Script\Sections\Globals::getGlobals()
|
||||
*/
|
||||
public function getGlobals() {
|
||||
$globals = array();
|
||||
$globals['G_FML_PageIndexes'] = 'Integer[Text]';
|
||||
return $globals;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see \FML\Script\Sections\Labels::getLabels()
|
||||
*/
|
||||
public function getLabels() {
|
||||
$labels = array();
|
||||
$labelOnInit = file_get_contents(__DIR__ . '/Templates/PageOnInit.txt');
|
||||
$labels[Labels::ONINIT] = $labelOnInit;
|
||||
$labelMouseClick = file_get_contents(__DIR__ . '/Templates/PageMouseClick.txt');
|
||||
$labels[Labels::MOUSECLICK] = $labelMouseClick;
|
||||
return $labels;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
/*********************************
|
||||
* FancyManiaLinks by steeffeen *
|
||||
* http://fml.steeffeen.com *
|
||||
*********************************/
|
||||
*********************************/
|
@ -1,7 +1,8 @@
|
||||
Void Dummy() {}
|
||||
|
||||
main() {
|
||||
declare FML_ScriptStart = Now;
|
||||
+++OnInit+++
|
||||
declare FML_LoopCounter = 0;
|
||||
while (True) {
|
||||
yield;
|
||||
foreach (Event in PendingEvents) {
|
||||
@ -24,5 +25,6 @@ main() {
|
||||
}
|
||||
}
|
||||
+++Loop+++
|
||||
FML_LoopCounter += 1;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,216 +1,445 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script;
|
||||
|
||||
use FML\Script\Sections\Constants;
|
||||
use FML\Script\Sections\Functions;
|
||||
use FML\Script\Sections\Globals;
|
||||
use FML\Script\Sections\Includes;
|
||||
use FML\Script\Sections\Labels;
|
||||
|
||||
/**
|
||||
* Class representing the Manialink Script
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
class Script {
|
||||
/**
|
||||
* Protected properties
|
||||
*/
|
||||
protected $features = array();
|
||||
|
||||
/**
|
||||
* Add a script feature
|
||||
*
|
||||
* @param ScriptFeature $scriptFeature
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addFeature(ScriptFeature $scriptFeature) {
|
||||
array_push($this->features, $scriptFeature);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all script features
|
||||
*
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function removeFeatures() {
|
||||
$this->features = array();
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the script xml tag
|
||||
*
|
||||
* @param \DOMDocument $domDocument
|
||||
* @return \DOMElement
|
||||
*/
|
||||
public function render(\DOMDocument $domDocument) {
|
||||
$scriptXml = $domDocument->createElement('script');
|
||||
$scriptText = $this->buildScriptText();
|
||||
$scriptComment = $domDocument->createComment($scriptText);
|
||||
$scriptXml->appendChild($scriptComment);
|
||||
return $scriptXml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the complete script text based on all script items
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function buildScriptText() {
|
||||
$scriptText = "";
|
||||
$scriptText = $this->addHeaderPart($scriptText);
|
||||
$scriptText = $this->addIncludesPart($scriptText);
|
||||
$scriptText = $this->addConstantsPart($scriptText);
|
||||
$scriptText = $this->addGlobalsPart($scriptText);
|
||||
$scriptText = $this->addLabelsPart($scriptText);
|
||||
$scriptText = $this->addFunctionsPart($scriptText);
|
||||
$scriptText = $this->addMainPart($scriptText);
|
||||
return $scriptText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the header comment to the script
|
||||
*
|
||||
* @param string $scriptText
|
||||
* @return string
|
||||
*/
|
||||
private function addHeaderPart($scriptText) {
|
||||
$headerPart = file_get_contents(__DIR__ . '/Templates/Header.txt');
|
||||
return $scriptText . $headerPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the includes to the script
|
||||
*
|
||||
* @param string $scriptText
|
||||
* @return string
|
||||
*/
|
||||
private function addIncludesPart($scriptText) {
|
||||
$includes = array();
|
||||
foreach ($this->features as $feature) {
|
||||
if (!($feature instanceof Includes)) {
|
||||
continue;
|
||||
}
|
||||
$featureIncludes = $feature->getIncludes();
|
||||
foreach ($featureIncludes as $namespace => $fileName) {
|
||||
$includes[$namespace] = $fileName;
|
||||
}
|
||||
}
|
||||
$includesPart = PHP_EOL;
|
||||
foreach ($includes as $namespace => $fileName) {
|
||||
$includesPart .= "#Include \"{$fileName}\" as {$namespace}" . PHP_EOL;
|
||||
}
|
||||
return $scriptText . $includesPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the declared constants to the script
|
||||
*
|
||||
* @param string $scriptText
|
||||
* @return string
|
||||
*/
|
||||
private function addConstantsPart($scriptText) {
|
||||
$constants = array();
|
||||
foreach ($this->features as $feature) {
|
||||
if (!($feature instanceof Constants)) {
|
||||
continue;
|
||||
}
|
||||
$featureConstants = $feature->getConstants();
|
||||
foreach ($featureConstants as $name => $value) {
|
||||
$constants[$name] = $value;
|
||||
}
|
||||
}
|
||||
$constantsPart = PHP_EOL;
|
||||
foreach ($constants as $name => $value) {
|
||||
$constantsPart .= "#Const {$name} {$value}" . PHP_EOL;
|
||||
}
|
||||
return $scriptText . $constantsPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the declared global variables to the script
|
||||
*
|
||||
* @param string $scriptText
|
||||
* @return string
|
||||
*/
|
||||
private function addGlobalsPart($scriptText) {
|
||||
$globals = array();
|
||||
foreach ($this->features as $feature) {
|
||||
if (!($feature instanceof Globals)) {
|
||||
continue;
|
||||
}
|
||||
$featureGlobals = $feature->getGlobals();
|
||||
foreach ($featureGlobals as $name => $type) {
|
||||
$globals[$name] = $type;
|
||||
}
|
||||
}
|
||||
$globalsPart = PHP_EOL;
|
||||
foreach ($globals as $name => $type) {
|
||||
$globalsPart .= "declare {$type} {$name};" . PHP_EOL;
|
||||
}
|
||||
return $scriptText . $globalsPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the implemented labels to the script
|
||||
*
|
||||
* @param string $scriptText
|
||||
* @return string
|
||||
*/
|
||||
private function addLabelsPart($scriptText) {
|
||||
$labels = array();
|
||||
foreach ($this->features as $feature) {
|
||||
if (!($feature instanceof Labels)) {
|
||||
continue;
|
||||
}
|
||||
$featureLabels = $feature->getLabels();
|
||||
foreach ($featureLabels as $name => $implementation) {
|
||||
$label = array($name, $implementation);
|
||||
array_push($labels, $label);
|
||||
}
|
||||
}
|
||||
$labelsPart = PHP_EOL;
|
||||
foreach ($labels as $label) {
|
||||
$labelsPart .= '***' . $label[0] . '***' . PHP_EOL . '***' . PHP_EOL . $label[1] . PHP_EOL . '***' . PHP_EOL;
|
||||
}
|
||||
return $scriptText . $labelsPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the declared functions to the script
|
||||
*
|
||||
* @param string $scriptText
|
||||
* @return string
|
||||
*/
|
||||
private function addFunctionsPart($scriptText) {
|
||||
$functions = array();
|
||||
foreach ($this->features as $feature) {
|
||||
if (!($feature instanceof Functions)) {
|
||||
continue;
|
||||
}
|
||||
$featureFunctions = $feature->getFunctions();
|
||||
foreach ($featureFunctions as $signature => $implementation) {
|
||||
$functions[$signature] = $implementation;
|
||||
}
|
||||
}
|
||||
$functionsPart = PHP_EOL;
|
||||
foreach ($functions as $signature => $implementation) {
|
||||
$functionsPart .= $signature . '{' . PHP_EOL . $implementation . PHP_EOL . '}' . PHP_EOL;
|
||||
}
|
||||
return $scriptText . $functionsPart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the main function to the script
|
||||
*
|
||||
* @param string $scriptText
|
||||
* @return string
|
||||
*/
|
||||
private function addMainPart($scriptText) {
|
||||
$mainPart = file_get_contents(__DIR__ . '/Templates/Main.txt');
|
||||
return $scriptText . $mainPart;
|
||||
}
|
||||
<?php
|
||||
|
||||
namespace FML\Script;
|
||||
|
||||
use FML\Controls\Control;
|
||||
use FML\Types\Scriptable;
|
||||
use FML\Controls\Label;
|
||||
|
||||
/**
|
||||
* Class representing the ManiaLink Script
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
class Script {
|
||||
/**
|
||||
* Constants
|
||||
*/
|
||||
const CLASS_TOOLTIPS = "FML_Tooltips";
|
||||
const CLASS_MENU = "FML_Menu";
|
||||
const CLASS_MENUBUTTON = "FML_MenuButton";
|
||||
const CLASS_PAGE = "FML_Page";
|
||||
const CLASS_PAGER = "FML_Pager";
|
||||
const CLASS_PAGELABEL = "FML_PageLabel";
|
||||
const CLASS_PROFILE = "FML_Profile";
|
||||
const CLASS_MAPINFO = "FML_MapInfo";
|
||||
const LABEL_ONINIT = "OnInit";
|
||||
const LABEL_LOOP = "Loop";
|
||||
const LABEL_ENTRYSUBMIT = "EntrySubmit";
|
||||
const LABEL_KEYPRESS = "KeyPress";
|
||||
const LABEL_MOUSECLICK = "MouseClick";
|
||||
const LABEL_MOUSEOUT = "MouseOut";
|
||||
const LABEL_MOUSEOVER = "MouseOver";
|
||||
|
||||
/**
|
||||
* Protected Properties
|
||||
*/
|
||||
protected $tagName = 'script';
|
||||
protected $includes = array();
|
||||
protected $tooltips = false;
|
||||
protected $menus = false;
|
||||
protected $pages = false;
|
||||
protected $profile = false;
|
||||
protected $mapInfo = false;
|
||||
|
||||
/**
|
||||
* Add an Include to the Script
|
||||
*
|
||||
* @param string $namespace
|
||||
* @param string $file
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addInclude($namespace, $file) {
|
||||
$this->includes[$namespace] = $file;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Tooltip Behavior
|
||||
*
|
||||
* @param Control $hoverControl
|
||||
* @param Control $tooltipControl
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addTooltip(Control $hoverControl, Control $tooltipControl) {
|
||||
if (!($hoverControl instanceof Scriptable)) {
|
||||
trigger_error('Scriptable Control needed as HoverControl for Tooltips!');
|
||||
return $this;
|
||||
}
|
||||
$tooltipControl->checkId();
|
||||
$tooltipControl->setVisible(false);
|
||||
$hoverControl->setScriptEvents(true);
|
||||
$hoverControl->addClass(self::CLASS_TOOLTIPS);
|
||||
$hoverControl->addClass($tooltipControl->getId());
|
||||
$this->tooltips = true;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Menu Behavior
|
||||
*
|
||||
* @param Control $clickControl
|
||||
* @param Control $menuControl
|
||||
* @param string $menuId
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addMenu(Control $clickControl, Control $menuControl, $menuId = null) {
|
||||
if (!($clickControl instanceof Scriptable)) {
|
||||
trigger_error('Scriptable Control needed as ClickControl for Menus!');
|
||||
return $this;
|
||||
}
|
||||
if (!$menuId) $menuId = '_';
|
||||
$menuControl->checkId();
|
||||
$menuControl->addClass(self::CLASS_MENU);
|
||||
$menuControl->addClass($menuId);
|
||||
$clickControl->setScriptEvents(true);
|
||||
$clickControl->addClass(self::CLASS_MENUBUTTON);
|
||||
$clickControl->addClass($menuId . '-' . $menuControl->getId());
|
||||
$this->addInclude('TextLib', 'TextLib');
|
||||
$this->menus = true;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Page for a Paging Behavior
|
||||
*
|
||||
* @param Control $pageControl
|
||||
* @param int $pageNumber
|
||||
* @param string $pagesId
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addPage(Control $pageControl, $pageNumber, $pagesId = null) {
|
||||
$pageNumber = (int) $pageNumber;
|
||||
if (!$pagesId) $pagesId = '_';
|
||||
$pageControl->addClass(self::CLASS_PAGE);
|
||||
$pageControl->addClass($pagesId);
|
||||
$pageControl->addClass(self::CLASS_PAGE . '-P' . $pageNumber);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Pager Button for a Paging Behavior
|
||||
*
|
||||
* @param Control $pagerControl
|
||||
* @param int $pagingAction
|
||||
* @param string $pagesId
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addPager(Control $pagerControl, $pagingAction, $pagesId = null) {
|
||||
if (!($pagerControl instanceof Scriptable)) {
|
||||
trigger_error('Scriptable Control needed as PagerControl for Pages!');
|
||||
return $this;
|
||||
}
|
||||
$pagingAction = (int) $pagingAction;
|
||||
if (!$pagesId) $pagesId = '_';
|
||||
$pagerControl->setScriptEvents(true);
|
||||
$pagerControl->addClass(self::CLASS_PAGER);
|
||||
$pagerControl->addClass(self::CLASS_PAGER . '-I' . $pagesId);
|
||||
$pagerControl->addClass(self::CLASS_PAGER . '-A' . $pagingAction);
|
||||
$this->addInclude('TextLib', 'TextLib');
|
||||
$this->pages = true;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Label that shows the current Page Number
|
||||
*
|
||||
* @param Label $pageLabel
|
||||
* @param string $pagesId
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addPageLabel(Label $pageLabel, $pagesId = null) {
|
||||
if (!$pagesId) $pagesId = '_';
|
||||
$pageLabel->addClass(self::CLASS_PAGELABEL);
|
||||
$pageLabel->addClass($pagesId);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Button Behavior that will open the Built-In Player Profile
|
||||
*
|
||||
* @param Control $profileControl
|
||||
* @param string $playerLogin
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addProfileButton(Control $profileControl, $playerLogin) {
|
||||
if (!($profileControl instanceof Scriptable)) {
|
||||
trigger_error('Scriptable Control needed as ClickControl for Profiles!');
|
||||
return $this;
|
||||
}
|
||||
$profileControl->setScriptEvents(true);
|
||||
$profileControl->addClass(self::CLASS_PROFILE);
|
||||
if ($playerLogin) {
|
||||
$profilControl->addClass(self::CLASS_PROFILE . '-' . $playerLogin);
|
||||
}
|
||||
$this->profile = true;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Button Behavior that will open the Built-In Map Info
|
||||
*
|
||||
* @param Control $mapInfoControl
|
||||
* @return \FML\Script\Script
|
||||
*/
|
||||
public function addMapInfoButton(Control $mapInfoControl) {
|
||||
if (!($mapInfoControl instanceof Scriptable)) {
|
||||
trigger_error('Scriptable Control needed as ClickControl for Map Info!');
|
||||
return $this;
|
||||
}
|
||||
$mapInfoControl->setScriptEvents(true);
|
||||
$mapInfoControl->addClass(self::CLASS_MAPINFO);
|
||||
$this->mapInfo = true;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the Script XML Tag
|
||||
*
|
||||
* @param \DOMDocument $domDocument
|
||||
* @return \DOMElement
|
||||
*/
|
||||
public function render(\DOMDocument $domDocument) {
|
||||
$scriptXml = $domDocument->createElement($this->tagName);
|
||||
$scriptText = $this->buildScriptText();
|
||||
$scriptComment = $domDocument->createComment($scriptText);
|
||||
$scriptXml->appendChild($scriptComment);
|
||||
return $scriptXml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the complete Script Text
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function buildScriptText() {
|
||||
$scriptText = "";
|
||||
$scriptText .= $this->getHeaderComment();
|
||||
$scriptText .= $this->getIncludes();
|
||||
if ($this->tooltips) {
|
||||
$scriptText .= $this->getTooltipLabels();
|
||||
}
|
||||
if ($this->menus) {
|
||||
$scriptText .= $this->getMenuLabels();
|
||||
}
|
||||
if ($this->pages) {
|
||||
$scriptText .= $this->getPagesLabels();
|
||||
}
|
||||
if ($this->profile) {
|
||||
$scriptText .= $this->getProfileLabels();
|
||||
}
|
||||
if ($this->mapInfo) {
|
||||
$scriptText .= $this->getMapInfoLabels();
|
||||
}
|
||||
$scriptText .= $this->getMainFunction();
|
||||
return $scriptText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Header Comment
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getHeaderComment() {
|
||||
$headerComment = file_get_contents(__DIR__ . '/Parts/Header.txt');
|
||||
return $headerComment;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Includes
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getIncludes() {
|
||||
$includesText = PHP_EOL;
|
||||
foreach ($this->includes as $namespace => $file) {
|
||||
$includesText .= "#Include \"{$file}\" as {$namespace}" . PHP_EOL;
|
||||
}
|
||||
return $includesText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Tooltip Labels
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getTooltipLabels() {
|
||||
$mouseOverScript = "
|
||||
if (Event.Control.HasClass(\"" . self::CLASS_TOOLTIPS . "\")) {
|
||||
foreach (ControlClass in Event.Control.ControlClasses) {
|
||||
declare TooltipControl <=> Page.GetFirstChild(ControlClass);
|
||||
if (TooltipControl == Null) continue;
|
||||
TooltipControl.Show();
|
||||
}
|
||||
}";
|
||||
$mouseOutScript = "
|
||||
if (Event.Control.HasClass(\"" . self::CLASS_TOOLTIPS . "\")) {
|
||||
foreach (ControlClass in Event.Control.ControlClasses) {
|
||||
declare TooltipControl <=> Page.GetFirstChild(ControlClass);
|
||||
if (TooltipControl == Null) continue;
|
||||
TooltipControl.Hide();
|
||||
}
|
||||
}";
|
||||
$tooltipsLabels = Builder::getLabelImplementationBlock(self::LABEL_MOUSEOVER, $mouseOverScript);
|
||||
$tooltipsLabels .= Builder::getLabelImplementationBlock(self::LABEL_MOUSEOUT, $mouseOutScript);
|
||||
return $tooltipsLabels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Menu Labels
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getMenuLabels() {
|
||||
$mouseClickScript = "
|
||||
if (Event.Control.HasClass(\"" . self::CLASS_MENUBUTTON . "\")) {
|
||||
declare Text MenuIdClass;
|
||||
declare Text MenuControlId;
|
||||
foreach (ControlClass in Event.Control.ControlClasses) {
|
||||
declare ClassParts = TextLib::Split(\"-\", ControlClass);
|
||||
if (ClassParts.count <= 1) continue;
|
||||
MenuIdClass = ClassParts[0];
|
||||
MenuControlId = ClassParts[1];
|
||||
break;
|
||||
}
|
||||
Page.GetClassChildren(MenuIdClass, Page.MainFrame, True);
|
||||
foreach (MenuControl in Page.GetClassChildren_Result) {
|
||||
if (!MenuControl.HasClass(\"" . self::CLASS_MENU . "\")) continue;
|
||||
if (MenuControlId != MenuControl.Id) {
|
||||
MenuControl.Hide();
|
||||
} else {
|
||||
MenuControl.Show();
|
||||
}
|
||||
}
|
||||
}";
|
||||
$menuLabels = Builder::getLabelImplementationBlock(self::LABEL_MOUSECLICK, $mouseClickScript);
|
||||
return $menuLabels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Pages Labels
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getPagesLabels() {
|
||||
$pagesNumberPrefix = self::CLASS_PAGE . '-P';
|
||||
$pagesNumberPrefixLength = strlen($pagesNumberPrefix);
|
||||
$pagesScript = "
|
||||
if (Event.Control.HasClass(\"" . self::CLASS_PAGER . "\")) {
|
||||
declare Text PagesId;
|
||||
declare Integer PagingAction;
|
||||
foreach (ControlClass in Event.Control.ControlClasses) {
|
||||
declare ClassParts = TextLib::Split(\"-\", ControlClass);
|
||||
if (ClassParts.count <= 1) continue;
|
||||
if (ClassParts[0] != \"" . self::CLASS_PAGER . "\") continue;
|
||||
switch (TextLib::SubText(ClassParts[1], 0, 1)) {
|
||||
case \"I\": {
|
||||
PagesId = TextLib::SubText(ClassParts[1], 1, 99);
|
||||
}
|
||||
case \"A\": {
|
||||
PagingAction = TextLib::ToInteger(TextLib::SubText(ClassParts[1], 1, 99));
|
||||
}
|
||||
}
|
||||
}
|
||||
declare FML_PagesLastScriptStart for This = FML_ScriptStart;
|
||||
declare FML_MinPageNumber for This = Integer[Text];
|
||||
declare FML_MaxPageNumber for This = Integer[Text];
|
||||
declare FML_PageNumber for This = Integer[Text];
|
||||
if (FML_PagesLastScriptStart != FML_ScriptStart || !FML_PageNumber.existskey(PagesId) || !FML_MinPageNumber.existskey(PagesId) || !FML_MaxPageNumber.existskey(PagesId)) {
|
||||
Page.GetClassChildren(PagesId, Page.MainFrame, True);
|
||||
foreach (PageControl in Page.GetClassChildren_Result) {
|
||||
if (!PageControl.HasClass(\"" . self::CLASS_PAGE . "\")) continue;
|
||||
foreach (ControlClass in PageControl.ControlClasses) {
|
||||
if (TextLib::SubText(ControlClass, 0, {$pagesNumberPrefixLength}) != \"{$pagesNumberPrefix}\") continue;
|
||||
declare PageNumber = TextLib::ToInteger(TextLib::SubText(ControlClass, {$pagesNumberPrefixLength}, 99));
|
||||
if (!FML_MinPageNumber.existskey(PagesId) || PageNumber < FML_MinPageNumber[PagesId]) {
|
||||
FML_MinPageNumber[PagesId] = PageNumber;
|
||||
}
|
||||
if (!FML_MaxPageNumber.existskey(PagesId) || PageNumber > FML_MaxPageNumber[PagesId]) {
|
||||
FML_MaxPageNumber[PagesId] = PageNumber;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
FML_PageNumber[PagesId] = FML_MinPageNumber[PagesId];
|
||||
}
|
||||
FML_PageNumber[PagesId] += PagingAction;
|
||||
if (FML_PageNumber[PagesId] < FML_MinPageNumber[PagesId]) {
|
||||
FML_PageNumber[PagesId] = FML_MinPageNumber[PagesId];
|
||||
}
|
||||
if (FML_PageNumber[PagesId] > FML_MaxPageNumber[PagesId]) {
|
||||
FML_PageNumber[PagesId] = FML_MaxPageNumber[PagesId];
|
||||
}
|
||||
FML_PagesLastScriptStart = FML_ScriptStart;
|
||||
Page.GetClassChildren(PagesId, Page.MainFrame, True);
|
||||
foreach (PageControl in Page.GetClassChildren_Result) {
|
||||
if (!PageControl.HasClass(\"" . self::CLASS_PAGE . "\")) continue;
|
||||
declare PageNumber = -1;
|
||||
foreach (ControlClass in PageControl.ControlClasses) {
|
||||
if (TextLib::SubText(ControlClass, 0, {$pagesNumberPrefixLength}) != \"{$pagesNumberPrefix}\") continue;
|
||||
PageNumber = TextLib::ToInteger(TextLib::SubText(ControlClass, {$pagesNumberPrefixLength}, 99));
|
||||
break;
|
||||
}
|
||||
if (PageNumber != FML_PageNumber[PagesId]) {
|
||||
PageControl.Hide();
|
||||
} else {
|
||||
PageControl.Show();
|
||||
}
|
||||
}
|
||||
Page.GetClassChildren(\"".self::CLASS_PAGELABEL."\", Page.MainFrame, True);
|
||||
foreach (PageControl in Page.GetClassChildren_Result) {
|
||||
if (!PageControl.HasClass(PagesId)) continue;
|
||||
declare PageLabel <=> (PageControl as CMlLabel);
|
||||
PageLabel.Value = (FML_PageNumber[PagesId]+1)^\"/\"^(FML_MaxPageNumber[PagesId]+1);
|
||||
}
|
||||
}";
|
||||
$pagesLabels = Builder::getLabelImplementationBlock(self::LABEL_MOUSECLICK, $pagesScript);
|
||||
return $pagesLabels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Profile Labels
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getProfileLabels() {
|
||||
$profileScript = "
|
||||
if (Event.Control.HasClass(\"" . self::CLASS_PROFILE . "\") {
|
||||
declare Login = LocalUser.Login;
|
||||
foreach (ControlClass in Event.Control.ControlClasses) {
|
||||
declare ClassParts = TextLib::Split(\"-\", ControlClass);
|
||||
if (ClassParts.count <= 1) continue;
|
||||
if (ClassParts[0] != \"" . self::CLASS_PROFILE . "\") continue;
|
||||
Login = ClassParts[1];
|
||||
break;
|
||||
}
|
||||
ShowProfile(Login);
|
||||
}";
|
||||
$profileLabels = Builder::getLabelImplementationBlock(self::LABEL_MOUSECLICK, $profileScript);
|
||||
return $profileLabels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Map Info Labels
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getMapInfoLabels() {
|
||||
$mapInfoScript = "
|
||||
if (Event.Control.HasClass(\"" . self::CLASS_MAPINFO . "\") {
|
||||
ShowCurChallengeCard();
|
||||
}";
|
||||
$mapInfoLabels = Builder::getLabelImplementationBlock(self::LABEL_MOUSECLICK, $mapInfoScript);
|
||||
return $mapInfoLabels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Main Function
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getMainFunction() {
|
||||
$mainFunction = file_get_contents(__DIR__ . '/Parts/Main.txt');
|
||||
return $mainFunction;
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script;
|
||||
|
||||
/**
|
||||
* Interface representing a script feature
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
interface ScriptFeature {
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script\Sections;
|
||||
|
||||
/**
|
||||
* Script feature using constants
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
interface Constants {
|
||||
|
||||
/**
|
||||
* Return array of constant values with names as keys
|
||||
*/
|
||||
public function getConstants();
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script\Sections;
|
||||
|
||||
/**
|
||||
* Script feature using functions
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
interface Functions {
|
||||
|
||||
/**
|
||||
* Return array of function implementations and signatures as keys
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getFunctions();
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script\Sections;
|
||||
|
||||
/**
|
||||
* Script feature using globals
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
interface Globals {
|
||||
|
||||
/**
|
||||
* Return array with global variable types with variable names as keys
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getGlobals();
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script\Sections;
|
||||
|
||||
/**
|
||||
* Script feature using includes
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
interface Includes {
|
||||
|
||||
/**
|
||||
* Return array of included files with namespaces as keys
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getIncludes();
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script\Sections;
|
||||
|
||||
/**
|
||||
* Script feature using labels
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
interface Labels {
|
||||
/**
|
||||
* Constants
|
||||
*/
|
||||
const ENTRYSUBMIT = 'EntrySubmit';
|
||||
const KEYPRESS = 'KeyPress';
|
||||
const LOOP = 'Loop';
|
||||
const MOUSECLICK = 'MouseClick';
|
||||
const MOUSEOUT = 'MouseOut';
|
||||
const MOUSEOVER = 'MouseOver';
|
||||
const ONINIT = 'OnInit';
|
||||
|
||||
/**
|
||||
* Return array of label implementations with label names as keys
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getLabels();
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
foreach (MenuIds in C_FML_MenuIds) {
|
||||
if (!MenuIds.existskey(Event.ControlId)) continue;
|
||||
|
||||
declare MenuId = MenuIds[Event.ControlId][0];
|
||||
declare SubMenuIds = MenuIds["__FML__Sub__Menus__"];
|
||||
|
||||
foreach (SubMenuId in SubMenuIds) {
|
||||
declare SubMenu <=> Page.GetFirstChild(SubMenuId);
|
||||
if (SubMenu == Null) continue;
|
||||
SubMenu.Visible = (SubMenu.ControlId == MenuId);
|
||||
}
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
foreach (PageIds in C_FML_PageIds) {
|
||||
if (!PageIds.existskey(Event.ControlId)) continue;
|
||||
|
||||
declare Action = TextLib::ToInteger(PageIds[Event.ControlId][0]);
|
||||
declare PagesId = PageIds["__FML__Pages__Id__"][0];
|
||||
declare PagesIds = PageIds["__FML__Pages__Ids__"];
|
||||
|
||||
if (!G_FML_PageIndexes.existskey(PagesId)) {
|
||||
G_FML_PageIndexes[PagesId] = 0;
|
||||
}
|
||||
G_FML_PageIndexes[PagesId] += Action;
|
||||
if (G_FML_PageIndexes[PagesId] < 0) {
|
||||
G_FML_PageIndexes[PagesId] = 0;
|
||||
} else if (G_FML_PageIndexes[PagesId] >= PagesIds.count) {
|
||||
G_FML_PageIndexes[PagesId] = PagesIds.count - 1;
|
||||
}
|
||||
|
||||
foreach (PageIndex => PageId in PagesIds) {
|
||||
declare Control <=> Page.GetFirstChild(PageId);
|
||||
if (Control == Null) continue;
|
||||
Control.Visible = (PageIndex == G_FML_PageIndexes[PagesId]);
|
||||
}
|
||||
|
||||
declare Label_Counter <=> (Page.GetFirstChild(PagesId) as CMlLabel);
|
||||
if (Label_Counter == Null) continue;
|
||||
Label_Counter.Value = (G_FML_PageIndexes[PagesId]+1)^"/"^PagesIds.count;
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
foreach (PageIds in C_FML_PageIds) {
|
||||
declare PagesId = PageIds["__FML__Pages__Id__"][0];
|
||||
declare PagesIds = PageIds["__FML__Pages__Ids__"];
|
||||
|
||||
if (!G_FML_PageIndexes.existskey(PagesId)) {
|
||||
G_FML_PageIndexes[PagesId] = 0;
|
||||
}
|
||||
|
||||
foreach (PageIndex => PageId in PagesIds) {
|
||||
declare Control <=> Page.GetFirstChild(PageId);
|
||||
if (Control == Null) continue;
|
||||
Control.Visible = (PageIndex == G_FML_PageIndexes[PagesId]);
|
||||
}
|
||||
|
||||
declare Label_Counter <=> (Page.GetFirstChild(PagesId) as CMlLabel);
|
||||
if (Label_Counter == Null) continue;
|
||||
Label_Counter.Value = (G_FML_PageIndexes[PagesId]+1)^"/"^PagesIds.count;
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
if (C_FML_TooltipIds.existskey(Event.ControlId)) {
|
||||
declare TooltipControl <=> Page.GetFirstChild(C_FML_TooltipIds[Event.ControlId]);
|
||||
if (TooltipControl != Null) {
|
||||
TooltipControl.Hide();
|
||||
}
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
if (C_FML_TooltipIds.existskey(Event.ControlId)) {
|
||||
declare TooltipControl <=> Page.GetFirstChild(C_FML_TooltipIds[Event.ControlId]);
|
||||
if (TooltipControl != Null) {
|
||||
TooltipControl.Show();
|
||||
}
|
||||
}
|
@ -1,81 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace FML\Script;
|
||||
|
||||
use FML\Controls\Control;
|
||||
use FML\Script\Sections\Constants;
|
||||
use FML\Script\Sections\Labels;
|
||||
use FML\Types\Scriptable;
|
||||
|
||||
/**
|
||||
* ScriptFeature class offering tooltip behaviors
|
||||
*
|
||||
* @author steeffeen
|
||||
*/
|
||||
class Tooltips implements Constants, Labels, ScriptFeature {
|
||||
/**
|
||||
* Constants
|
||||
*/
|
||||
const C_TOOLTIPIDS = 'C_FML_TooltipIds';
|
||||
|
||||
/**
|
||||
* Protected properties
|
||||
*/
|
||||
protected $tooltips = array();
|
||||
|
||||
/**
|
||||
* Add a tooltip behavior showing the tooltipControl while hovering over the hoverControl
|
||||
*
|
||||
* @param Scriptable $hoverControl
|
||||
* @param Control $tooltipControl
|
||||
* @return \FML\Script\Tooltips
|
||||
*/
|
||||
public function add(Scriptable $hoverControl, Control $tooltipControl) {
|
||||
if ($hoverControl instanceof Control) {
|
||||
$hoverControl->assignId();
|
||||
}
|
||||
$hoverControl->setScriptEvents(true);
|
||||
$tooltipControl->assignId();
|
||||
$tooltipControl->setVisible(false);
|
||||
$this->tooltips[$hoverControl->getId()] = $tooltipControl->getId();
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see \FML\Script\Sections\Constants::getConstants()
|
||||
*/
|
||||
public function getConstants() {
|
||||
$constant = '[';
|
||||
if (count($this->tooltips) <= 0) {
|
||||
$constant .= '"" => ""';
|
||||
}
|
||||
else {
|
||||
$index = 0;
|
||||
foreach ($this->tooltips as $hoverId => $tooltipId) {
|
||||
$constant .= '"' . $hoverId . '" => "' . $tooltipId . '"';
|
||||
if ($index < count($this->tooltips) - 1) {
|
||||
$constant .= ',';
|
||||
}
|
||||
$index++;
|
||||
}
|
||||
}
|
||||
$constant .= ']';
|
||||
$constants = array();
|
||||
$constants[self::C_TOOLTIPIDS] = $constant;
|
||||
return $constants;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @see \FML\Script\Sections\Labels::getLabels()
|
||||
*/
|
||||
public function getLabels() {
|
||||
$labels = array();
|
||||
$labelMouseOut = file_get_contents(__DIR__ . '/Templates/TooltipMouseOut.txt');
|
||||
$labels[Labels::MOUSEOUT] = $labelMouseOut;
|
||||
$labelMouseOver = file_get_contents(__DIR__ . '/Templates/TooltipMouseOver.txt');
|
||||
$labels[Labels::MOUSEOVER] = $labelMouseOver;
|
||||
return $labels;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user