An Interest In:
Web News this Week
- April 1, 2024
- March 31, 2024
- March 30, 2024
- March 29, 2024
- March 28, 2024
- March 27, 2024
- March 26, 2024
Open Source Adventures: Episode 20: Imba 2 ROT-N
I want to start porting Imba 1 apps to Imba 2 with the simplest one - ROT-N decoder. Here's Imba 1 version.
You either paste text into the box or use file upload, and then it decodes every ROT-N from ROT-1 to ROT-25. It's somewhat useful for elementary hacking challenges.
Imba 1 app.imba
There's very little complicated here. rot(n)
does the the rotating, upload
handles upload events, and render
renders the view.
tag App def setup @text = "Hello, world!" def rot(n) @text.replace /[a-z]/gi do |c| let i = c.charCodeAt(0) if i >= 97 and i <= 122 String.fromCharCode(((i - 97 + n) % 26) + 97) else if i >= 65 and i <= 90 String.fromCharCode(((i - 65 + n) % 26) + 65) else c def upload(event) let file = event.native:target:files[0] return unless file let reader = FileReader.new reader:onload = do |event| @text = event:target:result @error = nil Imba.commit reader.read-as-text(file) def render <self> <div.contents> <header> "ROT-N" <textarea[@text]> <div> <input#file type="file" :change.upload> <table> for i in [1..25] <tr .{"rot-{i}"}> <th> i <td> rot(i)Imba.mount <App>
Imba 1 app.scss
@import 'normalize-scss';@include normalize();.App { display: flex; justify-content: space-around; max-width: 1000px; margin: auto; header { font-size: 64px; text-align: center; } textarea { min-width: 50vw; min-height: 100px; } th { padding-right: 5px; }}
Getting started
I had a boilerplate with settings I like, like GitHub Pages, SCSS, but let's start fresh with npx imba create imba2-rotn
.
There are some truly attrocious settings in it - .vscode
and .editorconfig
forcing 4 space indentation, both straight into trash. Even if Imba insists on tabs, they should be visually 2 spaced, or it looks like ass.
OK, with that out of the way we can start coding.
app/index.html
This only requires changing the title, the rest is fine.
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Imba 2 ROT-N</title> <!-- reference to the client script styles --> <style src='*'></style> </head> <body> <!-- reference to the client script --> <script type="module" src="./client.imba"></script> </body></html>
app/client.imba
This is fairly close to direct translation:
tag app prop text = "Hello, World!" def rot(n) text.replace /[a-z]/gi do |c| let i = c.charCodeAt(0) if i >= 97 and i <= 122 String.fromCharCode(((i - 97 + n) % 26) + 97) else if i >= 65 and i <= 90 String.fromCharCode(((i - 65 + n) % 26) + 65) else c def upload(event) let file = event.target.files[0] return unless file let reader = new FileReader reader.onload = do |event| text = event.target.result imba.commit() reader.readAsText(file) <self> <div.contents> <header> "ROT-N" <textarea bind=text> <div> <input#file type="file" :change.upload> <table> for i in [1 .. 25] <tr> <th> i <td> rot(i) css display: flex justify-content: space-around max-width: 1000px margin: auto ff: sans header font-size: 64px text-align: center textarea min-width: 50vw min-height: 100px th padding-right: 5pximba.mount <app>
Some differences:
- CSS is not in the component, getting translated the usual way just like Svelte does it
- there's no wrapping
render
function, it's just a<self>
(which becomes<app-tag>
, it's all web components on top level) - syntax is a bit different
<textarea[text]>
becomes<textarea bind=text>
- extra spaces needed in range
[1 .. 25]
- no more
:
vs.
distinction - no more
read-as-text
becomingreadAsText
- Imba 2 still allows-
in names, but it translates them to some Unicode character, so all DOM APIs will beuglyCamelCame
- Ruby-style
FileReader.new
is now JavaScript-stylenew FileReader
- I'm not totally sure where
()
are needed and where they aren't, the rules are different now
But overall it was very straightforward port.
Source code
Source code is in imba2-rotn repository. At some point I'll try to add GitHub Pages support for it.
Coming next
In the next few episodes I'll try to port a few more Imba 1 apps to Imba 2, and then I guess I'll summarize my thoughts about Imba situation.
Original Link: https://dev.to/taw/open-source-adventures-episode-20-imba-2-rot-n-1d5p
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To