90 lines
1.8 KiB
Crystal
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
|