Skip to content

Generate beautiful SVG patterns from a string on Lua (5.1 - 5.4 and LuaJIT)

Notifications You must be signed in to change notification settings

azoyan/geopattern

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 

Repository files navigation

geopattern

geopattern example

Lua implemenation of geopatterns (Ruby library) by Jason Long.

Generate beautiful SVG patterns from a string.

Installation

git clone https://github.com/azoyan/geopattern.git

Usage

Create a new pattern by calling GeoPattern:new() with a string and a generator (the result of this string/generator pair is the above image).

local GeoPattern = require "geopattern"

local geo = GeoPattern:new("GitHub")
print(geo:toSvg())

API

GeoPattern:new(string, options)

Returns a newly-generated, tiling SVG Pattern.

  • string Will be hashed using the SHA1 algorithm, and the resulting hash will be used as the seed for generation.

  • options.color Specify an exact background color. This is a CSS hexadecimal color value.

  • options.baseColor Controls the relative background color of the generated image. The color is not identical to that used in the pattern because the hue is rotated by the generator. This is a CSS hexadecimal color value, which defaults to #933c3c.

  • options.generator Determines the pattern. All of the original patterns are available in this port, and their names are camelCased.

    Available Patterns:

    • "octogons"
    • "overlappingCircles"
    • "plusSigns"
    • "xes'"
    • "sineWaves"
    • "hexagons"
    • "overlappingRings"
    • "plaid"
    • "triangles"
    • "squares"
    • "concentricCircles"
    • "diamonds"
    • "tessellation"
    • "nestedSquares'"
    • "mosaicSquares"
    • "chevrons"
local GeoPattern = require "geopattern"

local pattern1 = GeoPattern:new("GitHub") -- without options 
local pattern3 = GeoPattern:new("GitHub", { color = "#00ffff" })
local pattern2 = GeoPattern:new("GitHub", { generator = "concentricCircles" })

local options = {
    generator = "concentricCircles",
    color = "#00ffff", 
    baseColor = "#af39b3"
}
local pattern4 = GeoPattern:new("GitHub", options) -- with all available options

GeoPattern:toSvg()

Returns the SVG string representing the pattern.

local GeoPattern = require "geopattern"

local pattern = GeoPattern:new("GitHub")
local svg = pattern:toSvg() -- string in SVG format

print(svg)

Output:

<svg xmlns="http://www.w3.org/2000/svg" width="160" height="160"><rect x="0" y="0" width="100%" height="100%"  fill="rgb(69, 93, 137)"/><rect x="0" y="0" width="26.666666666667" height="26.666666666667"  fill-opacity="0.063333333333333" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="26" y="0" width="26.666666666667" height="26.666666666667"  fill-opacity="0.054666666666667" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="53" y="0" width="26.666666666667" height="26.666666666667"  fill-opacity="0.054666666666667" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="80" y="0" width="26.666666666667" height="26.666666666667"  fill-opacity="0.037333333333333" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="106" y="0" width="26.666666666667" height="26.666666666667"  fill-opacity="0.14133333333333" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="133" y="0" width="26.666666666667" height="26.666666666667"  fill-opacity="0.037333333333333" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="0" y="26" width="26.666666666667" height="26.666666666667"  fill-opacity="0.11533333333333" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="26" y="26" width="26.666666666667" height="26.666666666667"  fill-opacity="0.072" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="53" y="26" width="26.666666666667" height="26.666666666667"  fill-opacity="0.054666666666667" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="80" y="26" width="26.666666666667" height="26.666666666667"  fill-opacity="0.15" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="106" y="26" width="26.666666666667" height="26.666666666667"  fill-opacity="0.10666666666667" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="133" y="26" width="26.666666666667" height="26.666666666667"  fill-opacity="0.02" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="0" y="53" width="26.666666666667" height="26.666666666667"  fill-opacity="0.098" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="26" y="53" width="26.666666666667" height="26.666666666667"  fill-opacity="0.080666666666667" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="53" y="53" width="26.666666666667" height="26.666666666667"  fill-opacity="0.072" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="80" y="53" width="26.666666666667" height="26.666666666667"  fill-opacity="0.054666666666667" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="106" y="53" width="26.666666666667" height="26.666666666667"  fill-opacity="0.11533333333333" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="133" y="53" width="26.666666666667" height="26.666666666667"  fill-opacity="0.098" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="0" y="80" width="26.666666666667" height="26.666666666667"  fill-opacity="0.15" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="26" y="80" width="26.666666666667" height="26.666666666667"  fill-opacity="0.063333333333333" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="53" y="80" width="26.666666666667" height="26.666666666667"  fill-opacity="0.098" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="80" y="80" width="26.666666666667" height="26.666666666667"  fill-opacity="0.046" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="106" y="80" width="26.666666666667" height="26.666666666667"  fill-opacity="0.089333333333333" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="133" y="80" width="26.666666666667" height="26.666666666667"  fill-opacity="0.072" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="0" y="106" width="26.666666666667" height="26.666666666667"  fill-opacity="0.080666666666667" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="26" y="106" width="26.666666666667" height="26.666666666667"  fill-opacity="0.14133333333333" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="53" y="106" width="26.666666666667" height="26.666666666667"  fill-opacity="0.063333333333333" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="80" y="106" width="26.666666666667" height="26.666666666667"  fill-opacity="0.098" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="106" y="106" width="26.666666666667" height="26.666666666667"  fill-opacity="0.10666666666667" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="133" y="106" width="26.666666666667" height="26.666666666667"  fill-opacity="0.098" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="0" y="133" width="26.666666666667" height="26.666666666667"  fill-opacity="0.080666666666667" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="26" y="133" width="26.666666666667" height="26.666666666667"  fill-opacity="0.037333333333333" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="53" y="133" width="26.666666666667" height="26.666666666667"  fill-opacity="0.098" stroke="#000" stroke-opacity="0.02" fill="#222"/><rect x="80" y="133" width="26.666666666667" height="26.666666666667"  fill-opacity="0.037333333333333" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="106" y="133" width="26.666666666667" height="26.666666666667"  fill-opacity="0.124" stroke="#000" stroke-opacity="0.02" fill="#ddd"/><rect x="133" y="133" width="26.666666666667" height="26.666666666667"  fill-opacity="0.089333333333333" stroke="#000" stroke-opacity="0.02" fill="#ddd"/></svg>

GeoPattern:toBase64()

Returns Base64-encoded string representing the pattern.

local GeoPattern = require "geopattern"

local pattern = GeoPattern:new("GitHub")
local base64 = pattern:toBae64() -- encode to Base64 string

print(base64)

Output:

PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNjAiIGhlaWdodD0iMTYwIj48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiAgZmlsbD0icmdiKDY5LCA5MywgMTM3KSIvPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjA2MzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iIzIyMiIvPjxyZWN0IHg9IjI2IiB5PSIwIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wNTQ2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSI1MyIgeT0iMCIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMDU0NjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiBmaWxsPSIjZGRkIi8+PHJlY3QgeD0iODAiIHk9IjAiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjAzNzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iI2RkZCIvPjxyZWN0IHg9IjEwNiIgeT0iMCIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMTQxMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSIxMzMiIHk9IjAiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjAzNzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iI2RkZCIvPjxyZWN0IHg9IjAiIHk9IjI2IiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4xMTUzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iIzIyMiIvPjxyZWN0IHg9IjI2IiB5PSIyNiIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMDcyIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiBmaWxsPSIjZGRkIi8+PHJlY3QgeD0iNTMiIHk9IjI2IiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wNTQ2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSI4MCIgeT0iMjYiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiBmaWxsPSIjMjIyIi8+PHJlY3QgeD0iMTA2IiB5PSIyNiIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMTA2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSIxMzMiIHk9IjI2IiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wMiIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iI2RkZCIvPjxyZWN0IHg9IjAiIHk9IjUzIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wOTgiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiMyMjIiLz48cmVjdCB4PSIyNiIgeT0iNTMiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjA4MDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iIzIyMiIvPjxyZWN0IHg9IjUzIiB5PSI1MyIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMDcyIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiBmaWxsPSIjZGRkIi8+PHJlY3QgeD0iODAiIHk9IjUzIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wNTQ2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSIxMDYiIHk9IjUzIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4xMTUzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iIzIyMiIvPjxyZWN0IHg9IjEzMyIgeT0iNTMiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjA5OCIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iIzIyMiIvPjxyZWN0IHg9IjAiIHk9IjgwIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4xNSIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iIzIyMiIvPjxyZWN0IHg9IjI2IiB5PSI4MCIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMDYzMzMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiBmaWxsPSIjMjIyIi8+PHJlY3QgeD0iNTMiIHk9IjgwIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wOTgiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiMyMjIiLz48cmVjdCB4PSI4MCIgeT0iODAiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjA0NiIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iIzIyMiIvPjxyZWN0IHg9IjEwNiIgeT0iODAiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjA4OTMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iI2RkZCIvPjxyZWN0IHg9IjEzMyIgeT0iODAiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjA3MiIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iI2RkZCIvPjxyZWN0IHg9IjAiIHk9IjEwNiIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMDgwNjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiBmaWxsPSIjMjIyIi8+PHJlY3QgeD0iMjYiIHk9IjEwNiIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMTQxMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSI1MyIgeT0iMTA2IiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wNjMzMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiMyMjIiLz48cmVjdCB4PSI4MCIgeT0iMTA2IiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wOTgiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiMyMjIiLz48cmVjdCB4PSIxMDYiIHk9IjEwNiIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMTA2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSIxMzMiIHk9IjEwNiIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMDk4IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiBmaWxsPSIjMjIyIi8+PHJlY3QgeD0iMCIgeT0iMTMzIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wODA2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiMyMjIiLz48cmVjdCB4PSIyNiIgeT0iMTMzIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSI1MyIgeT0iMTMzIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wOTgiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiMyMjIiLz48cmVjdCB4PSI4MCIgeT0iMTMzIiB3aWR0aD0iMjYuNjY2NjY2NjY2NjY3IiBoZWlnaHQ9IjI2LjY2NjY2NjY2NjY2NyIgIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIGZpbGw9IiNkZGQiLz48cmVjdCB4PSIxMDYiIHk9IjEzMyIgd2lkdGg9IjI2LjY2NjY2NjY2NjY2NyIgaGVpZ2h0PSIyNi42NjY2NjY2NjY2NjciICBmaWxsLW9wYWNpdHk9IjAuMTI0IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiBmaWxsPSIjZGRkIi8+PHJlY3QgeD0iMTMzIiB5PSIxMzMiIHdpZHRoPSIyNi42NjY2NjY2NjY2NjciIGhlaWdodD0iMjYuNjY2NjY2NjY2NjY3IiAgZmlsbC1vcGFjaXR5PSIwLjA4OTMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgZmlsbD0iI2RkZCIvPjwvc3ZnPg==

About

Generate beautiful SVG patterns from a string on Lua (5.1 - 5.4 and LuaJIT)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages