mirror of
https://github.com/foo-dogsquared/asciidoctor-foodogsquared-extensions.git
synced 2025-01-30 22:57:56 +00:00
Add GitLab raw content include processor
This commit is contained in:
parent
88902f6540
commit
d03f1ca700
@ -3,9 +3,11 @@ require 'asciidoctor/extensions'
|
||||
require_relative 'man-inline-macro/extension'
|
||||
require_relative 'swhid-inline-macro/extension'
|
||||
require_relative 'github-raw-content-include-processor/extension'
|
||||
require_relative 'gitlab-raw-content-include-processor/extension'
|
||||
|
||||
Asciidoctor::Extensions.register do
|
||||
inline_macro ManInlineMacro
|
||||
inline_macro SWHInlineMacro
|
||||
include_processor GitHubRawIncludeProcessor
|
||||
include_processor GitLabRawIncludeProcessor
|
||||
end
|
||||
|
@ -0,0 +1,40 @@
|
||||
= GitLab raw content include processor
|
||||
:toc:
|
||||
|
||||
|
||||
It's a link:https://docs.asciidoctor.org/asciidoctor/latest/extensions/include-processor/[include processor] for easily including raw content from GitLab repositories.
|
||||
|
||||
|
||||
== Synopsis
|
||||
|
||||
[source, asciidoc]
|
||||
----
|
||||
include::gitlab/$OWNER/$REPO[rev=$COMMIT, path=$FILEPATH]
|
||||
----
|
||||
|
||||
|
||||
== Extra notes
|
||||
|
||||
A link:https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#personal-access-tokens[personal access token] is most likely required.
|
||||
Get one and place the value in an environment variable `GITLAB_API_PERSONAL_ACCESS_TOKEN`.
|
||||
|
||||
|
||||
== Attributes
|
||||
|
||||
There are some attributes required to be passed.
|
||||
|
||||
- `rev` is the commit to be checked out.
|
||||
- `path` is the file path to be included.
|
||||
|
||||
Aside from the required attributes, there are optional attributes to configured further.
|
||||
|
||||
- `domain` is the domain of the GitLab instance.
|
||||
By default, it points to the `gitlab.com` official instance.
|
||||
|
||||
- `version` is the version string of the API to be used.
|
||||
By default, it uses version `v4`.
|
||||
|
||||
|
||||
== Example usage
|
||||
|
||||
- `include::gitlab:gitlab-org/gitlab[rev=master, path=README.md]` should
|
@ -0,0 +1,70 @@
|
||||
require 'base64'
|
||||
require 'json'
|
||||
require 'open-uri'
|
||||
require 'uri'
|
||||
|
||||
class GitLabRawIncludeProcessor < Asciidoctor::Extensions::IncludeProcessor
|
||||
@@prefix = 'gitlab:'
|
||||
|
||||
def handles? target
|
||||
target.start_with? @@prefix
|
||||
end
|
||||
|
||||
def warn_or_raise doc, warning
|
||||
if (doc.safe > Asciidoctor::SafeMode::SERVER) && !(doc.attr? 'allow-uri-read')
|
||||
raise warning
|
||||
else
|
||||
warn warning
|
||||
end
|
||||
end
|
||||
|
||||
def process doc, reader, target, attrs
|
||||
src = target.delete_prefix(@@prefix).split('/', 2)
|
||||
owner = src.at 0
|
||||
repo = src.at 1
|
||||
namespaced_repo = "#{owner}/#{repo}"
|
||||
|
||||
raise %(there is no 'path' attribute given for GitLab repo '#{namespaced_repo}') unless (attrs.key? 'path')
|
||||
raise %(no given ref for getting file in '#{namespaced_repo}') unless (attrs.key? 'rev')
|
||||
|
||||
path = attrs['path']
|
||||
rev = attrs['rev']
|
||||
|
||||
domain = attrs['domain'] || 'gitlab.com'
|
||||
version = attrs['version'] || 'v4'
|
||||
|
||||
uri = URI.parse %(https://#{domain}/api/#{version})
|
||||
|
||||
# Set the project.
|
||||
uri += %(/projects/#{URI.encode_www_form_component namespaced_repo})
|
||||
|
||||
# Then the filename.
|
||||
uri += %(/repository/files/#{URI.encode_www_form_component path})
|
||||
|
||||
# Then the revision.
|
||||
query = { :ref => rev }
|
||||
uri.query = URI.encode_www_form query
|
||||
|
||||
begin
|
||||
OpenURI.open_uri(
|
||||
uri,
|
||||
'Content-Type' => 'application/json',
|
||||
'PRIVATE-TOKEN' => ENV['GITLAB_API_PERSONAL_ACCESS_TOKEN'],
|
||||
) do |f|
|
||||
response = JSON.parse(f.read)
|
||||
|
||||
if response['content'] && response['encoding'] == 'base64'
|
||||
Base64.decode64 response['content']
|
||||
end
|
||||
|
||||
reader.push_include content, target, target, 1, attrs
|
||||
end
|
||||
rescue OpenURI::HTTPError => e
|
||||
warning = %(error while getting '#{path}' in GitLab repo '#{repo}': #{e})
|
||||
warn_or_raise doc, warning
|
||||
reader.push_include warning, target, target, 1, attrs
|
||||
end
|
||||
|
||||
reader
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue
Block a user