kriss0r/php-haml

PHPHaml的分支,用于集成错误修复

dev-master 2021-08-22 13:48 UTC

This package is auto-updated.

Last update: 2024-09-22 20:33:05 UTC


README

这是PHPHaml项目的分支。我认为使用github跟踪补丁比仅仅通过电子邮件发送给上游更有效。

到目前为止,这里包含的补丁有

  • "魔法else" -- PHPHaml允许以下模板

    - if(false)
      Hi
    - else
      Bye
    

    然而,上游在"else"上崩溃,因为用于查找此情况的正则表达式与生成它的代码不匹配。

  • switch支持

    - switch($error)
      - case 'captcha'
        invalid captcha code
      - case 'empty_name'
        Please enter your name
      - case 'empty_comment'
        Please enter your message
      - default
        unrecognisable error
    

    然而,仍然不支持多个case语句

    - case 0
    - case 1
    
  • id名称中的短横线:修复了像#abc-def这样的id没有被识别为XHTML id的错误。

  • 数组作为哈希:允许将哈希传递给元素属性标签,如下所示

    - $ary = array('name' => 'myname', 'href' => "#myname")
    %a{ $ary, :rel => 'link' }
    

    行为与Ruby HAML不完全相同,因为元素本身指定的属性将全部放在末尾,但这是一个开始。

  • 管道处理:Ruby HAML将此视为特殊情况

    Some text
    |
    More text
    

    如果管道是行首的第一个字符(不计缩进),则不算作换行。由于HTML设计师倾向于将管道字符用作分隔符,因此正确处理这种情况很重要。

  • 逗号:Ruby HAML对属性元素的处理不多,这使得您可以执行以下操作

    %a{ :href=>"a,b,c", :target => "_blank" }
    

    PHPHaml必须在这里进行一些处理,以将:href转换为"href"并将所有内容放入一个array()中。为了做到这一点,它会在逗号处拆分,如果其中一个值包含逗号,这显然是问题。

    修复此问题的补丁依赖于HAML属性哈希语法与参数数组之间的相似性,并简单地运行一个正则表达式来将:symbol映射到"symbol"。然后我们不必在分割参数时使用逗号,PHP解析器会为我们做这件事。

    这可能会让您感到惊讶,因为上面提到了“将数组作为属性哈希”的功能。但这是因为PHP的一个怪异之处——数组可以同时具有数字和非数字键,语法明确允许您混合它们,如下所示

    $a = array('foo' => 'bar', 'baz');
    

    ($a['foo'] is 'bar', and $a[0] is 'baz'.) 使用此行为,我们仍然可以依赖数组字面量语法

    %a{ :href=>$key, $arguments }
    

    变为

    <a <?php $this->writeAttributes(array('href'=>$key, $value)); ?>>
    

    writeAttributes方法足够聪明,能够识别$value有一个整数键,因此递归地渲染它。

  • 重入性:之前PHPHaml有一个巨大的静态$aVariables数组,它通过在任何HamlParser对象上调用assign()来修改。如果您有多个HamlParsers,想要递归渲染HAML等,这很糟糕。将其转换为对象本地变量相当简单。此外,我们发现将$context数组传递给render()很方便,该数组用于补充到$aVariables,以填充HAML代码的作用域。

  • 类设计:PHPHaml上游有一个巨大的HamlParser类,其中包含所有HAML处理逻辑。实际上,您可以将这些至少分解成一小部分HamlLine类,它大致对应于解析树中的一个节点,具有一行HAML要编译和一些子节点,以及一个子类HamlParser并添加一些整个文件的代码。这更容易处理。

  • 空白吞噬者。HAML定义了两个元素修饰符来吞噬空白:%foo>和%foo<。PHPHaml上游不支持这两者;我们只支持元素外的吞噬者(%foo>)

  • HTML样式属性

    %input( type="text" onclick="this.value = 'cliked'; this.attributes.disabled = 'disabled';" value='Click me' )
    
  • 静默haml注释 -#

    -# I am comment
      And i am