mod/format/set/all/path.rb
format do
# Decko uses the term "path" a bit unusually.
#
# In most formats, #path returns a full url. In HTML, it provides everything after
# the domain/port.
#
# If you're feeling saucy, you might point out that typically "paths" don't
# include queries and fragment identifiers, much less protocols, domains, and ports.
# 10 pedantry points to you! But "path" is easy to type and the method is smart about
# format needs, so using it will lead you down the right ... something or other.
# Format#path is for generating standard card routes, eg, assuming the card
# associated with the current format is named "current", it will generate paths like
# these:
# path view: :bar -> "current?view=bar"
# path mark: [mycardid] -> "mycardname"
# path format: :csv) -> "current.csv"
# path action: :update -> "update/current"
# #path produces paths that follow one of three main patterns:
# 1. mark[.format][?query] # standard GET request
# 2. action/mark[?query] # GET variant of standard actions
# 3. new/mark # shortcut for "new" view of cardtype
# @param opts [Hash, String] a String is treated as a complete path and
# bypasses all processing
# @option opts [String, Card::Name, Integer, Symbol, Card] :mark
# @option opts [Symbol] :action card action (:create, :update, :delete)
# @option opts [Symbol] :format
# @option opts [Hash] :card
# @option opts [TrueClass] :no_mark
def path opts={}
return opts unless opts.is_a? Hash
path = Card::Path.new(card, opts)&.render
contextualize_path path
end
# in base format (and therefore most other formats), even internal paths
# are rendered as absolute urls.
def contextualize_path relative_path
card_url relative_path
end
end
format :json do
def add_unknown_name_to_opts name, opts
# noop
end
end
format :css do
def contextualize_path relative_path
if Card.config.file_storage == :local
# absolute paths lead to invalid assets path in css for cukes
card_path relative_path
else
# ...but relative paths are problematic when machine output and
# hard-coded assets (like fonts) are on different servers
card_url relative_path
end
end
end
format :html do
# in HTML, decko paths rendered as relative to the site's root.
def contextualize_path relative_path
card_path relative_path
end
end
format :email_html do
def contextualize_path relative_path
card_url relative_path
end
end