New look for iTop !

SVN:trunk[3601]
This commit is contained in:
Denis Flaven
2015-06-20 15:02:24 +00:00
parent 9ba1914524
commit 19e5130441
338 changed files with 21017 additions and 1449 deletions

72
lib/sass/Phamlp.php Normal file
View File

@@ -0,0 +1,72 @@
<?php
/* SVN FILE: $Id: HamlException.php 61 2010-04-16 10:19:59Z chris.l.yates $ */
/**
* Phamlp.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
*/
/**
* Phamlp class.
* Static support classes.
* @package PHamlP
*/
class Phamlp {
/**
* @var string Language used to translate messages
*/
public static $language;
/**
* @var array Messages used for translation
*/
public static $messages;
/**
* Translates a message to the specified language.
* @param string message category.
* @param string the original message
* @param array parameters to be applied to the message using <code>strtr</code>.
* @return string the translated message
*/
public static function t($category, $message, $params = array()) {
if (!empty(self::$language)) {
$message = self::translate($category, $message);
}
return $params!==array() ? strtr($message,$params) : $message;
}
/**
* Translates a message to the specified language.
* If the language or the message in the specified language is not defined the
* original message is returned.
* @param string message category
* @param string the original message
* @return string the translated message
*/
private static function translate($category, $message) {
if (empty(self::$messages[$category])) self::loadMessages($category);
return (empty(self::$messages[$category][$message]) ? $message : self::$messages[$category][$message]);
}
/**
* Loads the specified language message file for translation.
* Message files are PHP files in the "category/messages" directory and named
* "language.php", where category is either haml or sass, and language is the
* specified language.
* The message file returns an array of (source, translation) pairs; for example:
* <pre>
* return array(
* 'original message 1' => 'translated message 1',
* 'original message 2' => 'translated message 2',
* );
* </pre>
* @param string message category
*/
private static function loadMessages($category) {
$messageFile = dirname(__FILE__).DIRECTORY_SEPARATOR.$category.DIRECTORY_SEPARATOR.'messages'.DIRECTORY_SEPARATOR.self::$language.'.php';
if (file_exists($messageFile)) {
self::$messages[$category] = require_once($messageFile);
}
}
}

View File

@@ -0,0 +1,31 @@
<?php
/* SVN FILE: $Id: HamlException.php 61 2010-04-16 10:19:59Z chris.l.yates $ */
/**
* Phamlp exception.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
*/
require_once('Phamlp.php');
/**
* Phamlp exception class.
* Base class for PHamlP::Haml and PHamlP::Sass exceptions.
* Translates exception messages.
* @package PHamlP
*/
class PhamlpException extends Exception {
/**
* Phamlp Exception.
* @param string Category (haml|sass)
* @param string Exception message
* @param array parameters to be applied to the message using <code>strtr</code>.
*/
public function __construct($category, $message, $params, $object) {
parent::__construct(Phamlp::t($category, $message, $params) .
(is_object($object) ? ": {$object->filename}::{$object->line}\nSource: {$object->source}" : '')
);
}
}

View File

@@ -0,0 +1,29 @@
<?php
/* SVN FILE: $Id: HamlException.php 61 2010-04-16 10:19:59Z chris.l.yates $ */
/**
* Haml exception.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml
*/
require_once(dirname(__FILE__).'/../PhamlpException.php');
/**
* Haml exception class.
* @package PHamlP
* @subpackage Haml
*/
class HamlException extends PhamlpException {
/**
* Haml Exception.
* @param string Exception message
* @param array parameters to be applied to the message using <code>strtr</code>.
* @param object object with source code and meta data
*/
public function __construct($message, $params = array(), $object = null) {
parent::__construct('haml', $message, $params, $object);
}
}

View File

@@ -0,0 +1,199 @@
<?php
/* SVN FILE: $Id: HamlHelpers.php 92 2010-05-20 17:42:59Z chris.l.yates $ */
/**
* HamlHelpers class file.
*
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml
*/
/**
* HamlHelpers class.
* Contains methods to make it easier to do various tasks.
*
* The class can be extended to provide user defined helper methods. The
* signature for user defined helper methods is ($block, $other, $arguments);
* $block is the string generated by the Haml block being operated on.
*
* Tthe path to the extended class is provided to HamlParser in the config
* array; class name == file name.
*
* HamlHelpers and any extended class are automatically included in the context
* that a Haml template is parsed in, so all the methods are at your disposal
* from within the template.
*
* @package PHamlP
* @subpackage Haml
*/
class HamlHelpers {
const XMLNS = 'http://www.w3.org/1999/xhtml';
/**
* Returns the block with string appended.
* @see succeed
* @param string Haml block
* @param string string to append
* @return string the block with string appended.
*/
public static function append($block, $string) {
return $block.$string;
}
/**
* Escapes HTML entities in text, but without escaping an ampersand that is
* already part of an escaped entity.
* @param string Haml block
* @return string the block with HTML entities escaped.
*/
public static function escape_once($block) {
return htmlentities(html_entity_decode($block));
}
/**
* Returns an array containing default assignments for the xmlns, lang, and
* xml:lang attributes of the html element.
* This helper method is for use in the html element only.
*
* Examples:<br/>
* %html(html_attrs())<br/>
* produces<br/>
* <html lang="en-us" xml:lang="en-us" xmlns="http://www.w3.org/1999/xhtml">
*
* %html(html_attrs('en-gb'))<br/>
* produces<br/>
* <html lang="en-gb" xml:lang="en-gb" xmlns="http://www.w3.org/1999/xhtml">
*
* %html(html_attrs('en-gb', false))<br/>
* produces<br/>
* <html xml:lang="en-gb" xmlns="http://www.w3.org/1999/xhtml">
*
* Although handled in HamlParser, the notes below are here for completeness.<br/>
* Other attributes are defined as normal. e.g.<br/>
* %html(xmlns:me="http://www.example.com/me" html_attrs('en-gb', false))<br/>
* produces<br/>
* <html xml:lang="en-gb" xmlns="http://www.w3.org/1999/xhtml" xmlns:me="http://www.example.com/me">
*
* PHamlP also allows for the language to be defined using PHP code that can
* be eval'd; the code must end with a semi-colon (;). e.g.<br/>
* %html(html_attrs("FW::app()->language);", false))<br/>
* produces (assuming FW::app()->language returns 'en-gb')<br/>
* <html xml:lang="en-gb" xmlns="http://www.w3.org/1999/xhtml">
*
* @param string document language. Default = en-us
* @param boolean whether the html element has the lang attribute. Default: true
* Should be set false for XHTML 1.1 or greater documents
* @return string the block with string appended.
*/
public static function html_attrs($language = 'en-us', $lang = true) {
return ($lang ?
array('xmlns'=>self::XMLNS, 'xml:lang'=>$language, 'lang'=>$language) :
array('xmlns'=>self::XMLNS, 'xml:lang'=>$language));
}
/**
* Returns a copy of text with ampersands, angle brackets and quotes escaped
* into HTML entities.
* @param string Haml block
* @return string the block with HTML entities escaped.
*/
public static function html_escape($block) {
return htmlspecialchars($block);
}
/**
* Iterates an array and using the block to generate a <li> element for each
* array element.
* Examples:<br/>
* = list_of(array('red', 'orange', ...., 'violet'), 'colour')<br/>
* = colour<br/>
* Produces:<br/>
* <li>red</li><br/>
* <li>orange</li><br/>
* |<br/>
* |<br/>
* <li>violet></li><br/>
*
* = list_of(array('Fly Fishing' => 'JR Hartley', 'Lord of the Rings' => 'JRR Tolkien'), 'title', 'author')<br/>
* %h3= title<br/>
* %p= author<br/>
* Produces:<br/>
* <li><br/>
* <h3>Fly Fishing</h3><br/>
* <p>JR Hartley</p><br/>
* </li><br/>
* <li><br/>
* <h3>Lord of the Rings</h3><br/>
* <p>JRR Tolkien</p><br/>
* </li><br/>
*
* @param string Haml block
* @param array items
* @param string string in block to replace with item key or item value
* @param string string in block to replace with item value
* @return string list items.
*/
public static function list_of($block, $items, $key, $value = null) {
$output = '';
foreach ($items as $_key=>$_value) {
$output .= '<li>' . strtr($block, (empty($value) ? array($key=>$_value) :
array($key=>$_key, $value=>$_value))) . '</li>';
} // foreach
return $output;
}
/**
* Alias for prepend.
* @see prepend
* @param string Haml block
* @param string string to prepend
* @return string the block with string prepended
*/
public static function preceed($block, $string) {
return self::prepend($block, $string);
}
/**
* Returns the block with string prepended.
* @param string Haml block
* @param string string to prepend
* @return string the block with string prepended
*/
public static function prepend($block, $string) {
return $string.$block;
}
/**
* Converts newlines in the block to HTML entities.
* @param string Haml block
* @return string the block with newlines converted to HTML entities
*/
public static function preserve($block) {
return str_replace("\n", '&#x0d;&#x0a;', $block);
}
/**
* Alias for append.
* @see append
* @param string Haml block
* @param string string to apppend
* @return string the block with string apppended
*/
public static function succeed($block, $string) {
return self::append($block, $string);
}
/**
* Surrounds a block of Haml code with strings.
* If $back is not given it defaults to $front.
* @param string Haml block
* @param string string to prepend
* @param string string to apppend
* @return string the block surrounded by the strings
*/
public static function surround($block, $front, $back=null) {
return $front.$block.(is_null($back) ? $front : $back);
}
}

1249
lib/sass/haml/HamlParser.php Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,30 @@
<?php
/* SVN FILE: $Id: HamlBaseFilter.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* Base Filter for {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* Base Filter for {@link http://haml-lang.com/ Haml} class.
* This class must be extended and the run() method overridden.
* @package PHamlP
* @subpackage Haml.filters
*/
abstract class HamlBaseFilter {
/**
* Initialise the filter.
*/
public function init() {}
/**
* Run the filter.
* This method must be overridden in child classes.
* @param string text to filter
*/
abstract public function run($text);
}

View File

@@ -0,0 +1,29 @@
<?php
/* SVN FILE: $Id: HamlCdataFilter.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* CDATA Filter for {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* CDATA Filter for {@link http://haml-lang.com/ Haml} class.
* Surrounds the filtered text with CDATA tags.
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlCdataFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return "<![CDATA[\n" .
preg_replace(HamlParser::MATCH_INTERPOLATION, '<?php echo \1; ?>', $text) .
" ]]>\n";
}
}

View File

@@ -0,0 +1,30 @@
<?php
/* SVN FILE: $Id: HamlCssFilter.php 99 2010-06-13 14:12:08Z chris.l.yates $ */
/**
* CSS Filter for {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* CSS Filter for {@link http://haml-lang.com/ Haml} class.
* Surrounds the filtered text with <style> and CDATA tags.
* Useful for including inline CSS.
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlCssFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return "<style type=\"text/css\">\n/*<![CDATA[*/\n" .
preg_replace(HamlParser::MATCH_INTERPOLATION, '<?php echo \1; ?>', $text) .
"/*]]>*/\n</style>\n";
}
}

View File

@@ -0,0 +1,32 @@
<?php
/* SVN FILE: $Id: HamlEscapedFilter.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* Escaped Filter for {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* Escaped Filter for {@link http://haml-lang.com/ Haml} class.
* Escapes the text.
* Code to be interpolated can be included by wrapping it in #().
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlEscapedFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return preg_replace(
HamlParser::MATCH_INTERPOLATION,
'<?php echo htmlspecialchars($text); ?>',
htmlspecialchars($text)
) . "\n";
}
}

View File

@@ -0,0 +1,31 @@
<?php
/* SVN FILE: $Id: HamlJavascriptFilter.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* Javascript Filter for {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* Javascript Filter for {@link http://haml-lang.com/ Haml} class.
* Surrounds the filtered text with <script> and CDATA tags.
* Useful for including inline Javascript.
* Code to be interpolated can be included by wrapping it in #().
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlJavascriptFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return "<script type=\"text/javascript\">\n //<![CDATA[\n" .
preg_replace(HamlParser::MATCH_INTERPOLATION, '<?php echo \1; ?>', $text) .
" //]]>\n</script>\n";
}
}

View File

@@ -0,0 +1,27 @@
<?php
/* SVN FILE: $Id: HamlPhpFilter.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* PHP Filter for {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* PHP Filter for {@link http://haml-lang.com/ Haml} class.
* The text will be parsed with the PHP interpreter.
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlPhpFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return "<?php\n$text?>\n";
}
}

View File

@@ -0,0 +1,28 @@
<?php
/* SVN FILE: $Id: HamlPlainFilter.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* Plain Filter for {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* Plain Filter for {@link http://haml-lang.com/ Haml} class.
* Does not parse the filtered text. This is useful for large blocks of text
* without HTML tags when lines are not to be parsed.
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlPlainFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return preg_replace(HamlParser::MATCH_INTERPOLATION, '<?php echo \1; ?>', $text). "\n";
}
}

View File

@@ -0,0 +1,29 @@
<?php
/* SVN FILE: $Id: HamlPreserveFilter.php 103 2010-08-06 10:15:55Z chris.l.yates@gmail.com $ */
/**
* Preserve Filter for {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* Preserve Filter for {@link http://haml-lang.com/ Haml} class.
* Does not parse the filtered text and preserves line breaks.
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlPreserveFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return str_replace("\n", '&#x000a;',
preg_replace(HamlParser::MATCH_INTERPOLATION, '<?php echo \1; ?>', $text)
) . "\n";
}
}

View File

@@ -0,0 +1,37 @@
<?php
/* SVN FILE: $Id: HamlSassFilter.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* {@link Sass http://sass-lang.com/} Filter for
* {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
require_once('HamlCssFilter.php');
require_once(dirname(__FILE__).'/../../sass/SassParser.php');
/**
* {@link Sass http://sass-lang.com/} Filter for
* {@link http://haml-lang.com/ Haml} class.
* Parses the text as Sass then calls the CSS filter.
* Useful for including inline Sass.
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlSassFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
$sass = new SassParser();
$css = new HamlCssFilter();
$css->init();
return $css->run($sass->toCss(preg_replace(HamlParser::MATCH_INTERPOLATION, '<?php echo \1; ?>', $text), false));
}
}

View File

@@ -0,0 +1,37 @@
<?php
/* SVN FILE: $Id: HamlSassFilter.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* {@link Scss http://sass-lang.com/} Filter for
* {@link http://haml-lang.com/ Haml} class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
require_once('HamlCssFilter.php');
require_once(dirname(__FILE__).'/../../sass/SassParser.php');
/**
* {@link Sass http://sass-lang.com/} Filter for
* {@link http://haml-lang.com/ Haml} class.
* Parses the text as Sass then calls the CSS filter.
* Useful for including inline Sass.
* @package PHamlP
* @subpackage Haml.filters
*/
class HamlScssFilter extends HamlBaseFilter {
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
$sass = new SassParser(array('syntax'=>'scss'));
$css = new HamlCssFilter();
$css->init();
return $css->run($sass->toCss(preg_replace(HamlParser::MATCH_INTERPOLATION, '<?php echo \1; ?>', $text), false));
}
}

View File

@@ -0,0 +1,50 @@
<?php
/* SVN FILE: $Id: _HamlMarkdownFilter.php 51 2010-04-14 12:05:03Z chris.l.yates $ */
/**
* Markdown Filter for {@link http://haml-lang.com/ Haml} class file.
* This filter is an abstract filter that must be extended.
*
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* Markdown Filter for {@link http://haml-lang.com/ Haml} class.
* Parses the text with Markdown.
*
* This is an abstract class that must be extended and the init() method
* implemented to provide the vendorPath if the vendor class is not imported
* elsewhere in the application (e.g. by a framework) and vendorClass if the
* default class name is not correct.
* @package PHamlP
* @subpackage Haml.filters
*/
abstract class _HamlMarkdownFilter extends HamlBaseFilter {
/**
* @var string Path to Markdown Parser
*/
protected $vendorPath;
/**
* @var string Markdown class
* Override this value if the class name is different in your environment
*/
protected $vendorClass = 'MarkdownExtra_Parser';
/**
* Child classes must implement this method.
* Typically the child class will set $vendorPath and $vendorClass
*/
public function init() {}
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return '<?php '.(!empty($this->vendorPath)?'require_once "'.$this->vendorPath.'";':'').'$markdown___=new '.$this->vendorClass.'();echo $markdown___->safeTransform("'.preg_replace(HamlParser::MATCH_INTERPOLATION, '".\1."', $text).'");?>';
}
}

View File

@@ -0,0 +1,50 @@
<?php
/* SVN FILE: $Id: _HamlTextileFilter.php 51 2010-04-14 12:05:03Z chris.l.yates $ */
/**
* Textile Filter for {@link http://haml-lang.com/ Haml} class file.
* This filter is an abstract filter that must be extended.
*
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.filters
*/
/**
* Textile Filter for {@link http://haml-lang.com/ Haml} class.
* Parses the text with Textile.
*
* This is an abstract class that must be extended and the init() method
* implemented to provide the vendorPath if the vendor class is not imported
* elsewhere in the application (e.g. by a framework) and vendorClass if the
* default class name is not correct.
* @package PHamlP
* @subpackage Haml.filters
*/
abstract class _HamlTextileFilter extends HamlBaseFilter {
/**
* @var string Path to Textile Parser
*/
protected $vendorPath;
/**
* @var string Textile class
* Override this value if the class name is different in your environment
*/
protected $vendorClass = 'Textile';
/**
* Child classes must implement this method.
* Typically the child class will set $vendorPath and $vendorClass
*/
public function init() {}
/**
* Run the filter
* @param string text to filter
* @return string filtered text
*/
public function run($text) {
return '<?php '.(!empty($this->vendorPath)?'require_once "'.$this->vendorPath.'";':'').'$textile___=new '.$this->vendorClass.'();echo $textile___->TextileThis("'.preg_replace(HamlParser::MATCH_INTERPOLATION, '".\1."', $text).'");?>';
}
}

View File

@@ -0,0 +1,32 @@
<?php
/* SVN FILE: $Id: SassRuleNode.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* Message translations.
*
* This file is contains the localizable messages for Haml. You may modify this
* file by translating the messages and saving with the filename language.php
* where "language" is the language ID of the translations.
*
* Each array element represents the translation (value) of a message (key).
* If the value is empty the message is considered as not translated.
*
* NOTE: this file must be saved in UTF-8 encoding.
*
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.messages
*/
return array (
'Attribute must be "class" or "id" with array value'=>'',
'Illegal indentation level ({indentLevel}); indentation level can only increase by one'=>'',
'Invalid indentation'=>'',
'Invalid {what} ({value})'=>'',
'Invalid {what} ({value}); must be one of "{options}"'=>'',
'Mixed indentation not allowed'=>'',
'No getter function for {what}'=>'',
'No setter function for {what}'=>'',
'Unable to find {what}: {filename}'=>'',
'{what} must extend {base} class'=>'',
);

View File

@@ -0,0 +1,32 @@
<?php
/* SVN FILE: $Id: SassRuleNode.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* Message translations.
*
* This file is contains the localizable messages for Haml. You may modify this
* file by translating the messages and saving with the filename language.php
* where "language" is the language ID of the translations.
*
* Each array element represents the translation (value) of a message (key).
* If the value is empty the message is considered as not translated.
*
* NOTE: this file must be saved in UTF-8 encoding.
*
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.messages
*/
return array (
'Attribute must be "class" or "id" with array value'=>'Attribute müssen "class" oder "id" mit array-wert',
'Illegal indentation level ({indentLevel}); indentation level can only increase by one'=>'Illegale einrückungsebene ({indentLevel}); einrückungsebene kann nur von einem anstieg',
'Invalid indentation'=>'Ungültige einrückung',
'Invalid {what}'=>'Ungültige {what}',
'Invalid {what} ({value}); must be one of "{options}"'=>'Ungültige {what} ({value}); muss einer der "{options}"',
'Mixed indentation not allowed'=>'Mixed einzug nicht erlaubt',
'No getter function for {what}'=>'Kein getter-funktion für {what}',
'No setter function for {what}'=>'Kein setter-funktion für {what}',
'Unable to find {what}: {filename}'=>'Kann zu finden {what}: {filename}',
'{what} must extend {base} class'=>'{what} muss {base} klasse erweitern',
);

View File

@@ -0,0 +1,32 @@
<?php
/* SVN FILE: $Id: SassRuleNode.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* Message translations.
*
* This file is contains the localizable messages for Haml. You may modify this
* file by translating the messages and saving with the filename language.php
* where "language" is the language ID of the translations.
*
* Each array element represents the translation (value) of a message (key).
* If the value is empty the message is considered as not translated.
*
* NOTE: this file must be saved in UTF-8 encoding.
*
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.messages
*/
return array (
'Attribute must be "class" or "id" with array value'=>"D'attributs doivent être \"class\" ou \"id\" avec valeur de array",
'Illegal indentation level ({indentLevel}); indentation level can only increase by one: {file}::{line}'=>"Niveau niveau d'indentation illégale ({indentLevel}); ne peut augmenter d'un: {file}::{line}",
'Invalid indentation: {line}::{file}'=>'Indentation blancs: {line}::{file}',
'Invalid {what} ({value}): {file}::{line}'=>'Invalide {what} ({value}): {file}::{line}',
'Invalid {what} ({value}); must be one of "{options}".'=>"Invalide {what} ({value}); doit être l'un des \"{options}\"",
'Mixed indentation not allowed: {file}::{line}'=>'Indentation mixte pas autorisé: {file}::{line}',
'No getter function for {what}'=>'Pas de fonction getter pour {what}',
'No setter function for {what}'=>'Pas de fonction setter pour {what}',
'Unable to find {what}: {filename}.'=>'Impossible de trouver {what}: {filename}.',
'{what} must extend {base} class.'=>"{what} doit s'étendre classe {base}",
);

View File

@@ -0,0 +1,32 @@
<?php
/* SVN FILE: $Id: HamlCompactRenderer.php 74 2010-04-20 12:20:29Z chris.l.yates $ */
/**
* HamlCompactRenderer class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.renderers
*/
/**
* HamlCompactRenderer class.
* Renders blocks on single lines.
* @package PHamlP
* @subpackage Haml.renderers
*/
class HamlCompactRenderer extends HamlRenderer {
/**
* Renders the opening tag of an element
*/
public function renderOpeningTag($node) {
return ($node->isBlock ? '' : ' ') . parent::renderOpeningTag($node);
}
/**
* Renders the closing tag of an element
*/
public function renderClosingTag($node) {
return parent::renderClosingTag($node) . ($node->isBlock ? "\n" : ' ');
}
}

View File

@@ -0,0 +1,48 @@
<?php
/* SVN FILE: $Id: HamlCompressedRenderer.php 74 2010-04-20 12:20:29Z chris.l.yates $ */
/**
* HamlCompressedRenderer class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.renderers
*/
/**
* HamlCompressedRenderer class.
* Output has minimal whitespace.
* @package PHamlP
* @subpackage Haml.renderers
*/
class HamlCompressedRenderer extends HamlRenderer {
/**
* Renders the opening of a comment.
* Only conditional comments are rendered
*/
public function renderOpenComment($node) {
if ($node->isConditional) return parent::renderOpenComment($node);
}
/**
* Renders the closing of a comment.
* Only conditional comments are rendered
*/
public function renderCloseComment($node) {
if ($node->isConditional) return parent::renderCloseComment($node);
}
/**
* Renders the opening tag of an element
*/
public function renderOpeningTag($node) {
return ($node->isBlock ? '' : ' ') . parent::renderOpeningTag($node);
}
/**
* Renders the closing tag of an element
*/
public function renderClosingTag($node) {
return parent::renderClosingTag($node) . ($node->isBlock ? '' : ' ');
}
}

View File

@@ -0,0 +1,58 @@
<?php
/* SVN FILE: $Id: HamlExpandedRenderer.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* HamlExpandedRenderer class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.renderers
*/
/**
* HamlExpandedRenderer class.
* Blocks are on single lines and content indented.
* @package PHamlP
* @subpackage Haml.renderers
*/
class HamlExpandedRenderer extends HamlRenderer {
/**
* Renders the opening tag of an element
*/
public function renderOpeningTag($node) {
return parent::renderOpeningTag($node) .
($node->whitespaceControl['inner'] ? '' :
($node->isSelfClosing && $node->whitespaceControl['outer'] ? '' : "\n"));
}
/**
* Renders the closing tag of an element
*/
public function renderClosingTag($node) {
return ($node->isSelfClosing ? '' : parent::renderClosingTag($node) .
($node->whitespaceControl['outer'] ? '' : "\n"));
}
/**
* Renders content.
* @param HamlNode the node being rendered
* @return string the rendered content
*/
public function renderContent($node) {
return self::INDENT . parent::renderContent($node) . "\n";
}
/**
* Renders the start of a code block
*/
public function renderStartCodeBlock($node) {
return parent::renderStartCodeBlock($node) . "\n";
}
/**
* Renders the end of a code block
*/
public function renderEndCodeBlock($node) {
return parent::renderEndCodeBlock($node) . "\n";
}
}

View File

@@ -0,0 +1,77 @@
<?php
/* SVN FILE: $Id: HamlNestedRenderer.php 72 2010-04-20 00:41:36Z chris.l.yates $ */
/**
* HamlNestedRenderer class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.renderers
*/
/**
* HamlNestedRenderer class.
* Blocks and content are indented according to their nesting level.
* @package PHamlP
* @subpackage Haml.renderers
*/
class HamlNestedRenderer extends HamlRenderer {
/**
* Renders the opening tag of an element
*/
public function renderOpeningTag($node) {
return ($node->whitespaceControl['outer'] ? '' : $this->getIndent($node)) .
parent::renderOpeningTag($node) . ($node->whitespaceControl['inner'] ? '' :
($node->isSelfClosing && $node->whitespaceControl['outer'] ? '' : "\n"));
}
/**
* Renders the closing tag of an element
*/
public function renderClosingTag($node) {
return ($node->isSelfClosing ? '' : ($node->whitespaceControl['inner'] ? '' :
$this->getIndent($node)) . parent::renderClosingTag($node) .
($node->whitespaceControl['outer'] ? '' : "\n"));
}
/**
* Renders content.
* @param HamlNode the node being rendered
* @return string the rendered content
*/
public function renderContent($node) {
return $this->getIndent($node) . parent::renderContent($node) . "\n";
}
/**
* Renders the opening of a comment
*/
public function renderOpenComment($node) {
return parent::renderOpenComment($node) . (empty($node->content) ? "\n" : '');
}
/**
* Renders the closing of a comment
*/
public function renderCloseComment($node) {
return parent::renderCloseComment($node) . "\n";
}
/**
* Renders the start of a code block
*/
public function renderStartCodeBlock($node) {
return $this->getIndent($node) . parent::renderStartCodeBlock($node) . "\n";
}
/**
* Renders the end of a code block
*/
public function renderEndCodeBlock($node) {
return $this->getIndent($node) . parent::renderEndCodeBlock($node) . "\n";
}
private function getIndent($node) {
return str_repeat(' ', 2 * $node->line['indentLevel']);
}
}

View File

@@ -0,0 +1,137 @@
<?php
/* SVN FILE: $Id: HamlRenderer.php 93 2010-05-20 17:43:41Z chris.l.yates $ */
/**
* HamlRenderer class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.renderers
*/
require_once('HamlCompressedRenderer.php');
require_once('HamlCompactRenderer.php');
require_once('HamlExpandedRenderer.php');
require_once('HamlNestedRenderer.php');
/**
* HamlRenderer class.
* Provides the most common version of each method. Child classs override
* methods to provide style specific rendering.
* @package PHamlP
* @subpackage Haml.renderers
*/
class HamlRenderer {
/**#@+
* Output Styles
*/
const STYLE_COMPRESSED = 'compressed';
const STYLE_COMPACT = 'compact';
const STYLE_EXPANDED = 'expanded';
const STYLE_NESTED = 'nested';
/**#@-*/
const INDENT = ' ';
private $format;
private $attrWrapper;
private $minimizedAttributes;
/**
* Returns the renderer for the required render style.
* @param string render style
* @return HamlRenderer
*/
static public function getRenderer($style, $options) {
switch ($style) {
case self::STYLE_COMPACT:
return new HamlCompactRenderer($options);
case self::STYLE_COMPRESSED:
return new HamlCompressedRenderer($options);
case self::STYLE_EXPANDED:
return new HamlExpandedRenderer($options);
case self::STYLE_NESTED:
return new HamlNestedRenderer($options);
} // switch
}
public function __construct($options) {
foreach ($options as $name => $value) {
$this->$name = $value;
} // foreach
}
/**
* Renders element attributes
*/
private function renderAttributes($attributes) {
$output = '';
foreach ($attributes as $name => $value) {
if (is_integer($name)) { // attribute function
$output .= " $value";
}
elseif ($name == $value &&
($this->format === 'html4' || $this->format === 'html5')) {
$output .= " $name";
}
else {
$output .= " $name={$this->attrWrapper}$value{$this->attrWrapper}";
}
}
return $output;
}
/**
* Renders the opening tag of an element
*/
public function renderOpeningTag($node) {
$output = "<{$node->content}";
$output .= $this->renderAttributes($node->attributes);
$output .= ($node->isSelfClosing ? ' /' : '') . '>';
return $output;
}
/**
* Renders the closing tag of an element
*/
public function renderClosingTag($node) {
return ($node->isSelfClosing ? '' : "</{$node->content}>");
}
/**
* Renders the opening of a comment
*/
public function renderOpenComment($node) {
return ($node->isConditional ? "\n\n" : '') . "<!--{$node->content}" . ($node->isConditional ? ">\n" : ' ');
}
/**
* Renders the closing of a comment
*/
public function renderCloseComment($node) {
return ($node->isConditional ? "\n<![endif]" : ' ') . '-->' . ($node->isConditional ? "\n" : '');
}
/**
* Renders the start of a code block
*/
public function renderStartCodeBlock($node) {
return $this->renderContent($node);
}
/**
* Renders the end of a code block
*/
public function renderEndCodeBlock($node) {
return '<?php }' . (!empty($node->doWhile) ? " {$node->doWhile}" : '') . ' ?>';
}
/**
* Renders content.
* @param HamlNode the node being rendered
* @return string the rendered content
*/
public function renderContent($node) {
return $node->content;
}
}

View File

@@ -0,0 +1,58 @@
<?php
/* SVN FILE: $Id: HamlCodeBlockNode.php 92 2010-05-20 17:42:59Z chris.l.yates $ */
/**
* HamlCodeBlockNode class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
require_once('HamlRootNode.php');
require_once('HamlNodeExceptions.php');
/**
* HamlCodeBlockNode class.
* Represents a code block - if, elseif, else, foreach, do, and while.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlCodeBlockNode extends HamlNode {
/**
* @var HamlCodeBlockNode else nodes for if statements
*/
public $else;
/**
* @var string while clause for do-while loops
*/
public $doWhile;
/**
* Adds an "else" statement to this node.
* @param SassIfNode "else" statement node to add
* @return SassIfNode this node
*/
public function addElse($node) {
if (is_null($this->else)) {
$node->root = $this->root;
$node->parent = $this->parent;
$this->else = $node;
}
else {
$this->else->addElse($node);
}
return $this;
}
public function render() {
$output = $this->renderer->renderStartCodeBlock($this);
foreach ($this->children as $child) {
$output .= $child->render();
} // foreach
$output .= (empty($this->else) ?
$this->renderer->renderEndCodeBlock($this) : $this->else->render());
return $this->debug($output);
}
}

View File

@@ -0,0 +1,41 @@
<?php
/* SVN FILE: $Id: HamlCommentNode.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* HamlCommentNode class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
/**
* HamlCommentNode class.
* Represents a comment, including MSIE conditional comments.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlCommentNode extends HamlNode {
private $isConditional;
public function __construct($content, $parent) {
$this->content = $content;
$this->isConditional = (bool)preg_match('/^\[.+\]$/', $content, $matches);
$this->parent = $parent;
$this->root = $parent->root;
$parent->children[] = $this;
}
public function getIsConditional() {
return $this->isConditional;
}
public function render() {
$output = $this->renderer->renderOpenComment($this);
foreach ($this->children as $child) {
$output .= $child->render();
} // foreach
$output .= $this->renderer->renderCloseComment($this);
return $this->debug($output);
}
}

View File

@@ -0,0 +1,27 @@
<?php
/* SVN FILE: $Id: HamlDoctypeNode.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* HamlDoctypeNode class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
/**
* HamlDoctypeNode class.
* Represents a Doctype.
* Doctypes are always rendered on a single line with a newline.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlDoctypeNode extends HamlNode {
/**
* Render this node.
* @return string the rendered node
*/
public function render() {
return $this->debug($this->content . "\n");
}
}

View File

@@ -0,0 +1,52 @@
<?php
/* SVN FILE: $Id: HamlElementNode.php 83 2010-05-17 16:35:54Z chris.l.yates $ */
/**
* HamlElementNode class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
require_once('HamlRootNode.php');
require_once('HamlNodeExceptions.php');
/**
* HamlElementNode class.
* Represents an element.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlElementNode extends HamlNode {
public $isBlock;
public $isSelfClosing;
public $attributes;
public $whitespaceControl;
public $escapeHTML;
public function render() {
$renderer = $this->renderer;
$this->output = $renderer->renderOpeningTag($this);
$close = $renderer->renderClosingTag($this);
if ($this->whitespaceControl['outer']['left']) {
$this->output = ltrim($this->output);
$close = rtrim($close);
$this->parent->output = rtrim($this->parent->output);
}
foreach ($this->children as $index=>$child) {
$output = $child->render();
$output = ($this->whitespaceControl['inner'] ? trim($output) : $output);
if ($index && $this->children[$index-1] instanceof HamlElementNode && $this->children[$index-1]->whitespaceControl['outer']['right']) {
$output = ltrim($output);
}
$this->output .= $output;
} // foreach
return $this->debug($this->output . (isset($child) &&
$child instanceof HamlElementNode &&
$child->whitespaceControl['outer']['right'] ? ltrim($close) : $close));
}
}

View File

@@ -0,0 +1,50 @@
<?php
/* SVN FILE: $Id: HamlFilterNode.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* HamlFilterNode class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
/**
* HamlFilterNode class.
* Represent a filter in the Haml source.
* The filter is run on the output from child nodes when the node is rendered.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlFilterNode extends HamlNode {
/**
* @var HamlBaseFilter the filter to run
*/
private $filter;
/**
* HamlFilterNode constructor.
* Sets the filter.
* @param HamlBaseFilter the filter to run
* @return HamlFilterNode
*/
public function __construct($filter, $parent) {
$this->filter = $filter;
$this->parent = $parent;
$this->root = $parent->root;
$parent->children[] = $this;
}
/**
* Render this node.
* The filter is run on the content of child nodes before being returned.
* @return string the rendered node
*/
public function render() {
$output = '';
foreach ($this->children as $child) {
$output .= $child->getContent();
} // foreach
return $this->debug($this->filter->run($output));
}
}

View File

@@ -0,0 +1,73 @@
<?php
/* SVN FILE: $Id: HamlHelperNode.php 117 2010-09-21 09:41:58Z chris.l.yates@gmail.com $ */
/**
* HamlHelperNode class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
/**
* HamlHelperNode class.
* Represent a helper in the Haml source.
* The helper is run on the output from child nodes when the node is rendered.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlHelperNode extends HamlNode {
const MATCH = '/(.*?)(\w+)\((.+?)\)(?:\s+(.*))?$/';
const PRE = 1;
const NAME = 2;
const ARGS = 3;
const BLOCK = 4;
/**
* @var string the helper class name
*/
private $class;
/**
* @var string helper method name
*/
private $pre;
/**
* @var string helper method name
*/
private $name;
/**
* @var string helper method arguments
*/
private $args;
/**
* HamlFilterNode constructor.
* Sets the filter.
* @param string helper class.
* @param string helper call.
* @return HamlHelperNode
*/
public function __construct($class, $pre, $name, $args, $parent) {
$this->class = $class;
$this->pre = $pre;
$this->name = $name;
$this->args = $args;
$this->parent = $parent;
$this->root = $parent->root;
$parent->children[] = $this;
}
/**
* Render this node.
* The filter is run on the content of child nodes before being returned.
* @return string the rendered node
*/
public function render() {
$children = '';
foreach ($this->children as $child) {
$children .= trim($child->render());
} // foreach
$output = '<?php '.(empty($this->pre) ? 'echo' : $this->pre)." {$this->class}::{$this->name}('$children',{$this->args}); ?>";
return $this->debug($output);
}
}

View File

@@ -0,0 +1,253 @@
<?php
/* SVN FILE: $Id: HamlNode.php 92 2010-05-20 17:42:59Z chris.l.yates $ */
/**
* HamlNode class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
require_once('HamlRootNode.php');
require_once('HamlCommentNode.php');
require_once('HamlDoctypeNode.php');
require_once('HamlElementNode.php');
require_once('HamlFilterNode.php');
require_once('HamlHelperNode.php');
require_once('HamlCodeBlockNode.php');
require_once('HamlNodeExceptions.php');
/**
* HamlNode class.
* Base class for all Haml nodes.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlNode {
/**
* @var HamlNode root node of this node
*/
protected $root;
/**
* @var HamlNode parent of this node
*/
protected $parent;
/**
* @var array children of this node
*/
protected $children = array();
/**
* @var array source line token
*/
public $token;
/**
* @var boolean whether to show the output in the browser for debug
*/
public $showOutput;
/**
* @var boolean whether to show the source in the browser for debug
*/
public $showSource;
/**
* @var string content to render
*/
public $content;
/**
* @var string output buffer
*/
protected $output;
/**
* @var HamlRenderer Renderer object
*/
private $_r;
/**
* @var array Options
*/
private $_o;
public function __construct($content, $parent) {
$this->content = $content;
if (!is_null($parent)) { // $parent === null for "else" code blocks
$this->parent = $parent;
$this->root = $parent->root;
$parent->children[] = $this;
}
}
/**
* Getter.
* @param string name of property to get
* @return mixed return value of getter function
*/
public function __get($name) {
$getter = 'get' . ucfirst($name);
if (method_exists($this, $getter)) {
return $this->$getter();
}
throw new HamlNodeException('No getter function for {what}', array('{what}'=>$name));
}
/**
* Setter.
* @param string name of property to set
* @return mixed value of property
* @return HamlNode this node
*/
public function __set($name, $value) {
$setter = 'set' . ucfirst($name);
if (method_exists($this, $setter)) {
$this->$setter($value);
return $this;
}
throw new HamlNodeException('No setter function for {what}', array('{what}'=>$name));
}
/**
* Return a value indicating if this node has a parent
* @return array the node's parent
*/
public function hasParent() {
return !empty($this->parent);
}
/**
* Returns the node's content and that of its child nodes
* @param integer the indent level. This is to allow properly indented output
* that filters (e.g. Sass) may need.
* @return string the node's content and that of its child nodes
*/
public function getContent($indentLevel = 0) {
$output = str_repeat(' ', 2 * $indentLevel++) . $this->content . "\n";
foreach ($this->children as $child) {
$output .= $child->getContent($indentLevel);
} // foreach
return $output;
}
/**
* Returns the node's parent
* @return array the node's parent
*/
public function getParent() {
return $this->parent;
}
/**
* Returns a value indicating if this node has children
* @return boolean true if the node has children, false if not
*/
public function hasChildren() {
return !empty($this->children);
}
/**
* Returns the node's children
* @return array the node's children
*/
public function getChildren() {
return $this->children;
}
/**
* Returns the last child node of this node.
* @return HamlNode the last child node of this node
*/
public function getLastChild() {
return $this->children[count($this->children) - 1];
}
/**
* Returns the indent level of this node.
* @return integer the indent level of this node
*/
private function getLevel() {
return $this->token['level'];
}
/**
* Sets the indent level of this node.
* Used during rendering to give correct indentation.
* @param integer the indent level of this node
* @return HamlNode this node
*/
private function setLevel($level) {
$this->token['level'] = $level;
return $this;
}
/**
* Returns the source for this node
* @return string the source for this node
*/
private function getSource() {
return $this->token[HamlParser::HAML_SOURCE];
}
/**
* Returns the source for this node
* @return string the source for this node
*/
private function getLine() {
return $this->token['line'];
}
/**
* Returns the filename for this node
* @return string the filename for this node
*/
private function getFilename() {
return $this->token['filename'];
}
/**
* Returns the options.
* @return array the options
*/
public function getOptions() {
if (empty($this->_o)) {
$this->_r = $this->root->options;
}
return $this->_o;
}
/**
* Returns the renderer.
* @return HamlRenderer the rendered
*/
public function getRenderer() {
if (empty($this->_r)) {
$this->_r = $this->root->renderer;
}
return $this->_r;
}
public function render() {
$output = $this->renderer->renderContent($this);
foreach ($this->children as $child) {
$output .= $child->render();
} // foreach
return $this->debug($output);
}
protected function debug($output) {
$output = ($this->showSource ? $this->showSource($output) : $output);
return ($this->showOutput && $this->line['indentLevel'] == 0 ?
nl2br(str_replace(' ', '&nbsp;', htmlspecialchars($output))) :
$output);
}
/**
* Adds a comment with source debug information for the current line to the output.
* The debug information is:
* + source file (relative to the application path)
* + line number
* + indent level
* + source code
* @param array source line(s) that generated the ouput
*/
protected function showSource($output) {
return "<!--\n ({$this->line['file']} {$this->line['number']}:{$this->line['indentLevel']})\n {$this->line[HamlParser::HAML_SOURCE]}\n-->\n$output";
}
}

View File

@@ -0,0 +1,19 @@
<?php
/* SVN FILE: $Id: HamlNodeExceptions.php 61 2010-04-16 10:19:59Z chris.l.yates $ */
/**
* HamlNode exception classes.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
require_once(dirname(__FILE__).'/../HamlException.php');
/**
* HamlNodeException class.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlNodeException extends HamlException {}

View File

@@ -0,0 +1,58 @@
<?php
/* SVN FILE: $Id: HamlRootNode.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* HamlRootNode class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Haml.tree
*/
require_once(dirname(__FILE__).'/../renderers/HamlRenderer.php');
/**
* HamlRootNode class.
* Also the root node of a document.
* @package PHamlP
* @subpackage Haml.tree
*/
class HamlRootNode extends HamlNode {
/**
* @var HamlRenderer the renderer for this node
*/
protected $renderer;
/**
* @var array options
*/
protected $options;
/**
* Root HamlNode constructor.
* @param array options for the tree
* @return HamlNode
*/
public function __construct($options) {
$this->root = $this;
$this->options = $options;
$this->renderer = HamlRenderer::getRenderer($this->options['style'],
array(
'format' => $this->options['format'],
'attrWrapper' => $this->options['attrWrapper'],
'minimizedAttributes' => $this->options['minimizedAttributes'],
)
);
$this->token = array('level' => -1);
}
/**
* Render this node.
* @return string the rendered node
*/
public function render() {
foreach ($this->children as $child) {
$this->output .= $child->render();
} // foreach
return $this->output;
}
}

View File

@@ -0,0 +1,29 @@
<?php
/* SVN FILE: $Id: SassException.php 61 2010-04-16 10:19:59Z chris.l.yates $ */
/**
* Sass exception.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Sass
*/
require_once(dirname(__FILE__).'/../PhamlpException.php');
/**
* Sass exception class.
* @package PHamlP
* @subpackage Sass
*/
class SassException extends PhamlpException {
/**
* Sass Exception.
* @param string Exception message
* @param array parameters to be applied to the message using <code>strtr</code>.
* @param object object with source code and meta data
*/
public function __construct($message, $params = array(), $object = null) {
parent::__construct('sass', $message, $params, $object);
}
}

164
lib/sass/sass/SassFile.php Normal file
View File

@@ -0,0 +1,164 @@
<?php
/* SVN FILE: $Id: SassFile.php 118 2010-09-21 09:45:11Z chris.l.yates@gmail.com $ */
/**
* SassFile class file.
* File handling utilites.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Sass
*/
/**
* SassFile class.
* @package PHamlP
* @subpackage Sass
*/
class SassFile {
const SASS = 'sass';
const SCSS = 'scss';
const SASSC = 'sassc';
private static $extensions = array(self::SASS, self::SCSS);
/**
* Returns the parse tree for a file.
* If caching is enabled a cached version will be used if possible; if not the
* parsed file will be cached.
* @param string filename to parse
* @param SassParser Sass parser
* @return SassRootNode
*/
public static function getTree($filename, $parser) {
if ($parser->cache) {
$cached = self::getCachedFile($filename, $parser->cache_location);
if ($cached !== false) {
return $cached;
}
}
$sassParser = new SassParser(array_merge($parser->options, array('line'=>1)));
$tree = $sassParser->parse($filename);
if ($parser->cache) {
self::setCachedFile($tree, $filename, $parser->cache_location);
}
return $tree;
}
/**
* Returns the full path to a file to parse.
* The file is looked for recursively under the load_paths directories and
* the template_location directory.
* If the filename does not end in .sass or .scss try the current syntax first
* then, if a file is not found, try the other syntax.
* @param string filename to find
* @param SassParser Sass parser
* @return string path to file
* @throws SassException if file not found
*/
public static function getFile($filename, $parser) {
$ext = substr($filename, -5);
foreach (self::$extensions as $i=>$extension) {
if ($ext !== '.'.self::SASS && $ext !== '.'.self::SCSS) {
if ($i===0) {
$_filename = "$filename.{$parser->syntax}";
}
else {
$_filename = $filename.'.'.($parser->syntax === self::SASS ? self::SCSS : self::SASS);
}
}
else {
$_filename = $filename;
}
if (file_exists($_filename)) {
return $_filename;
}
foreach (array_merge(array(dirname($parser->filename)), $parser->load_paths) as $loadPath) {
$path = self::findFile($_filename, realpath($loadPath));
if ($path !== false) {
return $path;
}
} // foreach
if (!empty($parser->template_location)) {
$path = self::findFile($_filename, realpath($parser->template_location));
if ($path !== false) {
return $path;
}
}
}
throw new SassException('Unable to find {what}: {filename}', array('{what}'=>'import file', '{filename}'=>$filename));
}
/**
* Looks for the file recursively in the specified directory.
* This will also look for _filename to handle Sass partials.
* @param string filename to look for
* @param string path to directory to look in and under
* @return mixed string: full path to file if found, false if not
*/
public static function findFile($filename, $dir) {
$partialname = dirname($filename).DIRECTORY_SEPARATOR.'_'.basename($filename);
foreach (array($filename, $partialname) as $file) {
if (file_exists($dir . DIRECTORY_SEPARATOR . $file)) {
return realpath($dir . DIRECTORY_SEPARATOR . $file);
}
}
$files = array_slice(scandir($dir), 2);
foreach ($files as $file) {
if (is_dir($dir . DIRECTORY_SEPARATOR . $file)) {
$path = self::findFile($filename, $dir . DIRECTORY_SEPARATOR . $file);
if ($path !== false) {
return $path;
}
}
} // foreach
return false;
}
/**
* Returns a cached version of the file if available.
* @param string filename to fetch
* @param string path to cache location
* @return mixed the cached file if available or false if it is not
*/
public static function getCachedFile($filename, $cacheLocation) {
$cached = realpath($cacheLocation) . DIRECTORY_SEPARATOR .
md5($filename) . '.'.self::SASSC;
if ($cached && file_exists($cached) &&
filemtime($cached) >= filemtime($filename)) {
return unserialize(file_get_contents($cached));
}
return false;
}
/**
* Saves a cached version of the file.
* @param SassRootNode Sass tree to save
* @param string filename to save
* @param string path to cache location
* @return mixed the cached file if available or false if it is not
*/
public static function setCachedFile($sassc, $filename, $cacheLocation) {
$cacheDir = realpath($cacheLocation);
if (!$cacheDir) {
mkdir($cacheLocation);
@chmod($cacheLocation, 0777);
$cacheDir = realpath($cacheLocation);
}
$cached = $cacheDir . DIRECTORY_SEPARATOR . md5($filename) . '.'.self::SASSC;
return file_put_contents($cached, serialize($sassc));
}
}

View File

@@ -0,0 +1,848 @@
<?php
/* SVN FILE: $Id: SassParser.php 118 2010-09-21 09:45:11Z chris.l.yates@gmail.com $ */
/**
* SassParser class file.
* See the {@link http://sass-lang.com/docs Sass documentation}
* for details of Sass.
*
* Credits:
* This is a port of Sass to PHP. All the genius comes from the people that
* invented and develop Sass; in particular:
* + {@link http://hamptoncatlin.com/ Hampton Catlin},
* + {@link http://nex-3.com/ Nathan Weizenbaum},
* + {@link http://chriseppstein.github.com/ Chris Eppstein}
*
* The bugs are mine. Please report any found at {@link http://code.google.com/p/phamlp/issues/list}
*
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Sass
*/
require_once('SassFile.php');
require_once('SassException.php');
require_once('tree/SassNode.php');
/**
* SassParser class.
* Parses {@link http://sass-lang.com/ .sass and .sccs} files.
* @package PHamlP
* @subpackage Sass
*/
class SassParser {
/**#@+
* Default option values
*/
const CACHE = true;
const CACHE_LOCATION = './sass-cache';
const CSS_LOCATION = './css';
const TEMPLATE_LOCATION = './sass-templates';
const BEGIN_COMMENT = '/';
const BEGIN_CSS_COMMENT = '/*';
const END_CSS_COMMENT = '*/';
const BEGIN_SASS_COMMENT= '//';
const BEGIN_INTERPOLATION = '#';
const BEGIN_INTERPOLATION_BLOCK = '#{';
const BEGIN_BLOCK = '{';
const END_BLOCK = '}';
const END_STATEMENT = ';';
const DOUBLE_QUOTE = '"';
const SINGLE_QUOTE = "'";
/**
* @var string the character used for indenting
* @see indentChars
* @see indentSpaces
*/
private $indentChar;
/**
* @var array allowable characters for indenting
*/
private $indentChars = array(' ', "\t");
/**
* @var integer number of spaces for indentation.
* Used to calculate {@link Level} if {@link indentChar} is space.
*/
private $indentSpaces = 2;
/**
* @var string source
*/
private $source;
/**#@+
* Option
*/
/**
* cache:
* @var boolean Whether parsed Sass files should be cached, allowing greater
* speed.
*
* Defaults to true.
*/
private $cache;
/**
* cache_location:
* @var string The path where the cached sassc files should be written to.
*
* Defaults to './sass-cache'.
*/
private $cache_location;
/**
* css_location:
* @var string The path where CSS output should be written to.
*
* Defaults to './css'.
*/
private $css_location;
/**
* debug_info:
* @var boolean When true the line number and file where a selector is defined
* is emitted into the compiled CSS in a format that can be understood by the
* {@link https://addons.mozilla.org/en-US/firefox/addon/103988/
* FireSass Firebug extension}.
* Disabled when using the compressed output style.
*
* Defaults to false.
* @see style
*/
private $debug_info;
/**
* extensions:
* @var array Sass extensions, e.g. Compass. An associative array of the form
* $name => $options where $name is the name of the extension and $options
* is an array of name=>value options pairs.
*/
protected $extensions;
/**
* filename:
* @var string The filename of the file being rendered.
* This is used solely for reporting errors.
*/
protected $filename;
/**
* function_paths:
* @var array An array of filesystem paths which should be searched for
* SassScript functions.
*/
private $function_paths;
/**
* line:
* @var integer The number of the first line of the Sass template. Used for
* reporting line numbers for errors. This is useful to set if the Sass
* template is embedded.
*
* Defaults to 1.
*/
private $line;
/**
* line_numbers:
* @var boolean When true the line number and filename where a selector is
* defined is emitted into the compiled CSS as a comment. Useful for debugging
* especially when using imports and mixins.
* Disabled when using the compressed output style or the debug_info option.
*
* Defaults to false.
* @see debug_info
* @see style
*/
private $line_numbers;
/**
* load_paths:
* @var array An array of filesystem paths which should be searched for
* Sass templates imported with the @import directive.
*
* Defaults to './sass-templates'.
*/
private $load_paths;
/**
* property_syntax:
* @var string Forces the document to use one syntax for
* properties. If the correct syntax isn't used, an error is thrown.
* Value can be:
* + new - forces the use of a colon or equals sign after the property name.
* For example color: #0f3 or width: $main_width.
* + old - forces the use of a colon before the property name.
* For example: :color #0f3 or :width = $main_width.
*
* By default, either syntax is valid.
*
* Ignored for SCSS files which alaways use the new style.
*/
private $property_syntax;
/**
* quiet:
* @var boolean When set to true, causes warnings to be disabled.
* Defaults to false.
*/
private $quiet;
/**
* style:
* @var string the style of the CSS output.
* Value can be:
* + nested - Nested is the default Sass style, because it reflects the
* structure of the document in much the same way Sass does. Each selector
* and rule has its own line with indentation is based on how deeply the rule
* is nested. Nested style is very useful when looking at large CSS files as
* it allows you to very easily grasp the structure of the file without
* actually reading anything.
* + expanded - Expanded is the typical human-made CSS style, with each selector
* and property taking up one line. Selectors are not indented; properties are
* indented within the rules.
* + compact - Each CSS rule takes up only one line, with every property defined
* on that line. Nested rules are placed with each other while groups of rules
* are separated by a blank line.
* + compressed - Compressed has no whitespace except that necessary to separate
* selectors and properties. It's not meant to be human-readable.
*
* Defaults to 'nested'.
*/
private $style;
/**
* syntax:
* @var string The syntax of the input file.
* 'sass' for the indented syntax and 'scss' for the CSS-extension syntax.
*
* This is set automatically when parsing a file, else defaults to 'sass'.
*/
private $syntax;
/**
* template_location:
* @var string Path to the root sass template directory for your
* application.
*/
private $template_location;
/**
* vendor_properties:
* If enabled a property need only be written in the standard form and vendor
* specific versions will be added to the style sheet.
* @var mixed array: vendor properties, merged with the built-in vendor
* properties, to automatically apply.
* Boolean true: use built in vendor properties.
*
* Defaults to vendor_properties disabled.
* @see _vendorProperties
*/
private $vendor_properties = array();
/**#@-*/
/**
* Defines the build-in vendor properties
* @var array built-in vendor properties
* @see vendor_properties
*/
private $_vendorProperties = array(
'border-radius' => array(
'-moz-border-radius',
'-webkit-border-radius',
'-khtml-border-radius'
),
'border-top-right-radius' => array(
'-moz-border-radius-topright',
'-webkit-border-top-right-radius',
'-khtml-border-top-right-radius'
),
'border-bottom-right-radius' => array(
'-moz-border-radius-bottomright',
'-webkit-border-bottom-right-radius',
'-khtml-border-bottom-right-radius'
),
'border-bottom-left-radius' => array(
'-moz-border-radius-bottomleft',
'-webkit-border-bottom-left-radius',
'-khtml-border-bottom-left-radius'
),
'border-top-left-radius' => array(
'-moz-border-radius-topleft',
'-webkit-border-top-left-radius',
'-khtml-border-top-left-radius'
),
'box-shadow' => array('-moz-box-shadow', '-webkit-box-shadow'),
'box-sizing' => array('-moz-box-sizing', '-webkit-box-sizing'),
'opacity' => array('-moz-opacity', '-webkit-opacity', '-khtml-opacity'),
);
/**
* Constructor.
* Sets parser options
* @param array $options
* @return SassParser
*/
public function __construct($options = array()) {
if (!is_array($options)) {
throw new SassException('{what} must be a {type}', array('{what}'=>'options', '{type}'=>'array'));
}
if (!empty($options['language'])) {
Phamlp::$language = $options['language'];
}
if (!empty($options['extensions'])) {
foreach ($options['extensions'] as $extension=>$extOptions) {
include dirname(__FILE__).DIRECTORY_SEPARATOR.'extensions'.DIRECTORY_SEPARATOR.$extension.DIRECTORY_SEPARATOR.'config.php';
$configClass = 'SassExtentions'.$extension.'Config';
$config = new $configClass;
$config->config($extOptions);
$lp = dirname(__FILE__).DIRECTORY_SEPARATOR.'extensions'.DIRECTORY_SEPARATOR.$extension.DIRECTORY_SEPARATOR.'frameworks';
$fp = dirname(__FILE__).DIRECTORY_SEPARATOR.'extensions'.DIRECTORY_SEPARATOR.$extension.DIRECTORY_SEPARATOR.'functions';
$options['load_paths'] = (empty($options['load_paths']) ?
array($lp) : array_merge($options['load_paths'], $lp));
$options['function_paths'] = (empty($options['function_paths']) ?
array($fp) : array_merge($options['function_paths'], $fp));
}
}
if (!empty($options['vendor_properties'])) {
if ($options['vendor_properties'] === true) {
$this->vendor_properties = $this->_vendorProperties;
}
elseif (is_array($options['vendor_properties'])) {
$this->vendor_properties = array_merge($this->vendor_properties, $this->_vendorProperties);
}
}
unset($options['language'], $options['vendor_properties']);
$defaultOptions = array(
'cache' => self::CACHE,
'cache_location' => dirname(__FILE__) . DIRECTORY_SEPARATOR . self::CACHE_LOCATION,
'css_location' => dirname(__FILE__) . DIRECTORY_SEPARATOR . self::CSS_LOCATION,
'debug_info' => false,
'filename' => array('dirname' => '', 'basename' => ''),
'function_paths' => array(),
'load_paths' => array(dirname(__FILE__) . DIRECTORY_SEPARATOR . self::TEMPLATE_LOCATION),
'line' => 1,
'line_numbers' => false,
'style' => SassRenderer::STYLE_NESTED,
'syntax' => SassFile::SASS
);
foreach (array_merge($defaultOptions, $options) as $name=>$value) {
if (property_exists($this, $name)) {
$this->$name = $value;
}
}
}
/**
* Getter.
* @param string name of property to get
* @return mixed return value of getter function
*/
public function __get($name) {
$getter = 'get' . ucfirst($name);
if (method_exists($this, $getter)) {
return $this->$getter();
}
throw new SassException('No getter function for {what}', array('{what}'=>$name));
}
public function getCache() {
return $this->cache;
}
public function getCache_location() {
return $this->cache_location;
}
public function getCss_location() {
return $this->css_location;
}
public function getDebug_info() {
return $this->debug_info;
}
public function getFilename() {
return $this->filename;
}
public function getLine() {
return $this->line;
}
public function getSource() {
return $this->source;
}
public function getLine_numbers() {
return $this->line_numbers;
}
public function getFunction_paths() {
return $this->function_paths;
}
public function getLoad_paths() {
return $this->load_paths;
}
public function getProperty_syntax() {
return $this->property_syntax;
}
public function getQuiet() {
return $this->quiet;
}
public function getStyle() {
return $this->style;
}
public function getSyntax() {
return $this->syntax;
}
public function getTemplate_location() {
return $this->template_location;
}
public function getVendor_properties() {
return $this->vendor_properties;
}
public function getOptions() {
return array(
'cache' => $this->cache,
'cache_location' => $this->cache_location,
'css_location' => $this->css_location,
'filename' => $this->filename,
'function_paths' => $this->function_paths,
'line' => $this->line,
'line_numbers' => $this->line_numbers,
'load_paths' => $this->load_paths,
'property_syntax' => $this->property_syntax,
'quiet' => $this->quiet,
'style' => $this->style,
'syntax' => $this->syntax,
'template_location' => $this->template_location,
'vendor_properties' => $this->vendor_properties
);
}
/**
* Parse a sass file or Sass source code and returns the CSS.
* @param string name of source file or Sass source
* @return string CSS
*/
public function toCss($source, $isFile = true) {
return $this->parse($source, $isFile)->render();
}
/**
* Parse a sass file or Sass source code and
* returns the document tree that can then be rendered.
* The file will be searched for in the directories specified by the
* load_paths option.
* If caching is enabled a cached version will be used if possible or the
* compiled version cached if not.
* @param string name of source file or Sass source
* @return SassRootNode Root node of document tree
*/
public function parse($source, $isFile = true) {
if ($isFile) {
$this->filename = SassFile::getFile($source, $this);
if ($isFile) {
$this->syntax = substr($this->filename, -4);
}
elseif ($this->syntax !== SassFile::SASS && $this->syntax !== SassFile::SCSS) {
throw new SassException('Invalid {what}', array('{what}'=>'syntax option'));
}
if ($this->cache) {
$cached = SassFile::getCachedFile($this->filename, $this->cache_location);
if ($cached !== false) {
return $cached;
}
}
$tree = $this->toTree(file_get_contents($this->filename));
if ($this->cache) {
SassFile::setCachedFile($tree, $this->filename, $this->cache_location);
}
return $tree;
}
else {
return $this->toTree($source);
}
}
/**
* Parse Sass source into a document tree.
* If the tree is already created return that.
* @param string Sass source
* @return SassRootNode the root of this document tree
*/
private function toTree($source) {
if ($this->syntax === SassFile::SASS) {
$this->source = explode("\n", $source);
$this->setIndentChar();
}
else {
$this->source = $source;
}
unset($source);
$root = new SassRootNode($this);
$this->buildTree($root);
return $root;
}
/**
* Builds a parse tree under the parent node.
* Called recursivly until the source is parsed.
* @param SassNode the node
*/
private function buildTree($parent) {
$node = $this->getNode($parent);
while (is_object($node) && $node->isChildOf($parent)) {
$parent->addChild($node);
$node = $this->buildTree($node);
}
return $node;
}
/**
* Creates and returns the next SassNode.
* The tpye of SassNode depends on the content of the SassToken.
* @return SassNode a SassNode of the appropriate type. Null when no more
* source to parse.
*/
private function getNode($node) {
$token = $this->getToken();
if (empty($token)) return null;
switch (true) {
case SassDirectiveNode::isa($token):
return $this->parseDirective($token, $node);
break;
case SassCommentNode::isa($token):
return new SassCommentNode($token);
break;
case SassVariableNode::isa($token):
return new SassVariableNode($token);
break;
case SassPropertyNode::isa($token, $this->property_syntax):
return new SassPropertyNode($token, $this->property_syntax);
break;
case SassMixinDefinitionNode::isa($token):
if ($this->syntax === SassFile::SCSS) {
throw new SassException('Mixin {which} shortcut not allowed in SCSS', array('{which}'=>'definition'), $this);
}
return new SassMixinDefinitionNode($token);
break;
case SassMixinNode::isa($token):
if ($this->syntax === SassFile::SCSS) {
throw new SassException('Mixin {which} shortcut not allowed in SCSS', array('{which}'=>'include'), $this);
}
return new SassMixinNode($token);
break;
default:
return new SassRuleNode($token);
break;
} // switch
}
/**
* Returns a token object that contains the next source statement and
* meta data about it.
* @return object
*/
private function getToken() {
return ($this->syntax === SassFile::SASS ? $this->sass2Token() : $this->scss2Token());
}
/**
* Returns an object that contains the next source statement and meta data
* about it from SASS source.
* Sass statements are passed over. Statements spanning multiple lines, e.g.
* CSS comments and selectors, are assembled into a single statement.
* @return object Statement token. Null if end of source.
*/
private function sass2Token() {
$statement = ''; // source line being tokenised
$token = null;
while (is_null($token) && !empty($this->source)) {
while (empty($statement) && !empty($this->source)) {
$source = array_shift($this->source);
$statement = trim($source);
$this->line++;
}
if (empty($statement)) {
break;
}
$level = $this->getLevel($source);
// Comment statements can span multiple lines
if ($statement[0] === self::BEGIN_COMMENT) {
// Consume Sass comments
if (substr($statement, 0, strlen(self::BEGIN_SASS_COMMENT))
=== self::BEGIN_SASS_COMMENT) {
unset($statement);
while($this->getLevel($this->source[0]) > $level) {
array_shift($this->source);
$this->line++;
}
continue;
}
// Build CSS comments
elseif (substr($statement, 0, strlen(self::BEGIN_CSS_COMMENT))
=== self::BEGIN_CSS_COMMENT) {
while($this->getLevel($this->source[0]) > $level) {
$statement .= "\n" . ltrim(array_shift($this->source));
$this->line++;
}
}
else {
$this->source = $statement;
throw new SassException('Illegal comment type', array(), $this);
}
}
// Selector statements can span multiple lines
elseif (substr($statement, -1) === SassRuleNode::CONTINUED) {
// Build the selector statement
while($this->getLevel($this->source[0]) === $level) {
$statement .= ltrim(array_shift($this->source));
$this->line++;
}
}
$token = (object) array(
'source' => $statement,
'level' => $level,
'filename' => $this->filename,
'line' => $this->line - 1,
);
}
return $token;
}
/**
* Returns the level of the line.
* Used for .sass source
* @param string the source
* @return integer the level of the source
* @throws Exception if the source indentation is invalid
*/
private function getLevel($source) {
$indent = strlen($source) - strlen(ltrim($source));
$level = $indent/$this->indentSpaces;
if (!is_int($level) ||
preg_match("/[^{$this->indentChar}]/", substr($source, 0, $indent))) {
$this->source = $source;
throw new SassException('Invalid indentation', array(), $this);
}
return $level;
}
/**
* Returns an object that contains the next source statement and meta data
* about it from SCSS source.
* @return object Statement token. Null if end of source.
*/
private function scss2Token() {
static $srcpos = 0; // current position in the source stream
static $srclen; // the length of the source stream
$statement = '';
$token = null;
if (empty($srclen)) {
$srclen = strlen($this->source);
}
while (is_null($token) && $srcpos < $srclen) {
$c = $this->source[$srcpos++];
switch ($c) {
case self::BEGIN_COMMENT:
if (substr($this->source, $srcpos-1, strlen(self::BEGIN_SASS_COMMENT))
=== self::BEGIN_SASS_COMMENT) {
while ($this->source[$srcpos++] !== "\n");
$statement .= "\n";
}
elseif (substr($this->source, $srcpos-1, strlen(self::BEGIN_CSS_COMMENT))
=== self::BEGIN_CSS_COMMENT) {
if (ltrim($statement)) {
throw new SassException('Invalid {what}', array('{what}'=>'comment'), (object) array(
'source' => $statement,
'filename' => $this->filename,
'line' => $this->line,
));
}
$statement .= $c.$this->source[$srcpos++];
while (substr($this->source, $srcpos, strlen(self::END_CSS_COMMENT))
!== self::END_CSS_COMMENT) {
$statement .= $this->source[$srcpos++];
}
$srcpos += strlen(self::END_CSS_COMMENT);
$token = $this->createToken($statement.self::END_CSS_COMMENT);
}
else {
$statement .= $c;
}
break;
case self::DOUBLE_QUOTE:
case self::SINGLE_QUOTE:
$statement .= $c;
while ($this->source[$srcpos] !== $c) {
$statement .= $this->source[$srcpos++];
}
$statement .= $this->source[$srcpos++];
break;
case self::BEGIN_INTERPOLATION:
$statement .= $c;
if (substr($this->source, $srcpos-1, strlen(self::BEGIN_INTERPOLATION_BLOCK))
=== self::BEGIN_INTERPOLATION_BLOCK) {
while ($this->source[$srcpos] !== self::END_BLOCK) {
$statement .= $this->source[$srcpos++];
}
$statement .= $this->source[$srcpos++];
}
break;
case self::BEGIN_BLOCK:
case self::END_BLOCK:
case self::END_STATEMENT:
$token = $this->createToken($statement . $c);
if (is_null($token)) $statement = '';
break;
default:
$statement .= $c;
break;
}
}
if (is_null($token))
$srclen = $srcpos = 0;
return $token;
}
/**
* Returns an object that contains the source statement and meta data about
* it.
* If the statement is just and end block we update the meta data and return null.
* @param string source statement
* @return SassToken
*/
private function createToken($statement) {
static $level = 0;
$this->line += substr_count($statement, "\n");
$statement = trim($statement);
if (substr($statement, 0, strlen(self::BEGIN_CSS_COMMENT)) !== self::BEGIN_CSS_COMMENT) {
$statement = str_replace(array("\n","\r"), '', $statement);
}
$last = substr($statement, -1);
// Trim the statement removing whitespace, end statement (;), begin block ({), and (unless the statement ends in an interpolation block) end block (})
$statement = rtrim($statement, ' '.self::BEGIN_BLOCK.self::END_STATEMENT);
$statement = (preg_match('/#\{.+?\}$/i', $statement) ? $statement : rtrim($statement, self::END_BLOCK));
$token = ($statement ? (object) array(
'source' => $statement,
'level' => $level,
'filename' => $this->filename,
'line' => $this->line,
) : null);
$level += ($last === self::BEGIN_BLOCK ? 1 : ($last === self::END_BLOCK ? -1 : 0));
return $token;
}
/**
* Parses a directive
* @param SassToken token to parse
* @param SassNode parent node
* @return SassNode a Sass directive node
*/
private function parseDirective($token, $parent) {
switch (SassDirectiveNode::extractDirective($token)) {
case '@extend':
return new SassExtendNode($token);
break;
case '@mixin':
return new SassMixinDefinitionNode($token);
break;
case '@include':
return new SassMixinNode($token);
break;
case '@import':
if ($this->syntax == SassFile::SASS) {
$i = 0;
$source = '';
while (!empty($this->source) && empty($source)) {
$source = $this->source[$i++];
}
if (!empty($source) && $this->getLevel($source) > $token->level) {
throw new SassException('Nesting not allowed beneath {what}', array('{what}'=>'@import directive'), $token);
}
}
return new SassImportNode($token);
break;
case '@for':
return new SassForNode($token);
break;
case '@if':
return new SassIfNode($token);
break;
case '@else': // handles else and else if directives
return new SassElseNode($token);
break;
case '@do':
case '@while':
return new SassWhileNode($token);
break;
case '@debug':
return new SassDebugNode($token);
break;
case '@warn':
return new SassDebugNode($token, true);
break;
default:
return new SassDirectiveNode($token);
break;
}
}
/**
* Determine the indent character and indent spaces.
* The first character of the first indented line determines the character.
* If this is a space the number of spaces determines the indentSpaces; this
* is always 1 if the indent character is a tab.
* Only used for .sass files.
* @throws SassException if the indent is mixed or
* the indent character can not be determined
*/
private function setIndentChar() {
foreach ($this->source as $l=>$source) {
if (!empty($source) && in_array($source[0], $this->indentChars)) {
$this->indentChar = $source[0];
for ($i = 0, $len = strlen($source); $i < $len && $source[$i] == $this->indentChar; $i++);
if ($i < $len && in_array($source[$i], $this->indentChars)) {
$this->line = ++$l;
$this->source = $source;
throw new SassException('Mixed indentation not allowed', array(), $this);
}
$this->indentSpaces = ($this->indentChar == ' ' ? $i : 1);
return;
}
} // foreach
$this->indentChar = ' ';
$this->indentSpaces = 2;
}
}

View File

@@ -0,0 +1,65 @@
<?php
/* SVN FILE: $Id: SassBoolean.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
/**
* Compass extension configuration class file.
* @author Chris Yates <chris.l.yates@gmail.com>
* @copyright Copyright (c) 2010 PBM Web Development
* @license http://phamlp.googlecode.com/files/license.txt
* @package PHamlP
* @subpackage Sass.extensions.compass
*/
/**
* Compass extension configuration class.
* @package PHamlP
* @subpackage Sass.extensions.compass
*/
class SassExtentionsCompassConfig {
public static $config;
private static $defaultConfig = array(
'project_path' => '',
'http_path' => '/',
'css_dir' => 'css',
'css_path' => '',
'http_css_path' => '',
'fonts_dir' => 'fonts',
'fonts_path' => '',
'http_fonts_path' => '',
'images_dir' => 'images',
'images_path' => '',
'http_images_path' => '',
'javascripts_dir' => 'javascripts',
'javascripts_path' => '',
'http_javascripts_path' => '',
'relative_assets' => true,
);
/**
* Sets configuration settings or returns a configuration setting.
* @param mixed array: configuration settings; string: configuration setting to return
* @return string configuration setting. Null if setting does not exist.
*/
public function config($config) {
if (is_array($config)) {
self::$config = array_merge(self::$defaultConfig, $config);
self::setDefaults();
}
elseif (is_string($config) && isset(self::$config[$config])) {
return self::$config[$config];
}
}
/**
* Sets default values for paths not specified
*/
private static function setDefaults() {
foreach (array('css', 'images', 'fonts', 'javascripts') as $asset) {
if (empty(self::$config[$asset.'_path'])) {
self::$config[$asset.'_path'] = self::$config['project_path'].DIRECTORY_SEPARATOR.self::$config[$asset.'_dir'];
}
if (empty(self::$config['http_'.$asset.'_path'])) {
self::$config['http_'.$asset.'_path'] = self::$config['http_path'].self::$config[$asset.'_dir'];
}
}
}
}

View File

@@ -0,0 +1,47 @@
@import "blueprint/colors";
@import "blueprint/grid";
@import "blueprint/typography";
@import "blueprint/utilities";
@import "blueprint/form";
@import "blueprint/interaction";
@import "blueprint/debug";
@import "blueprint/print";
@import "blueprint/ie";
// ### Usage examples:
//
// As a top-level mixin, apply to any page that includes the stylesheet:
// <pre class="source-code sass">
// +blueprint
// </pre>
//
// Scoped by a presentational class:
// <pre class="source-code sass">
// body.blueprint
// +blueprint(true)
// </pre>
//
// Scoped by semantic selectors:
// <pre class="source-code sass">
// body#page-1, body#page-2, body.a-special-page-type
// +blueprint(true)
// </pre>
//
// #### Deprecated:
// You use to be able to pass the body selector as the first argument when used as a top-level mixin
// <pre class="source-code sass">
// +blueprint("body#page-1, body#page-2, body.a-special-page-type")
// </pre>
@mixin blueprint($body_selector: body) {
//@doc off
@if not ($body_selector == "body" or $body_selector == true) {
@warn "[DEPRECATED] To specify a the selector \"#{$body_selector}\" to +blueprint, pass true as the first argument and mix it into #{$body_selector}."; }
//@doc on
@include blueprint-typography($body_selector);
@include blueprint-utilities;
@include blueprint-grid;
@include blueprint-debug;
@include blueprint-interaction;
@include blueprint-form;
}

View File

@@ -0,0 +1,101 @@
@import "compass/css3/inline-block";
@import "compass/utilities/general/float";
// Button Font
$blueprint_button_font_family: unquote('"Lucida Grande", Tahoma, Arial, Verdana, sans-serif') !default;
// Default Button Colors
$blueprint_button_border_color: #dedede !default;
$blueprint_button_background_color: #f5f5f5 !default;
$blueprint_button_font_color: #565656 !default;
// Default Button Hover Colors
$blueprint_button_hover_border_color: #c2e1ef !default;
$blueprint_button_hover_background_color: #dff4ff !default;
$blueprint_button_hover_font_color: #336699 !default;
// Default Button Active Colors
$blueprint_button_active_border_color: #6299c5 !default;
$blueprint_button_active_background_color: #6299c5 !default;
$blueprint_button_active_font_color: white !default;
//**
// Sets the colors for a button
// @param border_highlight_color
// The highlight color defaults to whatever is the value of the border_color but it's one shade lighter.
@mixin button-colors(
$font_color: $blueprint_button_font_color,
$bg_color: $blueprint_button_background_color,
$border_color: $blueprint_button_border_color,
$border_highlight_color: $border_color + #101010
) {
background-color: $bg_color;
border-color: $border_highlight_color $border_color $border_color $border_highlight_color;
color: $font_color;
}
//**
// Sets the colors for a button in the active state
// @param border_highlight_color
// The highlight color defaults to whatever is the value of the border_color but it's one shade lighter.
@mixin button-active-colors(
$font_color: $blueprint_button_active_font_color,
$bg_color: $blueprint_button_active_background_color,
$border_color: $blueprint_button_active_border_color,
$border_highlight_color: $border_color + #101010
) {
&:active {
@include button-colors($font_color, $bg_color, $border_color, $border_highlight_color);
}
}
//**
// Sets the colors for a button in the hover state.
// @param border_highlight_color
// The highlight color defaults to whatever is the value of the border_color but it's one shade lighter.
@mixin button-hover-colors(
$font_color: $blueprint_button_hover_font_color,
$bg_color: $blueprint_button_hover_background_color,
$border_color: $blueprint_button_hover_border_color,
$border_highlight_color: $border_color + #101010
) {
&:hover {
@include button-colors($font_color, $bg_color, $border_color, $border_highlight_color);
}
}
@mixin button-base($float: false) {
@if $float { @include float($float); display: block; }
@else { @include inline-block; }
margin: 0.7em 0.5em 0.7em 0;
border-width: 1px; border-style: solid;
font-family: $blueprint_button_font_family; font-size: 100%; line-height: 130%; font-weight: bold;
text-decoration: none;
cursor: pointer;
img {
margin: 0 3px -3px 0 !important;
padding: 0;
border: none;
width: 16px;
height: 16px;
float: none;
}
}
@mixin anchor-button($float: false) {
@include button-base($float);
padding: 5px 10px 5px 7px;
}
@mixin button-button($float: false) {
@include button-base($float);
width: auto;
overflow: visible;
padding: 4px 10px 3px 7px;
&[type] {
padding: 4px 10px 4px 7px;
line-height: 17px; }
*:first-child+html &[type] {
padding: 4px 10px 3px 7px;
}
}

View File

@@ -0,0 +1,32 @@
$font_color: #333333 !default;
$quiet_color: $font_color + #333333 !default;
$loud_color: $font_color - #222222 !default;
$header_color: $font_color - #111111 !default;
$alt_text_color: #666666 !default;
$blueprint_background_color: #eeeeee !default;
$link_color: #000099 !default;
$link_hover_color: black !default;
$link_focus_color: $link_hover_color !default;
$link_active_color: $link_color + #cc0000 !default;
$link_visited_color: $link_color - #333333 !default;
$feedback_border_color: #dddddd !default;
$success_color: #264409 !default;
$success_bg_color: #e6efc2 !default;
$success_border_color: #c6d880 !default;
$notice_color: #514721 !default;
$notice_bg_color: #fff6bf !default;
$notice_border_color: #ffd324 !default;
$error_color: #8a1f11 !default;
$error_bg_color: #fbe3e4 !default;
$error_border_color: #fbc2c4 !default;
$highlight_color: yellow !default;
$added_color: white !default;
$added_bg_color: #006600 !default;
$removed_color: white !default;
$removed_bg_color: #990000 !default;
$blueprint_table_header_color: #c3d9ff !default;
$blueprint_table_stripe_color: #e5ecf9 !default;

View File

@@ -0,0 +1,11 @@
@mixin showgrid($image: "grid.png") {
background: image_url($image);
}
@mixin blueprint-debug($grid_image: unquote("grid.png")) {
// Use this class on any column or container to see the grid.
// TODO: prefix this with the project path.
.showgrid {
@include showgrid($grid_image);
}
}

View File

@@ -0,0 +1,86 @@
@import "typography";
$alternate-text-font : "Warnock Pro", "Goudy Old Style", "Palatino", "Book Antiqua", Georgia, serif !default;
// To install the fancy type plugin:
// 1. import the fancy_type module: @import blueprint/fancy_type
// 2. mixin +fancy-type to your project's body or at the top level of your stylesheet:
// body
// +fancy-type
@mixin fancy-type {
@include fancy-paragraphs;
.caps { @include caps; }
.dquo { @include dquo; }
.alt { @include alt; }
}
// Indentation instead of line shifts for sibling paragraphs. Mixin to a style like p + p
@mixin sibling-indentation {
text-indent: 2em;
margin-top: -1.5em;
/* Don't want this in forms. */
form & { text-indent: 0; }
}
// For great looking type, use this code instead of asdf:
// <span class="alt">asdf</span>
// Best used on prepositions and ampersands.
@mixin alt {
color: $alt-text-color;
font-family: $alternate-text-font;
font-style: italic;
font-weight: normal;
}
// For great looking quote marks in titles, replace "asdf" with:
// <span class="dquo">&#8220;</span>asdf&#8221;
// (That is, when the title starts with a quote mark).
// (You may have to change this value depending on your font size).
@mixin dquo($offset: 0.5em) {
margin-left: -$offset;
}
// Reduced size type with incremental leading
// (http://www.markboulton.co.uk/journal/comments/incremental_leading/)
//
// This could be used for side notes. For smaller type, you don't necessarily want to
// follow the 1.5x vertical rhythm -- the line-height is too much.
//
// Using this mixin, reduces your font size and line-height so that for
// every four lines of normal sized type, there is five lines of the sidenote. eg:
//
// Arguments:
// `$font-size` - The desired font size in pixels. This will be converted to ems for you. Defaults to 10px.
// `$base-font-size` - The base font size in pixels. Defaults to 12px
// `$old-line-height` - The old line height. Defaults to 1.5 times the base-font-size
@mixin incr(
$font-size: 10px,
$base-font-size: $blueprint-font-size,
$old-line-height: $base-font-size * 1.5
) {
font-size: 1em * $font-size / $base-font-size;
line-height: 1em * $old-line-height / $font-size * 4 / 5;
margin-bottom: 1.5em;
}
// Surround uppercase words and abbreviations with this class.
// Based on work by Jørgen Arnor Gårdsø Lom [http://twistedintellect.com/]
@mixin caps {
font-variant: small-caps;
letter-spacing: 1px;
text-transform: lowercase;
font-size: 1.2em;
line-height: 1%;
font-weight: bold;
padding: 0 2px;
}
@mixin fancy-paragraphs {
p + p { @include sibling-indentation; }
p.incr,
.incr p { @include incr; }
}

View File

@@ -0,0 +1,68 @@
@import "colors";
// Mixin for producing Blueprint "inline" forms. Should be used with the blueprint-form mixin.
@mixin blueprint-inline-form {
line-height: 3;
p {
margin-bottom: 0;
}
}
@mixin blueprint-form {
@include blueprint-form-layout;
@include blueprint-form-borders;
@include blueprint-form-sizes;
}
@mixin blueprint-form-layout {
label { font-weight: bold; }
fieldset { padding: 1.4em; margin: 0 0 1.5em 0; }
legend { font-weight: bold; font-size: 1.2em; }
input {
&.text,
&.title,
&[type=email],
&[type=text],
&[type=password] { margin: 0.5em 0; background-color: white; padding: 5px; }
&.title { font-size: 1.5em; }
&[type=checkbox],
&.checkbox,
&[type=radio],
&.radio { position: relative; top: 0.25em; }
}
textarea { margin: 0.5em 0; padding: 5px; }
select { margin: 0.5em 0; }
}
@mixin blueprint-form-sizes
(
$input_width: 300px,
$textarea_width: 390px,
$textarea_height: 250px
) {
input {
&.text,
&.title,
&[type=email],
&[type=text],
&[type=password] { width: $input_width; }
}
textarea { width: $textarea_width; height: $textarea_height; }
}
@mixin blueprint-form-borders
(
$unfocused_border_color: #bbbbbb,
$focus_border_color: #666666,
$fieldset_border_color: #cccccc
) {
fieldset {
border: 1px solid $fieldset_border_color; }
input.text, input.title, input[type=email], input[type=text], input[type=password],
textarea, select {
border: 1px solid $unfocused_border_color;
&:focus {
border: 1px solid $focus_border_color;
}
}
}

View File

@@ -0,0 +1,249 @@
// --------------------------------------------------------------
// SASS Gridification
// * Author: Chris Eppstein
// A SASS adaptation of Blueprint CSS
// * Version: 0.7.1 (2008-02-25)
// * Website: http://code.google.com/p/blueprintcss/
// Based on work by:
// * Lorin Tackett [lorintackett.com]
// * Olav Bjorkoy [bjorkoy.com]
// * Nathan Borror [playgroundblues.com]
// * Jeff Croft [jeffcroft.com]
// * Christian Metts [mintchaos.com]
// * Khoi Vinh [subtraction.com]
// Read more about using a grid here:
// * http://www.subtraction.com/2007/03/18/oh-yeeaahh
// --------------------------------------------------------------
@import "compass/utilities/general/float";
@import "compass/utilities/general/clearfix";
// The number of columns in the grid.
$blueprint_grid_columns: 24 !default;
// The width of a column
$blueprint_grid_width: 30px !default;
// The amount of margin between columns
$blueprint_grid_margin: 10px !default;
// The width of a column including the margin. With default settings this is `40px`.
$blueprint_grid_outer_width: $blueprint_grid_width + $blueprint_grid_margin;
// The width of the container. With default settings this is `950px`.
$blueprint_container_size: $blueprint_grid_outer_width * $blueprint_grid_columns - $blueprint_grid_margin;
// Generates presentational class names that you can use
// in your html to layout your pages.
//
// #### Note:
// Best practices discourage using this mixin,
// but it is provided to support legacy websites
// and to test the sass port against blueprint's example pages.
@mixin blueprint-grid {
// A container should group all your columns
.container {
@include container; }
.column, #{enumerate("div.span", 1, $blueprint_grid_columns)} {
@include column-base; }
// The last column in a row needs this class (or mixin) or it will end up on the next row.
.last, div.last {
@include last; }
// Use these classes (or mixins) to set the width of a column.
@for $n from 1 to $blueprint_grid_columns {
.span-#{$n} {
@include span($n); } }
.span-#{$blueprint_grid_columns}, div.span-#{$blueprint_grid_columns} {
@include span($blueprint_grid_columns);
margin: 0; }
input, textarea, select {
@for $n from 1 through $blueprint_grid_columns {
&.span-#{$n} {
@include span($n, true); } } }
// Add these to a column to append empty cols.
@for $n from 1 to $blueprint_grid_columns {
.append-#{$n} {
@include append($n); } }
// Add these to a column to prepend empty cols.
@for $n from 1 to $blueprint_grid_columns {
.prepend-#{$n} {
@include prepend($n); } }
// Use these classes on an element to push it into the
// next column, or to pull it into the previous column.
#{enumerate(".pull", 1, $blueprint_grid_columns)} {
@include pull-base; }
@for $n from 1 through $blueprint_grid_columns {
.pull-#{$n} {
@include pull-margins($n); } }
#{enumerate(".push", 1, $blueprint_grid_columns)} {
@include push-base; }
@for $n from 1 through $blueprint_grid_columns {
.push-#{$n} {
@include push-margins($n); } }
.prepend-top {
@include prepend-top; }
.append-bottom {
@include append-bottom; } }
// A container for your columns.
//
// #### Note:
// If you use this mixin without the class and want to support ie6
// you must set text-align left on your container element in an IE stylesheet.
@mixin container {
width: $blueprint_container_size;
margin: 0 auto;
@include clearfix; }
// The last column in a row needs this mixin or it will end up
// on the next row in some browsers.
@mixin last {
margin-right: 0; }
// Use this mixins to set the width of n columns.
@mixin column($n, $last: false) {
@include column-base($last);
@include span($n); }
// Set only the width of an element to align it with the grid.
// Most of the time you'll want to use `+column` instead.
//
// This mixin is especially useful for aligning tables to the grid.
@mixin span($n, $override: false) {
$width: $blueprint_grid_width * $n + $blueprint_grid_margin * ($n - 1);
@if $override {
width: $width !important; }
@else {
width: $width; } }
// The basic set of styles needed to make an element
// behave like a column:
//
// * floated to left
// * gutter margin on the right (unless the last column)
// * Some IE fixes
//
// #### Note:
// This mixin gets applied automatically when using `+column`
// so you probably don't need to use it directly unless
// you need to deviate from the grid or are trying
// to reduce the amount of generated CSS.
@mixin column-base($last: false) {
@include float-left;
@if $last {
@include last; }
@else {
margin-right: $blueprint_grid_margin; }
* html & {
overflow-x: hidden; } }
// Mixin to a column to append n empty columns to the right
// by adding right padding to the column.
@mixin append($n) {
padding-right: $blueprint_grid_outer_width * $n; }
// Mixin to a column to append n empty columns to the left
// by adding left padding to the column.
@mixin prepend($n) {
padding-left: $blueprint_grid_outer_width * $n; }
// Adds trailing margin.
@mixin append-bottom($amount: 1.5em) {
margin-bottom: $amount; }
// Adds leading margin.
@mixin prepend-top($amount: 1.5em) {
margin-top: $amount; }
// Base styles that make it possible to pull an element to the left.
// #### Note:
// This mixin gets applied automatically when using `+pull`
// so you probably don't need to use it directly unless
// you need to deviate from the grid or are trying
// to reduce the amount of generated CSS.
@mixin pull-base {
@include float-left;
position: relative; }
// The amount of pulling for element to the left.
// #### Note:
// This mixin gets applied automatically when using `+pull`
// so you probably don't need to use it directly unless
// you need to deviate from the grid or are trying
// to reduce the amount of generated CSS.
@mixin pull-margins($n, $last: false) {
@if $last {
margin-left: -$blueprint_grid_outer_width * $n + $blueprint_grid_margin; }
@else {
margin-left: -$blueprint_grid_outer_width * $n; } }
// Moves a column `n` columns to the left.
//
// This mixin can also be used to change the display order of columns.
//
// If pulling past the last (visually) element in a row,
// pass `true` as the second argument so the calculations can adjust
// accordingly.
// For example:
//
// HTML:
// <pre class="source-code html">
// <div id="one">One</div>
// <div id="two">Two</div>
// </pre>
// Sass:
// <pre class="source-code sass">
// #one
// +column(18, true)
// +prepend(6)
// #two
// +column(6)
// +pull(18, true)
// </pre>
@mixin pull($n, $last: false) {
@include pull-base;
@include pull-margins($n, $last); }
@mixin push-base {
@include float-right;
position: relative; }
@mixin push-margins($n) {
margin: 0 (-$blueprint_grid_outer_width * $n) 1.5em $blueprint_grid_outer_width * $n; }
// mixin to a column to push it n columns to the right
@mixin push($n) {
@include push-base;
@include push-margins($n); }
// Border on right hand side of a column.
@mixin border($border_color: #eeeeee, $border_width: 1px) {
padding-right: $blueprint_grid_margin / 2 - $border_width;
margin-right: $blueprint_grid_margin / 2;
border-right: #{$border_width} solid #{$border_color}; }
// Border with more whitespace, spans one column.
@mixin colborder($border_color: #eeeeee, $border_width: 1px) {
padding-right: floor(($blueprint_grid_width + 2 * $blueprint_grid_margin - $border_width) / 2);
margin-right: ceil(($blueprint_grid_width + 2 * $blueprint_grid_margin - $border_width) / 2);
border-right: #{$border_width} solid #{$border_color}; }
// Mixin this to an hr to make a horizontal ruler across a column.
@mixin colruler($border_color: #dddddd) {
background: $border_color;
color: $border_color;
clear: both;
float: none;
width: 100%;
height: 0.1em;
margin: 0 0 1.45em;
border: none; }
// Mixin this to an hr to make a horizontal spacer across a column.
@mixin colspacer {
@include colruler;
background: white;
color: white;
visibility: hidden; }

View File

@@ -0,0 +1,109 @@
// @doc off
// The blueprint IE mixins should be mixed into a stylesheet that gets conditionally included
// into IE like so:
// <!--[if lt IE 8]><link rel="stylesheet" href="ie.css"
// type="text/css" media="screen, projection"><![endif]-->
// @doc on
//| Usage Examples
//| --------------
//|
//| As a top-level mixin, apply to any page that includes the stylesheet:
//| <pre class="source-code sass">
//| +blueprint-ie
//| </pre>
//| Scoped by a presentational class:
//| <pre class="source-code sass">
//| body.blueprint
//| +blueprint-ie(true)
//| </pre>
//| Scoped by semantic selectors:
//| <pre class="source-code sass">
//| body#page-1, body#page-2, body.a-special-page-type
//| +blueprint-ie(true)
//| </pre>
//| **Deprecated:** You can pass the body selector as the first argument when used as a top-level mixin
//| <pre class="source-code sass">
//| +blueprint-ie("body#page-1, body#page-2, body.a-special-page-type")
//| </pre>
@mixin blueprint-ie($body_selector: body) {
@if $body_selector == true {
@include blueprint-ie-body;
@include blueprint-ie-defaults; }
@else {
#{$body_selector} {
@include blueprint-ie-body;
@if $body_selector != "body" {
@warn "[DEPRECATED] To specify a the selector \"#{$body_selector}\" to +blueprint-ie, pass true as the first argument and mix it into #{$body_selector}.";
@include blueprint-ie-defaults; } }
@if $body_selector == "body" {
@include blueprint-ie-defaults; } } }
@mixin blueprint-ie-body {
text-align: center;
@include blueprint-ie-hacks; }
@mixin blueprint-ie-hacks {
* html & {
legend {
margin: 0px -8px 16px 0;
padding: 0; } }
html>& {
p code {
*white-space: normal; } } }
// Fixes for Blueprint "inline" forms in IE
@mixin blueprint-inline-form-ie {
div, p {
vertical-align: middle; }
label {
position: relative;
top: -0.25em; }
input {
&.checkbox, &.radio, &.button, button {
margin: 0.5em 0; } } }
@mixin blueprint-ie-defaults {
.container {
text-align: left; }
sup {
vertical-align: text-top; }
sub {
vertical-align: text-bottom; }
hr {
margin: -8px auto 11px; }
img {
-ms-interpolation-mode: bicubic; }
fieldset {
padding-top: 0; }
textarea {
overflow: auto; }
input {
&.text {
margin: 0.5em 0;
background-color: white;
border: 1px solid #bbbbbb;
&:focus {
border: 1px solid #666666; } }
&.title {
margin: 0.5em 0;
background-color: white;
border: 1px solid #bbbbbb;
&:focus {
border: 1px solid #666666; } }
&.checkbox {
position: relative;
top: 0.25em; }
&.radio {
position: relative;
top: 0.25em; }
&.button {
position: relative;
top: 0.25em; } }
textarea {
margin: 0.5em 0; }
select {
margin: 0.5em 0; }
button {
position: relative;
top: 0.25em; } }

View File

@@ -0,0 +1,57 @@
@import "colors";
@mixin blueprint-interaction {
.error {
@include error; }
.notice {
@include notice; }
.success {
@include success; }
.hide {
display: none; }
.highlight {
@include highlight; }
.added {
@include added; }
.removed {
@include removed; } }
@mixin feedback-base {
padding: 0.8em;
margin-bottom: 1em;
border: 2px solid $feedback_border_color; }
@mixin error {
@include feedback-base;
background: $error_bg_color;
color: $error_color;
border-color: $error_border_color;
a {
color: $error_color; } }
@mixin notice {
@include feedback-base;
background: $notice_bg_color;
color: $notice_color;
border-color: $notice_border_color;
a {
color: $notice_color; } }
@mixin success {
@include feedback-base;
background: $success_bg_color;
color: $success_color;
border-color: $success_border_color;
a {
color: $success_color; } }
@mixin highlight {
background: $highlight_color; }
@mixin added {
background: $added_bg_color;
color: $added_color; }
@mixin removed {
background: $removed_bg_color;
color: $removed_color; }

View File

@@ -0,0 +1,37 @@
@mixin no-link-icon {
background: transparent none !important;
padding: 0 !important;
margin: 0 !important;
}
@mixin link-icon-base {
padding: 2px 22px 2px 0;
margin: -2px 0;
background-repeat: no-repeat;
background-position: right center;
}
@mixin link-icon($name, $include-base: true) {
@if $include-base { @include link-icon-base; }
background-image: image-url("link_icons/#{$name}"); }
@mixin link-icons {
a[href^="http:"],
a[href^="mailto:"],
a[href^="http:"]:visited,
a[href$=".pdf"],
a[href$=".doc"],
a[href$=".xls"],
a[href$=".rss"],
a[href$=".rdf"],
a[href^="aim:"] { @include link-icon-base; }
a[href^="http:"] { @include link-icon("external.png", false); }
a[href^="mailto:"] { @include link-icon("email.png", false); }
a[href^="http:"]:visited { @include link-icon("visited.png", false); }
a[href$=".pdf"] { @include link-icon("pdf.png", false); }
a[href$=".doc"] { @include link-icon("doc.png", false); }
a[href$=".xls"] { @include link-icon("xls.png", false); }
a[href$=".rss"],
a[href$=".rdf"] { @include link-icon("feed.png", false); }
a[href^="aim:"] { @include link-icon("im.png", false); }
}

View File

@@ -0,0 +1,147 @@
// --------------------------------------------------------------
// SASS Gridification
// * Author: Geoff Garside
// A SASS adaptation of Blueprint CSS
// * Version: 0.7.1 (2008-02-25)
// * Website: http://code.google.com/p/blueprintcss/
// Based on work by:
// * Chris Eppstein [eppsteins.net]
// * Lorin Tacket [lorintackett.com]
// * Olav Bjorkoy [bjorkoy.com]
// * Nathan Borror [playgroundblues.com]
// * Jeff Croft [jeffcroft.com]
// * Christian Metts [mintchaos.com]
// * Khoi Vinh [subtraction.com]
// Liquid grid work by:
// * Ben Listwon
// * David Bedingfield
// * Andrei Michael Herasimchuk
// Involution Studios, http://www.involutionstudios.com
// Read more about using a grid here:
// * subtraction.com/archives/2007/0318_oh_yeeaahh.php
// -----
// By default, the grid is 80% of window width, with 24 columns.
//
// To make the grid fixed, simply change the .container width
// property to a pixel value. e.g., 960px.
// -----
// To use:
// This module is a REPLACEMENT for the grid module. Simply import it:
// @import blueprint
// @import blueprint/liquid
// -------------------------------------------------------------------
@import "compass/utilities/general/clearfix";
@import "compass/utilities/general/float";
// Main layout grid, override these constants to build your grid and container sizes.
// The width shown gives the right floored percentage values.
$blueprint_liquid_grid_columns: 24 !default;
$blueprint_liquid_grid_width: 3.167% !default;
$blueprint_liquid_grid_margin: 1.042% !default;
// Do not edit below this line unless you really know what you're doing.
$blueprint_liquid_container_width: 80% !default;
$blueprint_liquid_container_min_width: 950px !default;
$blueprint_liquid_grid_push_pull: -($blueprint_liquid_grid_margin + $blueprint_liquid_grid_width) !default;
@mixin blueprint-liquid-grid {
// A container should group all your columns
.container {
@include container; }
// Use these classes (or mixins) to set the width of a column.
@for $n from 1 to $blueprint_liquid_grid_columns + 1 {
.span-#{$n} {
@include span($n); }
div {
&.span-#{$n} {
@include column($n, $n == $blueprint_liquid_grid_columns); } } }
// The last column in a row needs this class (or mixin) or it will end up on the next row.
div.last {
@include last; }
// Add these to a column to append empty cols.
@for $n from 1 to $blueprint_liquid_grid_columns {
.append-#{$n} {
@include append($n); } }
// Add these to a column to prepend empty cols.
@for $n from 1 to $blueprint_liquid_grid_columns {
.prepend-#{$n} {
@include prepend($n); } }
// Use these classes on an element to push it into the
// next column, or to pull it into the previous column.
@for $n from 1 to $blueprint_liquid_grid_columns + 1 {
.pull-#{$n} {
@include pull($n); } }
@for $n from 1 to $blueprint_liquid_grid_columns + 1 {
.push-#{$n} {
@include push($n); } } }
@mixin container {
min-width: $blueprint_liquid_container_min_width;
width: $blueprint_liquid_container_width;
margin: 0 auto;
@include clearfix; }
@mixin span($n, $override: false) {
$width: $blueprint_liquid_grid_width * $n + $blueprint_liquid_grid_margin * ($n - 1);
@if $override {
width: $width !important; }
@else {
width: $width; } }
@mixin last {
margin-right: 0; }
@mixin column($n, $last: false) {
@include float-left;
overflow: hidden;
@include span($n);
@if $last {
@include last; }
@else {
margin-right: $blueprint_liquid_grid_margin; } }
@mixin append($n) {
padding-right: ($blueprint_liquid_grid_width + $blueprint_liquid_grid_margin) * $n; }
@mixin prepend($n) {
padding-left: ($blueprint_liquid_grid_width + $blueprint_liquid_grid_margin) * $n; }
@mixin pull($n, $last: false) {
margin-left: $blueprint_liquid_grid_push_pull * $n; }
@mixin push($n) {
@include float-right;
margin: {
top: 0;
left: $blueprint_liquid_grid_margin;
right: $blueprint_liquid_grid_push_pull * $n;
bottom: 0; }; }
@mixin border {
border-right: 1px solid #eeeeee; }
@mixin colborder {
padding-right: $blueprint_liquid_grid_margin * 2;
margin-right: $blueprint_liquid_grid_margin * 2;
@include border; }
@mixin colruler {
background: #dddddd;
color: #dddddd;
clear: both;
width: 100%;
height: 0.083em;
margin: 0;
margin-left: $blueprint_liquid_grid_margin * 2;
margin-right: $blueprint_liquid_grid_margin * 2;
border: none; }
@mixin colspacer {
@include colruler;
background: white;
color: white; }

View File

@@ -0,0 +1,93 @@
@import "typography";
@import "compass/utilities/general/float";
// Usage examples:
// As a top-level mixin, apply to any page that includes the stylesheet:
// <pre class="source-code sass">
// +blueprint-print
// </pre>
// Scoped by a presentational class:
// <pre class="source-code sass">
// body.blueprint
// +blueprint-print(true)
// </pre>
// Scoped by semantic selectors:
// <pre class="source-code sass">
// body#page-1, body#page-2, body.a-special-page-type
// +blueprint-print(true)
// </pre>
// Deprecated:
// You can pass the body selector as the first argument when used as a top-level mixin
// <pre class="source-code sass">
// +blueprint-print("body#page-1, body#page-2, body.a-special-page-type")
// </pre>
@mixin blueprint-print($body_selector: body) {
@if $body_selector == true {
@include blueprint-print-body;
@include blueprint-print-defaults; }
@else {
#{$body_selector} {
@include blueprint-print-body;
@if $body_selector != "body" {
@warn "[DEPRECATED] To specify a the selector \"#{$body_selector}\" to +blueprint-print, pass true as the first argument and mix it into #{$body_selector}.";
@include blueprint-print-defaults; } }
@if $body_selector == "body" {
@include blueprint-print-defaults; } } }
// This style is in blueprint, but I think it's annoying and it doesn't work in all browsers.
// Feel free to mix it into anchors where you want it.
@mixin blueprint-show-link-urls {
&:after {
content: " (" attr(href) ")";
font-size: 90%; } }
@mixin blueprint-print-body {
line-height: 1.5;
font-family: $blueprint_font_family;
color: black;
background: none;
font-size: 10pt; }
@mixin blueprint-print-defaults {
.container {
background: none; }
hr {
background: #cccccc;
color: #cccccc;
width: 100%;
height: 2px;
margin: 2em 0;
padding: 0;
border: none;
&.space {
background: white;
color: white; } }
h1, h2, h3, h4, h5, h6 {
font-family: $blueprint_font_family; }
code {
font: {
size: 0.9em;
family: $blueprint_fixed_font_family; }; }
a {
img {
border: none; }
&:link,
&:visited {
background: transparent;
font-weight: 700;
text-decoration: underline; } }
p img.top {
margin-top: 0; }
blockquote {
margin: 1.5em;
padding: 1em;
font-style: italic;
font-size: 0.9em; }
.small {
font-size: 0.9em; }
.large {
font-size: 1.1em; }
.quiet {
color: #999999; }
.hide {
display: none; } }

View File

@@ -0,0 +1,3 @@
@import "reset/utilities";
@include blueprint-global-reset;

View File

@@ -0,0 +1,133 @@
@import "grid";
@import "compass/utilities/general/float";
// Main layout grid, override these constants to build your grid and container sizes.
$blueprint_grid_columns: 24 !default;
$blueprint_grid_width: 30px !default;
$blueprint_grid_margin: 10px !default;
$blueprint_grid_outer_width: $blueprint_grid_width + $blueprint_grid_margin;
$blueprint_container_size: $blueprint_grid_outer_width * $blueprint_grid_columns - $blueprint_grid_margin;
// Columns
// Note: If you use this mixin without the class and want to support ie6
// you must set text-align left on your container element in an IE stylesheet.
@mixin container {
width: $blueprint_container_size;
margin: 0 auto;
direction: rtl;
@include clearfix; }
// The last column in a row needs this mixin or it will end up on the next row.
// TODO add this to span mixin when we have optional arguments
@mixin last {
margin-left: 0; }
@mixin column-base($last: false) {
@include float-right;
@if $last {
@include last; }
@else {
margin-left: $blueprint_grid_margin; }
text-align: right;
* html & {
overflow-x: hidden; } }
// Mixin to a column to append n empty cols.
@mixin append($n) {
padding-left: $blueprint_grid_outer_width * $n; }
// Mixin to a column to prepend n empty cols.
@mixin prepend($n) {
padding-right: $blueprint_grid_outer_width * $n; }
// mixin to a column to move it n columns to the left
@mixin pull($n, $last: false) {
position: relative;
@if $last {
margin-right: -$blueprint_grid_outer_width * $n + $blueprint_grid_margin; }
@else {
margin-right: -$blueprint_grid_outer_width * $n; } }
// mixin to a column to push it n columns to the right
@mixin push($n) {
@include float-right;
position: relative;
margin: {
top: 0;
left: -$blueprint_grid_outer_width * $n;
bottom: 1.5em;
right: $blueprint_grid_outer_width * $n; }; }
// Border on left hand side of a column.
@mixin border {
padding-left: $blueprint_grid_margin / 2 - 1;
margin-left: $blueprint_grid_margin / 2;
border-left: 1px solid #eeeeee; }
// Border with more whitespace, spans one column.
@mixin colborder {
padding-left: ($blueprint_grid_width - 2 * $blueprint_grid_margin - 1) / 2;
margin-left: ($blueprint_grid_width - 2 * $blueprint_grid_margin) / 2;
border-left: 1px solid #eeeeee; }
// Usage examples:
// As a top-level mixin, apply to any page that includes the stylesheet:
// <pre class="source-code sass">
// +rtl-typography
// </pre>
//
// Scoped by a presentational class:
// <pre class="source-code sass">
// body.blueprint
// +rtl-typography(true)
// </pre>
//
// Scoped by semantic selectors:
// <pre class="source-code sass">
// body#page-1, body#page-2, body.a-special-page-type
// +rtl-typography(true)
// </pre>
//
// **Deprecated**:
// You can pass the body selector as the first argument when used as a top-level mixin
// <pre class="source-code sass">
// +rtl-typography("body#page-1, body#page-2, body.a-special-page-type")
// </pre>
@mixin rtl-typography($body_selector: body) {
@if $body_selector == true {
html & {
font-family: Arial, sans-serif; }
@include rtl-typography-defaults; }
@else {
html #{$body_selector} {
font-family: Arial, sans-serif;
@if $body_selector != "body" {
@warn "[DEPRECATED] To specify a the selector \"#{$body_selector}\" to +rtl-typography, pass true as the first argument and mix it into #{$body_selector}.";
@include rtl-typography-defaults; } }
@if $body_selector == "body" {
body {
@include rtl-typography-defaults; } } } }
@mixin rtl-typography-defaults {
h1, h2, h3, h4, h5, h6 {
font-family: Arial, sans-serif; }
pre, code, tt {
font-family: monospace; }
p {
img.right {
@include float-left;
margin: 1.5em 1.5em 1.5em 0;
padding: 0; }
img.left {
@include float-right;
margin: 1.5em 0 1.5em 1.5em;
padding: 0; } }
dd, ul, ol {
margin-left: 0;
margin-right: 1.5em; }
td, th {
text-align: right; } }

View File

@@ -0,0 +1,54 @@
@import "grid";
@import "form";
// The styles contained here are meant to provide for an attractive experience out of the box
// and are expected to be removed once custom visual design begins.
// The +blueprint-scaffolding mixin must be mixed into the top level of your stylesheet.
// However, you can customize the body selector if you wish to control the scope
// of this mixin. Examples:
// Apply to any page including the stylesheet:
// +blueprint-scaffolding
// Scoped by a single presentational body class:
// +blueprint-scaffolding("body.blueprint")
// Semantically:
// +blueprint-scaffolding("body#page-1, body#page-2, body.a-special-page-type")
// Alternatively, you can use the +blueprint-scaffolding-body and +blueprint-scaffolding-defaults
// mixins to construct your own semantic style rules.
@mixin blueprint-scaffolding($body_selector: body) {
@if $body_selector != body {
#{$body_selector} {
@include blueprint-scaffolding-defaults;
}
} @else {
@include blueprint-scaffolding-defaults;
}
}
// The styles this mixin provides were deprecated in Blueprint 0.9 and is no longer part of the
// main scaffolding, but the mixin is still available if you want to use it.
@mixin blueprint-scaffolding-body {
margin: 1.5em 0; }
// Mixin +box to create a padded box inside a column.
@mixin box {
padding: 1.5em;
margin-bottom: 1.5em;
background: #e5ecf9; }
@mixin blueprint-scaffolding-defaults {
.box {
@include box; }
// Border on right hand side of a column. You can comment this out if you don't plan to use it.
div.border {
@include border; }
// Border with more whitespace, spans one column.
div.colborder {
@include colborder; }
hr {
@include colruler; }
hr.space {
@include colspacer; }
form.inline {
@include blueprint-inline-form; } }

View File

@@ -0,0 +1,104 @@
@import "colors";
@import "compass/utilities/links/link-colors";
@import "compass/utilities/general/float";
$blueprint-font-family: "Helvetica Neue", Arial, Helvetica, sans-serif !default;
$blueprint-fixed-font-family: "andale mono", "lucida console", monospace !default;
$blueprint-font-size: 12px !default;
// Usage examples:
// As a top-level mixin, apply to any page that includes the stylesheet:
// <pre class="source-code sass">
// +blueprint-typography
// </pre>
//
// Scoped by a presentational class:
// <pre class="source-code sass">
// body.blueprint
// +blueprint-typography(true)
// </pre>
//
// Scoped by semantic selectors:
// <pre class="source-code sass">
// body#page-1, body#page-2, body.a-special-page-type
// +blueprint-typography(true)
// </pre>
//
// **Deprecated**:
// You can pass the body selector as the first argument when used as a top-level mixin
// <pre class="source-code sass">
// +blueprint-typography("body#page-1, body#page-2, body.a-special-page-type")
// </pre>
@mixin blueprint-typography($body-selector: body) {
@if $body-selector == true {
@include blueprint-typography-body;
@include blueprint-typography-defaults;
} @else {
#{$body-selector} {
@include blueprint-typography-body;
@if $body-selector != body {
@warn "[DEPRECATED] To specify the selector \"#{$body-selector}\" to +blueprint-typography, pass true as the first argument and mix it into #{$body-selector}.";
@include blueprint-typography-defaults;
}
}
@if $body-selector == body {
@include blueprint-typography-defaults;
}
}
}
@mixin normal-text { font-family: $blueprint-font-family; color: $font-color; }
@mixin fixed-width-text { font: 1em $blueprint-fixed-font-family; line-height: 1.5; }
@mixin header-text { font-weight: normal; color: $header-color; }
@mixin quiet { color: $quiet-color; }
@mixin loud { color: $loud-color; }
@mixin blueprint-typography-body($font-size: $blueprint-font-size) {
line-height: 1.5;
@include normal-text;
font-size: 100% * $font-size / 16px;
}
@mixin blueprint-typography-defaults {
#{headers(all)} { @include header-text;
img { margin: 0; } }
h1 { font-size: 3em; line-height: 1; margin-bottom: 0.50em; }
h2 { font-size: 2em; margin-bottom: 0.75em; }
h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1.00em; }
h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.50em; }
h6 { font-size: 1em; font-weight: bold; }
p { margin: 0 0 1.5em;
img.left { @include float-left; margin: 1.5em 1.5em 1.5em 0; padding: 0; }
img.right { @include float-right; margin: 1.5em 0 1.5em 1.5em; padding: 0; }
}
a { text-decoration: underline; @include link-colors($link-color, $link-hover-color, $link-active-color, $link-visited-color, $link-focus-color); }
blockquote { margin: 1.5em; color: $alt_text_color; font-style: italic; }
strong { font-weight: bold; }
em { font-style: italic; }
dfn { font-style: italic; font-weight: bold; }
sup, sub { line-height: 0; }
abbr, acronym { border-bottom: 1px dotted #666666; }
address { margin: 0 0 1.5em; font-style: italic; }
del { color: $alt_text_color; }
pre { margin: 1.5em 0; white-space: pre; }
pre, code, tt { @include fixed-width-text; }
li ul, li ol { margin: 0; }
ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; }
ul { list-style-type: disc; }
ol { list-style-type: decimal; }
dl { margin: 0 0 1.5em 0;
dt { font-weight: bold; } }
dd { margin-left: 1.5em; }
table { margin-bottom: 1.4em; width: 100%; }
th { font-weight: bold; }
thead th { background: $blueprint-table-header-color; }
th, td, caption { padding: 4px 10px 4px 5px; }
tr.even td { background: $blueprint-table-stripe-color; }
tfoot { font-style: italic; }
caption { background: $blueprint_background_color; }
.quiet { @include quiet; }
.loud { @include loud; }
}

View File

@@ -0,0 +1,37 @@
@import "compass/utilities/text/nowrap";
@import "compass/utilities/general/clearfix";
// Most of these utility classes are not "semantic". If you use them,
// you are mixing your content and presentation. For shame!
@mixin blueprint-utilities {
// Regular clearing apply to column that should drop below previous ones.
.clear {
clear: both; }
// turn off text wrapping for the element.
.nowrap {
@include nowrap; }
// Apply to an element that has floated children to make the bottom
// of the element fall _below_ the floated children.
.clearfix {
@include clearfix; }
.small {
font-size: 0.8em;
margin-bottom: 1.875em;
line-height: 1.875em; }
.large {
font-size: 1.2em;
line-height: 2.5em;
margin-bottom: 1.25em; }
.first {
margin-left: 0;
padding-left: 0; }
.last {
margin-right: 0;
padding-right: 0; }
.top {
margin-top: 0;
padding-top: 0; }
.bottom {
margin-bottom: 0;
padding-bottom: 0; } }

View File

@@ -0,0 +1,58 @@
// Global reset rules.
// For more specific resets, use the reset mixins provided below
@mixin blueprint-global-reset {
html, body {
@include blueprint-reset; }
html {
font-size: 100.01%; }
@include blueprint-nested-reset; }
// Reset all elements within some selector scope.To reset the selector itself,
// mixin the appropriate reset mixin for that element type as well. This could be
// useful if you want to style a part of your page in a dramatically different way.
@mixin blueprint-nested-reset {
div, span, object, iframe, h1, h2, h3, h4, h5, h6, p,
pre, a, abbr, acronym, address, code, del, dfn, em, img,
dl, dt, dd, ol, ul, li, fieldset, form, label, legend, caption, tbody, tfoot, thead, tr {
@include blueprint-reset; }
blockquote, q {
@include blueprint-reset-quotation; }
th, td, caption {
@include blueprint-reset-table-cell; }
table {
@include blueprint-reset-table; }
a img {
border: none; } }
@mixin blueprint-reset-box-model {
margin: 0;
padding: 0;
border: 0; }
@mixin blueprint-reset {
@include blueprint-reset-box-model;
font: {
weight: inherit;
style: inherit;
size: 100%;
family: inherit; };
vertical-align: baseline; }
@mixin blueprint-reset-quotation {
@include blueprint-reset;
quotes: "" "";
&:before,
&:after {
content: ""; } }
@mixin blueprint-reset-table-cell {
@include blueprint-reset;
text-align: left;
font-weight: normal;
vertical-align: middle; }
@mixin blueprint-reset-table {
@include blueprint-reset;
border-collapse: separate;
border-spacing: 0;
vertical-align: middle; }

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

View File

@@ -0,0 +1,4 @@
@import blueprint
// Generate the blueprint IE-specific customizations:
+blueprint-ie

View File

@@ -0,0 +1,30 @@
description "A basic blueprint install that mimics the actual blueprint css."
stylesheet 'screen.sass', :media => 'screen, projection'
stylesheet 'partials/_base.sass'
stylesheet 'print.sass', :media => 'print'
stylesheet 'ie.sass', :media => 'screen, projection', :condition => "lt IE 8"
image 'grid.png'
help %Q{
Please see the blueprint website for documentation on how blueprint works:
http://blueprintcss.org/
Docs on the compass port of blueprint can be found on the wiki:
http://wiki.github.com/chriseppstein/compass/blueprint-documentation
}
welcome_message %Q{
Please see the blueprint website for documentation on how blueprint works:
http://blueprintcss.org/
Docs on the compass port of blueprint can be found on the wiki:
http://wiki.github.com/chriseppstein/compass/blueprint-documentation
To get started, edit the screen.sass file and read the comments and code there.
}

View File

@@ -0,0 +1,10 @@
// Here is where you can define your constants for your application and to configure the blueprint framework.
// Feel free to delete these if you want keep the defaults:
$blueprint-grid-columns : 24
$blueprint-grid-width : 30px
$blueprint-grid-margin : 10px
// If you change your grid column dimensions
// you can make a new grid background image from the command line like this:
// compass grid-img 30+10x16

View File

@@ -0,0 +1,4 @@
@import blueprint
// Generate the blueprint print styles:
+blueprint-print

View File

@@ -0,0 +1,12 @@
// This import applies a global reset to any page that imports this stylesheet.
@import blueprint/reset
// To configure blueprint, edit the partials/_base.sass file.
@import partials/base
// Import all the default blueprint modules so that we can access their mixins.
@import blueprint
// Import the non-default scaffolding module.
@import blueprint/scaffolding
// Generate the blueprint framework according to your configuration:
+blueprint
+blueprint-scaffolding

View File

@@ -0,0 +1,49 @@
@import compass/utilities/general/float
@import blueprint/buttons
//
Use the following HTML code to place the buttons on your site:
<button type="submit" class="button positive">
<img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save
</button>
<a class="button" href="/password/reset/">
<img src="css/blueprint/plugins/buttons/icons/key.png" alt=""/> Change Password
</a>
<a href="#" class="button negative">
<img src="css/blueprint/plugins/buttons/icons/cross.png" alt=""/> Cancel
</a>
a.button
// you can pass "left" or "right" to +anchor-button to float it in that direction
// or you can pass no argument to leave it inline-block (cross browser safe!) within
// the flow of your page.
+anchor-button(left)
// All the button color mixins take 4 optional arguments:
// font color, background color, border color, border highlight color
// the first three default to constants set in blueprint/buttons.sass
// the last one defaults to a shade lighter than the border color.
+button-colors
+button-hover-colors
+button-active-colors
button
// The +button-button mixin is just like the +anchor-button mixin, but for <button> elements.
+button-button(left)
+button-colors
+button-hover-colors
+button-active-colors
// We can change the colors for buttons of certain classes, etc.
a.positive, button.positive
color: #529214
+button-hover-colors(#529214, #E6EFC2, #C6D880)
+button-active-colors(#FFF, #529214, #529214)
a.negative, button.negative
color: #D12F19
+button-hover-colors(#D12F19, #FBE3E4, #FBC2C4)
+button-active-colors(#FFF, #D12F19, #D12F19)

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 B

View File

@@ -0,0 +1,17 @@
description "Button Plugin"
stylesheet 'buttons.sass', :media => 'screen, projection'
image 'buttons/cross.png'
image 'buttons/key.png'
image 'buttons/tick.png'
help %Q{
To install the button plugin:
compass init --using blueprint/buttons
The buttons.sass file is just a recommendation to show you how to use the button mixins.
}
welcome_message %Q{
The buttons.sass file is just a recommendation to show you how to use the button mixins.
}

View File

@@ -0,0 +1,13 @@
@import blueprint/link-icons
// This turns link icons on for all links. You can change the scoping selector from
// body to something more specific if you prefer.
body
+link-icons
// Use this class if a link gets an icon when it shouldn't.
a.noicon
+no-link-icon
// Not all links have a url structure that can be detected,
// So you can set them explicitly yourself like so:
a#this-is-a-pdf-link
+link-icon("pdf.png")

Binary file not shown.

After

Width:  |  Height:  |  Size: 777 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

View File

@@ -0,0 +1,23 @@
description "Icons for common types of links"
stylesheet "link_icons.sass", :media => 'screen, projection'
image 'link_icons/doc.png'
image 'link_icons/email.png'
image 'link_icons/external.png'
image 'link_icons/feed.png'
image 'link_icons/im.png'
image 'link_icons/pdf.png'
image 'link_icons/visited.png'
image 'link_icons/xls.png'
help %Q{
To install the link_icons plugin:
compass init --using blueprint/link_icons
The link_icons.sass file is just a recommendation to show you how to use the link mixins.
}
welcome_message %Q{
The link_icons.sass file is just a recommendation to show you how to use the link mixins.
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

View File

@@ -0,0 +1,16 @@
@import blueprint
// To generate css equivalent to the blueprint css but with your configuration applied, uncomment:
// @include blueprint-ie
//Recommended Blueprint configuration with scoping and semantic layout:
body.bp
+blueprint-ie(true)
// Note: Blueprint centers text to fix IE6 container centering.
// This means all your texts will be centered under all version of IE by default.
// If your container does not have the .container class, don't forget to restore
// the correct behavior to your main container (but not the body tag!)
// Example:
// .my-container
// text-align: left

View File

@@ -0,0 +1,30 @@
description "The blueprint framework."
stylesheet 'screen.sass', :media => 'screen, projection'
stylesheet 'partials/_base.sass'
stylesheet 'print.sass', :media => 'print'
stylesheet 'ie.sass', :media => 'screen, projection', :condition => "lt IE 8"
image 'grid.png'
help %Q{
Please see the blueprint website for documentation on how blueprint works:
http://blueprintcss.org/
Docs on the compass port of blueprint can be found on the wiki:
http://wiki.github.com/chriseppstein/compass/blueprint-documentation
}
welcome_message %Q{
Please see the blueprint website for documentation on how blueprint works:
http://blueprintcss.org/
Docs on the compass port of blueprint can be found on the wiki:
http://wiki.github.com/chriseppstein/compass/blueprint-documentation
To get started, edit the screen.sass file and read the comments and code there.
}

View File

@@ -0,0 +1,11 @@
// Here is where you can define your constants for your application and to configure the blueprint framework.
// Feel free to delete these if you want keep the defaults:
$blueprint-grid-columns : 24
$blueprint-container-size : 950px
$blueprint-grid-margin : 10px
// Use this to calculate the width based on the total width.
// Or you can set !blueprint_grid_width to a fixed value and unset !blueprint_container_size -- it will be calculated for you.
$blueprint-grid-width: ($blueprint-container-size + $blueprint-grid-margin) / $blueprint-grid-columns - $blueprint-grid-margin

View File

@@ -0,0 +1,8 @@
@import blueprint
// To generate css equivalent to the blueprint css but with your configuration applied, uncomment:
// @include blueprint-print
//Recommended Blueprint configuration with scoping and semantic layout:
body.bp
+blueprint-print(true)

View File

@@ -0,0 +1,45 @@
// This import applies a global reset to any page that imports this stylesheet.
@import blueprint/reset
// To configure blueprint, edit the partials/base.sass file.
@import partials/base
// Import all the default blueprint modules so that we can access their mixins.
@import blueprint
// Import the non-default scaffolding module.
@import blueprint/scaffolding
// To generate css equivalent to the blueprint css but with your
// configuration applied, uncomment:
// @include blueprint
// But Compass recommends that you scope your blueprint styles
// So that you can better control what pages use blueprint
// when stylesheets are concatenated together.
+blueprint-scaffolding("body.bp")
body.bp
+blueprint-typography(true)
+blueprint-utilities
+blueprint-debug
+blueprint-interaction
// Remove the scaffolding when you're ready to start doing visual design.
// Or leave it in if you're happy with how blueprint looks out-of-the-box
form.bp
+blueprint-form
// Page layout can be done using mixins applied to your semantic classes and IDs:
body.two-col
#container
+container
#header, #footer
+column($blueprint-grid-columns)
#sidebar
// One third of the grid columns, rounding down. With 24 cols, this is 8.
$sidebar-columns: floor($blueprint-grid-columns / 3)
+column($sidebar-columns)
#content
// Two thirds of the grid columns, rounding up.
// With 24 cols, this is 16.
$content-columns: ceil(2 * $blueprint-grid-columns / 3)
// true means it's the last column in the row
+column($content-columns, true)

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

View File

@@ -0,0 +1,16 @@
@import blueprint
// To generate css equivalent to the blueprint css but with your configuration applied, uncomment:
// +blueprint-ie
//Recommended Blueprint configuration with scoping and semantic layout:
body.bp
+blueprint-ie(true)
// Note: Blueprint centers text to fix IE6 container centering.
// This means all your texts will be centered under all version of IE by default.
// If your container does not have the .container class, don't forget to restore
// the correct behavior to your main container (but not the body tag!)
// Example:
// .my-container
// text-align: left

View File

@@ -0,0 +1,33 @@
description "The blueprint framework for use with semantic markup."
stylesheet 'screen.sass', :media => 'screen, projection'
stylesheet 'partials/_base.sass'
stylesheet 'partials/_form.sass'
stylesheet 'partials/_page.sass'
stylesheet 'partials/_two_col.sass'
stylesheet 'print.sass', :media => 'print'
stylesheet 'ie.sass', :media => 'screen, projection', :condition => "lt IE 8"
image 'grid.png'
help %Q{
Please see the blueprint website for documentation on how blueprint works:
http://blueprintcss.org/
Docs on the compass port of blueprint can be found on the wiki:
http://wiki.github.com/chriseppstein/compass/blueprint-documentation
}
welcome_message %Q{
Please see the blueprint website for documentation on how blueprint works:
http://blueprintcss.org/
Docs on the compass port of blueprint can be found on the wiki:
http://wiki.github.com/chriseppstein/compass/blueprint-documentation
To get started, edit the screen.sass file and read the comments and code there.
}

View File

@@ -0,0 +1,10 @@
// Here is where you can define your constants for your application and to configure the blueprint framework.
// Feel free to delete these if you want keep the defaults:
$blueprint-grid-columns: 24
$blueprint-container-size: 950px
$blueprint-grid-margin: 10px
// Use this to calculate the width based on the total width.
// Or you can set !blueprint_grid_width to a fixed value and unset !blueprint_container_size -- it will be calculated for you.
$blueprint-grid-width: ($blueprint-container-size + $blueprint-grid-margin) / $blueprint-grid-columns - $blueprint-grid-margin

View File

@@ -0,0 +1,6 @@
// Only apply the blueprint form styles to forms with
// a class of "bp". This makes it easier to style
// forms from scratch if you need to.
form.bp
+blueprint-form

View File

@@ -0,0 +1,18 @@
// Import the non-default scaffolding module to help us get started.
@import blueprint/scaffolding
// This configuration will only apply the
// blueprint styles to pages with a body class of "bp"
// This makes it easier to have pages without blueprint styles
// when you're using a single/combined stylesheet.
body.bp
+blueprint-typography(true)
+blueprint-utilities
+blueprint-debug
+blueprint-interaction
// Remove the scaffolding when you're ready to start doing visual design.
// Or leave it in if you're happy with how blueprint looks out-of-the-box
+blueprint-scaffolding("body.bp")

View File

@@ -0,0 +1,38 @@
// Page layout can be done using mixins applied to your semantic classes and IDs
// For instance this layout defines a two column layout on pages with
// a body class of "two-col".
//
// The markup would look like:
// <div id="container">
// <div id="header"></div>
// <div id="sidebar"></div>
// <div id="content"></div>
// <div id="footer"></div>
// </div>
//
// and the layout would look like:
// +------------------------+
// | #header |
// +--------+---------------+
// | | |
// |#sidebar| #content |
// | | |
// +------------------------+
// | #footer |
// +--------+---------------+
body.two-col
#container
+container
#header, #footer
+column($blueprint-grid-columns)
#sidebar
// One third of the grid columns, rounding down. With 24 cols, this is 8.
$sidebar-columns: floor($blueprint-grid-columns / 3)
+column($sidebar-columns)
#content
// Two thirds of the grid columns, rounding up.
// With 24 cols, this is 16.
$content-columns: ceil(2 * $blueprint-grid-columns / 3)
// true means it's the last column in the row
+column($content-columns, true)

View File

@@ -0,0 +1,5 @@
@import blueprint
//Recommended Blueprint configuration with scoping and semantic layout:
body.bp
+blueprint-print(true)

View File

@@ -0,0 +1,14 @@
// This import applies a global reset to any page that imports this stylesheet.
@import blueprint/reset
// To configure blueprint, edit the partials/base.sass file.
@import partials/base
// Import all the default blueprint modules so that we can access their mixins.
@import blueprint
// Combine the partials into a single screen stylesheet.
@import partials/page
@import partials/form
@import partials/two_col

View File

@@ -0,0 +1,2 @@
@import "compass/utilities";
@import "compass/css3";

View File

@@ -0,0 +1,15 @@
@import "css3/border-radius";
@import "css3/inline-block";
@import "css3/opacity";
@import "css3/box-shadow";
@import "css3/text-shadow";
@import "css3/columns";
@import "css3/box-sizing";
@import "css3/box";
@import "css3/gradient";
@import "css3/background-clip";
@import "css3/background-origin";
@import "css3/background-size";
@import "css3/font-face";
@import "css3/transform";
@import "css3/transition";

View File

@@ -0,0 +1 @@
@import "layout/sticky-footer";

View File

@@ -0,0 +1,3 @@
@import "reset/utilities";
@include global-reset;

View File

@@ -0,0 +1,6 @@
@import "utilities/general";
@import "utilities/links";
@import "utilities/lists";
@import "utilities/sprites";
@import "utilities/tables";
@import "utilities/text";

View File

@@ -0,0 +1,43 @@
@import "shared";
// The default value is `padding-box` -- the box model used by modern browsers.
//
// If you wish to do so, you can override the default constant with `border-box`
//
// To override to the default border-box model, use this code:
// $default-background-clip = border-box
$default-background-clip: padding-box !default;
// Clip the background (image and color) at the edge of the padding or border.
//
// Legal Values:
//
// * padding-box
// * border-box
// * text
@mixin background-clip($clip: $default-background-clip) {
// webkit and mozilla use the deprecated short [border | padding]
$clip: unquote($clip);
$deprecated: $clip;
@if $clip == padding-box { $deprecated: padding; }
@if $clip == border-box { $deprecated: border; }
// Support for webkit and mozilla's use of the deprecated short form
@include experimental(background-clip, $deprecated,
-moz,
-webkit,
not -o,
not -ms,
not -khtml,
not official
);
@include experimental(background-clip, $clip,
not -moz,
not -webkit,
-o,
-ms,
-khtml,
official
);
}

View File

@@ -0,0 +1,42 @@
// Override `$default-background-origin` to change the default.
@import "shared";
$default-background-origin: content-box !default;
// Position the background off the edge of the padding, border or content
//
// * Possible values:
// * `padding-box`
// * `border-box`
// * `content-box`
// * browser defaults to `padding-box`
// * mixin defaults to `content-box`
@mixin background-origin($origin: $default-background-origin) {
$origin: unquote($origin);
// webkit and mozilla use the deprecated short [border | padding | content]
$deprecated: $origin;
@if $origin == padding-box { $deprecated: padding; }
@if $origin == border-box { $deprecated: border; }
@if $origin == content-box { $deprecated: content; }
// Support for webkit and mozilla's use of the deprecated short form
@include experimental(background-origin, $deprecated,
-moz,
-webkit,
not -o,
not -ms,
not -khtml,
not official
);
@include experimental(background-origin, $origin,
not -moz,
not -webkit,
-o,
-ms,
-khtml,
official
);
}

View File

@@ -0,0 +1,14 @@
@import "shared";
// override to change the default
$default-background-size: 100% auto !default;
// Set the size of background images using px, width and height, or percentages.
// Currently supported in: Opera, Gecko, Webkit.
//
// * percentages are relative to the background-origin (default = padding-box)
// * mixin defaults to: `$default-background-size`
@mixin background-size($size: $default-background-size) {
$size: unquote($size);
@include experimental(background-size, $size, -moz, -webkit, -o, not -ms, not -khtml);
}

Some files were not shown because too many files have changed in this diff Show More