jekyll-artisync 0.6 → 0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/syncers/abstract_syncer.rb +4 -0
- data/lib/syncers/medium_syncer.rb +31 -0
- data/lib/syncers/per_node_syncer.rb +18 -2
- data/lib/syncers/syncer_factory.rb +4 -0
- data/lib/syncers/zhihu_syncer.rb +6 -7
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3852b83cf7f0b161334e8dea66dc2b71800263857d2585923e02a680b2d6f9aa
|
4
|
+
data.tar.gz: 7ae6fe9c091748ab992931abb108c3db1d4f246f8a43aa886e67828352c2f761
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83e4b1e795cc438fd4383d8f414220bd47a757dbead917976594f44cf9f5cfef35c1cfba46dedab757e2cfbdea555e8e3487cfad4ddbdbc9df5be490ca8b9a03
|
7
|
+
data.tar.gz: 3018a75eebccfa292ad20469877cd17c3e37a57954db6fd8eaf0957c5ef1f29297dc2e2c0e8efb96651318c104f49d96c882170d166ad05f81e21d85f2165c1f
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'per_node_syncer'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
|
5
|
+
class MediumSyncer < PerNodeSyncer
|
6
|
+
def get_article_xpath
|
7
|
+
'//article/div/section/div/div'
|
8
|
+
end
|
9
|
+
|
10
|
+
# override
|
11
|
+
def get_article_nodes
|
12
|
+
page_html = self._fetch_html
|
13
|
+
article = Nokogiri::HTML(page_html).xpath(self.get_article_xpath)
|
14
|
+
|
15
|
+
# Medium embeds Author section, which is not needed for article
|
16
|
+
article.children[1..]
|
17
|
+
end
|
18
|
+
|
19
|
+
def _handle_node(node)
|
20
|
+
case node.name
|
21
|
+
when "figure"
|
22
|
+
img_nodes = node.css('img')
|
23
|
+
node = img_nodes[-1] if img_nodes
|
24
|
+
# to make sure image scales right
|
25
|
+
node.remove_attribute('width')
|
26
|
+
node.remove_attribute('height')
|
27
|
+
end
|
28
|
+
node.to_html
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -1,14 +1,30 @@
|
|
1
1
|
require_relative 'abstract_syncer'
|
2
2
|
require 'nokogiri'
|
3
3
|
|
4
|
+
module NodeAttrModule
|
5
|
+
ATTRS = ['class', 'id']
|
6
|
+
def NodeAttrModule.remove_common_attr(node)
|
7
|
+
ATTRS.each do |attr|
|
8
|
+
node.remove_attribute(attr) if node[attr]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
4
13
|
|
5
14
|
class PerNodeSyncer < AbstractSyncer
|
15
|
+
include NodeAttrModule
|
6
16
|
|
7
|
-
def
|
17
|
+
def get_article_nodes
|
8
18
|
page_html = self._fetch_html
|
9
19
|
article = Nokogiri::HTML(page_html).xpath(self.get_article_xpath)
|
20
|
+
article.children
|
21
|
+
end
|
22
|
+
|
23
|
+
def gen_html
|
24
|
+
article_nodes = self.get_article_nodes
|
10
25
|
content = []
|
11
|
-
|
26
|
+
article_nodes.each do |node|
|
27
|
+
NodeAttrModule.remove_common_attr(node)
|
12
28
|
content.append self._handle_node(node)
|
13
29
|
end
|
14
30
|
|
@@ -1,9 +1,11 @@
|
|
1
1
|
require_relative 'zhihu_syncer'
|
2
2
|
require_relative 'weixin_syncer'
|
3
|
+
require_relative 'medium_syncer'
|
3
4
|
|
4
5
|
|
5
6
|
ZHIHU_ZHUANLAN = 'zhuanlan.zhihu.com'
|
6
7
|
WEIXIN = 'mp.weixin.qq.com'
|
8
|
+
MEDIUM = 'medium.com'
|
7
9
|
|
8
10
|
class SyncerFactory
|
9
11
|
def self.get_syncer(uri)
|
@@ -14,6 +16,8 @@ class SyncerFactory
|
|
14
16
|
return ZhihuSyncer.new(uri)
|
15
17
|
when WEIXIN
|
16
18
|
return WeixinSyncer.new(uri)
|
19
|
+
when MEDIUM
|
20
|
+
return MediumSyncer.new(uri)
|
17
21
|
else
|
18
22
|
raise "Not supported website for host: #{host_name}"
|
19
23
|
end
|
data/lib/syncers/zhihu_syncer.rb
CHANGED
@@ -10,14 +10,13 @@ class ZhihuSyncer < PerNodeSyncer
|
|
10
10
|
def _handle_node(node)
|
11
11
|
case node.name
|
12
12
|
when 'figure'
|
13
|
-
img_node = node.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
img_node['src'] = img_url
|
13
|
+
img_node = node.css('img')[-1]
|
14
|
+
if img_node
|
15
|
+
node = img_node
|
16
|
+
node['src'] = node['data-actualsrc']
|
17
|
+
end
|
20
18
|
end
|
19
|
+
|
21
20
|
node.to_html
|
22
21
|
end
|
23
22
|
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-artisync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Junhan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
12
|
-
dependencies:
|
11
|
+
date: 2020-06-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
13
27
|
description: Take an article from a given site and display on current Jekyll page.
|
14
28
|
email:
|
15
29
|
- junhanoct@gmail.com
|
@@ -19,6 +33,7 @@ extra_rdoc_files: []
|
|
19
33
|
files:
|
20
34
|
- lib/jekyll-artisync.rb
|
21
35
|
- lib/syncers/abstract_syncer.rb
|
36
|
+
- lib/syncers/medium_syncer.rb
|
22
37
|
- lib/syncers/per_node_syncer.rb
|
23
38
|
- lib/syncers/syncer_factory.rb
|
24
39
|
- lib/syncers/weixin_syncer.rb
|