diff options
| author | Fuwn <[email protected]> | 2024-05-14 06:37:52 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2024-05-14 06:37:52 +0000 |
| commit | 71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3 (patch) | |
| tree | fc3dec26c9280af36357100e33a30bf29998b908 /src/svg.gleam | |
| download | mayu-71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3.tar.xz mayu-71a9af2b1d79f2bdd70de171aa77e2f9ccd638a3.zip | |
feat: initial release
Diffstat (limited to 'src/svg.gleam')
| -rw-r--r-- | src/svg.gleam | 96 |
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>" +} |