Initial commit

This commit is contained in:
Florian Bouillon 2018-06-17 19:53:51 +02:00
commit 9faf28fd96
12 changed files with 7221 additions and 0 deletions

76
.gitignore vendored Normal file
View File

@ -0,0 +1,76 @@
# Created by https://www.gitignore.io/api/node,sass,code,coffeescript
### Code ###
# Visual Studio Code - https://code.visualstudio.com/
.settings/
.vscode/
tsconfig.json
jsconfig.json
### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# nyc test coverage
.nyc_output
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/
# Dependency directories
node_modules/
jspm_packages/
# Typescript v1 declaration files
typings/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
### Sass ###
.sass-cache/
*.css.map
# End of https://www.gitignore.io/api/node,sass,code,coffeescript

19
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,19 @@
image: node:latest
cache:
paths:
- node_modules/
before_script:
- npm install -g gulp
- npm install
stages:
- build_deploy
build_&_deploy_app:
stage: build_deploy
only:
- master
script:
- gulp deploy

8
.sass-lint.yml Normal file
View File

@ -0,0 +1,8 @@
rules:
force-element-nesting: false
no-qualifying-elements:
allow-element-with-class: true
indentation:
size: 'tab'
no-color-literals:
allow-rgba: true

92
gulpfile.js Normal file
View File

@ -0,0 +1,92 @@
var gulp = require('gulp');
var gutil = require('gutil');
var pug = require('gulp-pug');
var sftp = require('gulp-sftp');
var coffee = require('gulp-coffee');
var combiner = require('stream-combiner2');
var sourcemaps = require('gulp-sourcemaps');
var uglifyhtml = require('gulp-html-minifier');
var browserSync = require('browser-sync').create();
gulp.task('pug-process', function(){
var res = combiner.obj([
gulp.src('src/pug/*.pug'),
pug(),
uglifyhtml({collapseWhitespace: true}),
gulp.dest('build/')
]);
res.on('error', gutil.log);
return res;
});
gulp.task('pug', ['pug-process'], function (done) {
browserSync.reload();
done();
});
gulp.task('coffee-process', function(){
var res = combiner.obj([
gulp.src('src/coffee/**/*'),
sourcemaps.init(),
coffee({bare: true}),
sourcemaps.write(''),
gulp.dest('build/js')
]);
res.on('error', gutil.log);
return res;
});
gulp.task('coffee', ['coffee-process'], function (done) {
browserSync.reload();
done();
});
gulp.task('import', function() {
var list = [
//bootstrap
['node_modules/bootstrap/dist/js/bootstrap.min.js', 'js/'],
['node_modules/bootstrap/dist/js/bootstrap.min.js.map', 'js/'],
['node_modules/bootstrap/dist/css/bootstrap.min.css', 'css/'],
['node_modules/bootstrap/dist/css/bootstrap.min.css.map', 'css/'],
['node_modules/popper.js/dist/umd/popper.min.js', 'js/'],
['node_modules/popper.js/dist/umd/popper.min.js.map', 'js/'],
//jquery
['node_modules/jquery/dist/jquery.min.js', 'js/'],
['node_modules/jquery/dist/jquery.min.js.map', 'js/'],
//summernote
['src/css/summernote-bs4.css', 'css/'],
['node_modules/summernote/dist/summernote-bs4.min.js', 'js/'],
['node_modules/summernote/dist/summernote-bs4.min.js.map', 'js/'],
['node_modules/summernote/dist/font/*', 'fonts/'],
//highlight.js
['src/js/highlight.pack.js', 'js/'], //come with CSS, javascript, php, sql, c#, diff, json, markdown, shell session, c++, html xml, java, python
['src/css/androidstudio.css', 'css/'],
];
list.forEach(element => {
gulp.src(element[0]).pipe(gulp.dest('./build/'+element[1])).on('error', gutil.log);
});
});
gulp.task('build', [ 'pug', 'coffee', 'import']);
gulp.task('default', ['build'], function() {
browserSync.init({
server: {
baseDir: "build/"
}
});
gulp.watch("src/pug/**/*", ['pug']);
gulp.watch("src/coffee/**/*", ['coffee']);
});
gulp.task('stop', function() {
process.exit();
});

6779
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

24
package.json Normal file
View File

@ -0,0 +1,24 @@
{
"name": "summernote-codewrapper",
"description": "write code beautiful codes snippets in summernote !",
"version": "0.1.0",
"private": false,
"devDependencies": {
"browser-sync": "^2.23.7",
"gulp": "^3.9.1",
"gulp-coffee": "^3.0.2",
"gulp-html-minifier": "^0.1.8",
"gulp-pug": "^4.0.1",
"gulp-sftp": "^0.1.5",
"gulp-sourcemaps": "^2.6.4",
"gutil": "^1.6.4",
"stream-combiner2": "^1.1.1"
},
"dependencies": {
"bootstrap": "^4.1.1",
"highlight.js": "^9.12.0",
"jquery": "^3.3.1",
"popper.js": "^1.14.3",
"summernote": "^0.8.10"
}
}

15
src/coffee/script.coffee Normal file
View File

@ -0,0 +1,15 @@
$(document).ready ->
$('.editor').summernote {
minHeight: 300,
toolbar: [
['style', ['bold', 'italic', 'underline', 'clear']],
['font', ['strikethrough', 'superscript', 'subscript']],
['fontsize', ['fontsize']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph']],
['height', ['height']],
['codeWrapper', ['codeWrapper']],
['insert', ['gxcode']],
['misc', ['codeview']]
]
}

View File

@ -0,0 +1,111 @@
(
((factory) ->
if typeof define is 'function' and define.amd
define ['jquery'], factory
else if typeof module is 'object' and module.exports
module.exports = factory require 'jquery'
else
factory window.jQuery
return
) (($) ->
$.extend $.summernote.options, {
codewrapper: {
menu: [
'Update',
'javascript',
'css',
'html'
]
}
},
$.extend $.summernote.plugins, {
'codeWrapper': (context) ->
this.events = {
'summernote.enter': (u, e, $editable) ->
selection = window.getSelection()
correct = selection.anchorNode.nodeName is "CODE" or selection.anchorNode.parentNode.nodeName is "CODE"
if correct
e.preventDefault()
range = window.getSelection().getRangeAt 0
range.deleteContents()
range.insertNode document.createElement('br')
range.addRange 4
range.collapse()
return
'summernote.keydown': (u, e) ->
selection = window.getSelection()
correct = selection.anchorNode.nodeName is "CODE" or selection.anchorNode.parentNode.nodeName is "CODE"
if e.key is 'Tab' and correct
e.preventDefault()
range = selection.getRangeAt 0
range.deleteContents()
range.insertNode document.createTextNode(' ')
range.collapse()
return
}
ui = $.summernote.ui
options = context.options
context.memo 'button.codeWrapper', ->
button = ui.buttonGroup [
ui.button {
container: false
contents: '<i /> Code'
tooltip: 'Code Wrapper'
data: {
toggle: 'dropdown'
}
}
ui.dropdown {
items: options.codewrapper.menu
click: (e) ->
button = e.target.innerText
highlight = window.getSelection()
correct = highlight.anchorNode.nodeName is "CODE" or highlight.anchorNode.parentNode.nodeName is "CODE"
if button is "Update"
$('pre code').each (i, code) ->
node = document.createElement 'code'
code.childNodes.forEach (el) ->
if el.nodeName is '#text' then node.innerHTML += el.wholeText
else if el.nodeName is 'BR' then node.innerHTML += '<br />'
else node.innerHTML += el.innerText
return
node.classList = code.classList
node.classList.remove 'hljs'
parent = code.parentNode
parent.removeChild code
if hljs then hljs.highlightBlock node
parent.appendChild node
return
else if correct then null
else
pre = document.createElement 'pre'
pre.setAttribute 'autocomplete', 'off'
pre.setAttribute 'spellcheck', false
code = document.createElement 'code'
code.classList.add button
code.innerText = highlight
pre.appendChild code
range = highlight.getRangeAt 0
range.deleteContents()
range.insertNode pre
if hljs then hljs.highlightBlock code
range.collapse()
return
}
]
button.render()
@destroy = ->
@$panel.remove()
@$panel = null
return
return
}
return
)
)

66
src/css/androidstudio.css Normal file
View File

@ -0,0 +1,66 @@
/*
Date: 24 Fev 2015
Author: Pedro Oliveira <kanytu@gmail . com>
*/
.hljs {
color: #a9b7c6;
background: #282b2e;
display: block;
overflow-x: auto;
padding: 0.5em;
}
.hljs-number,
.hljs-literal,
.hljs-symbol,
.hljs-bullet {
color: #6897BB;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-deletion {
color: #cc7832;
}
.hljs-variable,
.hljs-template-variable,
.hljs-link {
color: #629755;
}
.hljs-comment,
.hljs-quote {
color: #808080;
}
.hljs-meta {
color: #bbb529;
}
.hljs-string,
.hljs-attribute,
.hljs-addition {
color: #6A8759;
}
.hljs-section,
.hljs-title,
.hljs-type {
color: #ffc66d;
}
.hljs-name,
.hljs-selector-id,
.hljs-selector-class {
color: #e8bf6a;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

File diff suppressed because one or more lines are too long

2
src/js/highlight.pack.js Normal file

File diff suppressed because one or more lines are too long

28
src/pug/index.pug Normal file
View File

@ -0,0 +1,28 @@
<!DOCTYPE html>
html(lang="en")
head
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
title Summernote Code Wrapper
link(rel="stylesheet" href="css/bootstrap.min.css")
link(rel="stylesheet" href="css/androidstudio.css")
link(rel="stylesheet", href="css/summernote-bs4.css")
body
.container
.row
.editor.col-md-6
.col-md-6.markdown-body#result
script(src="js/jquery.min.js")
script(src="js/popper.min.js")
script(src="js/bootstrap.min.js")
script(src="js/highlight.pack.js")
script(src="js/summernote-bs4.min.js")
script(src="js/summernote-codewrapper.js")
script(src="js/script.js")