Class: Utopia::Content::Link

Inherits:
Object
  • Object
show all
Defined in:
lib/utopia/content/link.rb

Overview

Represents a link to some content with associated metadata.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(kind, path, info = nil) ⇒ Link

Returns a new instance of Link.



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
# File 'lib/utopia/content/link.rb', line 33

def initialize(kind, path, info = nil)
	path = Path.create(path)

	@info = info || {}
	@kind = kind

	case @kind
	when :file
		@name, @locale = path.last.split('.', 2)
		@path = path
	when :directory
		@name = path.basename
		
		if @name == INDEX
			@name = path.dirname.basename
		end
		
		@locale = path.extension
		@path = path
	when :virtual
		@name, @locale = path.to_s.split('.', 2)
		@path = @info[:path] ? Path.create(@info[:path]) : nil
	else
		raise ArgumentError.new("Unknown link kind #{@kind} with path #{path}")
	end
	
	@title = Trenni::Strings.to_title(@name)
end

Instance Attribute Details

#infoObject (readonly)

Returns the value of attribute info.



76
77
78
# File 'lib/utopia/content/link.rb', line 76

def info
  @info
end

#kindObject (readonly)

Returns the value of attribute kind.



73
74
75
# File 'lib/utopia/content/link.rb', line 73

def kind
  @kind
end

#localeObject (readonly)

Returns the value of attribute locale.



77
78
79
# File 'lib/utopia/content/link.rb', line 77

def locale
  @locale
end

#nameObject (readonly)

Returns the value of attribute name.



74
75
76
# File 'lib/utopia/content/link.rb', line 74

def name
  @name
end

#pathObject (readonly)

Returns the value of attribute path.



75
76
77
# File 'lib/utopia/content/link.rb', line 75

def path
  @path
end

Instance Method Details

#==(other) ⇒ Object



125
126
127
# File 'lib/utopia/content/link.rb', line 125

def == other
	other and kind == other.kind and name == other.name and path == other.path
end

#[](key) ⇒ Object

Look up from the links.yaml metadata with a given symbolic key.



69
70
71
# File 'lib/utopia/content/link.rb', line 69

def [] key
	@info[key]
end

#default_locale?Boolean

Returns:

  • (Boolean)


129
130
131
# File 'lib/utopia/content/link.rb', line 129

def default_locale?
	@locale == nil
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/utopia/content/link.rb', line 121

def eql? other
	self.class.eql?(other.class) and kind.eql?(other.kind) and name.eql?(other.name) and path.eql?(other.path) and info.eql?(other.info)
end

#hrefObject



62
63
64
65
66
# File 'lib/utopia/content/link.rb', line 62

def href
	@href ||= @info.fetch(:uri) do
		(@path.dirname + @path.basename).to_s if @path
	end
end

#href?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/utopia/content/link.rb', line 79

def href?
	!!href
end

#relative_href(base = nil) ⇒ Object



83
84
85
86
87
88
89
# File 'lib/utopia/content/link.rb', line 83

def relative_href(base = nil)
	if base and href.start_with? '/'
		Path.shortest_path(href, base)
	else
		href
	end
end

#titleObject



91
92
93
# File 'lib/utopia/content/link.rb', line 91

def title
	@info.fetch(:title, @title)
end

#to_anchor(**options) ⇒ Object Also known as: to_href



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/utopia/content/link.rb', line 95

def to_anchor(**options)
	Trenni::Builder.fragment(options[:builder]) do |builder|
		if href?
			a_attributes = {
				:class => options.fetch(:class, 'link'),
				:href => relative_href(options[:base]),
				:target => options.fetch(:target, @info[:target])
			}
			
			builder.inline('a', a_attributes) do
				builder.text(options[:content] || title)
			end
		else
			builder.inline('span', class: options.fetch(:class, 'link')) do
				builder.text(options[:content] || title)
			end
		end
	end
end

#to_sObject



117
118
119
# File 'lib/utopia/content/link.rb', line 117

def to_s
	"\#<#{self.class}(#{self.kind}) title=#{title.inspect} href=#{href.inspect}>"
end