New look for iTop !
SVN:trunk[3601]
72
lib/sass/Phamlp.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
31
lib/sass/PhamlpException.php
Normal 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}" : '')
|
||||
);
|
||||
}
|
||||
}
|
||||
29
lib/sass/haml/HamlException.php
Normal 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);
|
||||
}
|
||||
}
|
||||
199
lib/sass/haml/HamlHelpers.php
Normal 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", '
', $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
30
lib/sass/haml/filters/HamlBaseFilter.php
Normal 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);
|
||||
}
|
||||
29
lib/sass/haml/filters/HamlCdataFilter.php
Normal 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";
|
||||
}
|
||||
}
|
||||
30
lib/sass/haml/filters/HamlCssFilter.php
Normal 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";
|
||||
}
|
||||
}
|
||||
32
lib/sass/haml/filters/HamlEscapedFilter.php
Normal 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";
|
||||
}
|
||||
}
|
||||
31
lib/sass/haml/filters/HamlJavascriptFilter.php
Normal 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";
|
||||
}
|
||||
}
|
||||
27
lib/sass/haml/filters/HamlPhpFilter.php
Normal 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";
|
||||
}
|
||||
}
|
||||
28
lib/sass/haml/filters/HamlPlainFilter.php
Normal 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";
|
||||
}
|
||||
}
|
||||
29
lib/sass/haml/filters/HamlPreserveFilter.php
Normal 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", '
',
|
||||
preg_replace(HamlParser::MATCH_INTERPOLATION, '<?php echo \1; ?>', $text)
|
||||
) . "\n";
|
||||
}
|
||||
}
|
||||
37
lib/sass/haml/filters/HamlSassFilter.php
Normal 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));
|
||||
}
|
||||
}
|
||||
37
lib/sass/haml/filters/HamlScssFilter.php
Normal 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));
|
||||
}
|
||||
}
|
||||
50
lib/sass/haml/filters/_HamlMarkdownFilter.php
Normal 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).'");?>';
|
||||
}
|
||||
}
|
||||
50
lib/sass/haml/filters/_HamlTextileFilter.php
Normal 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).'");?>';
|
||||
}
|
||||
}
|
||||
32
lib/sass/haml/messages/_i18n.php
Normal 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'=>'',
|
||||
);
|
||||
32
lib/sass/haml/messages/de.php
Normal 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',
|
||||
);
|
||||
32
lib/sass/haml/messages/fr.php
Normal 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}",
|
||||
);
|
||||
32
lib/sass/haml/renderers/HamlCompactRenderer.php
Normal 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" : ' ');
|
||||
}
|
||||
}
|
||||
48
lib/sass/haml/renderers/HamlCompressedRenderer.php
Normal 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 ? '' : ' ');
|
||||
}
|
||||
}
|
||||
58
lib/sass/haml/renderers/HamlExpandedRenderer.php
Normal 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";
|
||||
}
|
||||
}
|
||||
77
lib/sass/haml/renderers/HamlNestedRenderer.php
Normal 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']);
|
||||
}
|
||||
}
|
||||
137
lib/sass/haml/renderers/HamlRenderer.php
Normal 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;
|
||||
}
|
||||
}
|
||||
58
lib/sass/haml/tree/HamlCodeBlockNode.php
Normal 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);
|
||||
}
|
||||
}
|
||||
41
lib/sass/haml/tree/HamlCommentNode.php
Normal 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);
|
||||
}
|
||||
}
|
||||
27
lib/sass/haml/tree/HamlDoctypeNode.php
Normal 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");
|
||||
}
|
||||
}
|
||||
52
lib/sass/haml/tree/HamlElementNode.php
Normal 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));
|
||||
}
|
||||
}
|
||||
50
lib/sass/haml/tree/HamlFilterNode.php
Normal 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));
|
||||
}
|
||||
}
|
||||
73
lib/sass/haml/tree/HamlHelperNode.php
Normal 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);
|
||||
}
|
||||
}
|
||||
253
lib/sass/haml/tree/HamlNode.php
Normal 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(' ', ' ', 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";
|
||||
}
|
||||
}
|
||||
19
lib/sass/haml/tree/HamlNodeExceptions.php
Normal 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 {}
|
||||
58
lib/sass/haml/tree/HamlRootNode.php
Normal 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;
|
||||
}
|
||||
}
|
||||
29
lib/sass/sass/SassException.php
Normal 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
@@ -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));
|
||||
}
|
||||
}
|
||||
848
lib/sass/sass/SassParser.php
Normal 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;
|
||||
}
|
||||
}
|
||||
65
lib/sass/sass/extensions/compass/config.php
Normal 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'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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">“</span>asdf”
|
||||
// (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; }
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
@@ -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; } }
|
||||
@@ -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; }
|
||||
@@ -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); }
|
||||
}
|
||||
@@ -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; }
|
||||
@@ -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; } }
|
||||
@@ -0,0 +1,3 @@
|
||||
@import "reset/utilities";
|
||||
|
||||
@include blueprint-global-reset;
|
||||
@@ -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; } }
|
||||
@@ -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; } }
|
||||
@@ -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; }
|
||||
}
|
||||
@@ -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; } }
|
||||
@@ -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; }
|
||||
|
After Width: | Height: | Size: 206 B |
@@ -0,0 +1,4 @@
|
||||
@import blueprint
|
||||
|
||||
// Generate the blueprint IE-specific customizations:
|
||||
+blueprint-ie
|
||||
@@ -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.
|
||||
}
|
||||
@@ -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
|
||||
@@ -0,0 +1,4 @@
|
||||
@import blueprint
|
||||
|
||||
// Generate the blueprint print styles:
|
||||
+blueprint-print
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
After Width: | Height: | Size: 655 B |
|
After Width: | Height: | Size: 455 B |
|
After Width: | Height: | Size: 537 B |
@@ -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.
|
||||
}
|
||||
@@ -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")
|
||||
|
After Width: | Height: | Size: 777 B |
|
After Width: | Height: | Size: 641 B |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 691 B |
|
After Width: | Height: | Size: 741 B |
|
After Width: | Height: | Size: 591 B |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 663 B |
@@ -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.
|
||||
}
|
||||
|
After Width: | Height: | Size: 206 B |
@@ -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
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 206 B |
@@ -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
|
||||
|
||||
@@ -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.
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
@@ -0,0 +1,5 @@
|
||||
@import blueprint
|
||||
|
||||
//Recommended Blueprint configuration with scoping and semantic layout:
|
||||
body.bp
|
||||
+blueprint-print(true)
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
@import "compass/utilities";
|
||||
@import "compass/css3";
|
||||
@@ -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";
|
||||
@@ -0,0 +1 @@
|
||||
@import "layout/sticky-footer";
|
||||
@@ -0,0 +1,3 @@
|
||||
@import "reset/utilities";
|
||||
|
||||
@include global-reset;
|
||||
@@ -0,0 +1,6 @@
|
||||
@import "utilities/general";
|
||||
@import "utilities/links";
|
||||
@import "utilities/lists";
|
||||
@import "utilities/sprites";
|
||||
@import "utilities/tables";
|
||||
@import "utilities/text";
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||