SVG_LIB
Este es un modulo simple para crear archivos SVG empleando el lenguaje crystal-lang.
La idea principal es contar con una librería en el lenguaje que permita generar imágenes de alta calidad, mediante una interfaz sencilla a SVG.
Primeros pasos
Requisitos Previos
Los requisitos para utilizar la librería son:
- Crystal 0.35.1
- OS Linux (probado en Manjaro)
Instalación
Clonando el repositorio
Para instalar la librería se puede copiar directamente el repositorio:
git clone https://gitlab.com/nifr91/svg-lib.git svg-lib
Finalmente se debe hacer referencia al archivo src/svg-lib.cr
en
la aplicación e.g
# myapp.cr
require "./svg-lib/src/svg-lib.cr"
Shards
Alternativamente se puede instalar empleando el gestor de
dependencias Shards. Para ello se añade la dependencia al archivo
shard.yml
# shards.yml
dependencies:
svg-lib:
git: https://gitlab.com/nifr91/svg-lib.git
branch: master
se instala ejecutando el comando
shards install
Finalmente se incluye la librería en la aplicación e.g
# myapp.cr
require "svg-lib"
Uso
Se tiene la intención que el crear una imagen empleando el módulo sea similar a crear un SVG. Para cada elemento del SVG se tiene genera una instancia de la clase que lo representa.
Por ejemplo el código SVG:
<svg viewBox="0 0 10 10" xmls="https://www.w3.org/2000/svg/" version="1.1" >
<circle fill="black" cx="5" cy="5" r="2"></circle>
<svg>
Corresponde a el código en Crystal:
SVG.build(viewBox: ViewBox.new(0.0,0.0,10.0,10.0)) do |svg|
svg.push Circle.new(cx: 5.0, cy: 5.0, r: 2.0,fill: Color::BLACK)
end
Código mínimo
El código mínimo que crea un SVG con un circulo y lo imprime a STDOUT es :
# example.cr
require "svg-lib"
include SVG_LIB
STDOUT << SVG.build(viewBox: ViewBox.new(0.0,0.0,10.0,10.0)) do |svg|
svg.push Circle.new(cx: 5.0, cy: 5.0, r: 2.0,fill: Color::BLACK)
end
Ejemplo
El siguiente código genera un icono para la librería:
# example.cr
require "svg-lib"
include SVG_LIB
svg = SVG.build(viewBox: ViewBox.new(0.0,0.0,50.0,50.0)) do |svg|
svg.push Path.new(stroke: Color::BLACK, fill: Paint::NONE).
absolute.move(x:10.0,y:5.0).h_line(34.0).line(x: 40.0, y: 11.0).
v_line(45.0).h_line(10.0).close
svg.push Path.new(stroke: Color::BLACK,stroke_width: 0.25,fill: Color::BLACK).
absolute.move(x: 34.0, y: 5.0).relative.line(x: 6.0, y: 6.0).h_line(-6.0).
close
svg.push Text.new(text: "SVG_LIB", x: 25.0, y: 16.0,
font_size: 5.0, text_anchor: Text_anchor::MIDDLE)
svg.push( G.build(transform: Transform.new.translate(x: 15.0, y: 32.0)) do |g|
line_style = { stroke: Color::GRAY, stroke_width: 0.5,
stroke_dasharray: Stroke_dasharray.new(1,1)}
p1,p2 = {9.0, -10.0},{13.0, 10.0}
sp,ep = {0.0,0.0},{20.0,0.0}
g.push Line.new(**line_style,
x1: sp[0], y1: sp[1], x2: p1[0], y2: p1[1])
g.push Line.new(**line_style,
x1: ep[0], y1: ep[1], x2: p2[0], y2: p2[1])
g.push Path.new(stroke: Color::BLACK, fill: Paint::NONE).
absolute.move(x: sp[0],y: sp[1]).
c_curve(x1: p1[0], y1: p1[1], x2: p2[0], y2: p2[1], x: ep[0], y: ep[1])
g.push Circle.new(cx: p1[0], cy: p1[1], r: 1, fill: Color::GRAY )
g.push Circle.new(cx: p2[0], cy: p2[1], r: 1, fill: Color::GRAY )
g.push Circle.new(cx: sp[0], cy: sp[1], r: 1 )
g.push Circle.new(cx: ep[0], cy: ep[1], r: 1 )
end)
end
svg.save "image.svg"
y da como resultado
Autor
Ricardo Nieto Fuentes
Licencia
El proyecto esta licenciado la licencia MIT - ver LICENSE.md para mas detalles