You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ha...@apache.org on 2021/12/12 14:44:27 UTC

[royale-asjs] branch feature/markdown created (now bccc0a8)

This is an automated email from the ASF dual-hosted git repository.

harbs pushed a change to branch feature/markdown
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git.


      at bccc0a8  First commit of markdown classes

This branch includes the following new commits:

     new bccc0a8  First commit of markdown classes

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[royale-asjs] 01/01: First commit of markdown classes

Posted by ha...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

harbs pushed a commit to branch feature/markdown
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git

commit bccc0a87590180a58984d1630f55be4c4af2b510
Author: Harbs <ha...@in-tools.com>
AuthorDate: Sun Dec 12 16:42:59 2021 +0200

    First commit of markdown classes
---
 frameworks/js/projects/MarkdownJS/build.xml        | 136 ++++++++++++
 .../src/main/config/compile-js-config.xml          | 103 +++++++++
 .../projects/MarkdownJS/src/test/royale/build.xml  | 242 +++++++++++++++++++++
 frameworks/projects/Markdown/asconfig.json         |  34 +++
 frameworks/projects/Markdown/build.xml             | 177 +++++++++++++++
 frameworks/projects/Markdown/pom.xml               | 119 ++++++++++
 .../src/main/config/compile-swf-config.xml         |  96 ++++++++
 .../Markdown/src/main/resources/basic-manifest.xml |  23 ++
 .../Markdown/src/main/resources/defaults.css       |  19 ++
 .../Markdown/src/main/royale/MarkdownClasses.as    |  33 +++
 .../org/apache/royale/markdown/BlockParser.as      |  28 +++
 .../org/apache/royale/markdown/BlockState.as       |  28 +++
 .../org/apache/royale/markdown/CoreParser.as       |  31 +++
 .../royale/org/apache/royale/markdown/CoreState.as |  28 +++
 .../org/apache/royale/markdown/Environment.as      |  28 +++
 .../royale/org/apache/royale/markdown/IParser.as   |  25 +++
 .../royale/org/apache/royale/markdown/IState.as    |  25 +++
 .../org/apache/royale/markdown/InlineParser.as     |  28 +++
 .../org/apache/royale/markdown/InlineState.as      |  28 +++
 .../org/apache/royale/markdown/MarkdownParser.as   |  44 ++++
 .../royale/FlexUnitRoyaleApplication-config.xml    | 114 ++++++++++
 .../src/test/royale/FlexUnitRoyaleApplication.mxml |  98 +++++++++
 .../projects/Markdown/src/test/royale/build.xml    | 116 ++++++++++
 .../test/royale/flexUnitTests/MarkdownTester.as    |  39 ++++
 .../markdown/URLVariablesTesterTest.as             | 129 +++++++++++
 25 files changed, 1771 insertions(+)

diff --git a/frameworks/js/projects/MarkdownJS/build.xml b/frameworks/js/projects/MarkdownJS/build.xml
new file mode 100644
index 0000000..168948c
--- /dev/null
+++ b/frameworks/js/projects/MarkdownJS/build.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+
+<project name="MarkdownJS" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../../.."/>
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/local.properties"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+    
+    <property name="target.name" value="${ant.project.name}.swc" />
+    <tstamp>
+        <format property="royale.swc-date" pattern="MM/dd/yy HH:mm Z"/>
+    </tstamp>
+    <echo>swc-date is ${royale.swc-date}</echo>
+
+    <echo file="${basedir}/${target.name}.properties">target.name.nojs=${ant.project.name}</echo>
+    <replaceregexp file="${basedir}/${target.name}.properties" match="(.*)JS$" replace="\1" flags="m" />
+    <property file="${basedir}/${target.name}.properties"/>
+    <delete file="${basedir}/${target.name}.properties"/>
+    
+    <target name="main" depends="clean,check-compiler,compile" description="Full build of ${ant.project.name}.swc">
+    </target>
+    
+    <target name="check-for-tests" >
+        <condition property="skip-tests" >
+            <not>
+                <available file="${basedir}/src/test/royale/build.xml" />
+            </not>
+        </condition>
+    </target>
+    
+    <target name="test" depends="check-for-tests,check-compiler" unless="skip-tests">
+        <ant dir="src/test/royale" />
+    </target>
+    
+    <target name="clean">
+        <delete failonerror="false">
+            <fileset dir="${ROYALE_HOME}/frameworks/js/libs">
+                <include name="${target.name}"/>
+            </fileset>
+        </delete>
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${basedir}/target">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+        <antcall target="clean-tests" />
+    </target>
+    
+    <target name="clean-tests" depends="check-for-tests" unless="skip-tests">
+        <ant dir="src/test/royale" target="clean"/>
+    </target>
+    
+    <target name="compile" depends="check-compiler">
+        <echo message="Cross-compiling ${target.name}"/>
+        <echo message="ROYALE_COMPILER_HOME: ${ROYALE_COMPILER_HOME}"/>
+        <mkdir dir="${basedir}/target/generated-sources/royale"/>
+        <java jar="${ROYALE_COMPILER_HOME}/lib/compc.jar" fork="true" >
+            <jvmarg value="-Xmx384m" />
+            <jvmarg value="-Dsun.io.useCanonCaches=false" />
+            <jvmarg value="-Droyalelib=${ROYALE_HOME}/frameworks" />
+            <arg value="+royalelib=${ROYALE_HOME}/frameworks" />
+            <arg value="-compiler.strict-xml=true" />
+            <arg value="-compiler.targets=SWF,JSRoyale" />
+            <arg line="-metadata.date=&quot;${royale.swc-date}&quot;" />
+            <arg line="-metadata.dateFormat=&quot;MM/dd/yy HH:mm Z&quot;" />
+            <arg line="-swf-debugfile-alias=&quot;/org/apache/royale/${release.version}&quot;" />
+            <arg value="-output=${basedir}/target/${target.name}" />
+            <arg value="-load-config=${ROYALE_HOME}/frameworks/js-config.xml" />
+            <arg value="-load-config+=${basedir}/src/main/config/compile-js-config.xml" />
+        </java>
+        <copy file="${basedir}/target/${target.name}" tofile="${ROYALE_HOME}/frameworks/js/libs/${target.name}" />
+    </target>
+    
+    <target name="copy-js" >
+        <mkdir dir="${ROYALE_HOME}/frameworks/js/generated-sources"/>
+        <copy todir="${ROYALE_HOME}/frameworks/js/generated-sources">
+            <fileset dir="${basedir}/target/generated-sources/royale">
+                <include name="**/**" />
+            </fileset>
+        </copy>
+    </target>
+    
+    <target name="check-compiler" depends="check-compiler-home,check-transpiler-home">
+        <path id="lib.path">
+            <fileset dir="${ROYALE_COMPILER_HOME}/lib" includes="compiler-royaleTasks.jar"/>
+        </path>
+        <taskdef resource="flexTasks.tasks" classpathref="lib.path"/>
+    </target>
+    
+    <target name="check-compiler-home"
+        description="Set ROYALE_SWF_COMPILER_HOME to point at the compiler.">
+        
+        <available file="${ROYALE_HOME}/lib/compiler-mxmlc.jar"
+        type="file"
+        property="ROYALE_SWF_COMPILER_HOME"
+        value="${ROYALE_HOME}"/>
+        
+        <fail message="ROYALE_SWF_COMPILER_HOME must be set to a folder with a lib sub-folder containing compiler-mxmlc.jar such as the compiler folder in royale-compiler repo or the root of a Royale SDK"
+        unless="ROYALE_SWF_COMPILER_HOME"/>
+    </target>
+    
+    <target name="check-transpiler-home"
+        description="Set ROYALE_COMPILER_HOME to point at the cross-compiler.">
+        
+        <available file="${ROYALE_HOME}/js/lib/jsc.jar"
+        type="file"
+        property="ROYALE_COMPILER_HOME"
+        value="${ROYALE_HOME}/js"/>
+        
+        <fail message="ROYALE_COMPILER_HOME must be set to a folder with a lib sub-folder containing jsc.jar such as the compiler-jx folder in royale-compiler repo or the js folder of a Royale SDK"
+        unless="ROYALE_COMPILER_HOME"/>
+    </target>
+    
+</project>
diff --git a/frameworks/js/projects/MarkdownJS/src/main/config/compile-js-config.xml b/frameworks/js/projects/MarkdownJS/src/main/config/compile-js-config.xml
new file mode 100644
index 0000000..f695991
--- /dev/null
+++ b/frameworks/js/projects/MarkdownJS/src/main/config/compile-js-config.xml
@@ -0,0 +1,103 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<royale-config>
+
+    <compiler>
+        <accessible>false</accessible>
+        
+        <!-- build both SWF and JS. -->
+        <targets>
+            <target>SWF</target>
+            <target>JSRoyale</target>
+        </targets>
+        <strict-xml>true</strict-xml>
+
+		<mxml>
+			<children-as-data>true</children-as-data>
+		</mxml>
+		<binding-value-change-event>org.apache.royale.events.ValueChangeEvent</binding-value-change-event>
+		<binding-value-change-event-kind>org.apache.royale.events.ValueChangeEvent</binding-value-change-event-kind>
+		<binding-value-change-event-type>valueChange</binding-value-change-event-type>
+
+        <define>
+            <name>COMPILE::SWF</name>
+            <value>false</value>
+        </define>
+        <define>
+            <name>COMPILE::JS</name>
+            <value>true</value>
+        </define>
+
+        <keep-as3-metadata>
+          <name>Bindable</name>
+          <name>Managed</name>
+          <name>ChangeEvent</name>
+          <name>NonCommittingChangeEvent</name>
+          <name>Transient</name>
+        </keep-as3-metadata>
+	  
+        <locale/>
+        
+        <external-library-path append="true">
+            <path-element>../../../../../libs/LanguageJS.swc</path-element>
+            <path-element>../../../../../libs/CoreJS.swc</path-element>
+            <path-element>../../../../../libs/BasicJS.swc</path-element>
+            <path-element>../../../../../libs/ReflectionJS.swc</path-element>
+        </external-library-path>
+        
+        <namespaces>
+            <namespace>
+                <uri>library://ns.apache.org/royale/basic</uri>
+                <manifest>../../../../../../projects/Markdown/src/main/resources/basic-manifest.xml</manifest>
+            </namespace>
+        </namespaces>
+        
+        <source-path>
+            <path-element>../../../../../../projects/Markdown/src/main/royale</path-element>
+        </source-path>
+        
+        <warn-no-constructor>false</warn-no-constructor>
+		<!-- Use of the instanceof operator. -->
+        <warn-instance-of-changes>false</warn-instance-of-changes>
+    </compiler>
+    
+    <include-file>
+        <name>defaults.css</name>
+        <path>../../../../../../projects/Markdown/src/main/resources/defaults.css</path>
+    </include-file>
+
+    <include-sources>
+    </include-sources>
+    
+    <include-classes>
+        <class>NetworkClasses</class>
+    </include-classes>
+    
+    <include-namespaces>
+        <uri>library://ns.apache.org/royale/basic</uri>
+    </include-namespaces>
+
+    <js-default-initializers>false</js-default-initializers>
+
+    <js-complex-implicit-coercions>false</js-complex-implicit-coercions>
+    <js-resolve-uncertain>false</js-resolve-uncertain>
+    <js-vector-index-checks>false</js-vector-index-checks>
+        
+
+</royale-config>
diff --git a/frameworks/js/projects/MarkdownJS/src/test/royale/build.xml b/frameworks/js/projects/MarkdownJS/src/test/royale/build.xml
new file mode 100644
index 0000000..0940edf
--- /dev/null
+++ b/frameworks/js/projects/MarkdownJS/src/test/royale/build.xml
@@ -0,0 +1,242 @@
+<?xml version="1.0"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+
+<project name="MarkdownJS.test" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../../../../../.."/>
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/local.properties"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${env.ROYALE_HOME}"/>
+    <property name="ROYALE_SWF_COMPILER_HOME" value="${env.ROYALE_SWF_COMPILER_HOME}"/>
+    <property name="target.name" value="MarkdownJS-${release.version}.swc" />
+
+    <!--
+        Windows browser:
+            try chrome first because it's the most popular browser
+            otherwise, try to fall back to firefox
+            DON'T use internet explorer! it cannot run scripts in local pages
+    -->
+    <condition property="royaleunit.browser" value="${env.ProgramFiles}/Google/Chrome/Application/chrome.exe">
+        <and>
+            <os family="windows"/>
+            <available file="${env.ProgramFiles}/Google/Chrome/Application/chrome.exe"/>
+        </and>
+    </condition>
+    <condition property="royaleunit.browser" value="${env.ProgramFiles(x86)}/Google/Chrome/Application/chrome.exe">
+        <and>
+            <os family="windows"/>
+            <available file="${env.ProgramFiles(x86)}/Google/Chrome/Application/chrome.exe"/>
+        </and>
+    </condition>
+    <condition property="royaleunit.browser" value="${env.ProgramFiles}/Mozilla Firefox/firefox.exe">
+        <and>
+            <os family="windows"/>
+            <available file="${env.ProgramFiles}/Mozilla Firefox/firefox.exe"/>
+        </and>
+    </condition>
+    <condition property="royaleunit.browser" value="${env.ProgramFiles(x86)}/Mozilla Firefox/firefox.exe">
+        <and>
+            <os family="windows"/>
+            <available file="${env.ProgramFiles(x86)}/Mozilla Firefox/firefox.exe"/>
+        </and>
+    </condition>
+
+    <!--
+        macOS browser:
+            try chrome first because it's the most popular browser
+            otherwise, try to fall back to firefox
+            DON'T use safari! it asks the user to confirm opening local pages
+    -->
+    <condition property="royaleunit.browser" value="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome">
+        <and>
+            <os family="mac"/>
+            <available file="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"/>
+        </and>
+    </condition>
+    <condition property="royaleunit.browser" value="/Applications/Firefox.app/Contents/MacOS/firefox">
+        <and>
+            <os family="mac"/>
+            <available file="/Applications/Firefox.app/Contents/MacOS/firefox"/>
+        </and>
+    </condition>
+
+    <!--
+        Linux/Unix browser
+    -->
+    <condition property="royaleunit.browser" value="/usr/bin/firefox">
+        <and>
+            <os family="unix"/>
+            <available file="/usr/bin/firefox"/>
+        </and>
+    </condition>
+
+    <property name="report.dir" value="${basedir}/out" />
+
+    <target name="main" depends="clean,compile,test" description="Clean test of ${target.name}">
+    </target>
+
+    <target name="clean">
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${basedir}/target">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${report.dir}">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+    </target>
+    
+    <path id="lib.path">
+      <fileset dir="${ROYALE_COMPILER_HOME}/lib" includes="compiler-royaleTasks.jar"/>
+      <fileset dir="${ROYALE_COMPILER_HOME}/lib" includes="royaleUnitTasks.jar"/>
+    </path>
+
+    <target name="compile" description="Cross-compiles tests">
+        <echo message="Cross-compiling tests"/>
+        <echo message="ROYALE_HOME: ${ROYALE_HOME}"/>
+        <echo message="ROYALE_SWF_COMPILER_HOME: ${ROYALE_SWF_COMPILER_HOME}"/>
+        <echo message="playerglobal.version: ${playerglobal.version}"/>
+
+        <!-- Load the <compc> task. We can't do this at the <project> level -->
+        <!-- because targets that run before flexTasks.jar gets built would fail. -->
+        <taskdef resource="flexTasks.tasks" classpathref="lib.path"/>
+        <!--
+            Link in the classes (and their dependencies) for the MXML tags
+            listed in this project's manifest.xml.
+            Also link the additional classes (and their dependencies)
+            listed in RoyaleUIClasses.as,
+            because these aren't referenced by the manifest classes.
+            Keep the standard metadata when compiling.
+            Include the appropriate CSS files and assets in the SWC.
+            Don't include any resources in the SWC.
+            Write a bundle list of referenced resource bundles
+            into the file bundles.properties in this directory.
+        -->
+        <mxmlc fork="true"
+            file="${basedir}/../../../../../../projects/Markdown/src/test/royale/FlexUnitRoyaleApplication.mxml">
+            <jvmarg line="${mxmlc.jvm.args}"/>
+            <!--
+            <jvmarg value="-Xdebug" />
+            <jvmarg value="-Xnoagent" />
+            <jvmarg value="-Xrunjdwp:transport=dt_socket,address=8763,server=y,suspend=y" />
+             -->
+            <!--<arg value="-debug" />-->
+            <arg value="-compiler.targets=JSRoyale" />
+            <arg value="-js-output=target" />
+            <arg value="+playerglobal.version=${playerglobal.version}" />
+            <arg value="+env.PLAYERGLOBAL_HOME=${PLAYERGLOBAL_HOME}" />
+        </mxmlc>
+    </target>
+
+    <target name="check-royaleunit-browser" if="royaleunit.browser" unless="skip-tests">
+        <!--
+            if the royaleunit.browser property was provided manually,
+            check if the file actually exists
+        -->
+        <condition property="royaleunit.browser.exists">
+            <and>
+                <isset property="royaleunit.browser" />
+                <available file="${royaleunit.browser}" type="file" />
+            </and>
+        </condition>
+        
+        <fail unless="royaleunit.browser.exists" message="Invalid royaleunit.browser path: &quot;${royaleunit.browser}&quot;. To skip RoyaleUnit tests, use -Dskip-tests." />
+    </target>
+
+    <target name="test" depends="check-royaleunit-browser"
+            if="royaleunit.browser.exists" unless="skip-tests"
+            xmlns:if="ant:if" xmlns:unless="ant:unless">
+
+        <macrodef name="debug.test">
+            <attribute name="is.needed" default="false"/>
+            <sequential>
+                <echo if:true="@{is.needed}">JS-RELEASE TESTS FAILED</echo>
+                <echo if:true="@{is.needed}">Running backup tests in js-debug build, because release build tests failed</echo>
+                <royaleunit if:true="@{is.needed}"
+                            player="html"
+                            swf="${basedir}/target/bin/js-debug/index.html"
+                            command="${royaleunit.browser}"
+                            workingDir="${basedir}"
+                            toDir="${report.dir}"
+                            haltonfailure="false"
+                            failureProperty="debugBuildFail"
+                            verbose="true"
+                            localTrusted="true"
+                            timeout="90000" />
+                <condition if:true="@{is.needed}" property="debugTestResult" value="PASSED" else="FAILED">
+                    <not>
+                        <isset property="debugBuildFail"/>
+                    </not>
+                </condition>
+            </sequential>
+        </macrodef>
+
+        <!-- Load the <royaleunit> task. We can't do this at the <project> level -->
+        <!-- because targets that run before royaleUnitTasks.jar gets built would fail. -->
+        <taskdef resource="royaleUnitTasks.tasks" classpathref="lib.path"/>
+
+        <mkdir dir="${report.dir}" />
+        <royaleunit
+                player="html"
+                swf="${basedir}/target/bin/js-release/index.html"
+                command="${royaleunit.browser}"
+                workingDir="${basedir}"
+                toDir="${report.dir}"
+                haltonfailure="false"
+                failureProperty="releaseBuildFail"
+                verbose="true"
+                localTrusted="true"
+                timeout="90000" />
+
+        <condition property="releaseTestResult" value="PASSED" else="FAILED">
+            <not>
+                <isset property="releaseBuildFail"/>
+            </not>
+        </condition>
+
+        <!-- the above runs a test in release build. If it fails, try again in debug-build -->
+        <debug.test is.needed="${releaseBuildFail}"/>
+        <!-- if the debug test ran, it will had already set 'debugTestResult', otherwise set it to 'Not tested' below -->
+        <property name="debugTestResult" value="Not tested" />
+
+        <property name="testResult">
+            ${ant.project.name} RoyaleUnit Release build tests: ${releaseTestResult}
+            ${ant.project.name} RoyaleUnit Debug build tests: ${debugTestResult}
+        </property>
+
+        <!-- Generate readable JUnit-style reports -->
+        <junitreport todir="${report.dir}">
+            <fileset dir="${report.dir}">
+                <include name="TEST-*.xml" />
+            </fileset>
+            <report format="frames" todir="${report.dir}/html" />
+        </junitreport>
+
+        <!-- fail now if release tests are broken (with debug test info as well) -->
+        <fail if="releaseBuildFail" message="Test Failure ${line.separator}RoyaleUnit Release Build Tests must pass: ${line.separator} ${testResult}" />
+        <!-- otherwise just show test result -->
+        <echo>${testResult}</echo>
+    </target>
+</project>
diff --git a/frameworks/projects/Markdown/asconfig.json b/frameworks/projects/Markdown/asconfig.json
new file mode 100644
index 0000000..84cf00b
--- /dev/null
+++ b/frameworks/projects/Markdown/asconfig.json
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ {
+    "config": "royale",
+    "type": "lib",
+    "compilerOptions": {
+        "debug": true,
+        "targets": [
+            "JSRoyale",
+            "SWF"
+        ],
+        "include-classes": [
+            "MarkdownClasses"
+        ],
+        "include-sources": [
+            "src/main/royale"
+        ],
+        "output": "target/Markdown.swc"
+    }
+}
diff --git a/frameworks/projects/Markdown/build.xml b/frameworks/projects/Markdown/build.xml
new file mode 100644
index 0000000..d2aab8d
--- /dev/null
+++ b/frameworks/projects/Markdown/build.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+
+<project name="Markdown" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../.."/>
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/local.properties"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+    <condition property="AIR_HOME" value="${env.AIR_HOME}">
+        <isset property="env.AIR_HOME" />
+    </condition>
+    <property name="AIR_HOME" value="${ROYALE_HOME}"/>
+    <condition property="PLAYERGLOBAL_HOME" value="${env.PLAYERGLOBAL_HOME}">
+        <isset property="env.PLAYERGLOBAL_HOME" />
+    </condition>
+    <property name="PLAYERGLOBAL_HOME" value="${ROYALE_HOME}/frameworks/libs/player"/>
+
+    <property name="target.name" value="${ant.project.name}.swc" />
+    
+    <tstamp>
+        <format property="royale.swc-date" pattern="MM/dd/yy HH:mm Z"/>
+    </tstamp>
+    <echo>swc-date is ${royale.swc-date}</echo>
+
+    <target name="main" depends="clean,check-compiler,compile,compile-js,copy-swc,test" description="Full build of ${ant.project.name}.swc">
+    </target>
+    
+    <target name="compile-js">
+        <ant dir="${ROYALE_HOME}/frameworks/js/projects/${ant.project.name}JS/" inheritAll="false" >
+            <property name="ROYALE_SWF_COMPILER_HOME" value="${ROYALE_SWF_COMPILER_HOME}"/>
+            <property name="ROYALE_COMPILER_HOME" value="${ROYALE_COMPILER_HOME}"/>
+            <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+        </ant>
+    </target>
+    
+    <target name="copy-swc" if="AIR_HOME">
+        <copy file="${basedir}/target/${target.name}" tofile="${ROYALE_HOME}/frameworks/libs/${target.name}" />
+    </target>
+    
+    <target name="check-for-tests" >
+        <condition property="skip-tests" >
+            <not>
+                <available file="${basedir}/src/test/royale/build.xml" />
+            </not>
+        </condition>
+        <!-- exclude from js-only build -->
+        <condition property="skip-swf-tests">
+            <or>
+                <isset property="skip-tests" />
+                <not>
+                    <!-- env.AIR_HOME is how we determine if it's a SWF distritbution -->
+                    <isset property="env.AIR_HOME" />
+                </not>
+            </or>
+        </condition>
+    </target>
+    
+    <target name="test" depends="check-for-tests,check-compiler" unless="skip-tests">
+        <antcall target="test-swf" />
+        <antcall target="test-js" />
+    </target>
+    
+    <target name="test-swf" unless="skip-swf-tests">
+        <ant dir="src/test/royale" />
+    </target>
+
+    <target name="test-js">
+        <ant dir="${ROYALE_HOME}/frameworks/js/projects/${ant.project.name}JS/" inheritAll="false" target="test">
+            <property name="ROYALE_SWF_COMPILER_HOME" value="${ROYALE_SWF_COMPILER_HOME}"/>
+            <property name="ROYALE_COMPILER_HOME" value="${ROYALE_COMPILER_HOME}"/>
+            <property name="ROYALE_HOME" value="${ROYALE_HOME}"/>
+            <property name="AIR_HOME" value="${AIR_HOME}"/>
+            <property name="PLAYERGLOBAL_HOME" value="${PLAYERGLOBAL_HOME}"/>
+        </ant>
+    </target>
+
+    <target name="clean">
+        <delete failonerror="false">
+            <fileset dir="${ROYALE_HOME}/frameworks/libs">
+                <include name="${target.name}"/>
+            </fileset>
+        </delete>
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${basedir}/target">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+        <antcall target="clean-tests" />
+    </target>
+    
+    <target name="clean-tests" depends="check-for-tests" unless="skip-tests">
+        <ant dir="src/test/royale" target="clean"/>
+    </target>
+    
+    <target name="compile" description="Compiles .as files into .swc" if="AIR_HOME">
+        <echo message="Compiling libs/${ant.project.name}.swc"/>
+        <echo message="ROYALE_HOME: ${ROYALE_HOME}"/>
+        <echo message="ROYALE_SWF_COMPILER_HOME: ${ROYALE_SWF_COMPILER_HOME}"/>
+        <echo message="ROYALE_COMPILER_HOME: ${ROYALE_COMPILER_HOME}"/>
+        
+        <java jar="${ROYALE_COMPILER_HOME}/lib/compc.jar" fork="true" >
+            <jvmarg value="-Xmx384m" />
+            <jvmarg value="-Dsun.io.useCanonCaches=false" />
+            <jvmarg value="-Droyalelib=${ROYALE_HOME}/frameworks" />
+            <arg value="+royalelib=${ROYALE_HOME}/frameworks" />
+            <arg value="+playerglobal.version=${playerglobal.version}" />
+            <arg value="+env.AIR_HOME=${AIR_HOME}" />
+            <arg value="-compiler.strict-xml=true" />
+            <arg value="-compiler.targets=SWF,JSRoyale" />
+            <arg line="-metadata.date=&quot;${royale.swc-date}&quot;" />
+            <arg line="-metadata.dateFormat=&quot;MM/dd/yy HH:mm Z&quot;" />
+            <arg line="-swf-debugfile-alias=&quot;/org/apache/royale/${release.version}&quot;" />
+            <arg value="-output=${basedir}/target/${target.name}" />
+            <arg value="-load-config=${basedir}/src/main/config/compile-swf-config.xml" />
+            <arg value="-js-load-config=${ROYALE_HOME}/frameworks/js-config.xml" />
+            <arg value="-js-load-config+=${basedir}/../../js/projects/${ant.project.name}JS/src/main/config/compile-js-config.xml" />
+        </java>
+    </target>
+    
+    <target name="check-compiler" depends="check-compiler-home,check-transpiler-home">
+        <path id="lib.path">
+            <fileset dir="${ROYALE_COMPILER_HOME}/lib" includes="compiler-royaleTasks.jar"/>
+        </path>
+        <taskdef resource="flexTasks.tasks" classpathref="lib.path"/>
+    </target>
+    
+    <target name="check-compiler-home"
+        description="Set ROYALE_SWF_COMPILER_HOME to point at the compiler.">
+        
+        <available file="${ROYALE_HOME}/lib/compiler-mxmlc.jar"
+        type="file"
+        property="ROYALE_SWF_COMPILER_HOME"
+        value="${ROYALE_HOME}"/>
+        
+        <fail message="ROYALE_SWF_COMPILER_HOME must be set to a folder with a lib sub-folder containing compiler-mxmlc.jar such as the compiler folder in royale-compiler repo or the root of a Royale SDK"
+        unless="ROYALE_SWF_COMPILER_HOME"/>
+    </target>
+    
+    <target name="check-transpiler-home"
+        description="Set ROYALE_COMPILER_HOME to point at the cross-compiler.">
+        
+        <available file="${ROYALE_HOME}/js/lib/jsc.jar"
+        type="file"
+        property="ROYALE_COMPILER_HOME"
+        value="${ROYALE_HOME}/js"/>
+
+        <available file="${env.ROYALE_COMPILER_HOME}/lib/jsc.jar"
+        type="file"
+        property="ROYALE_COMPILER_HOME"
+        value="${env.ROYALE_COMPILER_HOME}"/>
+        
+        <fail message="ROYALE_COMPILER_HOME must be set to a folder with a lib sub-folder containing jsc.jar such as the compiler-jx folder in royale-compiler repo or the js folder of a Royale SDK"
+        unless="ROYALE_COMPILER_HOME"/>
+    </target>
+    
+</project>
diff --git a/frameworks/projects/Markdown/pom.xml b/frameworks/projects/Markdown/pom.xml
new file mode 100644
index 0000000..d66fbd3
--- /dev/null
+++ b/frameworks/projects/Markdown/pom.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.royale.framework</groupId>
+    <artifactId>projects</artifactId>
+    <version>0.9.9-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>Markdown</artifactId>
+  <version>0.9.9-SNAPSHOT</version>
+  <packaging>swc</packaging>
+
+  <name>Apache Royale: Framework: Libs: Markdown</name>
+
+  <build>
+    <sourceDirectory>src/main/royale</sourceDirectory>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.royale.compiler</groupId>
+        <artifactId>royale-maven-plugin</artifactId>
+        <version>${project.royale.compiler.version}</version>
+        <extensions>true</extensions>
+        <configuration>
+          <namespaces>
+            <namespace>
+              <uri>library://ns.apache.org/royale/basic</uri>
+              <manifest>${project.basedir}/src/main/resources/basic-manifest.xml</manifest>
+            </namespace>
+          </namespaces>
+          <includeClasses>
+            <includeClass>MarkdownClasses</includeClass>
+          </includeClasses>
+          <includeFiles>
+            <include-file>
+              <name>defaults.css</name>
+              <path>../src/main/resources/defaults.css</path>
+            </include-file>
+          </includeFiles>
+          <skipExtern>true</skipExtern>
+          <skipAS>${royale.skipAS}</skipAS>
+          <additionalCompilerOptions>${project.compiler.options};-warn-instance-of-changes=false</additionalCompilerOptions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Core</artifactId>
+      <version>0.9.9-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Basic</artifactId>
+      <version>0.9.9-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.royale.framework</groupId>
+      <artifactId>Reflection</artifactId>
+      <version>0.9.9-SNAPSHOT</version>
+      <type>swc</type>
+      <classifier>js</classifier>
+    </dependency>
+  </dependencies>
+
+  <profiles>
+    <profile>
+      <id>option-with-swf</id>
+      <dependencies>
+        <dependency>
+          <groupId>org.apache.royale.framework</groupId>
+          <artifactId>Core</artifactId>
+          <version>0.9.9-SNAPSHOT</version>
+          <type>swc</type>
+          <classifier>swf</classifier>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.royale.framework</groupId>
+          <artifactId>Basic</artifactId>
+          <version>0.9.9-SNAPSHOT</version>
+          <type>swc</type>
+          <classifier>swf</classifier>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.royale.framework</groupId>
+          <artifactId>Reflection</artifactId>
+          <version>0.9.9-SNAPSHOT</version>
+          <type>swc</type>
+          <classifier>swf</classifier>
+        </dependency>
+      </dependencies>
+    </profile>
+  </profiles>
+
+<properties /></project>
diff --git a/frameworks/projects/Markdown/src/main/config/compile-swf-config.xml b/frameworks/projects/Markdown/src/main/config/compile-swf-config.xml
new file mode 100644
index 0000000..9e78bf9
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/config/compile-swf-config.xml
@@ -0,0 +1,96 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<royale-config>
+
+    <compiler>
+        <accessible>false</accessible>
+        
+        <!-- build both SWF and JS. -->
+        <targets>
+            <target>SWF</target>
+            <target>JSRoyale</target>
+        </targets>
+        <strict-xml>true</strict-xml>
+
+        <external-library-path>
+            <path-element>${env.AIR_HOME}/frameworks/libs/air/airglobal.swc</path-element>
+            <path-element>../../../../../libs/Core.swc</path-element>
+            <path-element>../../../../../libs/Basic.swc</path-element>
+            <path-element>../../../../../libs/Reflection.swc</path-element>
+        </external-library-path>
+        
+		<mxml>
+			<children-as-data>true</children-as-data>
+		</mxml>
+		<binding-value-change-event>org.apache.royale.events.ValueChangeEvent</binding-value-change-event>
+		<binding-value-change-event-kind>org.apache.royale.events.ValueChangeEvent</binding-value-change-event-kind>
+		<binding-value-change-event-type>valueChange</binding-value-change-event-type>
+
+        <define>
+            <name>COMPILE::SWF</name>
+            <value>true</value>
+        </define>
+        <define>
+            <name>COMPILE::JS</name>
+            <value>false</value>
+        </define>
+
+        <keep-as3-metadata>
+          <name>Bindable</name>
+          <name>Managed</name>
+          <name>ChangeEvent</name>
+          <name>NonCommittingChangeEvent</name>
+          <name>Transient</name>
+        </keep-as3-metadata>
+	  
+        <locale/>
+        
+        <library-path/>
+
+        <namespaces>
+            <namespace>
+                <uri>library://ns.apache.org/royale/basic</uri>
+                <manifest>../resources/basic-manifest.xml</manifest>
+            </namespace>
+        </namespaces>
+        
+        <source-path>
+            <path-element>../royale</path-element>
+        </source-path>
+        
+        <warn-no-constructor>false</warn-no-constructor>
+    </compiler>
+
+    <include-file>
+        <name>defaults.css</name>
+        <path>../resources/defaults.css</path>
+    </include-file>
+
+    <include-classes>
+        <class>MarkdownClasses</class>
+    </include-classes>
+    
+    <include-namespaces>
+        <uri>library://ns.apache.org/royale/basic</uri>
+    </include-namespaces>  
+        
+    <target-player>${playerglobal.version}</target-player>
+	
+
+</royale-config>
diff --git a/frameworks/projects/Markdown/src/main/resources/basic-manifest.xml b/frameworks/projects/Markdown/src/main/resources/basic-manifest.xml
new file mode 100644
index 0000000..d6ff788
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/resources/basic-manifest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+<componentPackage>
+    <component id="MardownParser" class="org.apache.royale.markdown.MarkdownParser"/>
+</componentPackage>
diff --git a/frameworks/projects/Markdown/src/main/resources/defaults.css b/frameworks/projects/Markdown/src/main/resources/defaults.css
new file mode 100644
index 0000000..b95f8f1
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/resources/defaults.css
@@ -0,0 +1,19 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+ @namespace "library://ns.apache.org/royale/basic";
+
diff --git a/frameworks/projects/Markdown/src/main/royale/MarkdownClasses.as b/frameworks/projects/Markdown/src/main/royale/MarkdownClasses.as
new file mode 100644
index 0000000..634a654
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/MarkdownClasses.as
@@ -0,0 +1,33 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package
+{
+    /**
+    *  @private
+    *  This class is used to link additional classes into Markdown.swc
+    *  beyond those that are found by dependency analysis starting
+    *  from the classes specified in manifest.xml.
+    */
+    internal class MarkdownClasses
+    {
+        import org.apache.royale.net.URLLoader; URLLoader;
+        
+    }
+}
+
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/BlockParser.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/BlockParser.as
new file mode 100644
index 0000000..81cd6b6
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/BlockParser.as
@@ -0,0 +1,28 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public class BlockParser implements IParser
+	{
+		public function BlockParser()
+		{
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/BlockState.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/BlockState.as
new file mode 100644
index 0000000..791cffe
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/BlockState.as
@@ -0,0 +1,28 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public class BlockState implements IState
+	{
+		public function BlockState()
+		{
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/CoreParser.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/CoreParser.as
new file mode 100644
index 0000000..67496df
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/CoreParser.as
@@ -0,0 +1,31 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public class CoreParser implements IParser
+	{
+		public function CoreParser()
+		{
+			
+		}
+		public function process(state:CoreState):void{
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/CoreState.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/CoreState.as
new file mode 100644
index 0000000..66dc189
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/CoreState.as
@@ -0,0 +1,28 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public class CoreState implements IState
+	{
+		public function CoreState(parser:MarkDownParser,str:String,env:Environment)
+		{
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/Environment.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/Environment.as
new file mode 100644
index 0000000..3b86205
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/Environment.as
@@ -0,0 +1,28 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public class Environment
+	{
+		public function Environment()
+		{
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/IParser.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/IParser.as
new file mode 100644
index 0000000..2bcd32b
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/IParser.as
@@ -0,0 +1,25 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public interface IParser
+	{
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/IState.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/IState.as
new file mode 100644
index 0000000..34960bd
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/IState.as
@@ -0,0 +1,25 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public interface IState
+	{
+		
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/InlineParser.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/InlineParser.as
new file mode 100644
index 0000000..80f59b4
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/InlineParser.as
@@ -0,0 +1,28 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public class InlineParser implements IParser
+	{
+		public function InlineParser()
+		{
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/InlineState.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/InlineState.as
new file mode 100644
index 0000000..7600a18
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/InlineState.as
@@ -0,0 +1,28 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public class InlineState implements IState
+	{
+		public function InlineState()
+		{
+			
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/MarkdownParser.as b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/MarkdownParser.as
new file mode 100644
index 0000000..ea3882e
--- /dev/null
+++ b/frameworks/projects/Markdown/src/main/royale/org/apache/royale/markdown/MarkdownParser.as
@@ -0,0 +1,44 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.markdown
+{
+	public class MarkdownParser implements IParser
+	{
+		/**
+		 * The main parser class.
+		 *
+		 */
+		public function MarkdownParser()
+		{
+			inlineParser = new InlineParser();
+			blockParser  = new BlockParser();
+			coreParser   = new CoreParser();			
+		}
+
+		private var inlineParser:InlineParser;
+		private var blockParser:BlockParser;
+		private var coreParser:CoreParser;
+
+		public function parse (str:String, env:Environment):void {
+			var state:CoreState = new CoreState(this, str, env);
+			coreParser.process(state);
+			// return state.tokens;
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Markdown/src/test/royale/FlexUnitRoyaleApplication-config.xml b/frameworks/projects/Markdown/src/test/royale/FlexUnitRoyaleApplication-config.xml
new file mode 100644
index 0000000..9b1cc04
--- /dev/null
+++ b/frameworks/projects/Markdown/src/test/royale/FlexUnitRoyaleApplication-config.xml
@@ -0,0 +1,114 @@
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+<royale-config>
+
+    <compiler>
+        <accessible>false</accessible>
+        
+        <targets>
+            <target>SWF</target>
+        </targets>
+        <strict-xml>true</strict-xml>
+
+        <external-library-path>
+            <path-element>{playerglobalHome}/{targetPlayerMajorVersion}.{targetPlayerMinorVersion}/playerglobal.swc</path-element>
+        </external-library-path>
+        
+        <js-external-library-path>
+            <path-element>../../../../../../js/libs/js.swc</path-element>
+            <path-element>../../../../../../js/libs/gcl.swc</path-element>
+        </js-external-library-path>
+        
+        <library-path>
+            <path-element>../../../../../libs/Basic.swc</path-element>
+            <path-element>../../../../../libs/Binding.swc</path-element>
+            <path-element>../../../../../libs/Core.swc</path-element>
+            <path-element>../../../../../libs/Graphics.swc</path-element>
+            <path-element>../../../../../libs/Collections.swc</path-element>
+            <path-element>../../../../../libs/Language.swc</path-element>
+            <path-element>../../../../../libs/Reflection.swc</path-element>
+            <path-element>../../../../../libs/Markdown.swc</path-element>
+            <path-element>../../../../../libs/RoyaleUnit.swc</path-element>
+        </library-path>
+        
+        <js-library-path>
+            <path-element>../../../../../js/libs/BasicJS.swc</path-element>
+            <path-element>../../../../../js/libs/BindingJS.swc</path-element>
+            <path-element>../../../../../js/libs/CoreJS.swc</path-element>
+            <path-element>../../../../../js/libs/GraphicsJS.swc</path-element>
+            <path-element>../../../../../js/libs/CollectionsJS.swc</path-element>
+            <path-element>../../../../../js/libs/LanguageJS.swc</path-element>
+            <path-element>../../../../../js/libs/ReflectionJS.swc</path-element>
+            <path-element>../../../../../js/libs/NetworkJS.swc</path-element>
+            <path-element>../../../../../js/libs/MarkdownJS.swc</path-element>
+            <path-element>../../../../../js/libs/XMLJS.swc</path-element>
+            <path-element>../../../../../js/libs/RoyaleUnitJS.swc</path-element>
+        </js-library-path>
+
+        <allow-subclass-overrides>true</allow-subclass-overrides>
+
+        <mxml>
+            <children-as-data>true</children-as-data>
+        </mxml>
+        <binding-value-change-event>org.apache.royale.events.ValueChangeEvent</binding-value-change-event>
+        <binding-value-change-event-kind>org.apache.royale.events.ValueChangeEvent</binding-value-change-event-kind>
+        <binding-value-change-event-type>valueChange</binding-value-change-event-type>
+        <fxg-base-class>flash.display.Sprite</fxg-base-class>
+
+        <keep-as3-metadata>
+          <name>Bindable</name>
+          <name>Managed</name>
+          <name>ChangeEvent</name>
+          <name>NonCommittingChangeEvent</name>
+          <name>Transient</name>
+          <name>SWFOverride</name>
+
+          <!-- RoyaleUnit -->
+          <name>Test</name>
+          <name>Before</name>
+          <name>After</name>
+          <name>BeforeClass</name>
+          <name>AfterClass</name>
+          <name>Ignore</name>
+          <name>Suite</name>
+          <name>RunWith</name>
+
+        </keep-as3-metadata>
+    
+        <locale/>
+        
+        <library-path/>
+
+        <namespaces>
+            <namespace>
+                <uri>http://ns.adobe.com/mxml/2009</uri>
+                <manifest>../../../../../mxml-2009-manifest.xml</manifest>
+            </namespace>
+            <namespace>
+                <uri>library://ns.apache.org/royale/basic</uri>
+                <manifest>../../main/resources/basic-manifest.xml</manifest>
+            </namespace>
+        </namespaces>
+        
+        <warn-no-constructor>false</warn-no-constructor>
+    </compiler>
+    
+    <target-player>${playerglobal.version}</target-player>
+
+</royale-config>
diff --git a/frameworks/projects/Markdown/src/test/royale/FlexUnitRoyaleApplication.mxml b/frameworks/projects/Markdown/src/test/royale/FlexUnitRoyaleApplication.mxml
new file mode 100644
index 0000000..d18b68a
--- /dev/null
+++ b/frameworks/projects/Markdown/src/test/royale/FlexUnitRoyaleApplication.mxml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-->
+
+<js:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
+                   xmlns:js="library://ns.apache.org/royale/basic" 
+                   xmlns:test="org.apache.royale.test.*" 
+                   applicationComplete="runTests()"
+                   >
+    <fx:Declarations>
+        <test:RoyaleUnitCore id="core"/>
+    </fx:Declarations>
+    <fx:Script>
+        <![CDATA[
+            COMPILE::SWF
+            {
+                import flash.system.fscommand;
+            }
+
+            import flexUnitTests.NetworkTester;
+            
+            import org.apache.royale.events.Event;
+            import org.apache.royale.test.listeners.CIListener;
+            import org.apache.royale.test.listeners.BrowserConsoleListener;
+            import org.apache.royale.test.Runtime;
+
+            //account for swf version variance in some test results due to fixed player bugs etc
+            public function getSwfVersion():uint{
+                COMPILE::SWF{
+                    return this.stage.loaderInfo.bytes[3];
+
+                }
+                return 0;
+            }
+
+            public function runLocal():Boolean{
+                var ret:Boolean = false;
+                COMPILE::JS{
+                    ret = window.location.search.indexOf('local')!= -1;
+                    if (!ret) {
+                        console.log('For javascript you can run this locally with console output for debugging purposes, using "?local" appended to the url.\nIt may not work for all browsers with file:// protocol (works with Chrome), in which case you need a local http server')
+                    }
+                }
+                return ret
+            }
+
+            public function getPlayerVersion():String{
+                COMPILE::SWF{
+                    import flash.system.Capabilities;
+                    return Capabilities.version;
+                }
+                return '';
+            }
+
+            public function runTests():void
+            {
+                Runtime.swfVersion = getSwfVersion();
+                if (runLocal()) {
+                    core.addListener(new BrowserConsoleListener());
+                } else{
+                    core.addListener(new CIListener());
+                }
+                core.addEventListener(Event.COMPLETE, core_completeHandler);
+                core.runClasses(NetworkTester);
+            }
+
+            private function core_completeHandler(event:Event):void
+            {
+                COMPILE::SWF
+                {
+                    fscommand("quit");
+                }
+            }
+            
+        ]]>
+    </fx:Script>
+    <js:valuesImpl>
+        <!-- for such a simple app, we just set values to an empty array so it thinks it doesn't have any values -->
+        <js:SimpleValuesImpl values="[]"/>
+    </js:valuesImpl>
+
+</js:Application>
diff --git a/frameworks/projects/Markdown/src/test/royale/build.xml b/frameworks/projects/Markdown/src/test/royale/build.xml
new file mode 100644
index 0000000..90eb3e7
--- /dev/null
+++ b/frameworks/projects/Markdown/src/test/royale/build.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+-->
+
+
+<project name="Markdown.test" default="main" basedir=".">
+    <property name="ROYALE_HOME" location="../../../../../.."/>
+    
+    <property file="${ROYALE_HOME}/env.properties"/>
+    <property environment="env"/>
+    <property file="${ROYALE_HOME}/local.properties"/>
+    <property file="${ROYALE_HOME}/build.properties"/>
+    <property name="ROYALE_HOME" value="${env.ROYALE_HOME}"/>
+    <property name="ROYALE_SWF_COMPILER_HOME" value="${env.ROYALE_SWF_COMPILER_HOME}"/>
+    <property name="target.name" value="Markdown-${release.version}.swc" />
+
+    <property name="report.dir" value="${basedir}/out" />
+
+    <target name="main" depends="clean,compile,test" description="Clean test of ${target.name}">
+    </target>
+    
+    <target name="clean">
+        <delete failonerror="false">
+            <fileset dir="${basedir}">
+                <include name="FlexUnitRoyaleApplication.swf"/>
+            </fileset>
+        </delete>
+        <delete failonerror="false" includeemptydirs="true">
+            <fileset dir="${report.dir}">
+                <include name="**/**"/>
+            </fileset>
+        </delete>
+    </target>
+    
+    <path id="lib.path">
+      <fileset dir="${ROYALE_COMPILER_HOME}/lib" includes="compiler-royaleTasks.jar"/>
+      <fileset dir="${ROYALE_COMPILER_HOME}/lib" includes="royaleUnitTasks.jar"/>
+    </path>
+
+    <target name="compile" description="Compiles FlexUnitRoyaleApplication.swf">
+        <echo message="Compiling FlexUnitRoyaleApplication.swf"/>
+        <echo message="ROYALE_HOME: ${ROYALE_HOME}"/>
+        <echo message="ROYALE_SWF_COMPILER_HOME: ${ROYALE_SWF_COMPILER_HOME}"/>
+        <echo message="playerglobal.version: ${playerglobal.version}"/>
+
+        <!-- Load the <compc> task. We can't do this at the <project> level -->
+        <!-- because targets that run before flexTasks.jar gets built would fail. -->
+        <taskdef resource="flexTasks.tasks" classpathref="lib.path"/>
+        <!--
+            Link in the classes (and their dependencies) for the MXML tags
+            listed in this project's manifest.xml.
+            Also link the additional classes (and their dependencies)
+            listed in RoyaleUIClasses.as,
+            because these aren't referenced by the manifest classes.
+            Keep the standard metadata when compiling.
+            Include the appropriate CSS files and assets in the SWC.
+            Don't include any resources in the SWC.
+            Write a bundle list of referenced resource bundles
+            into the file bundles.properties in this directory.
+        -->
+        <mxmlc fork="true"
+            file="${basedir}/FlexUnitRoyaleApplication.mxml"
+            output="${basedir}/FlexUnitRoyaleApplication.swf">
+            <jvmarg line="${mxmlc.jvm.args}"/>
+            <!--
+            <jvmarg value="-Xdebug" />
+            <jvmarg value="-Xnoagent" />
+            <jvmarg value="-Xrunjdwp:transport=dt_socket,address=8763,server=y,suspend=y" />
+             -->
+            <arg value="-debug" />
+            <arg value="-compiler.targets=SWF" />
+            <arg value="+playerglobal.version=${playerglobal.version}" />
+            <arg value="+env.PLAYERGLOBAL_HOME=${PLAYERGLOBAL_HOME}" />
+        </mxmlc>
+    </target>
+
+    <target name="test">
+        <!-- Load the <royaleunit> task. We can't do this at the <project> level -->
+        <!-- because targets that run before royaleUnitTasks.jar gets built would fail. -->
+        <taskdef resource="royaleUnitTasks.tasks" classpathref="lib.path"/>
+		<mkdir dir="${report.dir}" />
+		<royaleunit
+            swf="${basedir}/FlexUnitRoyaleApplication.swf"
+		    workingDir="${basedir}"
+		    toDir="${report.dir}"
+			haltonfailure="true"
+			verbose="true"
+			localTrusted="true"
+			timeout="90000" />
+        
+		<!-- Generate readable JUnit-style reports -->
+		<junitreport todir="${report.dir}">
+			<fileset dir="${report.dir}">
+				<include name="TEST-*.xml" />
+			</fileset>
+			<report format="frames" todir="${report.dir}/html" />
+		</junitreport>
+        
+    </target>
+</project>
diff --git a/frameworks/projects/Markdown/src/test/royale/flexUnitTests/MarkdownTester.as b/frameworks/projects/Markdown/src/test/royale/flexUnitTests/MarkdownTester.as
new file mode 100644
index 0000000..e39065e
--- /dev/null
+++ b/frameworks/projects/Markdown/src/test/royale/flexUnitTests/MarkdownTester.as
@@ -0,0 +1,39 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package flexUnitTests
+{
+    import flexUnitTests.markdown.*
+    
+    [Suite]
+    [RunWith("org.apache.royale.test.runners.SuiteRunner")]
+    /**
+     * @royalesuppresspublicvarwarning
+     */
+    public class MarkdownTester
+    {
+        public function MarkdownTester()
+        {
+            // for JS, force-link these classes in the output
+            var arr:Array = [];
+        }
+        
+        // public var urlVariablesTesterTest:URLVariablesTesterTest;
+        
+    }
+}
diff --git a/frameworks/projects/Markdown/src/test/royale/flexUnitTests/markdown/URLVariablesTesterTest.as b/frameworks/projects/Markdown/src/test/royale/flexUnitTests/markdown/URLVariablesTesterTest.as
new file mode 100644
index 0000000..622d6ec
--- /dev/null
+++ b/frameworks/projects/Markdown/src/test/royale/flexUnitTests/markdown/URLVariablesTesterTest.as
@@ -0,0 +1,129 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package flexUnitTests.markdown
+{
+    
+    
+
+    
+    import org.apache.royale.test.asserts.*;
+
+    
+    import org.apache.royale.net.URLVariables;
+    
+    
+    public class URLVariablesTesterTest
+    {
+        
+        [Before]
+        public function setUp():void
+        {
+        }
+        
+        [After]
+        public function tearDown():void
+        {
+        }
+        
+        [BeforeClass]
+        public static function setUpBeforeClass():void
+        {
+        }
+        
+        [AfterClass]
+        public static function tearDownAfterClass():void
+        {
+        }
+        
+        
+        private function encodedStringContentsMatch(string1:String, string2:String):Boolean{
+            if (string1.length == string2.length) {
+                var content1:Array = string1.split('&');
+                var content2:Array = string2.split('&');
+                if (content1.length == content2.length) {
+                    while(content1.length) {
+                        if (content2.indexOf(content1.pop()) == -1) return false;
+                    }
+                    return true;
+                }
+            }
+            return false;
+        }
+        
+       
+        [Test]
+        public function testEncoding():void
+        {
+            var tester:URLVariables = new URLVariables();
+            tester['test1'] = 'test1Value';
+            assertEquals(tester.toString(), 'test1=test1Value', 'unexpected encoded string');
+            
+            tester['test2'] = 'test2Value';
+            //handle arbitrary order of encoded values when testing:
+            assertTrue(encodedStringContentsMatch(tester.toString(), 'test1=test1Value&test2=test2Value'), 'unexpected encoded string')
+        }
+        
+        [Test]
+        public function testDecoding():void
+        {
+            var tester:URLVariables = new URLVariables('test1=test1Value');
+            assertEquals(tester['test1'], 'test1Value', 'unexpected decoded value');
+            
+            tester.decode('test2=test2Value');
+    
+            //cumulative:
+            assertEquals(tester['test1'], 'test1Value', 'unexpected decoded value');
+            assertEquals(tester['test2'], 'test2Value', 'unexpected decoded value');
+            
+            //test empty string as name in pair
+            tester = new URLVariables('=EmptyStringValue');
+            assertEquals(tester[''], 'EmptyStringValue', 'unexpected decoded value');
+    
+        }
+
+        [Test]
+        public function testDecodingWithPlus():void
+        {
+            var tester:URLVariables = new URLVariables('test1=test1Value+with+spaces');
+            assertEquals(tester['test1'], 'test1Value with spaces', 'unexpected decoded value');
+
+        }
+    
+    
+    
+        [Test]
+        public function testDecodingError():void
+        {
+            
+            var wasError:Boolean;
+            var tester:URLVariables = new URLVariables();
+            try{
+                //test2 name does not include a value:
+                tester.decode('test1=1&test2');
+            }catch(e:Error){
+                wasError = true;
+            }
+            assertTrue(wasError, 'Error should be thrown for incomplete name-value pair');
+            assertEquals(tester['test1'], '1', 'partially decoded value should be present');
+    
+            
+        }
+        
+    }
+}