* Description
Very basic Python functions to generate HTML in a compasable way.
* Usage
Very much inspired from React.
A component is any function that returns the result of a ~create_element~ call. This function that the element name,
Let us first define a Text component. We will create a text element without any attributes:
#+begin_src python :session
from chp import create_element, create_prop, render_element
def Text(t):
return create_element("span", [], t)
t = Text("YourLabs")
render_element(t)
# outputs => "<span >YourLabs</span>"
#+end_src
#+RESULTS:
: <span >YourLabs</span>
Let's now use this component to display text inside of a link:
#+begin_src python :session
def Link(href, children):
href = create_prop("href", href)
return create_element("a", [href], children)
l = Link("yourlabs.org", [Text("YourLabs")])
render_element(l)
# outputs => "<a href="yourlabs.org"><span >YourLabs</span></a>"
#+end_src
#+RESULTS:
: <a href="yourlabs.org"><span >YourLabs</span></a>
Let us now define a Menu component that will create links inside of a nav element based on some input. Let's also rename out ~create_element~ and ~create_prop~ functions to ~ce~ and ~cp~ respectively
#+begin_src python :session
ce = create_element
cp = create_prop
def Menu(links=[]):
c = [] # menu children links array
for l in links:
el = Link(l["href"], [Text(l["text"])])
c.append(el)
return ce("nav", [cp("class", "menu")], c)
links = [
{
"href": "yourlabs.org",
"text": "YourLabs",
},
{
"href": "novamedia.nyc",
"text": "NovaMedia",
},
]
m = Menu(links)
render_element(m)
# outputs => <nav class="menu"><a href="yourlabs.org"><span >YourLabs</span></a><a href="novamedia.nyc"><span >NovaMedia</span></a></nav>
#+end_src
#+RESULTS:
Pretty printed, this final output is:
#+begin_src html
<nav class="menu">
<a href="yourlabs.org">
<span>YourLabs</span>
</a>
<a href="novamedia.nyc">
<span>NovaMedia</span>
</a>
</nav>
#+end_src
Feel free to check out the app.py and components.py files to see how a full page can be built easily using this method. The app.py file writes the html output to another file called output.html.
* Trying it
#+begin_src bash
git clone git@github.com:tbinetruy/CHIP.git
cd CHIP
python app.py # write html to output.html file
firefox output.html
#+end_src
* Examples
To run the example project:
- pip install --user --editable path/to/chp[dev]
- yarn install; yarn start
- chp-django runserver
- py.test path/to/chp
#+begin_src python
import chp
def FormSchema(is_checked):
return chp.Form([
chp.Row([
chp.Input('username'),
chp.CheckboxField(is_checked),
])
])
class PostForm(forms.ModelForm):
def render(self):
is_checked = 'checked' # self.checked
return mark_safe(FormSchema(is_checked).render_element(Form))
#+end_src
~phtml~ becomes a string containing the following html code:
#+begin_src html
<form class="mdc-layout-grid__cell">
<div class="mdc-layout-grid__inner">
<input class="mdc-input__native-control" type="text" id="{{ id }}" value="{{ value }}" name="username"></input>
<div class="mdc-form-field">
<div class="mdc-checkbox">
<input class="mdc-checkbox__native-control" type="checkbox" id="{{ id }}" name="password"></input>
<div class="mdc-checkbox-background"></div>
<label for="{{ id }}">{{ label }}</label>
</div>
</div>
</div>
<div >
{% for error in form.non_field_errors %}
{{ error }}
{% endfor %}
</div>
</form>
#+end_src
* TODOS
- Testing of the pyreact.py file. Some of the high level results were copy pasted into tests.org
Very basic Python functions to generate HTML in a compasable way.
* Usage
Very much inspired from React.
A component is any function that returns the result of a ~create_element~ call. This function that the element name,
Let us first define a Text component. We will create a text element without any attributes:
#+begin_src python :session
from chp import create_element, create_prop, render_element
def Text(t):
return create_element("span", [], t)
t = Text("YourLabs")
render_element(t)
# outputs => "<span >YourLabs</span>"
#+end_src
#+RESULTS:
: <span >YourLabs</span>
Let's now use this component to display text inside of a link:
#+begin_src python :session
def Link(href, children):
href = create_prop("href", href)
return create_element("a", [href], children)
l = Link("yourlabs.org", [Text("YourLabs")])
render_element(l)
# outputs => "<a href="yourlabs.org"><span >YourLabs</span></a>"
#+end_src
#+RESULTS:
: <a href="yourlabs.org"><span >YourLabs</span></a>
Let us now define a Menu component that will create links inside of a nav element based on some input. Let's also rename out ~create_element~ and ~create_prop~ functions to ~ce~ and ~cp~ respectively
#+begin_src python :session
ce = create_element
cp = create_prop
def Menu(links=[]):
c = [] # menu children links array
for l in links:
el = Link(l["href"], [Text(l["text"])])
c.append(el)
return ce("nav", [cp("class", "menu")], c)
links = [
{
"href": "yourlabs.org",
"text": "YourLabs",
},
{
"href": "novamedia.nyc",
"text": "NovaMedia",
},
]
m = Menu(links)
render_element(m)
# outputs => <nav class="menu"><a href="yourlabs.org"><span >YourLabs</span></a><a href="novamedia.nyc"><span >NovaMedia</span></a></nav>
#+end_src
#+RESULTS:
Pretty printed, this final output is:
#+begin_src html
<nav class="menu">
<a href="yourlabs.org">
<span>YourLabs</span>
</a>
<a href="novamedia.nyc">
<span>NovaMedia</span>
</a>
</nav>
#+end_src
Feel free to check out the app.py and components.py files to see how a full page can be built easily using this method. The app.py file writes the html output to another file called output.html.
* Trying it
#+begin_src bash
git clone git@github.com:tbinetruy/CHIP.git
cd CHIP
python app.py # write html to output.html file
firefox output.html
#+end_src
* Examples
To run the example project:
- pip install --user --editable path/to/chp[dev]
- yarn install; yarn start
- chp-django runserver
- py.test path/to/chp
#+begin_src python
import chp
def FormSchema(is_checked):
return chp.Form([
chp.Row([
chp.Input('username'),
chp.CheckboxField(is_checked),
])
])
class PostForm(forms.ModelForm):
def render(self):
is_checked = 'checked' # self.checked
return mark_safe(FormSchema(is_checked).render_element(Form))
#+end_src
~phtml~ becomes a string containing the following html code:
#+begin_src html
<form class="mdc-layout-grid__cell">
<div class="mdc-layout-grid__inner">
<input class="mdc-input__native-control" type="text" id="{{ id }}" value="{{ value }}" name="username"></input>
<div class="mdc-form-field">
<div class="mdc-checkbox">
<input class="mdc-checkbox__native-control" type="checkbox" id="{{ id }}" name="password"></input>
<div class="mdc-checkbox-background"></div>
<label for="{{ id }}">{{ label }}</label>
</div>
</div>
</div>
<div >
{% for error in form.non_field_errors %}
{{ error }}
{% endfor %}
</div>
</form>
#+end_src
* TODOS
- Testing of the pyreact.py file. Some of the high level results were copy pasted into tests.org
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
chp-0.0.1.tar.gz
(6.6 kB
view details)
File details
Details for the file chp-0.0.1.tar.gz.
File metadata
- Download URL: chp-0.0.1.tar.gz
- Upload date:
- Size: 6.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
Python-urllib/3.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
451a2136c1dfcf26c724faf7e81bf5e537fb79bc1d89a6725cfb244ca4b88a2f
|
|
| MD5 |
28f43f3bfe37152a2516cc1ba61a3be9
|
|
| BLAKE2b-256 |
21ab1d58cafab2cd019fb95fe79185c9d1d612552f77870aa7aa643d0a48cfcf
|