206 lines
6.2 KiB
Plaintext
206 lines
6.2 KiB
Plaintext
|
#!/usr/pkg/bin/perl
|
||
|
use strict;
|
||
|
use warnings;
|
||
|
use utf8;
|
||
|
use lib qw( /usr/pkg/lib/perl5/5.24.0 /meta/p/peteyboy/perl5/lib/perl5 );
|
||
|
#make request for all of the following
|
||
|
use CGI::Tiny;
|
||
|
use Mojo::Template;
|
||
|
use Mojo::Loader 'data_section';
|
||
|
#use Routes::Tiny;
|
||
|
use Readonly;
|
||
|
|
||
|
my $ORIGIN_PAGE = "/wordle-life.cgi";
|
||
|
my $defaulttext = "Paste your wordle share here";
|
||
|
|
||
|
cgi {
|
||
|
my $cgi = $_;
|
||
|
|
||
|
$cgi->set_error_handler(sub {
|
||
|
my ($cgi, $error, $rendered) = @_;
|
||
|
warn $error;
|
||
|
unless ($rendered) {
|
||
|
if ($cgi->response_status_code == 413) {
|
||
|
$cgi->render(json => {error => 'Request body limit exceeded'});
|
||
|
}elsif ($cgi->response_status_code == 400) {
|
||
|
$cgi->render(json => {error => 'Bad request'});
|
||
|
} else {
|
||
|
$cgi->render(json => {error => 'Internal server error'});
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
my $wordle;
|
||
|
my $method = $cgi->method;
|
||
|
my $rle = "";
|
||
|
|
||
|
if ($method eq 'GET' or $method eq 'HEAD') {
|
||
|
$wordle = $defaulttext;
|
||
|
} elsif ($method eq 'POST') {
|
||
|
$wordle = $cgi->body_param('wordle-result'); #textarea name
|
||
|
if ($wordle =~ /\Q$defaulttext\E/){
|
||
|
|
||
|
}else{
|
||
|
$rle = generate_rle($wordle);
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
$cgi->set_response_status(405)->render;
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
die "Invalid wordle parameter" unless length $wordle;
|
||
|
my $mt = Mojo::Template->new(auto_escape => 1, vars => 1);
|
||
|
my $template = data_section __PACKAGE__, 'index.html.ep';
|
||
|
my $output = $mt->render($template, { ORIGIN_PAGE =>$ORIGIN_PAGE, defaulttext => $defaulttext, wordle => $wordle, rle => $rle });
|
||
|
#my $output = $mt->render($template, {wordle => $wordle});
|
||
|
|
||
|
$cgi->render(html => $output );
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
sub generate_rle {
|
||
|
|
||
|
my $headline = "";
|
||
|
my $rleline;
|
||
|
my $rowcount;
|
||
|
my $myline;
|
||
|
|
||
|
Readonly my $headline_prefix => "#C "; #Part of RLE spec https://conwaylife.com/wiki/Run_Length_Encoded
|
||
|
Readonly my $row_prefix => "x = 5"; #for wordle always 5
|
||
|
Readonly my $col_prefix => ",y = ";
|
||
|
|
||
|
my $wordle = shift; # this is how you get variables in your function call!
|
||
|
$rowcount = 0;
|
||
|
|
||
|
my @lines = split /^/, $wordle;
|
||
|
foreach $myline (@lines) {
|
||
|
chomp($myline);
|
||
|
if ($headline eq "" && $myline =~ /Wordle/){
|
||
|
$headline = $headline_prefix . $myline;
|
||
|
}else{
|
||
|
|
||
|
#in case of text mode
|
||
|
$myline =~ s/\R//;
|
||
|
$myline =~ s/^(.*)$/$1\$/;
|
||
|
$myline =~ s/:yellow_square:/o/g;
|
||
|
$myline =~ s/:green_square:/o/g;
|
||
|
$myline =~ s/:[a-z-]*square:/b/g;
|
||
|
# for normal unicode
|
||
|
$myline =~ s/\N{U+1f7e8}/o/g; #yellow
|
||
|
$myline =~ s/\N{U+1f7e9}/o/g; #green
|
||
|
|
||
|
$myline =~ s/\N{U+2B1B}/b/g; #black
|
||
|
$myline =~ s/\N{U+2B1C}/b/g; #white
|
||
|
|
||
|
#broken copy/paste text
|
||
|
$myline =~ s/black_large_square/b/g;
|
||
|
$myline =~ s/white_large_square/b/g;
|
||
|
$myline =~ s/yellow_square/o/g;
|
||
|
$myline =~ s/green_square/o/g;
|
||
|
|
||
|
|
||
|
|
||
|
if(length($myline) > 1){
|
||
|
$rowcount += 1;
|
||
|
$rleline= $rleline . $myline;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return "$headline\n$row_prefix$col_prefix$rowcount\n$rleline";
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
__DATA__
|
||
|
@@ index.html.ep
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>Play Conway's Life with your Wordle Score</title>
|
||
|
<link rel="stylesheet" href="https://unpkg.com/some-nice-basic-css/global.css" />
|
||
|
</head>
|
||
|
|
||
|
<body><h1>Wordle->Life</h1>
|
||
|
|
||
|
|
||
|
<p><em>Play your Wordle Share score in <a href=https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life> Conway's Life!</a></em></p>
|
||
|
<p>
|
||
|
<p> Hey, nerds, isn't it funny how the Wordle Scores can look like a glider in that old computer programming exercise, Conway's Life?</p> <img src="https://conwaylife.com/w/images/e/e2/Lwss.png" alt="Glider image from Conwaylife.org, it looks like an 8-bit staple gun" align= float />
|
||
|
|
||
|
<ol>
|
||
|
<li>
|
||
|
<p> Paste your wordle share below and submit to convert it to a Conway's Life file so you can run it.</p>
|
||
|
<p> To learn more about Conway's Life, read <a href=https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life> this</a>
|
||
|
</li>
|
||
|
|
||
|
<p>
|
||
|
|
||
|
|
||
|
<form id="wordle-form" name="wordle-form" action="<%= $ORIGIN_PAGE =%>" method="POST" class="flow">
|
||
|
|
||
|
<label for="wordle">Wordle Share Chart:</label>
|
||
|
<textarea id="wordle" name="wordle-result" rows="9" cols="50" placeholder="<%= $defaulttext =%>" style="vertical-align: middle; border:none;">
|
||
|
<%= $wordle %>
|
||
|
</textarea>
|
||
|
</p>
|
||
|
<br>
|
||
|
|
||
|
|
||
|
<li>
|
||
|
<p>Click "Submit" and and RLE format file for Conway's Game of Life will appear below.</p>
|
||
|
<input type="submit" value="Submit">
|
||
|
</li>
|
||
|
</ol>
|
||
|
<label for="life">Your wordle as Conway Life RLE file:</label>
|
||
|
<textarea id="life" name="Life file" rows="9" cols="50" style="vertical-align: middle; border:none;">
|
||
|
<%= $rle %>
|
||
|
</textarea>
|
||
|
</form>
|
||
|
</div>
|
||
|
<p> if there is extra text or lines in your paste, you might not get a valid file here, so look and make sure it looks like a proper RLE file, for example:
|
||
|
<p>
|
||
|
<pre code>
|
||
|
#C Wordle 235 3/6
|
||
|
x = 5,y = 3
|
||
|
boobo$bobbo$ooooo$
|
||
|
</pre code>
|
||
|
|
||
|
<p>For details about the Life RLE file format above, read <a href=https://conwaylife.com/wiki/Run_Length_Encoded>this</a>.
|
||
|
|
||
|
<p>
|
||
|
<strong>Next steps:</strong>
|
||
|
<ol>
|
||
|
<li>copy the contents of the Conway Life box above
|
||
|
<li>go to a Conway's Life site, such as <a href= https://copy.sh/life/> this one at copy.sh</a> or <a href="https://lazyslug.com/lifeviewer/">this one at lazyslug.com</a> and load and run your file.</li>
|
||
|
<ol>
|
||
|
<li> specifically for the one at copy.sh:</li>
|
||
|
<li> Press the [Import] button at the top</li>
|
||
|
<li> paste in your Life file contents in the box and press [Import]</li>
|
||
|
<li> It will put up a box telling you it loaded your Wordle, press [OK]</li>
|
||
|
<li> Press the [Run] button and watch your Wordle score play LIFE!</li>
|
||
|
</ol>
|
||
|
</ol>
|
||
|
<p> This should work with the share/copy button in wordle, or copy/pasting your friends' wordles out of Discord or wherever as well. See whose Wordle Score looks coolest!
|
||
|
<p>
|
||
|
|
||
|
|
||
|
<p>
|
||
|
<p>
|
||
|
|
||
|
<hr 100%>
|
||
|
<em>Disclaimer: I made this! People and/or corporations may own their marks or copyrights, etc, on words mentioned on this page I don't claim to</em>
|
||
|
|
||
|
<p>
|
||
|
Questions, kudos or comments, mail me @sdf.org
|
||
|
<p>
|
||
|
Thanks to <a href="https://github.com/hankchizljaw/some-nice-basic-css"> hankchizljaw</a> for making his basic css publicly available
|
||
|
|
||
|
<p>
|
||
|
<center>
|
||
|
Hosted by SDF.org
|
||
|
<p><a href="https://sdf.org"><img src=http://mab.sdf.org/sdfbanner.png alt="SDF.org"></a>
|
||
|
</center>
|
||
|
</body></html>
|