Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Css Sass混合递归@包含循环_Css_Ruby_Recursion_Sass - Fatal编程技术网

Css Sass混合递归@包含循环

Css Sass混合递归@包含循环,css,ruby,recursion,sass,Css,Ruby,Recursion,Sass,有人知道是否有可能恢复Sass的功能,以防止为防止@include递归而实施的“bug fix”1 信息是: 语法错误:找到了@include循环:includes本身 这是“固定的”1英寸,我不想(读:我不能)降级那么远。不幸的是,我对Ruby的了解还不够,无法对源代码进行筛选,虽然我正在抽出时间来改变这一点,但它现在对我没有帮助 那么,是否有可能2在不降级的情况下将此功能恢复到3.0.5之前的功能;是否有一个重新补丁在某处浮动?我还没找到 编辑:虽然我自己已经回答了这个问题,但我仍然愿意接受

有人知道是否有可能恢复Sass的功能,以防止为防止
@include
递归而实施的“bug fix”1

信息是:

语法错误:找到了@include循环:includes本身

这是“固定的”1英寸,我不想(读:我不能)降级那么远。不幸的是,我对Ruby的了解还不够,无法对源代码进行筛选,虽然我正在抽出时间来改变这一点,但它现在对我没有帮助

那么,是否有可能2在不降级的情况下将此功能恢复到3.0.5之前的功能;是否有一个重新补丁在某处浮动?我还没找到

编辑:虽然我自己已经回答了这个问题,但我仍然愿意接受更好的答案;特别是,从现在起,更多的可移植解决方案将在其他任何地方(3.0.5之前的任何地方)破坏Sass文件

1引号用来表示我不认为这是一个修复。我认为这是一次休息;不过我会和那些负责人谈谈。
2我知道这是可能的,但我的意思是专门针对没有Ruby实践经验的人。我在学Ruby!

你知道,我知道足够的Ruby注释一两行;)

\lib\sass\tree\visitors\perform.rb:249
只需评论:

# Runs a mixin.
def visit_mixin(node)
  include_loop = true
  handle_include_loop!(node) if @stack.any? {|e| e[:name] == node.name}
  include_loop = false
进入:


突然,彩虹般的光辉重现。

好吧,有一种更干净的方法可以应用你的技能:使用

它将允许您安全地共享您的项目,其他人将能够在不修改自己的SASS编译器的情况下编译它

1) 创建
sass访问mixin monkey patch.rb
旁边的
compass.rb
并从那里应用您的黑客技能:

3)
使用compass Compile编译您的项目

您能否提供一个真实的任务示例,递归是一个非常好的解决方案,值得攻击SASS引擎并生成对任何其他人都不起作用的代码?有一个例子,我有几个mixin参与相互递归;然而,根据设计,它总是有限的。我会在我的问题中提供一个例子,一旦我回到家(并有项目可用),我不会要求代码。我要求描述一个任务,用一个合适的解决方案屏蔽被攻击的递归。@lolmaus使用全局命名空间堆栈自动命名前缀类。在呈现mixin
@content
之前/之后,mixin根据名称空间列表调用push/pop函数。如果定义了一个mixin,其中包含调用这些mixin的代码,并且包含在使用这些实用程序mixin的另一个块中,因为它们是相互递归的,Sass引擎就会停止。也;我不会称之为黑客递归,而是称之为非黑客递归;如果你问我的话,强加的限制有点像黑客。你能提供一个生成类的列表吗?我还是不明白为什么需要再诅咒;因此,您只需重新定义并要求访问mixin,然后对其进行修补。鲁比,你疯了。
# Runs a mixin.
def visit_mixin(node)
  # include_loop = true
  # handle_include_loop!(node) if @stack.any? {|e| e[:name] == node.name}
  include_loop = false
class Sass::Tree::Visitors::Perform < Sass::Tree::Visitors::Base
  # Runs a mixin.
  def visit_mixin(node)
    #include_loop = true
    #handle_include_loop!(node) if @stack.any? {|e| e[:name] == node.name}
    include_loop = false

    @stack.push(:filename => node.filename, :line => node.line, :name => node.name)
    raise Sass::SyntaxError.new("Undefined mixin '#{node.name}'.") unless mixin = @environment.mixin(node.name)

    if node.children.any? && !mixin.has_content
      raise Sass::SyntaxError.new(%Q{Mixin "#{node.name}" does not accept a content block.})
    end

    args = node.args.map {|a| a.perform(@environment)}
    keywords = Sass::Util.map_hash(node.keywords) {|k, v| [k, v.perform(@environment)]}
    splat = node.splat.perform(@environment) if node.splat

    self.class.perform_arguments(mixin, args, keywords, splat) do |env|
      env.caller = Sass::Environment.new(@environment)
      env.content = node.children if node.has_children

      trace_node = Sass::Tree::TraceNode.from_node(node.name, node)
      with_environment(env) {trace_node.children = mixin.tree.map {|c| visit(c)}.flatten}
      trace_node
    end
  rescue Sass::SyntaxError => e
    unless include_loop
      e.modify_backtrace(:mixin => node.name, :line => node.line)
      e.add_backtrace(:line => node.line)
    end
    raise e
  ensure
    @stack.pop unless include_loop
  end
end
# Enabling mixin recursion by applying a monkey patch to SASS compiler
require "./sass-visit-mixin-monkey-patch"