From acdcc9ac26db329ec85ba3aef444137297e6ceed Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 27 Sep 2010 21:14:22 -0700 Subject: [PATCH] websites.factorcode: new factorcode.org site, just like the old factorcode.org site --- .../concatenative/concatenative.factor | 20 +-- extra/websites/factorcode/bg_header.jpg | Bin 0 -> 1792 bytes extra/websites/factorcode/factorcode.factor | 17 +++ extra/websites/factorcode/index.fhtml | 80 ++++++++++ extra/websites/factorcode/logo.png | Bin 0 -> 9130 bytes extra/websites/factorcode/master.css | 144 ++++++++++++++++++ 6 files changed, 252 insertions(+), 9 deletions(-) create mode 100644 extra/websites/factorcode/bg_header.jpg create mode 100644 extra/websites/factorcode/factorcode.factor create mode 100644 extra/websites/factorcode/index.fhtml create mode 100644 extra/websites/factorcode/logo.png create mode 100644 extra/websites/factorcode/master.css diff --git a/extra/websites/concatenative/concatenative.factor b/extra/websites/concatenative/concatenative.factor index 61b4f7d887..379ba32a57 100644 --- a/extra/websites/concatenative/concatenative.factor +++ b/extra/websites/concatenative/concatenative.factor @@ -26,7 +26,8 @@ webapps.wiki webapps.user-admin webapps.help webapps.mason -webapps.mason.backend ; +webapps.mason.backend +websites.factorcode ; IN: websites.concatenative : test-db ( -- db ) "resource:test.db" ; @@ -44,11 +45,11 @@ IN: websites.concatenative } ensure-tables ] with-db ; -TUPLE: factor-website < dispatcher ; +TUPLE: concatenative-website < dispatcher ; : ( responder -- responder' ) - { factor-website "page" } >>template ; + { concatenative-website "page" } >>template ; : ( responder -- responder' ) "Factor website" @@ -64,8 +65,8 @@ TUPLE: factor-website < dispatcher ; "6LeJWQgAAAAAAFlYV7SuBClE9uSpGtV_ZS-qVON7" >>public-key "6LeJWQgAAAAAALh-XJgSSQ6xKygRgJ8-029Ip2Xv" >>private-key ; -: ( -- responder ) - factor-website new-dispatcher +: ( -- responder ) + concatenative-website new-dispatcher URL" /wiki/view/Front Page" "" add-responder ; SYMBOL: key-password @@ -84,7 +85,7 @@ SYMBOL: dh-file "vocab:openssl/test/server.pem" key-file set-global "password" key-password set-global common-configuration - + "wiki" add-responder "user-admin" add-responder "pastebin" add-responder @@ -102,7 +103,7 @@ SYMBOL: dh-file : init-production ( -- ) common-configuration - + "wiki" add-responder "user-admin" add-responder test-db "concatenative.org" add-responder @@ -111,6 +112,7 @@ SYMBOL: dh-file test-db "builds.factorcode.org" add-responder home "docs" append-path "docs.factorcode.org" add-responder home "cgi" append-path "gitweb.factorcode.org" add-responder + "new.factorcode.org" add-responder main-responder set-global ; : ( -- config ) @@ -119,7 +121,7 @@ SYMBOL: dh-file dh-file get >>dh-file key-password get >>password ; -: ( -- threaded-server ) +: ( -- threaded-server ) >>secure-config 8080 >>insecure @@ -129,4 +131,4 @@ SYMBOL: dh-file test-db start-expiring test-db start-update-task http-insomniac - start-server ; + start-server ; diff --git a/extra/websites/factorcode/bg_header.jpg b/extra/websites/factorcode/bg_header.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10dbd74e8acdbe80927dce4af7f5ad0b6d1dcf08 GIT binary patch literal 1792 zcmex=R-tZb|xz{bJG4g_o*9GqNST$~&{V890g0&u{{ z%)-LP#>T_J!6U@S!zUyHk`WOE%L_s%0VoC6gTnZKfI*OhL79nznNg5|Nsy6Qkn#T! zh6)BoFaWv}1{hhGnK&V$j4&}E&Bz3FumDgw2P4q^KzWFqFk|9HCg#a3q9KNkjf#P+ zf`t)sdG=REXwFh_;TAQ zXY)=|Jzv2yau2kvUJji!pLXA=q# zNMMr@An8Peb^1T51_NnswV^_~Ae`iI1OxVTk@iz-zyHKj>DQM=&A;uNE#Hy+cK&z! zZKZKh#T(PRbV3((i&iW;8m9r`L_X>k{g$!l=sYkl6vz{aSbbDX3&s@#s*HlEgmMC1 zyMU%V>IQN5R)Gx^`|=8#BB1FYML?^Exrgc z9M0AG=-Ra>FliCY7`XHA)rBp;{M1Mzz3ie$yp%lf$F~l zWgLvaYQw6Vj@CNn-Pirk5N-bV)qjRuwfzG3!G7SiRG+}}`U-nl!zb2H3>>U)SQwu$ zTQR)7!ahNpL(%yJ8)F3H0tepT4fzflg7XVB1Q-~2Ua@8fFxNeZPf(vA=di%v&SA|v zmiz`y7L7`Va}Cy|j8C|L1|ca~`+|kx{tmtaL5wb+80S_syt`mlv;A+*{qL*)ZaKGK z;N`df48^~vIr}+ture__FuY-4PwM=^G{IVggMmr?!Kx)p4GiiJxGn*0X1v3|_f~^} z;Q|8(gKdNH0tN=jJB!Q@h;TxcGcbJ9FkxU~;7{Or!MKz`wnMgy#bK2}Lx95nn*d13 B)&>9o literal 0 HcmV?d00001 diff --git a/extra/websites/factorcode/factorcode.factor b/extra/websites/factorcode/factorcode.factor new file mode 100644 index 0000000000..edf2468024 --- /dev/null +++ b/extra/websites/factorcode/factorcode.factor @@ -0,0 +1,17 @@ +! Copyright (c) 2010 Slava Pestov +! See http://factorcode.org/license.txt for BSD license. +USING: accessors http.server http.server.dispatchers +http.server.static kernel namespaces sequences ; +IN: websites.factorcode + +SYMBOL: users + +: ( -- website ) + + "resource:extra/websites/factorcode/" >>default + users get [ + [ "/home/" "/www/" surround ] keep add-responder + ] each ; + +: init-testing ( -- ) + main-responder set-global ; diff --git a/extra/websites/factorcode/index.fhtml b/extra/websites/factorcode/index.fhtml new file mode 100644 index 0000000000..5a565bba84 --- /dev/null +++ b/extra/websites/factorcode/index.fhtml @@ -0,0 +1,80 @@ +<% USING: namespaces http.client kernel io.files splitting random io io.encodings.utf8 sequences ; %> + + + + + + + + Factor programming language + + + + + +
Factor programming language
+ + + + + + + + + +
+ +

Why Factor?

+ +

The Factor programming language combines powerful language features with a full-featured library. The implementation is fully compiled for performance, while still supporting interactive development. Factor applications are portable between all common platforms. Factor can deploy stand-alone applications on all platforms. Full source code for the Factor project is available under a BSD license.

+ + + +

Most of the above links point to pages on the concatenative.org wiki.

+
+ +

Show me some code!

+ +

Factor belongs to the family of concatenative languages: this means that, at the lowest level, a Factor program is a series of words (functions) that manipulate a stack of references to dynamically-typed values. This gives the language a powerful foundation which allows many abstractions and paradigms to be built on top. Reload this page to see a random code example below.

+ +
+<%
+"/var/www/factorcode.org/newsite/examples.txt" utf8 file-lines
+{ "----" } split random "\n" join write
+%>
+
+ +

See the example programs page on the wiki for more.

+ +
+ +

Downloads

+ +

To download a binary, follow the link corresponding to your computer's CPU/OS configuration. Binary packages are the recommended route for new users who wish to try Factor.

+ +<% +"http://builds.factorcode.org/downloads" http-get nip write +%> + +

Source code is stored in our GIT repository. Source can can be browsed online via github or gitweb.

+ +

More

+ + + + + diff --git a/extra/websites/factorcode/logo.png b/extra/websites/factorcode/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9907d2c727437aad7843ed0abe3ffb06c487ebb7 GIT binary patch literal 9130 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