diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6c904c7..3f1d2b6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,14 +1,49 @@
+### General guidelines
+
CONTRIBUTING.md
### Pixi
+This project is managed by [Pixi](https://pixi.prefix.dev/) with a single environment (`default`).
+
+We reproduce below the most relevant commands. For more, see [Pixi's Getting Started](https://pixi.prefix.dev/latest/getting_started/)
+
+#### Install the project
+
```bash
pixi install
pixi update
+```
+
+#### Run the tests
+
+```bash
pixi run test
pixi run test-lowest
pixi run lint
pixi run typecheck
pixi run full-ci
-pixi run graph-to-svg acyclic1
+```
+
+#### Run the example
+
+Turn a workflow into a SVG
+
+```
+pixi run graph-to-svg
+```
+
+If `workflow_name` is not given, `ewoksdraw` will use a test workflow.
+
+
+#### Add dependencies
+
+```bash
+pixi add
+```
+
+By default, this will install the conda package (if there is one). To install from PyPI:
+
+```bash
+pixi add --pypi
```
\ No newline at end of file
diff --git a/src/ewoksdraw/css_styles/css_background.css b/src/ewoksdraw/css_styles/css_background.css
index 11e262c..731832c 100644
--- a/src/ewoksdraw/css_styles/css_background.css
+++ b/src/ewoksdraw/css_styles/css_background.css
@@ -1,3 +1,3 @@
.background {
- fill: #000000;
+ fill: var(--bg-color);
}
\ No newline at end of file
diff --git a/src/ewoksdraw/css_styles/css_link_cubic_bezier.css b/src/ewoksdraw/css_styles/css_link_cubic_bezier.css
index e33e3ee..5cf1ab2 100644
--- a/src/ewoksdraw/css_styles/css_link_cubic_bezier.css
+++ b/src/ewoksdraw/css_styles/css_link_cubic_bezier.css
@@ -1,6 +1,6 @@
.link_cubic_bezier {
fill: none;
- stroke: #ffffff;
+ stroke: var(--stroke-color);
stroke-width: 1.5;
stroke-linecap: round;
stroke-linejoin: round;
diff --git a/src/ewoksdraw/css_styles/css_task_anchor_link.css b/src/ewoksdraw/css_styles/css_task_anchor_link.css
index 55465d3..ac61bfe 100644
--- a/src/ewoksdraw/css_styles/css_task_anchor_link.css
+++ b/src/ewoksdraw/css_styles/css_task_anchor_link.css
@@ -1,3 +1,3 @@
.task_anchor_link {
- fill: rgb(176, 147, 255);
+ fill: var(--link-color);
}
diff --git a/src/ewoksdraw/css_styles/css_task_box.css b/src/ewoksdraw/css_styles/css_task_box.css
index 4ffe920..0d9fe21 100644
--- a/src/ewoksdraw/css_styles/css_task_box.css
+++ b/src/ewoksdraw/css_styles/css_task_box.css
@@ -1,8 +1,7 @@
.task_box {
- fill: #00000000;
- stroke: rgb(255, 255, 255);
- stroke-width: 0.2%;
+ fill: var(--transparent);
+ stroke: var(--stroke-color);
+ stroke-width: var(--stroke-width);
rx: 0.5%;
ry: 0.5%;
}
-
diff --git a/src/ewoksdraw/css_styles/css_task_line.css b/src/ewoksdraw/css_styles/css_task_line.css
index 05a295b..040b56d 100644
--- a/src/ewoksdraw/css_styles/css_task_line.css
+++ b/src/ewoksdraw/css_styles/css_task_line.css
@@ -1,5 +1,4 @@
.task_line {
- stroke: #ffffff;
- stroke-width: 1;
- stroke-dasharray: none;
-}
\ No newline at end of file
+ stroke: var(--stroke-color);
+ stroke-width: var(--stroke-width);
+}
diff --git a/src/ewoksdraw/css_styles/css_task_text_io.css b/src/ewoksdraw/css_styles/css_task_text_io.css
index 613e90d..c975e92 100644
--- a/src/ewoksdraw/css_styles/css_task_text_io.css
+++ b/src/ewoksdraw/css_styles/css_task_text_io.css
@@ -1,4 +1,4 @@
.task_text_io {
font-family: Helvetica, sans-serif;
- fill: rgb(255, 255, 255);
+ fill: var(--text-color);
}
\ No newline at end of file
diff --git a/src/ewoksdraw/css_styles/css_task_title.css b/src/ewoksdraw/css_styles/css_task_title.css
index 7884b8b..e412024 100644
--- a/src/ewoksdraw/css_styles/css_task_title.css
+++ b/src/ewoksdraw/css_styles/css_task_title.css
@@ -1,4 +1,4 @@
.task_title {
font-family: Helvetica, sans-serif;
- fill: rgb(255, 255, 255);
+ fill: var(--text-color);
}
\ No newline at end of file
diff --git a/src/ewoksdraw/css_styles/root.css b/src/ewoksdraw/css_styles/root.css
new file mode 100644
index 0000000..41cc9c1
--- /dev/null
+++ b/src/ewoksdraw/css_styles/root.css
@@ -0,0 +1,8 @@
+.ewoksdraw {
+ --bg-color: rgb(0, 0, 0);
+ --link-color: rgb(176, 147, 255);
+ --stroke-color: rgb(255, 255, 255);
+ --stroke-width: 1;
+ --text-color: rgb(255, 255, 255);
+ --transparent: rgba(0, 0, 0, 0)
+}
\ No newline at end of file
diff --git a/src/ewoksdraw/svg/svg_canvas.py b/src/ewoksdraw/svg/svg_canvas.py
index e407e6b..ba4979d 100644
--- a/src/ewoksdraw/svg/svg_canvas.py
+++ b/src/ewoksdraw/svg/svg_canvas.py
@@ -12,6 +12,7 @@
from .svg_background import SvgBackground
from .svg_element import SvgElement
from .svg_group import SvgGroup
+from .utils import generate_style_element
Number = Union[int, float]
@@ -96,6 +97,7 @@ def _generate_xml_svg(self) -> Element:
width=str(self.width),
height=str(self.height),
)
+ xml_svg.set("class", "ewoksdraw")
style_elements = self._gather_all_styles()
seen_styles = set()
@@ -136,4 +138,7 @@ def _gather_all_styles(self) -> List[Element]:
for element in self.elements:
all_styles.extend(self._yield_styles(element))
- return all_styles
+ root_element = generate_style_element("root.css")
+ if root_element is None:
+ return all_styles
+ return [root_element, *all_styles]
diff --git a/src/ewoksdraw/svg/svg_element.py b/src/ewoksdraw/svg/svg_element.py
index 4e399b5..db86be0 100644
--- a/src/ewoksdraw/svg/svg_element.py
+++ b/src/ewoksdraw/svg/svg_element.py
@@ -1,10 +1,11 @@
import warnings
-from pathlib import Path
from typing import Literal
from typing import Optional
from typing import get_args
from xml.etree.ElementTree import Element
+from .utils import generate_style_element
+
SvgTag = Literal["rect", "circle", "text", "line", "path"]
SUPPORTED_TAGS: tuple[SvgTag, ...] = get_args(SvgTag)
@@ -125,12 +126,4 @@ def _load_css_style(self) -> Optional[Element]:
if not self._css_class:
return None
- css_file_path = Path(f"src/ewoksdraw/css_styles/css_{self._css_class}.css")
- if not css_file_path.exists():
- return None
-
- with open(css_file_path, "r") as css_file:
- css_content = css_file.read()
- style = Element("style")
- style.text = f""
- return style
+ return generate_style_element(css_file_name=f"css_{self._css_class}.css")
diff --git a/src/ewoksdraw/svg/svg_task.py b/src/ewoksdraw/svg/svg_task.py
index 421187e..ff6d579 100644
--- a/src/ewoksdraw/svg/svg_task.py
+++ b/src/ewoksdraw/svg/svg_task.py
@@ -53,7 +53,6 @@ def __init__(
list_io=output_names, io_type="output", vertical_spacing=8
)
self._line_title = SvgTaskLine(x1=0, y1=0, x2=0, y2=0)
-
self._init_elements()
def _init_elements(self) -> None:
diff --git a/src/ewoksdraw/svg/utils.py b/src/ewoksdraw/svg/utils.py
new file mode 100644
index 0000000..db523f5
--- /dev/null
+++ b/src/ewoksdraw/svg/utils.py
@@ -0,0 +1,16 @@
+from pathlib import Path
+from xml.etree.ElementTree import Element
+
+CSS_DIR = Path(__file__).parent.parent / "css_styles"
+
+
+def generate_style_element(css_file_name: str) -> None | Element:
+ css_file_path = CSS_DIR / css_file_name
+ if not css_file_path.exists():
+ return None
+
+ with open(css_file_path, "r") as css_file:
+ css_content = css_file.read()
+ style = Element("style")
+ style.text = f""
+ return style