880 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			880 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
class CrayonHTMLElement {
 | 
						|
    public $id;
 | 
						|
    public $class = '';
 | 
						|
    public $tag = 'div';
 | 
						|
    public $closed = FALSE;
 | 
						|
    public $contents = '';
 | 
						|
    public $attributes = array();
 | 
						|
    const CSS_INPUT_PREFIX = "crayon-theme-input-";
 | 
						|
 | 
						|
    public static $borderStyles = array(
 | 
						|
        'none',
 | 
						|
        'hidden',
 | 
						|
        'dotted',
 | 
						|
        'dashed',
 | 
						|
        'solid',
 | 
						|
        'double',
 | 
						|
        'groove',
 | 
						|
        'ridge',
 | 
						|
        'inset',
 | 
						|
        'outset',
 | 
						|
        'inherit'
 | 
						|
    );
 | 
						|
 | 
						|
    public function __construct($id) {
 | 
						|
        $this->id = $id;
 | 
						|
    }
 | 
						|
 | 
						|
    public function addClass($class) {
 | 
						|
        $this->class .= ' ' . self::CSS_INPUT_PREFIX . $class;
 | 
						|
    }
 | 
						|
 | 
						|
    public function addAttributes($atts) {
 | 
						|
        $this->attributes = array_merge($this->attributes, $atts);
 | 
						|
    }
 | 
						|
 | 
						|
    public function attributeString() {
 | 
						|
        $str = '';
 | 
						|
        foreach ($this->attributes as $k => $v) {
 | 
						|
            $str .= "$k=\"$v\" ";
 | 
						|
        }
 | 
						|
        return $str;
 | 
						|
    }
 | 
						|
 | 
						|
    public function __toString() {
 | 
						|
        return '<' . $this->tag . ' id="' . self::CSS_INPUT_PREFIX . $this->id . '" class="' . self::CSS_INPUT_PREFIX . $this->class . '" ' . $this->attributeString() . ($this->closed ? ' />' : ' >' . $this->contents . "</$this->tag>");
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class CrayonHTMLInput extends CrayonHTMLElement {
 | 
						|
    public $name;
 | 
						|
    public $type;
 | 
						|
 | 
						|
    public function __construct($id, $name = NULL, $value = '', $type = 'text') {
 | 
						|
        parent::__construct($id);
 | 
						|
        $this->tag = 'input';
 | 
						|
        $this->closed = TRUE;
 | 
						|
        if ($name === NULL) {
 | 
						|
            $name = CrayonUserResource::clean_name($id);
 | 
						|
        }
 | 
						|
        $this->name = $name;
 | 
						|
        $this->class .= $type;
 | 
						|
        $this->addAttributes(array(
 | 
						|
            'type' => $type,
 | 
						|
            'value' => $value
 | 
						|
        ));
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class CrayonHTMLSelect extends CrayonHTMLInput {
 | 
						|
    public $options;
 | 
						|
    public $selected = NULL;
 | 
						|
 | 
						|
    public function __construct($id, $name = NULL, $value = '', $options = array()) {
 | 
						|
        parent::__construct($id, $name, 'select');
 | 
						|
        $this->tag = 'select';
 | 
						|
        $this->closed = FALSE;
 | 
						|
        $this->addOptions($options);
 | 
						|
    }
 | 
						|
 | 
						|
    public function addOptions($options, $default = NULL) {
 | 
						|
        for ($i = 0; $i < count($options); $i++) {
 | 
						|
            $key = $options[$i];
 | 
						|
            $value = isset($options[$key]) ? $options[$key] : $key;
 | 
						|
            $this->options[$key] = $value;
 | 
						|
        }
 | 
						|
        if ($default === NULL && count($options) > 1) {
 | 
						|
            $this->attributes['data-default'] = $options[0];
 | 
						|
        } else {
 | 
						|
            $this->attributes['data-default'] = $default;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function getOptionsString() {
 | 
						|
        $str = '';
 | 
						|
        foreach ($this->options as $k => $v) {
 | 
						|
            $selected = $this->selected == $k ? 'selected="selected"' : '';
 | 
						|
            $str .= "<option value=\"$k\" $selected>$v</option>";
 | 
						|
        }
 | 
						|
        return $str;
 | 
						|
    }
 | 
						|
 | 
						|
    public function __toString() {
 | 
						|
        $this->contents = $this->getOptionsString();
 | 
						|
        return parent::__toString();
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class CrayonHTMLSeparator extends CrayonHTMLElement {
 | 
						|
    public $name = '';
 | 
						|
 | 
						|
    public function __construct($name) {
 | 
						|
        parent::__construct($name);
 | 
						|
        $this->name = $name;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class CrayonHTMLTitle extends CrayonHTMLSeparator {
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
class CrayonThemeEditorWP {
 | 
						|
 | 
						|
    public static $attributes = NULL;
 | 
						|
    public static $attributeGroups = NULL;
 | 
						|
    public static $attributeGroupsInverse = NULL;
 | 
						|
    public static $attributeTypes = NULL;
 | 
						|
    public static $attributeTypesInverse = NULL;
 | 
						|
    public static $infoFields = NULL;
 | 
						|
    public static $infoFieldsInverse = NULL;
 | 
						|
    public static $settings = NULL;
 | 
						|
    public static $strings = NULL;
 | 
						|
 | 
						|
    const ATTRIBUTE = 'attribute';
 | 
						|
 | 
						|
    const RE_COMMENT = '#^\s*\/\*[\s\S]*?\*\/#msi';
 | 
						|
 | 
						|
    public static function initFields() {
 | 
						|
        if (self::$infoFields === NULL) {
 | 
						|
            self::$infoFields = array(
 | 
						|
                // These are canonical and can't be translated, since they appear in the comments of the CSS
 | 
						|
                'name' => 'Name',
 | 
						|
                'description' => 'Description',
 | 
						|
                'version' => 'Version',
 | 
						|
                'author' => 'Author',
 | 
						|
                'url' => 'URL',
 | 
						|
                'original-author' => 'Original Author',
 | 
						|
                'notes' => 'Notes',
 | 
						|
                'maintainer' => 'Maintainer',
 | 
						|
                'maintainer-url' => 'Maintainer URL'
 | 
						|
            );
 | 
						|
            self::$infoFieldsInverse = CrayonUtil::array_flip(self::$infoFields);
 | 
						|
            // A map of CSS element name and property to name
 | 
						|
            self::$attributes = array();
 | 
						|
            // A map of CSS attribute to input type
 | 
						|
            self::$attributeGroups = array(
 | 
						|
                'color' => array('background', 'background-color', 'border-color', 'color', 'border-top-color', 'border-bottom-color', 'border-left-color', 'border-right-color'),
 | 
						|
                'size' => array('border-width'),
 | 
						|
                'border-style' => array('border-style', 'border-bottom-style', 'border-top-style', 'border-left-style', 'border-right-style')
 | 
						|
            );
 | 
						|
            self::$attributeGroupsInverse = CrayonUtil::array_flip(self::$attributeGroups);
 | 
						|
            // Mapping of input type to attribute group
 | 
						|
            self::$attributeTypes = array(
 | 
						|
                'select' => array('border-style', 'font-style', 'font-weight', 'text-decoration')
 | 
						|
            );
 | 
						|
            self::$attributeTypesInverse = CrayonUtil::array_flip(self::$attributeTypes);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static function initSettings() {
 | 
						|
        CrayonSettingsWP::load_settings();
 | 
						|
        self::initFields();
 | 
						|
        self::initStrings();
 | 
						|
        if (self::$settings === NULL) {
 | 
						|
            self::$settings = array(
 | 
						|
                // Only things the theme editor needs
 | 
						|
                'cssThemePrefix' => CrayonThemes::CSS_PREFIX,
 | 
						|
                'cssInputPrefix' => CrayonHTMLElement::CSS_INPUT_PREFIX,
 | 
						|
                'attribute' => self::ATTRIBUTE,
 | 
						|
                'fields' => self::$infoFields,
 | 
						|
                'fieldsInverse' => self::$infoFieldsInverse,
 | 
						|
                'prefix' => 'crayon-theme-editor'
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static function initStrings() {
 | 
						|
        if (self::$strings === NULL) {
 | 
						|
            self::$strings = array(
 | 
						|
                // These appear only in the UI and can be translated
 | 
						|
                'userTheme' => crayon__("User-Defined Theme"),
 | 
						|
                'stockTheme' => crayon__("Stock Theme"),
 | 
						|
                'success' => crayon__("Success!"),
 | 
						|
                'fail' => crayon__("Failed!"),
 | 
						|
                'delete' => crayon__("Delete"),
 | 
						|
                'deleteThemeConfirm' => crayon__("Are you sure you want to delete the \"%s\" theme?"),
 | 
						|
                'deleteFail' => crayon__("Delete failed!"),
 | 
						|
                'duplicate' => crayon__("Duplicate"),
 | 
						|
                'newName' => crayon__("New Name"),
 | 
						|
                'duplicateFail' => crayon__("Duplicate failed!"),
 | 
						|
                'checkLog' => crayon__("Please check the log for details."),
 | 
						|
                'discardConfirm' => crayon__("Are you sure you want to discard all changes?"),
 | 
						|
                'editingTheme' => crayon__("Editing Theme: %s"),
 | 
						|
                'creatingTheme' => crayon__("Creating Theme: %s"),
 | 
						|
                'submit' => crayon__("Submit Your Theme"),
 | 
						|
                'submitText' => crayon__("Submit your User Theme for inclusion as a Stock Theme in Crayon! This will email me your theme - make sure it's considerably different from the stock themes :)"),
 | 
						|
                'message' => crayon__("Message"),
 | 
						|
                'submitMessage' => crayon__("Please include this theme in Crayon!"),
 | 
						|
                'submitSucceed' => crayon__("Submit was successful."),
 | 
						|
                'submitFail' => crayon__("Submit failed!"),
 | 
						|
                'borderStyles' => CrayonHTMLElement::$borderStyles
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static function admin_resources() {
 | 
						|
        global $CRAYON_VERSION;
 | 
						|
        self::initSettings();
 | 
						|
        $path = dirname(dirname(__FILE__));
 | 
						|
 | 
						|
        wp_enqueue_script('cssjson_js', plugins_url(CRAYON_CSSJSON_JS, $path), $CRAYON_VERSION);
 | 
						|
        wp_enqueue_script('jquery_colorpicker_js', plugins_url(CRAYON_JS_JQUERY_COLORPICKER, $path), array('jquery', 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-tabs', 'jquery-ui-draggable', 'jquery-ui-dialog', 'jquery-ui-position', 'jquery-ui-mouse', 'jquery-ui-slider', 'jquery-ui-droppable', 'jquery-ui-selectable', 'jquery-ui-resizable'), $CRAYON_VERSION);
 | 
						|
        wp_enqueue_script('jquery_tinycolor_js', plugins_url(CRAYON_JS_TINYCOLOR, $path), array(), $CRAYON_VERSION);
 | 
						|
 | 
						|
        if (CRAYON_MINIFY) {
 | 
						|
            wp_enqueue_script('crayon_theme_editor', plugins_url(CRAYON_THEME_EDITOR_JS, $path), array('jquery', 'crayon_js', 'crayon_admin_js', 'cssjson_js', 'jquery_colorpicker_js', 'jquery_tinycolor_js'), $CRAYON_VERSION);
 | 
						|
        } else {
 | 
						|
            wp_enqueue_script('crayon_theme_editor', plugins_url(CRAYON_THEME_EDITOR_JS, $path), array('jquery', 'crayon_util_js', 'crayon_admin_js', 'cssjson_js', 'jquery_colorpicker_js', 'jquery_tinycolor_js'), $CRAYON_VERSION);
 | 
						|
        }
 | 
						|
 | 
						|
        wp_localize_script('crayon_theme_editor', 'CrayonThemeEditorSettings', self::$settings);
 | 
						|
        wp_localize_script('crayon_theme_editor', 'CrayonThemeEditorStrings', self::$strings);
 | 
						|
 | 
						|
        wp_enqueue_style('crayon_theme_editor', plugins_url(CRAYON_THEME_EDITOR_STYLE, $path), array('wp-jquery-ui-dialog'), $CRAYON_VERSION);
 | 
						|
        wp_enqueue_style('jquery_colorpicker', plugins_url(CRAYON_CSS_JQUERY_COLORPICKER, $path), array(), $CRAYON_VERSION);
 | 
						|
    }
 | 
						|
 | 
						|
    public static function form($inputs) {
 | 
						|
        $str = '<form class="' . self::$settings['prefix'] . '-form"><table>';
 | 
						|
        $sepCount = 0;
 | 
						|
        foreach ($inputs as $input) {
 | 
						|
            if ($input instanceof CrayonHTMLInput) {
 | 
						|
                $str .= self::formField($input->name, $input);
 | 
						|
            } else if ($input instanceof CrayonHTMLSeparator) {
 | 
						|
                $sepClass = '';
 | 
						|
                if ($input instanceof CrayonHTMLTitle) {
 | 
						|
                    $sepClass .= ' title';
 | 
						|
                }
 | 
						|
                if ($sepCount == 0) {
 | 
						|
                    $sepClass .= ' first';
 | 
						|
                }
 | 
						|
                $str .= '<tr class="separator' . $sepClass . '"><td colspan="2"><div class="content">' . $input->name . '</div></td></tr>';
 | 
						|
                $sepCount++;
 | 
						|
            } else if (is_array($input) && count($input) > 1) {
 | 
						|
                $name = $input[0];
 | 
						|
                $fields = '<table class="split-field"><tr>';
 | 
						|
                $percent = 100 / count($input);
 | 
						|
                for ($i = 1; $i < count($input); $i++) {
 | 
						|
                    $class = $i == count($input) - 1 ? 'class="last"' : '';
 | 
						|
                    $fields .= '<td ' . $class . ' style="width: ' . $percent . '%">' . $input[$i] . '</td>';
 | 
						|
                }
 | 
						|
                $fields .= '</tr></table>';
 | 
						|
                $str .= self::formField($name, $fields, 'split');
 | 
						|
            }
 | 
						|
        }
 | 
						|
        $str .= '</table></form>';
 | 
						|
        return $str;
 | 
						|
    }
 | 
						|
 | 
						|
    public static function formField($name, $field, $class = '') {
 | 
						|
        return '<tr><td class="field ' . $class . '">' . $name . '</td><td class="value ' . $class . '">' . $field . '</td></tr>';
 | 
						|
    }
 | 
						|
 | 
						|
    public static function content() {
 | 
						|
        self::initSettings();
 | 
						|
        $theme = CrayonResources::themes()->get_default();
 | 
						|
        $editing = false;
 | 
						|
 | 
						|
        if (isset($_GET['curr_theme'])) {
 | 
						|
            $currTheme = CrayonResources::themes()->get($_GET['curr_theme']);
 | 
						|
            if ($currTheme) {
 | 
						|
                $theme = $currTheme;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        if (isset($_GET['editing'])) {
 | 
						|
            $editing = CrayonUtil::str_to_bool($_GET['editing'], FALSE);
 | 
						|
        }
 | 
						|
 | 
						|
        $tInformation = crayon__("Information");
 | 
						|
        $tHighlighting = crayon__("Highlighting");
 | 
						|
        $tFrame = crayon__("Frame");
 | 
						|
        $tLines = crayon__("Lines");
 | 
						|
        $tNumbers = crayon__("Line Numbers");
 | 
						|
        $tToolbar = crayon__("Toolbar");
 | 
						|
 | 
						|
        $tBackground = crayon__("Background");
 | 
						|
        $tText = crayon__("Text");
 | 
						|
        $tBorder = crayon__("Border");
 | 
						|
        $tTopBorder = crayon__("Top Border");
 | 
						|
        $tBottomBorder = crayon__("Bottom Border");
 | 
						|
        $tBorderRight = crayon__("Right Border");
 | 
						|
 | 
						|
        $tHover = crayon__("Hover");
 | 
						|
        $tActive = crayon__("Active");
 | 
						|
        $tPressed = crayon__("Pressed");
 | 
						|
        $tHoverPressed = crayon__("Pressed & Hover");
 | 
						|
        $tActivePressed = crayon__("Pressed & Active");
 | 
						|
 | 
						|
        $tTitle = crayon__("Title");
 | 
						|
        $tButtons = crayon__("Buttons");
 | 
						|
 | 
						|
        $tNormal = crayon__("Normal");
 | 
						|
        $tInline = crayon__("Inline");
 | 
						|
        $tStriped = crayon__("Striped");
 | 
						|
        $tMarked = crayon__("Marked");
 | 
						|
        $tStripedMarked = crayon__("Striped & Marked");
 | 
						|
        $tLanguage = crayon__("Language");
 | 
						|
 | 
						|
        $top = '.crayon-top';
 | 
						|
        $bottom = '.crayon-bottom';
 | 
						|
        $hover = ':hover';
 | 
						|
        $active = ':active';
 | 
						|
        $pressed = '.crayon-pressed';
 | 
						|
 | 
						|
        ?>
 | 
						|
 | 
						|
    <div
 | 
						|
            id="icon-options-general" class="icon32"></div>
 | 
						|
    <h2>
 | 
						|
        Crayon Syntax Highlighter
 | 
						|
        <?php crayon_e('Theme Editor'); ?>
 | 
						|
    </h2>
 | 
						|
 | 
						|
    <h3 id="<?php echo self::$settings['prefix'] ?>-name">
 | 
						|
        <?php
 | 
						|
//			if ($editing) {
 | 
						|
//				echo sprintf(crayon__('Editing "%s" Theme'), $theme->name());
 | 
						|
//			} else {
 | 
						|
//				echo sprintf(crayon__('Creating Theme From "%s"'), $theme->name());
 | 
						|
//			}
 | 
						|
        ?>
 | 
						|
    </h3>
 | 
						|
    <div id="<?php echo self::$settings['prefix'] ?>-info"></div>
 | 
						|
 | 
						|
    <p>
 | 
						|
        <a id="crayon-editor-back" class="button-primary"><?php crayon_e("Back To Settings"); ?></a>
 | 
						|
        <a id="crayon-editor-save" class="button-primary"><?php crayon_e("Save"); ?></a>
 | 
						|
        <span id="crayon-editor-status"></span>
 | 
						|
    </p>
 | 
						|
 | 
						|
    <?php //crayon_e('Use the Sidebar on the right to change the Theme of the Preview window.') ?>
 | 
						|
 | 
						|
    <div id="crayon-editor-top-controls"></div>
 | 
						|
 | 
						|
    <table id="crayon-editor-table" style="width: 100%;" cellspacing="5"
 | 
						|
           cellpadding="0">
 | 
						|
        <tr>
 | 
						|
            <td id="crayon-editor-preview-wrapper">
 | 
						|
                <div id="crayon-editor-preview"></div>
 | 
						|
            </td>
 | 
						|
            <div id="crayon-editor-preview-css"></div>
 | 
						|
            <td id="crayon-editor-control-wrapper">
 | 
						|
                <div id="crayon-editor-controls">
 | 
						|
                    <ul>
 | 
						|
                        <li title="<?php echo $tInformation ?>"><a class="crayon-tab-information" href="#tabs-1"></a></li>
 | 
						|
                        <li title="<?php echo $tHighlighting ?>"><a class="crayon-tab-highlighting" href="#tabs-2"></a></li>
 | 
						|
                        <li title="<?php echo $tFrame ?>"><a class="crayon-tab-frame" href="#tabs-3"></a></li>
 | 
						|
                        <li title="<?php echo $tLines ?>"><a class="crayon-tab-lines" href="#tabs-4"></a></li>
 | 
						|
                        <li title="<?php echo $tNumbers ?>"><a class="crayon-tab-numbers" href="#tabs-5"></a></li>
 | 
						|
                        <li title="<?php echo $tToolbar ?>"><a class="crayon-tab-toolbar" href="#tabs-6"></a></li>
 | 
						|
                    </ul>
 | 
						|
                    <div id="tabs-1">
 | 
						|
                        <?php
 | 
						|
                        self::createAttributesForm(array(
 | 
						|
                            new CrayonHTMLTitle($tInformation)
 | 
						|
                        ));
 | 
						|
                        ?>
 | 
						|
                        <div id="tabs-1-contents"></div>
 | 
						|
                        <!-- Auto-filled by theme_editor.js -->
 | 
						|
                    </div>
 | 
						|
                    <div id="tabs-2">
 | 
						|
                        <?php
 | 
						|
                        $highlight = ' .crayon-pre';
 | 
						|
                        $elems = array(
 | 
						|
                            'c' => crayon__("Comment"),
 | 
						|
                            's' => crayon__("String"),
 | 
						|
                            'p' => crayon__("Preprocessor"),
 | 
						|
                            'ta' => crayon__("Tag"),
 | 
						|
                            'k' => crayon__("Keyword"),
 | 
						|
                            'st' => crayon__("Statement"),
 | 
						|
                            'r' => crayon__("Reserved"),
 | 
						|
                            't' => crayon__("Type"),
 | 
						|
                            'm' => crayon__("Modifier"),
 | 
						|
                            'i' => crayon__("Identifier"),
 | 
						|
                            'e' => crayon__("Entity"),
 | 
						|
                            'v' => crayon__("Variable"),
 | 
						|
                            'cn' => crayon__("Constant"),
 | 
						|
                            'o' => crayon__("Operator"),
 | 
						|
                            'sy' => crayon__("Symbol"),
 | 
						|
                            'n' => crayon__("Notation"),
 | 
						|
                            'f' => crayon__("Faded"),
 | 
						|
                            'h' => crayon__("HTML"),
 | 
						|
                            '' => crayon__("Unhighlighted")
 | 
						|
                        );
 | 
						|
                        $atts = array(new CrayonHTMLTitle($tHighlighting));
 | 
						|
                        foreach ($elems as $class => $name) {
 | 
						|
                            $fullClass = $class != '' ? $highlight . ' .crayon-' . $class : $highlight;
 | 
						|
                            $atts[] = array(
 | 
						|
                                $name,
 | 
						|
                                self::createAttribute($fullClass, 'color'),
 | 
						|
                                self::createAttribute($fullClass, 'font-weight'),
 | 
						|
                                self::createAttribute($fullClass, 'font-style'),
 | 
						|
                                self::createAttribute($fullClass, 'text-decoration')
 | 
						|
                            );
 | 
						|
                        }
 | 
						|
                        self::createAttributesForm($atts);
 | 
						|
                        ?>
 | 
						|
                    </div>
 | 
						|
                    <div id="tabs-3">
 | 
						|
                        <?php
 | 
						|
                        $inline = '-inline';
 | 
						|
                        self::createAttributesForm(array(
 | 
						|
                            new CrayonHTMLTitle($tFrame),
 | 
						|
                            new CrayonHTMLSeparator($tNormal),
 | 
						|
//                            self::createAttribute('', 'background', $tBackground),
 | 
						|
                            array(
 | 
						|
                                $tBorder,
 | 
						|
                                self::createAttribute('', 'border-width'),
 | 
						|
                                self::createAttribute('', 'border-color'),
 | 
						|
                                self::createAttribute('', 'border-style')
 | 
						|
                            ),
 | 
						|
                            new CrayonHTMLSeparator($tInline),
 | 
						|
                            self::createAttribute($inline, 'background', $tBackground),
 | 
						|
                            array(
 | 
						|
                                $tBorder,
 | 
						|
                                self::createAttribute($inline, 'border-width'),
 | 
						|
                                self::createAttribute($inline, 'border-color'),
 | 
						|
                                self::createAttribute($inline, 'border-style')
 | 
						|
                            ),
 | 
						|
                        ));
 | 
						|
                        ?>
 | 
						|
                    </div>
 | 
						|
                    <div id="tabs-4">
 | 
						|
                        <?php
 | 
						|
                        $stripedLine = ' .crayon-striped-line';
 | 
						|
                        $markedLine = ' .crayon-marked-line';
 | 
						|
                        $stripedMarkedLine = ' .crayon-marked-line.crayon-striped-line';
 | 
						|
                        self::createAttributesForm(array(
 | 
						|
                            new CrayonHTMLTitle($tLines),
 | 
						|
                            new CrayonHTMLSeparator($tNormal),
 | 
						|
                            self::createAttribute('', 'background', $tBackground),
 | 
						|
                            new CrayonHTMLSeparator($tStriped),
 | 
						|
                            self::createAttribute($stripedLine, 'background', $tBackground),
 | 
						|
                            new CrayonHTMLSeparator($tMarked),
 | 
						|
                            self::createAttribute($markedLine, 'background', $tBackground),
 | 
						|
                            array(
 | 
						|
                                $tBorder,
 | 
						|
                                self::createAttribute($markedLine, 'border-width'),
 | 
						|
                                self::createAttribute($markedLine, 'border-color'),
 | 
						|
                                self::createAttribute($markedLine, 'border-style'),
 | 
						|
                            ),
 | 
						|
                            self::createAttribute($markedLine . $top, 'border-top-style', $tTopBorder),
 | 
						|
                            self::createAttribute($markedLine . $bottom, 'border-bottom-style', $tBottomBorder),
 | 
						|
                            new CrayonHTMLSeparator($tStripedMarked),
 | 
						|
                            self::createAttribute($stripedMarkedLine, 'background', $tBackground),
 | 
						|
                        ));
 | 
						|
                        ?>
 | 
						|
                    </div>
 | 
						|
                    <div id="tabs-5">
 | 
						|
                        <?php
 | 
						|
                        $nums = ' .crayon-table .crayon-nums';
 | 
						|
                        $stripedNum = ' .crayon-striped-num';
 | 
						|
                        $markedNum = ' .crayon-marked-num';
 | 
						|
                        $stripedMarkedNum = ' .crayon-marked-num.crayon-striped-num';
 | 
						|
                        self::createAttributesForm(array(
 | 
						|
                            new CrayonHTMLTitle($tNumbers),
 | 
						|
                            array(
 | 
						|
                                $tBorderRight,
 | 
						|
                                self::createAttribute($nums, 'border-right-width'),
 | 
						|
                                self::createAttribute($nums, 'border-right-color'),
 | 
						|
                                self::createAttribute($nums, 'border-right-style'),
 | 
						|
                            ),
 | 
						|
                            new CrayonHTMLSeparator($tNormal),
 | 
						|
                            self::createAttribute($nums, 'background', $tBackground),
 | 
						|
                            self::createAttribute($nums, 'color', $tText),
 | 
						|
                            new CrayonHTMLSeparator($tStriped),
 | 
						|
                            self::createAttribute($stripedNum, 'background', $tBackground),
 | 
						|
                            self::createAttribute($stripedNum, 'color', $tText),
 | 
						|
                            new CrayonHTMLSeparator($tMarked),
 | 
						|
                            self::createAttribute($markedNum, 'background', $tBackground),
 | 
						|
                            self::createAttribute($markedNum, 'color', $tText),
 | 
						|
                            array(
 | 
						|
                                $tBorder,
 | 
						|
                                self::createAttribute($markedNum, 'border-width'),
 | 
						|
                                self::createAttribute($markedNum, 'border-color'),
 | 
						|
                                self::createAttribute($markedNum, 'border-style'),
 | 
						|
                            ),
 | 
						|
                            self::createAttribute($markedNum.$top, 'border-top-style', $tTopBorder),
 | 
						|
                            self::createAttribute($markedNum.$bottom, 'border-bottom-style', $tBottomBorder),
 | 
						|
                            new CrayonHTMLSeparator($tStripedMarked),
 | 
						|
                            self::createAttribute($stripedMarkedNum, 'background', $tBackground),
 | 
						|
                            self::createAttribute($stripedMarkedNum, 'color', $tText),
 | 
						|
                        ));
 | 
						|
                        ?>
 | 
						|
                    </div>
 | 
						|
                    <div id="tabs-6">
 | 
						|
                        <?php
 | 
						|
                        $toolbar = ' .crayon-toolbar';
 | 
						|
                        $title = ' .crayon-title';
 | 
						|
                        $button = ' .crayon-button';
 | 
						|
                        $info = ' .crayon-info';
 | 
						|
                        $language = ' .crayon-language';
 | 
						|
                        self::createAttributesForm(array(
 | 
						|
                            new CrayonHTMLTitle($tToolbar),
 | 
						|
                            new CrayonHTMLSeparator($tFrame),
 | 
						|
                            self::createAttribute($toolbar, 'background', $tBackground),
 | 
						|
                            array(
 | 
						|
                                $tBottomBorder,
 | 
						|
                                self::createAttribute($toolbar, 'border-bottom-width'),
 | 
						|
                                self::createAttribute($toolbar, 'border-bottom-color'),
 | 
						|
                                self::createAttribute($toolbar, 'border-bottom-style'),
 | 
						|
                            ),
 | 
						|
                            array(
 | 
						|
                                $tTitle,
 | 
						|
                                self::createAttribute($title, 'color'),
 | 
						|
                                self::createAttribute($title, 'font-weight'),
 | 
						|
                                self::createAttribute($title, 'font-style'),
 | 
						|
                                self::createAttribute($title, 'text-decoration')
 | 
						|
                            ),
 | 
						|
                            new CrayonHTMLSeparator($tButtons),
 | 
						|
                            self::createAttribute($button, 'background-color', $tBackground),
 | 
						|
                            self::createAttribute($button.$hover, 'background-color', $tHover),
 | 
						|
                            self::createAttribute($button.$active, 'background-color', $tActive),
 | 
						|
                            self::createAttribute($button.$pressed, 'background-color', $tPressed),
 | 
						|
                            self::createAttribute($button.$pressed.$hover, 'background-color', $tHoverPressed),
 | 
						|
                            self::createAttribute($button.$pressed.$active, 'background-color', $tActivePressed),
 | 
						|
                            new CrayonHTMLSeparator($tInformation . ' ' . crayon__("(Used for Copy/Paste)")),
 | 
						|
                            self::createAttribute($info, 'background', $tBackground),
 | 
						|
                            array(
 | 
						|
                                $tText,
 | 
						|
                                self::createAttribute($info, 'color'),
 | 
						|
                                self::createAttribute($info, 'font-weight'),
 | 
						|
                                self::createAttribute($info, 'font-style'),
 | 
						|
                                self::createAttribute($info, 'text-decoration')
 | 
						|
                            ),
 | 
						|
                            array(
 | 
						|
                                $tBottomBorder,
 | 
						|
                                self::createAttribute($info, 'border-bottom-width'),
 | 
						|
                                self::createAttribute($info, 'border-bottom-color'),
 | 
						|
                                self::createAttribute($info, 'border-bottom-style'),
 | 
						|
                            ),
 | 
						|
                            new CrayonHTMLSeparator($tLanguage),
 | 
						|
                            array(
 | 
						|
                                $tText,
 | 
						|
                                self::createAttribute($language, 'color'),
 | 
						|
                                self::createAttribute($language, 'font-weight'),
 | 
						|
                                self::createAttribute($language, 'font-style'),
 | 
						|
                                self::createAttribute($language, 'text-decoration')
 | 
						|
                            ),
 | 
						|
                            self::createAttribute($language, 'background-color', $tBackground)
 | 
						|
                        ));
 | 
						|
                        ?>
 | 
						|
                    </div>
 | 
						|
                </div>
 | 
						|
            </td>
 | 
						|
        </tr>
 | 
						|
 | 
						|
    </table>
 | 
						|
 | 
						|
    <?php
 | 
						|
        exit();
 | 
						|
    }
 | 
						|
 | 
						|
    public static function createAttribute($element, $attribute, $name = NULL) {
 | 
						|
        $group = self::getAttributeGroup($attribute);
 | 
						|
        $type = self::getAttributeType($group);
 | 
						|
        if ($type == 'select') {
 | 
						|
            $input = new CrayonHTMLSelect($element . '_' . $attribute, $name);
 | 
						|
            if ($group == 'border-style') {
 | 
						|
                $input->addOptions(CrayonHTMLElement::$borderStyles);
 | 
						|
            } else if ($group == 'float') {
 | 
						|
                $input->addOptions(array(
 | 
						|
                    'left',
 | 
						|
                    'right',
 | 
						|
                    'both',
 | 
						|
                    'none',
 | 
						|
                    'inherit'
 | 
						|
                ));
 | 
						|
            } else if ($group == 'font-style') {
 | 
						|
                $input->addOptions(array(
 | 
						|
                    'normal',
 | 
						|
                    'italic',
 | 
						|
                    'oblique',
 | 
						|
                    'inherit'
 | 
						|
                ));
 | 
						|
            } else if ($group == 'font-weight') {
 | 
						|
                $input->addOptions(array(
 | 
						|
                    'normal',
 | 
						|
                    'bold',
 | 
						|
                    'bolder',
 | 
						|
                    'lighter',
 | 
						|
                    '100',
 | 
						|
                    '200',
 | 
						|
                    '300',
 | 
						|
                    '400',
 | 
						|
                    '500',
 | 
						|
                    '600',
 | 
						|
                    '700',
 | 
						|
                    '800',
 | 
						|
                    '900',
 | 
						|
                    'inherit'
 | 
						|
                ));
 | 
						|
            } else if ($group == 'text-decoration') {
 | 
						|
                $input->addOptions(array(
 | 
						|
                    'none',
 | 
						|
                    'underline',
 | 
						|
                    'overline',
 | 
						|
                    'line-through',
 | 
						|
                    'blink',
 | 
						|
                    'inherit'
 | 
						|
                ));
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            $input = new CrayonHTMLInput($element . '_' . $attribute, $name);
 | 
						|
        }
 | 
						|
        $input->addClass(self::ATTRIBUTE);
 | 
						|
        $input->addAttributes(array(
 | 
						|
            'data-element' => $element,
 | 
						|
            'data-attribute' => $attribute,
 | 
						|
            'data-group' => $group
 | 
						|
        ));
 | 
						|
        return $input;
 | 
						|
    }
 | 
						|
 | 
						|
    public static function createAttributesForm($atts) {
 | 
						|
        echo self::form($atts);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Saves the given theme id and css, making any necessary path and id changes to ensure the new theme is valid.
 | 
						|
     * Echos 0 on failure, 1 on success and 2 on success and if paths have changed.
 | 
						|
     */
 | 
						|
    public static function save() {
 | 
						|
        CrayonSettingsWP::load_settings();
 | 
						|
        $oldID = stripslashes($_POST['id']);
 | 
						|
        $name = stripslashes($_POST['name']);
 | 
						|
        $css = stripslashes($_POST['css']);
 | 
						|
        $change_settings = CrayonUtil::set_default($_POST['change_settings'], TRUE);
 | 
						|
        $allow_edit = CrayonUtil::set_default($_POST['allow_edit'], TRUE);
 | 
						|
        $allow_edit_stock_theme = CrayonUtil::set_default($_POST['allow_edit_stock_theme'], CRAYON_DEBUG);
 | 
						|
        $delete = CrayonUtil::set_default($_POST['delete'], TRUE);
 | 
						|
        $oldTheme = CrayonResources::themes()->get($oldID);
 | 
						|
 | 
						|
        if (!empty($oldID) && !empty($css) && !empty($name)) {
 | 
						|
            // By default, expect a user theme to be saved - prevents editing stock themes
 | 
						|
            // If in DEBUG mode, then allow editing stock themes.
 | 
						|
            $user = $oldTheme !== NULL && $allow_edit_stock_theme ? $oldTheme->user() : TRUE;
 | 
						|
            $oldPath = CrayonResources::themes()->path($oldID);
 | 
						|
            $oldDir = CrayonResources::themes()->dirpath_for_id($oldID);
 | 
						|
            // Create an instance to use functions, since late static binding is only available in 5.3 (PHP kinda sucks)
 | 
						|
            $theme = CrayonResources::themes()->resource_instance('');
 | 
						|
            $newID = $theme->clean_id($name);
 | 
						|
            $name = CrayonResource::clean_name($newID);
 | 
						|
            $newPath = CrayonResources::themes()->path($newID, $user);
 | 
						|
            $newDir = CrayonResources::themes()->dirpath_for_id($newID, $user);
 | 
						|
 | 
						|
            $exists = CrayonResources::themes()->is_loaded($newID) || (is_file($newPath) && is_file($oldPath));
 | 
						|
            if ($exists && $oldPath != $newPath) {
 | 
						|
                // Never allow overwriting a theme with a different id!
 | 
						|
                echo -3;
 | 
						|
                exit();
 | 
						|
            }
 | 
						|
 | 
						|
            if ($oldPath == $newPath && $allow_edit === FALSE) {
 | 
						|
                // Don't allow editing
 | 
						|
                echo -4;
 | 
						|
                exit();
 | 
						|
            }
 | 
						|
 | 
						|
            // Create the new path if needed
 | 
						|
            if (!is_dir($newDir)) {
 | 
						|
                wp_mkdir_p($newDir);
 | 
						|
                $imageSrc = $oldDir . 'images';
 | 
						|
                if (is_dir($imageSrc)) {
 | 
						|
                    try {
 | 
						|
                        // Copy image folder
 | 
						|
                        CrayonUtil::copyDir($imageSrc, $newDir . 'images', 'wp_mkdir_p');
 | 
						|
                    } catch (Exception $e) {
 | 
						|
                        CrayonLog::syslog($e->getMessage(), "THEME SAVE");
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            $refresh = FALSE;
 | 
						|
            $replaceID = $oldID;
 | 
						|
            // Replace ids in the CSS
 | 
						|
            if (!is_file($oldPath) || strpos($css, CrayonThemes::CSS_PREFIX . $oldID) === FALSE) {
 | 
						|
                // The old path/id is no longer valid - something has gone wrong - we should refresh afterwards
 | 
						|
                $refresh = TRUE;
 | 
						|
            }
 | 
						|
            // XXX This is case sensitive to avoid modifying text, but it means that CSS must be in lowercase
 | 
						|
            $css = preg_replace('#(?<=' . CrayonThemes::CSS_PREFIX . ')' . $replaceID . '\b#ms', $newID, $css);
 | 
						|
 | 
						|
            // Replace the name with the new one
 | 
						|
            $info = self::getCSSInfo($css);
 | 
						|
            $info['name'] = $name;
 | 
						|
            $css = self::setCSSInfo($css, $info);
 | 
						|
 | 
						|
            $result = @file_put_contents($newPath, $css);
 | 
						|
            $success = $result !== FALSE;
 | 
						|
            if ($success && $oldPath !== $newPath) {
 | 
						|
                if ($oldID !== CrayonThemes::DEFAULT_THEME && $delete) {
 | 
						|
                    // Only delete the old path if it isn't the default theme
 | 
						|
                    try {
 | 
						|
                        // Delete the old path
 | 
						|
                        CrayonUtil::deleteDir($oldDir);
 | 
						|
                    } catch (Exception $e) {
 | 
						|
                        CrayonLog::syslog($e->getMessage(), "THEME SAVE");
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                // Refresh
 | 
						|
                echo 2;
 | 
						|
            } else {
 | 
						|
                if ($refresh) {
 | 
						|
                    echo 2;
 | 
						|
                } else {
 | 
						|
                    if ($success) {
 | 
						|
                        echo 1;
 | 
						|
                    } else {
 | 
						|
                        echo -2;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            // Set the new theme in settings
 | 
						|
            if ($change_settings) {
 | 
						|
                CrayonGlobalSettings::set(CrayonSettings::THEME, $newID);
 | 
						|
                CrayonSettingsWP::save_settings();
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            CrayonLog::syslog("$oldID=$oldID\n\n$name=$name", "THEME SAVE");
 | 
						|
            echo -1;
 | 
						|
        }
 | 
						|
        exit();
 | 
						|
    }
 | 
						|
 | 
						|
    public static function duplicate() {
 | 
						|
        CrayonSettingsWP::load_settings();
 | 
						|
        $oldID = $_POST['id'];
 | 
						|
        $oldPath = CrayonResources::themes()->path($oldID);
 | 
						|
        $_POST['css'] = file_get_contents($oldPath);
 | 
						|
        $_POST['delete'] = FALSE;
 | 
						|
        $_POST['allow_edit'] = FALSE;
 | 
						|
        $_POST['allow_edit_stock_theme'] = FALSE;
 | 
						|
        self::save();
 | 
						|
    }
 | 
						|
 | 
						|
    public static function delete() {
 | 
						|
        CrayonSettingsWP::load_settings();
 | 
						|
        $id = $_POST['id'];
 | 
						|
        $dir = CrayonResources::themes()->dirpath_for_id($id);
 | 
						|
        if (is_dir($dir) && CrayonResources::themes()->exists($id)) {
 | 
						|
            try {
 | 
						|
                CrayonUtil::deleteDir($dir);
 | 
						|
                CrayonGlobalSettings::set(CrayonSettings::THEME, CrayonThemes::DEFAULT_THEME);
 | 
						|
                CrayonSettingsWP::save_settings();
 | 
						|
                echo 1;
 | 
						|
            } catch (Exception $e) {
 | 
						|
                CrayonLog::syslog($e->getMessage(), "THEME SAVE");
 | 
						|
                echo -2;
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            echo -1;
 | 
						|
        }
 | 
						|
        exit();
 | 
						|
    }
 | 
						|
 | 
						|
    public static function submit() {
 | 
						|
        global $CRAYON_EMAIL;
 | 
						|
        CrayonSettingsWP::load_settings();
 | 
						|
        $id = $_POST['id'];
 | 
						|
        $message = $_POST['message'];
 | 
						|
        $dir = CrayonResources::themes()->dirpath_for_id($id);
 | 
						|
        $dest = $dir . 'tmp';
 | 
						|
        wp_mkdir_p($dest);
 | 
						|
 | 
						|
        if (is_dir($dir) && CrayonResources::themes()->exists($id)) {
 | 
						|
            try {
 | 
						|
                $zipFile = CrayonUtil::createZip($dir, $dest, TRUE);
 | 
						|
                $result = CrayonUtil::emailFile(array(
 | 
						|
                    'to' => $CRAYON_EMAIL,
 | 
						|
                    'from' => get_bloginfo('admin_email'),
 | 
						|
                    'subject' => 'Theme Editor Submission',
 | 
						|
                    'message' => $message,
 | 
						|
                    'file' => $zipFile
 | 
						|
                ));
 | 
						|
                CrayonUtil::deleteDir($dest);
 | 
						|
                if ($result) {
 | 
						|
                    echo 1;
 | 
						|
                } else {
 | 
						|
                    echo -3;
 | 
						|
                }
 | 
						|
            } catch (Exception $e) {
 | 
						|
                CrayonLog::syslog($e->getMessage(), "THEME SUBMIT");
 | 
						|
                echo -2;
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            echo -1;
 | 
						|
        }
 | 
						|
        exit();
 | 
						|
    }
 | 
						|
 | 
						|
    public static function getCSSInfo($css) {
 | 
						|
        $info = array();
 | 
						|
        preg_match(self::RE_COMMENT, $css, $matches);
 | 
						|
        if (count($matches)) {
 | 
						|
            $comment = $matches[0];
 | 
						|
            preg_match_all('#([^\r\n:]*[^\r\n\s:])\s*:\s*([^\r\n]+)#msi', $comment, $matches);
 | 
						|
            if (count($matches)) {
 | 
						|
                for ($i = 0; $i < count($matches[1]); $i++) {
 | 
						|
                    $name = $matches[1][$i];
 | 
						|
                    $value = $matches[2][$i];
 | 
						|
                    $info[self::getFieldID($name)] = $value;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return $info;
 | 
						|
    }
 | 
						|
 | 
						|
    public static function cssInfoToString($info) {
 | 
						|
        $str = "/*\n";
 | 
						|
        foreach ($info as $id => $value) {
 | 
						|
            $str .= self::getFieldName($id) . ': ' . $value . "\n";
 | 
						|
        }
 | 
						|
        $str .= "*/";
 | 
						|
        return $str;
 | 
						|
    }
 | 
						|
 | 
						|
    public static function setCSSInfo($css, $info) {
 | 
						|
        return preg_replace(self::RE_COMMENT, self::cssInfoToString($info), $css);
 | 
						|
    }
 | 
						|
 | 
						|
    public static function getFieldID($name) {
 | 
						|
        if (isset(self::$infoFieldsInverse[$name])) {
 | 
						|
            return self::$infoFieldsInverse[$name];
 | 
						|
        } else {
 | 
						|
            return CrayonUserResource::clean_id($name);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static function getFieldName($id) {
 | 
						|
        self::initFields();
 | 
						|
        if (isset(self::$infoFields[$id])) {
 | 
						|
            return self::$infoFields[$id];
 | 
						|
        } else {
 | 
						|
            return CrayonUserResource::clean_name($id);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static function getAttributeGroup($attribute) {
 | 
						|
        if (isset(self::$attributeGroupsInverse[$attribute])) {
 | 
						|
            return self::$attributeGroupsInverse[$attribute];
 | 
						|
        } else {
 | 
						|
            return $attribute;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static function getAttributeType($group) {
 | 
						|
        if (isset(self::$attributeTypesInverse[$group])) {
 | 
						|
            return self::$attributeTypesInverse[$group];
 | 
						|
        } else {
 | 
						|
            return 'text';
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
?>
 |