summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-05 03:49:43 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-05 03:49:43 +0000
commit2bd1f462e4c5b379cdc3875b25f8b7b0e9b8378c (patch)
tree839fa7821dcc6d55cc81db35f01856925a863b4b
parentc79223109b9667838ca60ec3f5ac761daf19e5ec (diff)
automatic import of python-domonicopeneuler20.03
-rw-r--r--.gitignore1
-rw-r--r--python-domonic.spec2145
-rw-r--r--sources1
3 files changed, 2147 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..474a8a6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/domonic-0.9.11.tar.gz
diff --git a/python-domonic.spec b/python-domonic.spec
new file mode 100644
index 0000000..db2078d
--- /dev/null
+++ b/python-domonic.spec
@@ -0,0 +1,2145 @@
+%global _empty_manifest_terminate_build 0
+Name: python-domonic
+Version: 0.9.11
+Release: 1
+Summary: Generate html with python 3. DOM API, Javascript API and more...
+License: MIT
+URL: https://github.com/byteface/domonic
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/ce/58/bf59f5f461ba4bedb4b3e511f9895ae1e1b429d0a95e1cf8d2edddfe0101/domonic-0.9.11.tar.gz
+BuildArch: noarch
+
+Requires: python3-elementpath
+Requires: python3-dateutil
+Requires: python3-requests
+Requires: python3-urllib3
+Requires: python3-html5lib
+Requires: python3-cssselect
+
+%description
+<h1 align="center">
+ <br>𖤐 domonic 𖤐<br>
+</h1>
+
+[![PyPI version](https://badge.fury.io/py/domonic.svg)](https://badge.fury.io/py/domonic.svg)
+[![Downloads](https://pepy.tech/badge/domonic)](https://pepy.tech/project/domonic)
+[![Python version](https://img.shields.io/pypi/pyversions/domonic.svg?style=flat)](https://img.shields.io/pypi/pyversions/domonic.svg?style=flat)
+[![Build status](https://travis-ci.com/byteface/domonic.svg?branch=master)](https://travis-ci.com/byteface/domonic.svg?branch=master)
+[![Python package](https://github.com/byteface/domonic/actions/workflows/python-package.yml/badge.svg?branch=master)](https://github.com/byteface/domonic/actions/workflows/python-package.yml)
+
+#### A DOM for making HTML with python 3! (and more)
+
+### Install
+
+```bash
+python3 -m pip install domonic
+# python3 -m pip install domonic --upgrade
+```
+
+## Creating HTML with Python 3
+
+```python
+from domonic.html import *
+print(html(body(h1('Hello, World!'))))
+# <html><body><h1>Hello, World!</h1></body></html>
+```
+
+or to pretty format and insert the doctype, use an f-string:
+
+```python
+mydom = html(body(h1('Hello, World!'), a("somelink", _href="somepage.html")))
+print(f"{mydom}")
+```
+
+```html
+<!DOCTYPE html>
+<html>
+ <body>
+ <h1>Hello, World!</h1>
+ <a href="somepage.html">somelink</a>
+ </body>
+</html>
+```
+
+### parsing html
+
+Basic useage...
+
+```bash
+from domonic import domonic
+mydom = domonic.parseString('<somehtml...')
+```
+
+To quickly parse a webapge try the window module...
+
+```bash
+from domonic.window import window
+window.location = "http://www.google.com"
+print(window.document.title)
+```
+
+Also try the xpath or css selectors on command line...
+
+```bash
+domonic -x https://google.com '//a' | uniq | sort
+```
+
+### More
+
+- [html](https://domonic.readthedocs.io/_modules/domonic/html.html) : Generate html with python 3 😎
+- [dom](https://domonic.readthedocs.io/_modules/domonic/dom.html) : DOM API in python 3 😲
+- [javascript](https://domonic.readthedocs.io/_modules/domonic/javascript.html) : js API in python 3 😳 + ([dQuery](https://domonic.readthedocs.io/packages/dQuery.html), [d3](https://domonic.readthedocs.io/packages/d3.html))
+- JSON : utils for loading / decorating / transforming
+- SVG || mathml || aframe || x3d tags - generators for popular tags
+- terminal || cmd : call terminal commands with python3 😱
+
+See the [docs/code](https://domonic.readthedocs.io/) for more features...
+
+or examples in the [repo...](https://github.com/byteface/domonic/tree/master/examples)
+
+
+### Namespace
+
+Use the tags packaage if you want a namespace. i.e.
+
+```python
+import domonic.tags
+print(domonic.tags.h1)
+# or
+import domonic.tags as tags
+str(tags.div)
+# or
+import domonic.tags as html
+print(html.span)
+```
+
+or just import what you need...
+
+```python
+from domonic import div, span, input as myinput, html as root
+```
+
+### html attributes
+
+prepend attributes with an underscore ( avoids clashing with python keywords )
+
+```python
+test = label(_class='classname', _for="someinput")
+print(test)
+```
+
+```html
+<label class="classname" for="someinput"></label>
+```
+
+### rendering DOM objects
+
+domonic is a pure python dom whos tree is composed of objects. i.e
+
+```python
+div()
+# <domonic.html.div object at 0x106b0e6b0>
+```
+
+cast str() on any element to render it without formatting.
+
+```python
+el = str(div())
+print(el)
+# <div></div>
+```
+
+There's also a render method that takes 2 parameters, some domonic and an optional output file.
+
+```python
+page = div(span('Hello World'))
+render(f"{page}", 'index.html') # notice use of f-string to pretty print the html
+```
+
+There's a few new rendering options. See DOMConfig.
+
+```python
+from domonic.dom import DOMConfig
+print(DOMConfig.GLOBAL_AUTOESCAPE) # Default False
+print(DOMConfig.RENDER_OPTIONAL_CLOSING_TAGS) # Default True
+print(DOMConfig.RENDER_OPTIONAL_CLOSING_SLASH) # Defaults True
+print(DOMConfig.SPACE_BEFORE_OPTIONAL_CLOSING_SLASH) # Default False
+```
+
+## DOM
+
+DOM manipulation with python.
+
+### createElement
+
+to create your own elements use the DOM API
+
+```python
+from domonic.dom import *
+
+site = html()
+el = document.createElement('myelement')
+site.appendChild(el)
+print(site)
+# <html><myelement></myelement></html>
+
+```
+
+There's an evolving DOM API. To learn more about the webAPI [click here](https://developer.mozilla.org/en-US/docs/Web/API).
+
+And check the [code/docs](https://domonic.readthedocs.io/) to see what's currently been implemented.
+
+```python
+mysite.querySelectorAll('button')
+mysite.querySelectorAll("a[rel=nofollow]")
+mysite.querySelectorAll("a[href='#services']")
+mysite.querySelectorAll("a[href$='technology']")
+mysite.querySelectorAll('.fa-twitter')
+
+somelinks = mysite.querySelectorAll("a[href*='twitter']")
+for l in somelinks:
+ print(l.href)
+```
+
+To use the DOM either reference your root 'html' node or import the dom modules global 'document'
+
+```python
+
+# access the document via the html tag
+mydom = html()
+# mydom.getElementbyID...
+
+# or by importing the document global
+from domonic.dom import document
+# document.createElement...
+print(document)
+```
+
+### javascript
+
+There is a javascript package that mimics the js API:
+
+```python
+from domonic.javascript import Math
+print(Math.random())
+
+from domonic.javascript import Array
+myArr=Array(1,2,3)
+print(myArr.splice(1))
+# [2, 3]
+
+from domonic.javascript import URL
+url = URL('https://somesite.com/blog/article-one#some-hash')
+print(url.protocol) # https
+print(url.host) # somesite.com
+print(url.pathname) # /blog/article-one
+print(url.hash) # #some-hash
+
+# Use Global class to import all the js methods from the global namespace i.e
+# from domonic.javascript import Global
+# Global.decodeURIComponent(...
+# Global.encodeComponent(...
+# Global.setInterval(...
+
+# from domonic.javascript import Date, String, Number
+# etc..
+```
+
+Use setInterval and clearInterval with params
+
+```python
+from domonic.javascript import setInterval, clearInterval
+
+x=0
+
+def hi(inc):
+ global x
+ x = x+inc
+ print(x)
+
+test = setInterval(hi, 1000, 2)
+import time
+time.sleep(5)
+clearInterval(test)
+print(f"Final value of x:{x}")
+```
+
+Or for a single delayed function call use setTimeout, clearTimeout
+
+```python
+from domonic.javascript import setTimeout, clearTimeout
+timeoutID = setTimeout(hi, 1000)
+```
+
+You can call ```()``` on a stringvar to transform it into a Node
+
+```python
+from domonic.javascript import String
+
+test = String("Hi there!")
+test('div', _style="font-color:red;")
+str(test('div', _style="font-color:red;"))
+# <div style="font-color:red;">Hi there!</div>
+```
+
+a-tags inherit URL:
+
+```python
+from domonic.html import *
+
+atag = a(_href="https://somesite.com:8000/blog/article-one#some-hash")
+print('href:', atag.href)
+# href: https://somesite.com:8000/blog/article-one#some-hash
+print('protocol:', atag.protocol)
+# protocol: https:
+print('port:', atag.port)
+# port: 8000
+
+atag.protocol = "http"
+atag.port = 8983
+print(atag)
+# <a href="http://somesite.com:8983/blog/article-one#some-hash">
+```
+
+For writing and using regular javascript, load from a src...
+
+```python
+script(_src="/docs/5.0/dist/js/bootstrap.bundle.min.js", _integrity="sha384-1234", _crossorigin="anonymous"),
+# <script src="/docs/5.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-1234" crossorigin="anonymous"></script>
+```
+
+or do inline js by opening triple quotes...
+
+```python
+script("""
+let itbe = ""
+"""),
+```
+
+### Styling
+
+Styling is supported. Styles get passed to the style tag on render...
+
+```python
+mytag = div("hi", _id="test")
+mytag.style.backgroundColor = "black"
+mytag.style.fontSize = "12px"
+print(mytag)
+# <div id="test" style="background-color:black;font-size:12px;">hi</div>
+```
+
+To use css use a link tag as you usually would...
+
+```python
+link(_href="styles.css", _rel="stylesheet"),
+```
+
+or use triple quotes to open style tag...
+
+```python
+style("""
+.placeholder-img {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+"""),
+```
+
+### decorators
+
+use decorators to wrap elements around function results
+
+```python
+from domonic.decorators import el
+
+@el(html, True)
+@el(body)
+@el(div)
+def test():
+ return 'hi!'
+
+print(test())
+# <html><body><div>hi!</div></body></html>
+
+# returns pyml objects so call str to render
+assert str(test()) == '<html><body><div>hi!</div></body></html>'
+```
+
+It returns the tag object by default. You can pass True as a second param to the decorator to return a rendered string instead. Also accepts strings as first param i.e. custom tags.
+
+### data-tags
+
+python doesn't allow hyphens in parameter names. so use variable keyword argument syntax for custom data-tags
+
+```python
+div("test", **{"_data-test":"test"} )
+# <div data-test="test">test</div>
+```
+
+or for example a colon...
+
+```python
+t = div( **{"_:test":"something"} )
+str(t)
+# <div :test="something"></div>
+```
+
+### JSON (utils)
+
+decorate any function that returns python objects to return json instead
+
+```python
+from domonic.decorators import as_json
+import domonic.JSON as JSON
+
+@as_json
+def somefunc():
+ myObj = {"hi":[1,2,3]}
+ return myObj
+
+print( somefunc() )
+# {"hi":[1,2,3]}
+print( JSON.is_json(somefunc()) )
+# True
+```
+
+convert json arrays into html tables...
+
+```python
+import domonic.JSON as JSON
+
+# i.e. containting flat json array of dicts... [{"id":"01","name": "some item"},{"id":"02","name": "some other item"}]
+
+json_data = JSON.parse_file('somefile.json')
+mytable = JSON.tablify(json_data)
+print(mytable)
+```
+
+convert json arrays into csv files...
+
+```python
+import domonic.JSON as JSON
+
+json_data = JSON.parse_file('somefile.json')
+JSON.csvify(json_data, 'data.csv')
+```
+
+convert csv files to json...
+
+```python
+import domonic.JSON as JSON
+
+json_data =JSON.csv2json("data.csv")
+print(json_data)
+```
+
+more to come...
+
+### SVG
+
+All tags extend 'Element'. So will have DOM and magic methods available to them. See the [docs](https://domonic.readthedocs.io/).
+
+```python
+circ = svg(
+ circle(_cx="50", _cy="50", _r="40", _stroke="green", **{"_stroke-width": "4"}, _fill="yellow"),
+ _width="100", _height="100",
+)
+mysvg = svg()
+mysvg.appendChild(circ / 10)
+print(mysvg)
+```
+
+### Tweening
+
+Tween values with the tween library:
+
+```python
+from domonic.lerpy.easing import *
+from domonic.lerpy.tween import *
+
+someObj = {'x':0,'y':0,'z':0}
+twn = Tween( someObj, { 'x':10, 'y':5, 'z':3 }, 6, Linear.easeIn )
+twn.start()
+```
+
+### aframe / x3d
+
+3d tags can be used if you import the js
+
+```python
+from domonic.html import *
+from domonic.xml.aframe import *
+from domonic.CDN import *
+
+_scene = scene(
+ box(_position="-1 0.5 -3", _rotation="0 45 0", _color="#4CC3D9"),
+ sphere(_position="0 1.25 -5", _radius="1.25", _color="#EF2D5E"),
+ cylinder(_position="1 0.75 -3", _radius="0.5", _height="1.5", _color="#FFC65D"),
+ plane(_position="0 0 -4", _rotation="-90 0 0", _width="4", _height="4", _color="#7BC8A4"),
+ sky(_color="#ECECEC")
+ )
+
+_webpage = html(head(),body(
+ script(_src=CDN_JS.AFRAME_1_2), # < NOTICE you need to import aframe to use it
+ str(_scene)
+ )
+)
+
+render( _webpage, 'hello.html' )
+```
+
+### dQuery (NEW)
+
+dQuery uses the º symbol (alt+0).
+
+```python
+from domonic.html import *
+from domonic.dQuery import º
+
+d = html(head(body(li(_class='things'), div(_id="test"))))
+
+print( º('#test') )
+# <div id="test">
+print( º('.things') )
+# <li class="things">
+mydiv = º('<div class="test2"></div>')
+# <domonic.dQuery.o object at 0x107d5c9a0>
+
+b = º('#test').append(mydiv)
+print(b)
+# <div id="test"><div class="test2"></div></div>
+```
+
+Only recently started so check to see what's implemented.
+
+### terminal
+
+There is a command line package that can call bash/unix/posix and other apps on the command line:
+
+This package only works on nix systems as it effectively just passes stuff off to subprocess.
+
+```python
+from domonic.terminal import *
+
+print(ls())
+print(ls("-al"))
+print(ls("../"))
+print(pwd())
+print(mkdir('somedir'))
+print(touch('somefile'))
+print(git('status'))
+
+for file in ls( "-al" ):
+ print("Line : ", file)
+
+for f in ls():
+ try:
+ print(f)
+ print(cat(f))
+ except Exception as e:
+ pass
+
+for i, l in enumerate(cat('LICENSE.txt')):
+ print(i,l)
+
+print(man("ls"))
+print(echo('test'))
+print(df())
+print(du())
+
+for thing in du():
+ print(thing)
+
+print(find('.'))
+# print(ping('eventual.technology'))# < TODO - need to strean output
+print(cowsay('moo'))
+print(wget('eventual.technology'))
+print(date())
+print(cal())
+```
+
+or just run arbitrary commands...
+
+```python
+from domonic.terminal import command
+command.run("echo hi")
+```
+
+Take a look at the code in 'terminal.py' to see all the commands as there's loads. (Disclaimer: not all tested.)
+
+Windows users can use now use cmd.
+
+```python
+from domonic.cmd import *
+print(dir())
+print(dir("..\\"))
+```
+
+### DOCS
+
+[https://domonic.readthedocs.io/](https://domonic.readthedocs.io/)
+
+### CLI
+
+Use the command line interface to help you out.
+
+To view the online the docs:
+
+```python
+domonic -h
+```
+
+To see the version:
+
+```bash
+domonic -v
+```
+
+To quickly create a domonic project for prototyping:
+
+```bash
+domonic -p myproject
+```
+
+To evaluate some domonic pyml:
+
+```bash
+domonic -e 'html(head(),body(div()))'
+```
+
+To use xpath on a website from the command line:
+
+```bash
+domonic -x https://google.com '//a'
+```
+
+To use css selectors on a website from the command line:
+
+```bash
+domonic -q https://google.com 'a'
+```
+
+### EXAMPLE PROJECTS
+
+[Blueberry](https://github.com/byteface/Blueberry/) : A browser based file OS. Working example of how components can work.
+
+[ezcron](https://github.com/byteface/ezcron/) : A cron viewer
+
+[bombdisposer](https://github.com/byteface/bombdisposer/) : A basic game
+
+[htmlx](https://github.com/byteface/htmlx/tree/master/htmlx) : A low dependency lightweight (DOM only) version of domonic
+
+Checkout [the docs](https://domonic.readthedocs.io/) for more examples i.e. generating sitemaps or using domonic with server frameworks like flask, django, sanic, fastapi and others.
+
+There's also several useage examples in the repo so pull and have a look.
+
+### Join-In
+
+Feel free to contribute if you find it useful. (I'd be grateful for help on all fronts)
+
+Email me, message me directly if you like or create a discussion on here. Or join the [discord](https://discord.gg/a9pSZv4V5f).
+
+If there are any methods you want that are missing or not complete yet or you think you can help make it better just update the code and send a pull request. I'll merge and releaese asap.
+
+In the repo there's a requirements-dev.txt which is mostly the libs used in the examples.
+
+requirements.txt are the libs used for packaging just the lib.
+
+See also the CONTRIBUTING.md
+
+### running examples
+
+```bash
+. venv/bin/activate
+pip install -r requirements-dev.txt
+cd examples
+python lifecalendar.py
+```
+
+### run tests
+
+There are tests used during dev. They are useful as code examples and to see what still needs doing.
+
+See Makefile to run all tests:
+
+```bash
+make test # default tests ubuntu. so will fail on window when terminal test runs. comment out locally if that's the case
+```
+
+or to test a single function:
+
+```bash
+python -m unittest tests.test_javascript.TestCase.test_javascript_array
+python -m unittest tests.test_dQuery.TestCase.test_addClass
+python -m unittest tests.test_geom.TestCase.test_vec2
+python3 -m unittest tests.test_cmd.TestCase.test_cmd_dir # only windows
+```
+
+or to test a whole module
+
+```bash
+python -m unittest tests.test_html
+python -m unittest tests.test_CDN
+```
+
+to see coverage
+
+```bash
+coverage run -m unittest discover tests/
+coverage report
+```
+
+or...
+
+```bash
+pip install pytest
+pytest tests
+```
+
+
+### Disclaimer
+
+There's several more widely supported libraries doing HTML generation, DOM reading/manipulation, terminal wrappers etc. Maybe use one of those for production due to strictness and support.
+
+This is more of a fast prototyping library.
+
+
+
+
+%package -n python3-domonic
+Summary: Generate html with python 3. DOM API, Javascript API and more...
+Provides: python-domonic
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-domonic
+<h1 align="center">
+ <br>𖤐 domonic 𖤐<br>
+</h1>
+
+[![PyPI version](https://badge.fury.io/py/domonic.svg)](https://badge.fury.io/py/domonic.svg)
+[![Downloads](https://pepy.tech/badge/domonic)](https://pepy.tech/project/domonic)
+[![Python version](https://img.shields.io/pypi/pyversions/domonic.svg?style=flat)](https://img.shields.io/pypi/pyversions/domonic.svg?style=flat)
+[![Build status](https://travis-ci.com/byteface/domonic.svg?branch=master)](https://travis-ci.com/byteface/domonic.svg?branch=master)
+[![Python package](https://github.com/byteface/domonic/actions/workflows/python-package.yml/badge.svg?branch=master)](https://github.com/byteface/domonic/actions/workflows/python-package.yml)
+
+#### A DOM for making HTML with python 3! (and more)
+
+### Install
+
+```bash
+python3 -m pip install domonic
+# python3 -m pip install domonic --upgrade
+```
+
+## Creating HTML with Python 3
+
+```python
+from domonic.html import *
+print(html(body(h1('Hello, World!'))))
+# <html><body><h1>Hello, World!</h1></body></html>
+```
+
+or to pretty format and insert the doctype, use an f-string:
+
+```python
+mydom = html(body(h1('Hello, World!'), a("somelink", _href="somepage.html")))
+print(f"{mydom}")
+```
+
+```html
+<!DOCTYPE html>
+<html>
+ <body>
+ <h1>Hello, World!</h1>
+ <a href="somepage.html">somelink</a>
+ </body>
+</html>
+```
+
+### parsing html
+
+Basic useage...
+
+```bash
+from domonic import domonic
+mydom = domonic.parseString('<somehtml...')
+```
+
+To quickly parse a webapge try the window module...
+
+```bash
+from domonic.window import window
+window.location = "http://www.google.com"
+print(window.document.title)
+```
+
+Also try the xpath or css selectors on command line...
+
+```bash
+domonic -x https://google.com '//a' | uniq | sort
+```
+
+### More
+
+- [html](https://domonic.readthedocs.io/_modules/domonic/html.html) : Generate html with python 3 😎
+- [dom](https://domonic.readthedocs.io/_modules/domonic/dom.html) : DOM API in python 3 😲
+- [javascript](https://domonic.readthedocs.io/_modules/domonic/javascript.html) : js API in python 3 😳 + ([dQuery](https://domonic.readthedocs.io/packages/dQuery.html), [d3](https://domonic.readthedocs.io/packages/d3.html))
+- JSON : utils for loading / decorating / transforming
+- SVG || mathml || aframe || x3d tags - generators for popular tags
+- terminal || cmd : call terminal commands with python3 😱
+
+See the [docs/code](https://domonic.readthedocs.io/) for more features...
+
+or examples in the [repo...](https://github.com/byteface/domonic/tree/master/examples)
+
+
+### Namespace
+
+Use the tags packaage if you want a namespace. i.e.
+
+```python
+import domonic.tags
+print(domonic.tags.h1)
+# or
+import domonic.tags as tags
+str(tags.div)
+# or
+import domonic.tags as html
+print(html.span)
+```
+
+or just import what you need...
+
+```python
+from domonic import div, span, input as myinput, html as root
+```
+
+### html attributes
+
+prepend attributes with an underscore ( avoids clashing with python keywords )
+
+```python
+test = label(_class='classname', _for="someinput")
+print(test)
+```
+
+```html
+<label class="classname" for="someinput"></label>
+```
+
+### rendering DOM objects
+
+domonic is a pure python dom whos tree is composed of objects. i.e
+
+```python
+div()
+# <domonic.html.div object at 0x106b0e6b0>
+```
+
+cast str() on any element to render it without formatting.
+
+```python
+el = str(div())
+print(el)
+# <div></div>
+```
+
+There's also a render method that takes 2 parameters, some domonic and an optional output file.
+
+```python
+page = div(span('Hello World'))
+render(f"{page}", 'index.html') # notice use of f-string to pretty print the html
+```
+
+There's a few new rendering options. See DOMConfig.
+
+```python
+from domonic.dom import DOMConfig
+print(DOMConfig.GLOBAL_AUTOESCAPE) # Default False
+print(DOMConfig.RENDER_OPTIONAL_CLOSING_TAGS) # Default True
+print(DOMConfig.RENDER_OPTIONAL_CLOSING_SLASH) # Defaults True
+print(DOMConfig.SPACE_BEFORE_OPTIONAL_CLOSING_SLASH) # Default False
+```
+
+## DOM
+
+DOM manipulation with python.
+
+### createElement
+
+to create your own elements use the DOM API
+
+```python
+from domonic.dom import *
+
+site = html()
+el = document.createElement('myelement')
+site.appendChild(el)
+print(site)
+# <html><myelement></myelement></html>
+
+```
+
+There's an evolving DOM API. To learn more about the webAPI [click here](https://developer.mozilla.org/en-US/docs/Web/API).
+
+And check the [code/docs](https://domonic.readthedocs.io/) to see what's currently been implemented.
+
+```python
+mysite.querySelectorAll('button')
+mysite.querySelectorAll("a[rel=nofollow]")
+mysite.querySelectorAll("a[href='#services']")
+mysite.querySelectorAll("a[href$='technology']")
+mysite.querySelectorAll('.fa-twitter')
+
+somelinks = mysite.querySelectorAll("a[href*='twitter']")
+for l in somelinks:
+ print(l.href)
+```
+
+To use the DOM either reference your root 'html' node or import the dom modules global 'document'
+
+```python
+
+# access the document via the html tag
+mydom = html()
+# mydom.getElementbyID...
+
+# or by importing the document global
+from domonic.dom import document
+# document.createElement...
+print(document)
+```
+
+### javascript
+
+There is a javascript package that mimics the js API:
+
+```python
+from domonic.javascript import Math
+print(Math.random())
+
+from domonic.javascript import Array
+myArr=Array(1,2,3)
+print(myArr.splice(1))
+# [2, 3]
+
+from domonic.javascript import URL
+url = URL('https://somesite.com/blog/article-one#some-hash')
+print(url.protocol) # https
+print(url.host) # somesite.com
+print(url.pathname) # /blog/article-one
+print(url.hash) # #some-hash
+
+# Use Global class to import all the js methods from the global namespace i.e
+# from domonic.javascript import Global
+# Global.decodeURIComponent(...
+# Global.encodeComponent(...
+# Global.setInterval(...
+
+# from domonic.javascript import Date, String, Number
+# etc..
+```
+
+Use setInterval and clearInterval with params
+
+```python
+from domonic.javascript import setInterval, clearInterval
+
+x=0
+
+def hi(inc):
+ global x
+ x = x+inc
+ print(x)
+
+test = setInterval(hi, 1000, 2)
+import time
+time.sleep(5)
+clearInterval(test)
+print(f"Final value of x:{x}")
+```
+
+Or for a single delayed function call use setTimeout, clearTimeout
+
+```python
+from domonic.javascript import setTimeout, clearTimeout
+timeoutID = setTimeout(hi, 1000)
+```
+
+You can call ```()``` on a stringvar to transform it into a Node
+
+```python
+from domonic.javascript import String
+
+test = String("Hi there!")
+test('div', _style="font-color:red;")
+str(test('div', _style="font-color:red;"))
+# <div style="font-color:red;">Hi there!</div>
+```
+
+a-tags inherit URL:
+
+```python
+from domonic.html import *
+
+atag = a(_href="https://somesite.com:8000/blog/article-one#some-hash")
+print('href:', atag.href)
+# href: https://somesite.com:8000/blog/article-one#some-hash
+print('protocol:', atag.protocol)
+# protocol: https:
+print('port:', atag.port)
+# port: 8000
+
+atag.protocol = "http"
+atag.port = 8983
+print(atag)
+# <a href="http://somesite.com:8983/blog/article-one#some-hash">
+```
+
+For writing and using regular javascript, load from a src...
+
+```python
+script(_src="/docs/5.0/dist/js/bootstrap.bundle.min.js", _integrity="sha384-1234", _crossorigin="anonymous"),
+# <script src="/docs/5.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-1234" crossorigin="anonymous"></script>
+```
+
+or do inline js by opening triple quotes...
+
+```python
+script("""
+let itbe = ""
+"""),
+```
+
+### Styling
+
+Styling is supported. Styles get passed to the style tag on render...
+
+```python
+mytag = div("hi", _id="test")
+mytag.style.backgroundColor = "black"
+mytag.style.fontSize = "12px"
+print(mytag)
+# <div id="test" style="background-color:black;font-size:12px;">hi</div>
+```
+
+To use css use a link tag as you usually would...
+
+```python
+link(_href="styles.css", _rel="stylesheet"),
+```
+
+or use triple quotes to open style tag...
+
+```python
+style("""
+.placeholder-img {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+"""),
+```
+
+### decorators
+
+use decorators to wrap elements around function results
+
+```python
+from domonic.decorators import el
+
+@el(html, True)
+@el(body)
+@el(div)
+def test():
+ return 'hi!'
+
+print(test())
+# <html><body><div>hi!</div></body></html>
+
+# returns pyml objects so call str to render
+assert str(test()) == '<html><body><div>hi!</div></body></html>'
+```
+
+It returns the tag object by default. You can pass True as a second param to the decorator to return a rendered string instead. Also accepts strings as first param i.e. custom tags.
+
+### data-tags
+
+python doesn't allow hyphens in parameter names. so use variable keyword argument syntax for custom data-tags
+
+```python
+div("test", **{"_data-test":"test"} )
+# <div data-test="test">test</div>
+```
+
+or for example a colon...
+
+```python
+t = div( **{"_:test":"something"} )
+str(t)
+# <div :test="something"></div>
+```
+
+### JSON (utils)
+
+decorate any function that returns python objects to return json instead
+
+```python
+from domonic.decorators import as_json
+import domonic.JSON as JSON
+
+@as_json
+def somefunc():
+ myObj = {"hi":[1,2,3]}
+ return myObj
+
+print( somefunc() )
+# {"hi":[1,2,3]}
+print( JSON.is_json(somefunc()) )
+# True
+```
+
+convert json arrays into html tables...
+
+```python
+import domonic.JSON as JSON
+
+# i.e. containting flat json array of dicts... [{"id":"01","name": "some item"},{"id":"02","name": "some other item"}]
+
+json_data = JSON.parse_file('somefile.json')
+mytable = JSON.tablify(json_data)
+print(mytable)
+```
+
+convert json arrays into csv files...
+
+```python
+import domonic.JSON as JSON
+
+json_data = JSON.parse_file('somefile.json')
+JSON.csvify(json_data, 'data.csv')
+```
+
+convert csv files to json...
+
+```python
+import domonic.JSON as JSON
+
+json_data =JSON.csv2json("data.csv")
+print(json_data)
+```
+
+more to come...
+
+### SVG
+
+All tags extend 'Element'. So will have DOM and magic methods available to them. See the [docs](https://domonic.readthedocs.io/).
+
+```python
+circ = svg(
+ circle(_cx="50", _cy="50", _r="40", _stroke="green", **{"_stroke-width": "4"}, _fill="yellow"),
+ _width="100", _height="100",
+)
+mysvg = svg()
+mysvg.appendChild(circ / 10)
+print(mysvg)
+```
+
+### Tweening
+
+Tween values with the tween library:
+
+```python
+from domonic.lerpy.easing import *
+from domonic.lerpy.tween import *
+
+someObj = {'x':0,'y':0,'z':0}
+twn = Tween( someObj, { 'x':10, 'y':5, 'z':3 }, 6, Linear.easeIn )
+twn.start()
+```
+
+### aframe / x3d
+
+3d tags can be used if you import the js
+
+```python
+from domonic.html import *
+from domonic.xml.aframe import *
+from domonic.CDN import *
+
+_scene = scene(
+ box(_position="-1 0.5 -3", _rotation="0 45 0", _color="#4CC3D9"),
+ sphere(_position="0 1.25 -5", _radius="1.25", _color="#EF2D5E"),
+ cylinder(_position="1 0.75 -3", _radius="0.5", _height="1.5", _color="#FFC65D"),
+ plane(_position="0 0 -4", _rotation="-90 0 0", _width="4", _height="4", _color="#7BC8A4"),
+ sky(_color="#ECECEC")
+ )
+
+_webpage = html(head(),body(
+ script(_src=CDN_JS.AFRAME_1_2), # < NOTICE you need to import aframe to use it
+ str(_scene)
+ )
+)
+
+render( _webpage, 'hello.html' )
+```
+
+### dQuery (NEW)
+
+dQuery uses the º symbol (alt+0).
+
+```python
+from domonic.html import *
+from domonic.dQuery import º
+
+d = html(head(body(li(_class='things'), div(_id="test"))))
+
+print( º('#test') )
+# <div id="test">
+print( º('.things') )
+# <li class="things">
+mydiv = º('<div class="test2"></div>')
+# <domonic.dQuery.o object at 0x107d5c9a0>
+
+b = º('#test').append(mydiv)
+print(b)
+# <div id="test"><div class="test2"></div></div>
+```
+
+Only recently started so check to see what's implemented.
+
+### terminal
+
+There is a command line package that can call bash/unix/posix and other apps on the command line:
+
+This package only works on nix systems as it effectively just passes stuff off to subprocess.
+
+```python
+from domonic.terminal import *
+
+print(ls())
+print(ls("-al"))
+print(ls("../"))
+print(pwd())
+print(mkdir('somedir'))
+print(touch('somefile'))
+print(git('status'))
+
+for file in ls( "-al" ):
+ print("Line : ", file)
+
+for f in ls():
+ try:
+ print(f)
+ print(cat(f))
+ except Exception as e:
+ pass
+
+for i, l in enumerate(cat('LICENSE.txt')):
+ print(i,l)
+
+print(man("ls"))
+print(echo('test'))
+print(df())
+print(du())
+
+for thing in du():
+ print(thing)
+
+print(find('.'))
+# print(ping('eventual.technology'))# < TODO - need to strean output
+print(cowsay('moo'))
+print(wget('eventual.technology'))
+print(date())
+print(cal())
+```
+
+or just run arbitrary commands...
+
+```python
+from domonic.terminal import command
+command.run("echo hi")
+```
+
+Take a look at the code in 'terminal.py' to see all the commands as there's loads. (Disclaimer: not all tested.)
+
+Windows users can use now use cmd.
+
+```python
+from domonic.cmd import *
+print(dir())
+print(dir("..\\"))
+```
+
+### DOCS
+
+[https://domonic.readthedocs.io/](https://domonic.readthedocs.io/)
+
+### CLI
+
+Use the command line interface to help you out.
+
+To view the online the docs:
+
+```python
+domonic -h
+```
+
+To see the version:
+
+```bash
+domonic -v
+```
+
+To quickly create a domonic project for prototyping:
+
+```bash
+domonic -p myproject
+```
+
+To evaluate some domonic pyml:
+
+```bash
+domonic -e 'html(head(),body(div()))'
+```
+
+To use xpath on a website from the command line:
+
+```bash
+domonic -x https://google.com '//a'
+```
+
+To use css selectors on a website from the command line:
+
+```bash
+domonic -q https://google.com 'a'
+```
+
+### EXAMPLE PROJECTS
+
+[Blueberry](https://github.com/byteface/Blueberry/) : A browser based file OS. Working example of how components can work.
+
+[ezcron](https://github.com/byteface/ezcron/) : A cron viewer
+
+[bombdisposer](https://github.com/byteface/bombdisposer/) : A basic game
+
+[htmlx](https://github.com/byteface/htmlx/tree/master/htmlx) : A low dependency lightweight (DOM only) version of domonic
+
+Checkout [the docs](https://domonic.readthedocs.io/) for more examples i.e. generating sitemaps or using domonic with server frameworks like flask, django, sanic, fastapi and others.
+
+There's also several useage examples in the repo so pull and have a look.
+
+### Join-In
+
+Feel free to contribute if you find it useful. (I'd be grateful for help on all fronts)
+
+Email me, message me directly if you like or create a discussion on here. Or join the [discord](https://discord.gg/a9pSZv4V5f).
+
+If there are any methods you want that are missing or not complete yet or you think you can help make it better just update the code and send a pull request. I'll merge and releaese asap.
+
+In the repo there's a requirements-dev.txt which is mostly the libs used in the examples.
+
+requirements.txt are the libs used for packaging just the lib.
+
+See also the CONTRIBUTING.md
+
+### running examples
+
+```bash
+. venv/bin/activate
+pip install -r requirements-dev.txt
+cd examples
+python lifecalendar.py
+```
+
+### run tests
+
+There are tests used during dev. They are useful as code examples and to see what still needs doing.
+
+See Makefile to run all tests:
+
+```bash
+make test # default tests ubuntu. so will fail on window when terminal test runs. comment out locally if that's the case
+```
+
+or to test a single function:
+
+```bash
+python -m unittest tests.test_javascript.TestCase.test_javascript_array
+python -m unittest tests.test_dQuery.TestCase.test_addClass
+python -m unittest tests.test_geom.TestCase.test_vec2
+python3 -m unittest tests.test_cmd.TestCase.test_cmd_dir # only windows
+```
+
+or to test a whole module
+
+```bash
+python -m unittest tests.test_html
+python -m unittest tests.test_CDN
+```
+
+to see coverage
+
+```bash
+coverage run -m unittest discover tests/
+coverage report
+```
+
+or...
+
+```bash
+pip install pytest
+pytest tests
+```
+
+
+### Disclaimer
+
+There's several more widely supported libraries doing HTML generation, DOM reading/manipulation, terminal wrappers etc. Maybe use one of those for production due to strictness and support.
+
+This is more of a fast prototyping library.
+
+
+
+
+%package help
+Summary: Development documents and examples for domonic
+Provides: python3-domonic-doc
+%description help
+<h1 align="center">
+ <br>𖤐 domonic 𖤐<br>
+</h1>
+
+[![PyPI version](https://badge.fury.io/py/domonic.svg)](https://badge.fury.io/py/domonic.svg)
+[![Downloads](https://pepy.tech/badge/domonic)](https://pepy.tech/project/domonic)
+[![Python version](https://img.shields.io/pypi/pyversions/domonic.svg?style=flat)](https://img.shields.io/pypi/pyversions/domonic.svg?style=flat)
+[![Build status](https://travis-ci.com/byteface/domonic.svg?branch=master)](https://travis-ci.com/byteface/domonic.svg?branch=master)
+[![Python package](https://github.com/byteface/domonic/actions/workflows/python-package.yml/badge.svg?branch=master)](https://github.com/byteface/domonic/actions/workflows/python-package.yml)
+
+#### A DOM for making HTML with python 3! (and more)
+
+### Install
+
+```bash
+python3 -m pip install domonic
+# python3 -m pip install domonic --upgrade
+```
+
+## Creating HTML with Python 3
+
+```python
+from domonic.html import *
+print(html(body(h1('Hello, World!'))))
+# <html><body><h1>Hello, World!</h1></body></html>
+```
+
+or to pretty format and insert the doctype, use an f-string:
+
+```python
+mydom = html(body(h1('Hello, World!'), a("somelink", _href="somepage.html")))
+print(f"{mydom}")
+```
+
+```html
+<!DOCTYPE html>
+<html>
+ <body>
+ <h1>Hello, World!</h1>
+ <a href="somepage.html">somelink</a>
+ </body>
+</html>
+```
+
+### parsing html
+
+Basic useage...
+
+```bash
+from domonic import domonic
+mydom = domonic.parseString('<somehtml...')
+```
+
+To quickly parse a webapge try the window module...
+
+```bash
+from domonic.window import window
+window.location = "http://www.google.com"
+print(window.document.title)
+```
+
+Also try the xpath or css selectors on command line...
+
+```bash
+domonic -x https://google.com '//a' | uniq | sort
+```
+
+### More
+
+- [html](https://domonic.readthedocs.io/_modules/domonic/html.html) : Generate html with python 3 😎
+- [dom](https://domonic.readthedocs.io/_modules/domonic/dom.html) : DOM API in python 3 😲
+- [javascript](https://domonic.readthedocs.io/_modules/domonic/javascript.html) : js API in python 3 😳 + ([dQuery](https://domonic.readthedocs.io/packages/dQuery.html), [d3](https://domonic.readthedocs.io/packages/d3.html))
+- JSON : utils for loading / decorating / transforming
+- SVG || mathml || aframe || x3d tags - generators for popular tags
+- terminal || cmd : call terminal commands with python3 😱
+
+See the [docs/code](https://domonic.readthedocs.io/) for more features...
+
+or examples in the [repo...](https://github.com/byteface/domonic/tree/master/examples)
+
+
+### Namespace
+
+Use the tags packaage if you want a namespace. i.e.
+
+```python
+import domonic.tags
+print(domonic.tags.h1)
+# or
+import domonic.tags as tags
+str(tags.div)
+# or
+import domonic.tags as html
+print(html.span)
+```
+
+or just import what you need...
+
+```python
+from domonic import div, span, input as myinput, html as root
+```
+
+### html attributes
+
+prepend attributes with an underscore ( avoids clashing with python keywords )
+
+```python
+test = label(_class='classname', _for="someinput")
+print(test)
+```
+
+```html
+<label class="classname" for="someinput"></label>
+```
+
+### rendering DOM objects
+
+domonic is a pure python dom whos tree is composed of objects. i.e
+
+```python
+div()
+# <domonic.html.div object at 0x106b0e6b0>
+```
+
+cast str() on any element to render it without formatting.
+
+```python
+el = str(div())
+print(el)
+# <div></div>
+```
+
+There's also a render method that takes 2 parameters, some domonic and an optional output file.
+
+```python
+page = div(span('Hello World'))
+render(f"{page}", 'index.html') # notice use of f-string to pretty print the html
+```
+
+There's a few new rendering options. See DOMConfig.
+
+```python
+from domonic.dom import DOMConfig
+print(DOMConfig.GLOBAL_AUTOESCAPE) # Default False
+print(DOMConfig.RENDER_OPTIONAL_CLOSING_TAGS) # Default True
+print(DOMConfig.RENDER_OPTIONAL_CLOSING_SLASH) # Defaults True
+print(DOMConfig.SPACE_BEFORE_OPTIONAL_CLOSING_SLASH) # Default False
+```
+
+## DOM
+
+DOM manipulation with python.
+
+### createElement
+
+to create your own elements use the DOM API
+
+```python
+from domonic.dom import *
+
+site = html()
+el = document.createElement('myelement')
+site.appendChild(el)
+print(site)
+# <html><myelement></myelement></html>
+
+```
+
+There's an evolving DOM API. To learn more about the webAPI [click here](https://developer.mozilla.org/en-US/docs/Web/API).
+
+And check the [code/docs](https://domonic.readthedocs.io/) to see what's currently been implemented.
+
+```python
+mysite.querySelectorAll('button')
+mysite.querySelectorAll("a[rel=nofollow]")
+mysite.querySelectorAll("a[href='#services']")
+mysite.querySelectorAll("a[href$='technology']")
+mysite.querySelectorAll('.fa-twitter')
+
+somelinks = mysite.querySelectorAll("a[href*='twitter']")
+for l in somelinks:
+ print(l.href)
+```
+
+To use the DOM either reference your root 'html' node or import the dom modules global 'document'
+
+```python
+
+# access the document via the html tag
+mydom = html()
+# mydom.getElementbyID...
+
+# or by importing the document global
+from domonic.dom import document
+# document.createElement...
+print(document)
+```
+
+### javascript
+
+There is a javascript package that mimics the js API:
+
+```python
+from domonic.javascript import Math
+print(Math.random())
+
+from domonic.javascript import Array
+myArr=Array(1,2,3)
+print(myArr.splice(1))
+# [2, 3]
+
+from domonic.javascript import URL
+url = URL('https://somesite.com/blog/article-one#some-hash')
+print(url.protocol) # https
+print(url.host) # somesite.com
+print(url.pathname) # /blog/article-one
+print(url.hash) # #some-hash
+
+# Use Global class to import all the js methods from the global namespace i.e
+# from domonic.javascript import Global
+# Global.decodeURIComponent(...
+# Global.encodeComponent(...
+# Global.setInterval(...
+
+# from domonic.javascript import Date, String, Number
+# etc..
+```
+
+Use setInterval and clearInterval with params
+
+```python
+from domonic.javascript import setInterval, clearInterval
+
+x=0
+
+def hi(inc):
+ global x
+ x = x+inc
+ print(x)
+
+test = setInterval(hi, 1000, 2)
+import time
+time.sleep(5)
+clearInterval(test)
+print(f"Final value of x:{x}")
+```
+
+Or for a single delayed function call use setTimeout, clearTimeout
+
+```python
+from domonic.javascript import setTimeout, clearTimeout
+timeoutID = setTimeout(hi, 1000)
+```
+
+You can call ```()``` on a stringvar to transform it into a Node
+
+```python
+from domonic.javascript import String
+
+test = String("Hi there!")
+test('div', _style="font-color:red;")
+str(test('div', _style="font-color:red;"))
+# <div style="font-color:red;">Hi there!</div>
+```
+
+a-tags inherit URL:
+
+```python
+from domonic.html import *
+
+atag = a(_href="https://somesite.com:8000/blog/article-one#some-hash")
+print('href:', atag.href)
+# href: https://somesite.com:8000/blog/article-one#some-hash
+print('protocol:', atag.protocol)
+# protocol: https:
+print('port:', atag.port)
+# port: 8000
+
+atag.protocol = "http"
+atag.port = 8983
+print(atag)
+# <a href="http://somesite.com:8983/blog/article-one#some-hash">
+```
+
+For writing and using regular javascript, load from a src...
+
+```python
+script(_src="/docs/5.0/dist/js/bootstrap.bundle.min.js", _integrity="sha384-1234", _crossorigin="anonymous"),
+# <script src="/docs/5.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-1234" crossorigin="anonymous"></script>
+```
+
+or do inline js by opening triple quotes...
+
+```python
+script("""
+let itbe = ""
+"""),
+```
+
+### Styling
+
+Styling is supported. Styles get passed to the style tag on render...
+
+```python
+mytag = div("hi", _id="test")
+mytag.style.backgroundColor = "black"
+mytag.style.fontSize = "12px"
+print(mytag)
+# <div id="test" style="background-color:black;font-size:12px;">hi</div>
+```
+
+To use css use a link tag as you usually would...
+
+```python
+link(_href="styles.css", _rel="stylesheet"),
+```
+
+or use triple quotes to open style tag...
+
+```python
+style("""
+.placeholder-img {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+"""),
+```
+
+### decorators
+
+use decorators to wrap elements around function results
+
+```python
+from domonic.decorators import el
+
+@el(html, True)
+@el(body)
+@el(div)
+def test():
+ return 'hi!'
+
+print(test())
+# <html><body><div>hi!</div></body></html>
+
+# returns pyml objects so call str to render
+assert str(test()) == '<html><body><div>hi!</div></body></html>'
+```
+
+It returns the tag object by default. You can pass True as a second param to the decorator to return a rendered string instead. Also accepts strings as first param i.e. custom tags.
+
+### data-tags
+
+python doesn't allow hyphens in parameter names. so use variable keyword argument syntax for custom data-tags
+
+```python
+div("test", **{"_data-test":"test"} )
+# <div data-test="test">test</div>
+```
+
+or for example a colon...
+
+```python
+t = div( **{"_:test":"something"} )
+str(t)
+# <div :test="something"></div>
+```
+
+### JSON (utils)
+
+decorate any function that returns python objects to return json instead
+
+```python
+from domonic.decorators import as_json
+import domonic.JSON as JSON
+
+@as_json
+def somefunc():
+ myObj = {"hi":[1,2,3]}
+ return myObj
+
+print( somefunc() )
+# {"hi":[1,2,3]}
+print( JSON.is_json(somefunc()) )
+# True
+```
+
+convert json arrays into html tables...
+
+```python
+import domonic.JSON as JSON
+
+# i.e. containting flat json array of dicts... [{"id":"01","name": "some item"},{"id":"02","name": "some other item"}]
+
+json_data = JSON.parse_file('somefile.json')
+mytable = JSON.tablify(json_data)
+print(mytable)
+```
+
+convert json arrays into csv files...
+
+```python
+import domonic.JSON as JSON
+
+json_data = JSON.parse_file('somefile.json')
+JSON.csvify(json_data, 'data.csv')
+```
+
+convert csv files to json...
+
+```python
+import domonic.JSON as JSON
+
+json_data =JSON.csv2json("data.csv")
+print(json_data)
+```
+
+more to come...
+
+### SVG
+
+All tags extend 'Element'. So will have DOM and magic methods available to them. See the [docs](https://domonic.readthedocs.io/).
+
+```python
+circ = svg(
+ circle(_cx="50", _cy="50", _r="40", _stroke="green", **{"_stroke-width": "4"}, _fill="yellow"),
+ _width="100", _height="100",
+)
+mysvg = svg()
+mysvg.appendChild(circ / 10)
+print(mysvg)
+```
+
+### Tweening
+
+Tween values with the tween library:
+
+```python
+from domonic.lerpy.easing import *
+from domonic.lerpy.tween import *
+
+someObj = {'x':0,'y':0,'z':0}
+twn = Tween( someObj, { 'x':10, 'y':5, 'z':3 }, 6, Linear.easeIn )
+twn.start()
+```
+
+### aframe / x3d
+
+3d tags can be used if you import the js
+
+```python
+from domonic.html import *
+from domonic.xml.aframe import *
+from domonic.CDN import *
+
+_scene = scene(
+ box(_position="-1 0.5 -3", _rotation="0 45 0", _color="#4CC3D9"),
+ sphere(_position="0 1.25 -5", _radius="1.25", _color="#EF2D5E"),
+ cylinder(_position="1 0.75 -3", _radius="0.5", _height="1.5", _color="#FFC65D"),
+ plane(_position="0 0 -4", _rotation="-90 0 0", _width="4", _height="4", _color="#7BC8A4"),
+ sky(_color="#ECECEC")
+ )
+
+_webpage = html(head(),body(
+ script(_src=CDN_JS.AFRAME_1_2), # < NOTICE you need to import aframe to use it
+ str(_scene)
+ )
+)
+
+render( _webpage, 'hello.html' )
+```
+
+### dQuery (NEW)
+
+dQuery uses the º symbol (alt+0).
+
+```python
+from domonic.html import *
+from domonic.dQuery import º
+
+d = html(head(body(li(_class='things'), div(_id="test"))))
+
+print( º('#test') )
+# <div id="test">
+print( º('.things') )
+# <li class="things">
+mydiv = º('<div class="test2"></div>')
+# <domonic.dQuery.o object at 0x107d5c9a0>
+
+b = º('#test').append(mydiv)
+print(b)
+# <div id="test"><div class="test2"></div></div>
+```
+
+Only recently started so check to see what's implemented.
+
+### terminal
+
+There is a command line package that can call bash/unix/posix and other apps on the command line:
+
+This package only works on nix systems as it effectively just passes stuff off to subprocess.
+
+```python
+from domonic.terminal import *
+
+print(ls())
+print(ls("-al"))
+print(ls("../"))
+print(pwd())
+print(mkdir('somedir'))
+print(touch('somefile'))
+print(git('status'))
+
+for file in ls( "-al" ):
+ print("Line : ", file)
+
+for f in ls():
+ try:
+ print(f)
+ print(cat(f))
+ except Exception as e:
+ pass
+
+for i, l in enumerate(cat('LICENSE.txt')):
+ print(i,l)
+
+print(man("ls"))
+print(echo('test'))
+print(df())
+print(du())
+
+for thing in du():
+ print(thing)
+
+print(find('.'))
+# print(ping('eventual.technology'))# < TODO - need to strean output
+print(cowsay('moo'))
+print(wget('eventual.technology'))
+print(date())
+print(cal())
+```
+
+or just run arbitrary commands...
+
+```python
+from domonic.terminal import command
+command.run("echo hi")
+```
+
+Take a look at the code in 'terminal.py' to see all the commands as there's loads. (Disclaimer: not all tested.)
+
+Windows users can use now use cmd.
+
+```python
+from domonic.cmd import *
+print(dir())
+print(dir("..\\"))
+```
+
+### DOCS
+
+[https://domonic.readthedocs.io/](https://domonic.readthedocs.io/)
+
+### CLI
+
+Use the command line interface to help you out.
+
+To view the online the docs:
+
+```python
+domonic -h
+```
+
+To see the version:
+
+```bash
+domonic -v
+```
+
+To quickly create a domonic project for prototyping:
+
+```bash
+domonic -p myproject
+```
+
+To evaluate some domonic pyml:
+
+```bash
+domonic -e 'html(head(),body(div()))'
+```
+
+To use xpath on a website from the command line:
+
+```bash
+domonic -x https://google.com '//a'
+```
+
+To use css selectors on a website from the command line:
+
+```bash
+domonic -q https://google.com 'a'
+```
+
+### EXAMPLE PROJECTS
+
+[Blueberry](https://github.com/byteface/Blueberry/) : A browser based file OS. Working example of how components can work.
+
+[ezcron](https://github.com/byteface/ezcron/) : A cron viewer
+
+[bombdisposer](https://github.com/byteface/bombdisposer/) : A basic game
+
+[htmlx](https://github.com/byteface/htmlx/tree/master/htmlx) : A low dependency lightweight (DOM only) version of domonic
+
+Checkout [the docs](https://domonic.readthedocs.io/) for more examples i.e. generating sitemaps or using domonic with server frameworks like flask, django, sanic, fastapi and others.
+
+There's also several useage examples in the repo so pull and have a look.
+
+### Join-In
+
+Feel free to contribute if you find it useful. (I'd be grateful for help on all fronts)
+
+Email me, message me directly if you like or create a discussion on here. Or join the [discord](https://discord.gg/a9pSZv4V5f).
+
+If there are any methods you want that are missing or not complete yet or you think you can help make it better just update the code and send a pull request. I'll merge and releaese asap.
+
+In the repo there's a requirements-dev.txt which is mostly the libs used in the examples.
+
+requirements.txt are the libs used for packaging just the lib.
+
+See also the CONTRIBUTING.md
+
+### running examples
+
+```bash
+. venv/bin/activate
+pip install -r requirements-dev.txt
+cd examples
+python lifecalendar.py
+```
+
+### run tests
+
+There are tests used during dev. They are useful as code examples and to see what still needs doing.
+
+See Makefile to run all tests:
+
+```bash
+make test # default tests ubuntu. so will fail on window when terminal test runs. comment out locally if that's the case
+```
+
+or to test a single function:
+
+```bash
+python -m unittest tests.test_javascript.TestCase.test_javascript_array
+python -m unittest tests.test_dQuery.TestCase.test_addClass
+python -m unittest tests.test_geom.TestCase.test_vec2
+python3 -m unittest tests.test_cmd.TestCase.test_cmd_dir # only windows
+```
+
+or to test a whole module
+
+```bash
+python -m unittest tests.test_html
+python -m unittest tests.test_CDN
+```
+
+to see coverage
+
+```bash
+coverage run -m unittest discover tests/
+coverage report
+```
+
+or...
+
+```bash
+pip install pytest
+pytest tests
+```
+
+
+### Disclaimer
+
+There's several more widely supported libraries doing HTML generation, DOM reading/manipulation, terminal wrappers etc. Maybe use one of those for production due to strictness and support.
+
+This is more of a fast prototyping library.
+
+
+
+
+%prep
+%autosetup -n domonic-0.9.11
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-domonic -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Fri May 05 2023 Python_Bot <Python_Bot@openeuler.org> - 0.9.11-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..677ad48
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+7fe342cabb04e50823b5688d45cf0dde domonic-0.9.11.tar.gz