Permalink
Browse files

Allow international Lorem Ipsum texts

  • Loading branch information...
1 parent 998bdd6 commit 38a3768d7eb3b4e84772bfe77a5ab220571728db @sergeche sergeche committed Apr 1, 2013
Showing with 94 additions and 34 deletions.
  1. +94 −34 javascript/generators/lorem-ipsum.js
View
128 javascript/generators/lorem-ipsum.js
@@ -16,35 +16,11 @@
* @constructor
* @memberOf __loremIpsumGeneratorDefine
*/
-emmet.exec(function(require, _) {
- /**
- * @param {AbbreviationNode} tree
- * @param {Object} options
- */
- require('abbreviationParser').addPreprocessor(function(tree, options) {
- var re = /^(?:lorem|lipsum)(\d*)$/i, match;
-
- /** @param {AbbreviationNode} node */
- tree.findAll(function(node) {
- if (node._name && (match = node._name.match(re))) {
- var wordCound = match[1] || 30;
-
- // force node name resolving if node should be repeated
- // or contains attributes. In this case, node should be outputed
- // as tag, otherwise as text-only node
- node._name = '';
- node.data('forceNameResolving', node.isRepeating() || node.attributeList().length);
- node.data('pasteOverwrites', true);
- node.data('paste', function(i, content) {
- return paragraph(wordCound, !i);
- });
- }
- });
- });
-
- var COMMON_P = 'lorem ipsum dolor sit amet consectetur adipisicing elit'.split(' ');
-
- var WORDS = ['exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet',
+emmet.define('lorem', function(require, _) {
+ var langs = {
+ en: {
+ common: ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit'],
+ words: ['exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet',
'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi',
'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi',
'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos',
@@ -72,7 +48,67 @@ emmet.exec(function(require, _) {
'optio', 'dolor', 'labore', 'temporibus', 'repellat', 'veniam',
'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique',
'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere',
- 'maxime', 'corrupti'];
+ 'maxime', 'corrupti']
+ },
+ ru: {
+ common: ['далеко-далеко', 'за', 'словесными', 'горами', 'в стране', 'гласных', 'и согласных', 'живут', 'рыбные', 'тексты'],
+ words: ['вдали', 'от всех', 'они', 'буквенных', 'домах', 'на берегу', 'семантика',
+ 'большого', 'языкового', 'океана', 'маленький', 'ручеек', 'даль',
+ 'журчит', 'по всей', 'обеспечивает', 'ее','всеми', 'необходимыми',
+ 'правилами', 'эта', 'парадигматическая', 'страна', 'которой', 'жаренные',
+ 'предложения', 'залетают', 'прямо', 'рот', 'даже', 'всемогущая',
+ 'пунктуация', 'не', 'имеет', 'власти', 'над', 'рыбными', 'текстами',
+ 'ведущими', 'безорфографичный', 'образ', 'жизни', 'однажды', 'одна',
+ 'маленькая', 'строчка','рыбного', 'текста', 'имени', 'lorem', 'ipsum',
+ 'решила', 'выйти', 'большой', 'мир', 'грамматики', 'великий', 'оксмокс',
+ 'предупреждал', 'о', 'злых', 'запятых', 'диких', 'знаках', 'вопроса',
+ 'коварных', 'точках', 'запятой', 'но', 'текст', 'дал', 'сбить',
+ 'себя', 'толку', 'он', 'собрал', 'семь', 'своих', 'заглавных', 'букв',
+ 'подпоясал', 'инициал', 'за', 'пояс', 'пустился', 'дорогу',
+ 'взобравшись', 'первую', 'вершину', 'курсивных', 'гор', 'бросил',
+ 'последний', 'взгляд', 'назад', 'силуэт', 'своего', 'родного', 'города',
+ 'буквоград', 'заголовок', 'деревни', 'алфавит', 'подзаголовок', 'своего',
+ 'переулка', 'грустный', 'реторический', 'вопрос', 'скатился', 'его',
+ 'щеке', 'продолжил', 'свой', 'путь', 'дороге', 'встретил', 'рукопись',
+ 'она', 'предупредила', 'моей', 'все', 'переписывается', 'несколько',
+ 'раз', 'единственное', 'что', 'меня', 'осталось', 'это', 'приставка',
+ 'возвращайся', 'ты', 'лучше', 'свою', 'безопасную', 'страну', 'послушавшись',
+ 'рукописи', 'наш', 'продолжил', 'свой', 'путь', 'вскоре', 'ему',
+ 'повстречался', 'коварный', 'составитель', 'рекламных', 'текстов',
+ 'напоивший', 'языком', 'речью', 'заманивший', 'свое', 'агенство',
+ 'которое', 'использовало', 'снова', 'снова', 'своих', 'проектах',
+ 'если', 'переписали', 'то', 'живет', 'там', 'до', 'сих', 'пор']
+ }
+ };
+
+ var prefs = require('preferences');
+ prefs.define('lorem.defaultLang', 'en');
+
+ /**
+ * @param {AbbreviationNode} tree
+ * @param {Object} options
+ */
+ require('abbreviationParser').addPreprocessor(function(tree, options) {
+ var re = /^(?:lorem|lipsum)([a-z]{2})?(\d*)$/i, match;
+
+ /** @param {AbbreviationNode} node */
+ tree.findAll(function(node) {
+ if (node._name && (match = node._name.match(re))) {
+ var wordCound = match[2] || 30;
+ var lang = match[1] || prefs.get('lorem.defaultLang') || 'en';
+
+ // force node name resolving if node should be repeated
+ // or contains attributes. In this case, node should be outputed
+ // as tag, otherwise as text-only node
+ node._name = '';
+ node.data('forceNameResolving', node.isRepeating() || node.attributeList().length);
+ node.data('pasteOverwrites', true);
+ node.data('paste', function(i, content) {
+ return paragraph(lang, wordCound, !i);
+ });
+ }
+ });
+ });
/**
* Returns random integer between <code>from</code> and <code>to</code> values
@@ -148,28 +184,52 @@ emmet.exec(function(require, _) {
* "lorem ipsum" sentence.
* @returns {String}
*/
- function paragraph(wordCount, startWithCommon) {
+ function paragraph(lang, wordCount, startWithCommon) {
+ var data = langs[lang];
+ if (!data) {
+ return '';
+ }
+
var result = [];
var totalWords = 0;
var words;
wordCount = parseInt(wordCount, 10);
- if (startWithCommon) {
- words = COMMON_P.slice(0, wordCount);
+ if (startWithCommon && data.common) {
+ words = data.common.slice(0, wordCount);
if (words.length > 5)
words[4] += ',';
totalWords += words.length;
result.push(sentence(words, '.'));
}
while (totalWords < wordCount) {
- words = sample(WORDS, Math.min(randint(3, 12) * randint(1, 5), wordCount - totalWords));
+ words = sample(data.words, Math.min(randint(3, 12) * randint(1, 5), wordCount - totalWords));
totalWords += words.length;
insertCommas(words);
result.push(sentence(words));
}
return result.join(' ');
}
+
+ return {
+ /**
+ * Adds new language words for Lorem Ipsum generator
+ * @param {String} lang Two-letter lang definition
+ * @param {Object} data Words for language. Maight be either a space-separated
+ * list of words (String), Array of words or object with <code>text</code> and
+ * <code>common</code> properties
+ */
+ addLang: function(lang, data) {
+ if (_.isString(data)) {
+ data = {words: _.compact(data.split(' '))};
+ } else if (_.isArray(data)) {
+ data = {words: data};
+ }
+
+ langs[lang] = data;
+ }
+ }
});

0 comments on commit 38a3768

Please sign in to comment.