frontsau 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +21 -0
  5. data/README.md +30 -0
  6. data/Rakefile +2 -0
  7. data/bin/frontsau +15 -0
  8. data/bin/frontsau-phaml-compiler +35 -0
  9. data/example/.frontsau +12 -0
  10. data/example/assets/head.jpg +0 -0
  11. data/example/assets/script.js +4 -0
  12. data/example/assets/style.css +6 -0
  13. data/example/css/includes.sass +2 -0
  14. data/example/css/style.sass +6 -0
  15. data/example/image/head.jpg +0 -0
  16. data/example/index.html +0 -0
  17. data/example/js/script.coffee +1 -0
  18. data/frontsau.gemspec +41 -0
  19. data/lib/Phamlp/Phamlp.php +72 -0
  20. data/lib/Phamlp/PhamlpException.php +31 -0
  21. data/lib/Phamlp/haml/HamlException.php +29 -0
  22. data/lib/Phamlp/haml/HamlHelpers.php +199 -0
  23. data/lib/Phamlp/haml/HamlParser.php +1250 -0
  24. data/lib/Phamlp/haml/filters/HamlBaseFilter.php +30 -0
  25. data/lib/Phamlp/haml/filters/HamlCdataFilter.php +29 -0
  26. data/lib/Phamlp/haml/filters/HamlCssFilter.php +30 -0
  27. data/lib/Phamlp/haml/filters/HamlEscapedFilter.php +32 -0
  28. data/lib/Phamlp/haml/filters/HamlJavascriptFilter.php +31 -0
  29. data/lib/Phamlp/haml/filters/HamlPhpFilter.php +27 -0
  30. data/lib/Phamlp/haml/filters/HamlPlainFilter.php +28 -0
  31. data/lib/Phamlp/haml/filters/HamlPreserveFilter.php +29 -0
  32. data/lib/Phamlp/haml/filters/HamlSassFilter.php +37 -0
  33. data/lib/Phamlp/haml/filters/HamlScssFilter.php +37 -0
  34. data/lib/Phamlp/haml/filters/_HamlMarkdownFilter.php +50 -0
  35. data/lib/Phamlp/haml/filters/_HamlTextileFilter.php +50 -0
  36. data/lib/Phamlp/haml/messages/_i18n.php +32 -0
  37. data/lib/Phamlp/haml/messages/de.php +32 -0
  38. data/lib/Phamlp/haml/messages/fr.php +32 -0
  39. data/lib/Phamlp/haml/renderers/HamlCompactRenderer.php +32 -0
  40. data/lib/Phamlp/haml/renderers/HamlCompressedRenderer.php +48 -0
  41. data/lib/Phamlp/haml/renderers/HamlExpandedRenderer.php +58 -0
  42. data/lib/Phamlp/haml/renderers/HamlNestedRenderer.php +77 -0
  43. data/lib/Phamlp/haml/renderers/HamlRenderer.php +137 -0
  44. data/lib/Phamlp/haml/tree/HamlCodeBlockNode.php +58 -0
  45. data/lib/Phamlp/haml/tree/HamlCommentNode.php +41 -0
  46. data/lib/Phamlp/haml/tree/HamlDoctypeNode.php +27 -0
  47. data/lib/Phamlp/haml/tree/HamlElementNode.php +52 -0
  48. data/lib/Phamlp/haml/tree/HamlFilterNode.php +50 -0
  49. data/lib/Phamlp/haml/tree/HamlHelperNode.php +73 -0
  50. data/lib/Phamlp/haml/tree/HamlNode.php +253 -0
  51. data/lib/Phamlp/haml/tree/HamlNodeExceptions.php +19 -0
  52. data/lib/Phamlp/haml/tree/HamlRootNode.php +58 -0
  53. data/lib/Phamlp/sass/SassException.php +29 -0
  54. data/lib/Phamlp/sass/SassFile.php +164 -0
  55. data/lib/Phamlp/sass/SassParser.php +848 -0
  56. data/lib/Phamlp/sass/extensions/compass/config.php +65 -0
  57. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/_blueprint.scss +47 -0
  58. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_buttons.scss +101 -0
  59. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_colors.scss +32 -0
  60. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_debug.scss +11 -0
  61. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_fancy-type.scss +86 -0
  62. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_form.scss +68 -0
  63. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_grid.scss +249 -0
  64. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_ie.scss +109 -0
  65. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_interaction.scss +57 -0
  66. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_link-icons.scss +37 -0
  67. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_liquid.scss +147 -0
  68. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_print.scss +93 -0
  69. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_reset.scss +3 -0
  70. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_rtl.scss +133 -0
  71. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_scaffolding.scss +54 -0
  72. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_typography.scss +104 -0
  73. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/_utilities.scss +37 -0
  74. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/stylesheets/blueprint/reset/_utilities.scss +58 -0
  75. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/basic/grid.png +0 -0
  76. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/basic/ie.sass +4 -0
  77. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/basic/manifest.rb +30 -0
  78. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/basic/partials/_base.sass +10 -0
  79. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/basic/print.sass +4 -0
  80. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/basic/screen.sass +12 -0
  81. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/buttons/buttons/cross.png +0 -0
  82. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/buttons/buttons/key.png +0 -0
  83. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/buttons/buttons/tick.png +0 -0
  84. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/buttons/buttons.sass +49 -0
  85. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/buttons/manifest.rb +17 -0
  86. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons/doc.png +0 -0
  87. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons/email.png +0 -0
  88. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons/external.png +0 -0
  89. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons/feed.png +0 -0
  90. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons/im.png +0 -0
  91. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons/pdf.png +0 -0
  92. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons/visited.png +0 -0
  93. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons/xls.png +0 -0
  94. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/link_icons.sass +13 -0
  95. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/link_icons/manifest.rb +23 -0
  96. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/project/grid.png +0 -0
  97. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/project/ie.sass +16 -0
  98. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/project/manifest.rb +30 -0
  99. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/project/partials/_base.sass +11 -0
  100. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/project/print.sass +8 -0
  101. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/project/screen.sass +45 -0
  102. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/grid.png +0 -0
  103. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/ie.sass +16 -0
  104. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/manifest.rb +33 -0
  105. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/partials/_base.sass +10 -0
  106. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/partials/_form.sass +6 -0
  107. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/partials/_page.sass +18 -0
  108. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/partials/_two_col.sass +38 -0
  109. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/print.sass +5 -0
  110. data/lib/Phamlp/sass/extensions/compass/frameworks/blueprint/templates/semantic/screen.sass +14 -0
  111. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/_compass.scss +2 -0
  112. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/_css3.scss +15 -0
  113. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/_layout.scss +1 -0
  114. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/_reset.scss +3 -0
  115. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/_utilities.scss +6 -0
  116. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_background-clip.scss +43 -0
  117. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_background-origin.scss +42 -0
  118. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_background-size.scss +14 -0
  119. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_border-radius.scss +135 -0
  120. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_box-shadow.scss +50 -0
  121. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_box-sizing.scss +13 -0
  122. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_box.scss +112 -0
  123. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_columns.scss +55 -0
  124. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_font-face.scss +33 -0
  125. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_gradient.scss +82 -0
  126. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_inline-block.scss +12 -0
  127. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_opacity.scss +27 -0
  128. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_shared.scss +47 -0
  129. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_text-shadow.scss +25 -0
  130. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_transform.scss +85 -0
  131. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/css3/_transition.scss +85 -0
  132. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/layout/_sticky-footer.scss +23 -0
  133. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/reset/_utilities.scss +133 -0
  134. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/_general.scss +6 -0
  135. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/_links.scss +3 -0
  136. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/_lists.scss +4 -0
  137. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/_print.scss +17 -0
  138. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/_sprites.scss +1 -0
  139. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/_tables.scss +3 -0
  140. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/_text.scss +3 -0
  141. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/general/_clearfix.scss +31 -0
  142. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/general/_float.scss +15 -0
  143. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/general/_hacks.scss +35 -0
  144. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/general/_min.scss +16 -0
  145. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/general/_reset.scss +2 -0
  146. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/general/_tabs.scss +1 -0
  147. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/general/_tag-cloud.scss +18 -0
  148. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/links/_hover-link.scss +5 -0
  149. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/links/_link-colors.scss +28 -0
  150. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/links/_unstyled-link.scss +7 -0
  151. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/lists/_bullets.scss +34 -0
  152. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/lists/_horizontal-list.scss +52 -0
  153. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/lists/_inline-block-list.scss +47 -0
  154. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/lists/_inline-list.scss +29 -0
  155. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss +56 -0
  156. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss +20 -0
  157. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/tables/_borders.scss +27 -0
  158. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/tables/_scaffolding.scss +9 -0
  159. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/text/_ellipsis.scss +25 -0
  160. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/text/_nowrap.scss +2 -0
  161. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/stylesheets/compass/utilities/text/_replacement.scss +34 -0
  162. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/ellipsis/ellipsis.sass +9 -0
  163. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/ellipsis/manifest.rb +27 -0
  164. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/ellipsis/xml/ellipsis.xml +14 -0
  165. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/extension/manifest.rb +20 -0
  166. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/extension/stylesheets/main.sass +1 -0
  167. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/extension/templates/project/manifest.rb +2 -0
  168. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/extension/templates/project/screen.sass +2 -0
  169. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/project/USAGE.markdown +32 -0
  170. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/project/ie.sass +6 -0
  171. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/project/manifest.rb +4 -0
  172. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/project/print.sass +6 -0
  173. data/lib/Phamlp/sass/extensions/compass/frameworks/compass/templates/project/screen.sass +7 -0
  174. data/lib/Phamlp/sass/extensions/compass/functions/colourStops.php +268 -0
  175. data/lib/Phamlp/sass/extensions/compass/functions/constants.php +44 -0
  176. data/lib/Phamlp/sass/extensions/compass/functions/fontFiles.php +30 -0
  177. data/lib/Phamlp/sass/extensions/compass/functions/imageSize.php +39 -0
  178. data/lib/Phamlp/sass/extensions/compass/functions/inlineData.php +84 -0
  179. data/lib/Phamlp/sass/extensions/compass/functions/lists.php +47 -0
  180. data/lib/Phamlp/sass/extensions/compass/functions/selectors.php +128 -0
  181. data/lib/Phamlp/sass/extensions/compass/functions/urls.php +143 -0
  182. data/lib/Phamlp/sass/extensions/compass/stylesheets/_compass.scss +2 -0
  183. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/_css3.scss +15 -0
  184. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/_layout.scss +1 -0
  185. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/_reset.scss +3 -0
  186. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/_utilities.scss +6 -0
  187. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_background-clip.scss +43 -0
  188. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_background-origin.scss +42 -0
  189. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_background-size.scss +14 -0
  190. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_border-radius.scss +135 -0
  191. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_box-shadow.scss +50 -0
  192. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_box-sizing.scss +13 -0
  193. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_box.scss +112 -0
  194. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_columns.scss +55 -0
  195. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_font-face.scss +33 -0
  196. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_gradient.scss +96 -0
  197. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_inline-block.scss +12 -0
  198. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_opacity.scss +27 -0
  199. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_shared.scss +47 -0
  200. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_text-shadow.scss +25 -0
  201. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_transform.scss +85 -0
  202. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/css3/_transition.scss +85 -0
  203. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/layout/_sticky-footer.scss +23 -0
  204. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/reset/_utilities.scss +133 -0
  205. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/_general.scss +6 -0
  206. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/_links.scss +3 -0
  207. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/_lists.scss +4 -0
  208. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/_print.scss +17 -0
  209. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/_sprites.scss +1 -0
  210. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/_tables.scss +3 -0
  211. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/_text.scss +3 -0
  212. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/general/_clearfix.scss +31 -0
  213. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/general/_float.scss +15 -0
  214. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/general/_hacks.scss +35 -0
  215. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/general/_min.scss +16 -0
  216. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/general/_reset.scss +2 -0
  217. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/general/_tabs.scss +1 -0
  218. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/general/_tag-cloud.scss +18 -0
  219. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/links/_hover-link.scss +5 -0
  220. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/links/_link-colors.scss +28 -0
  221. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/links/_unstyled-link.scss +7 -0
  222. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/lists/_bullets.scss +34 -0
  223. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/lists/_horizontal-list.scss +52 -0
  224. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/lists/_inline-block-list.scss +47 -0
  225. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/lists/_inline-list.scss +29 -0
  226. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/sprites/_sprite-img.scss +56 -0
  227. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/tables/_alternating-rows-and-columns.scss +20 -0
  228. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/tables/_borders.scss +27 -0
  229. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/tables/_scaffolding.scss +9 -0
  230. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/text/_ellipsis.scss +25 -0
  231. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/text/_nowrap.scss +2 -0
  232. data/lib/Phamlp/sass/extensions/compass/stylesheets/compass/utilities/text/_replacement.scss +34 -0
  233. data/lib/Phamlp/sass/messages/_i18n.php +122 -0
  234. data/lib/Phamlp/sass/messages/de.php +70 -0
  235. data/lib/Phamlp/sass/messages/fr.php +70 -0
  236. data/lib/Phamlp/sass/renderers/SassCompactRenderer.php +130 -0
  237. data/lib/Phamlp/sass/renderers/SassCompressedRenderer.php +102 -0
  238. data/lib/Phamlp/sass/renderers/SassExpandedRenderer.php +62 -0
  239. data/lib/Phamlp/sass/renderers/SassNestedRenderer.php +61 -0
  240. data/lib/Phamlp/sass/renderers/SassRenderer.php +51 -0
  241. data/lib/Phamlp/sass/script/SassScriptFunction.php +169 -0
  242. data/lib/Phamlp/sass/script/SassScriptFunctions.php +751 -0
  243. data/lib/Phamlp/sass/script/SassScriptLexer.php +114 -0
  244. data/lib/Phamlp/sass/script/SassScriptOperation.php +151 -0
  245. data/lib/Phamlp/sass/script/SassScriptParser.php +192 -0
  246. data/lib/Phamlp/sass/script/SassScriptParserExceptions.php +40 -0
  247. data/lib/Phamlp/sass/script/SassScriptVariable.php +57 -0
  248. data/lib/Phamlp/sass/script/literals/SassBoolean.php +67 -0
  249. data/lib/Phamlp/sass/script/literals/SassColour.php +886 -0
  250. data/lib/Phamlp/sass/script/literals/SassLiteral.php +359 -0
  251. data/lib/Phamlp/sass/script/literals/SassLiteralExceptions.php +47 -0
  252. data/lib/Phamlp/sass/script/literals/SassNumber.php +503 -0
  253. data/lib/Phamlp/sass/script/literals/SassString.php +106 -0
  254. data/lib/Phamlp/sass/tree/SassCommentNode.php +64 -0
  255. data/lib/Phamlp/sass/tree/SassContext.php +120 -0
  256. data/lib/Phamlp/sass/tree/SassDebugNode.php +84 -0
  257. data/lib/Phamlp/sass/tree/SassDirectiveNode.php +76 -0
  258. data/lib/Phamlp/sass/tree/SassElseNode.php +28 -0
  259. data/lib/Phamlp/sass/tree/SassExtendNode.php +47 -0
  260. data/lib/Phamlp/sass/tree/SassForNode.php +99 -0
  261. data/lib/Phamlp/sass/tree/SassIfNode.php +95 -0
  262. data/lib/Phamlp/sass/tree/SassImportNode.php +69 -0
  263. data/lib/Phamlp/sass/tree/SassMixinDefinitionNode.php +88 -0
  264. data/lib/Phamlp/sass/tree/SassMixinNode.php +91 -0
  265. data/lib/Phamlp/sass/tree/SassNode.php +342 -0
  266. data/lib/Phamlp/sass/tree/SassNodeExceptions.php +117 -0
  267. data/lib/Phamlp/sass/tree/SassPropertyNode.php +239 -0
  268. data/lib/Phamlp/sass/tree/SassRootNode.php +100 -0
  269. data/lib/Phamlp/sass/tree/SassRuleNode.php +337 -0
  270. data/lib/Phamlp/sass/tree/SassVariableNode.php +90 -0
  271. data/lib/Phamlp/sass/tree/SassWhileNode.php +64 -0
  272. data/lib/frontsau/assets/rack.rb +12 -0
  273. data/lib/frontsau/assets/sprockets.rb +59 -0
  274. data/lib/frontsau/assets/static_assets_compiler.rb +50 -0
  275. data/lib/frontsau/assets/url_rewriter.rb +22 -0
  276. data/lib/frontsau/assets/watcher.rb +60 -0
  277. data/lib/frontsau/thor_app.rb +118 -0
  278. data/lib/frontsau/version.rb +3 -0
  279. data/lib/frontsau.rb +64 -0
  280. metadata +578 -0
@@ -0,0 +1,239 @@
1
+ <?php
2
+ /* SVN FILE: $Id: SassPropertyNode.php 118 2010-09-21 09:45:11Z chris.l.yates@gmail.com $ */
3
+ /**
4
+ * SassPropertyNode class file.
5
+ * @author Chris Yates <chris.l.yates@gmail.com>
6
+ * @copyright Copyright (c) 2010 PBM Web Development
7
+ * @license http://phamlp.googlecode.com/files/license.txt
8
+ * @package PHamlP
9
+ * @subpackage Sass.tree
10
+ */
11
+
12
+ /**
13
+ * SassPropertyNode class.
14
+ * Represents a CSS property.
15
+ * @package PHamlP
16
+ * @subpackage Sass.tree
17
+ */
18
+ class SassPropertyNode extends SassNode {
19
+ const MATCH_PROPERTY_NEW = '/^([^\s=:"]+)\s*(?:(= )|:)(.*?)$/';
20
+ const MATCH_PROPERTY_OLD = '/^:([^\s=:]+)(?:\s*(=)\s*|\s+|$)(.*)/';
21
+ const MATCH_PSUEDO_SELECTOR = '/^:?\w[-\w]+\(?/i';
22
+ const MATCH_INTERPOLATION = '/^#\{(.*?)\}/i';
23
+ const NAME = 1;
24
+ const SCRIPT = 2;
25
+ const VALUE = 3;
26
+ const IS_SCRIPT = '= ';
27
+
28
+ private static $psuedoSelectors = array(
29
+ 'root',
30
+ 'nth-child(',
31
+ 'nth-last-child(',
32
+ 'nth-of-type(',
33
+ 'nth-last-of-type(',
34
+ 'first-child',
35
+ 'last-child',
36
+ 'first-of-type',
37
+ 'last-of-type',
38
+ 'only-child',
39
+ 'only-of-type',
40
+ 'empty',
41
+ 'link',
42
+ 'visited',
43
+ 'active',
44
+ 'hover',
45
+ 'focus',
46
+ 'target',
47
+ 'lang(',
48
+ 'enabled',
49
+ 'disabled',
50
+ 'checked',
51
+ ':first-line',
52
+ ':first-letter',
53
+ ':before',
54
+ ':after',
55
+ // CSS 2.1
56
+ 'first-line',
57
+ 'first-letter',
58
+ 'before',
59
+ 'after'
60
+ );
61
+
62
+ /**
63
+ * @var string property name
64
+ */
65
+ private $name;
66
+ /**
67
+ * @var string property value or expression to evaluate
68
+ */
69
+ private $value;
70
+
71
+ /**
72
+ * SassPropertyNode constructor.
73
+ * @param object source token
74
+ * @param string property syntax
75
+ * @return SassPropertyNode
76
+ */
77
+ public function __construct($token, $syntax = 'new') {
78
+ parent::__construct($token);
79
+ $matches = self::match($token, $syntax);
80
+ $this->name = $matches[self::NAME];
81
+ $this->value = $matches[self::VALUE];
82
+ if ($matches[self::SCRIPT] === self::IS_SCRIPT) {
83
+ $this->addWarning('Setting CSS properties with "=" is deprecated; use "{name}: {value};"',
84
+ array('{name}'=>$this->name, '{value}'=>$this->value)
85
+ );
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Parse this node.
91
+ * If the node is a property namespace return all parsed child nodes. If not
92
+ * return the parsed version of this node.
93
+ * @param SassContext the context in which this node is parsed
94
+ * @return array the parsed node
95
+ */
96
+ public function parse($context) {
97
+ $return = array();
98
+ if ($this->value) {
99
+ $node = clone $this;
100
+ $node->name = ($this->inNamespace() ? "{$this->namespace}-" : '') .
101
+ $this->interpolate($this->name, $context);
102
+ $node->value = $this->evaluate($this->interpolate($this->value, $context), $context, SassScriptParser::CSS_PROPERTY)->toString();
103
+ if (array_key_exists($node->name, $this->vendor_properties)) {
104
+ foreach ($this->vendor_properties[$node->name] as $vendorProperty) {
105
+ $_node = clone $node;
106
+ $_node->name = $vendorProperty;
107
+ $return[] = $_node;
108
+ }
109
+ }
110
+ $return[] = $node;
111
+ }
112
+ if ($this->children) {
113
+ $return = array_merge($return, $this->parseChildren($context));
114
+ }
115
+ return $return;
116
+ }
117
+
118
+ /**
119
+ * Render this node.
120
+ * @return string the rendered node
121
+ */
122
+ public function render() {
123
+ return $this->renderer->renderProperty($this);
124
+ }
125
+
126
+ /**
127
+ * Returns a value indicating if this node is in a namespace
128
+ * @return boolean true if this node is in a property namespace, false if not
129
+ */
130
+ public function inNamespace() {
131
+ $parent = $this->parent;
132
+ do {
133
+ if ($parent instanceof SassPropertyNode) {
134
+ return true;
135
+ }
136
+ $parent = $parent->parent;
137
+ } while (is_object($parent));
138
+ return false;
139
+ }
140
+
141
+ /**
142
+ * Returns the namespace for this node
143
+ * @return string the namespace for this node
144
+ */
145
+ protected function getNamespace() {
146
+ $namespace = array();
147
+ $parent = $this->parent;
148
+ do {
149
+ if ($parent instanceof SassPropertyNode) {
150
+ $namespace[] = $parent->name;
151
+ }
152
+ $parent = $parent->parent;
153
+ } while (is_object($parent));
154
+ return join('-', array_reverse($namespace));
155
+ }
156
+
157
+ /**
158
+ * Returns the name of this property.
159
+ * If the property is in a namespace the namespace is prepended
160
+ * @return string the name of this property
161
+ */
162
+ public function getName() {
163
+ return $this->name;
164
+ }
165
+
166
+ /**
167
+ * Returns the parsed value of this property.
168
+ * @return string the parsed value of this property
169
+ */
170
+ public function getValue() {
171
+ return $this->value;
172
+ }
173
+
174
+ /**
175
+ * Returns a value indicating if the token represents this type of node.
176
+ * @param object token
177
+ * @param string the property syntax being used
178
+ * @return boolean true if the token represents this type of node, false if not
179
+ */
180
+ public static function isa($token, $syntax) {
181
+ $matches = self::match($token, $syntax);
182
+
183
+ if (!empty($matches)) {
184
+ if (isset($matches[self::VALUE]) &&
185
+ self::isPseudoSelector($matches[self::VALUE])) {
186
+ return false;
187
+ }
188
+ if ($token->level === 0) {
189
+ throw new SassPropertyNodeException('Properties can not be assigned at root level', array(), $this);
190
+ }
191
+ else {
192
+ return true;
193
+ }
194
+ }
195
+ else {
196
+ return false;
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Returns the matches for this type of node.
202
+ * @param array the line to match
203
+ * @param string the property syntax being used
204
+ * @return array matches
205
+ */
206
+ public static function match($token, $syntax) {
207
+ switch ($syntax) {
208
+ case 'new':
209
+ preg_match(self::MATCH_PROPERTY_NEW, $token->source, $matches);
210
+ break;
211
+ case 'old':
212
+ preg_match(self::MATCH_PROPERTY_OLD, $token->source, $matches);
213
+ break;
214
+ default:
215
+ if (preg_match(self::MATCH_PROPERTY_NEW, $token->source, $matches) == 0) {
216
+ preg_match(self::MATCH_PROPERTY_OLD, $token->source, $matches);
217
+ }
218
+ break;
219
+ }
220
+ return $matches;
221
+ }
222
+
223
+ /**
224
+ * Returns a value indicating if the string starts with a pseudo selector.
225
+ * This is used to reject pseudo selectors as property values as, for example,
226
+ * "a:hover" and "text-decoration:underline" look the same to the property
227
+ * match regex.
228
+ * It will also match interpolation to allow for constructs such as
229
+ * content:#{$pos}
230
+ * @see isa()
231
+ * @param string the string to test
232
+ * @return bool true if the string starts with a pseudo selector, false if not
233
+ */
234
+ private static function isPseudoSelector($string) {
235
+ preg_match(self::MATCH_PSUEDO_SELECTOR, $string, $matches);
236
+ return (isset($matches[0]) && in_array($matches[0], self::$psuedoSelectors)) ||
237
+ preg_match(self::MATCH_INTERPOLATION, $string);
238
+ }
239
+ }
@@ -0,0 +1,100 @@
1
+ <?php
2
+ /* SVN FILE: $Id: SassRootNode.php 49 2010-04-04 10:51:24Z chris.l.yates $ */
3
+ /**
4
+ * SassRootNode class file.
5
+ * @author Chris Yates <chris.l.yates@gmail.com>
6
+ * @copyright Copyright (c) 2010 PBM Web Development
7
+ * @license http://phamlp.googlecode.com/files/license.txt
8
+ * @package PHamlP
9
+ * @subpackage Sass.tree
10
+ */
11
+
12
+ require_once(dirname(__FILE__).'/../script/SassScriptParser.php');
13
+ require_once(dirname(__FILE__).'/../renderers/SassRenderer.php');
14
+
15
+ /**
16
+ * SassRootNode class.
17
+ * Also the root node of a document.
18
+ * @package PHamlP
19
+ * @subpackage Sass.tree
20
+ */
21
+ class SassRootNode extends SassNode {
22
+ /**
23
+ * @var SassScriptParser SassScript parser
24
+ */
25
+ protected $script;
26
+ /**
27
+ * @var SassRenderer the renderer for this node
28
+ */
29
+ protected $renderer;
30
+ /**
31
+ * @var SassParser
32
+ */
33
+ protected $parser;
34
+ /**
35
+ * @var array extenders for this tree in the form extendee=>extender
36
+ */
37
+ protected $extenders = array();
38
+
39
+ /**
40
+ * Root SassNode constructor.
41
+ * @param SassParser Sass parser
42
+ * @return SassNode
43
+ */
44
+ public function __construct($parser) {
45
+ parent::__construct((object) array(
46
+ 'source' => '',
47
+ 'level' => -1,
48
+ 'filename' => $parser->filename,
49
+ 'line' => 0,
50
+ ));
51
+ $this->parser = $parser;
52
+ $this->script = new SassScriptParser();
53
+ $this->renderer = SassRenderer::getRenderer($parser->style);
54
+ $this->root = $this;
55
+ }
56
+
57
+ /**
58
+ * Parses this node and its children into the render tree.
59
+ * Dynamic nodes are evaluated, files imported, etc.
60
+ * Only static nodes for rendering are in the resulting tree.
61
+ * @param SassContext the context in which this node is parsed
62
+ * @return SassNode root node of the render tree
63
+ */
64
+ public function parse($context) {
65
+ $node = clone $this;
66
+ $node->children = $this->parseChildren($context);
67
+ return $node;
68
+ }
69
+
70
+ /**
71
+ * Render this node.
72
+ * @return string the rendered node
73
+ */
74
+ public function render() {
75
+ $node = $this->parse(new SassContext());
76
+ $output = '';
77
+ foreach ($node->children as $child) {
78
+ $output .= $child->render();
79
+ } // foreach
80
+ return $output;
81
+ }
82
+
83
+ public function extend($extendee, $selectors) {
84
+ $this->extenders[$extendee] = (isset($this->extenders[$extendee])
85
+ ? array_merge($this->extenders[$extendee], $selectors) : $selectors);
86
+ }
87
+
88
+ public function getExtenders() {
89
+ return $this->extenders;
90
+ }
91
+
92
+ /**
93
+ * Returns a value indicating if the line represents this type of node.
94
+ * Child classes must override this method.
95
+ * @throws SassNodeException if not overriden
96
+ */
97
+ public static function isa($line) {
98
+ throw new SassNodeException('Child classes must override this method');
99
+ }
100
+ }
@@ -0,0 +1,337 @@
1
+ <?php
2
+ /* SVN FILE: $Id: SassRuleNode.php 118 2010-09-21 09:45:11Z chris.l.yates@gmail.com $ */
3
+ /**
4
+ * SassRuleNode class file.
5
+ * @author Chris Yates <chris.l.yates@gmail.com>
6
+ * @copyright Copyright (c) 2010 PBM Web Development
7
+ * @license http://phamlp.googlecode.com/files/license.txt
8
+ * @package PHamlP
9
+ * @subpackage Sass.tree
10
+ */
11
+
12
+ /**
13
+ * SassRuleNode class.
14
+ * Represents a CSS rule.
15
+ * @package PHamlP
16
+ * @subpackage Sass.tree
17
+ */
18
+ class SassRuleNode extends SassNode {
19
+ const MATCH = '/^(.+?)(?:\s*\{)?$/';
20
+ const SELECTOR = 1;
21
+ const CONTINUED = ',';
22
+
23
+ /**
24
+ * @const string that is replaced with the parent node selector
25
+ */
26
+ const PARENT_REFERENCE = '&';
27
+
28
+ /**
29
+ * @var array selector(s)
30
+ */
31
+ private $selectors = array();
32
+
33
+ /**
34
+ * @var array parent selectors
35
+ */
36
+ private $parentSelectors = array();
37
+
38
+ /**
39
+ * @var array resolved selectors
40
+ */
41
+ private $resolvedSelectors = array();
42
+
43
+ /**
44
+ * @var boolean whether the node expects more selectors
45
+ */
46
+ private $isContinued;
47
+
48
+ /**
49
+ * SassRuleNode constructor.
50
+ * @param object source token
51
+ * @param string rule selector
52
+ * @return SassRuleNode
53
+ */
54
+ public function __construct($token) {
55
+ parent::__construct($token);
56
+ preg_match(self::MATCH, $token->source, $matches);
57
+ $this->addSelectors($matches[SassRuleNode::SELECTOR]);
58
+ }
59
+
60
+ /**
61
+ * Adds selector(s) to the rule.
62
+ * If the selectors are to continue for the rule the selector must end in a comma
63
+ * @param string selector
64
+ */
65
+ public function addSelectors($selectors) {
66
+ $this->isContinued = substr($selectors, -1) === self::CONTINUED;
67
+ $this->selectors = array_merge($this->selectors, $this->explode($selectors));
68
+ }
69
+
70
+ /**
71
+ * Returns a value indicating if the selectors for this rule are to be continued.
72
+ * @param boolean true if the selectors for this rule are to be continued,
73
+ * false if not
74
+ */
75
+ public function getIsContinued() {
76
+ return $this->isContinued;
77
+ }
78
+
79
+ /**
80
+ * Parse this node and its children into static nodes.
81
+ * @param SassContext the context in which this node is parsed
82
+ * @return array the parsed node and its children
83
+ */
84
+ public function parse($context) {
85
+ $node = clone $this;
86
+ $node->selectors = $this->resolveSelectors($context);
87
+ $node->children = $this->parseChildren($context);
88
+ return array($node);
89
+ }
90
+
91
+ /**
92
+ * Render this node and its children to CSS.
93
+ * @return string the rendered node
94
+ */
95
+ public function render() {
96
+ $this->extend();
97
+ $rules = '';
98
+ $properties = array();
99
+
100
+ foreach ($this->children as $child) {
101
+ $child->parent = $this;
102
+ if ($child instanceof SassRuleNode) {
103
+ $rules .= $child->render();
104
+ }
105
+ else {
106
+ $properties[] = $child->render();
107
+ }
108
+ } // foreach
109
+
110
+ return $this->renderer->renderRule($this, $properties, $rules);
111
+ }
112
+
113
+ /**
114
+ * Extend this nodes selectors
115
+ * $extendee is the subject of the @extend directive
116
+ * $extender is the selector that contains the @extend directive
117
+ * $selector a selector or selector sequence that is to be extended
118
+ */
119
+ public function extend() {
120
+ foreach ($this->root->extenders as $extendee=>$extenders) {
121
+ if ($this->isPsuedo($extendee)) {
122
+ $extendee = explode(':', $extendee);
123
+ $pattern = preg_quote($extendee[0]).'((\.[-\w]+)*):'.preg_quote($extendee[1]);
124
+ }
125
+ else {
126
+ $pattern = preg_quote($extendee);
127
+ }
128
+ foreach (preg_grep('/'.$pattern.'$/', $this->selectors) as $selector) {
129
+ foreach ($extenders as $extender) {
130
+ if (is_array($extendee)) {
131
+ $this->selectors[] = preg_replace('/(.*?)'.$pattern.'$/', "\\1$extender\\2", $selector);
132
+ }
133
+ elseif ($this->isSequence($extender) || $this->isSequence($selector)) {
134
+ $this->selectors = array_merge($this->selectors, $this->mergeSequence($extender, $selector));
135
+ }
136
+ else {
137
+ $this->selectors[] = str_replace($extendee, $extender, $selector);
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Tests whether the selector is a psuedo selector
146
+ * @param string selector to test
147
+ * @return boolean true if the selector is a psuedo selector, false if not
148
+ */
149
+ private function isPsuedo($selector) {
150
+ return strpos($selector, ':') !== false;
151
+ }
152
+
153
+ /**
154
+ * Tests whether the selector is a sequence selector
155
+ * @param string selector to test
156
+ * @return boolean true if the selector is a sequence selector, false if not
157
+ */
158
+ private function isSequence($selector) {
159
+ return strpos($selector, ' ') !== false;
160
+ }
161
+
162
+ /**
163
+ * Merges selector sequences
164
+ * @param string the extender selector
165
+ * @param string selector to extend
166
+ * @return array the merged sequences
167
+ */
168
+ private function mergeSequence($extender, $selector) {
169
+ $extender = explode(' ', $extender);
170
+ $end = ' '.array_pop($extender);
171
+ $selector = explode(' ', $selector);
172
+ array_pop($selector);
173
+
174
+ $common = array();
175
+ while($extender[0] === $selector[0]) {
176
+ $common[] = array_shift($selector);
177
+ array_shift($extender);
178
+ }
179
+
180
+ $begining = (!empty($common) ? join(' ', $common) . ' ' : '');
181
+
182
+ return array(
183
+ $begining.join(' ', $selector).' '.join(' ', $extender).$end,
184
+ $begining.join(' ', $extender).' '.join(' ', $selector).$end
185
+ );
186
+ }
187
+
188
+ /**
189
+ * Returns the selectors
190
+ * @return array selectors
191
+ */
192
+ public function getSelectors() {
193
+ return $this->selectors;
194
+ }
195
+
196
+ /**
197
+ * Resolves selectors.
198
+ * Interpolates SassScript in selectors and resolves any parent references or
199
+ * appends the parent selectors.
200
+ * @param SassContext the context in which this node is parsed
201
+ */
202
+ public function resolveSelectors($context) {
203
+ $resolvedSelectors = array();
204
+ $this->parentSelectors = $this->getParentSelectors($context);
205
+
206
+ foreach ($this->selectors as $key=>$selector) {
207
+ $selector = $this->interpolate($selector, $context);
208
+ //$selector = $this->evaluate($this->interpolate($selector, $context), $context)->toString();
209
+ if ($this->hasParentReference($selector)) {
210
+ $resolvedSelectors = array_merge($resolvedSelectors, $this->resolveParentReferences($selector, $context));
211
+ }
212
+ elseif ($this->parentSelectors) {
213
+ foreach ($this->parentSelectors as $parentSelector) {
214
+ $resolvedSelectors[] = "$parentSelector $selector";
215
+ } // foreach
216
+ }
217
+ else {
218
+ $resolvedSelectors[] = $selector;
219
+ }
220
+ } // foreach
221
+ sort($resolvedSelectors);
222
+ return $resolvedSelectors;
223
+ }
224
+
225
+ /**
226
+ * Returns the parent selector(s) for this node.
227
+ * This in an empty array if there is no parent selector.
228
+ * @return array the parent selector for this node
229
+ */
230
+ protected function getParentSelectors($context) {
231
+ $ancestor = $this->parent;
232
+ while (!$ancestor instanceof SassRuleNode && $ancestor->hasParent()) {
233
+ $ancestor = $ancestor->parent;
234
+ }
235
+
236
+ if ($ancestor instanceof SassRuleNode) {
237
+ return $ancestor->resolveSelectors($context);
238
+ }
239
+ return array();
240
+ }
241
+
242
+ /**
243
+ * Returns the position of the first parent reference in the selector.
244
+ * If there is no parent reference in the selector this function returns
245
+ * boolean FALSE.
246
+ * Note that the return value may be non-Boolean that evaluates to FALSE,
247
+ * i.e. 0. The return value should be tested using the === operator.
248
+ * @param string selector to test
249
+ * @return mixed integer: position of the the first parent reference,
250
+ * boolean: false if there is no parent reference.
251
+ */
252
+ private function parentReferencePos($selector) {
253
+ $inString = '';
254
+ for ($i = 0, $l = strlen($selector); $i < $l; $i++) {
255
+ $c = $selector[$i];
256
+ if ($c === self::PARENT_REFERENCE && empty($inString)) {
257
+ return $i;
258
+ }
259
+ elseif (empty($inString) && ($c === '"' || $c === "'")) {
260
+ $inString = $c;
261
+ }
262
+ elseif ($c === $inString) {
263
+ $inString = '';
264
+ }
265
+ }
266
+ return false;
267
+ }
268
+
269
+ /**
270
+ * Determines if there is a parent reference in the selector
271
+ * @param string selector
272
+ * @return boolean true if there is a parent reference in the selector
273
+ */
274
+ private function hasParentReference($selector) {
275
+ return $this->parentReferencePos($selector) !== false;
276
+ }
277
+
278
+ /**
279
+ * Resolves parent references in the selector
280
+ * @param string selector
281
+ * @return string selector with parent references resolved
282
+ */
283
+ private function resolveParentReferences($selector, $context) {
284
+ $resolvedReferences = array();
285
+ if (!count($this->parentSelectors)) {
286
+ throw new SassRuleNodeException('Can not use parent selector (' .
287
+ self::PARENT_REFERENCE . ') when no parent selectors', array(), $this);
288
+ }
289
+ foreach ($this->getParentSelectors($context) as $parentSelector) {
290
+ $resolvedReferences[] = str_replace(self::PARENT_REFERENCE, $parentSelector, $selector);
291
+ }
292
+ return $resolvedReferences;
293
+ }
294
+
295
+ /**
296
+ * Explodes a string of selectors into an array.
297
+ * We can't use PHP::explode as this will potentially explode attribute
298
+ * matches in the selector, e.g. div[title="some,value"] and interpolations.
299
+ * @param string selectors
300
+ * @return array selectors
301
+ */
302
+ private function explode($string) {
303
+ $selectors = array();
304
+ $inString = false;
305
+ $interpolate = false;
306
+ $selector = '';
307
+
308
+ for ($i = 0, $l = strlen($string); $i < $l; $i++) {
309
+ $c = $string[$i];
310
+ if ($c === self::CONTINUED && !$inString && !$interpolate) {
311
+ $selectors[] = trim($selector);
312
+ $selector = '';
313
+ }
314
+ else {
315
+ $selector .= $c;
316
+ if ($c === '"' || $c === "'") {
317
+ do {
318
+ $_c = $string[++$i];
319
+ $selector .= $_c;
320
+ } while ($_c !== $c);
321
+ }
322
+ elseif ($c === '#' && $string[$i+1] === '{') {
323
+ do {
324
+ $c = $string[++$i];
325
+ $selector .= $c;
326
+ } while ($c !== '}');
327
+ }
328
+ }
329
+ }
330
+
331
+ if (!empty($selector)) {
332
+ $selectors[] = trim($selector);
333
+ }
334
+
335
+ return $selectors;
336
+ }
337
+ }