leg 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,81 @@
1
+ class Snaptoken::Representations::Litdiff < Snaptoken::Representations::BaseRepresentation
2
+ def save!(options = {})
3
+ FileUtils.mkdir_p(path)
4
+ FileUtils.rm_rf(File.join(path, "."), secure: true)
5
+
6
+ step_num = 1
7
+ @tutorial.pages.each.with_index do |page, page_idx|
8
+ output = ""
9
+ page.steps.each do |step|
10
+ output << step.text << "\n\n" unless step.text.empty?
11
+ output << "~~~ #{step.summary}\n"
12
+ output << step.to_patch(unchanged_char: "|") << "\n"
13
+
14
+ yield step_num if block_given?
15
+ step_num += 1
16
+ end
17
+ output << page.footer_text << "\n" if page.footer_text
18
+
19
+ filename = page.filename + ".litdiff"
20
+ filename = "%02d.%s" % [page_idx + 1, filename] if @tutorial.pages.length > 1
21
+
22
+ File.write(File.join(path, filename), output)
23
+ end
24
+ end
25
+
26
+ def load!(options = {})
27
+ step_num = 1
28
+ @tutorial.clear
29
+ Dir[File.join(path, "*.litdiff")].sort_by { |f| File.basename(f).to_i }.each do |diff_path|
30
+ filename = File.basename(diff_path).sub(/\.litdiff$/, "").sub(/^\d+\./, "")
31
+ page = Snaptoken::Page.new(filename)
32
+ File.open(diff_path, "r") do |f|
33
+ cur_text = ""
34
+ cur_diff = nil
35
+ cur_summary = nil
36
+ while line = f.gets
37
+ if line.start_with? "~~~"
38
+ cur_summary = (line[3..-1] || "").strip
39
+ cur_diff = ""
40
+ elsif cur_diff
41
+ if line.chomp.empty?
42
+ step_diffs = Snaptoken::Diff.parse(cur_diff)
43
+ page << Snaptoken::Step.new(step_num, cur_summary, cur_text.strip, step_diffs)
44
+
45
+ yield step_num if block_given?
46
+ step_num += 1
47
+
48
+ cur_text = ""
49
+ cur_summary = nil
50
+ cur_diff = nil
51
+ else
52
+ cur_diff << line.sub(/^\|/, " ")
53
+ end
54
+ else
55
+ cur_text << line
56
+ end
57
+ end
58
+ if cur_diff
59
+ step_diffs = Snaptoken::Diff.parse(cur_diff)
60
+ page << Snaptoken::Step.new(step_num, cur_summary, cur_text.strip, step_diffs)
61
+ elsif !cur_text.strip.empty?
62
+ page.footer_text = cur_text.strip
63
+ end
64
+ end
65
+ @tutorial << page
66
+ end
67
+ @tutorial
68
+ end
69
+
70
+ def path
71
+ File.join(@tutorial.config[:path], "doc")
72
+ end
73
+
74
+ private
75
+
76
+ def modified_at
77
+ if File.exist? path
78
+ Dir[File.join(path, "**/*")].map { |f| File.mtime(f) }.max
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,27 @@
1
+ class Snaptoken::Step
2
+ attr_accessor :number, :summary, :text, :diffs
3
+
4
+ def initialize(number, summary, text, diffs)
5
+ @number = number
6
+ @summary = summary.strip
7
+ @text = text.strip
8
+ @diffs = diffs
9
+ end
10
+
11
+ def to_html(tutorial, offline)
12
+ Snaptoken::Template.new(tutorial.step_template, tutorial,
13
+ offline: offline,
14
+ number: @number,
15
+ summary: @summary,
16
+ diffs: @diffs
17
+ ).render_template
18
+ end
19
+
20
+ def to_patch(options = {})
21
+ @diffs.map { |diff| diff.to_patch(options) }.join("\n")
22
+ end
23
+
24
+ def syntax_highlight!
25
+ @diffs.each(&:syntax_highlight!)
26
+ end
27
+ end
@@ -0,0 +1,53 @@
1
+ class Snaptoken::Template
2
+ attr_reader :tutorial
3
+
4
+ def initialize(template_source, tutorial, params)
5
+ @template_source = template_source
6
+ @tutorial = tutorial
7
+ @params = params
8
+ end
9
+
10
+ def render_template
11
+ b = binding
12
+ @tutorial.config.merge(@params).each do |name, value|
13
+ b.local_variable_set(name, value)
14
+ end
15
+ ERB.new(@template_source).result(b)
16
+ end
17
+
18
+ def render(path)
19
+ if !path.end_with? ".md"
20
+ raise ArgumentError, "Only .md files are supported by render() at the moment."
21
+ end
22
+
23
+ contents = File.read(path)
24
+ Snaptoken::Markdown.render(contents)
25
+ end
26
+
27
+ def markdown(source)
28
+ Snaptoken::Markdown.render(source)
29
+ end
30
+
31
+ def pages
32
+ @tutorial.pages
33
+ end
34
+
35
+ def step(number)
36
+ step = @tutorial.step(number)
37
+ step.syntax_highlight!
38
+ step.to_html(@tutorial, @params[:offline])
39
+ end
40
+
41
+ def syntax_highlighting_css(scope)
42
+ syntax_theme = @tutorial.config[:syntax_theme] || "github"
43
+ if syntax_theme.is_a? String
44
+ theme = Rouge::Theme.find(syntax_theme)
45
+ elsif syntax_theme.is_a? Hash
46
+ theme = Class.new(Rouge::Themes::Base16)
47
+ theme.name "base16.custom"
48
+ theme.palette syntax_theme
49
+ end
50
+
51
+ theme.render(scope: scope)
52
+ end
53
+ end
@@ -0,0 +1,64 @@
1
+ class Snaptoken::Tutorial
2
+ attr_accessor :config
3
+ attr_accessor :page_template, :step_template
4
+ attr_reader :pages
5
+
6
+ def initialize(config = {})
7
+ @config = config
8
+ @page_template = Snaptoken::DefaultTemplates::PAGE
9
+ @step_template = Snaptoken::DefaultTemplates::STEP
10
+ @pages = []
11
+ end
12
+
13
+ def <<(page)
14
+ @pages << page
15
+ self
16
+ end
17
+
18
+ def clear
19
+ @pages.clear
20
+ end
21
+
22
+ def step(number)
23
+ cur = 1
24
+ @pages.each do |page|
25
+ page.steps.each do |step|
26
+ return step if cur == number
27
+ cur += 1
28
+ end
29
+ end
30
+ end
31
+
32
+ def num_steps
33
+ @pages.map(&:steps).map(&:length).sum
34
+ end
35
+
36
+ def transform_diffs(transformers, &progress_block)
37
+ step_num = 1
38
+ @pages.each do |page|
39
+ page.steps.each do |step|
40
+ step.diffs.map! do |diff|
41
+ transformers.inject(diff) do |acc, transformer|
42
+ transformer.transform(acc)
43
+ end
44
+ end
45
+ progress_block.(step_num) if progress_block
46
+ step_num += 1
47
+ end
48
+ end
49
+ end
50
+
51
+ def last_synced_at
52
+ File.mtime(last_synced_path) if File.exist?(last_synced_path)
53
+ end
54
+
55
+ def synced!
56
+ FileUtils.touch(last_synced_path)
57
+ end
58
+
59
+ private
60
+
61
+ def last_synced_path
62
+ File.join(@config[:path], ".leg/last_synced")
63
+ end
64
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: leg
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jeremy Ruten
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-03-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rugged
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.25.1.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.25.1.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: redcarpet
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 3.4.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 3.4.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rouge
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 2.0.7
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.7
55
+ description:
56
+ email: jeremy.ruten@gmail.com
57
+ executables:
58
+ - leg
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - bin/leg
63
+ - lib/snaptoken.rb
64
+ - lib/snaptoken/cli.rb
65
+ - lib/snaptoken/commands.rb
66
+ - lib/snaptoken/commands/amend.rb
67
+ - lib/snaptoken/commands/base_command.rb
68
+ - lib/snaptoken/commands/build.rb
69
+ - lib/snaptoken/commands/commit.rb
70
+ - lib/snaptoken/commands/help.rb
71
+ - lib/snaptoken/commands/resolve.rb
72
+ - lib/snaptoken/commands/status.rb
73
+ - lib/snaptoken/commands/step.rb
74
+ - lib/snaptoken/default_templates.rb
75
+ - lib/snaptoken/diff.rb
76
+ - lib/snaptoken/diff_line.rb
77
+ - lib/snaptoken/diff_transformers.rb
78
+ - lib/snaptoken/diff_transformers/base_transformer.rb
79
+ - lib/snaptoken/diff_transformers/fold_sections.rb
80
+ - lib/snaptoken/diff_transformers/omit_adjacent_removals.rb
81
+ - lib/snaptoken/diff_transformers/trim_blank_lines.rb
82
+ - lib/snaptoken/markdown.rb
83
+ - lib/snaptoken/page.rb
84
+ - lib/snaptoken/representations.rb
85
+ - lib/snaptoken/representations/base_representation.rb
86
+ - lib/snaptoken/representations/git.rb
87
+ - lib/snaptoken/representations/litdiff.rb
88
+ - lib/snaptoken/step.rb
89
+ - lib/snaptoken/template.rb
90
+ - lib/snaptoken/tutorial.rb
91
+ homepage: https://github.com/yjerem/leg
92
+ licenses:
93
+ - MIT
94
+ metadata: {}
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.6.13
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: tools for .leg files
115
+ test_files: []