ZMediumToMarkdown 1.6.0 → 1.6.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6026b5ebd732b82696ca5a7de549e5167067336998152c8a5e7bed751d610b78
4
- data.tar.gz: 76c24779eaceb1763225f6e5e274fb5177685b0be9f75390ce189ec047278c21
3
+ metadata.gz: a289a9d9178f9001eb97db354501e6112331be901a629719c775a28098268cc9
4
+ data.tar.gz: f116778fbd8a33287c289a905eb9026620f6d601953446cf946858ed3d108576
5
5
  SHA512:
6
- metadata.gz: db56b44ece9656eb90f703a6416c54a163f54e0208981ebf37029af9491fb39e30252b564e5d63f6defc63c72c51f3c3f944f531dfbd77ed10ba06b59abbd511
7
- data.tar.gz: b71cc148ded49d5e3bd1ab8e72d915a5b8716de041cba43d39158fd47f451ce4c52ad0d671462a3dca7571879c744fa029b0af7a7e45d2fea92788d5ee858f0b
6
+ metadata.gz: c4efcdb20c64941fc5b800c4029088179a65e0298a78a21ee68d6a967738a487395948cade619dd6420e075c882df5744373e7c661e7d47cc92b5a3ac1e8722b
7
+ data.tar.gz: 133737ccac50e0d5cddac1ea10ef10cb6e46ca972a195160b6451a04f38d6a18171fd62849769ad159bbd227614495fe4a6d7c59b5a0d60892cb0373f44b5b16
data/lib/Helper.rb CHANGED
@@ -77,10 +77,15 @@ class Helper
77
77
  end
78
78
 
79
79
  def self.createPostInfo(postInfo)
80
+
81
+ title = postInfo.title.gsub("[","")
82
+ title = title.gsub("]","")
83
+
80
84
  result = "---\n"
81
- result += "title: #{postInfo.title}\n"
85
+ result += "title: #{title}\n"
82
86
  result += "author: #{postInfo.creator}\n"
83
87
  result += "date: #{postInfo.firstPublishedAt.strftime('%Y-%m-%dT%H:%M:%S.%LZ')}\n"
88
+ result += "categories: #{postInfo.collectionName}\n"
84
89
  result += "tags: [#{postInfo.tags.join(",")}]\n"
85
90
  result += "---\n"
86
91
  result += "\r\n"
@@ -159,7 +164,7 @@ class Helper
159
164
  text += "+-----------------------------------------------------------------------------------+"
160
165
  text += "\r\n"
161
166
  text += "\r\n"
162
- text += "| **[View original post on Medium](#{postURL}) - Converted by [ZhgChgLi](https://blog.zhgchg.li)/[ZMediumToMarkdown](https://github.com/ZhgChgLi/ZMediumToMarkdown)** |"
167
+ text += "| **[View original post on Medium](#{postURL}) - Converted by [ZhgChgLi](https://zhgchg.li)/[ZMediumToMarkdown](https://github.com/ZhgChgLi/ZMediumToMarkdown)** |"
163
168
  text += "\r\n"
164
169
  text += "\r\n"
165
170
  text += "+-----------------------------------------------------------------------------------+"
@@ -167,4 +172,4 @@ class Helper
167
172
 
168
173
  text
169
174
  end
170
- end
175
+ end
@@ -10,8 +10,16 @@ class CodeBlockParser < Parser
10
10
  'CODE_BLOCK'
11
11
  end
12
12
 
13
+ def self.isCodeBlock(paragraph)
14
+ if paragraph.nil?
15
+ false
16
+ else
17
+ paragraph.type == CodeBlockParser.getTypeString()
18
+ end
19
+ end
20
+
13
21
  def parse(paragraph)
14
- if paragraph.type == CodeBlockParser.getTypeString()
22
+ if CodeBlockParser.isCodeBlock(paragraph)
15
23
  "```\n#{paragraph.text}\n```"
16
24
  else
17
25
  if !nextParser.nil?
@@ -18,11 +18,16 @@ class IMGParser < Parser
18
18
  imagePathPolicy = PathPolicy.new(pathPolicy.getAbsolutePath(nil), paragraph.postID)
19
19
  absolutePath = imagePathPolicy.getAbsolutePath(fileName)
20
20
 
21
+ comment = ""
22
+ if paragraph.text != ""
23
+ comment = " \"#{paragraph.text}\""
24
+ end
25
+
21
26
  if ImageDownloader.download(absolutePath, imageURL)
22
27
  relativePath = "#{pathPolicy.getRelativePath(nil)}/#{imagePathPolicy.getRelativePath(fileName)}"
23
- "![#{paragraph.text}](#{relativePath} \"#{paragraph.text}\")"
28
+ "\r\n![#{paragraph.text}](#{relativePath}#{comment})\r\n"
24
29
  else
25
- "![#{paragraph.text}](#{imageURL} \"#{paragraph.text}\")"
30
+ "\r\n![#{paragraph.text}](#{imageURL}#{comment})\r\n"
26
31
  end
27
32
  else
28
33
  if !nextParser.nil?
@@ -35,9 +35,9 @@ class IframeParser < Parser
35
35
  title = paragraph.iframe.title
36
36
  if ImageDownloader.download(absolutePath, imageURL)
37
37
  relativePath = "#{pathPolicy.getRelativePath(nil)}/#{imagePathPolicy.getRelativePath(fileName)}"
38
- result = "\n[![#{title}](#{relativePath} \"#{title}\")](#{params["url"]})"
38
+ result = "\r\n[![#{title}](#{relativePath} \"#{title}\")](#{params["url"]})\r\n"
39
39
  else
40
- result = "\n[#{title}](#{params["url"]})"
40
+ result = "\r\n[#{title}](#{params["url"]})\r\n"
41
41
  end
42
42
  end
43
43
  else
@@ -55,7 +55,7 @@ class IframeParser < Parser
55
55
  gistHTML.search('a').each do |a|
56
56
  if a.text == 'view raw'
57
57
  gistRAW = Request.body(Request.URL(a['href']))
58
- result = "```#{lang}\n#{gistRAW}\n```"
58
+ result = "```#{lang.downcase}\n#{gistRAW}\n```"
59
59
  end
60
60
  end
61
61
  end
@@ -23,19 +23,7 @@ class LinkParser
23
23
 
24
24
  postPath = link.split("/").last
25
25
  if !usersPostURLs.find { |usersPostURL| usersPostURL.split("/").last.split("-").last == postPath.split("-").last }.nil?
26
- markdownString = markdownString.sub! link, postPath
27
- end
28
- else
29
- if !(link =~ /\A#{URI::regexp(['http', 'https'])}\z/)
30
- # medium will give you an relative path if url is medium's post (due to we use html to markdown render)
31
- # e.g. /zrealm-ios-dev/visitor-pattern-in-ios-swift-ba5773a7bfea
32
- # it's not a vaild url
33
-
34
- # fullfill url from markup attribute
35
- match = markupLinks.find{ |markupLink| markupLink.include? link }
36
- if !match.nil?
37
- markdownString = markdownString.sub! link, match
38
- end
26
+ markdownString = markdownString.sub! link, "#{postPath}"
39
27
  end
40
28
  end
41
29
  end
@@ -32,12 +32,10 @@ class MarkupStyleRender
32
32
  chars = {}
33
33
  index = 0
34
34
 
35
- emojiRegex = /[\u{203C}\u{2049}\u{20E3}\u{2122}\u{2139}\u{2194}-\u{2199}\u{21A9}-\u{21AA}\u{231A}-\u{231B}\u{23E9}-\u{23EC}\u{23F0}\u{23F3}\u{24C2}\u{25AA}-\u{25AB}\u{25B6}\u{25C0}\u{25FB}-\u{25FE}\u{2600}-\u{2601}\u{260E}\u{2611}\u{2614}-\u{2615}\u{261D}\u{263A}\u{2648}-\u{2653}\u{2660}\u{2663}\u{2665}-\u{2666}\u{2668}\u{267B}\u{267F}\u{2693}\u{26A0}-\u{26A1}\u{26AA}-\u{26AB}\u{26BD}-\u{26BE}\u{26C4}-\u{26C5}\u{26CE}\u{26D4}\u{26EA}\u{26F2}-\u{26F3}\u{26F5}\u{26FA}\u{26FD}\u{2702}\u{2705}\u{2708}-\u{270C}\u{270F}\u{2712}\u{2714}\u{2716}\u{2728}\u{2733}-\u{2734}\u{2744}\u{2747}\u{274C}\u{274E}\u{2753}-\u{2755}\u{2757}\u{2764}\u{2795}-\u{2797}\u{27A1}\u{27B0}\u{2934}-\u{2935}\u{2B05}-\u{2B07}\u{2B1B}-\u{2B1C}\u{2B50}\u{2B55}\u{3030}\u{303D}\u{3297}\u{3299}\u{1F004}\u{1F0CF}\u{1F170}-\u{1F171}\u{1F17E}-\u{1F17F}\u{1F18E}\u{1F191}-\u{1F19A}\u{1F1E7}-\u{1F1EC}\u{1F1EE}-\u{1F1F0}\u{1F1F3}\u{1F1F5}\u{1F1F7}-\u{1F1FA}\u{1F201}-\u{1F202}\u{1F21A}\u{1F22F}\u{1F232}-\u{1F23A}\u{1F250}-\u{1F251}\u{1F300}-\u{1F320}\u{1F330}-\u{1F335}\u{1F337}-\u{1F37C}\u{1F380}-\u{1F393}\u{1F3A0}-\u{1F3C4}\u{1F3C6}-\u{1F3CA}\u{1F3E0}-\u{1F3F0}\u{1F400}-\u{1F43E}\u{1F440}\u{1F442}-\u{1F4F7}\u{1F4F9}-\u{1F4FC}\u{1F500}-\u{1F507}\u{1F509}-\u{1F53D}\u{1F550}-\u{1F567}\u{1F5FB}-\u{1F640}\u{1F645}-\u{1F64F}\u{1F680}-\u{1F68A}]/
36
- excludesEmojis = ["⚠"]
37
35
  paragraph.text.each_char do |char|
38
36
  chars[index] = TextChar.new([char], "Text")
39
37
  index += 1
40
- if char =~ emojiRegex && !excludesEmojis.include?(char)
38
+ if char.bytes.length >= 4
41
39
  # some emoji need more space (in Medium)
42
40
  chars[index] = TextChar.new([], "Text")
43
41
  index += 1
data/lib/Post.rb CHANGED
@@ -9,7 +9,7 @@ require 'date'
9
9
  class Post
10
10
 
11
11
  class PostInfo
12
- attr_accessor :title, :tags, :creator, :firstPublishedAt, :latestPublishedAt
12
+ attr_accessor :title, :tags, :creator, :firstPublishedAt, :latestPublishedAt, :collectionName
13
13
  end
14
14
 
15
15
  def self.getPostIDFromPostURLString(postURLString)
@@ -68,6 +68,13 @@ class Post
68
68
  postInfo.creator = content&.dig(creatorRef, "name")
69
69
  end
70
70
 
71
+ colletionRef = content&.dig("Post:#{postID}", "collection", "__ref")
72
+ if !colletionRef.nil?
73
+ postInfo.collectionName = content&.dig(colletionRef, "name")
74
+ end
75
+
76
+
77
+
71
78
  firstPublishedAt = content&.dig("Post:#{postID}", "firstPublishedAt")
72
79
  if !firstPublishedAt.nil?
73
80
  postInfo.firstPublishedAt = Time.at(0, firstPublishedAt, :millisecond)
@@ -26,6 +26,7 @@ require "PathPolicy"
26
26
  require "Request"
27
27
  require "Post"
28
28
  require "User"
29
+ require 'date'
29
30
 
30
31
  class ZMediumFetcher
31
32
 
@@ -204,7 +205,7 @@ class ZMediumFetcher
204
205
 
205
206
  postPathPolicy = PathPolicy.new(pathPolicy.getAbsolutePath(nil), "posts")
206
207
 
207
- imagePathPolicy = PathPolicy.new(postPathPolicy.getAbsolutePath(nil), "images")
208
+ imagePathPolicy = PathPolicy.new(postPathPolicy.getAbsolutePath(nil), "assets")
208
209
  startParser = buildParser(imagePathPolicy)
209
210
 
210
211
  progress.totalPostParagraphsLength = paragraphs.length
@@ -212,7 +213,9 @@ class ZMediumFetcher
212
213
  progress.message = "Converting Post..."
213
214
  progress.printLog()
214
215
 
215
- absolutePath = postPathPolicy.getAbsolutePath("#{postPath}.md")
216
+ postWithDatePath = "#{postInfo.firstPublishedAt.strftime("%Y-%m-%d")}-#{postPath}"
217
+
218
+ absolutePath = postPathPolicy.getAbsolutePath("#{postWithDatePath}.md")
216
219
 
217
220
  # if markdown file is exists and last modification time is >= latestPublishedAt(last update post time on medium)
218
221
  if File.file?(absolutePath) && File.mtime(absolutePath) >= postInfo.latestPublishedAt
@@ -228,8 +231,11 @@ class ZMediumFetcher
228
231
 
229
232
  index = 0
230
233
  paragraphs.each do |paragraph|
231
- markupParser = MarkupParser.new(paragraph)
232
- paragraph.text = markupParser.parse()
234
+ if !(CodeBlockParser.isCodeBlock(paragraph) || PREParser.isPRE(paragraph))
235
+ markupParser = MarkupParser.new(paragraph)
236
+ paragraph.text = markupParser.parse()
237
+ end
238
+
233
239
  result = startParser.parse(paragraph)
234
240
 
235
241
  if !linkParser.nil?
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ZMediumToMarkdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ZhgChgLi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-06 00:00:00.000000000 Z
11
+ date: 2022-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri