Skip to content

Commit

Permalink
fix conflict in version #
Browse files Browse the repository at this point in the history
  • Loading branch information
dereklieu committed Feb 1, 2016
2 parents e014185 + ea58a6e commit 498b26d
Show file tree
Hide file tree
Showing 15 changed files with 155 additions and 17 deletions.
3 changes: 1 addition & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,7 @@ have [node.js](http://nodejs.org) >= v0.8 installed.
2. Run `npm install && mkdir -p dist && gulp`
3. To run prose with authentication locally, a `oauth.json` file is required in the
root directory. When you run `gulp` this file is created automatically.
4. `npm install serve -g`
5. Run `serve` By default, prose will be set up on [http://localhost:3000](http://localhost:3000).
4. Run `npm start` By default, prose will be set up on [http://localhost:3000](http://localhost:3000).

__Note:__ You should not commit the `oauth.json` file to a remote repo or along with a pull
request.
Expand Down
2 changes: 1 addition & 1 deletion app/models/file.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ module.exports = Backbone.Model.extend({
throw err;
}

return ['---', frontmatter, '---'].join('\n') + '\n\n' + content;
return ['---', frontmatter, '---'].join('\n') + '\n' + content;
} else {
return content;
}
Expand Down
71 changes: 66 additions & 5 deletions app/views/file.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ var _ = require('underscore');
var queue = require('queue-async');
var jsyaml = require('js-yaml');
var patch = require('../../vendor/liquid.patch');
var Handsontable = require('handsontable');
var Papa = require('papaparse');

var ModalView = require('./modal');
var marked = require('marked');
Expand Down Expand Up @@ -56,6 +58,7 @@ module.exports = Backbone.View.extend({

// Events from sidebar
this.listenTo(this.sidebar, 'destroy', this.destroy);
this.listenTo(this.sidebar, 'toggle-editor', this.toggleEditor);
this.listenTo(this.sidebar, 'draft', this.draft);
this.listenTo(this.sidebar, 'cancel', this.cancel);
this.listenTo(this.sidebar, 'confirm', this.updateFile);
Expand Down Expand Up @@ -306,6 +309,59 @@ module.exports = Backbone.View.extend({
return _.escape(content);
},

toggleEditor: function() {
cookie.set('disableCSVEditor', !cookie.get('disableCSVEditor'))
this.render();
},

parseCSV: function(csvString) {
return Papa.parse(util.trim(csvString), { // remove trailing whitespace, mholt/PapaParse#279
skipEmptyLines: true
});
},

initCSVEditor: function() {
var self = this;

var $container = this.$el.find('#csv');
var container = $container[0];
var data = this.parseCSV(this.model.get('content'))

var distanceFromTop = $container.offset().top;
var documentHeight = $(document).height();
var editorHeight = documentHeight - distanceFromTop;

this.editor = new Handsontable(container, {
data: data.data,
colHeaders: true,
rowHeaders: true,
stretchH: 'all',
height: editorHeight,
fixedRowsTop: 1,
manualColumnResize: true,
manualRowResize: true,
contextMenu: ['row_above', 'row_below', 'col_left', 'col_right', 'remove_row', 'remove_col', 'undo', 'redo'],
undo: true,
afterChange: function(changes, source) {
if (source !== 'loadData') self.makeDirty();
}
})

this.editor.getValue = function() {
return Papa.unparse(this.getSourceData());
};

this.editor.setValue = function(newValue) {
var parsedValue = self.parseCSV(newValue);
this.loadData(parsedValue.data);
self.makeDirty();
};

// Check sessionStorage for existing stash
// Apply if stash exists and is current, remove if expired
this.stashApply();
},

initEditor: function() {
var lang = this.model.get('lang');

Expand Down Expand Up @@ -512,7 +568,9 @@ module.exports = Backbone.View.extend({
var content = this.model.get('content');

var file = {
markdown: this.model.get('markdown')
markdown: this.model.get('markdown'),
lang: this.model.get('lang'),
useCSVEditor: (['csv', 'tsv'].indexOf(this.model.get('lang')) !== -1 && !cookie.get('disableCSVEditor'))
};

this.$el.empty().append(_.template(this.template, file, {
Expand All @@ -523,7 +581,11 @@ module.exports = Backbone.View.extend({
this.config = this.model.get('collection').config;

// initialize the subviews
this.initEditor();
if (file.useCSVEditor) {
this.initCSVEditor();
} else {
this.initEditor();
}
this.initHeader();
this.initToolbar();
this.initSidebar();
Expand All @@ -533,9 +595,8 @@ module.exports = Backbone.View.extend({
var jekyll = /^(_posts|_drafts)/.test(this.model.get('path'));

// Update the navigation view with menu options
// if a file contains metadata, has default metadata or is Markdown
if (this.model.get('metadata') || this.model.get('defaults') ||
(markdown && jekyll)) {
// if a file contains metadata, has default metadata or is Markdown (except CSVs)
if (!file.useCSVEditor && (this.model.get('metadata') || this.model.get('defaults') || (markdown && jekyll))) {
this.renderMetadata();

mode.push('meta');
Expand Down
2 changes: 1 addition & 1 deletion app/views/metadata.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ module.exports = Backbone.View.extend({
else {
newMeta[data.name] = newDefault;
}
this.model.set('metadata', _.extend(newMeta, metadata));
this.model.set('metadata', _.extend(newMeta, this.model.get('metadata')));
break;
}
}
Expand Down
1 change: 1 addition & 0 deletions app/views/sidebar/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ module.exports = Backbone.View.extend({

events: {
'click a.delete': 'emit',
'click a.toggle-editor': 'emit',
'click a.translate': 'emit',
'click a.draft': 'emit',
'change input.filepath': 'setPath'
Expand Down
9 changes: 7 additions & 2 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,10 @@ gulp.task('build-tests', ['templates', 'oauth', 'vendor'], function() {

// Browserify index.js
// Pass `debug` option to enable source maps.
return browserify({debug: true})
return browserify({
debug: true,
noParse: [require.resolve('handsontable/dist/handsontable.full')]
})
.add('./test/index.js')
.external(['chai', 'mocha'])
.bundle()
Expand All @@ -144,7 +147,9 @@ gulp.task('build-app', ['templates', 'oauth', 'vendor'], function() {


// Browserify app scripts.
return browserify()
return browserify({
noParse: [require.resolve('handsontable/dist/handsontable.full')]
})
.add('./app/boot.js')
.bundle()
.pipe(source('app.js'))
Expand Down
1 change: 1 addition & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<link rel='apple-touch-icon' sizes="72x72" href='./img/prose@72.png' />
<link rel='apple-touch-icon' sizes="114x114" href='./img/prose@114.png' />
<link rel='apple-touch-icon' sizes="144x144" href='./img/prose@144.png' />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/handsontable/0.20.2/handsontable.full.min.css">
<link rel='stylesheet' href='./style.css'>
</head>
<body>
Expand Down
12 changes: 10 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
{
"name": "prose",
"version": "1.1.15",
"version": "1.1.17",
"description": "[Prose](http://prose.io) is a web-based interface for managing text-based content in your GitHub repositories. Use it to create, edit, and delete files, and save your changes directly to GitHub.",
"dependencies": {
"backbone": "~1.0.0",
"chosen-jquery-browserify": "~0.9.15",
"chrono": "~1.0.4",
"deepmerge": "~0.2.7",
"diff": "~1.0.4",
"handsontable": "git://github.com/handsontable/handsontable.git#0.20.2",
"ignore": "~2.2.7",
"jquery-browserify": "~1.8.1",
"js-base64": "~2.1.1",
"js-yaml": "git://github.com/prose/js-yaml.git",
"keymaster": "git://github.com/madrobby/keymaster.git#0f09fc1b7e66c2b7e07afe89a419366dcf2d1cd8",
"marked": "~0.2.8",
"mkdirp": "^0.5.0",
"papaparse": "^4.1.2",
"queue-async": "~1.0.3",
"underscore": "~1.4.4"
},
Expand All @@ -39,12 +41,15 @@
"mocha-phantomjs": "~3.3.2",
"phantomjs": "~1.9.7-4",
"request": "~2.16.2",
"serve": "^1.4.0",
"sinon": "^1.17.2",
"sinon-chai": "^2.6.0",
"uglify-js": "~2.2.5",
"vinyl-source-stream": "^0.1.1"
},
"scripts": {
"test": "node_modules/.bin/gulp && node_modules/.bin/mocha-phantomjs test/index.html"
"test": "gulp && mocha-phantomjs test/index.html",
"start": "gulp watch & serve"
},
"browserify": {
"transform": [
Expand All @@ -54,6 +59,9 @@
"browserify-shim": {
"chai": "global:chai"
},
"browser": {
"handsontable": "handsontable/dist/handsontable.full"
},
"repository": {
"type": "git",
"url": "git://github.com/prose/prose.git"
Expand Down
5 changes: 5 additions & 0 deletions style.css
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,11 @@ textarea#code {
border-width:1px;
}

div#csv-container {
width: 100%;
overflow: hidden;
}

::-webkit-input-placeholder { color:#a8afb2; }
::-moz-placeholder { color:#a8afb2; }
:-ms-input-placeholder { color:#a8afb2; }
Expand Down
6 changes: 6 additions & 0 deletions templates/file.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,13 @@ <h2><%= t('main.file.metaTitle') %><br />
</div>
</div>
<div id='drop' class='drop-mask'></div>
<% if (file.useCSVEditor) { %>
<div id='csv-container'>
<div id='csv'></div>
</div>
<% } else { %>
<textarea id='code' class='code round inner'></textarea>
<% } %>
</div>
<div id='preview' class='view preview prose'></div>
</div>
Expand Down
4 changes: 4 additions & 0 deletions templates/sidebar/settings.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ <h2 class='label'><%= t('sidebar.settings.title') %></h2>
<% } %>
<% }); %>
<% } %>

<% if (['csv', 'tsv'].indexOf(settings.lang) !== -1) { %>
<a class='toggle-editor button round' href='#' data-action='toggle-editor'><%= t('sidebar.settings.toggleEditor') %></a>
<% } %>

<!-- if !isNew() and is writable -->
<a class='delete button round' href='#' data-action='destroy'><%= t('sidebar.settings.delete') %></a>
Expand Down
29 changes: 28 additions & 1 deletion test/spec/views/file.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ var FileView = require('../../../app/views/file'),
mockRepo = require('../../mocks/models/repo'),
mockFile = require('../../mocks/models/file'),
mockApp = require('../../mocks/views/app'),
mockRouter = require('../../mocks/router');
mockRouter = require('../../mocks/router'),
Handsontable = require('handsontable');


describe('File view', function() {
Expand Down Expand Up @@ -47,6 +48,32 @@ describe('File view', function() {
expect(fileView.editor.getValue()).to.equal(content)
})

it('creates the Hansontable editor', function() {
fileView.model = mockFile();
fileView.model.set('lang', 'csv');
fileView.collection = fileView.model.collection;
fileView.render();
expect(fileView.editor).to.be.an.instanceof(Handsontable.Core);
})

it('initializes Handsontable with the file\'s contents as structured data', function() {
var content = 'a,b\r\nfoo,bar';
fileView.model = mockFile(content);
fileView.model.set('lang', 'csv');
fileView.collection = fileView.model.collection;
fileView.render();
expect(fileView.editor.getSourceData()).to.deep.equal([['a', 'b'], ['foo', 'bar']]);
})

it('retrieves Handsontable contents as a string', function() {
var content = 'a,b\r\nfoo,bar';
fileView.model = mockFile(content);
fileView.model.set('lang', 'csv');
fileView.collection = fileView.model.collection;
fileView.render();
expect(fileView.editor.getValue()).to.equal(content);
})

it('creates a placeholder title for new files', function() {
fileView.model = mockFile();
fileView.model.set({
Expand Down
20 changes: 20 additions & 0 deletions test/spec/views/metadata.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,26 @@ describe('Metadata editor view', function() {
expect(metadataEditor.model.get('metadata').layout).to.equal('fixed');
});

it('saves multiple hidden elements to metadata', function() {
model.set('defaults', [{
name: 'layout',
field: {
element: 'hidden',
value: 'fixed'
}
},
{
name: 'published',
field: {
element: 'hidden',
value: true
}
}]);
metadataEditor.render();
expect(metadataEditor.model.get('metadata').layout).to.equal('fixed');
expect(metadataEditor.model.get('metadata').published).to.equal(true);
});

it('textarea names do not collide with view methods', function() {
var view = metadataEditor.view;
model.set('defaults', [{
Expand Down
3 changes: 2 additions & 1 deletion translations/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,8 @@
"fileInputLabel": "File Path",
"delete": "Delete This File",
"translate": "Translate to",
"draft": "Create Draft"
"draft": "Create Draft",
"toggleEditor": "Toggle Editor"
}
},
"dialogs": {
Expand Down
4 changes: 2 additions & 2 deletions translations/locales/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,6 @@
"description": "Prose переводится добровольцами. Если в списке нет вашего языка или вы обнаружили ошибки в написании - пожалуйста, <a href='https://www.transifex.com/projects/p/prose'>помогите нам с переводом</a>.⏎\n"
},
"about": {
"content": "# О программе\nProse - восхитительно простая среда управления содержимым для веб-сайтов\n[без CMS](http://developmentseed.org/blog/2012/07/27/build-cms-free-websites/)\nЭто веб-интерфейс для управления содержимым на [GitHub](http://github.com).\nИспользуйте сервис для редактирования, правки и удаления файлов с\nсохранением результатов прямо на GitHub. Разместите свой веб-сайт на\n[GitHub Pages](http://pages.github.com) бесплатно или настройте собственный\n[сервер GitHub webhook](http://developmentseed.org/blog/2013/05/01/introducing-jekyll-hook/).\n\nProse включает расширенную поддержку сайтов на [Jekyll](http://jekyllrb.com/) и\n[разметки markdown](http://daringfireball.net/projects/markdown/).\nДля постов в разметке markdown на сайтах на Jekyll Prose предоставляет\nподсветку синтаксиса, панель форматирования и предпросмотр черновиков в\nполном макете сайта.\n\nРазработчики могут настроить сервис для работы с сайтами на Jekyll и\nиспытать эти и многие другие функции, позволяющие облегкчить опыт правки\nсодержимого.\n\n## Настройка\n\nProse может быть настроен для работы с репозиторием при помощи дополнительных\nмета-данных в файле `_config.yml` Jekyll-сайта или в отледельном файле\n`prose.yml`. На сайте Prose.io расположена последняя актуальная версия \nProse, но вы также можете скачать исходный код и разместить его на своём\nсобственном хостинге. Информация для разработчиков доступна в\n[вики проекта на GitHub](https://github.com/prose/prose/wiki).\n\n## Разработка\n\nProse - проект с открытым кодом. Любой вклад и помощь по улучшению приложения\nи/или адаптации его под ваши нужнды приветствуется. Инструкции по вкладу в\nразвитие проектадоступны на странице [Prose contributing guidelines](https://github.com/prose/prose/blob/gh-pages/CONTRIBUTING.md).\n\n## Получить помощь\n\nВ данный момент мы не предоставляем поддержки Prose. Тем не менее, если вы\nавтор контента, использующий Prose, вы можете связаться с разработчиком,\nдавшим вам доступ к Prose. Для сообщения о технических проблемах с Prose,\nпожалуйста, [заполните отчет об проблеме на GitHub](https://github.com/prose/prose/issues).\n\n## Авторы\n\nProse разрабатывается и поддерживается [Development Seed](http://developmentseed.org), творческим\nобъединением из Вашингтона, округ Колумбия.\n"
"content": "# О программе\nProse - восхитительно простая среда управления содержимым для веб-сайтов\n[без CMS](http://developmentseed.org/blog/2012/07/27/build-cms-free-websites/)\nЭто веб-интерфейс для управления содержимым на [GitHub](http://github.com).\nИспользуйте сервис для редактирования, правки и удаления файлов с\nсохранением результатов прямо на GitHub. Разместите свой веб-сайт на\n[GitHub Pages](http://pages.github.com) бесплатно или настройте собственный\n[сервер GitHub webhook](http://developmentseed.org/blog/2013/05/01/introducing-jekyll-hook/).\n\nProse включает расширенную поддержку сайтов на [Jekyll](http://jekyllrb.com/) и\n[разметки markdown](http://daringfireball.net/projects/markdown/).\nДля постов в разметке markdown на сайтах на Jekyll Prose предоставляет\nподсветку синтаксиса, панель форматирования и предпросмотр черновиков в\nполном макете сайта.\n\nРазработчики могут настроить сервис для работы с сайтами на Jekyll и\nиспытать эти и многие другие функции, позволяющие облегчить опыт правки\nсодержимого.\n\n## Настройка\n\nProse может быть настроен для работы с репозиторием при помощи дополнительных\nмета-данных в файле `_config.yml` Jekyll-сайта или в отледельном файле\n`prose.yml`. На сайте Prose.io расположена последняя актуальная версия \nProse, но вы также можете скачать исходный код и разместить его на своём\nсобственном хостинге. Информация для разработчиков доступна в\n[вики проекта на GitHub](https://github.com/prose/prose/wiki).\n\n## Разработка\n\nProse - проект с открытым кодом. Любой вклад и помощь по улучшению приложения\nи/или адаптации его под ваши нужнды приветствуется. Инструкции по вкладу в\nразвитие проектадоступны на странице [Prose contributing guidelines](https://github.com/prose/prose/blob/gh-pages/CONTRIBUTING.md).\n\n## Получить помощь\n\nВ данный момент мы не предоставляем поддержки Prose. Тем не менее, если вы\nавтор контента, использующий Prose, вы можете связаться с разработчиком,\nдавшим вам доступ к Prose. Для сообщения о технических проблемах с Prose,\nпожалуйста, [заполните отчет об проблеме на GitHub](https://github.com/prose/prose/issues).\n\n## Авторы\n\nProse разрабатывается и поддерживается [Development Seed](http://developmentseed.org), творческим\nобъединением из Вашингтона, округ Колумбия.\n"
}
}
}

0 comments on commit 498b26d

Please sign in to comment.