Report abuse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
diff --git a/lib/nanoc3/filters/less.rb b/lib/nanoc3/filters/less.rb
--- a/lib/nanoc3/filters/less.rb
+++ b/lib/nanoc3/filters/less.rb
@@ -7,13 +7,19 @@ module Nanoc3::Filters
     # This method takes no options.
     #
     # @param [String] content The content to filter
     #
     # @return [String] The filtered content
     def run(content, params={})
       require 'less'
 
+      # Add filename to load path
+      $LESS_LOAD_PATH << File.dirname(@item[:content_filename])
+
       ::Less::Engine.new(content).to_css
+    ensure
+      # Restore load path
+      $LESS_LOAD_PATH.delete_at(-1)
     end
 
   end
 end
diff --git a/test/filters/test_less.rb b/test/filters/test_less.rb
--- a/test/filters/test_less.rb
+++ b/test/filters/test_less.rb
@@ -3,18 +3,57 @@
 require 'test/helper'
 
 class Nanoc3::Filters::LessTest < MiniTest::Unit::TestCase
 
   include Nanoc3::TestHelpers
 
   def test_filter
     if_have 'less' do
+      # Create item
+      @item = Nanoc3::Item.new("blah", { :content_filename => 'content/foo/bar.txt' }, '/foo/bar/')
+
       # Create filter
-      filter = ::Nanoc3::Filters::Less.new
+      filter = ::Nanoc3::Filters::Less.new(:item => @item)
 
       # Run filter
       result = filter.run('.foo { bar: 1 + 1 }')
       assert_match /\.foo\s*\{\s*bar:\s*2;?\s*\}/, result
     end
   end
 
+  def test_filter_with_paths_relative_to_site_directory
+    if_have 'less' do
+      # Create file to import
+      FileUtils.mkdir_p('content/foo/bar')
+      File.open('content/foo/bar/imported_file.less', 'w') { |io| io.write('p { color: red; }') }
+
+      # Create item
+      @item = Nanoc3::Item.new("blah", { :content_filename => 'content/foo/bar.txt' }, '/foo/bar/')
+
+      # Create filter
+      filter = ::Nanoc3::Filters::Less.new(:item => @item)
+
+      # Run filter
+      result = filter.run('@import "content/foo/bar/imported_file.less";')
+      assert_match /p\s*\{\s*color:\s*red;?\s*\}/, result
+    end
+  end
+
+  def test_filter_with_paths_relative_to_current_file
+    if_have 'less' do
+      # Create file to import
+      FileUtils.mkdir_p('content/foo/bar')
+      File.open('content/foo/bar/imported_file.less', 'w') { |io| io.write('p { color: red; }') }
+
+      # Create item
+      @item = Nanoc3::Item.new("blah", { :content_filename => 'content/foo/bar.txt' }, '/foo/bar/')
+
+      # Create filter
+      filter = ::Nanoc3::Filters::Less.new(:item => @item)
+
+      # Run filter
+      result = filter.run('@import "bar/imported_file.less";')
+      assert_match /p\s*\{\s*color:\s*red;?\s*\}/, result
+    end
+  end
+
 end