Jade:模仿简单的 PHP 函数

Jade: mimick simple PHP function

我目前正在尝试将 PHP 文件转换为 Jade 文件以减少服务器负载*,但是 运行 在转换主 PHP 函数时遇到了一些问题 -该页面首先不是 HTML 文件的原因 - 进入 Jade。

该函数简化了 "items" 的列表,并接受多个参数以填充 HTML 代码的不同部分。

<?php
 function item( $name, $category, $url, $color, $partner=NULL ) {
    # convert åäö -> aao (lower- and uppercase)
    $filename = preg_replace(array('/å/','/ä/','/ö/','/Å/','/Ä/','/Ö/', '/\s+/'), array('a','a','o','A','A','O', '-'), $name);
    $filename = strtolower($filename);
  ?>
  <div class="projekt__item item-<?php echo $filename ?>" style="background-color: <?php echo $color; ?>">
    <div class="item__logo item__logo--<?php echo $filename ?>"></div>

    <div class="item__figcaption">
      <span class="item__figtext">
        <?php echo $category; ?><br>
        <?php if ($partner) : ?>
          <br>
          <span class="item__figtext--sub">
            <strong>Partner: </strong> <?php echo $partner; ?>
          </span>
        <?php endif; ?>
      </span>
    </div>

    <a href="<?php echo $url ?>" rel="nofollow" target="_blank"></a>
  </div> <!-- /item -->
<?php } ?>

我发现 PHP 代码的不同组成部分很难在 Jade 中复制。它们是:

我已经设置了一个 pen 包含我到目前为止的进展(这不是很多 - 它只是抛出一些对我没有帮助的错误)

如果有人能帮助我,我将不胜感激。

*我知道还有其他方法可以减少服务器负载,而缓存应该可以使这种方法变得多余。不过,这也是学玉备后之事,我很想解决这个问题,而不是抛之脑后:)

更新: 感谢@laggingreflex,问题已经解决。最终解决方案如下:

mixin item(name, category, url, color, partner)
  - var filename = name.replace(/å/g,'a').replace(/ä/g,'a').replace(/ö/g,'o').replace(/Å/g,'A').replace(/Ä/g,'A').replace(/Ö/g,'O').replace(/\s+/g,'-')
  - filename = filename.toLowerCase()

  div(class='projekt__item item-#{filename}' style="background-color: #{color};")
     div(class='item__logo item__logo--#{filename}')
     div.item__figcaption
       span.item__figtext
         | #{category}
         if (partner)
           br
           span.item__figtext--sub
             strong Partner: #{partner}
     a(href=url rel="nofollow" target="_blank")

你的 Jade syntax

有几个错误

定义混合方法时,您不能为参数分配默认值。

item(name, category, url, color, partner=NULL) // error
item(name, category, url, color, partner)

顺便说一句,如果你不传递参数,默认情况下它是 undefined

在某些地方,您实际上并没有插入变量的值,而只是将变量名称输出为纯字符串

span.item__figtext
  | category // will output the text "category"
  | #{category} // will output the value stored in the variable category

分号不是 Jade 语法的一部分(* 除非你在做内联 JavaScript)

+item( "Intern...", ... ); // error
+item( "Intern...", ... )

更新 并提出更多建议

当您想要将变量值分配给您不想将它们放在引号中的属性时

a(href="url" //  will output <a href="url"
a(href=url   //  will output <a href="http://example.com"

在class名称中使用变量时,不能使用点.class表示法,因此要将其定义为属性

div.item-filename    // will output <div class="item-filename"
div.item-#{filename} // will result in error
div(class="item-#{filename}" // this is what you want

至于PHP的preg_replace.replace是JavaScript的等价物,虽然它不支持数组所以你必须将它们链接起来,并且您必须具体指定 /g 正则表达式修饰符。

还要在 Jade 中内联 JavaScript 代码,您希望它以连字符开头 -

- var filename = name.replace(/å/g,'a').replace(/ä/g,'a').…

这就是您完成的 Jade 应该看起来的样子

mixin item(name, category, url, color, partner)
  //- convert "åäö B C" -> "aao-b-c" (lower- and uppercase)
  - var filename = name.replace(/å/g,'a').replace(/ä/g,'a').replace(/ö/g,'o').replace(/Å/g,'A').replace(/Ä/g,'A').replace(/Ö/g,'O').replace(/\s+/g,'-')
  - filename = filename.toLowerCase()

  div(class='projekt__item item-#{filename}' style="background-color: #{color};") #{filename}
    div(class='item__logo item__logo--#{filename}')
    div.item__figcaption
      span.item__figtext
        | #{category}
        if (partner)
          br
          span.item__figtext--sub
            strong Partner: #{partner}
    a(href=url rel="nofollow" target="_blank")

+item( "Example Name 1 åäö", "Design & Utveckling", "http://www.example_url.com/", "#45c0ae", "Example Partner" )
+item( "Example Name 2", "Design & Utveckling", "http://www.example_url.com/", "#346b98" )
+item( "Example Name 3", "Design & Utveckling", "http://www.example_url.com/", "#8191b2", "Example Partner" )
+item( "Example Name 4", "Design & Utveckling", "http://www.example_url.com/", "#485230", "Example Partner" )