From 08e9503f842a2b89570cfe7476d935d247a1fb74 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Fri, 18 Jan 2008 02:39:09 -0500
Subject: [PATCH] XMode fixes

---
 extra/xmode/README.txt                    |  3 +++
 extra/xmode/catalog/catalog.factor        | 22 +++++++++++-----------
 extra/xmode/marker/context/context.factor |  1 +
 extra/xmode/marker/marker-tests.factor    |  8 ++++++++
 extra/xmode/modes/bcel.xml                |  2 +-
 extra/xmode/modes/clips.xml               |  2 +-
 extra/xmode/modes/objective-c.xml         |  2 +-
 extra/xmode/modes/powerdynamo.xml         | 16 ++++++++--------
 extra/xmode/modes/rview.xml               |  2 +-
 extra/xmode/modes/tthtml.xml              |  2 +-
 10 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/extra/xmode/README.txt b/extra/xmode/README.txt
index 57d9f42b22..07d56dd877 100755
--- a/extra/xmode/README.txt
+++ b/extra/xmode/README.txt
@@ -36,6 +36,9 @@ to depend on:
   find a mode file which depends on this flaw, please fix it and submit
   the changes to the jEdit project.
 
+- References to non-existent rule sets in IMPORT tags and DELEGATE
+  attributes were ignored in jEdit. They raise an error in Factor.
+
 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/catalog/catalog.factor b/extra/xmode/catalog/catalog.factor
index 6a0efa072e..9c7e6a1ee7 100644
--- a/extra/xmode/catalog/catalog.factor
+++ b/extra/xmode/catalog/catalog.factor
@@ -42,9 +42,12 @@ MEMO: (load-mode) ( name -- rule-sets )
 
 SYMBOL: rule-sets
 
+: no-such-rule-set ( name -- * )
+    "No such rule set: " swap append throw ;
+
 : get-rule-set ( name -- rule-sets rules )
-    "::" split1 [ swap (load-mode) ] [ rule-sets get ] if*
-    tuck at ;
+    dup "::" split1 [ swap (load-mode) ] [ rule-sets get ] if*
+    dup -roll at* [ nip ] [ drop no-such-rule-set ] if ;
 
 : resolve-delegate ( rule -- )
     dup rule-delegate dup string?
@@ -68,14 +71,11 @@ SYMBOL: rule-sets
 
 : resolve-imports ( ruleset -- )
     dup rule-set-imports [
-        get-rule-set dup [
-            swap rule-sets [
-                2dup import-keywords
-                import-rules
-            ] with-variable
-        ] [
-            3drop
-        ] if
+        get-rule-set swap rule-sets [
+            dup resolve-delegates
+            2dup import-keywords
+            import-rules
+        ] with-variable
     ] with each ;
 
 : finalize-rule-set ( ruleset -- )
@@ -99,7 +99,7 @@ SYMBOL: rule-sets
     (load-mode) dup finalize-mode ;
 
 : reset-modes ( -- )
-    \ load-mode "memoize" word-prop clear-assoc ;
+    \ (load-mode) "memoize" word-prop clear-assoc ;
 
 : ?glob-matches ( string glob/f -- ? )
     dup [ glob-matches? ] [ 2drop f ] if ;
diff --git a/extra/xmode/marker/context/context.factor b/extra/xmode/marker/context/context.factor
index 8023e1d321..72ac3f2a3f 100644
--- a/extra/xmode/marker/context/context.factor
+++ b/extra/xmode/marker/context/context.factor
@@ -10,6 +10,7 @@ end
 ;
 
 : <line-context> ( ruleset parent -- line-context )
+    over [ "no context" throw ] unless
     { set-line-context-in-rule-set set-line-context-parent }
     line-context construct ;
 
diff --git a/extra/xmode/marker/marker-tests.factor b/extra/xmode/marker/marker-tests.factor
index b9621a112a..6bcba91c84 100755
--- a/extra/xmode/marker/marker-tests.factor
+++ b/extra/xmode/marker/marker-tests.factor
@@ -133,3 +133,11 @@ IN: temporary
 ] [
     f "font:75%/1.6em \"Lucida Grande\", \"Lucida Sans Unicode\", verdana, geneva, sans-serif;" "css" load-mode tokenize-line 2drop
 ] unit-test
+
+[
+    {
+        T{ token f "<" MARKUP }
+        T{ token f "aaa" MARKUP }
+        T{ token f ">" MARKUP }
+    }
+] [ f "<aaa>" "html" load-mode tokenize-line nip ] unit-test
diff --git a/extra/xmode/modes/bcel.xml b/extra/xmode/modes/bcel.xml
index 19ab3cfd67..628911f431 100644
--- a/extra/xmode/modes/bcel.xml
+++ b/extra/xmode/modes/bcel.xml
@@ -19,7 +19,7 @@
         <SEQ TYPE="COMMENT1">/**/</SEQ>
 
         <!-- Javadoc comment -->
-        <SPAN TYPE="COMMENT3" DELEGATE="JAVADOC">
+        <SPAN TYPE="COMMENT3">
             <BEGIN>/**</BEGIN>
             <END>*/</END>
         </SPAN>
diff --git a/extra/xmode/modes/clips.xml b/extra/xmode/modes/clips.xml
index ce2efcabab..51d89d05eb 100644
--- a/extra/xmode/modes/clips.xml
+++ b/extra/xmode/modes/clips.xml
@@ -33,7 +33,7 @@
 		</SPAN>
 		
 		<!-- List literals -->
-		<SPAN TYPE="LITERAL2" NO_LINE_BREAK="TRUE" DELEGATE="LIST">
+		<SPAN TYPE="LITERAL2" NO_LINE_BREAK="TRUE">
 			<BEGIN>[</BEGIN>
 			<END>]</END>
 		</SPAN>
diff --git a/extra/xmode/modes/objective-c.xml b/extra/xmode/modes/objective-c.xml
index c6c52c8211..7496838938 100644
--- a/extra/xmode/modes/objective-c.xml
+++ b/extra/xmode/modes/objective-c.xml
@@ -89,7 +89,7 @@
         <EOL_SPAN_REGEXP HASH_CHAR="elif" TYPE="MARKUP" DELEGATE="c::CONDITION">elif\b</EOL_SPAN_REGEXP>
         <EOL_SPAN_REGEXP HASH_CHAR="if" TYPE="MARKUP" DELEGATE="c::CONDITION">if\b</EOL_SPAN_REGEXP>
 
-        <IMPORT DELEGATE="LEX"/>
+        <IMPORT DELEGATE="c::LEX"/>
 
         <!-- Directives -->
         <KEYWORDS>
diff --git a/extra/xmode/modes/powerdynamo.xml b/extra/xmode/modes/powerdynamo.xml
index 7babf3dc74..f5eb29e49c 100644
--- a/extra/xmode/modes/powerdynamo.xml
+++ b/extra/xmode/modes/powerdynamo.xml
@@ -200,11 +200,11 @@ for the other tags (data, document, etc). more support planned for future.
 			<END>*/</END>
 		</SPAN>
 
-		<SPAN TYPE="LITERAL1" DELEGATE="powerdynamo_LITERAL">
+		<SPAN TYPE="LITERAL1">
 			<BEGIN>"</BEGIN>
 			<END>"</END>
 		</SPAN>
-		<SPAN TYPE="LITERAL1" DELEGATE="powerdynamo_LITERAL">
+		<SPAN TYPE="LITERAL1">
 			<BEGIN>'</BEGIN>
 			<END>'</END>
 		</SPAN>
@@ -413,11 +413,11 @@ for the other tags (data, document, etc). more support planned for future.
 	</RULES>
 
 	<RULES IGNORE_CASE="TRUE" SET="powerdynamo-tag-general">
-		<SPAN TYPE="LITERAL1" DELEGATE="powerdynamo_LITERAL">
+		<SPAN TYPE="LITERAL1">
 			<BEGIN>"</BEGIN>
 			<END>"</END>
 		</SPAN>
-		<SPAN TYPE="LITERAL1" DELEGATE="powerdynamo_LITERAL">
+		<SPAN TYPE="LITERAL1">
 			<BEGIN>'</BEGIN>
 			<END>'</END>
 		</SPAN>
@@ -428,11 +428,11 @@ for the other tags (data, document, etc). more support planned for future.
 	</RULES>
 
 	<RULES IGNORE_CASE="TRUE" SET="powerdynamo-tag-data">
-		<SPAN TYPE="LITERAL1" DELEGATE="powerdynamo_LITERAL">
+		<SPAN TYPE="LITERAL1">
 			<BEGIN>"</BEGIN>
 			<END>"</END>
 		</SPAN>
-		<SPAN TYPE="LITERAL1" DELEGATE="powerdynamo_LITERAL">
+		<SPAN TYPE="LITERAL1">
 			<BEGIN>'</BEGIN>
 			<END>'</END>
 		</SPAN>
@@ -444,11 +444,11 @@ for the other tags (data, document, etc). more support planned for future.
 	</RULES>
 
 	<RULES IGNORE_CASE="TRUE" SET="powerdynamo-tag-document">
-		<SPAN TYPE="LITERAL1" DELEGATE="powerdynamo_LITERAL">
+		<SPAN TYPE="LITERAL1">
 			<BEGIN>"</BEGIN>
 			<END>"</END>
 		</SPAN>
-		<SPAN TYPE="LITERAL1" DELEGATE="powerdynamo_LITERAL">
+		<SPAN TYPE="LITERAL1">
 			<BEGIN>'</BEGIN>
 			<END>'</END>
 		</SPAN>
diff --git a/extra/xmode/modes/rview.xml b/extra/xmode/modes/rview.xml
index 9747465814..2ca2fdf36a 100644
--- a/extra/xmode/modes/rview.xml
+++ b/extra/xmode/modes/rview.xml
@@ -23,7 +23,7 @@
                 <SEQ TYPE="COMMENT1">/**/</SEQ>
 
 		<!-- Javadoc comment -->
-		<SPAN TYPE="COMMENT2" DELEGATE="JAVADOC">
+		<SPAN TYPE="COMMENT2">
 			<BEGIN>/**</BEGIN>
 			<END>*/</END>
 		</SPAN>
diff --git a/extra/xmode/modes/tthtml.xml b/extra/xmode/modes/tthtml.xml
index 24d9667c6c..37bfa2fb17 100644
--- a/extra/xmode/modes/tthtml.xml
+++ b/extra/xmode/modes/tthtml.xml
@@ -101,7 +101,7 @@
 			HIGHLIGHT_DIGITS="TRUE"
 			DIGIT_RE="(0x[\p{XDigit}]+[lL]?|[\p{Digit}]+(e[\p{Digit}]*)?[lLdDfF]?)">
 
-		<SPAN TYPE="KEYWORD2" NO_LINE_BREAK="TRUE" DELEGATE="VARIABLE">
+		<SPAN TYPE="KEYWORD2" NO_LINE_BREAK="TRUE">
 			<BEGIN>${</BEGIN>
 			<END>}</END>
 		</SPAN>