Merge branch 'fjsc' of git://double.co.nz/git/factor

db4
Slava Pestov 2009-10-15 23:11:37 -05:00
commit 59221714de
20 changed files with 156 additions and 124 deletions

View File

@ -336,7 +336,7 @@ M: wrapper (parse-factor-quotation) ( object -- ast )
GENERIC: fjsc-parse ( object -- ast )
M: string fjsc-parse ( object -- ast )
'expression' parse ast>> ;
'expression' parse ;
M: quotation fjsc-parse ( object -- ast )
[
@ -353,11 +353,11 @@ M: quotation fjsc-parse ( object -- ast )
] with-string-writer ;
: fjsc-compile* ( string -- string )
'statement' parse ast>> fjsc-compile ;
'statement' parse fjsc-compile ;
: fc* ( string -- )
[
'statement' parse ast>> values>> do-expressions
'statement' parse values>> do-expressions
] { } make [ write ] each ;

View File

@ -188,7 +188,7 @@ Factor.prototype.make_quotation = function(source, func) {
Factor.prototype.server_eval = function(text, handler, next) {
var self = this;
$.post("/responder/fjsc/compile", { code: text }, function(result) {
$.post("compile", { code: text }, function(result) {
factor.run_eval = function(func) {
factor.cont.next = function() { handler(text,result); }
try {

View File

@ -0,0 +1,90 @@
! Copyright (C) 2008 Chris Double. All Rights Reserved.
USING:
accessors
fjsc
furnace
furnace.actions
furnace.boilerplate
furnace.redirection
furnace.utilities
html.forms
http
http.client
http.server
http.server.dispatchers
http.server.responses
http.server.static
io
io.pathnames
io.streams.string
kernel
namespaces
peg
sequences
urls
validators
;
IN: webapps.fjsc
TUPLE: fjsc < dispatcher ;
: absolute-url ( url -- url )
"http://" request get "host" header append
over "/" head? [ "/" append ] unless
swap append ;
: do-compile-url ( url -- response )
[
absolute-url http-get nip 'expression' parse fjsc-compile write "();" write
] with-string-writer
"application/javascript" <content> ;
: v-local ( string -- string )
dup "http:" head? [ "Unable to compile code from remote sites" throw ] when ;
: validate-compile-url ( -- )
{
{ "url" [ v-required v-local ] }
} validate-params ;
: <compile-url-action> ( -- action )
<action>
[ validate-compile-url ] >>validate
[ "url" value do-compile-url ] >>submit
[ validate-compile-url "url" value do-compile-url ] >>display ;
: do-compile ( code -- response )
[
'expression' parse fjsc-compile write
] with-string-writer
"application/javascript" <content> ;
: validate-compile ( -- )
{
{ "code" [ v-required ] }
} validate-params ;
: <compile-action> ( -- action )
<action>
[ validate-compile ] >>validate
[ "code" value do-compile ] >>submit
[ validate-compile "code" value do-compile ] >>display ;
: <main-action> ( -- action )
<page-action>
{ fjsc "main" } >>template ;
: <fjsc> ( -- fjsc )
dispatcher new-dispatcher
"extra/webapps/fjsc/www" resource-path <static> "static" add-responder
"extra/fjsc/resources" resource-path <static> "fjsc" add-responder
fjsc new-dispatcher
<main-action> "" add-responder
<compile-action> "compile" add-responder
<compile-url-action> "compile-url" add-responder
<boilerplate>
{ fjsc "fjsc" } >>template
>>default ;
: activate-fjsc ( -- )
<fjsc> main-responder set-global ;

View File

@ -0,0 +1,17 @@
<?xml version='1.0' ?>
<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><t:write-title/></title>
<link rel="stylesheet" type="text/css" href="static/termlib/term_styles.css"/>
<script type="text/javascript" src="static/termlib/termlib.js"></script>
<script type="text/javascript" src="fjsc/jquery.js"></script>
<script type="text/javascript" src="fjsc/bootstrap.js"></script>
<script type="text/javascript" src="static/repl.js"></script>
<script type="text/javascript" src="compile-url?url=fjsc/bootstrap.factor"></script>
</head>
<body>
<div id="content"><t:call-next-template /></div>
</body>
</html>
</t:chloe>

View File

@ -0,0 +1,45 @@
<?xml version='1.0' ?>
<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
<t:title>Factor to JavaScript REPL</t:title>
<table border="0">
<tr>
<td valign="top">
<div id="repl" style="position:relative;"></div>
<p>More information on the Factor to Javascript compiler can be found at these blog posts:</p>
<ul>
<li><a href="http://www.bluishcoder.co.nz/2006/12/compiling-factor-to-javascript.html">Factor to Javascript Compiler</a></li>
<li><a href="http://www.bluishcoder.co.nz/2006/12/factor-to-javascript-compiler-updates.html">Factor to Javascript Compiler Updates</a></li>
<li><a href="http://www.bluishcoder.co.nz/2006/12/continuations-added-to-fjsc.html">Continuations added to fjsc</a></li>
<li><a href="http://www.bluishcoder.co.nz/2006/12/cross-domain-json-with-fjsc.html">Cross Domain JSON with fjsc</a></li>
<li><a href="http://www.bluishcoder.co.nz/2007/02/factor-to-javascript-compiler-makeover.html">Factor to Javascript Compiler Makeover</a></li>
</ul>
<p>The terminal emulation code for the Factor REPL is provided by the awesome <a href="http://www.masswerk.at/termlib/index.html">termlib</a> library by Norbert Landsteiner. Documentation for termlib is <a href="static/termlib/">available here</a>. Please note the license of 'termlib':</p>
<blockquote>This JavaScript-library is free for private and academic use. Please include a readable copyright statement and a backlink to <a href="http://www.masswerk.at">http://www.masswerk.at</a> in the web page. The library should always be accompanied by the "readme.txt" and the sample HTML-documents.
The term "private use" includes any personal or non-commercial use, which is not related to commercial activites, but excludes intranet, extranet and/or public net applications that are related to any kind of commercial or profit oriented activity.
For commercial use see <a href="http://www.masswerk.at">http://www.masswerk.at</a> for contact information.</blockquote>
</td>
<td valign="top">
<p><b>Stack</b></p>
<div id="stack">
</div>
<p><b>Playground</b></p>
<div id="playground"></div>
<h3>Compiled Code</h3>
<textarea id="compiled" cols="40" rows="10">
</textarea>
<p>Some useful words:</p>
<dl>
<dt>vocabs ( -- seq )</dt>
<dd>Return a sequence of available vocabularies</dd>
<dt>words ( string -- seq )</dt>
<dd>Return a sequence of words in the given vocabulary</dd>
<dt>all-words ( -- seq )</dt>
<dd>Return a sequence of all words</dd>
</dl>
<p>The contents of <a href="fjsc/bootstrap.factor">bootstrap.factor</a> have been loaded on startup.</p>
</td>
</tr>
</table>
</t:chloe>

View File

@ -1,70 +0,0 @@
! Copyright (C) 2006 Chris Double. All Rights Reserved.
! See http://factorcode.org/license.txt for BSD license.
!
USING: kernel furnace fjsc peg namespaces
lazy-lists io io.files furnace.validator sequences
http.client http.server http.server.responders
webapps.file html ;
IN: webapps.fjsc
: compile ( code -- )
#! Compile the factor code as a string, outputting the http
#! response containing the javascript.
serving-text
'expression' parse parse-result-ast fjsc-compile
write flush ;
! The 'compile' action results in an URL that looks like
! 'responder/fjsc/compile'. It takes one query or post
! parameter called 'code'. It calls the 'compile' word
! passing the parameter to it on the stack.
\ compile {
{ "code" v-required }
} define-action
: compile-url ( url -- )
#! Compile the factor code at the given url, return the javascript.
dup "http:" head? [ "Unable to access remote sites." throw ] when
"http://" "host" header-param rot 3append http-get compile "();" write flush ;
\ compile-url {
{ "url" v-required }
} define-action
: render-page* ( model body-template head-template -- )
[
[ render-component ] [ f rot render-component ] html-document
] serve-html ;
: repl ( -- )
#! The main 'repl' page.
f "repl" "head" render-page* ;
! An action called 'repl'
\ repl { } define-action
: fjsc-web-app ( -- )
! Create the web app, providing access
! under '/responder/fjsc' which calls the
! 'repl' action.
"fjsc" "repl" "extra/webapps/fjsc" web-app
! An URL to the javascript resource files used by
! the 'fjsc' responder.
"fjsc-resources" [
[
"extra/fjsc/resources/" resource-path doc-root set
file-responder
] with-scope
] add-simple-responder
! An URL to the resource files used by
! 'termlib'.
"fjsc-repl-resources" [
[
"extra/webapps/fjsc/resources/" resource-path doc-root set
file-responder
] with-scope
] add-simple-responder ;
MAIN: fjsc-web-app

View File

@ -1,7 +0,0 @@
<title>Factor to Javascript REPL</title>
<link rel="stylesheet" type="text/css" href="/responder/fjsc-repl-resources/termlib/term_styles.css"/>
<script type="text/javascript" src="/responder/fjsc-repl-resources/termlib/termlib.js"></script>
<script type="text/javascript" src="/responder/fjsc-resources/jquery.js"></script>
<script type="text/javascript" src="/responder/fjsc-resources/bootstrap.js"></script>
<script type="text/javascript" src="/responder/fjsc-repl-resources/repl.js"></script>
<script type="text/javascript" src="/responder/fjsc/compile-url?url=/responder/fjsc-resources/bootstrap.factor"></script>

View File

@ -1,43 +0,0 @@
<table border="0">
<tr><td valign="top">
<div id="repl" style="position:relative;"></div>
<p>More information on the Factor to Javascript compiler can be found at these blog posts:
<ul>
<li><a href="http://www.bluishcoder.co.nz/2006/12/compiling-factor-to-javascript.html">Factor to Javascript Compiler</a></li>
<li><a href="http://www.bluishcoder.co.nz/2006/12/factor-to-javascript-compiler-updates.html">Factor to Javascript Compiler Updates</a></li>
<li><a href="http://www.bluishcoder.co.nz/2006/12/continuations-added-to-fjsc.html">Continuations added to fjsc</a></li>
<li><a href="http://www.bluishcoder.co.nz/2006/12/cross-domain-json-with-fjsc.html">Cross Domain JSON with fjsc</a></li>
<li><a href="http://www.bluishcoder.co.nz/2007/02/factor-to-javascript-compiler-makeover.html">Factor to Javascript Compiler Makeover</a></li>
</ul>
</p>
<p>The terminal emulation code for the Factor REPL is provided by the awesome <a href="http://www.masswerk.at/termlib/index.html">termlib</a> library by Norbert Landsteiner. Documentation for termlib is <a href="/responder/fjsc-repl-resources/termlib/">available here</a>. Please note the license of 'termlib':</p>
<blockquote>This JavaScript-library is free for private and academic use. Please include a readable copyright statement and a backlink to <http://www.masswerk.at> in the web page. The library should always be accompanied by the "readme.txt" and the sample HTML-documents.
The term "private use" includes any personal or non-commercial use, which is not related to commercial activites, but excludes intranet, extranet and/or public net applications that are related to any kind of commercial or profit oriented activity.
For commercial use see <a href="http://www.masswerk.at">http://www.masswerk.at</a> for contact information.</blockquote>
</td>
<td valign="top">
<p><b>Stack</b></p>
<div id="stack">
</div>
<p><b>Playground</b></p>
<div id="playground">
</div>
<h3>Compiled Code</h3>
<textarea id="compiled" cols="40" rows="10">
</textarea>
<p>Some useful words:
<dl>
<dt>vocabs ( -- seq )</dt>
<dd>Return a sequence of available vocabularies</dd>
<dt>words ( string -- seq )</dt>
<dd>Return a sequence of words in the given vocabulary</dd>
<dt>all-words ( -- seq )</dt>
<dd>Return a sequence of all words</dd>
</dl>
</p>
<p>The contents of <a href="/responder/fjsc-resources/bootstrap.factor">bootstrap.factor</a> have been loaded on startup.</p>
</td>
</tr>
</table>