From 214974ec52d97de3d9917b29d7bd122d821e2c83 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Wed, 5 Dec 2007 23:16:13 -0500
Subject: [PATCH 01/17] Fix feed>xml
---
extra/rss/rss.factor | 9 ++++++---
extra/webapps/planet/{planet.fhtml => planet.furnace} | 7 ++++++-
2 files changed, 12 insertions(+), 4 deletions(-)
rename extra/webapps/planet/{planet.fhtml => planet.furnace} (83%)
diff --git a/extra/rss/rss.factor b/extra/rss/rss.factor
index da810ee377..0e78208f86 100644
--- a/extra/rss/rss.factor
+++ b/extra/rss/rss.factor
@@ -74,7 +74,7 @@ C: entry
: download-feed ( url -- feed )
#! Retrieve an news syndication file, return as a feed tuple.
- http-get rot 200 = [
+ http-get-stream rot 200 = [
nip read-feed
] [
2drop "Error retrieving newsfeed file" throw
@@ -84,12 +84,15 @@ C: entry
: simple-tag, ( content name -- )
[ , ] tag, ;
+: simple-tag*, ( content name attrs -- )
+ [ , ] tag*, ;
+
: entry, ( entry -- )
"entry" [
- dup entry-title "title" simple-tag,
+ dup entry-title "title" { { "type" "html" } } simple-tag*,
"link" over entry-link "href" associate contained*,
dup entry-pub-date "published" simple-tag,
- entry-description "content" simple-tag,
+ entry-description "content" { { "type" "html" } } simple-tag*,
] tag, ;
: feed>xml ( feed -- xml )
diff --git a/extra/webapps/planet/planet.fhtml b/extra/webapps/planet/planet.furnace
similarity index 83%
rename from extra/webapps/planet/planet.fhtml
rename to extra/webapps/planet/planet.furnace
index fb5a673077..bc9172a55a 100644
--- a/extra/webapps/planet/planet.fhtml
+++ b/extra/webapps/planet/planet.furnace
@@ -9,6 +9,7 @@
planet-factor
+
@@ -23,7 +24,11 @@
Planet Lisp.
- This webapp is written in Factor.
+
+ Syndicate
+
+
+ This webapp is written in Factor.
<% "webapps.planet" browse-webapp-source %>
Blogroll
From 4eb4982e60264f62bc3c2341bb9046d2a4dee11b Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Wed, 5 Dec 2007 23:16:20 -0500
Subject: [PATCH 02/17] RSS feed in planet
---
extra/webapps/planet/planet.factor | 135 ++++++++++++++---------------
1 file changed, 65 insertions(+), 70 deletions(-)
diff --git a/extra/webapps/planet/planet.factor b/extra/webapps/planet/planet.factor
index 9fdafe033b..92da085128 100644
--- a/extra/webapps/planet/planet.factor
+++ b/extra/webapps/planet/planet.factor
@@ -1,41 +1,14 @@
USING: sequences rss arrays concurrency kernel sorting
html.elements io assocs namespaces math threads vocabs html
furnace http.server.templating calendar math.parser splitting
-continuations debugger system http.server.responders ;
+continuations debugger system http.server.responders
+xml.writer ;
IN: webapps.planet
-TUPLE: posting author title date link body ;
-
-: diagnostic write print flush ;
-
-: fetch-feed ( pair -- feed )
- second
- dup "Fetching " diagnostic
- dup download-feed feed-entries
- swap "Done fetching " diagnostic ;
-
-: fetch-blogroll ( blogroll -- entries )
- #! entries is an array of { author entries } pairs.
- dup [
- [ fetch-feed ] [ error. drop f ] recover
- ] parallel-map
- [ [ >r first r> 2array ] curry* map ] 2map concat ;
-
-: sort-entries ( entries -- entries' )
- [ [ second entry-pub-date ] compare ] sort ;
-
-: ( pair -- posting )
- #! pair has shape { author entry }
- first2
- { entry-title entry-pub-date entry-link entry-description }
- get-slots posting construct-boa ;
-
: print-posting-summary ( posting -- )
- dup posting-title write
- "- " write
- dup posting-author write bl
-
+ dup entry-title write
+
"Read More..." write
;
@@ -63,14 +36,16 @@ TUPLE: posting author title date link body ;
: print-posting ( posting -- )
- dup posting-body write-html
- posting-date format-date write
;
+
+ dup entry-description write-html
+
+
+ entry-pub-date format-date write
+
;
: print-postings ( postings -- )
[ print-posting ] each ;
@@ -83,38 +58,56 @@ TUPLE: posting author title date link body ;
SYMBOL: default-blogroll
SYMBOL: cached-postings
-: update-cached-postings ( -- )
- default-blogroll get fetch-blogroll sort-entries
- [ ] map
- cached-postings set-global ;
-
: mini-planet-factor ( -- )
cached-postings get 4 head print-posting-summaries ;
: planet-factor ( -- )
- serving-html [
- "resource:extra/webapps/planet/planet.fhtml"
- run-template-file
- ] with-html-stream ;
+ serving-html [ "planet" render-template ] with-html-stream ;
\ planet-factor { } define-action
-{
- { "Berlin Brown" "http://factorlang-fornovices.blogspot.com/feeds/posts/default" "http://factorlang-fornovices.blogspot.com" }
- { "Chris Double" "http://www.bluishcoder.co.nz/atom.xml" "http://www.bluishcoder.co.nz/" }
- { "Elie Chaftari" "http://fun-factor.blogspot.com/feeds/posts/default" "http://fun-factor.blogspot.com/" }
- { "Doug Coleman" "http://code-factor.blogspot.com/feeds/posts/default" "http://code-factor.blogspot.com/" }
- { "Daniel Ehrenberg" "http://useless-factor.blogspot.com/feeds/posts/default" "http://useless-factor.blogspot.com/" }
- { "Kio M. Smallwood"
- "http://sekenre.wordpress.com/feed/atom/"
- "http://sekenre.wordpress.com/" }
- { "Phil Dawes" "http://www.phildawes.net/blog/category/factor/feed/atom" "http://www.phildawes.net/blog/" }
- { "Samuel Tardieu" "http://www.rfc1149.net/blog/tag/factor/feed/atom/" "http://www.rfc1149.net/blog/tag/factor/" }
- { "Slava Pestov" "http://factor-language.blogspot.com/atom.xml" "http://factor-language.blogspot.com/" }
-} default-blogroll set-global
+: planet-feed ( -- feed )
+ "[ planet-factor ]"
+ "http://planet.factorcode.org"
+ cached-postings get 30 head ;
+
+: feed.xml
+ "text/xml" serving-content
+ planet-feed feed>xml write-xml ;
+
+\ feed.xml { } define-action
SYMBOL: last-update
+: diagnostic write print flush ;
+
+: fetch-feed ( triple -- feed )
+ second
+ dup "Fetching " diagnostic
+ dup download-feed feed-entries
+ swap "Done fetching " diagnostic ;
+
+: ( author entry -- entry' )
+ clone
+ [ ": " swap entry-title 3append ] keep
+ [ set-entry-title ] keep ;
+
+: ?fetch-feed ( triple -- feed/f )
+ [ fetch-feed ] [ error. drop f ] recover ;
+
+: fetch-blogroll ( blogroll -- entries )
+ dup 0
+ swap [ ?fetch-feed ] parallel-map
+ [ [ ] curry* map ] 2map concat ;
+
+: sort-entries ( entries -- entries' )
+ [ [ entry-pub-date ] compare ] sort ;
+
+: update-cached-postings ( -- )
+ default-blogroll get
+ fetch-blogroll sort-entries
+ cached-postings set-global ;
+
: update-thread ( -- )
millis last-update set-global
[ update-cached-postings ] in-thread
@@ -126,14 +119,16 @@ SYMBOL: last-update
"planet" "planet-factor" "extra/webapps/planet" web-app
-: merge-feeds ( feeds -- feed )
- [ feed-entries ] map concat sort-entries ;
-
-: planet-feed ( -- feed )
- default-blogroll get [ second download-feed ] map merge-feeds
- >r "[ planet-factor ]" "http://planet.factorcode.org" r>
- feed>xml ;
-
-: feed.xml planet-feed ;
-
-\ feed.xml { } define-action
+{
+ { "Berlin Brown" "http://factorlang-fornovices.blogspot.com/feeds/posts/default" "http://factorlang-fornovices.blogspot.com" }
+ { "Chris Double" "http://www.bluishcoder.co.nz/atom.xml" "http://www.bluishcoder.co.nz/" }
+ { "Elie Chaftari" "http://fun-factor.blogspot.com/feeds/posts/default" "http://fun-factor.blogspot.com/" }
+ { "Doug Coleman" "http://code-factor.blogspot.com/feeds/posts/default" "http://code-factor.blogspot.com/" }
+ { "Daniel Ehrenberg" "http://useless-factor.blogspot.com/feeds/posts/default" "http://useless-factor.blogspot.com/" }
+ { "Kio M. Smallwood"
+ "http://sekenre.wordpress.com/feed/atom/"
+ "http://sekenre.wordpress.com/" }
+ ! { "Phil Dawes" "http://www.phildawes.net/blog/category/factor/feed/atom" "http://www.phildawes.net/blog/" }
+ { "Samuel Tardieu" "http://www.rfc1149.net/blog/tag/factor/feed/atom/" "http://www.rfc1149.net/blog/tag/factor/" }
+ { "Slava Pestov" "http://factor-language.blogspot.com/atom.xml" "http://factor-language.blogspot.com/" }
+} default-blogroll set-global
From 6120f5f3876e1b6d5c9caeb544622aa5099bf133 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Thu, 6 Dec 2007 00:06:34 -0500
Subject: [PATCH 03/17] Furnace improvements
---
extra/furnace/furnace.factor | 65 ++++++++++---------
extra/webapps/pastebin/annotate-paste.furnace | 7 +-
extra/webapps/pastebin/modes.furnace | 7 ++
extra/webapps/pastebin/new-paste.furnace | 7 ++
extra/webapps/pastebin/paste-list.furnace | 30 +++++++--
extra/webapps/pastebin/paste-summary.furnace | 14 ++--
extra/webapps/pastebin/pastebin.factor | 37 +++++------
extra/webapps/pastebin/show-paste.furnace | 18 ++++-
extra/webapps/pastebin/syntax.furnace | 7 ++
extra/webapps/planet/planet.factor | 2 +-
10 files changed, 128 insertions(+), 66 deletions(-)
create mode 100644 extra/webapps/pastebin/modes.furnace
create mode 100644 extra/webapps/pastebin/syntax.furnace
diff --git a/extra/furnace/furnace.factor b/extra/furnace/furnace.factor
index f2ce0ddf18..076b506112 100644
--- a/extra/furnace/furnace.factor
+++ b/extra/furnace/furnace.factor
@@ -101,36 +101,10 @@ SYMBOL: request-params
: service-post ( url -- ) "response" get swap service-request ;
-: explode-tuple ( tuple -- )
- dup tuple-slots swap class "slot-names" word-prop
- [ set ] 2each ;
-
-SYMBOL: model
-
-: call-template ( model template -- )
- [
- >r [ dup model set explode-tuple ] when* r>
- ".furnace" append resource-path run-template-file
- ] with-scope ;
-
-: render-template ( model template -- )
- template-path get swap path+ call-template ;
-
-: render-page* ( model body-template head-template -- )
- [
- [ render-template ] [ f rot render-template ] html-document
- ] serve-html ;
-
-: render-titled-page* ( model body-template head-template title -- )
- [
- [ render-template ] swap [ write f rot render-template ] curry html-document
- ] serve-html ;
-
-
-: render-page ( model template title -- )
- [
- [ render-template ] simple-html-document
- ] serve-html ;
+: render-template ( template -- )
+ template-path get swap path+
+ ".furnace" append resource-path
+ run-template-file ;
: web-app ( name default path -- )
[
@@ -141,3 +115,34 @@ SYMBOL: model
[ service-post ] "post" set
! [ service-head ] "head" set
] make-responder ;
+
+: explode-tuple ( tuple -- )
+ dup tuple-slots swap class "slot-names" word-prop
+ [ set ] 2each ;
+
+SYMBOL: model
+
+: with-slots ( model quot -- )
+ [
+ >r [ dup model set explode-tuple ] when* r> call
+ ] with-scope ;
+
+: render-component ( model template -- )
+ swap [ render-template ] with-slots ;
+
+! Deprecated stuff
+
+: render-page* ( model body-template head-template -- )
+ [
+ [ render-component ] [ f rot render-component ] html-document
+ ] serve-html ;
+
+: render-titled-page* ( model body-template head-template title -- )
+ [
+ [ render-component ] swap [ write f rot render-component ] curry html-document
+ ] serve-html ;
+
+: render-page ( model template title -- )
+ [
+ [ render-component ] simple-html-document
+ ] serve-html ;
diff --git a/extra/webapps/pastebin/annotate-paste.furnace b/extra/webapps/pastebin/annotate-paste.furnace
index c963e2f88f..301726209b 100644
--- a/extra/webapps/pastebin/annotate-paste.furnace
+++ b/extra/webapps/pastebin/annotate-paste.furnace
@@ -1,4 +1,4 @@
-<% USING: io math math.parser namespaces ; %>
+<% USING: io math math.parser namespaces furnace ; %>
Annotate
@@ -18,6 +18,11 @@
|
+
+File type: |
+<% "modes" render-template %> |
+
+
Contents: |
|
diff --git a/extra/webapps/pastebin/modes.furnace b/extra/webapps/pastebin/modes.furnace
new file mode 100644
index 0000000000..cc09ae90ed
--- /dev/null
+++ b/extra/webapps/pastebin/modes.furnace
@@ -0,0 +1,7 @@
+<% USING: xmode.catalog sequences kernel html.elements assocs io ; %>
+
+
diff --git a/extra/webapps/pastebin/new-paste.furnace b/extra/webapps/pastebin/new-paste.furnace
index 8a2544e801..98b9bae8b7 100644
--- a/extra/webapps/pastebin/new-paste.furnace
+++ b/extra/webapps/pastebin/new-paste.furnace
@@ -1,3 +1,5 @@
+<% USING: furnace ; %>
+
-Contents: |
+Content: |
|
diff --git a/extra/webapps/pastebin/pastebin.factor b/extra/webapps/pastebin/pastebin.factor
old mode 100644
new mode 100755
index 382b7fbb85..ad2198f282
--- a/extra/webapps/pastebin/pastebin.factor
+++ b/extra/webapps/pastebin/pastebin.factor
@@ -1,5 +1,5 @@
USING: calendar furnace furnace.validator io.files kernel
-namespaces sequences store ;
+namespaces sequences store http.server.responders html ;
IN: webapps.pastebin
TUPLE: pastebin pastes ;
@@ -28,21 +28,25 @@ SYMBOL: store
pastebin get pastebin-pastes nth ;
: show-paste ( n -- )
- get-paste "show-paste" render-component ;
+ serving-html
+ get-paste
+ [ "show-paste" render-component ] with-html-stream ;
\ show-paste { { "n" v-number } } define-action
: new-paste ( -- )
- "new-paste" render-template ;
+ serving-html
+ [ "new-paste" render-template ] with-html-stream ;
\ new-paste { } define-action
: paste-list ( -- )
+ serving-html
[
[ show-paste ] "show-paste-quot" set
[ new-paste ] "new-paste-quot" set
pastebin get "paste-list" render-component
- ] with-scope ;
+ ] with-html-stream ;
\ paste-list { } define-action
@@ -68,7 +72,7 @@ SYMBOL: store
\ submit-paste [ paste-list ] define-redirect
-: annotate-paste ( n summary author contents -- )
+: annotate-paste ( n summary author mode contents -- )
swap get-paste
paste-annotations push
save-pastebin-store ;
diff --git a/extra/webapps/pastebin/show-paste.furnace b/extra/webapps/pastebin/show-paste.furnace
old mode 100644
new mode 100755
index 8213857687..a724410b8c
--- a/extra/webapps/pastebin/show-paste.furnace
+++ b/extra/webapps/pastebin/show-paste.furnace
@@ -1,4 +1,4 @@
-<% USING: namespaces io furnace sequences ; %>
+<% USING: namespaces io furnace sequences xmode.code2html ; %>
@@ -9,6 +9,7 @@
Paste: <% "summary" get write %>
+ <% default-stylesheet %>
[ <% "summary" get write %> ]
@@ -20,7 +21,7 @@
File type: | <% "mode" get write %> |
-<% "contents" get write %>
+<% "syntax" render-template %>
<% "annotations" get [ "annotation" render-component ] each %>
diff --git a/extra/webapps/pastebin/syntax.furnace b/extra/webapps/pastebin/syntax.furnace
old mode 100644
new mode 100755
index cc09ae90ed..246b9d04b3
--- a/extra/webapps/pastebin/syntax.furnace
+++ b/extra/webapps/pastebin/syntax.furnace
@@ -1,7 +1,3 @@
-<% USING: xmode.catalog sequences kernel html.elements assocs io ; %>
+<% USING: xmode.code2html splitting namespaces ; %>
-
+<% "contents" get string-lines "mode" get htmlize-lines %>
From 59566c20e9bc3275c1a0e2bb449ebfd77e0177bb Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Thu, 6 Dec 2007 00:23:05 -0500
Subject: [PATCH 06/17] Source responder with syntax highlighting
---
extra/webapps/file/file.factor | 25 +++++++++++++++++++------
extra/webapps/source/source.factor | 20 ++++++++++++++++++++
2 files changed, 39 insertions(+), 6 deletions(-)
mode change 100644 => 100755 extra/webapps/file/file.factor
create mode 100755 extra/webapps/source/source.factor
diff --git a/extra/webapps/file/file.factor b/extra/webapps/file/file.factor
old mode 100644
new mode 100755
index d8fec990db..5ec52ab96b
--- a/extra/webapps/file/file.factor
+++ b/extra/webapps/file/file.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2004, 2006 Slava Pestov.
+! Copyright (C) 2004, 2007 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: calendar html io io.files kernel math math.parser
http.server.responders http.server.templating namespaces parser
@@ -31,15 +31,24 @@ IN: webapps.file
"304 Not Modified" response
now timestamp>http-string "Date" associate print-header ;
+! You can override how files are served in a custom responder
+SYMBOL: serve-file-hook
+
+[
+ nip
+ file-response
+ stdio get stream-copy
+] serve-file-hook set-global
+
: serve-static ( filename mime-type -- )
over last-modified-matches? [
2drop not-modified-response
] [
- dupd file-response
"method" get "head" = [
- drop
+ file-response
] [
- stdio get stream-copy
+ >r dup r>
+ serve-file-hook get call
] if
] if ;
@@ -53,9 +62,13 @@ SYMBOL: page
: include-page ( filename -- )
"doc-root" get swap path+ run-page ;
+: serve-fhtml ( filename -- )
+ serving-html
+ "method" get "head" = [ drop ] [ run-page ] if ;
+
: serve-file ( filename -- )
dup mime-type dup "application/x-factor-server-page" =
- [ drop serving-html run-page ] [ serve-static ] if ;
+ [ drop serve-fhtml ] [ serve-static ] if ;
: file. ( name dirp -- )
[ "/" append ] when
@@ -107,7 +120,7 @@ SYMBOL: page
global [
! Serve up our own source code
- "resources" [
+ "resources" [
[
"" resource-path "doc-root" set
file-responder
diff --git a/extra/webapps/source/source.factor b/extra/webapps/source/source.factor
new file mode 100755
index 0000000000..ddc2f15759
--- /dev/null
+++ b/extra/webapps/source/source.factor
@@ -0,0 +1,20 @@
+! Copyright (C) 2007 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: io.files namespaces webapps.file http.server.responders
+xmode.code2html kernel ;
+IN: webapps.source
+
+global [
+ ! Serve up our own source code
+ "source" [
+ [
+ "" resource-path "doc-root" set
+ [
+ drop
+ serving-html
+ htmlize-stream
+ ] serve-file-hook set
+ file-responder
+ ] with-scope
+ ] add-simple-responder
+] bind
From a969934061894c8be9f7d6da7983c1ac7be24d07 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Thu, 6 Dec 2007 00:23:18 -0500
Subject: [PATCH 07/17] Various fixes
---
extra/xmode/README.txt | 12 ++++----
extra/xmode/code2html/code2html.factor | 40 +++++++++++++-------------
extra/xmode/loader/loader.factor | 27 ++++++++++-------
extra/xmode/marker/marker-tests.factor | 18 ++++++++++++
extra/xmode/marker/marker.factor | 33 ++++++++++-----------
extra/xmode/marker/state/state.factor | 1 -
extra/xmode/rules/rules.factor | 26 +++++++++++++----
7 files changed, 98 insertions(+), 59 deletions(-)
mode change 100644 => 100755 extra/xmode/code2html/code2html.factor
diff --git a/extra/xmode/README.txt b/extra/xmode/README.txt
index bf73042030..57d9f42b22 100755
--- a/extra/xmode/README.txt
+++ b/extra/xmode/README.txt
@@ -32,10 +32,10 @@ to depend on:
it inherits the value of the NO_WORD_SEP attribute from the previous
RULES tag.
- The Factor implementation does not duplicate this behavior.
+ The Factor implementation does not duplicate this behavior. If you
+ find a mode file which depends on this flaw, please fix it and submit
+ the changes to the jEdit project.
-This is still a work in progress. If you find any behavioral differences
-between the Factor implementation and the original jEdit code, please
-report them as bugs. Also, if you wish to contribute a new or improved
-mode file, please contact the jEdit project. Updated mode files in jEdit
-will be periodically imported into the Factor source tree.
+If you wish to contribute a new or improved mode file, please contact
+the jEdit project. Updated mode files in jEdit will be periodically
+imported into the Factor source tree.
diff --git a/extra/xmode/code2html/code2html.factor b/extra/xmode/code2html/code2html.factor
old mode 100644
new mode 100755
index 02bf74dc23..5dc44841d3
--- a/extra/xmode/code2html/code2html.factor
+++ b/extra/xmode/code2html/code2html.factor
@@ -15,8 +15,10 @@ IN: xmode.code2html
: htmlize-line ( line-context line rules -- line-context' )
tokenize-line htmlize-tokens ;
-: htmlize-lines ( lines rules -- )
- f -rot [ htmlize-line nl ] curry each drop
;
+: htmlize-lines ( lines mode -- )
+
+ f swap load-mode [ htmlize-line nl ] curry reduce drop
+
;
: default-stylesheet ( -- )
;
+: htmlize-stream ( path stream -- )
+ lines swap
+
+
+ default-stylesheet
+ dup write
+
+
+ over empty?
+ [ 2drop ]
+ [ over first find-mode htmlize-lines ] if
+
+ ;
+
: htmlize-file ( path -- )
- dup lines dup empty? [ 2drop ] [
- swap dup ".html" append [
- [
-
-
- dup write
- default-stylesheet
-
-
- over first
- find-mode
- load-mode
- htmlize-lines
-
-
- ] with-html-stream
- ] with-stream
- ] if ;
+ dup over ".html" append
+ [ htmlize-stream ] with-stream ;
diff --git a/extra/xmode/loader/loader.factor b/extra/xmode/loader/loader.factor
index c6b5cad9d1..db3d0fbf41 100755
--- a/extra/xmode/loader/loader.factor
+++ b/extra/xmode/loader/loader.factor
@@ -32,10 +32,13 @@ IN: xmode.loader
swap [ at string>boolean ] curry map first3 ;
: parse-literal-matcher ( tag -- matcher )
- dup children>string swap position-attrs ;
+ dup children>string
+ \ ignore-case? get [ ] when
+ swap position-attrs ;
: parse-regexp-matcher ( tag -- matcher )
- dup children>string swap position-attrs ;
+ dup children>string
+ swap position-attrs ;
! SPAN's children
token swap children>string rot set-at ;
+: parse-keyword-tag ( tag keyword-map -- )
+ >r dup name-tag string>token swap children>string r> set-at ;
TAG: KEYWORDS ( rule-set tag -- key value )
- >r rule-set-keywords r>
- child-tags [ parse-keyword-tag ] curry* each ;
+ \ ignore-case? get
+ swap child-tags [ over parse-keyword-tag ] each
+ swap set-rule-set-keywords ;
TAGS>
+: ? dup [ ] when ;
+
: (parse-rules-tag) ( tag -- rule-set )
{
{ "SET" string>rule-set-name set-rule-set-name }
{ "IGNORE_CASE" string>boolean set-rule-set-ignore-case? }
{ "HIGHLIGHT_DIGITS" string>boolean set-rule-set-highlight-digits? }
- { "DIGIT_RE" set-rule-set-digit-re } ! XXX
+ { "DIGIT_RE" ? set-rule-set-digit-re }
{ "ESCAPE" f add-escape-rule }
{ "DEFAULT" string>token set-rule-set-default }
{ "NO_WORD_SEP" f set-rule-set-no-word-sep }
@@ -153,9 +159,10 @@ TAGS>
: parse-rules-tag ( tag -- rule-set )
dup (parse-rules-tag) [
- swap child-tags [
- parse-rule-tag
- ] curry* each
+ [
+ dup rule-set-ignore-case? \ ignore-case? set
+ swap child-tags [ parse-rule-tag ] curry* each
+ ] with-scope
] keep ;
: merge-rule-set-props ( props rule-set -- )
diff --git a/extra/xmode/marker/marker-tests.factor b/extra/xmode/marker/marker-tests.factor
index cb7f2960a4..5b0aff2050 100755
--- a/extra/xmode/marker/marker-tests.factor
+++ b/extra/xmode/marker/marker-tests.factor
@@ -109,3 +109,21 @@ IN: temporary
] [
f "$FOO" "shellscript" load-mode tokenize-line nip
] unit-test
+
+[
+ {
+ T{ token f "AND" KEYWORD1 }
+ }
+] [
+ f "AND" "pascal" load-mode tokenize-line nip
+] unit-test
+
+[
+ {
+ T{ token f "Comment {" COMMENT1 }
+ T{ token f "XXX" COMMENT1 }
+ T{ token f "}" COMMENT1 }
+ }
+] [
+ f "Comment {XXX}" "rebol" load-mode tokenize-line nip
+] unit-test
diff --git a/extra/xmode/marker/marker.factor b/extra/xmode/marker/marker.factor
index cd9eacbb88..dda5d64c9c 100755
--- a/extra/xmode/marker/marker.factor
+++ b/extra/xmode/marker/marker.factor
@@ -15,8 +15,8 @@ assocs combinators combinators.lib strings regexp splitting ;
[ dup [ digit? ] contains? ]
[
dup [ digit? ] all? [
- current-rule-set rule-set-digit-re dup
- [ dupd 2drop f ] [ drop f ] if
+ current-rule-set rule-set-digit-re
+ dup [ dupd matches? ] [ drop f ] if
] unless*
]
} && nip ;
@@ -26,7 +26,7 @@ assocs combinators combinators.lib strings regexp splitting ;
: resolve-delegate ( name -- rules )
dup string? [
- "::" split1 [ swap load-mode at ] [ rule-sets get at ] if*
+ "::" split1 [ swap load-mode ] [ rule-sets get ] if* at
] when ;
: rule-set-keyword-maps ( ruleset -- seq )
@@ -45,13 +45,6 @@ assocs combinators combinators.lib strings regexp splitting ;
dup mark-number [ ] [ mark-keyword ] ?if
[ prev-token, ] when* ;
-: check-terminate-char ( -- )
- current-rule-set rule-set-terminate-char [
- position get <= [
- terminated? on
- ] when
- ] when* ;
-
: current-char ( -- char )
position get line get nth ;
@@ -74,11 +67,22 @@ GENERIC: text-matches? ( position text -- match-count/f )
M: f text-matches? 2drop f ;
M: string text-matches?
- ! XXX ignore case
>r line get swap tail-slice r>
[ head? ] keep length and ;
-! M: regexp text-matches? ... ;
+M: ignore-case text-matches?
+ >r line get swap tail-slice r>
+ ignore-case-string
+ 2dup shorter? [
+ 2drop f
+ ] [
+ [ length head-slice ] keep
+ [ [ >upper ] 2apply sequence= ] keep
+ length and
+ ] if ;
+
+M: regexp text-matches?
+ 2drop f ; ! >r line get swap tail-slice r> match-head ;
: rule-start-matches? ( rule -- match-count/f )
dup rule-start tuck swap can-match-here? [
@@ -284,8 +288,6 @@ M: mark-previous-rule handle-rule-start
: mark-token-loop ( -- )
position get line get length < [
- check-terminate-char
-
{
[ check-end-delegate ]
[ check-every-rule ]
@@ -302,8 +304,7 @@ M: mark-previous-rule handle-rule-start
: unwind-no-line-break ( -- )
context get line-context-parent [
- line-context-in-rule rule-no-line-break?
- terminated? get or [
+ line-context-in-rule rule-no-line-break? [
pop-context
unwind-no-line-break
] when
diff --git a/extra/xmode/marker/state/state.factor b/extra/xmode/marker/state/state.factor
index cce7c7567a..958c23a2bc 100755
--- a/extra/xmode/marker/state/state.factor
+++ b/extra/xmode/marker/state/state.factor
@@ -16,7 +16,6 @@ SYMBOL: seen-whitespace-end?
SYMBOL: escaped?
SYMBOL: process-escape?
SYMBOL: delegate-end-escaped?
-SYMBOL: terminated?
: current-rule ( -- rule )
context get line-context-in-rule ;
diff --git a/extra/xmode/rules/rules.factor b/extra/xmode/rules/rules.factor
index 7206668edb..906fba3140 100755
--- a/extra/xmode/rules/rules.factor
+++ b/extra/xmode/rules/rules.factor
@@ -1,7 +1,11 @@
USING: xmode.tokens xmode.keyword-map kernel
-sequences vectors assocs strings memoize ;
+sequences vectors assocs strings memoize regexp ;
IN: xmode.rules
+TUPLE: ignore-case string ;
+
+C: ignore-case
+
! Based on org.gjt.sp.jedit.syntax.ParserRuleSet
TUPLE: rule-set
name
@@ -20,12 +24,11 @@ no-word-sep
: init-rule-set ( ruleset -- )
#! Call after constructor.
- >r H{ } clone H{ } clone V{ } clone f r>
+ >r H{ } clone H{ } clone V{ } clone r>
{
set-rule-set-rules
set-rule-set-props
set-rule-set-imports
- set-rule-set-keywords
} set-slots ;
: ( -- ruleset )
@@ -46,8 +49,9 @@ MEMO: standard-rule-set ( id -- ruleset )
] when* ;
: rule-set-no-word-sep* ( ruleset -- str )
- dup rule-set-keywords keyword-map-no-word-sep*
- swap rule-set-no-word-sep "_" 3append ;
+ dup rule-set-no-word-sep
+ swap rule-set-keywords dup [ keyword-map-no-word-sep* ] when
+ "_" 3append ;
! Match restrictions
TUPLE: matcher text at-line-start? at-whitespace-end? at-word-start? ;
@@ -97,10 +101,20 @@ TUPLE: escape-rule ;
escape-rule construct-rule
[ set-rule-start ] keep ;
+GENERIC: text-hash-char ( text -- ch )
+
+M: f text-hash-char ;
+
+M: string text-hash-char first ;
+
+M: ignore-case text-hash-char ignore-case-string first ;
+
+M: regexp text-hash-char drop f ;
+
: rule-chars* ( rule -- string )
dup rule-chars
swap rule-start matcher-text
- dup string? [ first add ] [ drop ] if ;
+ text-hash-char [ add ] when* ;
: add-rule ( rule ruleset -- )
>r dup rule-chars* >upper swap
From e82ff27e987efe9d747b22ce6ebc314ce4fdfddb Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Thu, 6 Dec 2007 01:02:58 -0500
Subject: [PATCH 08/17] Overhaul pastebin
---
extra/webapps/pastebin/annotate-paste.furnace | 16 +++---
extra/webapps/pastebin/annotation.furnace | 2 +-
extra/webapps/pastebin/footer.furnace | 3 ++
extra/webapps/pastebin/header.furnace | 23 +++++++++
extra/webapps/pastebin/modes.furnace | 4 +-
extra/webapps/pastebin/new-paste.furnace | 27 ++++++----
extra/webapps/pastebin/paste-list.furnace | 50 +++++++++----------
extra/webapps/pastebin/paste-summary.furnace | 14 +++---
extra/webapps/pastebin/pastebin.factor | 29 ++++++++++-
extra/webapps/pastebin/show-paste.furnace | 19 +++----
extra/webapps/pastebin/style.css | 36 +++++++++++++
extra/webapps/pastebin/syntax.furnace | 2 +-
12 files changed, 156 insertions(+), 69 deletions(-)
create mode 100644 extra/webapps/pastebin/footer.furnace
create mode 100644 extra/webapps/pastebin/header.furnace
create mode 100644 extra/webapps/pastebin/style.css
diff --git a/extra/webapps/pastebin/annotate-paste.furnace b/extra/webapps/pastebin/annotate-paste.furnace
index 89ce12fd61..abb5cc3d07 100755
--- a/extra/webapps/pastebin/annotate-paste.furnace
+++ b/extra/webapps/pastebin/annotate-paste.furnace
@@ -9,22 +9,22 @@
string write %>" />
-Your name: |
- |
-
-
-
-Summary: |
+Summary: |
|
-File type: |
+Your name: |
+ |
+
+
+
+File type: |
<% "modes" render-template %> |
-Content: |
+Content: |
|
diff --git a/extra/webapps/pastebin/annotation.furnace b/extra/webapps/pastebin/annotation.furnace
index d4617667ed..420c1625f5 100755
--- a/extra/webapps/pastebin/annotation.furnace
+++ b/extra/webapps/pastebin/annotation.furnace
@@ -8,4 +8,4 @@
Created: | <% "date" get write %> |
-<% "syntax" render-template %
+<% "syntax" render-template %>
diff --git a/extra/webapps/pastebin/footer.furnace b/extra/webapps/pastebin/footer.furnace
new file mode 100644
index 0000000000..15b90110a0
--- /dev/null
+++ b/extra/webapps/pastebin/footer.furnace
@@ -0,0 +1,3 @@
+
+
+