mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-03-11 02:12:21 -05:00
commit
5c1714a5a4
386 changed files with 1164 additions and 2735 deletions
3
.bowerrc
3
.bowerrc
|
@ -1,3 +1,4 @@
|
|||
{
|
||||
"cwd": "core/client/",
|
||||
"directory": "bower_components"
|
||||
}
|
||||
}
|
||||
|
|
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -43,7 +43,6 @@ Session.vim
|
|||
.tmp
|
||||
|
||||
/core/server/data/export/exported*
|
||||
/core/client/docs/_site
|
||||
/content/tmp/*
|
||||
/content/data/*
|
||||
/content/apps/**/*
|
||||
|
@ -63,10 +62,7 @@ config.js
|
|||
|
||||
# Built asset files
|
||||
/core/built
|
||||
/core/client/assets/css
|
||||
/core/client/assets/img/contributors/
|
||||
/core/client/docs/dist/css
|
||||
/core/client/templates/-contributors.hbs
|
||||
/core/server/views/default.hbs
|
||||
|
||||
# Coverage reports
|
||||
coverage.html
|
||||
|
|
13
.npmignore
13
.npmignore
|
@ -13,7 +13,6 @@ content/apps/**
|
|||
content/data/**
|
||||
!content/data/README.md
|
||||
node_modules/**
|
||||
core/test/**
|
||||
**/*.db*
|
||||
*.db*
|
||||
.sass*
|
||||
|
@ -23,20 +22,12 @@ core/test/**
|
|||
.jshintrc
|
||||
*.iml
|
||||
config.js
|
||||
core/built/scripts/templates.js
|
||||
core/built/scripts/vendor.js
|
||||
core/built/scripts/templates.js
|
||||
core/built/scripts/ghost.js
|
||||
core/built/**/*.map
|
||||
core/client/**
|
||||
!core/client/assets/**
|
||||
core/client/assets/sass/**
|
||||
core/client/assets/css/**
|
||||
!core/client/assets/css/ghost.min.css
|
||||
core/client/docs/**
|
||||
core/test/**
|
||||
CONTRIBUTING.md
|
||||
SECURITY.md
|
||||
.travis.yml
|
||||
*.html
|
||||
!core/server/email-templates/**
|
||||
bower_components/**
|
||||
bower_components/**
|
||||
|
|
586
Gruntfile.js
586
Gruntfile.js
|
@ -31,54 +31,12 @@ var _ = require('lodash'),
|
|||
return pattern.substr(1);
|
||||
}
|
||||
return '!' + pattern;
|
||||
}).filter(function (pattern) {
|
||||
// Remove empty patterns
|
||||
return pattern !== '!';
|
||||
});
|
||||
}()),
|
||||
|
||||
// ## List of files we want to lint through jshint and jscs to make sure
|
||||
// they conform to our desired code styles.
|
||||
lintFiles = {
|
||||
// Linting files for server side or shared javascript code.
|
||||
server: {
|
||||
files: {
|
||||
src: [
|
||||
'*.js',
|
||||
'!config*.js', // note: i added this, do we want this linted?
|
||||
'core/*.js',
|
||||
'core/server/**/*.js',
|
||||
'core/shared/**/*.js',
|
||||
'!core/shared/vendor/**/*.js'
|
||||
]
|
||||
}
|
||||
},
|
||||
// Linting files for client side javascript code.
|
||||
client: {
|
||||
files: {
|
||||
src: [
|
||||
'core/client/**/*.js',
|
||||
'!core/client/docs/js/*.js',
|
||||
'!core/client/assets/vendor/**/*.js',
|
||||
'!core/client/tpl/**/*.js'
|
||||
]
|
||||
}
|
||||
},
|
||||
clientTests: {
|
||||
files: {
|
||||
src: [
|
||||
'core/test/client/**/*.js'
|
||||
]
|
||||
}
|
||||
},
|
||||
// Linting files for test code.
|
||||
test: {
|
||||
files: {
|
||||
src: [
|
||||
'core/test/**/*.js',
|
||||
'!core/test/client/**/*.js'
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// ## Grunt configuration
|
||||
|
||||
configureGrunt = function (grunt) {
|
||||
|
@ -107,29 +65,12 @@ var _ = require('lodash'),
|
|||
// Watch files and livereload in the browser during development.
|
||||
// See the [grunt dev](#live%20reload) task for how this is used.
|
||||
watch: {
|
||||
shared: {
|
||||
files: ['core/shared/**/*.js'],
|
||||
tasks: ['concat:dev']
|
||||
},
|
||||
emberTemplates: {
|
||||
files: ['core/client/**/*.hbs'],
|
||||
tasks: ['emberTemplates:dev']
|
||||
},
|
||||
ember: {
|
||||
files: ['core/client/**/*.js', 'core/test/client/**/*.js'],
|
||||
tasks: ['clean:tmp', 'transpile', 'concat_sourcemap:dev', 'concat_sourcemap:tests']
|
||||
},
|
||||
sass: {
|
||||
files: [
|
||||
'core/client/assets/sass/**/*.scss'
|
||||
],
|
||||
tasks: ['css']
|
||||
},
|
||||
livereload: {
|
||||
files: [
|
||||
'content/themes/casper/assets/css/*.css',
|
||||
'content/themes/casper/assets/js/*.js',
|
||||
'core/client/assets/css/*.css',
|
||||
'core/client/dist/*.js',
|
||||
'core/client/dist/*.css',
|
||||
'core/built/scripts/*.js'
|
||||
],
|
||||
options: {
|
||||
|
@ -167,64 +108,68 @@ var _ = require('lodash'),
|
|||
// ### grunt-contrib-jshint
|
||||
// Linting rules, run as part of `grunt validate`. See [grunt validate](#validate) and its subtasks for
|
||||
// more information.
|
||||
jshint: (function () {
|
||||
return _.merge({
|
||||
server: {
|
||||
options: {
|
||||
jshintrc: '.jshintrc'
|
||||
}
|
||||
},
|
||||
client: {
|
||||
options: {
|
||||
jshintrc: 'core/client/.jshintrc'
|
||||
}
|
||||
},
|
||||
clientTests: {
|
||||
options: {
|
||||
jshintrc: 'core/test/client/.jshintrc'
|
||||
}
|
||||
},
|
||||
test: {
|
||||
options: {
|
||||
jshintrc: 'core/test/.jshintrc'
|
||||
}
|
||||
}
|
||||
}, lintFiles);
|
||||
})(),
|
||||
jshint: {
|
||||
options: {
|
||||
jshintrc: true
|
||||
},
|
||||
|
||||
// ### grunt-jscs
|
||||
// Code style rules, run as part of `grunt validate`. See [grunt validate](#validate) and its subtasks for
|
||||
// more information.
|
||||
jscs: (function () {
|
||||
var jscsConfig = _.merge({
|
||||
server: {
|
||||
options: {
|
||||
config: '.jscsrc'
|
||||
}
|
||||
},
|
||||
client: {
|
||||
options: {
|
||||
config: '.jscsrc',
|
||||
esnext: true,
|
||||
disallowObjectController: true
|
||||
}
|
||||
},
|
||||
clientTests: {
|
||||
options: {
|
||||
config: '.jscsrc',
|
||||
esnext: true,
|
||||
disallowObjectController: true
|
||||
}
|
||||
},
|
||||
test: {
|
||||
options: {
|
||||
config: '.jscsrc'
|
||||
}
|
||||
}
|
||||
}, lintFiles);
|
||||
client: [
|
||||
'core/client/**/*.js',
|
||||
'!core/client/node_modules/**/*.js',
|
||||
'!core/client/bower_components/**/*.js',
|
||||
'!core/client/tmp/**/*.js',
|
||||
'!core/client/dist/**/*.js',
|
||||
'!core/client/vendor/**/*.js'
|
||||
],
|
||||
|
||||
return jscsConfig;
|
||||
})(),
|
||||
server: [
|
||||
'*.js',
|
||||
'!config*.js', // note: i added this, do we want this linted?
|
||||
'core/*.js',
|
||||
'core/server/**/*.js',
|
||||
'core/shared/**/*.js',
|
||||
'core/test/**/*.js',
|
||||
'!core/shared/vendor/**/*.js'
|
||||
]
|
||||
},
|
||||
|
||||
jscs: {
|
||||
options: {
|
||||
config: true
|
||||
},
|
||||
|
||||
client: {
|
||||
options: {
|
||||
esnext: true,
|
||||
disallowObjectController: true
|
||||
},
|
||||
|
||||
files: {
|
||||
src: [
|
||||
'core/client/**/*.js',
|
||||
'!core/client/node_modules/**/*.js',
|
||||
'!core/client/bower_components/**/*.js',
|
||||
'!core/client/tmp/**/*.js',
|
||||
'!core/client/dist/**/*.js',
|
||||
'!core/client/vendor/**/*.js'
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
server: {
|
||||
files: {
|
||||
src: [
|
||||
'*.js',
|
||||
'!config*.js', // note: i added this, do we want this linted?
|
||||
'core/*.js',
|
||||
'core/server/**/*.js',
|
||||
'core/shared/**/*.js',
|
||||
'core/test/**/*.js',
|
||||
'!core/shared/vendor/**/*.js'
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// ### grunt-mocha-cli
|
||||
// Configuration for the mocha test runner, used to run unit, integration and route tests as part of
|
||||
|
@ -306,9 +251,52 @@ var _ = require('lodash'),
|
|||
}
|
||||
},
|
||||
|
||||
// ### grunt-bg-shell
|
||||
// Used to run ember-cli watch in the background
|
||||
bgShell: {
|
||||
ember: {
|
||||
cmd: './node_modules/.bin/ember build --watch',
|
||||
execOpts: {
|
||||
cwd: path.resolve(cwd + '/core/client/')
|
||||
},
|
||||
bg: true,
|
||||
stdout: function (out) {
|
||||
grunt.log.writeln('Ember-cli::'.cyan + out);
|
||||
},
|
||||
stderror: function (error) {
|
||||
grunt.log.error('Ember-cli::'.red + error.red);
|
||||
}
|
||||
}
|
||||
},
|
||||
// ### grunt-shell
|
||||
// Command line tools where it's easier to run a command directly than configure a grunt plugin
|
||||
shell: {
|
||||
ember: {
|
||||
command: function (mode) {
|
||||
switch (mode) {
|
||||
case 'init':
|
||||
return 'echo Installing client dependencies... && npm install';
|
||||
|
||||
case 'prod':
|
||||
return './node_modules/.bin/ember build --environment=production --silent';
|
||||
|
||||
case 'dev':
|
||||
return './node_modules/.bin/ember build --silent';
|
||||
|
||||
case 'test':
|
||||
return './node_modules/.bin/ember test --silent';
|
||||
|
||||
default:
|
||||
return './node_modules/.bin/ember build --silent';
|
||||
}
|
||||
},
|
||||
options: {
|
||||
execOptions: {
|
||||
cwd: path.resolve(cwd + '/core/client/'),
|
||||
stdout: false
|
||||
}
|
||||
}
|
||||
},
|
||||
// #### Run bower install
|
||||
// Used as part of `grunt init`. See the section on [Building Assets](#building%20assets) for more
|
||||
// information.
|
||||
|
@ -320,14 +308,6 @@ var _ = require('lodash'),
|
|||
}
|
||||
},
|
||||
|
||||
testem: {
|
||||
command: path.resolve(cwd + '/node_modules/.bin/testem ci -f core/test/client/testem.json'),
|
||||
options: {
|
||||
stdout: true,
|
||||
stdin: false
|
||||
}
|
||||
},
|
||||
|
||||
test: {
|
||||
command: function (test) {
|
||||
return 'node ' + mochaPath + ' --timeout=15000 --ui=bdd --reporter=spec core/test/' + test;
|
||||
|
@ -346,135 +326,6 @@ var _ = require('lodash'),
|
|||
}
|
||||
},
|
||||
|
||||
// ### grunt-sass
|
||||
// compile sass to css
|
||||
sass: {
|
||||
compress: {
|
||||
options: {
|
||||
outputStyle: 'compressed',
|
||||
sourceMap: true
|
||||
},
|
||||
files: [
|
||||
{dest: path.resolve('core/client/assets/css/<%= pkg.name %>.min.css'), src: path.resolve('core/client/assets/sass/screen.scss')},
|
||||
{dest: path.resolve('core/client/docs/dist/css/<%= pkg.name %>.min.css'), src: path.resolve('core/client/assets/sass/screen.scss')}
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
// ### grunt-autoprefixer
|
||||
// Autoprefix all the things, for the last 2 versions of major browsers
|
||||
autoprefixer: {
|
||||
options: {
|
||||
silent: true, // suppress logging
|
||||
map: true, // Use and update the sourcemap
|
||||
browsers: ['last 2 versions', '> 1%', 'Explorer 10']
|
||||
},
|
||||
ghost: {
|
||||
src: 'core/client/assets/css/<%= pkg.name %>.min.css',
|
||||
dest: 'core/client/assets/css/<%= pkg.name %>.min.css'
|
||||
},
|
||||
docs: {
|
||||
src: 'core/client/docs/dist/css/<%= pkg.name %>.min.css',
|
||||
dest: 'core/client/docs/dist/css/<%= pkg.name %>.min.css'
|
||||
}
|
||||
},
|
||||
|
||||
// ### grunt-ember-templates
|
||||
// Compiles handlebar templates for ember
|
||||
emberTemplates: {
|
||||
dev: {
|
||||
options: {
|
||||
templateCompilerPath: 'bower_components/ember/ember-template-compiler.js',
|
||||
handlebarsPath: 'bower_components/handlebars/handlebars.js',
|
||||
templateNamespace: 'HTMLBars',
|
||||
templateBasePath: /core\/client\//,
|
||||
templateFileExtensions: /\.hbs/,
|
||||
templateRegistration: function (name, template) {
|
||||
return grunt.config.process('define(\'ghost/') +
|
||||
name + '\', [\'exports\'], function(__exports__){ __exports__[\'default\'] = ' +
|
||||
template + '; });';
|
||||
}
|
||||
},
|
||||
files: {
|
||||
'core/built/scripts/templates-dev.js': 'core/client/templates/**/*.hbs'
|
||||
}
|
||||
},
|
||||
|
||||
prod: {
|
||||
options: {
|
||||
templateCompilerPath: 'bower_components/ember/ember-template-compiler.js',
|
||||
handlebarsPath: 'bower_components/handlebars/handlebars.js',
|
||||
templateNamespace: 'HTMLBars',
|
||||
templateBasePath: /core\/client\//,
|
||||
templateFileExtensions: /\.hbs/,
|
||||
templateRegistration: function (name, template) {
|
||||
return grunt.config.process('define(\'ghost/') +
|
||||
name + '\', [\'exports\'], function(__exports__){ __exports__[\'default\'] = ' +
|
||||
template + '; });';
|
||||
}
|
||||
},
|
||||
files: {
|
||||
'core/built/scripts/templates.js': 'core/client/templates/**/*.hbs'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// ### grunt-es6-module-transpiler
|
||||
// Compiles Ember es6 modules
|
||||
transpile: {
|
||||
client: {
|
||||
type: 'amd',
|
||||
moduleName: function (path) {
|
||||
return 'ghost/' + path;
|
||||
},
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: 'core/client/',
|
||||
src: ['**/*.js', '!loader.js', '!config-*.js'],
|
||||
dest: '.tmp/ember-transpiled/'
|
||||
}]
|
||||
},
|
||||
tests: {
|
||||
type: 'amd',
|
||||
moduleName: function (path) {
|
||||
return 'ghost/tests/' + path;
|
||||
},
|
||||
files: [{
|
||||
expand: true,
|
||||
cwd: 'core/test/client/',
|
||||
src: ['**/*.js'],
|
||||
dest: '.tmp/ember-tests-transpiled/'
|
||||
}]
|
||||
}
|
||||
},
|
||||
|
||||
// ### grunt-concat-sourcemap
|
||||
// Concatenates transpiled ember app
|
||||
concat_sourcemap: {
|
||||
dev: {
|
||||
src: ['.tmp/ember-transpiled/**/*.js', 'core/client/loader.js'],
|
||||
dest: 'core/built/scripts/ghost-dev.js',
|
||||
options: {
|
||||
sourcesContent: true
|
||||
}
|
||||
},
|
||||
tests: {
|
||||
src: ['.tmp/ember-tests-transpiled/**/*.js'],
|
||||
dest: 'core/built/scripts/ghost-tests.js',
|
||||
options: {
|
||||
sourcesContent: true
|
||||
}
|
||||
},
|
||||
prod: {
|
||||
src: ['.tmp/ember-transpiled/**/*.js', 'core/built/scripts/templates.js',
|
||||
'core/client/loader.js'],
|
||||
dest: 'core/built/scripts/ghost.js',
|
||||
options: {
|
||||
sourcesContent: true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// ### grunt-docker
|
||||
// Generate documentation from code
|
||||
docker: {
|
||||
|
@ -496,19 +347,14 @@ var _ = require('lodash'),
|
|||
built: {
|
||||
src: [
|
||||
'core/built/**',
|
||||
'core/client/assets/img/contributors/**',
|
||||
'core/client/templates/-contributors.hbs'
|
||||
'core/client/dist/**',
|
||||
'core/client/public/assets/img/contributors/**',
|
||||
'core/client/app/templates/-contributors.hbs'
|
||||
]
|
||||
},
|
||||
release: {
|
||||
src: ['<%= paths.releaseBuild %>/**']
|
||||
},
|
||||
css: {
|
||||
src: [
|
||||
'core/client/assets/css/**',
|
||||
'core/client/docs/dist/css/**'
|
||||
]
|
||||
},
|
||||
test: {
|
||||
src: ['content/data/ghost-test.db']
|
||||
},
|
||||
|
@ -520,37 +366,19 @@ var _ = require('lodash'),
|
|||
// ### grunt-contrib-copy
|
||||
// Copy files into their correct locations as part of building assets, or creating release zips
|
||||
copy: {
|
||||
dev: {
|
||||
files: [{
|
||||
cwd: 'bower_components/jquery/dist/',
|
||||
src: 'jquery.js',
|
||||
dest: 'core/built/public/',
|
||||
expand: true
|
||||
}, {
|
||||
src: 'core/client/config-dev.js',
|
||||
dest: 'core/client/config.js'
|
||||
}]
|
||||
},
|
||||
prod: {
|
||||
files: [{
|
||||
cwd: 'bower_components/jquery/dist/',
|
||||
src: 'jquery.js',
|
||||
dest: 'core/built/public/',
|
||||
expand: true
|
||||
}, {
|
||||
src: 'core/client/config-prod.js',
|
||||
dest: 'core/client/config.js'
|
||||
}]
|
||||
jquery: {
|
||||
cwd: 'core/client/bower_components/jquery/dist/',
|
||||
src: 'jquery.js',
|
||||
dest: 'core/built/public/',
|
||||
expand: true,
|
||||
nonull: true
|
||||
},
|
||||
release: {
|
||||
files: [{
|
||||
cwd: 'bower_components/jquery/dist/',
|
||||
cwd: 'core/client/bower_components/jquery/dist/',
|
||||
src: 'jquery.js',
|
||||
dest: 'core/built/public/',
|
||||
expand: true
|
||||
}, {
|
||||
src: 'core/client/config-prod.js',
|
||||
dest: 'core/client/config.js'
|
||||
}, {
|
||||
expand: true,
|
||||
src: buildGlob,
|
||||
|
@ -572,84 +400,6 @@ var _ = require('lodash'),
|
|||
}
|
||||
},
|
||||
|
||||
// ### grunt-contrib-concat
|
||||
// concatenate multiple JS files into a single file ready for use
|
||||
concat: {
|
||||
dev: {
|
||||
nonull: true,
|
||||
dest: 'core/built/scripts/vendor-dev.js',
|
||||
src: [
|
||||
'bower_components/loader.js/loader.js',
|
||||
'bower_components/jquery/dist/jquery.js',
|
||||
'bower_components/ember/ember.debug.js',
|
||||
'bower_components/ember-data/ember-data.js',
|
||||
'bower_components/ember-resolver/dist/ember-resolver.js',
|
||||
'bower_components/ic-ajax/dist/globals/main.js',
|
||||
'bower_components/ember-load-initializers/ember-load-initializers.js',
|
||||
'bower_components/validator-js/validator.js',
|
||||
'bower_components/codemirror/lib/codemirror.js',
|
||||
'bower_components/codemirror/addon/mode/overlay.js',
|
||||
'bower_components/codemirror/mode/markdown/markdown.js',
|
||||
'bower_components/codemirror/mode/gfm/gfm.js',
|
||||
'bower_components/showdown-ghost/src/showdown.js',
|
||||
'bower_components/moment/moment.js',
|
||||
'bower_components/keymaster/keymaster.js',
|
||||
'bower_components/device/lib/device.js',
|
||||
'bower_components/jquery-ui/ui/jquery-ui.js',
|
||||
'bower_components/jquery-file-upload/js/jquery.fileupload.js',
|
||||
'bower_components/fastclick/lib/fastclick.js',
|
||||
'bower_components/nprogress/nprogress.js',
|
||||
'bower_components/ember-simple-auth/simple-auth.js',
|
||||
'bower_components/ember-simple-auth/simple-auth-oauth2.js',
|
||||
'bower_components/google-caja/html-css-sanitizer-bundle.js',
|
||||
'bower_components/nanoscroller/bin/javascripts/jquery.nanoscroller.js',
|
||||
'bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.js',
|
||||
|
||||
'core/shared/lib/showdown/extensions/ghostimagepreview.js',
|
||||
'core/shared/lib/showdown/extensions/ghostgfm.js',
|
||||
'core/shared/lib/showdown/extensions/ghostfootnotes.js',
|
||||
'core/shared/lib/showdown/extensions/ghosthighlight.js'
|
||||
]
|
||||
},
|
||||
|
||||
prod: {
|
||||
nonull: true,
|
||||
dest: 'core/built/scripts/vendor.js',
|
||||
src: [
|
||||
'bower_components/loader.js/loader.js',
|
||||
'bower_components/jquery/dist/jquery.js',
|
||||
'bower_components/ember/ember.prod.js',
|
||||
'bower_components/ember-data/ember-data.prod.js',
|
||||
'bower_components/ember-resolver/dist/ember-resolver.js',
|
||||
'bower_components/ic-ajax/dist/globals/main.js',
|
||||
'bower_components/ember-load-initializers/ember-load-initializers.js',
|
||||
'bower_components/validator-js/validator.js',
|
||||
'bower_components/codemirror/lib/codemirror.js',
|
||||
'bower_components/codemirror/addon/mode/overlay.js',
|
||||
'bower_components/codemirror/mode/markdown/markdown.js',
|
||||
'bower_components/codemirror/mode/gfm/gfm.js',
|
||||
'bower_components/showdown-ghost/src/showdown.js',
|
||||
'bower_components/moment/moment.js',
|
||||
'bower_components/keymaster/keymaster.js',
|
||||
'bower_components/device/lib/device.js',
|
||||
'bower_components/jquery-ui/ui/jquery-ui.js',
|
||||
'bower_components/jquery-file-upload/js/jquery.fileupload.js',
|
||||
'bower_components/fastclick/lib/fastclick.js',
|
||||
'bower_components/nprogress/nprogress.js',
|
||||
'bower_components/ember-simple-auth/simple-auth.js',
|
||||
'bower_components/ember-simple-auth/simple-auth-oauth2.js',
|
||||
'bower_components/google-caja/html-css-sanitizer-bundle.js',
|
||||
'bower_components/nanoscroller/bin/javascripts/jquery.nanoscroller.js',
|
||||
'bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.js',
|
||||
|
||||
'core/shared/lib/showdown/extensions/ghostimagepreview.js',
|
||||
'core/shared/lib/showdown/extensions/ghostgfm.js',
|
||||
'core/shared/lib/showdown/extensions/ghostfootnotes.js',
|
||||
'core/shared/lib/showdown/extensions/ghosthighlight.js'
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
// ### grunt-contrib-uglify
|
||||
// Minify concatenated javascript files ready for production
|
||||
uglify: {
|
||||
|
@ -658,9 +408,7 @@ var _ = require('lodash'),
|
|||
sourceMap: false
|
||||
},
|
||||
files: {
|
||||
'core/built/public/jquery.min.js': 'core/built/public/jquery.js',
|
||||
'core/built/scripts/vendor.min.js': 'core/built/scripts/vendor.js',
|
||||
'core/built/scripts/ghost.min.js': 'core/built/scripts/ghost.js'
|
||||
'core/built/public/jquery.min.js': 'core/built/public/jquery.js'
|
||||
}
|
||||
},
|
||||
release: {
|
||||
|
@ -668,9 +416,7 @@ var _ = require('lodash'),
|
|||
sourceMap: false
|
||||
},
|
||||
files: {
|
||||
'core/built/public/jquery.min.js': 'core/built/public/jquery.js',
|
||||
'core/built/scripts/vendor.min.js': 'core/built/scripts/vendor.js',
|
||||
'core/built/scripts/ghost.min.js': 'core/built/scripts/ghost.js'
|
||||
'core/built/public/jquery.min.js': 'core/built/public/jquery.js'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -844,8 +590,7 @@ var _ = require('lodash'),
|
|||
// details of each of the test suites.
|
||||
//
|
||||
grunt.registerTask('test-all', 'Run tests and lint code',
|
||||
['lint', 'test-routes', 'test-module', 'test-unit', 'test-integration', 'test-functional', 'shell:testem']
|
||||
);
|
||||
['lint', 'test-routes', 'test-module', 'test-unit', 'test-integration', 'shell:ember:test', 'test-functional']);
|
||||
|
||||
// ### Lint
|
||||
//
|
||||
|
@ -992,25 +737,6 @@ var _ = require('lodash'),
|
|||
['test-setup', 'shell:coverage']
|
||||
);
|
||||
|
||||
// ## Building assets
|
||||
//
|
||||
// Ghost's GitHub repository contains the un-built source code for Ghost. If you're looking for the already
|
||||
// built release zips, you can get these from the [release page](https://github.com/TryGhost/Ghost/releases) on
|
||||
// GitHub or from https://ghost.org/download. These zip files are created using the [grunt release](#release)
|
||||
// task.
|
||||
//
|
||||
// If you want to work on Ghost core, or you want to use the source files from GitHub, then you have to build
|
||||
// the Ghost assets in order to make them work.
|
||||
//
|
||||
// There are a number of grunt tasks available to help with this. Firstly after fetching an updated version of
|
||||
// the Ghost codebase, after running `npm install`, you will need to run [grunt init](#init%20assets).
|
||||
//
|
||||
// For production blogs you will need to run [grunt prod](#production%20assets).
|
||||
//
|
||||
// For updating assets during development, the tasks [grunt](#default%20asset%20build) and
|
||||
// [grunt dev](#live%20reload) are available.
|
||||
//
|
||||
|
||||
// #### Master Warning *(Utility Task)*
|
||||
// Warns git users not ot use the `master` branch in production.
|
||||
// `master` is an unstable branch and shouldn't be used in production as you run the risk of ending up with a
|
||||
|
@ -1024,26 +750,10 @@ var _ = require('lodash'),
|
|||
console.log('Use the', 'stable'.bold, 'branch for live blogs.', 'Never'.bold, 'master!');
|
||||
});
|
||||
|
||||
// ### Ember Build *(Utility Task)*
|
||||
// All tasks related to building the Ember client code including transpiling ES6 modules and building templates
|
||||
grunt.registerTask('emberBuildDev', 'Build Ember JS & templates for development',
|
||||
['clean:tmp', 'buildAboutPage', 'emberTemplates:dev', 'transpile', 'concat_sourcemap:dev', 'concat_sourcemap:tests']);
|
||||
|
||||
// ### Ember Build *(Utility Task)*
|
||||
// All tasks related to building the Ember client code including transpiling ES6 modules and building templates
|
||||
grunt.registerTask('emberBuildProd', 'Build Ember JS & templates for production',
|
||||
['clean:tmp', 'buildAboutPage', 'emberTemplates:prod', 'transpile', 'concat_sourcemap:prod']);
|
||||
|
||||
// ### CSS Build *(Utility Task)*
|
||||
// Build the CSS files from the SCSS files
|
||||
grunt.registerTask('css', 'Build Client CSS',
|
||||
['sass', 'autoprefixer']);
|
||||
|
||||
// ### Build About Page *(Utility Task)*
|
||||
// Builds the github contributors partial template used on the Settings/About page,
|
||||
// and downloads the avatar for each of the users.
|
||||
// Run by any task that compiles the ember assets (emberBuildDev, emberBuildProd)
|
||||
// or manually via `grunt buildAboutPage`.
|
||||
// Run by any task that compiles the ember assets or manually via `grunt buildAboutPage`.
|
||||
// Change which version you're working against by setting the "releaseTag" below.
|
||||
//
|
||||
// Only builds if the contributors template does not exist.
|
||||
|
@ -1051,8 +761,8 @@ var _ = require('lodash'),
|
|||
// `grunt buildAboutPage --force`
|
||||
grunt.registerTask('buildAboutPage', 'Compile assets for the About Ghost page', function () {
|
||||
var done = this.async(),
|
||||
templatePath = 'core/client/templates/-contributors.hbs',
|
||||
imagePath = 'core/client/assets/img/contributors/',
|
||||
templatePath = 'core/client/app/templates/-contributors.hbs',
|
||||
imagePath = 'core/client/public/assets/img/contributors/',
|
||||
ninetyDaysAgo = Date.now() - (1000 * 60 * 60 * 24 * 90),
|
||||
oauthKey = process.env.GITHUB_OAUTH_KEY;
|
||||
|
||||
|
@ -1117,6 +827,25 @@ var _ = require('lodash'),
|
|||
done(false);
|
||||
});
|
||||
});
|
||||
|
||||
// ## Building assets
|
||||
//
|
||||
// Ghost's GitHub repository contains the un-built source code for Ghost. If you're looking for the already
|
||||
// built release zips, you can get these from the [release page](https://github.com/TryGhost/Ghost/releases) on
|
||||
// GitHub or from https://ghost.org/download. These zip files are created using the [grunt release](#release)
|
||||
// task.
|
||||
//
|
||||
// If you want to work on Ghost core, or you want to use the source files from GitHub, then you have to build
|
||||
// the Ghost assets in order to make them work.
|
||||
//
|
||||
// There are a number of grunt tasks available to help with this. Firstly after fetching an updated version of
|
||||
// the Ghost codebase, after running `npm install`, you will need to run [grunt init](#init%20assets).
|
||||
//
|
||||
// For production blogs you will need to run [grunt prod](#production%20assets).
|
||||
//
|
||||
// For updating assets during development, the tasks [grunt](#default%20asset%20build) and
|
||||
// [grunt dev](#live%20reload) are available.
|
||||
|
||||
// ### Init assets
|
||||
// `grunt init` - will run an initial asset build for you
|
||||
//
|
||||
|
@ -1129,22 +858,26 @@ var _ = require('lodash'),
|
|||
// `bower` does have some quirks, such as not running as root. If you have problems please try running
|
||||
// `grunt init --verbose` to see if there are any errors.
|
||||
grunt.registerTask('init', 'Prepare the project for development',
|
||||
['shell:bower', 'update_submodules', 'default']);
|
||||
['shell:ember:init', 'shell:bower', 'update_submodules', 'assets', 'default']);
|
||||
|
||||
// ### Basic Asset Building
|
||||
// Builds and moves necessary client assets. Prod additionally builds the ember app.
|
||||
grunt.registerTask('assets', 'Basic asset building & moving',
|
||||
['clean:tmp', 'buildAboutPage', 'copy:jquery']);
|
||||
|
||||
// ### Default asset build
|
||||
// `grunt` - default grunt task
|
||||
//
|
||||
// Build assets and dev version of the admin app.
|
||||
grunt.registerTask('default', 'Build JS & templates for development',
|
||||
['shell:ember:dev']);
|
||||
|
||||
// ### Production assets
|
||||
// `grunt prod` - will build the minified assets used in production.
|
||||
//
|
||||
// It is otherwise the same as running `grunt`, but is only used when running Ghost in the `production` env.
|
||||
grunt.registerTask('prod', 'Build JS & templates for production',
|
||||
['concat:prod', 'copy:prod', 'emberBuildProd', 'uglify:prod', 'master-warn']);
|
||||
|
||||
// ### Default asset build
|
||||
// `grunt` - default grunt task
|
||||
//
|
||||
// Compiles concatenates javascript files for the admin UI into a handful of files instead
|
||||
// of many files, and makes sure the bower dependencies are in the right place.
|
||||
grunt.registerTask('default', 'Build JS & templates for development',
|
||||
['concat:dev', 'copy:dev', 'css', 'emberBuildDev']);
|
||||
['shell:ember:prod', 'uglify:prod', 'master-warn']);
|
||||
|
||||
// ### Live reload
|
||||
// `grunt dev` - build assets on the fly whilst developing
|
||||
|
@ -1158,7 +891,7 @@ var _ = require('lodash'),
|
|||
//
|
||||
// Note that the current implementation of watch only works with casper, not other themes.
|
||||
grunt.registerTask('dev', 'Dev Mode; watch files and restart server on changes',
|
||||
['default', 'express:dev', 'watch']);
|
||||
['bgShell:ember', 'express:dev', 'watch']);
|
||||
|
||||
// ### Release
|
||||
// Run `grunt release` to create a Ghost release zip file.
|
||||
|
@ -1171,8 +904,7 @@ var _ = require('lodash'),
|
|||
' - Copy files to release-folder/#/#{version} directory\n' +
|
||||
' - Clean out unnecessary files (travis, .git*, etc)\n' +
|
||||
' - Zip files in release-folder to dist-folder/#{version} directory',
|
||||
['init', 'concat:prod', 'copy:prod', 'emberBuildProd', 'uglify:release', 'clean:release',
|
||||
'shell:shrinkwrap', 'copy:release', 'compress:release']);
|
||||
['init', 'shell:ember:prod', 'uglify:release', 'clean:release', 'copy:release', 'shell:shrinkwrap', 'compress:release']);
|
||||
};
|
||||
|
||||
// Export the configuration
|
||||
|
|
9
core/client/.ember-cli
Normal file
9
core/client/.ember-cli
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
/**
|
||||
Ember CLI sends analytics information by default. The data is completely
|
||||
anonymous, but there are times when you might want to disable this behavior.
|
||||
|
||||
Setting `disableAnalytics` to true will prevent any data from being sent.
|
||||
*/
|
||||
"disableAnalytics": true
|
||||
}
|
21
core/client/.gitignore
vendored
Normal file
21
core/client/.gitignore
vendored
Normal file
|
@ -0,0 +1,21 @@
|
|||
# See http://help.github.com/ignore-files/ for more about ignoring files.
|
||||
|
||||
# compiled output
|
||||
/dist
|
||||
/tmp
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/bower_components
|
||||
|
||||
# misc
|
||||
/.sass-cache
|
||||
/connect.lock
|
||||
/coverage/*
|
||||
/libpeerconnection.log
|
||||
npm-debug.log
|
||||
testem.log
|
||||
|
||||
# built by grunt
|
||||
public/assets/img/contributors/
|
||||
app/templates/-contributors.hbs
|
|
@ -1,33 +1,39 @@
|
|||
{
|
||||
"node": false,
|
||||
"browser": true,
|
||||
"bitwise": true,
|
||||
"curly": true,
|
||||
"eqeqeq": true,
|
||||
"forin": true,
|
||||
"immed": true,
|
||||
"latedef": true,
|
||||
"newcap": true,
|
||||
"noarg": true,
|
||||
"noempty": true,
|
||||
"nonew": true,
|
||||
"plusplus": true,
|
||||
"regexp": true,
|
||||
"undef": true,
|
||||
"unused": true,
|
||||
"indent": 4,
|
||||
"esnext": true,
|
||||
"quotmark": "single",
|
||||
"globals": {
|
||||
"Ember": true,
|
||||
"Em": true,
|
||||
"DS": true,
|
||||
"$": true,
|
||||
"SimpleAuth": true,
|
||||
"validator": true,
|
||||
"ic": true,
|
||||
"NProgress": true,
|
||||
"moment": true
|
||||
},
|
||||
"predef": ["-Notification"]
|
||||
"predef": [
|
||||
"document",
|
||||
"window",
|
||||
"-Promise",
|
||||
"-Notification",
|
||||
"$",
|
||||
"validator",
|
||||
"ic",
|
||||
"SimpleAuth",
|
||||
"NProgress",
|
||||
"moment"
|
||||
],
|
||||
"browser": true,
|
||||
"boss": true,
|
||||
"curly": true,
|
||||
"debug": false,
|
||||
"devel": true,
|
||||
"eqeqeq": true,
|
||||
"evil": true,
|
||||
"forin": false,
|
||||
"immed": false,
|
||||
"laxbreak": false,
|
||||
"newcap": true,
|
||||
"noarg": true,
|
||||
"noempty": false,
|
||||
"nonew": false,
|
||||
"nomen": false,
|
||||
"onevar": false,
|
||||
"plusplus": false,
|
||||
"regexp": false,
|
||||
"undef": true,
|
||||
"sub": true,
|
||||
"strict": false,
|
||||
"white": false,
|
||||
"eqnull": true,
|
||||
"esnext": true,
|
||||
"unused": true
|
||||
}
|
||||
|
|
60
core/client/Brocfile.js
Normal file
60
core/client/Brocfile.js
Normal file
|
@ -0,0 +1,60 @@
|
|||
/* global require, module */
|
||||
|
||||
var EmberApp = require('ember-cli/lib/broccoli/ember-app'),
|
||||
isProduction = EmberApp.env() === 'production',
|
||||
disabled = {enabled: false},
|
||||
assetLocation,
|
||||
app;
|
||||
|
||||
assetLocation = function (fileName) {
|
||||
if (isProduction) {
|
||||
fileName = fileName.replace('.', '.min.');
|
||||
}
|
||||
return '/assets/' + fileName;
|
||||
};
|
||||
|
||||
app = new EmberApp({
|
||||
outputPaths: {
|
||||
app: {
|
||||
js: assetLocation('ghost.js')
|
||||
// css: see config/environment.js (sassOptions)
|
||||
},
|
||||
vendor: {
|
||||
js: assetLocation('vendor.js'),
|
||||
css: assetLocation('vendor.css')
|
||||
}
|
||||
},
|
||||
hinting: false,
|
||||
fingerprint: disabled,
|
||||
sourcemaps: disabled // see https://github.com/ember-cli/ember-cli/issues/2912
|
||||
});
|
||||
|
||||
app.import('bower_components/loader.js/loader.js');
|
||||
app.import('bower_components/jquery/dist/jquery.js');
|
||||
app.import('bower_components/ic-ajax/dist/globals/main.js');
|
||||
app.import('bower_components/ember-load-initializers/ember-load-initializers.js');
|
||||
app.import('bower_components/validator-js/validator.js');
|
||||
app.import('bower_components/codemirror/lib/codemirror.js');
|
||||
app.import('bower_components/codemirror/addon/mode/overlay.js');
|
||||
app.import('bower_components/codemirror/mode/markdown/markdown.js');
|
||||
app.import('bower_components/codemirror/mode/gfm/gfm.js');
|
||||
app.import('bower_components/showdown-ghost/src/showdown.js');
|
||||
app.import('bower_components/moment/moment.js');
|
||||
app.import('bower_components/keymaster/keymaster.js');
|
||||
app.import('bower_components/device/lib/device.js');
|
||||
app.import('bower_components/jquery-ui/ui/jquery-ui.js');
|
||||
app.import('bower_components/jquery-file-upload/js/jquery.fileupload.js');
|
||||
app.import('bower_components/fastclick/lib/fastclick.js');
|
||||
app.import('bower_components/nprogress/nprogress.js');
|
||||
app.import('bower_components/ember-simple-auth/simple-auth.js');
|
||||
app.import('bower_components/ember-simple-auth/simple-auth-oauth2.js');
|
||||
app.import('bower_components/google-caja/html-css-sanitizer-bundle.js');
|
||||
app.import('bower_components/nanoscroller/bin/javascripts/jquery.nanoscroller.js');
|
||||
app.import('bower_components/jqueryui-touch-punch/jquery.ui.touch-punch.js');
|
||||
|
||||
app.import('vendor/showdown/extensions/ghostgfm.js');
|
||||
app.import('vendor/showdown/extensions/ghostimagepreview.js');
|
||||
app.import('vendor/showdown/extensions/ghostfootnotes.js');
|
||||
app.import('vendor/showdown/extensions/ghosthighlight.js');
|
||||
|
||||
module.exports = app.toTree();
|
|
@ -1,3 +1,4 @@
|
|||
import DS from 'ember-data';
|
||||
import ghostPaths from 'ghost/utils/ghost-paths';
|
||||
|
||||
var BaseAdapter = DS.RESTAdapter.extend({
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import BaseAdapter from 'ghost/adapters/base';
|
||||
|
||||
// EmbeddedRelationAdapter will augment the query object in calls made to
|
|
@ -1,19 +1,18 @@
|
|||
import Ember from 'ember';
|
||||
import Resolver from 'ember/resolver';
|
||||
import loadInitializers from 'ember/load-initializers';
|
||||
import 'ghost/utils/link-view';
|
||||
import 'ghost/utils/text-field';
|
||||
import configureApp from 'ghost/config';
|
||||
import config from './config/environment';
|
||||
|
||||
Ember.MODEL_FACTORY_INJECTIONS = true;
|
||||
|
||||
var App = Ember.Application.extend({
|
||||
modulePrefix: 'ghost',
|
||||
Resolver: Resolver.default
|
||||
modulePrefix: config.modulePrefix,
|
||||
podModulePrefix: config.podModulePrefix,
|
||||
Resolver: Resolver
|
||||
});
|
||||
|
||||
// Runtime configuration of Ember.Application
|
||||
configureApp(App);
|
||||
|
||||
loadInitializers(App, 'ghost');
|
||||
loadInitializers(App, config.modulePrefix);
|
||||
|
||||
export default App;
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var ActivatingListItem = Ember.Component.extend({
|
||||
tagName: 'li',
|
||||
classNameBindings: ['active'],
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/*global CodeMirror */
|
||||
|
||||
import MarkerManager from 'ghost/mixins/marker-manager';
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import DropdownMixin from 'ghost/mixins/dropdown-mixin';
|
||||
|
||||
var DropdownButton = Ember.Component.extend(DropdownMixin, {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import DropdownMixin from 'ghost/mixins/dropdown-mixin';
|
||||
|
||||
var GhostDropdown = Ember.Component.extend(DropdownMixin, {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var FileUpload = Ember.Component.extend({
|
||||
_file: null,
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var Form = Ember.View.extend({
|
||||
tagName: 'form',
|
||||
attributeBindings: ['enctype'],
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import TextInputMixin from 'ghost/mixins/text-input';
|
||||
|
||||
var Input = Ember.TextField.extend(TextInputMixin);
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import uploader from 'ghost/assets/lib/uploader';
|
||||
|
||||
var Markdown = Ember.Component.extend({
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var ModalDialog = Ember.Component.extend({
|
||||
didInsertElement: function () {
|
||||
this.$('.js-modal-container, .js-modal-background').addClass('fade-in open');
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
function joinUrlParts(url, path) {
|
||||
if (path[0] !== '/' && url.slice(-1) !== '/') {
|
||||
path = '/' + path;
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var NavItemComponent = Ember.Component.extend({
|
||||
classNames: 'navigation-item',
|
||||
|
|
@ -1,3 +1,5 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
var NotificationComponent = Ember.Component.extend({
|
||||
classNames: ['js-bb-notification'],
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var NotificationsComponent = Ember.Component.extend({
|
||||
tagName: 'aside',
|
||||
classNames: 'notifications',
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import DropdownButton from 'ghost/components/gh-dropdown-button';
|
||||
|
||||
var PopoverButton = DropdownButton.extend({
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import GhostSelect from 'ghost/components/gh-select';
|
||||
|
||||
var RolesSelector = GhostSelect.extend({
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
// GhostSelect is a solution to Ember.Select being evil and worthless.
|
||||
// (Namely, this solves problems with async data in Ember.Select)
|
||||
// Inspired by (that is, totally ripped off from) this JSBin
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
// See gh-tabs-manager.js for use
|
||||
var TabPane = Ember.Component.extend({
|
||||
classNameBindings: ['active'],
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
// See gh-tabs-manager.js for use
|
||||
var Tab = Ember.Component.extend({
|
||||
tabsManager: Ember.computed(function () {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/**
|
||||
Heavily inspired by ic-tabs (https://github.com/instructure/ic-tabs)
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import TextInputMixin from 'ghost/mixins/text-input';
|
||||
|
||||
var TextArea = Ember.TextArea.extend(TextInputMixin);
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/*global device*/
|
||||
var TrimFocusInput = Ember.TextField.extend({
|
||||
focus: true,
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ModalDialog from 'ghost/components/gh-modal-dialog';
|
||||
import upload from 'ghost/assets/lib/uploader';
|
||||
import cajaSanitizers from 'ghost/utils/caja-sanitizers';
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import uploader from 'ghost/assets/lib/uploader';
|
||||
|
||||
var PostImageUploader = Ember.Component.extend({
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/*
|
||||
Example usage:
|
||||
{{gh-url-preview prefix="tag" slug=theSlugValue tagName="p" classNames="description"}}
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var ApplicationController = Ember.Controller.extend({
|
||||
// jscs: disable
|
||||
hideNav: Ember.computed.match('currentPath', /(error|signin|signup|setup|forgotten|reset)/),
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import EditorControllerMixin from 'ghost/mixins/editor-base-controller';
|
||||
|
||||
var EditorEditController = Ember.Controller.extend(EditorControllerMixin);
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import EditorControllerMixin from 'ghost/mixins/editor-base-controller';
|
||||
|
||||
var EditorNewController = Ember.Controller.extend(EditorControllerMixin, {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var ErrorController = Ember.Controller.extend({
|
||||
code: Ember.computed('content.status', function () {
|
||||
return this.get('content.status') > 200 ? this.get('content.status') : 500;
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var FeatureController = Ember.Controller.extend(Ember.PromiseProxyMixin, {
|
||||
init: function () {
|
||||
var promise;
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ajax from 'ghost/utils/ajax';
|
||||
import ValidationEngine from 'ghost/mixins/validation-engine';
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var CopyHTMLController = Ember.Controller.extend({
|
||||
|
||||
generatedHTML: Ember.computed.alias('model.generatedHTML')
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var DeleteAllController = Ember.Controller.extend({
|
||||
actions: {
|
||||
confirmAccept: function () {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var DeletePostController = Ember.Controller.extend({
|
||||
actions: {
|
||||
confirmAccept: function () {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var DeleteTagController = Ember.Controller.extend({
|
||||
postInflection: Ember.computed('model.post_count', function () {
|
||||
return this.get('model.post_count') > 1 ? 'posts' : 'post';
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var DeleteUserController = Ember.Controller.extend({
|
||||
userPostCount: Ember.computed('model.id', function () {
|
||||
var promise,
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var InviteNewUserController = Ember.Controller.extend({
|
||||
// Used to set the initial value for the dropdown
|
||||
authorRole: Ember.computed(function () {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var LeaveEditorController = Ember.Controller.extend({
|
||||
args: Ember.computed.alias('model'),
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ValidationEngine from 'ghost/mixins/validation-engine';
|
||||
|
||||
export default Ember.Controller.extend(SimpleAuth.AuthenticationControllerMixin, ValidationEngine, {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var TransferOwnerController = Ember.Controller.extend({
|
||||
actions: {
|
||||
confirmAccept: function () {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
var UploadController = Ember.Controller.extend({
|
||||
acceptEncoding: 'image/*',
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/* global moment */
|
||||
import {parseDateString, formatDate} from 'ghost/utils/date-formatting';
|
||||
import SettingsMenuMixin from 'ghost/mixins/settings-menu-controller';
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var PostTagsInputController = Ember.Controller.extend({
|
||||
tagEnteredOrder: Ember.A(),
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import PaginationControllerMixin from 'ghost/mixins/pagination-controller';
|
||||
|
||||
function publishedAtCompare(item1, item2) {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var PostController = Ember.Controller.extend({
|
||||
isPublished: Ember.computed.equal('model.status', 'published'),
|
||||
classNameBindings: ['model.featured'],
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ajax from 'ghost/utils/ajax';
|
||||
import ValidationEngine from 'ghost/mixins/validation-engine';
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var SettingsController = Ember.Controller.extend({
|
||||
needs: ['feature'],
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/*global alert */
|
||||
|
||||
var appStates,
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var SettingsCodeInjectionController = Ember.Controller.extend({
|
||||
actions: {
|
||||
save: function () {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var SettingsGeneralController = Ember.Controller.extend({
|
||||
selectedTheme: null,
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var LabsController = Ember.Controller.extend(Ember.Evented, {
|
||||
needs: ['feature'],
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var NavigationController,
|
||||
NavItem;
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import PaginationMixin from 'ghost/mixins/pagination-controller';
|
||||
import SettingsMenuMixin from 'ghost/mixins/settings-menu-controller';
|
||||
import boundOneWay from 'ghost/utils/bound-one-way';
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import PaginationControllerMixin from 'ghost/mixins/pagination-controller';
|
||||
|
||||
var UsersIndexController = Ember.ArrayController.extend(PaginationControllerMixin, {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import SlugGenerator from 'ghost/models/slug-generator';
|
||||
import isNumber from 'ghost/utils/isNumber';
|
||||
import boundOneWay from 'ghost/utils/bound-one-way';
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ajax from 'ghost/utils/ajax';
|
||||
import ValidationEngine from 'ghost/mixins/validation-engine';
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ValidationEngine from 'ghost/mixins/validation-engine';
|
||||
|
||||
var SigninController = Ember.Controller.extend(SimpleAuth.AuthenticationControllerMixin, ValidationEngine, {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ajax from 'ghost/utils/ajax';
|
||||
import ValidationEngine from 'ghost/mixins/validation-engine';
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var blogUrl = Ember.HTMLBars.makeBoundHelper(function () {
|
||||
return Ember.String.htmlSafe(this.get('config.blogUrl'));
|
||||
});
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var countCharacters = Ember.HTMLBars.makeBoundHelper(function (arr /* hashParams */) {
|
||||
var el = document.createElement('span'),
|
||||
length,
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var countDownCharacters = Ember.HTMLBars.makeBoundHelper(function (arr /* hashParams */) {
|
||||
var el = document.createElement('span'),
|
||||
content,
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import counter from 'ghost/utils/word-count';
|
||||
|
||||
var countWords = Ember.HTMLBars.makeBoundHelper(function (arr /* hashParams */) {
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/* global html_sanitize*/
|
||||
import cajaSanitizers from 'ghost/utils/caja-sanitizers';
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/* global Showdown, html_sanitize*/
|
||||
import cajaSanitizers from 'ghost/utils/caja-sanitizers';
|
||||
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var formatTimeago = Ember.HTMLBars.makeBoundHelper(function (arr /* hashParams */) {
|
||||
if (!arr || !arr.length) {
|
||||
return;
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
// Handlebars Helper {{gh-path}}
|
||||
// Usage: Assume 'http://www.myghostblog.org/myblog/'
|
||||
// {{gh-path}} or {{gh-path ‘blog’}} for Ghost’s root (/myblog/)
|
|
@ -7,6 +7,8 @@
|
|||
|
||||
<title>Ghost Admin</title>
|
||||
|
||||
{{content-for 'head'}}
|
||||
|
||||
<meta name="HandheldFriendly" content="True" />
|
||||
<meta name="MobileOptimized" content="320" />
|
||||
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1, minimal-ui" />
|
||||
|
@ -36,11 +38,18 @@
|
|||
{{#unless skip_google_fonts}}
|
||||
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Open+Sans:400,300,700" />
|
||||
{{/unless}}
|
||||
<link rel="stylesheet" href="{{asset "css/ghost.min.css" ghost="true"}}" />
|
||||
|
||||
<link rel="stylesheet" href="{{asset "vendor.css" ghost="true" minifyInProduction="true"}}" />
|
||||
<link rel="stylesheet" href="{{asset "ghost.css" ghost="true" minifyInProduction="true"}}" />
|
||||
{{content-for 'head-footer'}}
|
||||
</head>
|
||||
<body>
|
||||
{{content-for 'body'}}
|
||||
|
||||
{{{ghost_script_tags}}}
|
||||
<script src="{{asset "vendor.js" ghost="true" minifyInProduction="true"}}"></script>
|
||||
<script src="{{asset "ghost.js" ghost="true" minifyInProduction="true"}}"></script>
|
||||
|
||||
{{content-for 'body-footer'}}
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ghostPaths from 'ghost/utils/ghost-paths';
|
||||
|
||||
var Ghost,
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/*global Ember */
|
||||
|
||||
var trailingHistory,
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
|
||||
// Code modified from Addepar/ember-widgets
|
||||
// https://github.com/Addepar/ember-widgets/blob/master/src/mixins.coffee#L39
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
var CurrentUserSettings = Ember.Mixin.create({
|
||||
currentUser: function () {
|
||||
return this.store.find('user', 'me');
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/*
|
||||
Dropdowns and their buttons are evented and do not propagate clicks.
|
||||
*/
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
/* global console */
|
||||
import MarkerManager from 'ghost/mixins/marker-manager';
|
||||
import PostModel from 'ghost/models/post';
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import ShortcutsRoute from 'ghost/mixins/shortcuts-route';
|
||||
import styleBody from 'ghost/mixins/style-body';
|
||||
import loadingIndicator from 'ghost/mixins/loading-indicator';
|
|
@ -1,3 +1,4 @@
|
|||
import Ember from 'ember';
|
||||
import setScrollClassName from 'ghost/utils/set-scroll-classname';
|
||||
|
||||
var EditorViewMixin = Ember.Mixin.create({
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue