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.



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

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.



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

def info
  @info
end

#kindObject (readonly)

Returns the value of attribute kind.



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

def kind
  @kind
end

#localeObject (readonly)

Returns the value of attribute locale.



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

def locale
  @locale
end

#nameObject (readonly)

Returns the value of attribute name.



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

def name
  @name
end

#pathObject (readonly)

Returns the value of attribute path.



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

def path
  @path
end

Instance Method Details

#==(other) ⇒ Object



127
128
129
# File 'lib/utopia/content/link.rb', line 127

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.



71
72
73
# File 'lib/utopia/content/link.rb', line 71

def [] key
	@info[key]
end

#default_locale?Boolean

Returns:

  • (Boolean)


131
132
133
# File 'lib/utopia/content/link.rb', line 131

def default_locale?
	@locale == nil
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


123
124
125
# File 'lib/utopia/content/link.rb', line 123

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



64
65
66
67
68
# File 'lib/utopia/content/link.rb', line 64

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

#href?Boolean

Returns:

  • (Boolean)


81
82
83
# File 'lib/utopia/content/link.rb', line 81

def href?
	!!href
end

#relative_href(base = nil) ⇒ Object



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

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

#titleObject



93
94
95
# File 'lib/utopia/content/link.rb', line 93

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

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



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

def to_anchor(**options)
	Trenni::Builder.fragment(options[:builder]) do |builder|
		if href?
			attributes = {
				:class => options.fetch(:class, 'link'),
				:href => relative_href(options[:base]),
				:target => options.fetch(:target, @info[:target])
			}
			
			builder.inline('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



119
120
121
# File 'lib/utopia/content/link.rb', line 119

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