Revision: 6771
          
http://languagetool.svn.sourceforge.net/languagetool/?rev=6771&view=rev
Author:   dnaber
Date:     2012-04-22 14:03:21 +0000 (Sun, 22 Apr 2012)
Log Message:
-----------
if a LanguageTool rule has an URL with more information, the grammar checking 
dialog in LibreOffice will now offer a "More..." link to that URL

Modified Paths:
--------------
    trunk/JLanguageTool/CHANGES.txt
    trunk/JLanguageTool/src/java/org/languagetool/openoffice/Main.java
    trunk/JLanguageTool/src/java/org/languagetool/rules/Rule.java
    
trunk/JLanguageTool/src/java/org/languagetool/rules/patterns/PatternRuleLoader.java
    
trunk/JLanguageTool/src/java/org/languagetool/rules/patterns/XMLRuleHandler.java

Added Paths:
-----------
    
trunk/JLanguageTool/src/test/org/languagetool/rules/patterns/PatternRuleLoaderTest.java

Modified: trunk/JLanguageTool/CHANGES.txt
===================================================================
--- trunk/JLanguageTool/CHANGES.txt     2012-04-22 14:02:53 UTC (rev 6770)
+++ trunk/JLanguageTool/CHANGES.txt     2012-04-22 14:03:21 UTC (rev 6771)
@@ -11,6 +11,10 @@
  -Russian:
    -fixed a few false alarms
 
+ -LibreOffice: if a LanguageTool rule has an URL with more information, the
+  grammar checking dialog in LibreOffice will now offer a "More..." link
+  to that URL
+
  -GUI: made the result of "Tag Text" more readable
 
  -Improved startup speed (Jarek Lipski)

Modified: trunk/JLanguageTool/src/java/org/languagetool/openoffice/Main.java
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/openoffice/Main.java  
2012-04-22 14:02:53 UTC (rev 6770)
+++ trunk/JLanguageTool/src/java/org/languagetool/openoffice/Main.java  
2012-04-22 14:03:21 UTC (rev 6771)
@@ -37,6 +37,7 @@
 
 import com.sun.star.awt.XWindow;
 import com.sun.star.awt.XWindowPeer;
+import com.sun.star.beans.PropertyState;
 import com.sun.star.beans.PropertyValue;
 import com.sun.star.beans.XPropertySet;
 import com.sun.star.frame.XDesktop;
@@ -458,12 +459,15 @@
     aError.nErrorStart = myMatch.getFromPos() + startIndex;
     aError.nErrorLength = myMatch.getToPos() - myMatch.getFromPos();
     aError.aRuleIdentifier = myMatch.getRule().getId();
-    // LibreOffice since version 3.5 supports an URL that provides more 
information for the error:
-    //final PropertyValue[] propertyValues = new PropertyValue[] {
-    //        new PropertyValue("FullCommentURL", -1, 
myMatch.getRule().getUrl(), PropertyState.DIRECT_VALUE)
-    //};
-    //aError.aProperties = propertyValues;
-    aError.aProperties = new PropertyValue[0];
+    // LibreOffice since version 3.5 supports an URL that provides more 
information about the error,
+    // older version will simply ignore the property:
+    if (myMatch.getRule().getUrl() != null) {
+      aError.aProperties = new PropertyValue[] {
+              new PropertyValue("FullCommentURL", -1, 
myMatch.getRule().getUrl().toString(), PropertyState.DIRECT_VALUE)
+      };
+    } else {
+      aError.aProperties = new PropertyValue[0];
+    }
     return aError;
   }
 

Modified: trunk/JLanguageTool/src/java/org/languagetool/rules/Rule.java
===================================================================
--- trunk/JLanguageTool/src/java/org/languagetool/rules/Rule.java       
2012-04-22 14:02:53 UTC (rev 6770)
+++ trunk/JLanguageTool/src/java/org/languagetool/rules/Rule.java       
2012-04-22 14:03:21 UTC (rev 6771)
@@ -19,6 +19,7 @@
 package org.languagetool.rules;
 
 import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.ResourceBundle;
@@ -38,6 +39,7 @@
   private List<String> correctExamples;
   private List<IncorrectExample> incorrectExamples;
   private Category category;
+  private URL url;
   /** If true, then the rule is turned off by default. */
   private boolean defaultOff;
   /** Used by paragraph rules to signal that they can remove previous rule 
matches */
@@ -219,4 +221,19 @@
     defaultOff = true;
   }
 
+  /**
+   * An URL describing the rule match in more detail. Typically points to a 
dictionary or grammar website
+   * with explanations and examples.
+   * @since 1.8
+   */
+  public URL getUrl() {
+    return url;
+  }
+
+  /**
+   * @since 1.8
+   */
+  public void setUrl(URL url) {
+    this.url = url;
+  }
 }

Modified: 
trunk/JLanguageTool/src/java/org/languagetool/rules/patterns/PatternRuleLoader.java
===================================================================
--- 
trunk/JLanguageTool/src/java/org/languagetool/rules/patterns/PatternRuleLoader.java
 2012-04-22 14:02:53 UTC (rev 6770)
+++ 
trunk/JLanguageTool/src/java/org/languagetool/rules/patterns/PatternRuleLoader.java
 2012-04-22 14:03:21 UTC (rev 6771)
@@ -20,6 +20,8 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -111,6 +113,7 @@
       }
     } else if ("rule".equals(qName)) {
       shortMessage = new StringBuilder();
+      url = new StringBuilder();
       id = attrs.getValue("id");
       if (inRuleGroup) {
         subId++;
@@ -118,7 +121,6 @@
       if (!(inRuleGroup && defaultOff)) {
         defaultOff = "off".equals(attrs.getValue(DEFAULT));
       }
-
       if (!(inRuleGroup && defaultOn)) {
         defaultOn = "on".equals(attrs.getValue(DEFAULT));
       }
@@ -169,6 +171,9 @@
     } else if ("short".equals(qName)) {
       inShortMessage = true;
       shortMessage = new StringBuilder();
+    } else if ("url".equals(qName)) {
+      inUrl = true;
+      url = new StringBuilder();
     } else if ("rulegroup".equals(qName)) {
       ruleGroupId = attrs.getValue("id");
       ruleGroupDescription = attrs.getValue("name");
@@ -277,6 +282,8 @@
       inMessage = false;
     } else if ("short".equals(qName)) {
       inShortMessage = false;
+    } else if ("url".equals(qName)) {
+      inUrl = false;
     } else if ("match".equals(qName)) {
       if (inMessage) {
         suggestionMatches.get(suggestionMatches.size() - 1).
@@ -312,7 +319,7 @@
     }
   }
 
-    private void prepareRule(final PatternRule rule) {
+  private void prepareRule(final PatternRule rule) {
     rule.setStartPositionCorrection(startPositionCorrection);
     rule.setEndPositionCorrection(endPositionCorrection);
     startPositionCorrection = 0;
@@ -322,8 +329,7 @@
     rule.setCategory(category);
     if (inRuleGroup) {
       rule.setSubId(Integer.toString(subId));
-    }
-    else {
+    } else {
       rule.setSubId("1");
     }
     caseSensitive = false;
@@ -341,6 +347,13 @@
     if (category.isDefaultOff() && !defaultOn) {
       rule.setDefaultOff();
     }
+    if (url != null && url.length() > 0) {
+      try {
+        rule.setUrl(new URL(url.toString()));
+      } catch (MalformedURLException e) {
+        throw new RuntimeException("Could not parse URL for rule: " + rule + 
": '" + url + "'", e);
+      }
+    }
   }
 
   @Override
@@ -360,6 +373,8 @@
       message.append(s);
     } else if (inShortMessage) {
       shortMessage.append(s);
+    } else if (inUrl) {
+      url.append(s);
     }
   }
 

Modified: 
trunk/JLanguageTool/src/java/org/languagetool/rules/patterns/XMLRuleHandler.java
===================================================================
--- 
trunk/JLanguageTool/src/java/org/languagetool/rules/patterns/XMLRuleHandler.java
    2012-04-22 14:02:53 UTC (rev 6770)
+++ 
trunk/JLanguageTool/src/java/org/languagetool/rules/patterns/XMLRuleHandler.java
    2012-04-22 14:03:21 UTC (rev 6771)
@@ -139,7 +139,9 @@
   protected int andGroupCounter;
 
   protected StringBuilder shortMessage = new StringBuilder();
+  protected StringBuilder url = new StringBuilder();
   protected boolean inShortMessage;
+  protected boolean inUrl;
 
   protected boolean inUnification;
   protected boolean inUnificationDef;

Added: 
trunk/JLanguageTool/src/test/org/languagetool/rules/patterns/PatternRuleLoaderTest.java
===================================================================
--- 
trunk/JLanguageTool/src/test/org/languagetool/rules/patterns/PatternRuleLoaderTest.java
                             (rev 0)
+++ 
trunk/JLanguageTool/src/test/org/languagetool/rules/patterns/PatternRuleLoaderTest.java
     2012-04-22 14:03:21 UTC (rev 6771)
@@ -0,0 +1,31 @@
+package org.languagetool.rules.patterns;
+
+import junit.framework.TestCase;
+import org.languagetool.JLanguageTool;
+import org.languagetool.rules.Rule;
+
+import java.util.List;
+
+public class PatternRuleLoaderTest extends TestCase {
+
+  public void testGetRules() throws Exception {
+    final PatternRuleLoader prg = new PatternRuleLoader();
+    final String name = "/xx/grammar.xml";
+    final List<PatternRule> rules = 
prg.getRules(JLanguageTool.getDataBroker().getFromRulesDirAsStream(name), name);
+    assertTrue(rules.size() >= 30);
+    final Rule demoRule1 = getRuleById("DEMO_RULE", rules);
+    assertEquals("http://fake-server.org/foo-bar-error-explained";, 
demoRule1.getUrl().toString());
+    final Rule demoRule2 = getRuleById("API_OUTPUT_TEST_RULE", rules);
+    assertNull(demoRule2.getUrl());
+  }
+  
+  private Rule getRuleById(String id, List<PatternRule> rules) {
+    for (Rule rule : rules) {
+      if (rule.getId().equals(id)) {
+        return rule;
+      }
+    }
+    throw new RuntimeException("No rule found for id '" + id + "'");
+  }
+
+}

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
Languagetool-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/languagetool-cvs

Reply via email to