Skip to content

Commit

Permalink
Merge pull request dollarshaveclub#14 from dollarshaveclub/spread
Browse files Browse the repository at this point in the history
Support for non-spaced languages
  • Loading branch information
yowainwright authored Nov 1, 2016
2 parents 8179feb + 8b7c87c commit fdd71aa
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 11 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
- allows for custom ellipsis strings and class names but doesn't over complicate
- is fast and capable of truncating text within lots of elements [quickly](http://codepen.io/pwfisher/full/ozVAyr/)
- is additive. It will play nice with other javascript libraries and more truncation features can easily be built with it.
- supports non-spaced languages ([Non-ascii](https://en.wikipedia.org/wiki/ASCII)).

## Installing from a package manager

Expand Down Expand Up @@ -61,12 +62,19 @@ And here's a _jQuery/Zepto_ example with custom options:
$('selector').shave(maxheight, { classname: 'your-css-class', character: '' });
```

If you're using a non-spaced language, you can support shave by setting an option `spaces` to `false`.
```javascript
$('selector').shave(maxheight, { classname: 'your-css-class', character: '', spaces: false });
```

## Examples

[Codepen example](http://codepen.io/yowainwright/pen/5f471214df90f43c7996c5914c88e858/) with plain javascript.

[Codepen example](http://codepen.io/yowainwright/pen/c35ad7a281bc58ce6f89d2adb94c5d14/) with jQuery.

[Codepen example](http://codepen.io/yowainwright/pen/wzVgMp) with a non-spaced language.

## Notes

`text-overflow: ellipsis` is the way to go when truncating text to a single line. Shave does something very similar but for _multiple lines_.
Expand Down
14 changes: 8 additions & 6 deletions dist/shave.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ function shave(target, maxHeight, opts) {

var defaults = {
character: '…',
classname: 'js-shave'
classname: 'js-shave',
spaces: true
};
var character = opts && opts.character || defaults.character;
var classname = opts && opts.classname || defaults.classname;
var spaces = opts && opts.spaces === false ? false : defaults.spaces;
var charHtml = '<span class="js-shave-char">' + character + '</span>';

for (var i = 0; i < els.length; i++) {
Expand All @@ -32,7 +34,7 @@ function shave(target, maxHeight, opts) {
if (el.offsetHeight < maxHeight) continue;

var fullText = el.textContent;
var words = fullText.split(' ');
var words = spaces ? fullText.split(' ') : fullText;

// If 0 or 1 words, we're done
if (words.length < 2) continue;
Expand All @@ -43,14 +45,14 @@ function shave(target, maxHeight, opts) {
var pivot = void 0;
while (min < max) {
pivot = min + max + 1 >> 1;
el.textContent = words.slice(0, pivot).join(' ');
el.textContent = spaces ? words.slice(0, pivot).join(' ') : words.slice(0, pivot);
el.insertAdjacentHTML('beforeend', charHtml);
if (el.offsetHeight > maxHeight) max = pivot - 1;else min = pivot;
if (el.offsetHeight > maxHeight) max = spaces ? pivot - 1 : pivot - 2;else min = pivot;
}

el.textContent = words.slice(0, max).join(' ');
el.textContent = spaces ? words.slice(0, max).join(' ') : words.slice(0, max);
el.insertAdjacentHTML('beforeend', charHtml);
var diff = words.slice(max + 1).join(' ');
var diff = spaces ? words.slice(max + 1).join(' ') : words.slice(max);

el.insertAdjacentHTML('beforeend', '<span class="' + classname + '" style="display:none;">' + diff + '</span>');
}
Expand Down
12 changes: 7 additions & 5 deletions src/shave.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ export default function shave(target, maxHeight, opts) {
const defaults = {
character: '…',
classname: 'js-shave',
spaces: true,
};
const character = opts && opts.character || defaults.character;
const classname = opts && opts.classname || defaults.classname;
const spaces = opts && opts.spaces === false ? false : defaults.spaces;
const charHtml = `<span class="js-shave-char">${character}</span>`;

for (let i = 0; i < els.length; i++) {
Expand All @@ -27,7 +29,7 @@ export default function shave(target, maxHeight, opts) {
if (el.offsetHeight < maxHeight) continue;

const fullText = el.textContent;
const words = fullText.split(' ');
const words = spaces ? fullText.split(' ') : fullText;

// If 0 or 1 words, we're done
if (words.length < 2) continue;
Expand All @@ -38,15 +40,15 @@ export default function shave(target, maxHeight, opts) {
let pivot;
while (min < max) {
pivot = (min + max + 1) >> 1;
el.textContent = words.slice(0, pivot).join(' ');
el.textContent = spaces ? words.slice(0, pivot).join(' ') : words.slice(0, pivot);
el.insertAdjacentHTML('beforeend', charHtml);
if (el.offsetHeight > maxHeight) max = pivot - 1;
if (el.offsetHeight > maxHeight) max = spaces ? pivot - 1 : pivot - 2;
else min = pivot;
}

el.textContent = words.slice(0, max).join(' ');
el.textContent = spaces ? words.slice(0, max).join(' ') : words.slice(0, max);
el.insertAdjacentHTML('beforeend', charHtml);
const diff = words.slice(max + 1).join(' ');
const diff = spaces ? words.slice(max + 1).join(' ') : words.slice(max);

el.insertAdjacentHTML('beforeend',
`<span class="${classname}" style="display:none;">${diff}</span>`);
Expand Down
4 changes: 4 additions & 0 deletions tests/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam sollicitudin consequat eros, non posuere justo hendrerit quis. Integer eget risus dapibus, rutrum nisl sit amet, posuere dui. Cras vitae urna ac urna placerat vulputate. Morbi et tortor vel nisi rutrum consequat. Pellentesque non sem cursus, rhoncus nisi sed, semper quam. Phasellus efficitur iaculis auctor. Pellentesque at aliquam leo. Proin diam nulla, mollis vitae nibh sit amet, interdum suscipit risus. Sed fermentum leo enim, a pretium ipsum sollicitudin non. Nunc tempus nunc sed laoreet porttitor. Duis varius purus pellentesque luctus vestibulum. In ex dui, maximus vitae nisl a, molestie malesuada purus. Duis semper est in varius mattis. Pellentesque mollis convallis ex eu pretium.
Vivamus eleifend nunc a sem euismod, non consequat purus varius. Donec hendrerit eleifend ex ac cursus. Ut ac nibh quis massa rhoncus accumsan. Praesent ultricies arcu quis magna tempus, vitae tristique diam euismod. Proin accumsan quam magna, quis condimentum diam lacinia et. Quisque tempor tellus neque, vitae facilisis dui mollis sit amet. Sed sit amet augue ac mi cursus egestas nec gravida velit. Suspendisse eu nunc tristique lorem eleifend vulputate. Aliquam viverra ex sed augue mollis, eu feugiat purus volutpat. Donec consectetur a lectus ac accumsan. Aenean massa libero, pellentesque a ultrices nec, commodo eget neque. Duis blandit augue et tempus egestas. Aenean facilisis lectus eget venenatis blandit. Nam porta sollicitudin erat, at fermentum eros iaculis ut.
</p>
<p class="test-3">會全用民知多起功在有場館爾期臺多而不雄山選在場地市者電養說化運面遊聲時上教要下素的正一曾又如到性喜色體歷定部手里克業選陽響水起金園際吃權終麼意建本分香來象洋道方業動害有不財是了題此然把經會得善所建那各相標一來依正員由不古達解工面想推的</p>
<p class="test-3">那各相標一來依正員由不古達解工面想推的。</p>
<p class="test-3">會全用民知多起功在有場館爾期臺多而不雄山選在場地市者電養說化運面遊聲時上教要下素的正一曾又如到性喜色體歷定部手里克業選陽響水起金園際吃權終麼意建本分香來象洋道方業動害有不財是了題此然把經會得善所建那各相標一來依正員由不古達解工面想推的</p>

<p id="test">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam sollicitudin consequat eros, non posuere justo hendrerit quis. Integer eget risus dapibus, rutrum nisl sit amet, posuere dui. Cras vitae urna ac urna placerat vulputate. Morbi et tortor vel nisi rutrum consequat. Pellentesque non sem cursus, rhoncus nisi sed, semper quam. Phasellus efficitur iaculis auctor. Pellentesque at aliquam leo. Proin diam nulla, mollis vitae nibh sit amet, interdum suscipit risus. Sed fermentum leo enim, a pretium ipsum sollicitudin non. Nunc tempus nunc sed laoreet porttitor. Duis varius purus pellentesque luctus vestibulum. In ex dui, maximus vitae nisl a, molestie malesuada purus. Duis semper est in varius mattis. Pellentesque mollis convallis ex eu pretium.
Vivamus eleifend nunc a sem euismod, non consequat purus varius. Donec hendrerit eleifend ex ac cursus. Ut ac nibh quis massa rhoncus accumsan. Praesent ultricies arcu quis magna tempus, vitae tristique diam euismod. Proin accumsan quam magna, quis condimentum diam lacinia et. Quisque tempor tellus neque, vitae facilisis dui mollis sit amet. Sed sit amet augue ac mi cursus egestas nec gravida velit. Suspendisse eu nunc tristique lorem eleifend vulputate. Aliquam viverra ex sed augue mollis, eu feugiat purus volutpat. Donec consectetur a lectus ac accumsan. Aenean massa libero, pellentesque a ultrices nec, commodo eget neque. Duis blandit augue et tempus egestas. Aenean facilisis lectus eget venenatis blandit. Nam porta sollicitudin erat, at fermentum eros iaculis ut.
Expand Down
4 changes: 4 additions & 0 deletions tests/tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,7 @@ QUnit.test("check shave iteration", function(assert) {
shave('.test-2', 50, {character:'🙌', classname:'js-iteration-works'});
assert.equal(document.querySelectorAll('.js-iteration-works').length, 4, 'there should be 1 truncated thing with a class .js-new-text');
});
QUnit.test("check shave with non-spaced languages", function(assert) {
shave('.test-3', 50, {character:'...', classname:'js-non-spaced-lang', spaces: false});
assert.equal(document.querySelectorAll('.js-non-spaced-lang').length, 2, 'there should be 1 truncated thing with a class .js-new-text');
});

0 comments on commit fdd71aa

Please sign in to comment.