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.



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

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.



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

def info
  @info
end

#kindObject (readonly)

Returns the value of attribute kind.



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

def kind
  @kind
end

#localeObject (readonly)

Returns the value of attribute locale.



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

def locale
  @locale
end

#nameObject (readonly)

Returns the value of attribute name.



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

def name
  @name
end

#pathObject (readonly)

Returns the value of attribute path.



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

def path
  @path
end

Instance Method Details

#==(other) ⇒ Object



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

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.



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

def [] key
	@info[key]
end

#default_locale?Boolean

Returns:

  • (Boolean)


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

def default_locale?
	@locale == nil
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


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

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



66
67
68
69
70
# File 'lib/utopia/content/link.rb', line 66

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

#href?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/utopia/content/link.rb', line 83

def href?
	!!href
end

#relative_href(base = nil) ⇒ Object



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

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

#titleObject



95
96
97
# File 'lib/utopia/content/link.rb', line 95

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

#to_anchor(base: nil, content: self.title, builder: nil, **attributes) ⇒ Object Also known as: to_href



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

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

#to_sObject



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

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