Jedną z architektur, którą wspiera Pytigon jest klient WEB. Możesz korzystać w swoich projektach z dowolnych technologii webowych wliczając w to: react.js, vue.js. Pytigon szczególnie wspiera jednak następujące technologie: html, css oraz webcomponents. Do każdej z tych technologii Pytigon dodaje swoje własne rozwiązania pozwalające na maksymalne ujednolicenie tych składników.
Ihtml, sass oraz webcomponents tworzone w języku Python dzielą tą samą filozowię: po pierwsze czytelność kodu. Zdaniem autora kod języka Python jest zdecydowanie bardziej czytelny niż kod w JavaScript. Kod ihtml, wykorzystujący wcięcia do kontroli zasięgu znaczników - zmniejsza ilość kodu, zwiększa czytelność. To samo dotyczy języka sass, który zastępuje nawiasy klamrowe wcięciami - podobnie jak Python.
Poniżej znajduje się struktura przykładoweg komopnentu Pytigon'a. Po jego utworzeniu możesz go użyć na stronie html jako znacznik:
kod przykładowego komponentu:
TAG = 'ptig-test'
TEMPLATE = """
div
a data-bind=href:href
p...Hello world!
p data-bind=text
button data-bind=onclick:onclick
"""
BASE_PATH = window.BASE_PATH + 'static/vanillajs_plugins'
js_libs = [BASE_PATH + '/test.js', BASE_PATH + '/test2.js']
css_libs = [BASE_PATH + '/test.css']
with DefineWebComponent(TAG, False, js_libs, css_libs) as comp:
def width(new_value, old_value, component):
component.root.style.width = new_value
def height(new_value, old_value, component):
component.root.style.height = new_value
comp.options['attributes'] = {
"width": width,
"height": height,
"href" : None,
}
comp.options['template'] = TEMPLATE
@comp.fun("constructor")
def constructor(component):
pass
@comp.fun("init")
def init(component):
def onclick(event):
print("onclick:)
component.set_state({"onclick": onclick})
print(component.root)
@comp.fun("connectedCallback")
def connectedCallback(component):
pass
@comp.fun("disconnectedCallback")
def disconnectedCallback(component):
pass
#@comp.fun("attributeChangedCallback")
#def attributeChangedCallback(component):
# pass
Jak to działa?
Głównym elementem definiującym webcomponent jest klasa DefineWebComponent. Właściwe zdefiniowanie komponentu następuje w funkcji close obiektu tej klasy. Aby tak się mogło stać musimy wcześniej zadeklarować różnego rodzaju właściwości. Obiekt obsługuje "context management protocol" - w przykładzie powyżej wykorzystano tą cechę. W bloku "with" tworzymy nowy obiekt klasy DefineWebComponent, na końcu tego bloku automatycznie wywoływana jest funkcja close definiując tym WebComponent (następuje wywołanie standardowej funkcji standardu WebComponents: customElements.define).
DefineWebComponent wywoływany jest z 4 parametrami, z których tylko pierwszy jest obowiązkowy.
DefineWebComponent(tag , shadow=False, js=None, css=None):
Resztę parametrów uzupełniamy definiując kolejne elementy słownika: DefineWebComponents.options
options:
Data binding: komponent utworzony za pomocą DefineWebComponent posiada funkcję: set_state(dict)
Zawartość słownika mapowana jest na zdefiniowane w TEMPLATE elementy z atrybutem data-bind.
Składnia atrybutu data-bind:
2122