Class: RepositoryConverter

Inherits:
Object
  • Object
show all
Defined in:
lib/github-to-canvas/repository_converter.rb

Class Method Summary collapse

Class Method Details



184
185
186
187
188
189
190
# File 'lib/github-to-canvas/repository_converter.rb', line 184

def self.add_fis_links(options, html)
  repo_info = self.get_repo_info(options[:filepath])
  html = html.sub(/<div id="git-data-element.*<header class="fis-header.*<\/header>/,'') # remove existing fis header
  header = self.create_github_link_header(repo_info[:repo_path], options[:forkable])
  data_element = self.create_data_element(repo_info[:repo_org], repo_info[:repo_name], options[:aaq])
  data_element + header + html
end

.adjust_converted_html(options, html) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/github-to-canvas/repository_converter.rb', line 45

def self.adjust_converted_html(options, html)
  
  if options[:remove_header_and_footer]
    html = self.remove_header_and_footer(html)
  end
  
  if options[:fis_links]
    html = self.add_fis_links(options, html)
  end

  if options[:contains_html]
    html = self.fix_escaped_inline_html_code(html)
  end

  html
end

.adjust_local_html_images(readme, raw_remote_url, branch) ⇒ Object



151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/github-to-canvas/repository_converter.rb', line 151

def self.adjust_local_html_images(readme, raw_remote_url, branch)
  readme.gsub!(/src=(\'|\")[\s\S]*?(\'|\")/) { |image_source|
    if !image_source.match?('amazonaws.com') && !image_source.match?('https://') && !image_source.match?('http://') && !image_source.match?('youtube')
      image_source.gsub!(/(\'|\")/, "")
      image_source.gsub!(/src=/, '')
      image_source.strip!
      'src="' + raw_remote_url + '/' + branch + '/' + image_source + '"'
    else
      image_source
    end
  }
end

.adjust_local_markdown_images(readme, raw_remote_url, branch) ⇒ Object



138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/github-to-canvas/repository_converter.rb', line 138

def self.adjust_local_markdown_images(readme, raw_remote_url, branch)
  readme.gsub!(/\!\[.+\]\(.+\)/) {|image_markdown|
    if !image_markdown.match?('amazonaws.com') && !image_markdown.match?('https://') && !image_markdown.match?('http://') && !image_markdown.match?('youtube')
      image_markdown.gsub!(/\(.+\)/) { |path|
        path.delete_prefix!("(")
        path.delete_suffix!(")")
        "(" + raw_remote_url + "/#{branch}/" + path + ")"
      }
    end
    image_markdown
  }
end

.convert_to_html(markdown) ⇒ Object



39
40
41
42
43
# File 'lib/github-to-canvas/repository_converter.rb', line 39

def self.convert_to_html(markdown)
  redcarpet = Redcarpet::Markdown.new(CustomRender, options={tables: true, autolink: true, fenced_code_blocks: true})
  html = redcarpet.render(markdown)
  self.remove_line_breaks(html)
end

.create_data_element(repo_org, repo_name, aaq) ⇒ Object



208
209
210
211
212
213
214
# File 'lib/github-to-canvas/repository_converter.rb', line 208

def self.create_data_element(repo_org, repo_name, aaq)
  if (aaq)
    "<div id='git-data-element' data-aaq='enabled' data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
  else
    "<div id='git-data-element' data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
  end
end


192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/github-to-canvas/repository_converter.rb', line 192

def self.create_github_link_header(repo_path, forkable)
  # add link to associated repository
  github_repo_link = "<a class='fis-git-link' href='#{repo_path}' target='_blank' rel='noopener'><img id='repo-img' title='Open GitHub Repo' alt='GitHub Repo' /></a>"
  
  # add link to new issue form
  github_issue_link = "<a class='fis-git-link' href='#{repo_path}/issues/new' target='_blank' rel='noopener'><img id='issue-img' title='Create New Issue' alt='Create New Issue' /></a>"
  
  # add link to fork (forking handled by separate Flatiron server, generation of link handled via custom Canvas JS theme file)
  if (forkable)
    github_fork_link = "<a class='fis-fork-link' id='fork-link' href='#' target='_blank' rel='noopener'><img id='fork-img' title='Fork This Assignment' alt='Fork This Assignment' /></a>"
    "<header class='fis-header' style='visibility: hidden;'>#{github_fork_link}#{github_repo_link}#{github_issue_link}</header>"
  else
    "<header class='fis-header' style='visibility: hidden;'>#{github_repo_link}#{github_issue_link}</header>"
  end
end

.escape_existing_html(markdown) ⇒ Object



68
69
70
71
72
# File 'lib/github-to-canvas/repository_converter.rb', line 68

def self.escape_existing_html(markdown)
  markdown = markdown.gsub(/<\/(?!iframe)/, "&lt;/")
  markdown = markdown.gsub(/<(?!iframe)/, "&lt;")
  markdown = markdown.gsub(/(?<!iframe)>/, "&gt;")
end

.fix_escaped_inline_html_code(html) ⇒ Object



62
63
64
65
# File 'lib/github-to-canvas/repository_converter.rb', line 62

def self.fix_escaped_inline_html_code(html)
  html = html.gsub("<code>&amp;lt;", "<code>&lt;")
  html = html.gsub("&amp;gt;</code>", "&gt;</code>")
end


93
94
95
96
97
98
99
100
# File 'lib/github-to-canvas/repository_converter.rb', line 93

def self.fix_local_html_links(options, html, filepath)
  # fixes relative hyperlinks by appending the github path to the file
  filepath_base = filepath.match(/https:\/\/github.com\/.*?\/.*?\//).to_s
  filepath_base = self.get_github_base_url(filepath)
  html.gsub!(/a href="(?!(http|#)).*?"/) {|local_link|
    local_link[8..-2]
  }
end

.fix_local_images(options, markdown, raw_remote_url) ⇒ Object



102
103
104
105
106
107
# File 'lib/github-to-canvas/repository_converter.rb', line 102

def self.fix_local_images(options, markdown, raw_remote_url)
  # fixes markdown images with relative links by appending the raw githubusercontent path to the file
  self.adjust_local_markdown_images(markdown, raw_remote_url, options[:branch])
  self.adjust_local_html_images(markdown, raw_remote_url, options[:branch])
  markdown
end

.get_github_base_url(filepath) ⇒ Object



109
110
111
112
113
114
# File 'lib/github-to-canvas/repository_converter.rb', line 109

def self.get_github_base_url(filepath)
  remote = GithubInterface.git_remote(filepath)
  remote.gsub!("[email protected]:","https://github.com/")
  remote.gsub!(/.git$/,"")
  remote.strip! 
end

.get_repo_info(filepath) ⇒ Object



170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/github-to-canvas/repository_converter.rb', line 170

def self.get_repo_info(filepath)
  if !filepath.match?('https://github.com')
    repo_path = self.get_repo_url(filepath)
  else
    repo_path = filepath
  end

  {
    repo_path: repo_path,
    repo_name: repo_path.split('/')[4],
    repo_org: repo_path.split('/')[3]
  }
end

.get_repo_url(filepath) ⇒ Object



131
132
133
134
135
136
# File 'lib/github-to-canvas/repository_converter.rb', line 131

def self.get_repo_url(filepath)
  remote = GithubInterface.git_remote(filepath)
  remote.gsub!("[email protected]:","https://github.com/")
  remote.gsub!(/.git$/,"")
  remote.strip!
end

.local_file_conversion(options) ⇒ Object



16
17
18
19
20
21
22
23
24
# File 'lib/github-to-canvas/repository_converter.rb', line 16

def self.local_file_conversion(options)
  GithubInterface.get_updated_repo(options[:filepath], options[:branch])
  markdown = RepositoryInterface.read_local_file(options[:filepath], options[:file_to_convert])
  raw_remote_url = self.set_raw_image_remote_url(options[:filepath])
  markdown = self.escape_existing_html(markdown) if options[:contains_html]
  markdown = self.fix_local_images(options, markdown, raw_remote_url)
  html = self.convert_to_html(markdown)
  # self.fix_local_html_links(options, html, options[:filepath])
end

.remote_file_conversion(options) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/github-to-canvas/repository_converter.rb', line 26

def self.remote_file_conversion(options)
  markdown = GithubInterface.read_remote(options[:filepath])
  raw_remote_url = self.set_raw_image_remote_url(options[:filepath])
  if options[:contains_html]
    puts "Contains HTML"
    puts options[:contains_html]
    markdown = self.escape_existing_html(markdown)
  end
  markdown = self.fix_local_images(options, markdown, raw_remote_url)
  html = self.convert_to_html(markdown)
  # self.fix_local_html_links(options, html, options[:filepath])
end


85
86
87
# File 'lib/github-to-canvas/repository_converter.rb', line 85

def self.remove_footer(readme)
  readme.gsub(/<p class='util--hide'(.+?)<\/p>/,"")
end

.remove_header(readme) ⇒ Object



80
81
82
83
# File 'lib/github-to-canvas/repository_converter.rb', line 80

def self.remove_header(readme)
  readme = readme.gsub(/^# .+?\n\n/,"")
  readme.gsub(/^# .+?\n/,"")
end


74
75
76
77
78
# File 'lib/github-to-canvas/repository_converter.rb', line 74

def self.remove_header_and_footer(html)
  new_html = self.remove_html_header(html)
  new_html = self.remove_footer(new_html)
  new_html
end

.remove_html_header(html) ⇒ Object



89
90
91
# File 'lib/github-to-canvas/repository_converter.rb', line 89

def self.remove_html_header(html)
  html.gsub(/<h1>.*<\/h1>/,"")
end

.remove_line_breaks(html) ⇒ Object



164
165
166
# File 'lib/github-to-canvas/repository_converter.rb', line 164

def self.remove_line_breaks(html)
  html.gsub("\n",' ')
end

.set_raw_image_remote_url(filepath) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/github-to-canvas/repository_converter.rb', line 117

def self.set_raw_image_remote_url(filepath)
  if filepath.include? 'https://github.com/'
    remote = filepath
  else
    remote = GithubInterface.git_remote(filepath)
  end
  raw_remote = remote.gsub("[email protected]:","https://raw.githubusercontent.com/")
  raw_remote = raw_remote.gsub("https://github.com/","https://raw.githubusercontent.com/")
  raw_remote = raw_remote.gsub(/\/blob\/master\/.*$/,"")
  raw_remote = raw_remote.gsub(/\/blob\/main\/.*$/,"")
  raw_remote = raw_remote.gsub(/.git$/,"")
  raw_remote.strip
end