Skip to content

Instantly share code, notes, and snippets.

@brianmed
Created March 6, 2015 06:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brianmed/1b33a2273986a12d792f to your computer and use it in GitHub Desktop.
Save brianmed/1b33a2273986a12d792f to your computer and use it in GitHub Desktop.
Non-realtime shared editing
#!/opt/perl
use Mojolicious::Lite;
use Mojo::Util qw(slurp spurt);
use File::Temp qw(tempfile);
plugin qw(Bootstrap3);
our $theFile;
BEGIN {
$theFile = "/tmp/editable.txt";
spurt("", $theFile) if !-e $theFile;
};
get '/' => sub {
my $c = shift;
my $bytes = slurp($theFile);
$c->render(template => 'index', txt => $bytes);
};
post '/' => sub {
my $c = shift;
my $txt = $c->param("txt");
my (undef, $filename) = tempfile(template => "editable_XXXX", UNLINK => 0, TMPDIR => 1);
$c->app->log->debug("filename: $filename");
spurt($txt, $filename);
system("/usr/bin/diff -u /tmp/editable.txt $filename | patch -p0");
my $url = $c->url_for('/');
return($c->redirect_to($url));
};
app->start;
__DATA__
<!DOCTYPE html>
<head>
%= asset "bootstrap.css"
%= asset "bootstrap.js"
<title>Editable</title>
</head>
<body>
<style>
body {
padding-top: 50px;
}
.starter-template {
padding: 40px 15px;
text-align: center;
}
</style>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Editable</a>
</div>
</div>
</nav>
<div class="container">
<%= content %>
</div><!-- /.container -->
</body>
</html>
@@ index.html.ep
% layout 'default';
<div class="starter-template">
<h1>Editable</h1>
<form class="form-inline" method="post">
<textarea name="txt" rows="30" cols="50"><%= stash('txt') %></textarea>
<button type="submit" class="btn btn-default">Update</button>
</form>
</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment