social_linker 0.2 → 0.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 +40 -3
- data/app/assets/images/social_linker/icons.svg +56 -0
- data/app/assets/stylesheets/social_linker/icons.scss +58 -0
- data/app/helpers/view_helpers.rb +106 -0
- data/lib/social_linker.rb +8 -8
- data/lib/social_linker/engine.rb +8 -0
- data/lib/social_linker/version.rb +1 -1
- metadata +6 -4
- data/lib/social_linker/railtie.rb +0 -9
- data/lib/social_linker/view_helpers.rb +0 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c3db60b8186c8555f88a031d0bb93228630dc27
|
4
|
+
data.tar.gz: 10b7a36a98551d9d017b3b089cc28af4594f3b70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e16b1ef40ad811b71d2de74112f7490724b46276022ee1ea46da7b6fb590dd7896bd0a9a7a48686624cc6afaf692a67cd27fd70c4a84d4db27015ef92190721
|
7
|
+
data.tar.gz: 6c4f099066e9dcbc0b804a2329402edb3b9a0facb13b5777727fbaf65886da7288027e95ba081ebca588f97d518cf014e5a27f98cf7ea0bccd6e7f64814ac353
|
data/README.md
CHANGED
@@ -101,11 +101,48 @@ Just set the following, which should give you a reasonable default.
|
|
101
101
|
site_title_postfix: "your sitename" # optional
|
102
102
|
})
|
103
103
|
|
104
|
+
### Link helper with SVG icons
|
105
|
+
|
106
|
+
Use the following to create a sharelink to Facebook
|
107
|
+
|
108
|
+
social_link_to @subject, :facebook
|
109
|
+
|
110
|
+
This results in a simple `<a href>` containing the share link and an svg image.
|
111
|
+
This SVG image may or may not be found depending on your asset initialization,
|
112
|
+
make sure that config/initializers/assets.rb contains the following line:
|
113
|
+
|
114
|
+
Rails.application.config.assets.precompile += %w( social_linker/icons.svg )
|
115
|
+
|
116
|
+
(if you don't it probably will be suggested to you by Rails)
|
117
|
+
|
118
|
+
If you want to change the content of the link, pass a block, e.g.:
|
119
|
+
|
120
|
+
social_link_to @subject, :facebook do
|
121
|
+
"Share on Facebook!"
|
122
|
+
end
|
123
|
+
|
124
|
+
To make sure that the icons align well, make sure to include the styling, include
|
125
|
+
the following line to the head of your application.ccs file:
|
126
|
+
|
127
|
+
*= require social_linker/icons
|
128
|
+
|
129
|
+
#### Tip: SVG4Everyone
|
130
|
+
|
131
|
+
When using SVG and serving your pages to older browsers, make sure you use something
|
132
|
+
like SVG4Everyone. Include in your gemfile:
|
133
|
+
|
134
|
+
source 'https://rails-assets.org' do
|
135
|
+
gem 'rails-assets-svg4everybody'
|
136
|
+
end
|
137
|
+
|
138
|
+
and include the following line to the head of your `application.js` file:
|
139
|
+
|
140
|
+
//= require svg4everybody
|
141
|
+
|
104
142
|
## TODO
|
105
143
|
|
106
|
-
*
|
107
|
-
*
|
108
|
-
* More share methods!
|
144
|
+
* Idea: maybe improve share helpers with [javascript timeout workarounds](http://stackoverflow.com/questions/7231085/how-to-fall-back-to-marketplace-when-android-custom-url-scheme-not-handled) for native alternatives (although Twitter and facebook work well)
|
145
|
+
* More share methods (pull request welcome)
|
109
146
|
|
110
147
|
## Development
|
111
148
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
<svg style="position: absolute; width: 0; height: 0;" width="0" height="0" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
2
|
+
<defs>
|
3
|
+
<symbol id="icon-email" viewBox="0 0 32 32">
|
4
|
+
<title>email</title>
|
5
|
+
<path class="path1" d="M32 12.679v14.179q0 1.179-0.839 2.018t-2.018 0.839h-26.286q-1.179 0-2.018-0.839t-0.839-2.018v-14.179q0.786 0.875 1.804 1.554 6.464 4.393 8.875 6.161 1.018 0.75 1.652 1.17t1.688 0.857 1.964 0.438h0.036q0.911 0 1.964-0.438t1.688-0.857 1.652-1.17q3.036-2.196 8.893-6.161 1.018-0.696 1.786-1.554zM32 7.429q0 1.411-0.875 2.696t-2.179 2.196q-6.714 4.661-8.357 5.804-0.179 0.125-0.759 0.545t-0.964 0.679-0.929 0.58-1.027 0.482-0.893 0.161h-0.036q-0.411 0-0.893-0.161t-1.027-0.482-0.929-0.58-0.964-0.679-0.759-0.545q-1.625-1.143-4.679-3.259t-3.661-2.545q-1.107-0.75-2.089-2.063t-0.982-2.438q0-1.393 0.741-2.321t2.116-0.929h26.286q1.161 0 2.009 0.839t0.848 2.018z"></path>
|
6
|
+
</symbol>
|
7
|
+
<symbol id="icon-google" viewBox="0 0 27 32">
|
8
|
+
<title>google</title>
|
9
|
+
<path class="path1" d="M13.714 14.036h12.946q0.214 1.196 0.214 2.286 0 3.875-1.625 6.92t-4.634 4.759-6.902 1.714q-2.804 0-5.339-1.080t-4.375-2.92-2.92-4.375-1.080-5.339 1.080-5.339 2.92-4.375 4.375-2.92 5.339-1.080q5.357 0 9.196 3.589l-3.732 3.589q-2.196-2.125-5.464-2.125-2.304 0-4.259 1.161t-3.098 3.152-1.143 4.348 1.143 4.348 3.098 3.152 4.259 1.161q1.554 0 2.857-0.429t2.143-1.071 1.464-1.464 0.92-1.554 0.402-1.393h-7.786v-4.714z"></path>
|
10
|
+
</symbol>
|
11
|
+
<symbol id="icon-sticky-note-o" viewBox="0 0 27 32">
|
12
|
+
<title>sticky-note-o</title>
|
13
|
+
<path class="path1" d="M25 22.857h-4.429v4.429q0.518-0.179 0.732-0.393l3.304-3.304q0.214-0.214 0.393-0.732zM20 20.571h5.143v-16h-22.857v22.857h16v-5.143q0-0.714 0.5-1.214t1.214-0.5zM27.429 4v18.286q0 0.714-0.357 1.571t-0.857 1.357l-3.286 3.286q-0.5 0.5-1.357 0.857t-1.571 0.357h-18.286q-0.714 0-1.214-0.5t-0.5-1.214v-24q0-0.714 0.5-1.214t1.214-0.5h24q0.714 0 1.214 0.5t0.5 1.214z"></path>
|
14
|
+
</symbol>
|
15
|
+
<symbol id="icon-share-square-o" viewBox="0 0 30 32">
|
16
|
+
<title>share-square-o</title>
|
17
|
+
<path class="path1" d="M25.143 17.661v4.625q0 2.125-1.509 3.634t-3.634 1.509h-14.857q-2.125 0-3.634-1.509t-1.509-3.634v-14.857q0-2.125 1.509-3.634t3.634-1.509h4.554q0.232 0 0.402 0.17t0.17 0.402q0 0.482-0.464 0.571-1.375 0.464-2.375 1.071-0.179 0.071-0.286 0.071h-2q-1.179 0-2.018 0.839t-0.839 2.018v14.857q0 1.179 0.839 2.018t2.018 0.839h14.857q1.179 0 2.018-0.839t0.839-2.018v-3.821q0-0.339 0.321-0.518 0.5-0.232 0.964-0.661 0.286-0.286 0.625-0.143 0.375 0.161 0.375 0.518zM29.375 8.804l-6.857 6.857q-0.321 0.339-0.804 0.339-0.214 0-0.446-0.089-0.696-0.304-0.696-1.054v-3.429h-2.857q-5.768 0-7.821 2.339-2.125 2.446-1.321 8.446 0.054 0.411-0.357 0.607-0.143 0.036-0.214 0.036-0.286 0-0.464-0.232-0.179-0.25-0.375-0.554t-0.705-1.223-0.884-1.777-0.688-2.036-0.313-2.179q0-0.875 0.063-1.625t0.25-1.607 0.5-1.571 0.839-1.455 1.223-1.321 1.687-1.098 2.223-0.866 2.848-0.545 3.509-0.196h2.857v-3.429q0-0.75 0.696-1.054 0.232-0.089 0.446-0.089 0.464 0 0.804 0.339l6.857 6.857q0.339 0.339 0.339 0.804t-0.339 0.804z"></path>
|
18
|
+
</symbol>
|
19
|
+
<symbol id="icon-search" viewBox="0 0 30 32">
|
20
|
+
<title>search</title>
|
21
|
+
<path class="path1" d="M20.571 14.857q0-3.304-2.348-5.652t-5.652-2.348-5.652 2.348-2.348 5.652 2.348 5.652 5.652 2.348 5.652-2.348 2.348-5.652zM29.714 29.714q0 0.929-0.679 1.607t-1.607 0.679q-0.964 0-1.607-0.679l-6.125-6.107q-3.196 2.214-7.125 2.214-2.554 0-4.884-0.991t-4.018-2.679-2.679-4.018-0.991-4.884 0.991-4.884 2.679-4.018 4.018-2.679 4.884-0.991 4.884 0.991 4.018 2.679 2.679 4.018 0.991 4.884q0 3.929-2.214 7.125l6.125 6.125q0.661 0.661 0.661 1.607z"></path>
|
22
|
+
</symbol>
|
23
|
+
<symbol id="icon-heart-o" viewBox="0 0 32 32">
|
24
|
+
<title>heart-o</title>
|
25
|
+
<path class="path1" d="M29.714 10.643q0-1.446-0.384-2.554t-0.982-1.759-1.455-1.063-1.679-0.554-1.75-0.143-2 0.455-1.973 1.143-1.545 1.286-1.071 1.098q-0.321 0.393-0.875 0.393t-0.875-0.393q-0.429-0.5-1.071-1.098t-1.545-1.286-1.973-1.143-2-0.455-1.75 0.143-1.679 0.554-1.455 1.063-0.982 1.759-0.384 2.554q0 3 3.339 6.339l10.375 10 10.357-9.982q3.357-3.357 3.357-6.357zM32 10.643q0 3.946-4.089 8.036l-11.125 10.714q-0.321 0.321-0.786 0.321t-0.786-0.321l-11.143-10.75q-0.179-0.143-0.491-0.464t-0.991-1.17-1.214-1.741-0.955-2.161-0.42-2.464q0-3.929 2.268-6.143t6.268-2.214q1.107 0 2.259 0.384t2.143 1.036 1.705 1.223 1.357 1.214q0.643-0.643 1.357-1.214t1.705-1.223 2.143-1.036 2.259-0.384q4 0 6.268 2.214t2.268 6.143z"></path>
|
26
|
+
</symbol>
|
27
|
+
<symbol id="icon-heart" viewBox="0 0 32 32">
|
28
|
+
<title>heart</title>
|
29
|
+
<path class="path1" d="M16 29.714q-0.464 0-0.786-0.321l-11.143-10.75q-0.179-0.143-0.491-0.464t-0.991-1.17-1.214-1.741-0.955-2.161-0.42-2.464q0-3.929 2.268-6.143t6.268-2.214q1.107 0 2.259 0.384t2.143 1.036 1.705 1.223 1.357 1.214q0.643-0.643 1.357-1.214t1.705-1.223 2.143-1.036 2.259-0.384q4 0 6.268 2.214t2.268 6.143q0 3.946-4.089 8.036l-11.125 10.714q-0.321 0.321-0.786 0.321z"></path>
|
30
|
+
</symbol>
|
31
|
+
<symbol id="icon-twitter" viewBox="0 0 30 32">
|
32
|
+
<title>twitter</title>
|
33
|
+
<path class="path1" d="M28.929 7.286q-1.196 1.75-2.893 2.982 0.018 0.25 0.018 0.75 0 2.321-0.679 4.634t-2.063 4.437-3.295 3.759-4.607 2.607-5.768 0.973q-4.839 0-8.857-2.589 0.625 0.071 1.393 0.071 4.018 0 7.161-2.464-1.875-0.036-3.357-1.152t-2.036-2.848q0.589 0.089 1.089 0.089 0.768 0 1.518-0.196-2-0.411-3.313-1.991t-1.313-3.67v-0.071q1.214 0.679 2.607 0.732-1.179-0.786-1.875-2.054t-0.696-2.75q0-1.571 0.786-2.911 2.161 2.661 5.259 4.259t6.634 1.777q-0.143-0.679-0.143-1.321 0-2.393 1.688-4.080t4.080-1.688q2.5 0 4.214 1.821 1.946-0.375 3.661-1.393-0.661 2.054-2.536 3.179 1.661-0.179 3.321-0.893z"></path>
|
34
|
+
</symbol>
|
35
|
+
<symbol id="icon-pinterest" viewBox="0 0 27 32">
|
36
|
+
<title>pinterest</title>
|
37
|
+
<path class="path1" d="M27.429 16q0 3.732-1.839 6.884t-4.991 4.991-6.884 1.839q-1.982 0-3.893-0.571 1.054-1.661 1.393-2.929 0.161-0.607 0.964-3.768 0.357 0.696 1.304 1.205t2.036 0.509q2.161 0 3.857-1.223t2.625-3.366 0.929-4.821q0-2.036-1.063-3.821t-3.080-2.911-4.554-1.125q-1.875 0-3.5 0.518t-2.759 1.375-1.946 1.973-1.196 2.313-0.384 2.393q0 1.857 0.714 3.268t2.089 1.982q0.536 0.214 0.679-0.357 0.036-0.125 0.143-0.554t0.143-0.536q0.107-0.411-0.196-0.768-0.911-1.089-0.911-2.696 0-2.696 1.866-4.634t4.884-1.938q2.696 0 4.205 1.464t1.509 3.804q0 3.036-1.223 5.161t-3.134 2.125q-1.089 0-1.75-0.777t-0.411-1.866q0.143-0.625 0.473-1.67t0.536-1.839 0.205-1.348q0-0.893-0.482-1.482t-1.375-0.589q-1.107 0-1.875 1.018t-0.768 2.536q0 1.304 0.446 2.179l-1.768 7.464q-0.304 1.25-0.232 3.161-3.679-1.625-5.946-5.018t-2.268-7.554q0-3.732 1.839-6.884t4.991-4.991 6.884-1.839 6.884 1.839 4.991 4.991 1.839 6.884z"></path>
|
38
|
+
</symbol>
|
39
|
+
<symbol id="icon-facebook" viewBox="0 0 27 32">
|
40
|
+
<title>facebook</title>
|
41
|
+
<path class="path1" d="M25.911 2.286q0.625 0 1.071 0.446t0.446 1.071v24.393q0 0.625-0.446 1.071t-1.071 0.446h-6.982v-10.625h3.554l0.536-4.143h-4.089v-2.643q0-1 0.42-1.5t1.634-0.5l2.179-0.018v-3.696q-1.125-0.161-3.179-0.161-2.429 0-3.884 1.429t-1.455 4.036v3.054h-3.571v4.143h3.571v10.625h-13.125q-0.625 0-1.071-0.446t-0.446-1.071v-24.393q0-0.625 0.446-1.071t1.071-0.446h24.393z"></path>
|
42
|
+
</symbol>
|
43
|
+
<symbol id="icon-linkedin" viewBox="0 0 27 32">
|
44
|
+
<title>linkedin</title>
|
45
|
+
<path class="path1" d="M6.232 11.161v17.696h-5.893v-17.696h5.893zM6.607 5.696q0.018 1.304-0.902 2.179t-2.42 0.875h-0.036q-1.464 0-2.357-0.875t-0.893-2.179q0-1.321 0.92-2.188t2.402-0.866 2.375 0.866 0.911 2.188zM27.429 18.714v10.143h-5.875v-9.464q0-1.875-0.723-2.938t-2.259-1.063q-1.125 0-1.884 0.616t-1.134 1.527q-0.196 0.536-0.196 1.446v9.875h-5.875q0.036-7.125 0.036-11.554t-0.018-5.286l-0.018-0.857h5.875v2.571h-0.036q0.357-0.571 0.732-1t1.009-0.929 1.554-0.777 2.045-0.277q3.054 0 4.911 2.027t1.857 5.938z"></path>
|
46
|
+
</symbol>
|
47
|
+
<symbol id="icon-whatsapp" viewBox="0 0 27 32">
|
48
|
+
<title>whatsapp</title>
|
49
|
+
<path class="path1" d="M17.589 17.393q0.232 0 1.741 0.786t1.598 0.946q0.036 0.089 0.036 0.268 0 0.589-0.304 1.357-0.286 0.696-1.268 1.17t-1.821 0.473q-1.018 0-3.393-1.107-1.75-0.804-3.036-2.107t-2.643-3.304q-1.286-1.911-1.268-3.464v-0.143q0.054-1.625 1.321-2.821 0.429-0.393 0.929-0.393 0.107 0 0.321 0.027t0.339 0.027q0.339 0 0.473 0.116t0.277 0.491q0.143 0.357 0.589 1.571t0.446 1.339q0 0.375-0.616 1.027t-0.616 0.83q0 0.125 0.089 0.268 0.607 1.304 1.821 2.446 1 0.946 2.696 1.804 0.214 0.125 0.393 0.125 0.268 0 0.964-0.866t0.929-0.866zM13.964 26.857q2.268 0 4.348-0.893t3.58-2.393 2.393-3.58 0.893-4.348-0.893-4.348-2.393-3.58-3.58-2.393-4.348-0.893-4.348 0.893-3.58 2.393-2.393 3.58-0.893 4.348q0 3.625 2.143 6.571l-1.411 4.161 4.321-1.375q2.821 1.857 6.161 1.857zM13.964 2.179q2.732 0 5.223 1.071t4.295 2.875 2.875 4.295 1.071 5.223-1.071 5.223-2.875 4.295-4.295 2.875-5.223 1.071q-3.482 0-6.518-1.679l-7.446 2.393 2.429-7.232q-1.929-3.179-1.929-6.946 0-2.732 1.071-5.223t2.875-4.295 4.295-2.875 5.223-1.071z"></path>
|
50
|
+
</symbol>
|
51
|
+
<symbol id="icon-tumblr" viewBox="0 0 20 32">
|
52
|
+
<title>tumblr</title>
|
53
|
+
<path class="path1" d="M16.857 23.732l1.429 4.232q-0.411 0.625-1.982 1.179t-3.161 0.571q-1.857 0.036-3.402-0.464t-2.545-1.321-1.696-1.893-0.991-2.143-0.295-2.107v-9.714h-3v-3.839q1.286-0.464 2.304-1.241t1.625-1.607 1.036-1.821 0.607-1.768 0.268-1.58q0.018-0.089 0.080-0.152t0.134-0.063h4.357v7.571h5.946v4.5h-5.964v9.25q0 0.536 0.116 1t0.402 0.938 0.884 0.741 1.455 0.25q1.393-0.036 2.393-0.518z"></path>
|
54
|
+
</symbol>
|
55
|
+
</defs>
|
56
|
+
</svg>
|
@@ -0,0 +1,58 @@
|
|
1
|
+
.icon {
|
2
|
+
display: inline-block;
|
3
|
+
width: 1em;
|
4
|
+
height: 1em;
|
5
|
+
fill: currentColor;
|
6
|
+
&:hover {
|
7
|
+
opacity: 0.8
|
8
|
+
};
|
9
|
+
&.icon-default-style {
|
10
|
+
fill: #000;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
/* =======================================================================================
|
15
|
+
Example showing how to change the color/size of the icons:
|
16
|
+
.icon-name {
|
17
|
+
font-size: 32px; // works because "width" & "height" were set using em units
|
18
|
+
color: red; // works for single-colored icons, because "fill" was set to "currentColor"
|
19
|
+
}
|
20
|
+
======================================================================================== */
|
21
|
+
|
22
|
+
|
23
|
+
.icon-sticky-note-o {
|
24
|
+
width: 0.857421875em;
|
25
|
+
}
|
26
|
+
|
27
|
+
.icon-share-square-o {
|
28
|
+
width: 0.9287109375em;
|
29
|
+
}
|
30
|
+
|
31
|
+
.icon-search {
|
32
|
+
width: 0.9287109375em;
|
33
|
+
}
|
34
|
+
|
35
|
+
.icon-twitter {
|
36
|
+
width: 0.9287109375em;
|
37
|
+
}
|
38
|
+
|
39
|
+
.icon-pinterest {
|
40
|
+
width: 0.857421875em;
|
41
|
+
}
|
42
|
+
|
43
|
+
.icon-facebook {
|
44
|
+
width: 0.857421875em;
|
45
|
+
}
|
46
|
+
|
47
|
+
.icon-google {
|
48
|
+
width: 0.83984375em;
|
49
|
+
}
|
50
|
+
.icon-linkedin {
|
51
|
+
width: 0.857421875em;
|
52
|
+
}
|
53
|
+
.icon-whatsapp {
|
54
|
+
width: 0.857421875em;
|
55
|
+
}
|
56
|
+
.icon-tumblr {
|
57
|
+
width: 0.609375em;
|
58
|
+
}
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module ViewHelpers
|
2
|
+
# renders a metatag
|
3
|
+
# param [String, Symbol] name (or property) (defaults to name, values starting with 'og:' (opengraph) will be using the property attribute)
|
4
|
+
# param [String, Symbol] content (the value for the name or the property)
|
5
|
+
# @returns [String, nil] nil is returned when the content is empty
|
6
|
+
def meta_tag(name, content)
|
7
|
+
name_or_property_section = name.start_with?("og:") ? "property=\"#{erb_sanitized(name)}\"" : "name=\"#{erb_sanitized(name)}\""
|
8
|
+
"<meta #{name_or_property_section} content=\"#{erb_sanitized(content)}\" />" if content and content != ""
|
9
|
+
end
|
10
|
+
|
11
|
+
def erb_sanitized(value)
|
12
|
+
if defined? Rails
|
13
|
+
h(value)
|
14
|
+
else
|
15
|
+
ERB::Util.h(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# header_meta_tags renders the most important metatags based on the SocialLinker::Subject
|
20
|
+
#
|
21
|
+
# @param [SocialLinker::Subject] the SocialLinker::Subject initialized as complete as possible
|
22
|
+
# @param [Hash] options with site-defaults for `:site_title_postfix`, (e.g. article title - {site title postfix here}), `:domain` (the main url),
|
23
|
+
# @return String of tags (possibly marked as sanitized when available)
|
24
|
+
def header_meta_tags subject, options={}
|
25
|
+
site_title_postfix = options[:site_title_postfix]
|
26
|
+
header_html = []
|
27
|
+
if subject
|
28
|
+
domain = options[:domain] || subject.options[:domain]
|
29
|
+
|
30
|
+
header_html << meta_tag("twitter:card", subject.media ? :summary_large_image : :summary)
|
31
|
+
header_html << meta_tag("twitter:site", subject.options[:twitter_username])
|
32
|
+
header_html << meta_tag("twitter:creator", subject.options[:twitter_username])
|
33
|
+
header_html << meta_tag("twitter:domain", domain)
|
34
|
+
|
35
|
+
if subject.url
|
36
|
+
header_html << meta_tag("og:url", subject.canonical_url)
|
37
|
+
header_html << "<link rel=\"canonical\" content=\"#{erb_sanitized(subject.canonical_url)}\" />"
|
38
|
+
end
|
39
|
+
|
40
|
+
header_html << meta_tag("keywords", subject.tags.join(" "))
|
41
|
+
header_html << meta_tag("description", subject.summary)
|
42
|
+
|
43
|
+
header_html << meta_tag("twitter:description", subject.summary)
|
44
|
+
header_html << meta_tag("og:description", subject.summary)
|
45
|
+
|
46
|
+
if subject.media
|
47
|
+
header_html << meta_tag("twitter:image:src", subject.media)
|
48
|
+
header_html << meta_tag("og:image", subject.media)
|
49
|
+
header_html << meta_tag("og:image:type", subject.options[:image_type])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
title = @title
|
54
|
+
title = subject.title if subject
|
55
|
+
site_title = [title, site_title_postfix].uniq.compact.join(" - ")
|
56
|
+
header_html << "<title>#{erb_sanitized(site_title)}</title>"
|
57
|
+
header_html << meta_tag("twitter:title", title)
|
58
|
+
header_html << meta_tag("og:title", title)
|
59
|
+
|
60
|
+
header_html.compact!
|
61
|
+
header_html = header_html.join("\n") if header_html
|
62
|
+
|
63
|
+
# we trust the html because all user input is sanitized by erb_sanitized
|
64
|
+
header_html = header_html.html_safe if header_html.methods.include?(:html_safe)
|
65
|
+
header_html
|
66
|
+
end
|
67
|
+
|
68
|
+
# Generates the <SVG> code for the image
|
69
|
+
# It references the parent image path with `xlink:href`. Make sure your browser supports this, or use something like `svg4everyone` to fix your client's browsers
|
70
|
+
# Options:
|
71
|
+
# * social_icons_image_path (defaults to the default SocialLinker iconset)
|
72
|
+
# * title (the title attribute, defaults to the network's name capitalized)
|
73
|
+
|
74
|
+
def social_link_to_image(network, image_path)
|
75
|
+
if network and image_path
|
76
|
+
"<svg class=\"icon icon-#{network} icon-default-style\"><use xlink:href=\"#{image_path}#icon-#{network}\"></use></svg>"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def social_link_to subject, network, options = {}
|
81
|
+
raise ArgumentError, "subject can't be nil" unless subject
|
82
|
+
raise ArgumentError, "network can't be nil" unless network
|
83
|
+
options_with_defaults = {
|
84
|
+
social_icons_image_path: 'social_linker/icons.svg',
|
85
|
+
title: network.to_s.capitalize
|
86
|
+
}.merge(options)
|
87
|
+
|
88
|
+
link_content = network
|
89
|
+
|
90
|
+
if block_given?
|
91
|
+
link_content = yield
|
92
|
+
else
|
93
|
+
social_icons_image_path = options_with_defaults[:social_icons_image_path]
|
94
|
+
social_icons_image_path = image_path(social_icons_image_path) if self.methods.include?(:image_path)
|
95
|
+
|
96
|
+
link_content = social_link_to_image(network, social_icons_image_path)
|
97
|
+
end
|
98
|
+
|
99
|
+
title = options_with_defaults[:title]
|
100
|
+
|
101
|
+
html = "<a href=\"#{erb_sanitized(subject.share_link(network))}\" class=\"#{network}\" title=\"#{title}\">#{link_content}</a>"
|
102
|
+
html = html.html_safe if html.methods.include?(:html_safe)
|
103
|
+
html
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
data/lib/social_linker.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require "social_linker/version"
|
2
2
|
require "social_linker/subject"
|
3
|
-
require 'social_linker/
|
4
|
-
|
5
|
-
#
|
3
|
+
require 'social_linker/engine' if defined?(Rails)
|
4
|
+
|
5
|
+
# SocialLinker
|
6
6
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
|
10
|
-
#
|
11
|
-
|
7
|
+
# The SocialLinker namespace contains The SocialLinker::Subject and the
|
8
|
+
# SocialSubject::Engine (for Rails projects)
|
9
|
+
module SocialLinker
|
10
|
+
# The main class of SocialLinker is the `SocialLinker::Subject`-class.
|
11
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: social_linker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- murb
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -70,13 +70,15 @@ files:
|
|
70
70
|
- LICENSE.txt
|
71
71
|
- README.md
|
72
72
|
- Rakefile
|
73
|
+
- app/assets/images/social_linker/icons.svg
|
74
|
+
- app/assets/stylesheets/social_linker/icons.scss
|
75
|
+
- app/helpers/view_helpers.rb
|
73
76
|
- bin/console
|
74
77
|
- bin/setup
|
75
78
|
- lib/social_linker.rb
|
76
|
-
- lib/social_linker/
|
79
|
+
- lib/social_linker/engine.rb
|
77
80
|
- lib/social_linker/subject.rb
|
78
81
|
- lib/social_linker/version.rb
|
79
|
-
- lib/social_linker/view_helpers.rb
|
80
82
|
- social_linker.gemspec
|
81
83
|
homepage: https://murb.nl/blog?tags=social_linker
|
82
84
|
licenses:
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module SocialLinker
|
2
|
-
module ViewHelpers
|
3
|
-
# renders a metatag
|
4
|
-
# param [String, Symbol] name (or property) (defaults to name, values starting with 'og:' (opengraph) will be using the property attribute)
|
5
|
-
# param [String, Symbol] content (the value for the name or the property)
|
6
|
-
# @returns [String, nil] nil is returned when the content is empty
|
7
|
-
def meta_tag(name, content)
|
8
|
-
name_or_property_section = name.start_with?("og:") ? "property=\"#{erb_sanitized(name)}\"" : "name=\"#{erb_sanitized(name)}\""
|
9
|
-
"<meta #{name_or_property_section} content=\"#{erb_sanitized(content)}\" />" if content and content != ""
|
10
|
-
end
|
11
|
-
|
12
|
-
def erb_sanitized(value)
|
13
|
-
if defined? Rails
|
14
|
-
h(value)
|
15
|
-
else
|
16
|
-
ERB::Util.h(value)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# header_meta_tags renders the most important metatags based on the SocialLinker::Subject
|
21
|
-
# param [SocialLinker::Subject] the SocialLinker::Subject initialized as complete as possible
|
22
|
-
# param [Hash] options with site-defaults for `:site_title_postfix`, (e.g. article title - {site title postfix here}), `:domain` (the main url), `
|
23
|
-
def header_meta_tags subject, options={}
|
24
|
-
site_title_postfix = options[:site_title_postfix]
|
25
|
-
header_html = []
|
26
|
-
if subject
|
27
|
-
domain = options[:domain] || subject.options[:domain]
|
28
|
-
|
29
|
-
header_html << meta_tag("twitter:card", subject.media ? :summary_large_image : :summary)
|
30
|
-
header_html << meta_tag("twitter:site", subject.options[:twitter_username])
|
31
|
-
header_html << meta_tag("twitter:creator", subject.options[:twitter_username])
|
32
|
-
header_html << meta_tag("twitter:domain", domain)
|
33
|
-
|
34
|
-
if subject.url
|
35
|
-
header_html << meta_tag("og:url", subject.canonical_url)
|
36
|
-
header_html << "<link rel=\"canonical\" content=\"#{erb_sanitized(subject.canonical_url)}\" />"
|
37
|
-
end
|
38
|
-
|
39
|
-
header_html << meta_tag("keywords", subject.tags.join(" "))
|
40
|
-
header_html << meta_tag("description", subject.summary)
|
41
|
-
|
42
|
-
header_html << meta_tag("twitter:description", subject.summary)
|
43
|
-
header_html << meta_tag("og:description", subject.summary)
|
44
|
-
|
45
|
-
if subject.media
|
46
|
-
header_html << meta_tag("twitter:image:src", subject.media)
|
47
|
-
header_html << meta_tag("og:image", subject.media)
|
48
|
-
header_html << meta_tag("og:image:type", subject.options[:image_type])
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
title = @title
|
53
|
-
title = subject.title if subject
|
54
|
-
site_title = [title, site_title_postfix].uniq.compact.join(" - ")
|
55
|
-
header_html << "<title>#{site_title}</title>"
|
56
|
-
header_html << meta_tag("twitter:title", title)
|
57
|
-
header_html << meta_tag("og:title", title)
|
58
|
-
|
59
|
-
header_html.compact!
|
60
|
-
header_html.join("\n") if header_html
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|