scribe/src/models/gist_file.cr

90 lines
1.8 KiB
Crystal

class GistFile
include JSON::Serializable
getter filename : String
getter content : String
getter raw_url : String
def initialize(@filename : String, @content : String, @raw_url : String)
end
def href
uri = URI.parse(raw_url)
uri.host = GIST_HOST
path_and_file_anchor = path_and_file_anchor(uri)
uri.path = path_and_file_anchor.path
uri.fragment = path_and_file_anchor.file_anchor
uri.to_s
end
private def path_and_file_anchor(uri : URI)
path_parts = uri.path.split("/")
PathAndFileAnchor.new(
path: [path_parts[1], path_parts[2]].join("/"),
filename: path_parts[-1]
)
end
class PathAndFileAnchor
getter file_anchor : String
getter path : String
def initialize(@path : String, filename : String)
@file_anchor = "file-" + filename.tr(" ", "-").tr(".", "-")
end
end
end
class MissingGistFile
GIST_HOST_AND_SCHEME = "https://#{GIST_HOST}"
def initialize(@id : String, @filename : String?)
end
def content
<<-TEXT
Gist file missing.
Click on filename to go to gist.
TEXT
end
def href
GIST_HOST_AND_SCHEME + "/#{@id}"
end
def filename
@filename || "Unknown filename"
end
def ==(other : MissingGistFile)
other.filename == filename && other.href == href
end
end
class RateLimitedGistFile
GIST_HOST_AND_SCHEME = "https://#{GIST_HOST}"
def initialize(@id : String, @filename : String?)
end
def content
<<-TEXT
Can't fetch gist.
GitHub rate limit reached.
Click on filename to go to gist.
TEXT
end
def href
GIST_HOST_AND_SCHEME + "/#{@id}"
end
def filename
@filename || "Unknown filename"
end
def ==(other : RateLimitedGistFile)
other.filename == filename && other.href == href
end
end