diff --git a/src/Blogifier.Admin/assets/gulpfile.mjs b/src/Blogifier.Admin/assets/gulpfile.mjs new file mode 100644 index 000000000..8678d8159 --- /dev/null +++ b/src/Blogifier.Admin/assets/gulpfile.mjs @@ -0,0 +1,185 @@ + + +import { deleteAsync } from 'del'; + +import gulp from 'gulp'; +import plumber from 'gulp-plumber'; +import size from 'gulp-size'; +import uglify from 'gulp-uglify'; +import sourcemaps from 'gulp-sourcemaps'; + +import buffer from 'vinyl-buffer'; +import source from 'vinyl-source-stream'; + +import rollupStream from '@rollup/stream'; +import { babel } from '@rollup/plugin-babel'; +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import terser from '@rollup/plugin-terser'; + +import dartSass from 'sass'; +import gulpSass from 'gulp-sass'; +const sass = gulpSass(dartSass); +import postcss from 'gulp-postcss'; +import autoprefixer from 'autoprefixer'; +import cssnano from 'cssnano'; + +import sprite from 'gulp-svg-sprite'; + +const { src, dest, watch, series, parallel } = gulp; + +// Clear shell screen +console.clear(); + +const clean = () => { + return deleteAsync(['./dist']); +}; + +// 设置一个全局变量,用于指定当前的模式,默认为Debug模式 +let mode = 'Debug'; +const debug = (done) => { + mode = 'Debug'; + done(); +}; +const release = (done) => { + mode = 'Release'; + done(); +}; + +// blogifier js +const blogifierJs = () => { + let outputOptions = { + sourcemap: true, + format: 'iife' + } + + if (mode !== 'Debug') { + outputOptions.sourcemap = false; + outputOptions.minifyInternalExports = true; + outputOptions.plugins = [terser()]; + } + + let stream = rollupStream({ + input: 'js/blogifier.js', + output: outputOptions, + plugins: [ + babel({ + exclude: 'node_modules/**', + presets: ['@babel/preset-env'], + babelHelpers: 'bundled', + }), + nodeResolve({ + browser: true, + preferBuiltins: false, + }), + commonjs({ + include: ['node_modules/**'], + exclude: [], + sourceMap: mode === 'Debug', + }), + ], + }) + + stream = stream.pipe(source('blogifier.js')); + if (mode !== 'Debug') { + // JS Minify + stream = stream.pipe(buffer()) + stream = stream.pipe(plumber()) + stream = stream.pipe(uglify()) + } + return stream.pipe(dest('dist/admin/js')); +} + +// editor js +const editorJs = () => { + let outputOptions = { + sourcemap: true, + format: 'es' + } + + if (mode !== 'Debug') { + outputOptions.sourcemap = false; + outputOptions.minifyInternalExports = true; + outputOptions.plugins = [terser()]; + } + + let stream = rollupStream({ + input: 'js/editor.js', + output: outputOptions, + plugins: [ + babel({ + exclude: 'node_modules/**', + presets: ['@babel/preset-env'], + babelHelpers: 'bundled', + }), + nodeResolve({ + browser: true, + preferBuiltins: false, + }), + commonjs({ + include: ['node_modules/**'], + exclude: [], + sourceMap: mode === 'Debug', + }), + ], + }) + + stream = stream.pipe(source('editor.js')); + if (mode !== 'Debug') { + // JS Minify + stream = stream.pipe(buffer()) + stream = stream.pipe(plumber()) + stream = stream.pipe(uglify()) + } + return stream.pipe(dest('dist/admin/js')); +} + +// sass +const scss = () => { + let stream = src("./scss/**/*.scss") + + if (mode === 'Debug') { + stream = stream.pipe(sourcemaps.init()) + } + + stream = stream.pipe( + sass.sync({ + outputStyle: mode === 'Debug' ? 'expanded' : 'compressed', + errLogToConsole: false, + includePaths: ['node_modules', 'bower_components', 'scss', '.'], + }).on('error', sass.logError) + ) + + if (mode === 'Debug') { + stream = stream.pipe(sourcemaps.write()) + } else { + stream = stream.pipe(plumber()) + stream = stream.pipe(postcss([autoprefixer(), cssnano()])) + } + return stream.pipe(dest('dist/admin/css')); +} + +const watcher = () => { + watch('./js/**/*.js', series(blogifierJs)); + watch('./scss/**/*.scss', series(scss)); +}; + +export default series( + clean, + parallel( + scss, + blogifierJs, + editorJs, + watcher + ) +); + +const build = series( + clean, + scss, + blogifierJs, + editorJs, +); + +export { debug, release, build }; + diff --git a/src/Blogifier.Admin/assets/package.json b/src/Blogifier.Admin/assets/package.json index 503dee581..f40f35318 100644 --- a/src/Blogifier.Admin/assets/package.json +++ b/src/Blogifier.Admin/assets/package.json @@ -4,27 +4,10 @@ "version": "1.0.0", "private": true, "scripts": { - "start": "npm run watch-rollup | npm run watch-sass ", - "rtl": "rtlcss dist/admin/css/styles.css css/styles.rtl.css", - "sass": "sass", - "rollup": "rollup", - "watch-sass": "sass --watch scss:dist/admin/css", - "watch-rollup": "rollup -w --config rollup.config.dev.mjs", - "sass:Debug": "sass scss:dist/admin/css", - "rollup:Debug": "rollup --config rollup.config.dev.mjs", - "build:Debug": "npm run sass:Debug && npm run rollup:Debug", - "sass:Release": "sass scss:dist/admin/css --style=compressed --no-source-map", - "rollup:Release": "rollup --config rollup.config.mjs", - "build:Release": "npm run sass:Release && npm run rollup:Release" - }, - "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.0", - "@rollup/plugin-node-resolve": "^15.1.0", - "@rollup/plugin-terser": "^0.4.3", - "glob": "^10.2.6", - "rollup": "^3.23.1", - "rtlcss": "^3.3.0", - "sass": "~1.32.12" + "start": "gulp", + "build": "gulp build", + "build:Debug": "gulp build", + "build:Release": "gulp release build" }, "dependencies": { "bootstrap": "~5.1.0", @@ -32,5 +15,31 @@ "chart.js": "~2.9.4", "easymde": "^2.18.0", "highlight.js": "~10.7.2" + }, + "devDependencies": { + "@babel/preset-env": "^7.22.9", + "@rollup/plugin-babel": "^6.0.3", + "@rollup/plugin-commonjs": "^25.0.0", + "@rollup/plugin-node-resolve": "^15.1.0", + "@rollup/plugin-terser": "^0.4.3", + "@rollup/stream": "^3.0.0", + "autoprefixer": "^10.4.14", + "cssnano": "^6.0.1", + "del": "^7.0.0", + "gulp": "^4.0.2", + "gulp-notify": "^4.0.0", + "gulp-plumber": "^1.2.1", + "gulp-postcss": "^9.0.1", + "gulp-rename": "^2.0.0", + "gulp-sass": "^5.1.0", + "gulp-size": "^4.0.1", + "gulp-sourcemaps": "^3.0.0", + "gulp-svg-sprite": "^2.0.3", + "gulp-uglify": "^3.0.2", + "rollup": "^3.23.1", + "rtlcss": "^3.3.0", + "sass": "~1.32.12", + "vinyl-buffer": "^1.0.1", + "vinyl-source-stream": "^2.0.0" } } diff --git a/src/Blogifier.Admin/assets/rollup.config.dev.mjs b/src/Blogifier.Admin/assets/rollup.config.dev.mjs deleted file mode 100644 index ada1a9c6c..000000000 --- a/src/Blogifier.Admin/assets/rollup.config.dev.mjs +++ /dev/null @@ -1,30 +0,0 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; -import terser from '@rollup/plugin-terser'; - -export default [ - { - input: 'js/blogifier.js', - output: { - format: 'iife', - file: 'dist/admin/js/blogifier.js', - sourcemap: true, - }, - plugins: [ - commonjs(), - nodeResolve({ browser: true }), - ] - }, - { - input: 'js/editor.js', - output: { - format: 'es', - file: 'dist/admin/js/editor.js', - sourcemap: true, - }, - plugins: [ - commonjs(), - nodeResolve({ browser: true }), - ] - } -]; diff --git a/src/Blogifier.Admin/assets/rollup.config.mjs b/src/Blogifier.Admin/assets/rollup.config.mjs deleted file mode 100644 index 07d937e0f..000000000 --- a/src/Blogifier.Admin/assets/rollup.config.mjs +++ /dev/null @@ -1,34 +0,0 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve'; -import commonjs from '@rollup/plugin-commonjs'; -import terser from '@rollup/plugin-terser'; - -export default [ - { - input: 'js/blogifier.js', - output: { - format: 'iife', - file: 'dist/admin/js/blogifier.js', - sourcemap: false, - minifyInternalExports: true, - plugins: [terser()] - }, - plugins: [ - commonjs(), - nodeResolve({ browser: true }), - ] - }, - { - input: 'js/editor.js', - output: { - format: 'es', - file: 'dist/admin/js/editor.js', - sourcemap: false, - minifyInternalExports: true, - plugins: [terser()] - }, - plugins: [ - commonjs(), - nodeResolve({ browser: true }), - ] - } -]; diff --git a/src/Blogifier.Themes.Standard/ThemesStandardConstant.cs b/src/Blogifier.Themes.Standard/ThemesStandardConstant.cs new file mode 100644 index 000000000..56dd87742 --- /dev/null +++ b/src/Blogifier.Themes.Standard/ThemesStandardConstant.cs @@ -0,0 +1,6 @@ +namespace Blogifier.Themes.Standard; + +public static class ThemesStandardConstant +{ + public const string AssemblyName = "Blogifier.Themes.Standard"; +} diff --git a/src/Blogifier.Themes.Standard/Views/Themes/standard/components/nav.cshtml b/src/Blogifier.Themes.Standard/Views/Themes/standard/components/nav.cshtml index d971b8867..2a87c7249 100644 --- a/src/Blogifier.Themes.Standard/Views/Themes/standard/components/nav.cshtml +++ b/src/Blogifier.Themes.Standard/Views/Themes/standard/components/nav.cshtml @@ -1,110 +1,74 @@ +@using System.Reflection; @inject IStringLocalizer _localizer @model MainModel -@{ - var categoryUrl = Url.Content("~/category"); -} +