pnote_client 2.2.5 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/exe/pnote_clean +54 -0
- data/exe/pnote_to_json +51 -10
- data/lib/pnote_client/converters/hml_to_pnote_converter.rb +2 -1
- data/lib/pnote_client/display/console_display.rb +6 -2
- data/lib/pnote_client/documents/hml.rb +0 -8
- data/lib/pnote_client/validators/pnote_validator.rb +119 -0
- data/lib/pnote_client/version.rb +1 -1
- data/pnote_client.gemspec +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f55161957eb41b02e736937e17854bb20f353f5d67296aac4c3d71ba720462b
|
4
|
+
data.tar.gz: '05397c7bfa6567dbde1ba88d5cb086143be08a590a9f79f8bf0dc4410d9089d4'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c714b9c5cf37cd7dd00a75c97154a8ba1ccfdc46d1bba1e85e7f651abe3f329910ff07bcc9d2dab5abe0b7dc39996b2cf48137dfa55c41f1d71cd4a6e28b8f78
|
7
|
+
data.tar.gz: 18198bc923ee330a8289ba21a79f238ac6b844ecb695f540fc666f0b03c517f5705d25b28dfa323769b8cf96971366a22ac09654440d1a7c9668b223c88c36d2
|
data/exe/pnote_clean
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
## Private Note 파일(.hml)에서 필요없는 텍스트들을 삭제시켜줍니다.
|
3
|
+
require 'optparse'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
def read_file(filepath)
|
7
|
+
f = File.open(filepath, 'r')
|
8
|
+
dir_path = File.expand_path(File.dirname(f))
|
9
|
+
filename = File.basename(f, File.extname(f))
|
10
|
+
content = f.read
|
11
|
+
f.close
|
12
|
+
return filename, dir_path, content
|
13
|
+
end
|
14
|
+
|
15
|
+
def write_file(content, filepath)
|
16
|
+
f = File.open(filepath, 'w')
|
17
|
+
f.write(content)
|
18
|
+
f.close
|
19
|
+
end
|
20
|
+
|
21
|
+
options = {}
|
22
|
+
optparser = OptionParser.new do |opt|
|
23
|
+
opt.banner = 'Usage: pnote_clean [options]'
|
24
|
+
|
25
|
+
opt.on('-f', '--file [FILEPATH]', String, 'Input file path(.hml)') do |filepath|
|
26
|
+
options[:input_filepath] = filepath
|
27
|
+
end
|
28
|
+
end
|
29
|
+
optparser.parse!
|
30
|
+
|
31
|
+
if options[:input_filepath].nil?
|
32
|
+
abort(optparser.help)
|
33
|
+
end
|
34
|
+
|
35
|
+
filename, input_dir_path, hml_content = read_file(options[:input_filepath])
|
36
|
+
output_dirpath = File.join(input_dir_path, "pnote_clean", "#{filename}_output")
|
37
|
+
FileUtils.mkdir_p(output_dirpath)
|
38
|
+
output_filepath = File.join(output_dirpath, "#{filename}.hml")
|
39
|
+
|
40
|
+
junk_regex = %r(from\s*=+(?:족보닷컴.*?)=+)
|
41
|
+
clean_content = hml_content.gsub(junk_regex, '')
|
42
|
+
write_file(clean_content, output_filepath)
|
43
|
+
|
44
|
+
before_bytes = hml_content.length
|
45
|
+
before_kb = (before_bytes / 1024.0).round(2)
|
46
|
+
before_mb = (before_bytes / 1024.0 / 1024.0).round(2)
|
47
|
+
|
48
|
+
after_bytes = clean_content.length
|
49
|
+
after_kb = (after_bytes / 1024.0).round(2)
|
50
|
+
after_mb = (after_bytes / 1024.0 / 1024.0).round(2)
|
51
|
+
|
52
|
+
puts "Before Size: #{before_bytes} bytes, #{before_kb} kb, #{before_mb} mb"
|
53
|
+
puts "After Size: #{clean_content.length} bytes, #{after_kb} kb, #{after_mb} mb"
|
54
|
+
puts "Done\n"
|
data/exe/pnote_to_json
CHANGED
@@ -8,12 +8,15 @@ require 'pnote_client/converters/hml_to_pnote_converter'
|
|
8
8
|
require 'pnote_client/converters/pnote_to_json_converter'
|
9
9
|
require 'pnote_client/documents/hml'
|
10
10
|
require 'pnote_client/display/console_display'
|
11
|
+
require 'pnote_client/validators/pnote_validator'
|
11
12
|
|
12
13
|
def read_file(filepath)
|
13
14
|
f = File.open(filepath, 'r')
|
15
|
+
dir_path = File.expand_path(File.dirname(f))
|
16
|
+
filename = File.basename(f, File.extname(f))
|
14
17
|
content = f.read
|
15
18
|
f.close
|
16
|
-
return content
|
19
|
+
return filename, dir_path, content
|
17
20
|
end
|
18
21
|
|
19
22
|
def write_file(content, filepath)
|
@@ -22,6 +25,25 @@ def write_file(content, filepath)
|
|
22
25
|
f.close
|
23
26
|
end
|
24
27
|
|
28
|
+
def save_validation_log_file(result, log_filepath)
|
29
|
+
log_content = ""
|
30
|
+
log_content += "==========[Warnings]=========="
|
31
|
+
log_content += "\n"
|
32
|
+
result[:warnings].each_with_index do |warning, index|
|
33
|
+
log_content += "#{index + 1}.\n[경고 메시지]\n#{warning[:message]}\n[상세내용]\n#{warning[:detail]}\n\n\n"
|
34
|
+
end
|
35
|
+
log_content += "\n\n"
|
36
|
+
log_content += "==========[Errors]=========="
|
37
|
+
log_content += "\n"
|
38
|
+
result[:errors].each_with_index do |error, index|
|
39
|
+
log_content += "#{index + 1}.\n[에러 메시지]\n#{error[:message]}\n[상세내용]\n#{error[:detail]}\n\n\n"
|
40
|
+
end
|
41
|
+
|
42
|
+
write_file(log_content, log_filepath)
|
43
|
+
puts "로그 파일이 저장되었습니다. (#{log_filepath})"
|
44
|
+
end
|
45
|
+
|
46
|
+
# 커맨드라인 argument로 옵션 입력받기
|
25
47
|
options = {
|
26
48
|
config_filepath: File.join(File.dirname(__FILE__), '..', 'config.json'),
|
27
49
|
include_image_data: false,
|
@@ -35,10 +57,6 @@ optparser = OptionParser.new do |opt|
|
|
35
57
|
options[:input_filepath] = filepath
|
36
58
|
end
|
37
59
|
|
38
|
-
opt.on('-o', '--output [FILEPATH]', String, 'Output file path') do |filepath|
|
39
|
-
options[:output_filepath] = filepath
|
40
|
-
end
|
41
|
-
|
42
60
|
opt.on('--[no-]image', 'Include image raw data (Default: false)') do |flag|
|
43
61
|
options[:include_image_data] = flag
|
44
62
|
end
|
@@ -53,17 +71,17 @@ optparser = OptionParser.new do |opt|
|
|
53
71
|
end
|
54
72
|
optparser.parse!
|
55
73
|
|
56
|
-
if options[:input_filepath].nil?
|
74
|
+
if options[:input_filepath].nil?
|
57
75
|
abort(optparser.help)
|
58
76
|
end
|
59
77
|
|
78
|
+
# 입력된 옵션 값 확인받기
|
60
79
|
notice = <<-NOTICE
|
61
80
|
[PnoteClient Version]
|
62
81
|
#{PnoteClient::VERSION}
|
63
82
|
|
64
83
|
[변환설정]
|
65
84
|
입력파일 경로: #{options[:input_filepath]}
|
66
|
-
출력파일 경로: #{options[:output_filepath]}
|
67
85
|
이미지: #{options[:include_image_data] ? '포함' : '제외'}
|
68
86
|
설정파일 경로: #{options[:config_filepath]}
|
69
87
|
코멘트 노출시간 단위: #{options[:show_time]}초
|
@@ -77,14 +95,37 @@ if response != 'y'
|
|
77
95
|
abort
|
78
96
|
end
|
79
97
|
|
98
|
+
# 변환 준비 작업
|
80
99
|
display = PnoteClient::ConsoleDisplay.new
|
81
|
-
config_content = read_file(options[:config_filepath])
|
100
|
+
_, _, config_content = read_file(options[:config_filepath])
|
82
101
|
config = JSON.parse(config_content, symbolize_names: true)
|
83
102
|
type_style_mapper = config[:hml_pnote_styles]
|
103
|
+
input_filename, input_dir_path, hml_content = read_file(options[:input_filepath])
|
104
|
+
output_filepath = File.join(input_dir_path, input_filename + ".json")
|
105
|
+
log_filepath = File.join(input_dir_path, input_filename + ".log")
|
84
106
|
|
85
|
-
|
107
|
+
# 파일 읽어들인 뒤 PnoteDocument로 변환
|
108
|
+
hml_document = PnoteClient::Documents::Hml.parse(hml_content)
|
86
109
|
hml_to_pnote_converter = PnoteClient::Converters::HmlToPnoteConverter.new(hml_document, show_time: options[:show_time], type_style_mapper: type_style_mapper, include_image_data: options[:include_image_data])
|
87
110
|
hml_to_pnote_converter.delegate = display
|
88
111
|
pnote_document = hml_to_pnote_converter.convert
|
112
|
+
|
113
|
+
# PnoteDocument 상태 검증
|
114
|
+
validator = PnoteClient::Validators::PnoteValidator.new(pnote_document, display)
|
115
|
+
result = validator.validate
|
116
|
+
if validator.has_error?
|
117
|
+
save_validation_log_file(result, log_filepath)
|
118
|
+
puts "변환 에러가 발생했습니다. 로그파일을 확인해주세요."
|
119
|
+
abort
|
120
|
+
elsif validator.has_warning?
|
121
|
+
save_validation_log_file(result, log_filepath)
|
122
|
+
puts "#{validator.warning_count}개의 경고가 있습니다. 계속 진행하시겠습니까? (y/n)"
|
123
|
+
response = gets.chomp.downcase
|
124
|
+
if response != 'y'
|
125
|
+
abort
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# PnoteDocument를 JSON 파일로 저장
|
89
130
|
json = PnoteClient::Converters::PnoteToJsonConverter.new(pnote_document).convert
|
90
|
-
write_file(json,
|
131
|
+
write_file(json, output_filepath)
|
@@ -33,6 +33,7 @@ module PnoteClient
|
|
33
33
|
def convert
|
34
34
|
pnote_document = Documents::Pnote.new
|
35
35
|
|
36
|
+
# 한 문단(Paragraph)씩 변환
|
36
37
|
paragraph_length = @hml_document.paragraphs.length
|
37
38
|
paragraph_reader = Documents::Hml::ParagraphReader.new(@hml_document.paragraphs)
|
38
39
|
paragraph_reader.next_paragraph do |paragraph, prev_paragraph, is_continuous, index|
|
@@ -119,7 +120,7 @@ module PnoteClient
|
|
119
120
|
@delegate.paragraph_converted(count: paragraph_length, current: index) if @delegate
|
120
121
|
end
|
121
122
|
|
122
|
-
|
123
|
+
# 바이너리(이미지) 변환
|
123
124
|
binary_count = @hml_document.bin_items.length
|
124
125
|
@hml_document.bin_items.each_with_index do |bin_item, index|
|
125
126
|
raw_data = @include_image_data ? bin_item.raw_data : nil
|
@@ -6,8 +6,12 @@ module PnoteClient
|
|
6
6
|
def initialize
|
7
7
|
end
|
8
8
|
|
9
|
+
def print_validation(result)
|
10
|
+
puts "검증 결과: 경고 #{result[:warnings].length}개, 에러 #{result[:errors].length}개"
|
11
|
+
end
|
12
|
+
|
9
13
|
def paragraph_converted(count:, current:)
|
10
|
-
print_progress(count, current, "
|
14
|
+
print_progress(count, current, "문단 변환 중")
|
11
15
|
|
12
16
|
# Print newline when task is done
|
13
17
|
if count == (current + 1)
|
@@ -16,7 +20,7 @@ module PnoteClient
|
|
16
20
|
end
|
17
21
|
|
18
22
|
def binary_converted(count:, current:)
|
19
|
-
print_progress(count, current, "
|
23
|
+
print_progress(count, current, "바이너리 파일 변환 중")
|
20
24
|
|
21
25
|
# Print newline when task is done
|
22
26
|
if count == (current + 1)
|
@@ -10,14 +10,6 @@ module PnoteClient
|
|
10
10
|
class Hml
|
11
11
|
attr_reader :styles, :paragraphs, :bin_items
|
12
12
|
|
13
|
-
def self.parse_from_file(file_path)
|
14
|
-
file = File.open(file_path)
|
15
|
-
hml_content = file.read
|
16
|
-
file.close
|
17
|
-
|
18
|
-
return self.parse(hml_content)
|
19
|
-
end
|
20
|
-
|
21
13
|
def self.parse(hml_content)
|
22
14
|
styles = []
|
23
15
|
paragraphs = []
|
@@ -0,0 +1,119 @@
|
|
1
|
+
#
|
2
|
+
# Author: osh
|
3
|
+
# Created: 2019-05-20
|
4
|
+
# Last modified: 2019-05-20
|
5
|
+
|
6
|
+
module PnoteClient
|
7
|
+
module Validators
|
8
|
+
class PnoteValidator
|
9
|
+
def initialize(pnote_document, display = nil)
|
10
|
+
@pnote_document = pnote_document
|
11
|
+
@display = display
|
12
|
+
@result = {
|
13
|
+
errors: [],
|
14
|
+
warnings: []
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate
|
19
|
+
reset_result
|
20
|
+
validate_pnote_document
|
21
|
+
print_validation_result
|
22
|
+
return @result
|
23
|
+
end
|
24
|
+
|
25
|
+
def has_error?
|
26
|
+
return error_count > 0
|
27
|
+
end
|
28
|
+
|
29
|
+
def has_warning?
|
30
|
+
return warning_count > 0
|
31
|
+
end
|
32
|
+
|
33
|
+
def error_count
|
34
|
+
return @result[:errors].length
|
35
|
+
end
|
36
|
+
|
37
|
+
def warning_count
|
38
|
+
return @result[:warnings].length
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def reset_result
|
44
|
+
@result = {
|
45
|
+
errors: [],
|
46
|
+
warnings: []
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def validate_pnote_document
|
51
|
+
@pnote_document.chapters.each do |chapter|
|
52
|
+
chapter.sub_chapters.each do |sub_chapter|
|
53
|
+
chapter.practices.each do |practice|
|
54
|
+
validation_result = validate_problem(practice)
|
55
|
+
add_result(validation_result)
|
56
|
+
end
|
57
|
+
|
58
|
+
sub_chapter.exercises.each do |exercise|
|
59
|
+
validation_result = validate_problem(exercise)
|
60
|
+
add_result(validation_result)
|
61
|
+
end
|
62
|
+
|
63
|
+
sub_chapter.practices.each do |practice|
|
64
|
+
validation_result = validate_problem(practice)
|
65
|
+
add_result(validation_result)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def validate_problem(problem)
|
72
|
+
if problem.answer
|
73
|
+
if problem.answer.length > 255
|
74
|
+
return {
|
75
|
+
valid: false,
|
76
|
+
type: :error,
|
77
|
+
message: "문제 정답의 길이가 255자보다 큽니다.",
|
78
|
+
detail: "문제 질문: #{problem.question}\n문제 정답: #{problem.answer}"
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
if problem.answer.length >= 20
|
83
|
+
return {
|
84
|
+
valid: false,
|
85
|
+
type: :warning,
|
86
|
+
message: "문제 정답의 길이가 20자 이상입니다.",
|
87
|
+
detail: "문제 질문: #{problem.question}\n문제 정답: #{problem.answer}"
|
88
|
+
}
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
return {
|
93
|
+
valid: true,
|
94
|
+
type: :success
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
def add_result(validation_result)
|
99
|
+
return if validation_result[:valid]
|
100
|
+
|
101
|
+
if validation_result[:type] == :error
|
102
|
+
@result[:errors] << {
|
103
|
+
message: validation_result[:message],
|
104
|
+
detail: validation_result[:detail]
|
105
|
+
}
|
106
|
+
elsif validation_result[:type] == :warning
|
107
|
+
@result[:warnings] << {
|
108
|
+
message: validation_result[:message],
|
109
|
+
detail: validation_result[:detail]
|
110
|
+
}
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def print_validation_result
|
115
|
+
@display&.print_validation(@result)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
data/lib/pnote_client/version.rb
CHANGED
data/pnote_client.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pnote_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- bluesh55
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,18 +72,19 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.0
|
75
|
+
version: 1.1.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.0
|
82
|
+
version: 1.1.0
|
83
83
|
description:
|
84
84
|
email:
|
85
85
|
- bluesh55@naver.com
|
86
86
|
executables:
|
87
|
+
- pnote_clean
|
87
88
|
- pnote_to_json
|
88
89
|
extensions: []
|
89
90
|
extra_rdoc_files: []
|
@@ -98,6 +99,7 @@ files:
|
|
98
99
|
- bin/console
|
99
100
|
- bin/setup
|
100
101
|
- config.json
|
102
|
+
- exe/pnote_clean
|
101
103
|
- exe/pnote_to_json
|
102
104
|
- lib/pnote_client.rb
|
103
105
|
- lib/pnote_client/converters/hml_to_pnote_converter.rb
|
@@ -124,6 +126,7 @@ files:
|
|
124
126
|
- lib/pnote_client/documents/pnote/sub_chapter.rb
|
125
127
|
- lib/pnote_client/documents/pnote/teacher_comment.rb
|
126
128
|
- lib/pnote_client/utils/string_util.rb
|
129
|
+
- lib/pnote_client/validators/pnote_validator.rb
|
127
130
|
- lib/pnote_client/version.rb
|
128
131
|
- pnote_client.gemspec
|
129
132
|
homepage: https://github.com/PrivateCoach/pnote_client
|