Dynamic FCKEditor Style Configuration

So, I have a CMS that now has multiple sites that it is managing. When there was only one site, FCKEditor could be set up statically now I need to dynamically assign a EditorAreaCSS and StylesXmlPath. The EditorAreaCSS is simple I just pass the correct css file into the config like this:


fckEditor.Config['EditorAreaCSS'] = '../styles/style.css';

The next step was a dynamic xml file for fckstyles.xml. What I wanted to do is to parse the css file for each site and dynamically display these styles in the drop down. So here is what I came up with:


<!---- fckstyles.xml.cfm --->
<cfsetting enablecfoutputonly=true>
<cfsetting showdebugoutput=false>
<cfsilent>
<cffile action="read" file="#ExpandPath('../Path/To/File/css/display.css')#" variable="css" />
<cfoutput>
<cfset variables.count= 0 />
<cfset variables.styleList = "" />
<cfloop list="#css#" delimiters="{" index="i">
<cfset variables.count = variables.count + 1 />
    <cfif variables.count eq 1>
        <cfset variables.styleList = i />
    <cfelse>
        <cftry>
        <cfset variables.thisClass = ListGetAt(ListGetAt(i,2,'}'),2,'.') />
            <cfif FindNoCase(':',variables.thisClass)>
                <cfset variables.thisClass = ListGetAt(variables.thisClass,1,':') />
                <cfif FindNoCase(' ',variables.thisClass)>
                    <cfset variables.thisClass = ListGetAt(variables.thisClass,1,' ') />
                </cfif>
            <cfelse>
                <cfif FindNoCase(' ',variables.thisClass)>
                    <cfset variables.thisClass = ListGetAt(variables.thisClass,1,' ') />
                </cfif>    
            </cfif>
        <cfif not ListFind(variables.styleList,variables.thisClass)>
            <cfset variables.styleList = trim(variables.styleList) & ',' & trim(variables.thisClass) />
        </cfif>
            <cfcatch type="any">
                <!-- fail silently --->
            </cfcatch>
        </cftry>
    </cfif>
</cfloop>
<cfset variables.ignoreList = "body" />
<cfsavecontent variable="FCKStyles"><?xml version="1.0" encoding="utf-8" ?>
<Styles>
    <cfloop list="#variables.styleList#" index="thisClass">
    <cfif not ListFindNoCase(variables.ignoreList,thisClass)>
    <Style name="#thisClass#" element="div">
        <Attribute name="class" value="#thisClass#" />
    </Style>
    </cfif>
    </cfloop>
</Styles>
</cfsavecontent>
</cfoutput>
</cfsilent>
<cfcontent type="text/xml" reset="true"><cfoutput>#FCKStyles#</cfoutput>

One of the keys is to rename the file with a .cfm extensions. This allows ColdFusion to process it. Once the file in generating correctly, you simply pass in that path.


fckEditor.Config['StylesXmlPath'] = '#basePath#fckstyles.xml.cfm';

I hope this helps.

Comments
BlogCFC was created by Raymond Camden. This blog is running version 5.9.2.002.