
  Apache Flex Squiggly is an ActionScript spell checking library.
	 
  This application is based on work donated by Adobe Systems Inc.
  
==========================================================================================
Initial Setup Required
==========================================================================================            
  
    The environment variable FLEX_HOME needs to be set to the absolute path of the Apache
    Flex SDK. If you prefer you can set this in env.properties.
  
==========================================================================================
How to build Squiggly using ant (no IDE is required)
==========================================================================================

1.  On Linux or Mac un tar/gzip the source distribution:
	    tar -zxvf apache-flex-squiggly-1.1.tar.gz
	Or if on windows unzip 
		apache-flex-squiggly-1.1.zip

2.  In the base directory, run:
        ant compile

3. The compiled swcs can be found in the main/libs directory 
        
4. To optionally create a release source package, run:
 		ant package

5. To remove all of the compiled swcs:
 		ant clean
 		
==========================================================================================
Some other useful ant targets
========================================================================================== 		
	
There are several other useful ant targets.

	 compile-swc         compile squiggly swcs
	 package             package up all source files
	 generate-docs       generate asdocs
	 package-binary-tar  tar up all source files and swcs
	 package-binary-zip  zip up all source files and swcs
	 package-source-tar  tar up all source files
	 package-source-zip  zip up all source files
 		
==========================================================================================
How to check the code out of Git
==========================================================================================

1.  Check out the the code from the Apache Flex utilities project
	 git clone https://git-wip-us.apache.org/repos/asf/flex-utilities.git flex-utilities
	 cd flex-utilities
	 git checkout develop 

2.  Change directory to:
	cd Squiggly
	
==========================================================================================
How to use the Squiggly SDK
==========================================================================================

Please read the ASDocs (found in docs directory) first to understand the
classes in Squiggly.

For Apache Flex projects if you are using the SpellChecker class directly, you need:
- ApacheFlexSpellingEngine.swc in [YourProject]/libs folder
- ApacheFlexSpellingFramwork.swc in [YourProject]/libs folder
- ApacheFlexLinguisticUtils.swc in [YourProject]/libs folder
- Dictionary files in [YourProject]/src folder

You can obtain en_US, en_CA and en_GB dictionaries under a BSD/MIT-like license
from SCOWL (and friends):
   http://wordlist.aspell.net/dicts
   https://github.com/kevina/wordlist
   
For your convenience the en_US and en_GB dictionaries have been included in the
source and binary releases.  

You can obtain other dictionary files from:
    http://wordlist.aspell.net/other-dicts
    http://extensions.openoffice.org
    http://hunspell.sourceforge.net

But note that many of these dictionaries are under LPGL licenses.

If you are using the simple UI integration feature (SpellUI class), in addition
to what mentioned above, you also need:
- SpellingConfig.xml in [YourProject]/src
- ApacheFlexSpellingUI.swc (if you need mx support) in [YourProject]/libs
- ApacheFlexSpellingUIEx.swc (if you need spark support) in [YourProject]/libs 

Note that you can only support spelling in mx or spark components not both at once.

You can download dictionaries and use those by editing SpellingConfig.xml.

The default name of the config file has changed from AdobeSpellingConfig.xml to
SpellingConfig.xml.

Here's the typical content of SpellingConfig.xml, each entry maps the languageCode
with the relative path for resource files. 

<SpellingConfig>
  <LanguageResource language="English" languageCode="en_US"
    ruleFile="dict/en_US/en_US.aff" dictionaryFile="dict/en_US/en_US.dic"/>
</SpellingConfig>

So if you are adding Spanish, you just need to get the dictionary files es_ES.aff
and es_ES.dic and add one line to your config file.
  <LanguageResource language="Spanish" languageCode="es_ES"
     ruleFile="dict/es_ES/es_ES.aff" dictionaryFile="dict/es_ES/es_ES.dic"/>

Note that you can put the dictionaries in any location as long as you update
the config file, but the config file itself MUST be in [YourProject]/src folder.


Thanks for using Apache Flex.  Enjoy!

       The Apache Flex Project
       <http://flex.apache.org>



	
