├── .husky ├── .gitignore └── pre-commit ├── demo ├── app.js ├── fonts ├── backend.json ├── custom-initialization.html ├── external-jquery.html ├── external-fontawesome.html ├── jquery-no-conflict.html ├── app.less ├── data-title.html └── index.html ├── .babelrc ├── .npmignore ├── .npmrc ├── src ├── js │ ├── shariff.min.js │ ├── shariff.complete.js │ ├── services │ │ ├── flattr.js │ │ ├── index.js │ │ ├── info.js │ │ ├── pocket.js │ │ ├── print.js │ │ ├── flipboard.js │ │ ├── clipboard.js │ │ ├── mail.js │ │ ├── vk.js │ │ ├── pinterest.js │ │ ├── xing.js │ │ ├── linkedin.js │ │ ├── telegram.js │ │ ├── tumblr.js │ │ ├── fediverse.js │ │ ├── facebook.js │ │ ├── weibo.js │ │ ├── qzone.js │ │ ├── buffer.js │ │ ├── threema.js │ │ ├── reddit.js │ │ ├── whatsapp.js │ │ ├── diaspora.js │ │ ├── tencent-weibo.js │ │ ├── stumbleupon.js │ │ └── twitter.js │ ├── shariff.js │ └── dom.js └── style │ ├── shariff.less │ ├── shariff-complete.less │ ├── services │ ├── threema.less │ ├── tumblr.less │ ├── mail.less │ ├── print.less │ ├── reddit.less │ ├── pocket.less │ ├── clipboard.less │ ├── diaspora.less │ ├── telegram.less │ ├── whatsapp.less │ ├── flipboard.less │ ├── stumbleupon.less │ ├── vk.less │ ├── qzone.less │ ├── xing.less │ ├── weibo.less │ ├── twitter.less │ ├── facebook.less │ ├── linkedin.less │ ├── tencent-weibo.less │ ├── buffer.less │ ├── pinterest.less │ ├── flattr.less │ └── info.less │ ├── shariff-services.less │ └── shariff-layout.less ├── .prettierrc.js ├── postcss.config.js ├── .editorconfig ├── .eslintrc.js ├── .github └── PULL_REQUEST_TEMPLATE.md ├── test ├── shariff-spec.js └── dom-spec.js ├── RELEASING.md ├── bower.json ├── .travis.yml ├── LICENSE.txt ├── .gitignore ├── karma.conf.js ├── webpack.config.js ├── package.json ├── CHANGELOG.md ├── README.md └── README-de.md /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /demo/app.js: -------------------------------------------------------------------------------- 1 | require('./app.less') 2 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["env"] 3 | } 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | !dist 2 | *.zip 3 | *.tar 4 | *.tar.gz 5 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | registry=https://registry.npmjs.org/ 2 | 3 | -------------------------------------------------------------------------------- /demo/fonts: -------------------------------------------------------------------------------- 1 | ../node_modules/@fortawesome/fontawesome-free-webfonts/webfonts/ -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /demo/backend.json: -------------------------------------------------------------------------------- 1 | {"buffer":123,"facebook":906,"reddit":12,"stumbleupon":4325,"vk":57,"xing":185} 2 | -------------------------------------------------------------------------------- /src/js/shariff.min.js: -------------------------------------------------------------------------------- 1 | require('../style/shariff.less') 2 | module.exports = require('./shariff') 3 | -------------------------------------------------------------------------------- /src/style/shariff.less: -------------------------------------------------------------------------------- 1 | // Shariff 2 | @import "shariff-layout"; 3 | @import "shariff-services"; 4 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | semi: false, 3 | singleQuote: true, 4 | trailingComma: 'all', 5 | } 6 | -------------------------------------------------------------------------------- /src/js/shariff.complete.js: -------------------------------------------------------------------------------- 1 | require('../style/shariff-complete.less') 2 | module.exports = require('./shariff') 3 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('autoprefixer')({browsers: ['last 2 versions']}) 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: 'standard', 4 | rules: { 5 | 'comma-dangle': [1, 'only-multiline'], 6 | 'indent': ['error', 2, {MemberExpression: 1 }], 7 | 'space-before-function-paren': 0 8 | }, 9 | env: { 10 | mocha: true, 11 | browser: true, 12 | node: true, 13 | es6: true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/style/shariff-complete.less: -------------------------------------------------------------------------------- 1 | // Font-Awesome 2 | @import "~@fortawesome/fontawesome-free/less/fontawesome.less"; 3 | @import "~@fortawesome/fontawesome-free/less/brands.less"; 4 | @import "~@fortawesome/fontawesome-free/less/regular.less"; 5 | @import "~@fortawesome/fontawesome-free/less/solid.less"; 6 | 7 | // Shariff 8 | @import "shariff-layout"; 9 | @import "shariff-services"; 10 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /src/style/services/threema.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .threema { 3 | a { 4 | background-color: #333333; 5 | &:hover { 6 | background-color: #1f1f1f; 7 | } 8 | } 9 | .fa-lock { 10 | font-size: 28px; 11 | } 12 | } 13 | .theme-white { 14 | .threema a { 15 | color: #333333; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .threema .fa-lock { 23 | font-size: 22px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/tumblr.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .tumblr { 3 | a { 4 | background-color: #36465D; 5 | &:hover { 6 | background-color: #44546B; 7 | } 8 | } 9 | .fa-tumblr { 10 | font-size: 28px; 11 | } 12 | } 13 | .theme-white { 14 | .tumblr a { 15 | color: #5cbe4a; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .tumblr .fa-tumblr { 23 | font-size: 22px; 24 | } 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /src/style/services/mail.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .mail { 3 | a { 4 | background-color: #999; 5 | &:hover { 6 | background-color: #a8a8a8; 7 | } 8 | } 9 | .fa-envelope { 10 | font-size: 21px; 11 | } 12 | } 13 | .theme-white { 14 | .mail a { 15 | color: #999; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .mail .fa-envelope { 23 | font-size: 18px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/print.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .print { 3 | a { 4 | background-color: #999; 5 | &:hover { 6 | background-color: #a8a8a8; 7 | } 8 | } 9 | .fa-print { 10 | font-size: 21px; 11 | } 12 | } 13 | .theme-white { 14 | .print a { 15 | color: #999; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .print .fa-print { 23 | font-size: 18px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/reddit.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .reddit { 3 | a { 4 | background-color: #ff4500; 5 | &:hover { 6 | background-color: #ff6a33; 7 | } 8 | } 9 | .fa-reddit { 10 | font-size: 17px; 11 | } 12 | } 13 | .theme-white { 14 | .reddit a { 15 | color: #ff4500; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .reddit .fa-reddit { 23 | font-size: 16px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/pocket.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .pocket { 3 | a { 4 | background-color: #ef4056; 5 | &:hover { 6 | background-color: #ff5066; 7 | } 8 | } 9 | .fa-get-pocket { 10 | font-size: 22px; 11 | } 12 | } 13 | .theme-white { 14 | .pocket a { 15 | color: #ef4056; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .pocket .fa-get-pocket { 23 | font-size: 19px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/clipboard.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .clipboard { 3 | a { 4 | background-color: #1e418c; 5 | &:hover { 6 | background-color: #2e519c; 7 | } 8 | } 9 | .fa-clipboard { 10 | font-size: 21px; 11 | } 12 | } 13 | .theme-white { 14 | .clipboard a { 15 | color: #999; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .clipboard .fa-clipboard { 23 | font-size: 18px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/diaspora.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .diaspora { 3 | a { 4 | background-color: #999; 5 | &:hover { 6 | background-color: #b3b3b3; 7 | } 8 | } 9 | .fa-times-circle { 10 | font-size: 17px; 11 | } 12 | } 13 | .theme-white { 14 | .diaspora a { 15 | color: #999; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .diaspora .fa-times-circle { 23 | font-size: 16px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/telegram.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .telegram { 3 | a { 4 | background-color: #0088cc; 5 | &:hover { 6 | background-color: #007dbb; 7 | } 8 | } 9 | .fa-telegram { 10 | font-size: 28px; 11 | } 12 | } 13 | .theme-white { 14 | .telegram a { 15 | color: #0088cc; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .telegram .fa-telegram { 23 | font-size: 22px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/whatsapp.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .whatsapp { 3 | a { 4 | background-color: #5cbe4a; 5 | &:hover { 6 | background-color: #34af23; 7 | } 8 | } 9 | .fa-whatsapp { 10 | font-size: 28px; 11 | } 12 | } 13 | .theme-white { 14 | .whatsapp a { 15 | color: #5cbe4a; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .whatsapp .fa-whatsapp { 23 | font-size: 22px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/flipboard.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .flipboard { 3 | a { 4 | background-color: #e12828; 5 | &:hover { 6 | background-color: #ff2e2e; 7 | } 8 | } 9 | .fa-flipboard { 10 | font-size: 22px; 11 | } 12 | } 13 | .theme-white { 14 | .flipboard a { 15 | color: #e12828; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .flipboard .fa-flipboard { 23 | font-size: 19px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/style/services/stumbleupon.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .stumbleupon { 3 | a { 4 | background-color: #eb4924; 5 | &:hover { 6 | background-color: #ef7053; 7 | } 8 | } 9 | .fa-stumbleupon { 10 | font-size: 17px; 11 | } 12 | } 13 | .theme-white { 14 | .stumbleupon a { 15 | color: #eb4924; 16 | } 17 | } 18 | } 19 | 20 | @media only screen and (min-width: 600px) { 21 | .shariff { 22 | .stumbleupon .fa-stumbleupon { 23 | font-size: 16px; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /test/shariff-spec.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert') 2 | const Shariff = require('..') 3 | 4 | describe('Shariff', () => { 5 | let div = null 6 | 7 | beforeEach(() => { 8 | div = document.createElement('div') 9 | }) 10 | 11 | it('should construct a Shariff object', () => { 12 | assert.doesNotThrow(() => new Shariff(div)) 13 | }) 14 | 15 | describe('Defaults', () => { 16 | it('should use default services', () => { 17 | let s = new Shariff(div) 18 | assert.deepEqual( 19 | s.options.services, 20 | ['twitter', 'facebook', 'info'] 21 | ) 22 | }) 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /RELEASING.md: -------------------------------------------------------------------------------- 1 | # Releasing 2 | 3 | To prepare a release you have to do the following tasks: 4 | 5 | 1. Run `git flow release start [version]`. 6 | 2. Bump versions in `package.json`. 7 | 3. Update [CHANGELOG.md](CHANGELOG.md). 8 | 4. Run `npm install` to update `package-lock.json`. 9 | 5. Commit changes. 10 | 6. Run `git flow release finish`. 11 | 12 | After pushing the release tag to GitHub, Travis CI will create release downloads and push the release to [npmjs.com](https://www.npmjs.com). 13 | 14 | Now you need to update [the release](https://github.com/heiseonline/shariff/releases) and attach the relevant pieces of information from the [CHANGELOG.md](CHANGELOG.md). 15 | -------------------------------------------------------------------------------- /src/style/services/vk.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .vk { 3 | a { 4 | background-color: #5d7fa4; 5 | &:hover { 6 | background-color: #678eb4; 7 | } 8 | } 9 | .fa-vk { 10 | font-size: 22px; 11 | } 12 | .share_count { 13 | color: #55677d; 14 | background-color: #FFFFFF; 15 | } 16 | } 17 | .theme-white { 18 | .vk a { 19 | color: #3b5998; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .vk .fa-vk { 27 | font-size: 19px; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/style/services/qzone.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .qzone { 3 | a { 4 | background-color: #2B82D9; 5 | &:hover { 6 | background-color: #398FE6; 7 | } 8 | } 9 | .fa-qq { 10 | font-size: 28px; 11 | } 12 | .share_count { 13 | color: #0174a4; 14 | background-color: #2B82D9; 15 | } 16 | } 17 | .theme-white { 18 | .qzone a { 19 | color: #2B82D9; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .qzone .fa-qq { 27 | font-size: 24px; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/style/services/xing.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .xing { 3 | a { 4 | background-color: #126567; 5 | &:hover { 6 | background-color: #29888a; 7 | } 8 | } 9 | .fa-xing { 10 | font-size: 22px; 11 | } 12 | .share_count { 13 | color: #15686a; 14 | background-color: #4fa5a7; 15 | } 16 | } 17 | .theme-white { 18 | .xing a { 19 | color: #126567; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .xing .fa-xing { 27 | font-size: 19px; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/style/services/weibo.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .weibo { 3 | a { 4 | background-color: #F56770; 5 | &:hover { 6 | background-color: #FA7F8A; 7 | } 8 | } 9 | .fa-weibo { 10 | font-size: 28px; 11 | } 12 | .share_count { 13 | color: #0174a4; 14 | background-color: #F56770; 15 | } 16 | } 17 | .theme-white { 18 | .weibo a { 19 | color: #F56770; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .weibo .fa-weibo { 27 | font-size: 24px; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/style/services/twitter.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .twitter { 3 | a { 4 | background-color: #000; 5 | &:hover { 6 | background-color: #333; 7 | } 8 | } 9 | .fa-x-twitter { 10 | font-size: 28px; 11 | } 12 | .share_count { 13 | color: #fff; 14 | background-color: #595959; 15 | } 16 | } 17 | .theme-white { 18 | .twitter a { 19 | color: #000; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .twitter .fa-x-twitter { 27 | font-size: 24px; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/style/services/facebook.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .facebook { 3 | a { 4 | background-color: #3b5998; 5 | &:hover { 6 | background-color: #4273c8; 7 | } 8 | } 9 | .fa-facebook-f { 10 | font-size: 22px; 11 | } 12 | .share_count { 13 | color: #183a75; 14 | background-color: #99adcf; 15 | } 16 | } 17 | .theme-white { 18 | .facebook a { 19 | color: #3b5998; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .facebook .fa-facebook-f { 27 | font-size: 19px; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/style/services/linkedin.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .linkedin { 3 | a { 4 | background-color: #0077b5; 5 | &:hover { 6 | background-color: #0369a0; 7 | } 8 | } 9 | .fa-linkedin-in { 10 | font-size: 22px; 11 | } 12 | .share_count { 13 | color: #004785; 14 | background-color: #33AAE8; 15 | } 16 | } 17 | .theme-white { 18 | .linkedin a { 19 | color: #0077b5; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .linkedin .fa-linkedin-in { 27 | font-size: 19px; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /demo/custom-initialization.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | AJAX example 5 | 6 | 7 | 8 | 9 | 10 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/style/services/tencent-weibo.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .tencent-weibo { 3 | a { 4 | background-color: #26ACE0; 5 | &:hover { 6 | background-color: #38BBEB; 7 | } 8 | } 9 | .fa-tencent-weibo { 10 | font-size: 28px; 11 | } 12 | .share_count { 13 | color: #0174a4; 14 | background-color: #26ACE0; 15 | } 16 | } 17 | .theme-white { 18 | .tencent-weibo a { 19 | color: #26ACE0; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .tencent-weibo .fa-tencent-weibo { 27 | font-size: 24px; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/style/services/buffer.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .buffer { 3 | a { 4 | background-color: #3a3a3a; 5 | &:hover { 6 | background-color: #555555; 7 | } 8 | } 9 | .fa-buffer { 10 | font-size: 22px; 11 | } 12 | .share_count { 13 | color: #3a3a3a; 14 | background-color: #dddddd; 15 | } 16 | } 17 | .theme-white { 18 | .buffer a { 19 | color: #3a3a3a; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .buffer .fa-buffer { 27 | font-size: 19px; 28 | position: relative; 29 | top: 1px; 30 | } 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /src/style/shariff-services.less: -------------------------------------------------------------------------------- 1 | @import "services/buffer"; 2 | @import "services/clipboard"; 3 | @import "services/diaspora"; 4 | @import "services/facebook"; 5 | @import "services/flattr"; 6 | @import "services/flipboard"; 7 | @import "services/info"; 8 | @import "services/linkedin"; 9 | @import "services/mail"; 10 | @import "services/print"; 11 | @import "services/pinterest"; 12 | @import "services/pocket"; 13 | @import "services/reddit"; 14 | @import "services/stumbleupon"; 15 | @import "services/twitter"; 16 | @import "services/whatsapp"; 17 | @import "services/xing"; 18 | @import "services/tumblr"; 19 | @import "services/threema"; 20 | @import "services/weibo"; 21 | @import "services/tencent-weibo"; 22 | @import "services/telegram"; 23 | @import "services/qzone"; 24 | @import "services/vk"; 25 | -------------------------------------------------------------------------------- /src/style/services/pinterest.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .pinterest { 3 | a { 4 | background-color: #bd081c; 5 | &:hover { 6 | background-color: lighten(#bd081c, 5%); 7 | } 8 | } 9 | .fa-pinterest-p { 10 | font-size: 22px; 11 | } 12 | .share_count { 13 | color: #a31601; 14 | background-color: #eda79d; 15 | } 16 | } 17 | .theme-white { 18 | .pinterest a { 19 | color: #bd081c; 20 | } 21 | } 22 | } 23 | 24 | @media only screen and (min-width: 600px) { 25 | .shariff { 26 | .pinterest .fa-pinterest-p { 27 | font-size: 19px; 28 | position: relative; 29 | top: 1px; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shariff", 3 | "homepage": "http://ct.de/-2467514", 4 | "authors": [ 5 | "Ines Pauer ", 6 | "Philipp Busse ", 7 | "Sebastian Hilbig ", 8 | "Erich Kramer ", 9 | "Deniz Sesli " 10 | ], 11 | "main": [ 12 | "src/js/shariff.css", 13 | "src/style/shariff.less" 14 | ], 15 | "description": "Shariff enables website users to share their favorite content without compromising their privacy.", 16 | "keywords": [ 17 | "heise", 18 | "social buttons", 19 | "shariff" 20 | ], 21 | "license": "MIT", 22 | "ignore": [ 23 | "/.*", 24 | "/*.js", 25 | "/*.png", 26 | "**/.*", 27 | "node_modules", 28 | "bower_components", 29 | "test", 30 | "tests" 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /src/style/services/flattr.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .flattr { 3 | a { 4 | background-color: #7ea352; 5 | &:hover { 6 | background-color: #F67C1A; 7 | .share_count { 8 | color: darken(#F67C1A, 10%); 9 | background-color: lighten(#F67C1A, 20%); 10 | } 11 | } 12 | } 13 | .fa-money-bill-alt { 14 | font-size: 22px; 15 | } 16 | .share_count { 17 | color: darken(#7ea352, 10%); 18 | background-color: lighten(#7ea352, 20%); 19 | } 20 | } 21 | .theme-white { 22 | .flattr a { 23 | color: #F67C1A; 24 | } 25 | } 26 | } 27 | 28 | @media only screen and (min-width: 600px) { 29 | .shariff { 30 | .flattr .fa-money-bill-alt { 31 | font-size: 19px; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/js/services/flattr.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | var title = shariff.getTitle() 6 | var description = shariff.getMeta('description') 7 | 8 | return { 9 | popup: true, 10 | shareText: 'Flattr', 11 | name: 'flattr', 12 | faPrefix: 'far', 13 | faName: 'fa-money-bill-alt', 14 | title: { 15 | de: 'Artikel flattrn', 16 | en: 'Flattr this', 17 | }, 18 | shareUrl: 19 | 'https://flattr.com/submit/auto?title=' + 20 | encodeURIComponent(title) + 21 | '&description=' + 22 | encodeURIComponent(description) + 23 | '&category=' + 24 | encodeURIComponent(shariff.options.flattrCategory || 'text') + 25 | '&user_id=' + 26 | encodeURIComponent(shariff.options.flattrUser) + 27 | '&url=' + 28 | url + 29 | shariff.getReferrerTrack(), 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/js/services/index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | buffer: require('./buffer'), 3 | clipboard: require('./clipboard'), 4 | diaspora: require('./diaspora'), 5 | facebook: require('./facebook'), 6 | fediverse: require('./fediverse'), 7 | flattr: require('./flattr'), 8 | flipboard: require('./flipboard'), 9 | info: require('./info'), 10 | linkedin: require('./linkedin'), 11 | mail: require('./mail'), 12 | pinterest: require('./pinterest'), 13 | pocket: require('./pocket'), 14 | print: require('./print'), 15 | qzone: require('./qzone'), 16 | reddit: require('./reddit'), 17 | stumbleupon: require('./stumbleupon'), 18 | telegram: require('./telegram'), 19 | tencent: require('./tencent-weibo'), 20 | threema: require('./threema'), 21 | tumblr: require('./tumblr'), 22 | twitter: require('./twitter'), 23 | vk: require('./vk'), 24 | weibo: require('./weibo'), 25 | whatsapp: require('./whatsapp'), 26 | xing: require('./xing'), 27 | } 28 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | sudo: false 4 | 5 | node_js: 6 | - "node" 7 | 8 | addons: 9 | apt: 10 | packages: 11 | - p7zip-full 12 | 13 | env: 14 | global: 15 | - BASE_NAME=shariff-$TRAVIS_TAG 16 | 17 | cache: 18 | directories: 19 | - node_modules 20 | 21 | script: 22 | - npm run test 23 | 24 | before_deploy: 25 | - npm run build 26 | - npm run build_zip 27 | 28 | deploy: 29 | - provider: releases 30 | api_key: 31 | secure: "OL2jzThEtg8cqPK/yyBncO5Tp3pypNV+Sh5H91TxbtdRfGF/POod3bsTRBojKWQh0C0VcxfvWyQnA0+2ZXOM5TX0ktfJbPnuIPY1RKBjprg50Gqz04aKJnlGo7SFWj/aKVoPZ9HOHRHFXAvdzZPo66SUPPXVBtb56Zp4yrcvOsY=" 32 | file: 33 | - $BASE_NAME.zip 34 | - $BASE_NAME.tar.gz 35 | skip_cleanup: true 36 | on: 37 | repo: heiseonline/shariff 38 | tags: true 39 | - provider: npm 40 | email: npmjs@heise.de 41 | api_key: 42 | secure: eNX4D2s8TLojBXYg3vCjiUpE+N4dgZlXVbI1eriti1puOyWJ9tO4JxbwGiO0cShSJV+gjpzC9KpWqZCuTlY2ZZIhUfskfE179HDu+0rue4GAF2iQz2dvs8hoeWidLPIkXgn3YofsS1iQMX3VxJ1j3GVBwEg9motbcuIb4zbxKCw= 43 | skip_cleanup: true 44 | on: 45 | repo: heiseonline/shariff 46 | tags: true 47 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Heise Medien GmbH & Co. KG and other contributors. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/js/services/info.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | return { 5 | blank: shariff.getInfoDisplayBlank(), 6 | popup: shariff.getInfoDisplayPopup(), 7 | shareText: 'Info', 8 | name: 'info', 9 | faPrefix: 'fas', 10 | faName: 'fa-info', 11 | title: { 12 | bg: 'Повече информация', 13 | cs: 'Více informací', 14 | da: 'Flere oplysninger', 15 | de: 'Weitere Informationen', 16 | en: 'More information', 17 | es: 'Más informaciones', 18 | fi: 'Lisätietoja', 19 | fr: "Plus d'informations", 20 | hr: 'Više informacija', 21 | hu: 'Több információ', 22 | it: 'Maggiori informazioni', 23 | ja: '詳しい情報', 24 | ko: '추가 정보', 25 | nl: 'Verdere informatie', 26 | no: 'Mer informasjon', 27 | pl: 'Więcej informacji', 28 | pt: 'Mais informações', 29 | ro: 'Mai multe informatii', 30 | ru: 'Больше информации', 31 | sk: 'Viac informácií', 32 | sl: 'Več informacij', 33 | sr: 'Više informacija', 34 | sv: 'Mer information', 35 | tr: 'Daha fazla bilgi', 36 | zh: '更多信息', 37 | }, 38 | shareUrl: shariff.getInfoUrl(), 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | 10 | # Runtime data 11 | pids 12 | *.pid 13 | *.seed 14 | *.pid.lock 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # nyc test coverage 23 | .nyc_output 24 | 25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 26 | .grunt 27 | 28 | # Bower dependency directory (https://bower.io/) 29 | bower_components 30 | 31 | # node-waf configuration 32 | .lock-wscript 33 | 34 | # Compiled binary addons (http://nodejs.org/api/addons.html) 35 | build/Release 36 | 37 | # Dependency directories 38 | node_modules/ 39 | jspm_packages/ 40 | 41 | # Typescript v1 declaration files 42 | typings/ 43 | 44 | # Optional npm cache directory 45 | .npm 46 | 47 | # Optional eslint cache 48 | .eslintcache 49 | 50 | # Optional REPL history 51 | .node_repl_history 52 | 53 | # Output of 'npm pack' 54 | *.tgz 55 | *.zip 56 | *.tar 57 | *.tar.gz 58 | 59 | # Yarn Integrity file 60 | .yarn-integrity 61 | 62 | # dotenv environment variables file 63 | .env 64 | 65 | # macOS stuff 66 | .DS_Store 67 | 68 | -------------------------------------------------------------------------------- /src/js/services/pocket.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | var title = encodeURIComponent(shariff.getTitle()) 6 | return { 7 | popup: true, 8 | shareText: 'Pocket', 9 | name: 'pocket', 10 | faPrefix: 'fab', 11 | faName: 'fa-get-pocket', 12 | title: { 13 | bg: 'Запазване в Pocket', 14 | cs: 'Uložit do Pocket', 15 | da: 'Gem i Pocket', 16 | de: 'In Pocket speichern', 17 | en: 'Save to Pocket', 18 | es: 'Guardar en Pocket', 19 | fi: 'Tallenna kohtaan Pocket', 20 | fr: 'Enregistrer dans Pocket', 21 | hr: 'Spremi u Pocket', 22 | hu: 'Mentés "Pocket"-be', 23 | it: 'Salva in Pocket', 24 | ja: '「ポケット」に保存', 25 | ko: 'Pocket에 저장', 26 | nl: 'Opslaan in Pocket', 27 | no: 'Lagre i Pocket', 28 | pl: 'Zapisz w Pocket', 29 | pt: 'Salvar em Pocket', 30 | ro: 'Salvați în Pocket', 31 | ru: 'Сохранить в Pocket', 32 | sk: 'Uložiť do priečinka Pocket', 33 | sl: 'Shrani v Pocket', 34 | sr: 'Sačuvaj u Pocket', 35 | sv: 'Spara till Pocket', 36 | tr: 'Pocket e kaydet', 37 | zh: '保存到Pocket', 38 | }, 39 | shareUrl: 40 | 'https://getpocket.com/save?title=' + 41 | title + 42 | '&url=' + 43 | url + 44 | shariff.getReferrerTrack(), 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/js/services/print.js: -------------------------------------------------------------------------------- 1 | /* jshint scripturl:true */ 2 | 'use strict' 3 | 4 | module.exports = function (shariff) { 5 | var url = 'javascript:window.print();' 6 | 7 | return { 8 | name: 'print', 9 | faPrefix: 'fas', 10 | faName: 'fa-print', 11 | popup: false, 12 | shareText: { 13 | bg: '', 14 | cs: 'tlačit', 15 | da: '', 16 | de: 'drucken', 17 | en: 'print', 18 | es: 'impresión', 19 | fi: '', 20 | fr: 'imprimer', 21 | hr: '', 22 | hu: '', 23 | it: 'stampa', 24 | ja: '', 25 | ko: '', 26 | nl: 'afdrukken', 27 | no: '', 28 | pl: 'drukuj', 29 | pt: '', 30 | ro: '', 31 | ru: 'Распечатать', 32 | sk: '', 33 | sl: '', 34 | sr: '', 35 | sv: '', 36 | tr: '', 37 | zh: '', 38 | }, 39 | title: { 40 | bg: '', 41 | cs: 'tlačit', 42 | da: '', 43 | de: 'drucken', 44 | en: 'print', 45 | es: 'impresión', 46 | fi: '', 47 | fr: 'imprimer', 48 | hr: '', 49 | hu: '', 50 | it: 'stampa', 51 | ja: '', 52 | ko: '', 53 | nl: 'afdrukken', 54 | no: '', 55 | pl: 'drukuj', 56 | pt: '', 57 | ro: '', 58 | ru: 'Распечатать', 59 | sk: '', 60 | sl: '', 61 | sr: '', 62 | sv: '', 63 | tr: '', 64 | zh: '', 65 | }, 66 | shareUrl: url, 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/style/services/info.less: -------------------------------------------------------------------------------- 1 | .shariff { 2 | .info { 3 | border: 1px solid #ccc; 4 | a { 5 | color: #666; 6 | background-color: #fff; 7 | &:hover { 8 | background-color: #efefef; 9 | } 10 | } 11 | .fa-info { 12 | font-size: 20px; 13 | width: 33px; 14 | } 15 | .share_text { 16 | display: block !important; 17 | text-indent: -9999px !important; 18 | } 19 | } 20 | .theme-grey { 21 | .info a { 22 | background-color: #fff; 23 | &:hover { 24 | background-color: #efefef; 25 | } 26 | } 27 | } 28 | .orientation-vertical { 29 | .info { 30 | width: 35px; 31 | float: right; 32 | } 33 | } 34 | } 35 | 36 | @media only screen and (min-width: 360px) { 37 | .shariff .orientation-horizontal .info { 38 | flex: none !important; 39 | width: 35px; 40 | min-width: 35px !important; 41 | } 42 | } 43 | 44 | @media only screen and (min-width: 1024px) { 45 | .shariff { 46 | .info .fa-info { 47 | font-size: 16px; 48 | width: 23px; 49 | } 50 | .orientation-horizontal .info { 51 | width: 25px; 52 | min-width: 25px !important; 53 | } 54 | .orientation-vertical .info { 55 | width: 25px; 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/js/services/flipboard.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | var title = encodeURIComponent(shariff.getTitle()) 6 | return { 7 | popup: true, 8 | shareText: 'flip it', 9 | name: 'flipboard', 10 | faPrefix: 'fab', 11 | faName: 'fa-flipboard', 12 | title: { 13 | bg: 'Сподели в Flipboard', 14 | cs: 'Sdílet na Flipboardu', 15 | da: 'Del på Flipboard', 16 | de: 'Bei Flipboard teilen', 17 | en: 'Share on Flipboard', 18 | es: 'Compartir en Flipboard', 19 | fi: 'Jaa Flipboardissä', 20 | fr: 'Partager sur Flipboard', 21 | hr: 'Podijelite na Flipboardu', 22 | hu: 'Megosztás Flipboardon', 23 | it: 'Condividi su Flipboard', 24 | ja: 'Flipboard上で共有', 25 | ko: 'Flipboard에서 공유하기', 26 | nl: 'Delen op Flipboard', 27 | no: 'Del på Flipboard', 28 | pl: 'Udostępnij na Flipboardu', 29 | pt: 'Compartilhar no Flipboard', 30 | ro: 'Partajează pe Flipboard', 31 | ru: 'Поделиться на Flipboard', 32 | sk: 'Zdieľať na Flipboardu', 33 | sl: 'Deli na Flipboardu', 34 | sr: 'Podeli na Flipboard-u', 35 | sv: 'Dela på Flipboard', 36 | tr: "Flipboard'ta paylaş", 37 | zh: '在Flipboard上分享', 38 | }, 39 | shareUrl: 40 | 'https://share.flipboard.com/bookmarklet/popout?v=2&title=' + 41 | title + 42 | '&url=' + 43 | url + 44 | shariff.getReferrerTrack(), 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /demo/external-jquery.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Demonstration: Shariff 6 | 7 | 8 | 9 | 10 | 11 |
12 |
data-backend-url:
/shariff/
13 |
data-info-url:
http://example.com
14 |
data-lang:
en
15 |
data-orientation:
default
16 |
data-services:
default
17 |
data-theme:
grey
18 |
data-url:
http://www.heise.de/ct/
19 |
20 |
21 |
22 |

Lorem ipsum dolor sit amet, consectetuer adipiscing elit

23 |
24 | 25 |
26 |

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.

27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /demo/external-fontawesome.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Demonstration: Shariff 6 | 7 | 8 | 9 | 10 | 11 |
12 |
data-backend-url:
/shariff/
13 |
data-info-url:
http://example.com
14 |
data-lang:
en
15 |
data-orientation:
default
16 |
data-services:
default
17 |
data-theme:
grey
18 |
data-url:
http://www.heise.de/ct/
19 |
20 |
21 |
22 |

Lorem ipsum dolor sit amet, consectetuer adipiscing elit

23 |
24 | 25 |
26 |

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.

27 |
28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/js/services/clipboard.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = 5 | 'javascript:' + 6 | 'var d = document.createElement("input");' + 7 | 'document.body.appendChild(d);' + 8 | 'd.value = "' + 9 | shariff.getURL() + 10 | '";' + 11 | 'd.select();' + 12 | 'd.setSelectionRange(0, 99999);' + 13 | 'document.execCommand("copy");' + 14 | 'document.body.removeChild(d);' 15 | return { 16 | popup: false, 17 | shareText: { 18 | bg: '', 19 | cs: '', 20 | da: '', 21 | de: 'kopieren', 22 | en: 'clipboard', 23 | es: '', 24 | fi: '', 25 | fr: '', 26 | hr: '', 27 | hu: '', 28 | it: '', 29 | ja: '', 30 | ko: '', 31 | nl: '', 32 | no: '', 33 | pl: '', 34 | pt: '', 35 | ro: '', 36 | ru: '', 37 | sk: '', 38 | sl: '', 39 | sr: '', 40 | sv: '', 41 | tr: '', 42 | zh: '', 43 | }, 44 | name: 'clipboard', 45 | faPrefix: 'far', 46 | faName: 'fa-copy', 47 | title: { 48 | bg: '', 49 | cs: '', 50 | da: '', 51 | de: 'In die Zwischenablage kopieren', 52 | en: 'Copy to clipboard', 53 | es: '', 54 | fi: '', 55 | fr: '', 56 | hr: '', 57 | hu: '', 58 | it: '', 59 | ja: '', 60 | ko: '', 61 | nl: '', 62 | no: '', 63 | pl: '', 64 | pt: '', 65 | ro: '', 66 | ru: '', 67 | sk: '', 68 | sl: '', 69 | sr: '', 70 | sv: '', 71 | tr: '', 72 | zh: '', 73 | }, 74 | shareUrl: url, 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /demo/jquery-no-conflict.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Demonstration: Shariff 6 | 7 | 8 | 9 | 12 | 13 | 14 |
15 |
data-backend-url:
/shariff/
16 |
data-info-url:
http://example.com
17 |
data-lang:
en
18 |
data-orientation:
default
19 |
data-services:
default
20 |
data-theme:
grey
21 |
data-url:
http://www.heise.de/ct/
22 |
23 |
24 |
25 |

Lorem ipsum dolor sit amet, consectetuer adipiscing elit

26 |
27 | 28 |
29 |

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.

30 |
31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/js/services/mail.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = shariff.getOption('mailUrl') 5 | 6 | // mailto: link? Add body and subject. 7 | if (url.indexOf('mailto:') === 0) { 8 | url += 9 | '?subject=' + 10 | encodeURIComponent(shariff.getOption('mailSubject') || shariff.getTitle()) 11 | url += 12 | '&body=' + 13 | encodeURIComponent( 14 | shariff.getOption('mailBody').replace(/\{url\}/i, shariff.getURL()), 15 | ) 16 | } 17 | 18 | return { 19 | blank: url.indexOf('http') === 0, 20 | popup: false, 21 | shareText: { 22 | en: 'mail', 23 | zh: '分享', 24 | }, 25 | name: 'mail', 26 | faPrefix: 'fas', 27 | faName: 'fa-envelope', 28 | title: { 29 | bg: 'Изпрати по имейл', 30 | cs: 'Poslat mailem', 31 | da: 'Sende via e-mail', 32 | de: 'Per E-Mail versenden', 33 | en: 'Send by email', 34 | es: 'Enviar por email', 35 | fi: 'Lähetä sähköpostitse', 36 | fr: 'Envoyer par courriel', 37 | hr: 'Pošaljite emailom', 38 | hu: 'Elküldés e-mailben', 39 | it: 'Inviare via email', 40 | ja: '電子メールで送信', 41 | ko: '이메일로 보내기', 42 | nl: 'Sturen via e-mail', 43 | no: 'Send via epost', 44 | pl: 'Wyślij e-mailem', 45 | pt: 'Enviar por e-mail', 46 | ro: 'Trimite prin e-mail', 47 | ru: 'Отправить по эл. почте', 48 | sk: 'Poslať e-mailom', 49 | sl: 'Pošlji po elektronski pošti', 50 | sr: 'Pošalji putem email-a', 51 | sv: 'Skicka via e-post', 52 | tr: 'E-posta ile gönder', 53 | zh: '通过电子邮件传送', 54 | }, 55 | shareUrl: url, 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/js/services/vk.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | return { 6 | popup: true, 7 | shareText: { 8 | bg: 'cподеляне', 9 | cs: 'sdílet', 10 | da: 'del', 11 | de: 'teilen', 12 | en: 'share', 13 | es: 'compartir', 14 | fi: 'Jaa', 15 | fr: 'partager', 16 | hr: 'podijelite', 17 | hu: 'megosztás', 18 | it: 'condividi', 19 | ja: '共有', 20 | ko: '공유하기', 21 | nl: 'delen', 22 | no: 'del', 23 | pl: 'udostępnij', 24 | pt: 'compartilhar', 25 | ro: 'partajează', 26 | ru: 'поделиться', 27 | sk: 'zdieľať', 28 | sl: 'deli', 29 | sr: 'podeli', 30 | sv: 'dela', 31 | tr: 'paylaş', 32 | zh: '分享', 33 | }, 34 | name: 'vk', 35 | faPrefix: 'fab', 36 | faName: 'fa-vk', 37 | title: { 38 | bg: 'Сподели във VK', 39 | cs: 'Sdílet na VKu', 40 | da: 'Del på VK', 41 | de: 'Bei VK teilen', 42 | en: 'Share on VK', 43 | es: 'Compartir en VK', 44 | fi: 'Jaa VKissa', 45 | fr: 'Partager sur VK', 46 | hr: 'Podijelite na VKu', 47 | hu: 'Megosztás VKon', 48 | it: 'Condividi su VK', 49 | ja: 'フェイスブック上で共有', 50 | ko: '페이스북에서 공유하기', 51 | nl: 'Delen op VK', 52 | no: 'Del på VK', 53 | pl: 'Udostępnij na VKu', 54 | pt: 'Compartilhar no VK', 55 | ro: 'Partajează pe VK', 56 | ru: 'Поделиться на ВКонтакте', 57 | sk: 'Zdieľať na VKu', 58 | sl: 'Deli na VKu', 59 | sr: 'Podeli na VK-u', 60 | sv: 'Dela på VK', 61 | tr: "VK'ta paylaş", 62 | zh: '在VK上分享', 63 | }, 64 | shareUrl: 65 | 'https://vk.com/share.php?url=' + url + shariff.getReferrerTrack(), 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/js/services/pinterest.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var url = require('url') 4 | 5 | module.exports = function (shariff) { 6 | var title = shariff.getTitle() 7 | var creator = shariff.getMeta('DC.creator') 8 | if (creator.length > 0) { 9 | title += ' - ' + creator 10 | } 11 | var img = shariff.getOption('mediaUrl') 12 | if (!img || img.length <= 0) { 13 | img = shariff.getMeta('og:image') 14 | } 15 | 16 | var shareUrl = url.parse('https://www.pinterest.com/pin/create/link/', true) 17 | shareUrl.query.url = shariff.getURL() 18 | shareUrl.query.media = img 19 | shareUrl.query.description = title 20 | delete shareUrl.search 21 | 22 | return { 23 | popup: true, 24 | shareText: 'pin it', 25 | name: 'pinterest', 26 | faPrefix: 'fab', 27 | faName: 'fa-pinterest-p', 28 | title: { 29 | bg: 'Сподели в Pinterest', 30 | cs: 'Přidat na Pinterest', 31 | da: 'Del på Pinterest', 32 | de: 'Bei Pinterest pinnen', 33 | en: 'Pin it on Pinterest', 34 | es: 'Compartir en Pinterest', 35 | fi: 'Jaa Pinterestissä', 36 | fr: 'Partager sur Pinterest', 37 | hr: 'Podijelite na Pinterest', 38 | hu: 'Megosztás Pinteresten', 39 | it: 'Condividi su Pinterest', 40 | ja: 'Pinterest上で共有', 41 | ko: 'Pinterest에서 공유하기', 42 | nl: 'Delen op Pinterest', 43 | no: 'Del på Pinterest', 44 | pl: 'Udostępnij przez Pinterest', 45 | pt: 'Compartilhar no Pinterest', 46 | ro: 'Partajează pe Pinterest', 47 | ru: 'Поделиться на Pinterest', 48 | sk: 'Zdieľať na Pinterest', 49 | sl: 'Deli na Pinterest', 50 | sr: 'Podeli na Pinterest-u', 51 | sv: 'Dela på Pinterest', 52 | tr: "Pinterest'ta paylaş", 53 | zh: '分享至Pinterest', 54 | }, 55 | shareUrl: url.format(shareUrl) + shariff.getReferrerTrack(), 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/js/services/xing.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | return { 6 | popup: true, 7 | shareText: { 8 | bg: 'cподеляне', 9 | cs: 'sdílet', 10 | da: 'del', 11 | de: 'teilen', 12 | en: 'share', 13 | es: 'compartir', 14 | fi: 'Jaa', 15 | fr: 'partager', 16 | hr: 'podijelite', 17 | hu: 'megosztás', 18 | it: 'condividi', 19 | ja: '共有', 20 | ko: '공유하기', 21 | nl: 'delen', 22 | no: 'del', 23 | pl: 'udostępnij', 24 | pt: 'compartilhar', 25 | ro: 'partajează', 26 | ru: 'поделиться', 27 | sk: 'zdieľať', 28 | sl: 'deli', 29 | sr: 'podeli', 30 | sv: 'dela', 31 | tr: 'paylaş', 32 | zh: '分享', 33 | }, 34 | name: 'xing', 35 | faPrefix: 'fab', 36 | faName: 'fa-xing', 37 | title: { 38 | bg: 'Сподели в XING', 39 | cs: 'Sdílet na XINGu', 40 | da: 'Del på XING', 41 | de: 'Bei XING teilen', 42 | en: 'Share on XING', 43 | es: 'Compartir en XING', 44 | fi: 'Jaa XINGissä', 45 | fr: 'Partager sur XING', 46 | hr: 'Podijelite na XING', 47 | hu: 'Megosztás XINGen', 48 | it: 'Condividi su XING', 49 | ja: 'XING上で共有', 50 | ko: 'XING에서 공유하기', 51 | nl: 'Delen op XING', 52 | no: 'Del på XING', 53 | pl: 'Udostępnij przez XING', 54 | pt: 'Compartilhar no XING', 55 | ro: 'Partajează pe XING', 56 | ru: 'Поделиться на XING', 57 | sk: 'Zdieľať na XING', 58 | sl: 'Deli na XING', 59 | sr: 'Podeli na XING-u', 60 | sv: 'Dela på XING', 61 | tr: "XING'ta paylaş", 62 | zh: '分享至XING', 63 | }, 64 | shareUrl: 65 | 'https://www.xing.com/spi/shares/new?url=' + 66 | url + 67 | shariff.getReferrerTrack(), 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /karma.conf.js: -------------------------------------------------------------------------------- 1 | module.exports = function(config) { 2 | config.set({ 3 | webpack: require('./webpack.config.js')[0], 4 | 5 | // base path that will be used to resolve all patterns (eg. files, exclude) 6 | basePath: '', 7 | 8 | // frameworks to use 9 | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter 10 | frameworks: ['mocha'], 11 | 12 | // list of files / patterns to load in the browser 13 | files: [ 14 | 'test/**/*-spec.js' 15 | ], 16 | 17 | // list of files to exclude 18 | exclude: [ 19 | ], 20 | 21 | // preprocess matching files before serving them to the browser 22 | // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor 23 | preprocessors: { 24 | 'test/**/*.js': ['webpack'], 25 | }, 26 | 27 | // test results reporter to use 28 | // possible values: 'dots', 'progress' 29 | // available reporters: https://npmjs.org/browse/keyword/karma-reporter 30 | reporters: ['mocha'], 31 | 32 | // web server port 33 | port: 9876, 34 | 35 | // enable / disable colors in the output (reporters and logs) 36 | colors: true, 37 | 38 | // level of logging 39 | // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG 40 | logLevel: config.LOG_INFO, 41 | 42 | // enable / disable watching file and executing tests whenever any file changes 43 | autoWatch: true, 44 | 45 | // start these browsers 46 | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher 47 | browsers: ['PhantomJS'], 48 | 49 | // Continuous Integration mode 50 | // if true, Karma captures browsers, runs the tests and exits 51 | singleRun: false, 52 | 53 | // Concurrency level 54 | // how many browser should be started simultaneous 55 | concurrency: Infinity 56 | }) 57 | } 58 | -------------------------------------------------------------------------------- /src/js/services/linkedin.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | return { 6 | popup: true, 7 | shareText: { 8 | bg: 'cподеляне', 9 | cs: 'sdílet', 10 | da: 'del', 11 | de: 'mitteilen', 12 | en: 'share', 13 | es: 'compartir', 14 | fi: 'Jaa', 15 | fr: 'partager', 16 | hr: 'podijelite', 17 | hu: 'megosztás', 18 | it: 'condividi', 19 | ja: 'シェア', 20 | ko: '공유하기', 21 | nl: 'delen', 22 | no: 'del', 23 | pl: 'udostępnij', 24 | pt: 'compartilhar', 25 | ro: 'distribuiți', 26 | ru: 'поделиться', 27 | sk: 'zdieľať', 28 | sl: 'deli', 29 | sr: 'podeli', 30 | sv: 'dela', 31 | tr: 'paylaş', 32 | zh: '分享', 33 | }, 34 | name: 'linkedin', 35 | faPrefix: 'fab', 36 | faName: 'fa-linkedin-in', 37 | title: { 38 | bg: 'Сподели в LinkedIn', 39 | cs: 'Sdílet na LinkedIn', 40 | da: 'Del på LinkedIn', 41 | de: 'Bei LinkedIn teilen', 42 | en: 'Share on LinkedIn', 43 | es: 'Compartir en LinkedIn', 44 | fi: 'Jaa LinkedInissä', 45 | fr: 'Partager sur LinkedIn', 46 | hr: 'Podijelite na LinkedIn', 47 | hu: 'Megosztás LinkedInen', 48 | it: 'Condividi su LinkedIn', 49 | ja: 'LinkedIn上で共有', 50 | ko: 'LinkedIn에서 공유하기', 51 | nl: 'Delen op LinkedIn', 52 | no: 'Del på LinkedIn', 53 | pl: 'Udostępnij przez LinkedIn', 54 | pt: 'Compartilhar no LinkedIn', 55 | ro: 'Partajează pe LinkedIn', 56 | ru: 'Поделиться на LinkedIn', 57 | sk: 'Zdieľať na LinkedIn', 58 | sl: 'Deli na LinkedIn', 59 | sr: 'Podeli na LinkedIn-u', 60 | sv: 'Dela på LinkedIn', 61 | tr: "LinkedIn'ta paylaş", 62 | zh: '在LinkedIn上分享', 63 | }, 64 | shareUrl: 'https://www.linkedin.com/sharing/share-offsite/?url=' + url, 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/js/services/telegram.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | 6 | return { 7 | popup: true, 8 | shareText: { 9 | bg: 'cподеляне', 10 | cs: 'sdílet', 11 | da: 'del', 12 | de: 'teilen', 13 | en: 'share', 14 | es: 'compartir', 15 | fi: 'Jaa', 16 | fr: 'partager', 17 | hr: 'podijelite', 18 | hu: 'megosztás', 19 | it: 'condividi', 20 | ja: '共有', 21 | ko: '공유하기', 22 | nl: 'delen', 23 | no: 'del', 24 | pl: 'udostępnij', 25 | pt: 'compartilhar', 26 | ro: 'partajează', 27 | ru: 'поделиться', 28 | sk: 'zdieľať', 29 | sl: 'deli', 30 | sr: 'podeli', 31 | sv: 'dela', 32 | tr: 'paylaş', 33 | zh: '分享', 34 | }, 35 | name: 'telegram', 36 | faPrefix: 'fab', 37 | faName: 'fa-telegram', 38 | title: { 39 | bg: 'Сподели в Telegram', 40 | cs: 'Sdílet na Telegramu', 41 | da: 'Del på Telegram', 42 | de: 'Bei Telegram teilen', 43 | en: 'Share on Telegram', 44 | es: 'Compartir en Telegram', 45 | fi: 'Jaa Telegramissä', 46 | fr: 'Partager sur Telegram', 47 | hr: 'Podijelite na Telegram', 48 | hu: 'Megosztás Telegramen', 49 | it: 'Condividi su Telegram', 50 | ja: 'Telegram上で共有', 51 | ko: 'Telegram에서 공유하기', 52 | nl: 'Delen op Telegram', 53 | no: 'Del på Telegram', 54 | pl: 'Udostępnij przez Telegram', 55 | pt: 'Compartilhar no Telegram', 56 | ro: 'Partajează pe Telegram', 57 | ru: 'Поделиться на Telegram', 58 | sk: 'Zdieľať na Telegram', 59 | sl: 'Deli na Telegram', 60 | sr: 'Podeli na Telegram-u', 61 | sv: 'Dela på Telegram', 62 | tr: "Telegram'ta paylaş", 63 | zh: '在Telegram上分享', 64 | }, 65 | shareUrl: 'https://t.me/share/url?url=' + url + shariff.getReferrerTrack(), 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/js/services/tumblr.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | 6 | return { 7 | popup: true, 8 | shareText: { 9 | bg: 'cподеляне', 10 | cs: 'sdílet', 11 | da: 'del', 12 | de: 'teilen', 13 | en: 'share', 14 | es: 'compartir', 15 | fi: 'Jaa', 16 | fr: 'partager', 17 | hr: 'podijelite', 18 | hu: 'megosztás', 19 | it: 'condividi', 20 | ja: '共有', 21 | ko: '공유하기', 22 | nl: 'delen', 23 | no: 'del', 24 | pl: 'udostępnij', 25 | pt: 'compartilhar', 26 | ro: 'partajează', 27 | ru: 'поделиться', 28 | sk: 'zdieľať', 29 | sl: 'deli', 30 | sr: 'podeli', 31 | sv: 'dela', 32 | tr: 'paylaş', 33 | zh: '分享', 34 | }, 35 | name: 'tumblr', 36 | faPrefix: 'fab', 37 | faName: 'fa-tumblr', 38 | title: { 39 | bg: 'Сподели в tumblr', 40 | cs: 'Sdílet na tumblru', 41 | da: 'Del på tumblr', 42 | de: 'Bei tumblr teilen', 43 | en: 'Share on tumblr', 44 | es: 'Compartir en tumblr', 45 | fi: 'Jaa tumblrissä', 46 | fr: 'Partager sur tumblr', 47 | hr: 'Podijelite na tumblr', 48 | hu: 'Megosztás tumblren', 49 | it: 'Condividi su tumblr', 50 | ja: 'tumblr上で共有', 51 | ko: 'tumblr에서 공유하기', 52 | nl: 'Delen op tumblr', 53 | no: 'Del på tumblr', 54 | pl: 'Udostępnij przez tumblr', 55 | pt: 'Compartilhar no tumblr', 56 | ro: 'Partajează pe tumblr', 57 | ru: 'Поделиться на tumblr', 58 | sk: 'Zdieľať na tumblr', 59 | sl: 'Deli na tumblr', 60 | sr: 'Podeli na tumblr-u', 61 | sv: 'Dela på tumblr', 62 | tr: "tumblr'ta paylaş", 63 | zh: '在tumblr上分享', 64 | }, 65 | shareUrl: 66 | 'https://tumblr.com/widgets/share/tool?canonicalUrl=' + 67 | url + 68 | shariff.getReferrerTrack(), 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/js/services/fediverse.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | 6 | return { 7 | popup: false, 8 | shareText: { 9 | bg: 'cподеляне', 10 | cs: 'sdílet', 11 | da: 'del', 12 | de: 'teilen', 13 | en: 'share', 14 | es: 'compartir', 15 | fi: 'Jaa', 16 | fr: 'partager', 17 | hr: 'podijelite', 18 | hu: 'megosztás', 19 | it: 'condividi', 20 | ja: '共有', 21 | ko: '공유하기', 22 | nl: 'delen', 23 | no: 'del', 24 | pl: 'udostępnij', 25 | pt: 'compartilhar', 26 | ro: 'partajează', 27 | ru: 'поделиться', 28 | sk: 'zdieľať', 29 | sl: 'deli', 30 | sr: 'podeli', 31 | sv: 'dela', 32 | tr: 'paylaş', 33 | zh: '分享', 34 | }, 35 | name: 'fediverse', 36 | faPrefix: 'fas', 37 | faName: 'fa-lock', 38 | title: { 39 | bg: 'Сподели в Fediverse', 40 | cs: 'Sdílet na Fediverse', 41 | da: 'Del på Fediverse', 42 | de: 'Im Fediverse teilen', 43 | en: 'Share in Fediverse', 44 | es: 'Compartir en Fediverse', 45 | fi: 'Jaa Fediverseissä', 46 | fr: 'Partager sur Fediverse', 47 | hr: 'Podijelite na Fediverse', 48 | hu: 'Megosztás Fediverseen', 49 | it: 'Condividi su Fediverse', 50 | ja: 'Fediverse上で共有', 51 | ko: 'Fediverse에서 공유하기', 52 | nl: 'Delen op Fediverse', 53 | no: 'Del på Fediverse', 54 | pl: 'Udostępnij przez Fediverse', 55 | pt: 'Compartilhar no Fediverse', 56 | ro: 'Partajează pe Fediverse', 57 | ru: 'Поделиться на Fediverse', 58 | sk: 'Zdieľať na Fediverse', 59 | sl: 'Deli na Fediverse', 60 | sr: 'Podeli na Fediverse-u', 61 | sv: 'Dela på Fediverse', 62 | tr: "Fediverse'ta paylaş", 63 | zh: '在Fediverse上分享', 64 | }, 65 | shareUrl: 'web+mastodon://share?text=' + url + shariff.getReferrerTrack(), 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/js/services/facebook.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | return { 6 | popup: true, 7 | shareText: { 8 | bg: 'cподеляне', 9 | cs: 'sdílet', 10 | da: 'del', 11 | de: 'teilen', 12 | en: 'share', 13 | es: 'compartir', 14 | fi: 'Jaa', 15 | fr: 'partager', 16 | hr: 'podijelite', 17 | hu: 'megosztás', 18 | it: 'condividi', 19 | ja: '共有', 20 | ko: '공유하기', 21 | nl: 'delen', 22 | no: 'del', 23 | pl: 'udostępnij', 24 | pt: 'compartilhar', 25 | ro: 'partajează', 26 | ru: 'поделиться', 27 | sk: 'zdieľať', 28 | sl: 'deli', 29 | sr: 'podeli', 30 | sv: 'dela', 31 | tr: 'paylaş', 32 | zh: '分享', 33 | }, 34 | name: 'facebook', 35 | faPrefix: 'fab', 36 | faName: 'fa-facebook-f', 37 | title: { 38 | bg: 'Сподели във Facebook', 39 | cs: 'Sdílet na Facebooku', 40 | da: 'Del på Facebook', 41 | de: 'Bei Facebook teilen', 42 | en: 'Share on Facebook', 43 | es: 'Compartir en Facebook', 44 | fi: 'Jaa Facebookissa', 45 | fr: 'Partager sur Facebook', 46 | hr: 'Podijelite na Facebooku', 47 | hu: 'Megosztás Facebookon', 48 | it: 'Condividi su Facebook', 49 | ja: 'フェイスブック上で共有', 50 | ko: '페이스북에서 공유하기', 51 | nl: 'Delen op Facebook', 52 | no: 'Del på Facebook', 53 | pl: 'Udostępnij na Facebooku', 54 | pt: 'Compartilhar no Facebook', 55 | ro: 'Partajează pe Facebook', 56 | ru: 'Поделиться на Facebook', 57 | sk: 'Zdieľať na Facebooku', 58 | sl: 'Deli na Facebooku', 59 | sr: 'Podeli na Facebook-u', 60 | sv: 'Dela på Facebook', 61 | tr: "Facebook'ta paylaş", 62 | zh: '在Facebook上分享', 63 | }, 64 | shareUrl: 65 | 'https://www.facebook.com/sharer/sharer.php?u=' + 66 | url + 67 | shariff.getReferrerTrack(), 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/js/services/weibo.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | 6 | var title = shariff.getTitle() 7 | 8 | return { 9 | popup: true, 10 | shareText: { 11 | bg: 'cподеляне', 12 | cs: 'sdílet', 13 | da: 'del', 14 | de: 'teilen', 15 | en: 'share', 16 | es: 'compartir', 17 | fi: 'Jaa', 18 | fr: 'partager', 19 | hr: 'podijelite', 20 | hu: 'megosztás', 21 | it: 'condividi', 22 | ja: '共有', 23 | ko: '공유하기', 24 | nl: 'delen', 25 | no: 'del', 26 | pl: 'udostępnij', 27 | pt: 'compartilhar', 28 | ro: 'partajează', 29 | ru: 'поделиться', 30 | sk: 'zdieľať', 31 | sl: 'deli', 32 | sr: 'podeli', 33 | sv: 'dela', 34 | tr: 'paylaş', 35 | zh: '分享', 36 | }, 37 | name: 'weibo', 38 | faPrefix: 'fab', 39 | faName: 'fa-weibo', 40 | title: { 41 | bg: 'Сподели в weibo', 42 | cs: 'Sdílet na weibo', 43 | da: 'Del på weibo', 44 | de: 'Bei weibo teilen', 45 | en: 'Share on weibo', 46 | es: 'Compartir en weibo', 47 | fi: 'Jaa weiboissä', 48 | fr: 'Partager sur weibo', 49 | hr: 'Podijelite na weibo', 50 | hu: 'Megosztás weiboen', 51 | it: 'Condividi su weibo', 52 | ja: 'Weibo上で共有', 53 | ko: 'Weibo에서 공유하기', 54 | nl: 'Delen op weibo', 55 | no: 'Del på weibo', 56 | pl: 'Udostępnij przez weibo', 57 | pt: 'Compartilhar no weibo', 58 | ro: 'Partajează pe weibo', 59 | ru: 'Поделиться на weibo', 60 | sk: 'Zdieľať na weibo', 61 | sl: 'Deli na weibo', 62 | sr: 'Podeli na weibo-u', 63 | sv: 'Dela på weibo', 64 | tr: "Weibo'ta paylaş", 65 | zh: '分享至新浪微博', 66 | }, 67 | shareUrl: 68 | 'https://service.weibo.com/share/share.php?url=' + 69 | url + 70 | '&title=' + 71 | title + 72 | shariff.getReferrerTrack(), 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/js/services/qzone.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | 6 | var title = shariff.getTitle() 7 | 8 | return { 9 | popup: true, 10 | shareText: { 11 | bg: 'cподеляне', 12 | cs: 'sdílet', 13 | da: 'del', 14 | de: 'teilen', 15 | en: 'share', 16 | es: 'compartir', 17 | fi: 'Jaa', 18 | fr: 'partager', 19 | hr: 'podijelite', 20 | hu: 'megosztás', 21 | it: 'condividi', 22 | ja: '共有', 23 | ko: '공유하기', 24 | nl: 'delen', 25 | no: 'del', 26 | pl: 'udostępnij', 27 | pt: 'compartilhar', 28 | ro: 'partajează', 29 | ru: 'поделиться', 30 | sk: 'zdieľať', 31 | sl: 'deli', 32 | sr: 'podeli', 33 | sv: 'dela', 34 | tr: 'paylaş', 35 | zh: '分享', 36 | }, 37 | name: 'qzone', 38 | faPrefix: 'fab', 39 | faName: 'fa-qq', 40 | title: { 41 | bg: 'Сподели в Qzone', 42 | cs: 'Sdílet na Qzone', 43 | da: 'Del på Qzone', 44 | de: 'Bei Qzone teilen', 45 | en: 'Share on Qzone', 46 | es: 'Compartir en Qzone', 47 | fi: 'Jaa Qzoneissä', 48 | fr: 'Partager sur Qzone', 49 | hr: 'Podijelite na Qzone', 50 | hu: 'Megosztás Qzone', 51 | it: 'Condividi su Qzone', 52 | ja: 'Qzone上で共有', 53 | ko: 'Qzone에서 공유하기', 54 | nl: 'Delen op Qzone', 55 | no: 'Del på Qzone', 56 | pl: 'Udostępnij przez Qzone', 57 | pt: 'Compartilhar no Qzone', 58 | ro: 'Partajează pe Qzone', 59 | ru: 'Поделиться на Qzone', 60 | sk: 'Zdieľať na Qzone', 61 | sl: 'Deli na Qzone', 62 | sr: 'Podeli na Qzone-u', 63 | sv: 'Dela på Qzone', 64 | tr: "Qzone'ta paylaş", 65 | zh: '分享至QQ空间', 66 | }, 67 | shareUrl: 68 | 'https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=' + 69 | url + 70 | '&title=' + 71 | title + 72 | shariff.getReferrerTrack(), 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/js/services/buffer.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | var title = encodeURIComponent(shariff.getTitle()) 6 | return { 7 | popup: true, 8 | shareText: { 9 | bg: 'cподеляне', 10 | cs: 'sdílet', 11 | da: 'del', 12 | de: 'teilen', 13 | en: 'share', 14 | es: 'compartir', 15 | fi: 'Jaa', 16 | fr: 'partager', 17 | hr: 'podijelite', 18 | hu: 'megosztás', 19 | it: 'condividi', 20 | ja: '共有', 21 | ko: '공유하기', 22 | nl: 'delen', 23 | no: 'del', 24 | pl: 'udostępnij', 25 | pt: 'compartilhar', 26 | ro: 'partajează', 27 | ru: 'поделиться', 28 | sk: 'zdieľať', 29 | sl: 'deli', 30 | sr: 'podeli', 31 | sv: 'dela', 32 | tr: 'paylaş', 33 | zh: '分享', 34 | }, 35 | name: 'buffer', 36 | faPrefix: 'fab', 37 | faName: 'fa-buffer', 38 | title: { 39 | bg: 'Сподели в buffer', 40 | cs: 'Sdílet na buffer', 41 | da: 'Del på buffer', 42 | de: 'Bei buffer teilen', 43 | en: 'Share on buffer', 44 | es: 'Compartir en buffer', 45 | fi: 'Jaa bufferissä', 46 | fr: 'Partager sur buffer', 47 | hr: 'Podijelite na buffer', 48 | hu: 'Megosztás bufferen', 49 | it: 'Condividi su buffer', 50 | ja: 'buffer上で共有', 51 | ko: 'buffer에서 공유하기', 52 | nl: 'Delen op buffer', 53 | no: 'Del på buffer', 54 | pl: 'Udostępnij przez buffer', 55 | pt: 'Compartilhar no buffer', 56 | ro: 'Partajează pe buffer', 57 | ru: 'Поделиться на buffer', 58 | sk: 'Zdieľať na buffer', 59 | sl: 'Deli na buffer', 60 | sr: 'Podeli na buffer', 61 | sv: 'Dela på buffer', 62 | tr: "buffer'ta paylaş", 63 | zh: '在buffer上分享', 64 | }, 65 | shareUrl: 66 | 'https://buffer.com/add?text=' + 67 | title + 68 | '&url=' + 69 | url + 70 | shariff.getReferrerTrack(), 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/js/services/threema.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | 6 | var title = shariff.getTitle() 7 | 8 | return { 9 | popup: false, 10 | shareText: { 11 | bg: 'cподеляне', 12 | cs: 'sdílet', 13 | da: 'del', 14 | de: 'teilen', 15 | en: 'share', 16 | es: 'compartir', 17 | fi: 'Jaa', 18 | fr: 'partager', 19 | hr: 'podijelite', 20 | hu: 'megosztás', 21 | it: 'condividi', 22 | ja: '共有', 23 | ko: '공유하기', 24 | nl: 'delen', 25 | no: 'del', 26 | pl: 'udostępnij', 27 | pt: 'compartilhar', 28 | ro: 'partajează', 29 | ru: 'поделиться', 30 | sk: 'zdieľať', 31 | sl: 'deli', 32 | sr: 'podeli', 33 | sv: 'dela', 34 | tr: 'paylaş', 35 | zh: '分享', 36 | }, 37 | name: 'threema', 38 | faPrefix: 'fas', 39 | faName: 'fa-lock', 40 | title: { 41 | bg: 'Сподели в Threema', 42 | cs: 'Sdílet na Threema', 43 | da: 'Del på Threema', 44 | de: 'Bei Threema teilen', 45 | en: 'Share on Threema', 46 | es: 'Compartir en Threema', 47 | fi: 'Jaa Threemaissä', 48 | fr: 'Partager sur Threema', 49 | hr: 'Podijelite na Threema', 50 | hu: 'Megosztás Threemaen', 51 | it: 'Condividi su Threema', 52 | ja: 'Threema上で共有', 53 | ko: 'Threema에서 공유하기', 54 | nl: 'Delen op Threema', 55 | no: 'Del på Threema', 56 | pl: 'Udostępnij przez Threema', 57 | pt: 'Compartilhar no Threema', 58 | ro: 'Partajează pe Threema', 59 | ru: 'Поделиться на Threema', 60 | sk: 'Zdieľať na Threema', 61 | sl: 'Deli na Threema', 62 | sr: 'Podeli na Threema-u', 63 | sv: 'Dela på Threema', 64 | tr: "Threema'ta paylaş", 65 | zh: '在Threema上分享', 66 | }, 67 | shareUrl: 68 | 'threema://compose?text=' + 69 | encodeURIComponent(title) + 70 | '%20' + 71 | url + 72 | shariff.getReferrerTrack(), 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/js/services/reddit.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | var title = encodeURIComponent(shariff.getTitle()) 6 | 7 | if (title !== '') { 8 | title = '&title=' + title 9 | } 10 | 11 | return { 12 | popup: true, 13 | shareText: { 14 | bg: 'cподеляне', 15 | cs: 'sdílet', 16 | da: 'del', 17 | de: 'teilen', 18 | en: 'share', 19 | es: 'compartir', 20 | fi: 'Jaa', 21 | fr: 'partager', 22 | hr: 'podijelite', 23 | hu: 'megosztás', 24 | it: 'condividi', 25 | ja: '共有', 26 | ko: '공유하기', 27 | nl: 'delen', 28 | no: 'del', 29 | pl: 'udostępnij', 30 | pt: 'compartilhar', 31 | ro: 'partajează', 32 | ru: 'поделиться', 33 | sk: 'zdieľať', 34 | sl: 'deli', 35 | sr: 'podeli', 36 | sv: 'dela', 37 | tr: 'paylaş', 38 | zh: '分享', 39 | }, 40 | name: 'reddit', 41 | faPrefix: 'fab', 42 | faName: 'fa-reddit-alien', 43 | title: { 44 | bg: 'Сподели в Reddit', 45 | cs: 'Sdílet na Redditu', 46 | da: 'Del på Reddit', 47 | de: 'Bei Reddit teilen', 48 | en: 'Share on Reddit', 49 | es: 'Compartir en Reddit', 50 | fi: 'Jaa Redditissä', 51 | fr: 'Partager sur Reddit', 52 | hr: 'Podijelite na Reddit', 53 | hu: 'Megosztás Redditen', 54 | it: 'Condividi su Reddit', 55 | ja: 'Reddit上で共有', 56 | ko: 'Reddit에서 공유하기', 57 | nl: 'Delen op Reddit', 58 | no: 'Del på Reddit', 59 | pl: 'Udostępnij przez Reddit', 60 | pt: 'Compartilhar no Reddit', 61 | ro: 'Partajează pe Reddit', 62 | ru: 'Поделиться на Reddit', 63 | sk: 'Zdieľať na Reddit', 64 | sl: 'Deli na Reddit', 65 | sr: 'Podeli na Reddit-u', 66 | sv: 'Dela på Reddit', 67 | tr: "Reddit'ta paylaş", 68 | zh: '分享至Reddit', 69 | }, 70 | shareUrl: 71 | 'https://reddit.com/submit?url=' + 72 | url + 73 | title + 74 | shariff.getReferrerTrack(), 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/js/services/whatsapp.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | 6 | var title = shariff.getTitle() 7 | 8 | return { 9 | popup: true, 10 | shareText: { 11 | bg: 'cподеляне', 12 | cs: 'sdílet', 13 | da: 'del', 14 | de: 'teilen', 15 | en: 'share', 16 | es: 'compartir', 17 | fi: 'Jaa', 18 | fr: 'partager', 19 | hr: 'podijelite', 20 | hu: 'megosztás', 21 | it: 'condividi', 22 | ja: '共有', 23 | ko: '공유하기', 24 | nl: 'delen', 25 | no: 'del', 26 | pl: 'udostępnij', 27 | pt: 'compartilhar', 28 | ro: 'partajează', 29 | ru: 'поделиться', 30 | sk: 'zdieľať', 31 | sl: 'deli', 32 | sr: 'podeli', 33 | sv: 'dela', 34 | tr: 'paylaş', 35 | zh: '分享', 36 | }, 37 | name: 'whatsapp', 38 | faPrefix: 'fab', 39 | faName: 'fa-whatsapp', 40 | title: { 41 | bg: 'Сподели в Whatsapp', 42 | cs: 'Sdílet na Whatsappu', 43 | da: 'Del på Whatsapp', 44 | de: 'Bei Whatsapp teilen', 45 | en: 'Share on Whatsapp', 46 | es: 'Compartir en Whatsapp', 47 | fi: 'Jaa WhatsAppissä', 48 | fr: 'Partager sur Whatsapp', 49 | hr: 'Podijelite na Whatsapp', 50 | hu: 'Megosztás WhatsAppen', 51 | it: 'Condividi su Whatsapp', 52 | ja: 'Whatsapp上で共有', 53 | ko: 'Whatsapp에서 공유하기', 54 | nl: 'Delen op Whatsapp', 55 | no: 'Del på Whatsapp', 56 | pl: 'Udostępnij przez WhatsApp', 57 | pt: 'Compartilhar no Whatsapp', 58 | ro: 'Partajează pe Whatsapp', 59 | ru: 'Поделиться на Whatsapp', 60 | sk: 'Zdieľať na Whatsapp', 61 | sl: 'Deli na Whatsapp', 62 | sr: 'Podeli na WhatsApp-u', 63 | sv: 'Dela på Whatsapp', 64 | tr: "Whatsapp'ta paylaş", 65 | zh: '在Whatsapp上分享', 66 | }, 67 | shareUrl: 68 | 'https://api.whatsapp.com/send?text=' + 69 | encodeURIComponent(title) + 70 | '%20' + 71 | url + 72 | shariff.getReferrerTrack(), 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/js/services/diaspora.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var url = require('url') 4 | 5 | module.exports = function (shariff) { 6 | var shareUrl = url.parse('https://share.diasporafoundation.org/', true) 7 | shareUrl.query.url = shariff.getURL() 8 | shareUrl.query.title = shariff.getTitle() 9 | shareUrl.protocol = 'https' 10 | delete shareUrl.search 11 | 12 | return { 13 | popup: true, 14 | shareText: { 15 | bg: 'cподеляне', 16 | cs: 'sdílet', 17 | da: 'del', 18 | de: 'teilen', 19 | en: 'share', 20 | es: 'compartir', 21 | fi: 'Jaa', 22 | fr: 'partager', 23 | hr: 'podijelite', 24 | hu: 'megosztás', 25 | it: 'condividi', 26 | ja: '共有', 27 | ko: '공유하기', 28 | nl: 'delen', 29 | no: 'del', 30 | pl: 'udostępnij', 31 | pt: 'compartilhar', 32 | ro: 'partajează', 33 | ru: 'поделиться', 34 | sk: 'zdieľať', 35 | sl: 'deli', 36 | sr: 'podeli', 37 | sv: 'dela', 38 | tr: 'paylaş', 39 | zh: '分享', 40 | }, 41 | name: 'diaspora', 42 | faPrefix: 'fas', 43 | faName: 'fa-asterisk', 44 | title: { 45 | bg: 'Сподели в diaspora*', 46 | cs: 'Sdílet na diaspora*', 47 | da: 'Del på diaspora*', 48 | de: 'Bei diaspora* teilen', 49 | en: 'Share on diaspora*', 50 | es: 'Compartir en diaspora*', 51 | fi: 'Jaa Diasporaissä', 52 | fr: 'Partager sur diaspora*', 53 | hr: 'Podijelite na diaspora*', 54 | hu: 'Megosztás diaspora*', 55 | it: 'Condividi su diaspora*', 56 | ja: 'diaspora*上で共有', 57 | ko: 'diaspora*에서 공유하기', 58 | nl: 'Delen op diaspora*', 59 | no: 'Del på diaspora*', 60 | pl: 'Udostępnij przez diaspora*', 61 | pt: 'Compartilhar no diaspora*', 62 | ro: 'Partajează pe diaspora*', 63 | ru: 'Поделиться на diaspora*', 64 | sk: 'Zdieľať na diaspora*', 65 | sl: 'Deli na diaspora*', 66 | sr: 'Podeli na diaspora*-u', 67 | sv: 'Dela på diaspora*', 68 | tr: "diaspora*'ta paylaş", 69 | zh: '分享至diaspora*', 70 | }, 71 | shareUrl: url.format(shareUrl) + shariff.getReferrerTrack(), 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const { 2 | author, 3 | contributors, 4 | homepage, 5 | license, 6 | name, 7 | title, 8 | version, 9 | } = require('./package.json') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const path = require('path') 12 | const webpack = require('webpack') 13 | 14 | const extractLess = new ExtractTextPlugin({filename: '[name].css'}) 15 | 16 | const baseConf = { 17 | output: { 18 | filename: '[name].js', 19 | path: path.resolve(__dirname, 'dist') 20 | }, 21 | module: { 22 | rules: [ 23 | { 24 | test: /\.js$/, 25 | exclude: /node_modules/, 26 | use: { 27 | loader: 'babel-loader', 28 | } 29 | }, 30 | { 31 | test: /\.less$/, 32 | use: extractLess.extract({ 33 | use: [ 34 | { 35 | loader: 'css-loader' 36 | }, 37 | 'postcss-loader', 38 | { 39 | loader: 'less-loader', 40 | options: { 41 | strictMath: true, 42 | noIeCompat: true, 43 | // paths: [ 44 | // path.resolve(__dirname, 'node_modules') 45 | // ], 46 | } 47 | } 48 | ], 49 | fallback: 'style-loader' 50 | }) 51 | }, 52 | { 53 | test: /\.(eot|svg|ttf|woff|woff2)$/, 54 | loader: 'file-loader?name=[name].[ext]' 55 | } 56 | ] 57 | }, 58 | plugins: [ 59 | extractLess, 60 | new webpack.BannerPlugin({ 61 | banner: `${title || name} - v${version} - ${(new Date()).toGMTString()} 62 | ${homepage} 63 | Copyright (c) ${(new Date()).getFullYear()} ${author.name}, ${contributors.map(c => c.name).join(', ')} 64 | Licensed under the ${license} license` 65 | }) 66 | ], 67 | } 68 | 69 | module.exports = [ 70 | Object.assign({}, baseConf, { 71 | entry: { 72 | 'shariff.complete': './src/js/shariff.complete', 73 | } 74 | }), 75 | Object.assign({}, baseConf, { 76 | entry: { 77 | 'shariff.min': './src/js/shariff.min' 78 | }, 79 | externals: { 80 | './dom': 'jQuery', 81 | }, 82 | }), 83 | ] 84 | -------------------------------------------------------------------------------- /src/js/services/tencent-weibo.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | 6 | var title = shariff.getTitle() 7 | 8 | return { 9 | popup: true, 10 | shareText: { 11 | bg: 'cподеляне', 12 | cs: 'sdílet', 13 | da: 'del', 14 | de: 'teilen', 15 | en: 'share', 16 | es: 'compartir', 17 | fi: 'Jaa', 18 | fr: 'partager', 19 | hr: 'podijelite', 20 | hu: 'megosztás', 21 | it: 'condividi', 22 | ja: '共有', 23 | ko: '공유하기', 24 | nl: 'delen', 25 | no: 'del', 26 | pl: 'udostępnij', 27 | pt: 'compartilhar', 28 | ro: 'partajează', 29 | ru: 'поделиться', 30 | sk: 'zdieľať', 31 | sl: 'deli', 32 | sr: 'podeli', 33 | sv: 'dela', 34 | tr: 'paylaş', 35 | zh: '分享', 36 | }, 37 | name: 'tencent-weibo', 38 | faPrefix: 'fab', 39 | faName: 'fa-tencent-weibo', 40 | title: { 41 | bg: 'Сподели в tencent weibo', 42 | cs: 'Sdílet na tencent weibo', 43 | da: 'Del på tencent weibo', 44 | de: 'Bei tencent weibo teilen', 45 | en: 'Share on tencent weibo', 46 | es: 'Compartir en tencent weibo', 47 | fi: 'Jaa tencent weiboissä', 48 | fr: 'Partager sur tencent weibo', 49 | hr: 'Podijelite na tencent weibo', 50 | hu: 'Megosztás tencent weiboen', 51 | it: 'Condividi su tencent weibo', 52 | ja: 'Tencent weibo上で共有', 53 | ko: 'Tencent weibo에서 공유하기', 54 | nl: 'Delen op tencent weibo', 55 | no: 'Del på tencent weibo', 56 | pl: 'Udostępnij przez tencent weibo', 57 | pt: 'Compartilhar no tencent weibo', 58 | ro: 'Partajează pe tencent weibo', 59 | ru: 'Поделиться на tencent weibo', 60 | sk: 'Zdieľať na tencent weibo', 61 | sl: 'Deli na tencent weibo', 62 | sr: 'Podeli na tencent weibo-u', 63 | sv: 'Dela på tencent weibo', 64 | tr: "Tencent weibo'ta paylaş", 65 | zh: '分享至腾讯微博', 66 | }, 67 | shareUrl: 68 | 'https://v.t.qq.com/share/share.php?url=' + 69 | url + 70 | '&title=' + 71 | title + 72 | shariff.getReferrerTrack(), 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/js/services/stumbleupon.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | module.exports = function (shariff) { 4 | var url = encodeURIComponent(shariff.getURL()) 5 | var title = encodeURIComponent(shariff.getTitle()) 6 | 7 | if (title !== '') { 8 | title = '&title=' + title 9 | } 10 | 11 | return { 12 | popup: true, 13 | shareText: { 14 | bg: 'cподеляне', 15 | cs: 'sdílet', 16 | da: 'del', 17 | de: 'teilen', 18 | en: 'share', 19 | es: 'compartir', 20 | fi: 'Jaa', 21 | fr: 'partager', 22 | hr: 'podijelite', 23 | hu: 'megosztás', 24 | it: 'condividi', 25 | ja: '共有', 26 | ko: '공유하기', 27 | nl: 'delen', 28 | no: 'del', 29 | pl: 'udostępnij', 30 | pt: 'compartilhar', 31 | ro: 'partajează', 32 | ru: 'поделиться', 33 | sk: 'zdieľať', 34 | sl: 'deli', 35 | sr: 'podeli', 36 | sv: 'dela', 37 | tr: 'paylaş', 38 | zh: '分享', 39 | }, 40 | name: 'stumbleupon', 41 | faPrefix: 'fab', 42 | faName: 'fa-stumbleupon', 43 | title: { 44 | bg: 'Сподели в Stumbleupon', 45 | cs: 'Sdílet na Stumbleuponu', 46 | da: 'Del på Stumbleupon', 47 | de: 'Bei Stumbleupon teilen', 48 | en: 'Share on Stumbleupon', 49 | es: 'Compartir en Stumbleupon', 50 | fi: 'Jaa Stumbleuponissä', 51 | fr: 'Partager sur Stumbleupon', 52 | hr: 'Podijelite na Stumbleupon', 53 | hu: 'Megosztás Stumbleupon', 54 | it: 'Condividi su Stumbleupon', 55 | ja: 'Stumbleupon上で共有', 56 | ko: 'Stumbleupon에서 공유하기', 57 | nl: 'Delen op Stumbleupon', 58 | no: 'Del på Stumbleupon', 59 | pl: 'Udostępnij przez Stumbleupon', 60 | pt: 'Compartilhar no Stumbleupon', 61 | ro: 'Partajează pe Stumbleupon', 62 | ru: 'Поделиться на Stumbleupon', 63 | sk: 'Zdieľať na Stumbleupon', 64 | sl: 'Deli na Stumbleupon', 65 | sr: 'Podeli na Stumbleupon-u', 66 | sv: 'Dela på Stumbleupon', 67 | tr: "Stumbleupon'ta paylaş", 68 | zh: '分享至Stumbleupon', 69 | }, 70 | shareUrl: 71 | 'https://www.stumbleupon.com/submit?url=' + 72 | url + 73 | title + 74 | shariff.getReferrerTrack(), 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /demo/app.less: -------------------------------------------------------------------------------- 1 | article { 2 | font-family: Arial,sans-serif; 3 | width: 90%; 4 | max-width: 900px; 5 | margin: 0 auto; 6 | &.slim { 7 | h1 { 8 | line-height: 1.2em; 9 | font-size: 1.5em; 10 | margin-bottom: 15px; 11 | } 12 | time { 13 | display: block; 14 | font-size: 0.8em; 15 | margin-right: 20px; 16 | margin-top: 12px; 17 | color: #666; 18 | font-size: .8em; 19 | } 20 | .deck { 21 | font-size: .9em; 22 | line-height: 1.4; 23 | margin-top: 12px; 24 | font-weight: bold; 25 | } 26 | } 27 | &.wide, &.wide-icon, &.wide-icon-count { 28 | h1 { 29 | font-size: 2em; 30 | @media only screen and (min-width: 600px) { 31 | font-size: 2.9em; 32 | } 33 | } 34 | #article_content { 35 | p { 36 | margin: 0; 37 | line-height: 1.4; 38 | } 39 | } 40 | } 41 | &.wide { 42 | #article_extras { 43 | @media only screen and (min-width: 600px) { 44 | width: 30%; 45 | min-width: 130px; 46 | max-width: 190px; 47 | float: left; 48 | box-sizing: border-box; 49 | padding-right: 30px; 50 | } 51 | } 52 | #article_content { 53 | @media only screen and (min-width: 600px) { 54 | width: 70%; 55 | float: left; 56 | } 57 | } 58 | } 59 | &.wide-icon { 60 | #article_extras { 61 | width: 35px; 62 | float: left; 63 | padding-right: 30px; 64 | } 65 | } 66 | &.wide-icon-count { 67 | #article_extras { 68 | width: 80px; 69 | float: left; 70 | padding-right: 30px; 71 | } 72 | } 73 | } 74 | hr { 75 | margin: 40px 0 20px; 76 | border-top: 3px dashed #ccc; 77 | border-bottom: none; 78 | clear: left; 79 | } 80 | .layout-hint { 81 | font-size: .8em; 82 | dt { 83 | color: #666; 84 | width: 10em; 85 | float: left; 86 | } 87 | dd { 88 | margin: 0; 89 | color: #333; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/js/services/twitter.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | var url = require('url') 4 | 5 | // abbreviate at last blank before length and add "\u2026" (horizontal ellipsis) 6 | var abbreviateText = function (text, length) { 7 | var div = document.createElement('div') 8 | var node = document.createTextNode(text) 9 | div.appendChild(node) 10 | var abbreviated = div.textContent 11 | if (abbreviated.length <= length) { 12 | return text 13 | } 14 | 15 | var lastWhitespaceIndex = abbreviated 16 | .substring(0, length - 1) 17 | .lastIndexOf(' ') 18 | abbreviated = abbreviated.substring(0, lastWhitespaceIndex) + '\u2026' 19 | 20 | return abbreviated 21 | } 22 | 23 | module.exports = function (shariff) { 24 | var shareUrl = url.parse('https://twitter.com/intent/tweet', true) 25 | 26 | var title = shariff.getTitle() 27 | 28 | shareUrl.query.url = shariff.getURL() 29 | if (shariff.options.twitterVia !== null) { 30 | shareUrl.query.via = shariff.options.twitterVia 31 | } 32 | // From Twitters documentation (May 2021): 33 | // The length of your passed Tweet text should not exceed 280 characters 34 | // when combined with any passed hashtags, via, or url parameters. 35 | var remainingTextLength = 36 | 280 - (shareUrl.query.via || '').length - (shareUrl.query.url || '').length 37 | shareUrl.query.text = abbreviateText(title, remainingTextLength) 38 | 39 | delete shareUrl.search 40 | 41 | return { 42 | popup: true, 43 | shareText: { 44 | de: 'posten', 45 | en: 'post', 46 | ja: '投稿', 47 | ko: '게시물', 48 | ru: 'Посты', 49 | sr: 'pošta', 50 | zh: '职位', 51 | }, 52 | name: 'twitter', 53 | faPrefix: 'fab fa-brands', 54 | faName: 'fa-x-twitter', 55 | title: { 56 | bg: 'Сподели в X', 57 | cs: 'Sdílet na X', 58 | da: 'Del på X', 59 | de: 'Bei X teilen', 60 | en: 'Share on X', 61 | es: 'Compartir en X', 62 | fi: 'Jaa X', 63 | fr: 'Partager sur X', 64 | hr: 'Podijelite na X', 65 | hu: 'Megosztás X', 66 | it: 'Condividi su X', 67 | ja: 'Xで共有する', 68 | ko: 'X에서 공유', 69 | nl: 'Delen op X', 70 | no: 'Del på X', 71 | pl: 'Udostępnij na X', 72 | pt: 'Compartilhar no X', 73 | ro: 'Partajează pe X', 74 | ru: 'Поделиться на X', 75 | sk: 'Zdieľať na X', 76 | sl: 'Deli na X', 77 | sr: 'Podeli na X-u', 78 | sv: 'Dela på X', 79 | tr: "X'da paylaş", 80 | zh: '在X上分享', 81 | }, 82 | // shareUrl: 'https://twitter.com/intent/tweet?text='+ shariff.getShareText() + '&url=' + url 83 | shareUrl: url.format(shareUrl) + shariff.getReferrerTrack(), 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "shariff", 3 | "version": "3.3.1", 4 | "description": "Shariff enables website users to share their favorite content without compromising their privacy.", 5 | "main": "src/js/shariff.js", 6 | "scripts": { 7 | "dev": "webpack-dev-server --hot --inline --port 3000 --content-base demo --entry app=./demo/app.js", 8 | "test": "eslint src && karma start --single-run", 9 | "build": "rm -fr dist && webpack -p", 10 | "build_zip": "7z a -tzip $BASE_NAME.zip ./dist/* && 7z a -ttar $BASE_NAME.tar ./dist/* && 7z a $BASE_NAME.tar.gz $BASE_NAME.tar", 11 | "prepare": "husky install" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/heiseonline/shariff" 16 | }, 17 | "author": { 18 | "name": "Ines Pauer", 19 | "email": "ipa@heise.de" 20 | }, 21 | "contributors": [ 22 | { 23 | "name": "Philipp Busse", 24 | "email": "pmb@heise.de" 25 | }, 26 | { 27 | "name": "Sebastian Hilbig", 28 | "email": "seh@heise.de" 29 | }, 30 | { 31 | "name": "Erich Kramer", 32 | "email": "km@heise.de" 33 | }, 34 | { 35 | "name": "Deniz Sesli", 36 | "email": "dzs@heise.de" 37 | } 38 | ], 39 | "dependencies": { 40 | "@fortawesome/fontawesome-free": "^6.6.0", 41 | "jquery": "^3.4.1" 42 | }, 43 | "publishConfig": { 44 | "registry": "https://registry.npmjs.org" 45 | }, 46 | "homepage": "https://github.com/heiseonline/shariff", 47 | "devDependencies": { 48 | "autoprefixer": "^8.6.5", 49 | "babel-core": "^6.26.3", 50 | "babel-loader": "^7.1.5", 51 | "babel-polyfill": "^6.26.0", 52 | "babel-preset-env": "^1.7.0", 53 | "css-loader": "^0.28.11", 54 | "eslint": "^4.19.1", 55 | "eslint-config-standard": "^11.0.0", 56 | "eslint-plugin-import": "^2.17.3", 57 | "eslint-plugin-node": "^6.0.1", 58 | "eslint-plugin-promise": "^3.8.0", 59 | "eslint-plugin-standard": "^3.1.0", 60 | "extract-text-webpack-plugin": "^3.0.2", 61 | "file-loader": "^1.1.11", 62 | "husky": ">=6", 63 | "karma": "^4.1.0", 64 | "karma-chrome-launcher": "^2.2.0", 65 | "karma-mocha": "^1.3.0", 66 | "karma-mocha-reporter": "^2.2.5", 67 | "karma-phantomjs-launcher": "^1.0.4", 68 | "karma-webpack": "^2.0.13", 69 | "less": "^3.9.0", 70 | "less-loader": "^4.1.0", 71 | "lint-staged": ">=10", 72 | "mocha": "^5.2.0", 73 | "postcss-loader": "^2.1.6", 74 | "style-loader": "^0.23.1", 75 | "url-loader": "^1.1.2", 76 | "webpack": "^3.12.0", 77 | "webpack-dev-server": "^2.11.5" 78 | }, 79 | "browserify-shim": { 80 | "./dom": "global:jQuery" 81 | }, 82 | "keywords": [ 83 | "heise", 84 | "social buttons", 85 | "shariff" 86 | ], 87 | "license": "MIT", 88 | "lint-staged": { 89 | "*.js": "eslint --cache --fix" 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /demo/data-title.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Demonstration: Shariff 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
data-title:
foo
17 |
data-services:
[&quot;twitter&quot;,whatsapp&quot;,&quot;facebook&quot;,&quot;xing&quot;,&quot;pinterest&quot;,&quot;linkedin&quot;,&quot;tumblr&quot;,&quot;flattr&quot;,&quot;diaspora&quot;,&quot;reddit&quot;,&quot;stumbleupon&quot;,&quot;threema&quot;,&quot;weibo&quot;,&quot;tencent-weibo&quot;,&quot;qzone&quot;,&quot;print&quot;]
18 |
19 |
20 |
21 |
22 | 23 |
24 | 25 |
26 |
data-title:
bar
27 |
data-services:
[&quot;twitter&quot;,whatsapp&quot;,&quot;facebook&quot;,&quot;xing&quot;,&quot;pinterest&quot;,&quot;linkedin&quot;,&quot;tumblr&quot;,&quot;flattr&quot;,&quot;diaspora&quot;,&quot;reddit&quot;,&quot;stumbleupon&quot;,&quot;threema&quot;,&quot;weibo&quot;,&quot;tencent-weibo&quot;,&quot;qzone&quot;,&quot;print&quot;]
28 |
29 |
30 |
31 |
32 | 33 |
34 | 35 |
36 |
data-services:
[&quot;twitter&quot;,whatsapp&quot;,&quot;facebook&quot;,&quot;xing&quot;,&quot;pinterest&quot;,&quot;linkedin&quot;,&quot;tumblr&quot;,&quot;flattr&quot;,&quot;diaspora&quot;,&quot;reddit&quot;,&quot;stumbleupon&quot;,&quot;threema&quot;,&quot;weibo&quot;,&quot;tencent-weibo&quot;,&quot;qzone&quot;,&quot;print&quot;]
37 |
38 |
39 |
40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /test/dom-spec.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert') 2 | 3 | describe('DOMQuery', function() { 4 | var $ = require('../src/js/dom') 5 | var container = void (0) 6 | 7 | before(() => { 8 | container = document.createElement('div') 9 | container.id = 'spec-html-container' 10 | document.body.appendChild(container) 11 | }) 12 | 13 | beforeEach(function() { 14 | container.innerHTML = ` 15 |

hello

16 |

world

17 | 18 | click!' 19 | ` 20 | }) 21 | 22 | it('creates nodes from html fragment', function () { 23 | var nodes = $('

Heading level 2

Paragraph

') 24 | assert.equal(nodes.length, 2) 25 | assert.equal(nodes[0].parentNode.parentNode, null) 26 | assert.equal(nodes[1].parentNode.parentNode, null) 27 | assert.equal(nodes[0].tagName, 'H2') 28 | assert.equal(nodes[1].tagName, 'P') 29 | }) 30 | 31 | it('finds elements with context', function () { 32 | var matches = $('span', $('p')[0]) 33 | assert.equal(matches[0].textContent, 'world') 34 | }) 35 | 36 | describe('empty()', function() { 37 | it('clears a node of its children', function() { 38 | var h1 = $('h1').empty() 39 | assert.equal(h1[0].children.length, 0) 40 | }) 41 | }) 42 | 43 | describe('text()', function() { 44 | it('returns text content of node', function() { 45 | assert.equal($('h1').text(), 'hello') 46 | }) 47 | 48 | it('sets text content of node', function() { 49 | $('h1').text('goodbye') 50 | assert.equal($('h1').text(), 'goodbye') 51 | }) 52 | }) 53 | 54 | describe('attr()', function () { 55 | it('returns attribute value', function () { 56 | assert.equal($('h1').attr('class'), 'header') 57 | }) 58 | 59 | it('sets attribute value', function () { 60 | $('h1').attr('class', 'new-value') 61 | assert.equal($('h1').attr('class'), 'new-value') 62 | }) 63 | }) 64 | 65 | describe('data()', function () { 66 | it('returns data attribute value', function () { 67 | assert.equal($('#data-attribute').data('key'), 'data-value') 68 | }) 69 | 70 | it('sets data attribute value', function () { 71 | $('#data-attribute').data('key', 'new-value') 72 | assert.equal($('#data-attribute').data('key'), 'new-value') 73 | }) 74 | 75 | it('deserializes data attribute json value', function() { 76 | var data = $('a[data-item]').data() 77 | assert.deepEqual(data.item, ['object-1', 'object-2']) 78 | }) 79 | }) 80 | 81 | describe('find()', function () { 82 | it('returns found elements', function () { 83 | var matches = $('body').find('h1') 84 | var expectedNode = $('h1')[0] 85 | assert.equal(matches[0], expectedNode) 86 | }) 87 | }) 88 | 89 | describe('append()', function () { 90 | it('appends to html fragment', function () { 91 | $('body').append('

appended

') 92 | var bodyChildren = $('body')[0].children 93 | assert.equal(bodyChildren[bodyChildren.length - 1].textContent, 'appended') 94 | }) 95 | 96 | it('appends elements', function () { 97 | var elements = [ document.createElement('div') ] 98 | $('body').append(elements) 99 | var div = document.body.children[document.body.children.length - 1] 100 | assert.equal(elements[0], div) 101 | }) 102 | }) 103 | 104 | describe('prepend()', function () { 105 | it('prepends to html fragment', function () { 106 | $('body').prepend('

prepended

') 107 | assert.equal($('body')[0].firstChild.textContent, 'prepended') 108 | }) 109 | 110 | it('prepends elements', function () { 111 | var elements = [ document.createElement('div') ] 112 | $('body').prepend(elements) 113 | assert.equal(elements[0], document.body.firstChild) 114 | }) 115 | }) 116 | 117 | describe('addClass()', function () { 118 | it('adds class to element', function () { 119 | $('body').addClass('new-class') 120 | assert.equal(document.body.className, 'new-class') 121 | }) 122 | }) 123 | 124 | describe('removeClass()', function () { 125 | it('removes class from element', function () { 126 | $('h1').removeClass('header') 127 | assert.equal($('h1')[0].className, '') 128 | }) 129 | }) 130 | 131 | describe('on()', function () { 132 | let clicked = false 133 | 134 | it('delegates an event listener', function () { 135 | var selector = 'a:last-child' 136 | $('body').on('click', selector, () => { clicked = true }) 137 | $(selector)[0].click() 138 | assert.ok(clicked) 139 | }) 140 | }) 141 | 142 | describe('trigger()', function () { 143 | let custom_detail = false 144 | 145 | it('triggers an event', function () { 146 | var selector = 'a:last-child' 147 | $('body').on('custom', selector, (event) => { custom_detail = event.detail }) 148 | $(selector).trigger('custom', {'hello': 'world'}) 149 | assert.deepEqual(custom_detail, {'hello': 'world'}) 150 | }) 151 | }) 152 | }) 153 | -------------------------------------------------------------------------------- /src/style/shariff-layout.less: -------------------------------------------------------------------------------- 1 | .display-share-text() { 2 | li { 3 | min-width: 110px; 4 | max-width: 160px; 5 | .share_text { 6 | text-indent: 0; 7 | display: inline; 8 | } 9 | } 10 | } 11 | 12 | .shariff { 13 | &::after, 14 | &::before { 15 | content: " "; 16 | display: table; 17 | } 18 | &::after { 19 | clear: both; 20 | } 21 | ul { 22 | padding: 0; 23 | margin: 0; 24 | list-style: none; 25 | } 26 | li { 27 | height: 35px; 28 | box-sizing: border-box; 29 | overflow: hidden; 30 | padding: 0; 31 | border: none; 32 | a { 33 | color: #fff; 34 | position: relative; 35 | display: block; 36 | height: 35px; 37 | text-decoration: none; 38 | box-sizing: border-box; 39 | } 40 | .share_text, 41 | .share_count { 42 | font-family: Arial, Helvetica, sans-serif; 43 | font-size: 12px; 44 | vertical-align: middle; 45 | line-height: 35px; 46 | } 47 | .fab, 48 | .far, 49 | .fas { 50 | width: 35px; 51 | line-height: 35px; 52 | text-align: center; 53 | vertical-align: middle; 54 | } 55 | .share_count { 56 | padding: 0 8px; 57 | height: 33px; 58 | position: absolute; 59 | top: 1px; 60 | right: 1px; 61 | } 62 | } 63 | 64 | // ------------- horizontal alignment (standard) 65 | .orientation-horizontal { 66 | /* autoprefixer: off */ 67 | display: -webkit-box; 68 | li { 69 | -webkit-box-flex: 1; 70 | } 71 | .info { 72 | -webkit-box-flex: 0; 73 | } 74 | } 75 | .orientation-horizontal { 76 | display: flex; 77 | flex-wrap: wrap; 78 | li { 79 | float: left; 80 | flex: none; 81 | width: 35px; 82 | margin-right: 3%; 83 | margin-bottom: 10px; 84 | &:last-child { 85 | margin-right: 0; 86 | } 87 | .share_text { 88 | display: block; 89 | text-indent: -9999px; 90 | padding-left: 3px; 91 | } 92 | .share_count { 93 | display: none; 94 | } 95 | } 96 | } 97 | 98 | // ------------------------- colourless design 99 | 100 | .theme-grey { 101 | .shariff-button { 102 | a { 103 | background-color: #b0b0b0; 104 | } 105 | .share_count { 106 | background-color: #ccc; 107 | color: #333; 108 | } 109 | } 110 | } 111 | 112 | // ------------------------- even less colorful design 113 | 114 | .theme-white { 115 | .shariff-button { 116 | border: 1px solid #ddd; 117 | a { 118 | background-color: #fff; 119 | &:hover { 120 | background-color: #eee; 121 | } 122 | } 123 | .share_count { 124 | background-color: #fff; 125 | color: #999; 126 | } 127 | } 128 | } 129 | 130 | // ------------------------- vertical alignment 131 | 132 | .orientation-vertical { 133 | &.button-style-icon { 134 | min-width: 35px; 135 | } 136 | &.button-style-icon-count { 137 | min-width: 80px; 138 | } 139 | &.button-style-standard { 140 | min-width: 110px; 141 | } 142 | li { 143 | display: block; 144 | width: 100%; 145 | margin: 5px 0; 146 | } 147 | &.button-style-standard, &.button-style-icon-count { 148 | li { 149 | .share_count { 150 | width: 24px; 151 | text-align: right; 152 | } 153 | } 154 | } 155 | } 156 | } 157 | 158 | // --------------- adjustments for small devices 159 | 160 | @media only screen and (min-width: 360px) { 161 | .shariff .orientation-horizontal { 162 | li { 163 | margin-right: 1.8%; 164 | } 165 | &.button-style-standard, &.button-style-icon-count { 166 | li { 167 | min-width: 80px; 168 | .share_count { 169 | display: block; 170 | } 171 | } 172 | } 173 | &.button-style-standard { 174 | li { 175 | width: auto; 176 | flex: 1 0 auto; 177 | } 178 | } 179 | &.button-style-standard.shariff-col-1, &.button-style-standard.shariff-col-2 { 180 | .display-share-text; 181 | } 182 | &.button-style-standard.shariff-col-5, &.button-style-standard.shariff-col-6 { 183 | li { 184 | flex: none; 185 | } 186 | } 187 | } 188 | } 189 | 190 | @media only screen and (min-width: 640px) { 191 | .shariff .orientation-horizontal.button-style-standard.shariff-col-3 { 192 | .display-share-text; 193 | } 194 | } 195 | 196 | @media only screen and (min-width: 768px) { 197 | .shariff .orientation-horizontal.button-style-standard { 198 | .display-share-text; 199 | &.shariff-col-5, &.shariff-col-6 { 200 | li { 201 | flex: 1 0 auto; 202 | } 203 | } 204 | } 205 | } 206 | 207 | // --------------- desktop layout 208 | 209 | @media only screen and (min-width: 1024px) { 210 | .shariff { 211 | li { 212 | height: 30px; 213 | a { 214 | height: 30px; 215 | } 216 | .fab, 217 | .far, 218 | .fas{ 219 | width: 30px; 220 | line-height: 30px; 221 | } 222 | .share_text, 223 | .share_count { 224 | line-height: 30px; 225 | } 226 | .share_count { 227 | height: 28px; 228 | } 229 | } 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /src/js/shariff.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | // require('babel-polyfill') 4 | 5 | const $ = require('./dom') 6 | const services = require('./services') 7 | const url = require('url') 8 | 9 | // Defaults may be overridden either by passing "options" to Shariff constructor 10 | // or by setting data attributes. 11 | const Defaults = { 12 | theme: 'color', 13 | 14 | // URL to backend that requests social counts. null means "disabled" 15 | backendUrl: null, 16 | 17 | // Link to the "about" page 18 | infoUrl: 'https://ct.de/-2467514', 19 | 20 | // Type of display for the "about" page: "blank", "popup" or "self", default = "blank" 21 | infoDisplay: 'blank', 22 | 23 | // localisation: "de" or "en" 24 | lang: 'de', 25 | 26 | // fallback language for not fully localized services 27 | langFallback: 'en', 28 | 29 | mailUrl: function () { 30 | var shareUrl = url.parse(this.getURL(), true) 31 | shareUrl.query.view = 'mail' 32 | delete shareUrl.search 33 | return url.format(shareUrl) 34 | }, 35 | 36 | mailBody: function () { 37 | return this.getURL() 38 | }, 39 | 40 | // Media (e.g. image) URL to be shared 41 | mediaUrl: null, 42 | 43 | // horizontal/vertical 44 | orientation: 'horizontal', 45 | 46 | // icon/icon-count/standard 47 | buttonStyle: 'standard', 48 | 49 | // a string to suffix current URL 50 | referrerTrack: null, 51 | 52 | // services to be enabled in the following order 53 | services: ['twitter', 'facebook', 'info'], 54 | 55 | title: global.document.title, 56 | 57 | twitterVia: null, 58 | 59 | flattrUser: null, 60 | 61 | flattrCategory: null, 62 | 63 | // build URI from rel="canonical" or document.location 64 | url: function () { 65 | var url = global.document.location.href 66 | var canonical = 67 | $('link[rel=canonical]').attr('href') || this.getMeta('og:url') || '' 68 | 69 | if (canonical.length > 0) { 70 | if (canonical.indexOf('http') < 0) { 71 | if (canonical.indexOf('//') !== 0) { 72 | canonical = 73 | global.document.location.protocol + 74 | '//' + 75 | global.document.location.host + 76 | canonical 77 | } else { 78 | canonical = global.document.location.protocol + canonical 79 | } 80 | } 81 | url = canonical 82 | } 83 | 84 | return url 85 | }, 86 | } 87 | 88 | class Shariff { 89 | constructor(element, options) { 90 | // the DOM element that will contain the buttons 91 | this.element = element 92 | 93 | // Ensure elemnt is empty 94 | $(element).empty() 95 | 96 | this.options = $.extend({}, Defaults, options, $(element).data()) 97 | 98 | // filter available services to those that are enabled and initialize them 99 | this.services = Object.keys(services) 100 | .filter((service) => this.isEnabledService(service)) 101 | .sort((a, b) => { 102 | let services = this.options.services 103 | return services.indexOf(a) - services.indexOf(b) 104 | }) 105 | .map((serviceName) => services[serviceName](this)) 106 | 107 | this._addButtonList() 108 | 109 | if ( 110 | this.options.backendUrl !== null && 111 | this.options.buttonStyle !== 'icon' 112 | ) { 113 | this.getShares(this._updateCounts.bind(this)) 114 | } 115 | } 116 | 117 | isEnabledService(serviceName) { 118 | return this.options.services.indexOf(serviceName) > -1 119 | } 120 | 121 | $socialshareElement() { 122 | return $(this.element) 123 | } 124 | 125 | getLocalized(data, key) { 126 | if (typeof data[key] === 'object') { 127 | if (typeof data[key][this.options.lang] === 'undefined') { 128 | return data[key][this.options.langFallback] 129 | } else { 130 | return data[key][this.options.lang] 131 | } 132 | } else if (typeof data[key] === 'string') { 133 | return data[key] 134 | } 135 | return undefined 136 | } 137 | 138 | // returns content of tags or '' if empty/non existant 139 | getMeta(name) { 140 | var metaContent = $(`meta[name="${name}"],[property="${name}"]`).attr( 141 | 'content', 142 | ) 143 | return metaContent || '' 144 | } 145 | 146 | getInfoUrl() { 147 | return this.options.infoUrl 148 | } 149 | 150 | getInfoDisplayPopup() { 151 | return this.options.infoDisplay === 'popup' 152 | } 153 | 154 | getInfoDisplayBlank() { 155 | return ( 156 | this.options.infoDisplay !== 'popup' && 157 | this.options.infoDisplay !== 'self' 158 | ) 159 | } 160 | 161 | getURL() { 162 | return this.getOption('url') 163 | } 164 | 165 | getOption(name) { 166 | var option = this.options[name] 167 | return typeof option === 'function' ? option.call(this) : option 168 | } 169 | 170 | getTitle() { 171 | let title = this.getOption('title') 172 | if ($(this.element).data()['title']) return title 173 | title = title || this.getMeta('DC.title') 174 | let creator = this.getMeta('DC.creator') 175 | return title && creator ? `${title} - ${creator}` : title 176 | } 177 | 178 | getReferrerTrack() { 179 | return this.options.referrerTrack || '' 180 | } 181 | 182 | // returns shareCounts of document 183 | getShares(callback) { 184 | var baseUrl = url.parse(this.options.backendUrl, true) 185 | baseUrl.query.url = this.getURL() 186 | delete baseUrl.search 187 | return $.getJSON(url.format(baseUrl), callback) 188 | } 189 | 190 | // add value of shares for each service 191 | _updateCounts(data, status, xhr) { 192 | if (!data) return 193 | $.each(data, (serviceName, value) => { 194 | if (!this.isEnabledService(serviceName)) { 195 | return 196 | } 197 | if (value >= 1000) { 198 | value = Math.round(value / 1000) + 'k' 199 | } 200 | $(this.element) 201 | .find(`.${serviceName} a`) 202 | .append($('').addClass('share_count').text(value)) 203 | }) 204 | } 205 | 206 | // add html for button-container 207 | _addButtonList() { 208 | var $buttonList = $('