github-to-canvas 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +34 -18
- data/bin/github-to-canvas +37 -9
- data/lib/github-to-canvas.rb +4 -4
- data/lib/github-to-canvas/canvas_interface.rb +0 -7
- data/lib/github-to-canvas/repository_converter.rb +25 -5
- data/lib/github-to-canvas/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3d7cf49277d1fb40bb6a956a16865fded3e5a722b115313ab598c8b0ac16338
|
4
|
+
data.tar.gz: '01129c91256e4391343d2dd4bafc0c87acf57d7f8e0a4f3b040289ab045b6dea'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ead1b6073842a1d3c65214ffc3e3cd8bd20048df97a878d8f12dd522655090e02b98f9fb2d45be70a16a044d05aea682bf5c6c71cd31ccd8a6ab9fb215591948
|
7
|
+
data.tar.gz: cb340a9d7f4910116ede731ad44cb44a02f90bf77dae5e632669d2b54879af2eab38a8ff1ebf4e1fd639ee1c68ac22fdd5ded4d3ae5f57cd283696b4e32b0834
|
data/README.md
CHANGED
@@ -294,29 +294,45 @@ includes HTML that is not meant to be rendered, the content will be rendered as
|
|
294
294
|
part of the page's HTML, resulting in unusual display errors in Canvas. Examples of
|
295
295
|
this would be lessons on HTML or JavaScript that include HTML code snippets.
|
296
296
|
|
297
|
-
To
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
297
|
+
To prevent HTML from being rendered, include the `--contains-html` option when
|
298
|
+
running the GitHub to Canvas gem. This replaces `<` and `>` characters with HTML
|
299
|
+
charset values wrapped in `span` elements. This will stop Canvas from rendering
|
300
|
+
the HTML.
|
301
|
+
|
302
|
+
If your markdown contains a mix of HTML that should and should not be rendered,
|
303
|
+
you will need to either replace HTML that you want to be rendered with markdown
|
304
|
+
syntax equivalents. For example, HTML you want to display as code and an `<img>`
|
305
|
+
element you want to render as the image itself, replace the `<img>` tag with
|
306
|
+
markdown syntax (`![alt text](url)`).
|
307
|
+
|
308
|
+
The one exception is the `<iframe>` element. There is no way to easily embed
|
309
|
+
videos in GitHub markdown without HTML, so this tag will always be allowed to
|
310
|
+
render in Canvas, whether or not you use `--contains-html`.
|
311
|
+
|
312
|
+
If you have HTML related rendering issues in Canvas that can't be fixed with
|
313
|
+
`--contains-html`:
|
314
|
+
|
315
|
+
- Go to the Canvas WYSIWYG editor for the afflicted lesson.
|
316
|
+
- Click the HTML editor option (`</>` button in the lower right) to switch to
|
317
|
+
HTML.
|
318
|
+
- Read the GitHub repo as HTML:
|
319
|
+
|
320
|
+
```sh
|
321
|
+
github-to-canvas --read-from-github URL
|
322
|
+
```
|
323
|
+
|
324
|
+
- Copy the output HTML and paste it in to the Canvas editor. This should clear up
|
325
|
+
some larger page rendering issues, but may not fix all code snippets issues.
|
326
|
+
- Switch back to the regular Canvas WYSIWYG editor
|
327
|
+
- Open a second tab to the GitHub repo you're converting from.
|
328
|
+
- Copy any HTML code snippets from GitHub and paste them into the Canvas editor
|
329
|
+
where they should be displayed.
|
312
330
|
|
313
331
|
The Canvas editor will treat the pasted HTML content as code and will
|
314
332
|
automatically replace some characters, escaping the code from the
|
315
333
|
normal rendering process.
|
316
334
|
|
317
|
-
Note that realigning after fixing this content
|
318
|
-
rendering for these lessons again. A fix is planned for this issue, but has not
|
319
|
-
been implemented.
|
335
|
+
Note that realigning after fixing this content may overwrite fixes.
|
320
336
|
|
321
337
|
### Multi-Line Code Snippets Render as a Single Line
|
322
338
|
|
data/bin/github-to-canvas
CHANGED
@@ -77,7 +77,6 @@ OptionParser.new do |opts|
|
|
77
77
|
opts.on("-tTYPE", "--type TYPE",
|
78
78
|
"Sets the type Canvas lesson to be created (page or assignment). If no type, type decided based on repository structure") do |type|
|
79
79
|
# byebug
|
80
|
-
puts type.downcase
|
81
80
|
options[:type] = type.downcase
|
82
81
|
abort if type == 'quiz' || type == 'discussion'
|
83
82
|
# if type == 'page' || type == 'assignment' || type == 'discussion' || type == 'quiz' || type == 'Page' || type == 'Assignment' || type == 'Discussion' || type == 'Quiz'
|
@@ -107,6 +106,10 @@ OptionParser.new do |opts|
|
|
107
106
|
"Adds additional Flatiron School HTML after markdown conversion") do |f|
|
108
107
|
options[:fis] = true
|
109
108
|
end
|
109
|
+
opts.on("--aaq",
|
110
|
+
"Adds AAQ flag to HTML header appended with --fis-links") do |aaq|
|
111
|
+
options[:aaq] = aaq
|
112
|
+
end
|
110
113
|
opts.on("--forkable",
|
111
114
|
"Used with --fis-links, adds fork button to HTML header injected into Canvas lesson") do |remote|
|
112
115
|
options[:forkable] = true
|
@@ -175,6 +178,10 @@ OptionParser.new do |opts|
|
|
175
178
|
"Iterates over provided course YAML file and clones repos locally") do |file|
|
176
179
|
options[:clone_from_yaml] = file
|
177
180
|
end
|
181
|
+
opts.on("--contains-html",
|
182
|
+
"Escapes all HTML included in source markdown by replacing '<' and '>' with HTML charset values") do |html|
|
183
|
+
options[:contains_html] = html
|
184
|
+
end
|
178
185
|
|
179
186
|
end.parse!
|
180
187
|
|
@@ -184,12 +191,19 @@ if options[:version]
|
|
184
191
|
end
|
185
192
|
|
186
193
|
if options[:read_from_canvas]
|
187
|
-
GithubToCanvas.new(mode: 'canvas_read',
|
194
|
+
GithubToCanvas.new(mode: 'canvas_read',
|
195
|
+
filepath: options[:read_from_canvas])
|
188
196
|
abort
|
189
197
|
end
|
190
198
|
|
191
199
|
if options[:read_from_github]
|
192
|
-
GithubToCanvas.new(mode: 'github_read',
|
200
|
+
GithubToCanvas.new(mode: 'github_read',
|
201
|
+
filepath: options[:read_from_github],
|
202
|
+
remove_header_and_footer: !!options[:remove_header_and_footer],
|
203
|
+
forkable: !!options[:forkable],
|
204
|
+
fis_links: !!options[:fis],
|
205
|
+
aaq: !!options[:aaq],
|
206
|
+
contains_html: options[:contains_html])
|
193
207
|
abort
|
194
208
|
end
|
195
209
|
|
@@ -199,9 +213,12 @@ if options[:create_from_github]
|
|
199
213
|
filepath: options[:create_from_github],
|
200
214
|
course_id: options[:course_id],
|
201
215
|
type: options[:type],
|
216
|
+
name: options[:name],
|
202
217
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
203
218
|
forkable: !!options[:forkable],
|
204
|
-
fis_links: !!options[:fis]
|
219
|
+
fis_links: !!options[:fis],
|
220
|
+
aaq: !!options[:aaq],
|
221
|
+
contains_html: options[:contains_html])
|
205
222
|
else
|
206
223
|
puts 'Canvas course ID and lesson type required. Example: github-to-canvas --create-from-github URL --course ID --type TYPE'
|
207
224
|
end
|
@@ -218,7 +235,9 @@ if options[:align_from_github]
|
|
218
235
|
name: options[:name],
|
219
236
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
220
237
|
forkable: !!options[:forkable],
|
221
|
-
fis_links: !!options[:fis]
|
238
|
+
fis_links: !!options[:fis],
|
239
|
+
aaq: !!options[:aaq],
|
240
|
+
contains_html: options[:contains_html])
|
222
241
|
else
|
223
242
|
puts 'Canvas course ID, lesson ID, and type required. Example: github-to-canvas --create-from-github URL --course COURSE_ID --id LESSON_ID --type TYPE'
|
224
243
|
end
|
@@ -245,6 +264,7 @@ if options[:build_course]
|
|
245
264
|
file_to_convert: options[:build_course],
|
246
265
|
fis_links: !!options[:fis],
|
247
266
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
267
|
+
aaq: !!options[:aaq],
|
248
268
|
forkable: !!options[:forkable])
|
249
269
|
abort
|
250
270
|
end
|
@@ -256,7 +276,9 @@ if options[:add_to_course]
|
|
256
276
|
file_to_convert: options[:add_to_course],
|
257
277
|
fis_links: !!options[:fis],
|
258
278
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
259
|
-
forkable: !!options[:forkable]
|
279
|
+
forkable: !!options[:forkable],
|
280
|
+
aaq: !!options[:aaq],
|
281
|
+
contains_html: options[:contains_html])
|
260
282
|
else
|
261
283
|
puts '--course required'
|
262
284
|
end
|
@@ -268,7 +290,9 @@ if options[:update_course_lessons]
|
|
268
290
|
file_to_convert: options[:update_course_lessons],
|
269
291
|
fis_links: !!options[:fis],
|
270
292
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
271
|
-
forkable: !!options[:forkable]
|
293
|
+
forkable: !!options[:forkable],
|
294
|
+
aaq: !!options[:aaq],
|
295
|
+
contains_html: options[:contains_html])
|
272
296
|
abort
|
273
297
|
end
|
274
298
|
|
@@ -330,7 +354,9 @@ if options[:create_lesson]
|
|
330
354
|
fis_links: !!options[:fis],
|
331
355
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
332
356
|
only_update_content: !!options[:only_content],
|
333
|
-
forkable: !!options[:forkable]
|
357
|
+
forkable: !!options[:forkable],
|
358
|
+
aaq: !!options[:aaq],
|
359
|
+
contains_html: options[:contains_html])
|
334
360
|
end
|
335
361
|
|
336
362
|
if options[:align]
|
@@ -346,5 +372,7 @@ if options[:align]
|
|
346
372
|
fis_links: !!options[:fis],
|
347
373
|
remove_header_and_footer: !!options[:remove_header_and_footer],
|
348
374
|
only_update_content: !!options[:only_content],
|
349
|
-
forkable: !!options[:forkable]
|
375
|
+
forkable: !!options[:forkable],
|
376
|
+
aaq: !!options[:aaq],
|
377
|
+
contains_html: options[:contains_html])
|
350
378
|
end
|
data/lib/github-to-canvas.rb
CHANGED
@@ -27,8 +27,8 @@ class GithubToCanvas
|
|
27
27
|
when 'canvas_read'
|
28
28
|
puts CanvasInterface.read_lesson(options[:filepath])
|
29
29
|
when 'github_read'
|
30
|
-
|
31
|
-
puts RepositoryConverter.
|
30
|
+
html = RepositoryConverter.remote_file_conversion(options)
|
31
|
+
puts RepositoryConverter.adjust_converted_html(options, html)
|
32
32
|
when 'create' # used with a local repo
|
33
33
|
html = RepositoryConverter.local_file_conversion(options)
|
34
34
|
name = RepositoryInterface.get_name(options[:filepath], html)
|
@@ -38,13 +38,13 @@ class GithubToCanvas
|
|
38
38
|
puts "Canvas lesson created. Lesson available at #{response['html_url']}"
|
39
39
|
when 'align' # used with a local repo
|
40
40
|
html = RepositoryConverter.local_file_conversion(options)
|
41
|
-
name = RepositoryInterface.get_name(options[:filepath], html)
|
41
|
+
name = options[:name] ? options[:name] : RepositoryInterface.get_name(options[:filepath], html)
|
42
42
|
html = RepositoryConverter.adjust_converted_html(options, html)
|
43
43
|
CanvasInterface.update_all_related_lessons(options, name, html)
|
44
44
|
|
45
45
|
when 'github_create'
|
46
46
|
html = RepositoryConverter.remote_file_conversion(options)
|
47
|
-
name = RepositoryInterface.get_name(options[:filepath], html)
|
47
|
+
name = options[:name] ? options[:name] : RepositoryInterface.get_name(options[:filepath], html)
|
48
48
|
html = RepositoryConverter.adjust_converted_html(options, html)
|
49
49
|
|
50
50
|
response = CanvasInterface.create_lesson(options, name, html)
|
@@ -47,10 +47,6 @@ class CanvasInterface
|
|
47
47
|
JSON.parse(response.body)
|
48
48
|
end
|
49
49
|
|
50
|
-
def self.create_quiz(options, quiz_data)
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
50
|
def self.add_to_module(course_id, module_info, lesson_info)
|
55
51
|
# POST /api/v1/courses/:course_id/modules/:module_id/items
|
56
52
|
url = "#{ENV['CANVAS_API_PATH']}/courses/#{course_id}/modules/#{module_info["id"]}/items"
|
@@ -76,15 +72,12 @@ class CanvasInterface
|
|
76
72
|
}
|
77
73
|
end
|
78
74
|
begin
|
79
|
-
byebug
|
80
75
|
response = RestClient.post(url, payload, self.headers)
|
81
76
|
rescue
|
82
77
|
puts "Something went wrong while adding lesson #{lesson_info["id"]} to module #{module_info["id"]} in course #{course_id}" if lesson_info["type"] == "Assignment"
|
83
78
|
puts "Something went wrong while adding lesson #{lesson_info["page_url"]} to module #{module_info["id"]} in course #{course_id}" if lesson_info["type"] == "Page"
|
84
79
|
abort
|
85
80
|
end
|
86
|
-
|
87
|
-
|
88
81
|
response
|
89
82
|
|
90
83
|
end
|
@@ -17,7 +17,7 @@ class RepositoryConverter
|
|
17
17
|
GithubInterface.get_updated_repo(options[:filepath], options[:branch])
|
18
18
|
markdown = RepositoryInterface.read_local_file(options[:filepath], options[:file_to_convert])
|
19
19
|
raw_remote_url = self.set_raw_image_remote_url(options[:filepath])
|
20
|
-
|
20
|
+
markdown = self.escape_existing_html(markdown) if options[:contains_html]
|
21
21
|
markdown = self.fix_local_images(options, markdown, raw_remote_url)
|
22
22
|
html = self.convert_to_html(markdown)
|
23
23
|
# self.fix_local_html_links(options, html, options[:filepath])
|
@@ -26,6 +26,7 @@ class RepositoryConverter
|
|
26
26
|
def self.remote_file_conversion(options)
|
27
27
|
markdown = GithubInterface.read_remote(options[:filepath])
|
28
28
|
raw_remote_url = self.set_raw_image_remote_url(options[:filepath])
|
29
|
+
markdown = self.escape_existing_html(markdown) if options[:contains_html]
|
29
30
|
markdown = self.fix_local_images(options, markdown, raw_remote_url)
|
30
31
|
html = self.convert_to_html(markdown)
|
31
32
|
# self.fix_local_html_links(options, html, options[:filepath])
|
@@ -46,9 +47,24 @@ class RepositoryConverter
|
|
46
47
|
if options[:fis_links]
|
47
48
|
html = self.add_fis_links(options, html)
|
48
49
|
end
|
50
|
+
|
51
|
+
html = self.fix_escaped_inline_html_code(html)
|
52
|
+
|
49
53
|
html
|
50
54
|
end
|
51
55
|
|
56
|
+
def self.fix_escaped_inline_html_code(html)
|
57
|
+
html = html.gsub("<code>&lt;", "<code><")
|
58
|
+
html = html.gsub("&gt;</code>", "></code>")
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
def self.escape_existing_html(markdown)
|
63
|
+
markdown = markdown.gsub(/<\/(?!iframe)/, "</")
|
64
|
+
markdown = markdown.gsub(/<(?!iframe)/, "<")
|
65
|
+
markdown = markdown.gsub(/(?<!iframe)>/, ">")
|
66
|
+
end
|
67
|
+
|
52
68
|
def self.remove_header_and_footer(html)
|
53
69
|
new_html = self.remove_html_header(html)
|
54
70
|
new_html = self.remove_footer(new_html)
|
@@ -56,7 +72,7 @@ class RepositoryConverter
|
|
56
72
|
end
|
57
73
|
|
58
74
|
def self.remove_header(readme)
|
59
|
-
readme.gsub
|
75
|
+
readme = readme.gsub(/^# .+?\n\n/,"")
|
60
76
|
readme.gsub(/^# .+?\n/,"")
|
61
77
|
end
|
62
78
|
|
@@ -163,7 +179,7 @@ class RepositoryConverter
|
|
163
179
|
repo_info = self.get_repo_info(options[:filepath])
|
164
180
|
html = html.sub(/<div id="git-data-element.*<header class="fis-header.*<\/header>/,'') # remove existing fis header
|
165
181
|
header = self.create_github_link_header(repo_info[:repo_path], options[:forkable])
|
166
|
-
data_element = self.create_data_element(repo_info[:repo_org], repo_info[:repo_name])
|
182
|
+
data_element = self.create_data_element(repo_info[:repo_org], repo_info[:repo_name], options[:aaq])
|
167
183
|
data_element + header + html
|
168
184
|
end
|
169
185
|
|
@@ -183,8 +199,12 @@ class RepositoryConverter
|
|
183
199
|
end
|
184
200
|
end
|
185
201
|
|
186
|
-
def self.create_data_element(repo_org, repo_name)
|
187
|
-
|
202
|
+
def self.create_data_element(repo_org, repo_name, aaq)
|
203
|
+
if (aaq)
|
204
|
+
"<div id='git-data-element' data-aaq='enabled' data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
|
205
|
+
else
|
206
|
+
"<div id='git-data-element' data-org='#{repo_org}' data-repo='#{repo_name}'></div>"
|
207
|
+
end
|
188
208
|
end
|
189
209
|
|
190
210
|
|