package org.tamina.html; import org.tamina.i18n.LocalizationManager; import js.RegExp; import org.tamina.utils.HTMLUtils; import haxe.rtti.Meta; import js.Browser; import js.html.Element; @:autoBuild(org.tamina.html.HTMLComponentFactory.build()) class HTMLComponent { public inline static var CONTENT_TAG:String = 'content'; public var parent:Element; public var element:Element; public var visible(get, set):Bool; private var _visible:Bool = true; private var _tempElement:Element; private var _useExternalContent:Bool=false; private var _defaultDisplayStyle:String=""; public function new(?parent:Element):Void { if (parent != null) { this.parent = parent; parseContent(); initContent(); displayContent(); } } public function get_visible():Bool { return _visible; } public function set_visible(value:Bool):Bool { _visible = value; if(_defaultDisplayStyle == "" || _defaultDisplayStyle == "none"){ _defaultDisplayStyle = parent.style.display; if(_defaultDisplayStyle == "" || _defaultDisplayStyle == "none"){ _defaultDisplayStyle = "block"; } } if (_visible) { parent.style.display = _defaultDisplayStyle; } else { parent.style.display = 'none'; } return _visible; } public function addToElement(parent:Element):Void{ this.parent = parent; parseContent(false); initContent(); displayContent(); } private function parseContent(useExternalContent:Bool=true):Void { if (parent.childElementCount == 0 || !useExternalContent) { _tempElement = Browser.document.createDivElement(); _tempElement.innerHTML = getContent(); } else { _useExternalContent=true; _tempElement = parent; } translateContent(_tempElement); initSkinParts(_tempElement); } private function initSkinParts(target:Element):Void { var meta = Meta.getFields(Type.getClass(this)); var metaFields = Reflect.fields(meta); var classFields = Reflect.fields(this); for (i in 0...metaFields.length) { var field = Reflect.field(meta, metaFields[i]); if (field.skinpart != null) { var element = HTMLUtils.getElementByAttribute(target, 'data-id', metaFields[i]); Reflect.setField(this, metaFields[i], element); } } } private function translateContent(target:Element):Void { var html = target.innerHTML; var stringToTranslate = new RegExp('\\{\\{(?!\\}\\})(.+)\\}\\}', 'gim'); var results:Array> = new Array>(); var result:Array = new Array(); var i = 0; while ((result = stringToTranslate.exec(html)) != null) { results[i] = result; i++; } result = new Array(); for (result in results) { var totalString = result[0]; var key = StringTools.trim(result[1]); html = StringTools.replace(html, totalString, LocalizationManager.instance.getString(key)); } target.innerHTML = html; } private function initContent():Void { } private function displayContent():Void { element = _tempElement; var numChildren = _tempElement.children.length; if (numChildren == 1) { element = _tempElement.firstElementChild; } else { element = parent; } if(!_useExternalContent){ while (numChildren > 0) { numChildren--; var item:Element = cast _tempElement.children.item(0); parent.appendChild(item); } } } private function getContent():String { return untyped this.view; } }