summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJovansonlee Cesar <ivanceras@gmail.com>2018-07-31 05:24:12 +0800
committerJovansonlee Cesar <ivanceras@gmail.com>2018-07-31 05:24:12 +0800
commit707fe5654522b1001095748633ec9721513101dd (patch)
tree001f695ecc77c0c9d14562279bc54b3554ae4aef
parent9390395f0ec5e5ac9442688136882f07a63711e8 (diff)
Add circle and open circle marker
-rw-r--r--svgbob/src/element.rs17
-rw-r--r--svgbob/src/focus_char.rs4
-rw-r--r--svgbob/src/fragments.rs10
-rw-r--r--svgbob/src/grid.rs43
-rw-r--r--svgbob/src/properties.rs36
5 files changed, 88 insertions, 22 deletions
diff --git a/svgbob/src/element.rs b/svgbob/src/element.rs
index f82dbb9..76ee05d 100644
--- a/svgbob/src/element.rs
+++ b/svgbob/src/element.rs
@@ -16,7 +16,7 @@ use loc::Loc;
use element::{
Stroke::{Solid,Dashed},
ArcFlag::{Minor,Major},
- Feature::{Arrow,ArrowStart,Circle},
+ Feature::{Arrow,ArrowStart,Circle,OpenCircle},
};
use unicode_width::UnicodeWidthStr;
@@ -40,6 +40,7 @@ pub enum Feature {
ArrowStart, // start arrow
Arrow, //end
Circle, //start
+ OpenCircle, //start
}
@@ -69,6 +70,14 @@ pub fn dashed_line(a: &Point, b: &Point) -> Element {
Element::Line(a.clone(), b.clone(), Dashed, vec![])
}
+pub fn circle_start_line(a: &Point, b: &Point) -> Element {
+ Element::Line(a.clone(), b.clone(), Solid, vec![Circle])
+}
+
+pub fn circle_open_line(a: &Point, b: &Point) -> Element {
+ Element::Line(a.clone(), b.clone(), Solid, vec![OpenCircle])
+}
+
pub fn solid_circle(c: &Point, r: f32) -> Element {
Element::Circle(c.clone(), r, "solid".to_string())
}
@@ -254,6 +263,9 @@ impl Element {
Circle => {
svg_line.assign("marker-start", "url(#circle)");
}
+ OpenCircle => {
+ svg_line.assign("marker-start", "url(#open_circle)");
+ }
};
}
match *stroke {
@@ -288,6 +300,9 @@ impl Element {
Circle => {
svg_arc.assign("marker-start", "url(#circle)");
}
+ OpenCircle => {
+ svg_arc.assign("marker-start", "url(#open_circle)");
+ }
};
}
SvgElement::Path(svg_arc)
diff --git a/svgbob/src/focus_char.rs b/svgbob/src/focus_char.rs
index d6e9a19..437d4a3 100644
--- a/svgbob/src/focus_char.rs
+++ b/svgbob/src/focus_char.rs
@@ -13,7 +13,7 @@ use point::Point;
use loc_block::LocBlock;
use element::Element;
use fragments::Fragment::Text;
-use element::{line,dashed_line,arrow_line,start_arrow_line,arc,open_circle,solid_circle,text};
+use element::{line,dashed_line,circle_start_line, circle_open_line,arrow_line,start_arrow_line,arc,open_circle,solid_circle,text};
use location::Location;
use settings::Settings;
use enhance::Enhance;
@@ -172,6 +172,8 @@ impl<'g> FocusChar<'g> {
let unit_x = self.loc_block().unit_x();
match frag {
Fragment::Line(p1, p2) => line(&self.point(&p1), &self.point(&p2)),
+ Fragment::CircleStartLine(p1, p2) => circle_start_line(&self.point(&p1), &self.point(&p2)),
+ Fragment::CircleOpenLine(p1, p2) => circle_open_line(&self.point(&p1), &self.point(&p2)),
Fragment::DashedLine(p1, p2) => dashed_line(&self.point(&p1), &self.point(&p2)),
Fragment::ArrowLine(p1, p2) => arrow_line(&self.point(&p1), &self.point(&p2)),
diff --git a/svgbob/src/fragments.rs b/svgbob/src/fragments.rs
index 15682d4..43649f6 100644
--- a/svgbob/src/fragments.rs
+++ b/svgbob/src/fragments.rs
@@ -1,4 +1,4 @@
-use self::Fragment::{Arc, ArrowLine, Line, DashedLine, OpenCircle, SolidCircle, StartArrowLine};
+use self::Fragment::{Arc, ArrowLine, Line, DashedLine, CircleStartLine, CircleOpenLine, OpenCircle, SolidCircle, StartArrowLine};
use point_block::PointBlock;
@@ -10,6 +10,8 @@ use point_block::PointBlock;
#[derive(Debug, Clone, PartialOrd, PartialEq, Ord, Eq)]
pub enum Fragment {
Line(PointBlock, PointBlock),
+ CircleStartLine(PointBlock, PointBlock),
+ CircleOpenLine(PointBlock, PointBlock),
DashedLine(PointBlock, PointBlock),
ArrowLine(PointBlock, PointBlock),
StartArrowLine(PointBlock, PointBlock), // the arrow is at the start marker
@@ -22,6 +24,12 @@ pub enum Fragment {
pub fn line(p1: &PointBlock, p2: &PointBlock) -> Fragment {
Line(p1.clone(), p2.clone())
}
+pub fn circle_start_line(p1: &PointBlock, p2: &PointBlock) -> Fragment {
+ CircleStartLine(p1.clone(), p2.clone())
+}
+pub fn circle_open_line(p1: &PointBlock, p2: &PointBlock) -> Fragment {
+ CircleOpenLine(p1.clone(), p2.clone())
+}
pub fn dashed_line(p1: &PointBlock, p2: &PointBlock) -> Fragment {
DashedLine(p1.clone(), p2.clone())
}
diff --git a/svgbob/src/grid.rs b/svgbob/src/grid.rs
index 184cbbb..f52bb8e 100644
--- a/svgbob/src/grid.rs
+++ b/svgbob/src/grid.rs
@@ -10,6 +10,7 @@ use svg::node::element::{
Path as SvgPath,
Rectangle as SvgRect,
Style,
+ Circle as SvgCircle,
};
use element::Element;
use pom::TextInput;
@@ -307,6 +308,8 @@ impl Grid {
fn get_defs() -> Definitions {
let mut defs = Definitions::new();
defs.append(arrow_marker());
+ defs.append(circle_marker());
+ defs.append(open_circle_marker());
defs
}
@@ -356,7 +359,6 @@ fn arrow_marker() -> Marker {
.set("viewBox", "0 0 50 20")
.set("refX", 15)
.set("refY", 10)
- .set("markerUnits", "strokeWidth")
.set("markerWidth", 10)
.set("markerHeight", 10)
.set("orient", "auto");
@@ -366,6 +368,45 @@ fn arrow_marker() -> Marker {
marker
}
+
+/// <marker id="dot" viewBox="0 0 10 10" refX="5" refY="5"
+/// markerWidth="5" markerHeight="5">
+/// <circle cx="5" cy="5" r="5" fill="red" />
+/// </marker>
+fn circle_marker() -> Marker {
+ let mut marker = Marker::new()
+ .set("id", "circle")
+ .set("viewBox", "0 0 20 20")
+ .set("refX", 10)
+ .set("refY", 10)
+ .set("markerWidth", 5)
+ .set("markerHeight", 5);
+
+ let mut circle = SvgCircle::new()
+ .set("cx",10)
+ .set("cy",10)
+ .set("r",8)
+ .set("fill","red");
+ marker.append(circle);
+ marker
+}
+fn open_circle_marker() -> Marker {
+ let mut marker = Marker::new()
+ .set("id", "open_circle")
+ .set("viewBox", "0 0 20 20")
+ .set("refX", 10)
+ .set("refY", 10)
+ .set("markerWidth", 5)
+ .set("markerHeight", 5);
+
+ let mut circle = SvgCircle::new()
+ .set("cx",10)
+ .set("cy",10)
+ .set("r",8)
+ .set("fill","green");
+ marker.append(circle);
+ marker
+}
//copied from https://github.com/rust-lang/rust/blob/master/src/librustdoc/html/escape.rs
//just adding for \0
pub fn svg_escape(arg: &str) -> String {
diff --git a/svgbob/src/properties.rs b/svgbob/src/properties.rs
index 2d977b5..0517c2e 100644
--- a/svgbob/src/properties.rs
+++ b/svgbob/src/properties.rs
@@ -5,7 +5,7 @@ use block::Block::{A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U
use point_block::PointBlock;
use fragments::Fragment;
-use fragments::{arc, arrow_line, line, open_circle, solid_circle, start_arrow_line, dashed_line};
+use fragments::{arc, arrow_line, line, circle_start_line, circle_open_line, open_circle, solid_circle, start_arrow_line, dashed_line};
use self::Signal::{Medium, Strong, Weak};
use box_drawing;
@@ -933,7 +933,7 @@ impl Properties for char {
}
//////////////////////
//
- // * asterisk
+ // * asterisk or star
//
//////////////////////
else if self.is('*') {
@@ -1013,14 +1013,14 @@ impl Properties for char {
],
intended_behavior: vec![],
properties: vec![
- (C, Medium, vec![line(m, c), solid_circle(m, 2)]),
- (W, Medium, vec![line(m, w), solid_circle(m, 2)]),
- (K, Medium, vec![line(m, k), solid_circle(m, 2)]),
- (O, Medium, vec![line(m, o), solid_circle(m, 2)]),
- (A, Medium, vec![line(m, a), solid_circle(m, 2)]),
- (E, Medium, vec![line(m, e), solid_circle(m, 2)]),
- (U, Medium, vec![line(m, u), solid_circle(m, 2)]),
- (Y, Medium, vec![line(m, y), solid_circle(m, 2)]),
+ (C, Medium, vec![circle_start_line(m, c)]),
+ (W, Medium, vec![circle_start_line(m, w)]),
+ (K, Medium, vec![circle_start_line(m, k)]),
+ (O, Medium, vec![circle_start_line(m, o)]),
+ (A, Medium, vec![circle_start_line(m, a)]),
+ (E, Medium, vec![circle_start_line(m, e)]),
+ (U, Medium, vec![circle_start_line(m, u)]),
+ (Y, Medium, vec![circle_start_line(m, y)]),
],
})
}
@@ -1106,14 +1106,14 @@ impl Properties for char {
],
intended_behavior: vec![],
properties: vec![
- (C, Medium, vec![line(h, c), open_circle(m, 2)]),
- (W, Medium, vec![line(r, w), open_circle(m, 2)]),
- (K, Medium, vec![open_circle(m, 2)]),
- (O, Medium, vec![open_circle(m, 2)]),
- (A, Medium, vec![line(g, a), open_circle(m, 2)]),
- (E, Medium, vec![line(i, e), open_circle(m, 2)]),
- (U, Medium, vec![line(q, u), open_circle(m, 2)]),
- (Y, Medium, vec![line(s, y), open_circle(m, 2)]),
+ (C, Medium, vec![circle_open_line(m, c)]),
+ (W, Medium, vec![circle_open_line(m, w)]),
+ (K, Medium, vec![circle_open_line(m, k)]),
+ (O, Medium, vec![circle_open_line(m, o)]),
+ (A, Medium, vec![circle_open_line(m, a)]),
+ (E, Medium, vec![circle_open_line(m, e)]),
+ (U, Medium, vec![circle_open_line(m, u)]),
+ (Y, Medium, vec![circle_open_line(m, y)]),
],
})
}