
  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 as env.FLEX_HOME.

    The environment variable PLAYERGLOBAL_HOME needs to be set to the absolute path of the
    <flex-sdk>\frameworks\libs\player directory (i.e. not including the version subdirectory).
    The `playerglobal.version` option controls which PLAYERGLOBAL_HOME subdirectory is used.
    You can also set this in env.properties as env.PLAYERGLOBAL_HOME.
  
==========================================================================================
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.
(Note that 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>



	
