aboutsummaryrefslogtreecommitdiff
path: root/src/svg.gleam
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-05-14 06:37:52 +0000
committerFuwn <[email protected]>2024-05-14 06:37:52 +0000
commit71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3 (patch)
treefc3dec26c9280af36357100e33a30bf29998b908 /src/svg.gleam
downloadmayu-71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3.tar.xz
mayu-71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3.zip
feat: initial release
Diffstat (limited to 'src/svg.gleam')
-rw-r--r--src/svg.gleam96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/svg.gleam b/src/svg.gleam
new file mode 100644
index 0000000..317c2d8
--- /dev/null
+++ b/src/svg.gleam
@@ -0,0 +1,96 @@
+import gleam/bit_array
+import gleam/int
+import gleam/list
+import gleam/string_builder
+import image
+import simplifile
+
+type XmlImages {
+ XmlImages(xml: String, width: Int)
+}
+
+fn image(data, dimensions: image.ImageDimensions, width, extension) {
+ "<image
+ height=\"" <> int.to_string(dimensions.height) <> "\"
+ width=\"" <> int.to_string(dimensions.width) <> "\"
+ x=\"" <> int.to_string(width) <> "\"
+ y=\"0\"
+ xlink:href=\"data:image/" <> extension <> ";base64," <> bit_array.base64_encode(
+ data,
+ False,
+ ) <> "\"/>"
+}
+
+fn images(theme, digits, width, height, svgs) {
+ case digits {
+ [] -> XmlImages(string_builder.to_string(svgs), width)
+ [digit, ..rest] -> {
+ let extension = case theme {
+ "asoul" | "gelbooru" | "moebooru" | "rule34" | "urushi" -> "gif"
+ _ -> "png"
+ }
+
+ case
+ simplifile.read_bits(
+ from: "./themes/"
+ <> theme
+ <> "/"
+ <> int.to_string(digit)
+ <> "."
+ <> extension,
+ )
+ {
+ Ok(data) -> {
+ case image.get_image_dimensions(data) {
+ Ok(dimensions) ->
+ images(
+ theme,
+ rest,
+ width + dimensions.width,
+ int.max(height, dimensions.height),
+ string_builder.append(
+ svgs,
+ image(data, dimensions, width, extension),
+ ),
+ )
+ Error(_) -> XmlImages(string_builder.to_string(svgs), width)
+ }
+ }
+ Error(_) -> XmlImages(string_builder.to_string(svgs), width)
+ }
+ }
+ }
+}
+
+pub fn xml(theme, number) {
+ let xml =
+ images(
+ theme,
+ {
+ let assert Ok(digits) = int.digits(number, 10)
+ let digits_padding = 6 - list.length(digits)
+
+ case digits_padding {
+ n if n > 0 -> list.concat([list.repeat(0, digits_padding), digits])
+ _ -> digits
+ }
+ },
+ 0,
+ 0,
+ string_builder.new(),
+ )
+
+ "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
+ <svg
+ height=\"{height}\"
+ style=\"image-rendering: pixelated;\"
+ version=\"1.1\"
+ width=\"" <> int.to_string(xml.width) <> "\"
+ xmlns=\"http://www.w3.org/2000/svg\"
+ xmlns:xlink=\"http://www.w3.org/1999/xlink\"
+ >
+ <title>Mayu</title>
+
+ <g>" <> xml.xml <> "</g>
+ </svg>"
+}