Haml and Sass Extension

Cool. This looks good.

OK - I have got that working; thanks for the idea - definitely makes the "entry barrier" lower as you can now gradually migrate views and layouts.

There is a new release R0014 available for download.

It does mean overriding CController::resolveViewFile in the application to allow fallback to a PHP view file, but I have raised a ticket to see if this can be done in the core (will make Yii more flexible - so I hope so) so that using this extension remains a case of unzipping the file and declaring the view renderer component. I suspect the change (assuming it happens) will also help YiiML as well.

R0016 is released.

PHamlP changed to provide better support for user defined filters.

If you are using the Markdown filter you must now provide the path alias in your configuration to the directory containing the Yii specific version. The Yii specific version is included in the extension.




  'viewRenderer'=>array(

    'class'=>'ext.haml.Haml',

    'filterPathAlias'=>'ext.haml.filters'

  },



Not sure if you wanted bugs listed here or on Google Code. Anyway, I’ve a question too, so maybe this is fine for once.

First the question: Do you know of any editor that’ll syntax highlight the php haml file. The one I tried (on vim) worked for Ruby files and didn’t do much for php.

Now the bug:

The control blocks (if, for …) were causing errors in file HamlParser.php. Made some changes (given below) and it’s working fine now.


private function parseCode($line, &$lines, $parent) {

		if (preg_match('/^(if|foreach|for|switch|do|while)\b(.*)$/',

				$line[self::Haml_CONTENT], $block)) {

			if ($block[1] === 'do') {

				$node = new HamlCodeBlockNode('<?php do { ?>');

				$node->doWhile = 'while' . $block[2] . ';';

			}

This page on the Haml website has a list of supported editors. I guess PHP support is limited as Haml and Sass are - currently at least - used mainly with Ruby.

Thanks for this. Will make an update.

Release R0017 is now available. This fixes issues 3 - 7, which includes the one mentioned above.

Nope. You missed this one. Still getting the error with the updated code.

Brain must have been some where else when I did the upload :rolleyes:

OK - R0018 does fix the issue above, plus the others.

Thanks!

Couple extension requests.

a. Have // be equivalent to -#. It’s much easier to type.

b. Allow single line filters. That is, pass on the remainder of the :filtername line to the filter.

If you decide against these, I’d appreciate it if you could point me to the right place so I can make the changes locally.

Also, I got the syntax highlighting to work in emacs (on windows). The difference from the original is that my hack handles php code and allows indendation by tabs. If you are interested, let me know.

Added both the above requests.

Plus the output view file now defaults to a .php file (which of course it is :) )

The extension of the output view file is set from an additional property -

$viewFileExtension - that can be set in the configuration; the default is .php

To control were the output view file is written use the $useRuntimePath path property

defined in CViewRenderer - set it in the configuration along with other renderer

properties.

The default is true; output files are written to protected.runtime.views.nnnnnnn

If set to false output files are written to the source file directory.

R0019 is available for download.

And yes, very interested in the syntax highlighting.

Attached the files needed for syntax highlighting in Emacs. The zip file contains php-mode.el and haml-mode.el. Copy these to your emacs/lisp/progmodes directory.

Add the line


(require 'haml-mode)

to your .emacs file (This file may need to be created).

R0020 is available. This fixes a Sass issue (Issue 13)

Thanks

Thanks for this extensions, it works great so far.

I encountered a small situation i cannot solve. Is it possible to change the haml behavior depending an a variable? Example:

i want to convert this php view code to haml:




<div class="waypointarea">

<span class="waypoint 

<?php echo ($point == 1) ? 'active' : ''; ?>"> One </span>

<span class="waypoint 

<?php echo ($point == 2) ? 'active' : ''; ?>"> Two </span>

</div> <!-- waypointarea>



Now, this goes like this:




.waypointarea

  %span.waypoint

    One

  %span.waypoint

    Two



but HOW is it possible to give the span.waypoint the class active only where $point is set… i know there is a way, but how to do this with haml?

thanks

Hi thyseus,

Glad you like the extension.

The way to do what you want is with code interpolation - the #{<PHP code>} construct. Code interpolation isn’t supported (yet) in the class and id shortcuts, so you need to declare the class as an attribute. I will investigate to see if I can get interpolation working in the shortcuts. If I can I’ll put in the next release.

To take your example verbatim, here is the Haml code (I’ve put the text on the same line as it’s short, but can be on the next line and indented)




-# setup

- $point = 2

	

.waypointarea

  %span(class="waypoint #{($point == 1 ? 'active' : '')}") One

  %span(class="waypoint #{($point == 2 ? 'active' : '')}") Two



This parses to:




<?php $point = 2; ?>

<div class="waypointarea">

  <span class="waypoint <?php echo ($point == 1 ? 'active' : ''); ?>">

    One

  </span>

  <span class="waypoint <?php echo ($point == 2 ? 'active' : ''); ?>">

    Two

  </span>

</div>



and the HTML is:




<div class="waypointarea">

  <span class="waypoint ">

    One

  </span>

  <span class="waypoint active">

    Two

  </span>

</div>



Another method (depending on what you are passing to your view) is to use a loop; for example:

Haml




-# setup

- $points = array('One', 'Two', 'Three')

- $point = 2


.waypointarea

  - foreach ($points as $p => $pointText)

    %span(class="waypoint #{($point == ++$p ? 'active' : '')}")= $pointText



parsed




<?php $points = array('One', 'Two', 'Three'); ?>

<?php $point = 2; ?>

<div class="waypointarea">

  <?php foreach ($points as $p => $pointText) { ?>

    <span class="waypoint <?php echo ($point == ++$p ? 'active' : ''); ?>">

      <?php echo $pointText; ?>

    </span>

  <?php }  ?>

</div>



HTML




<div class="waypointarea">

  <span class="waypoint ">

    One

  </span>

  <span class="waypoint active">

    Two

  </span>

  <span class="waypoint ">

    Three

  </span>

</div>



And it works !! ;D

Haml




-# setup

- $point = 2

- $points = array('One', 'Two', 'Three')

	

.waypointarea

  - foreach ($points as $p => $pointText)

    %span.waypoint.#{($point == ++$p ? 'active' : '')}##{"point$p"}= $pointText



parses to




<?php $point = 2; ?>

<?php $points = array('One', 'Two', 'Three'); ?>

<div class="waypointarea">

  <?php foreach ($points as $p => $pointText) { ?>

    <span class="waypoint <?php echo ($point == ++$p ? 'active' : ''); ?>" id="<?php echo "point$p"; ?>">

      <?php echo $pointText; ?>

    </span>

  <?php }  ?>

</div>



and renders the HTML as




<div class="waypointarea">

  <span class="waypoint " id="point1">

    One

  </span>

  <span class="waypoint active" id="point2">

    Two

  </span>

  <span class="waypoint " id="point3">

    Three

  </span>

</div>



And of course




-# setup

- $point = 2

- $points = array('One', 'Two', 'Three')


.waypointarea

  - foreach ($points as $p => $pointText)

    .waypoint.#{($point == ++$p ? 'active' : '')}##{"point$p"} = $pointText



will become:




<div class="waypointarea">

  <div class="waypoint " id="point1">

    One

  </div>

  <div class="waypoint active" id="point2">

    Two

  </div>

  <div class="waypoint " id="point3">

    Three

  </div>

</div>



The update is in SVN and I’ll make another release of the extension by the end of this week.

Thanks for the inspiration.

Thanks Chris. I know I’ll need this too.

Chris, you might also want to include all this in the documentation. I would also suggest going through the Haml doc and at least rewriting the ones that mention Ruby. For example, how would {} attributes work, or attribute methods, Object Reference: []

Question: How do I create an empty textarea. I had to resort to plain HTML.


	//%textarea(rows="6" cols="80" name="body" id="body")

	<textarea class="resizable" rows="6" cols="80" name="body" id="body"></textarea>



I’d kind of hoped I could get away with the Haml and Sass documentation ;), but you’re probably right.

Ruby style attributes work:


%a{:href => 'http://example.com', :title => 'An example'} text

is the equivalent of


%a(href="http://example.com" title="Another example") text

both becoming (actual rendering dependant on the renderer being used)


<a href="http://example.com" title="Another example">text</a>

and so do Object references - though use the latest SVN version of HamlParser (there was an issue with class and id having a leading space in earlier versions)


%p[$object, prefix] Text

will become ($object instanceof MyObject, $object->id == 23)


<p class="prefix_my_object" id="prefix_my_object_23">Text</p>

For me the following works




%form

  %textarea(rows="6" cols="80" name="body" id="body")

-# Doesn't have to be in a form to work

%textarea(rows="6" cols="80" name="body" id="body1")

-# Using .class#id and attributes works fine

%textarea.class#body2(rows="6" cols="80" name="body")



producing




<form>

  <textarea rows="6" cols="80" name="body" id="body">

  </textarea>

</form>

<textarea rows="6" cols="80" name="body" id="body1">

</textarea>

<textarea rows="6" cols="80" name="body" id="body2" class="class">

</textarea>



Thanks for clarifying the docs.

The problem with the textarea I was talking about shows up in your examples too (the spaces that get included within the textarea).

I’d also tried


%form

  %textarea(rows="6" cols="80" name="body" id="body")><



but that hadn’t worked either.

I’ll check that out. The whitespace removal should work I think.