Skip to content

Commit 1020fba

Browse files
author
Doge Chan
committed
add save page
1 parent a822974 commit 1020fba

File tree

6 files changed

+114
-65
lines changed

6 files changed

+114
-65
lines changed
Lines changed: 62 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
'use strict'
1+
"use strict";
22

3-
process.env.BABEL_ENV = 'renderer'
3+
process.env.BABEL_ENV = "renderer";
44

5-
const path = require('path')
6-
const { dependencies } = require('../package.json')
7-
const webpack = require('webpack')
5+
const path = require("path");
6+
const { dependencies } = require("../package.json");
7+
const webpack = require("webpack");
88

9-
const BabiliWebpackPlugin = require('babili-webpack-plugin')
10-
const CopyWebpackPlugin = require('copy-webpack-plugin')
11-
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
12-
const HtmlWebpackPlugin = require('html-webpack-plugin')
13-
const { VueLoaderPlugin } = require('vue-loader')
9+
const BabiliWebpackPlugin = require("babili-webpack-plugin");
10+
const CopyWebpackPlugin = require("copy-webpack-plugin");
11+
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
12+
const HtmlWebpackPlugin = require("html-webpack-plugin");
13+
const { VueLoaderPlugin } = require("vue-loader");
1414

1515
/**
1616
* List of node_modules to include in webpack bundle
@@ -19,161 +19,164 @@ const { VueLoaderPlugin } = require('vue-loader')
1919
* that provide pure *.vue files that need compiling
2020
* https://simulatedgreg.gitbooks.io/electron-vue/content/en/webpack-configurations.html#white-listing-externals
2121
*/
22-
let whiteListedModules = ['vue', 'vuetify']
22+
let whiteListedModules = ["vue", "vuetify", "vue-notification"];
2323

2424
let rendererConfig = {
25-
devtool: '#cheap-module-eval-source-map',
25+
devtool: "#cheap-module-eval-source-map",
2626
entry: {
27-
renderer: path.join(__dirname, '../src/renderer/main.js')
27+
renderer: path.join(__dirname, "../src/renderer/main.js")
2828
},
2929
externals: [
30-
...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))
30+
...Object.keys(dependencies || {}).filter(
31+
d => !whiteListedModules.includes(d)
32+
)
3133
],
3234
module: {
3335
rules: [
3436
{
3537
test: /\.scss$/,
36-
use: ['vue-style-loader', 'css-loader', 'sass-loader']
38+
use: ["vue-style-loader", "css-loader", "sass-loader"]
3739
},
3840
{
3941
test: /\.sass$/,
40-
use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax']
42+
use: ["vue-style-loader", "css-loader", "sass-loader?indentedSyntax"]
4143
},
4244
{
4345
test: /\.less$/,
44-
use: ['vue-style-loader', 'css-loader', 'less-loader']
46+
use: ["vue-style-loader", "css-loader", "less-loader"]
4547
},
4648
{
4749
test: /\.css$/,
48-
use: ['vue-style-loader', 'css-loader']
50+
use: ["vue-style-loader", "css-loader"]
4951
},
5052
{
5153
test: /\.html$/,
52-
use: 'vue-html-loader'
54+
use: "vue-html-loader"
5355
},
5456
{
5557
test: /\.js$/,
56-
use: 'babel-loader',
58+
use: "babel-loader",
5759
exclude: /node_modules/
5860
},
5961
{
6062
test: /\.node$/,
61-
use: 'node-loader'
63+
use: "node-loader"
6264
},
6365
{
6466
test: /\.vue$/,
6567
use: {
66-
loader: 'vue-loader',
68+
loader: "vue-loader",
6769
options: {
68-
extractCSS: process.env.NODE_ENV === 'production',
70+
extractCSS: process.env.NODE_ENV === "production",
6971
loaders: {
70-
sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
71-
scss: 'vue-style-loader!css-loader!sass-loader',
72-
less: 'vue-style-loader!css-loader!less-loader'
72+
sass: "vue-style-loader!css-loader!sass-loader?indentedSyntax=1",
73+
scss: "vue-style-loader!css-loader!sass-loader",
74+
less: "vue-style-loader!css-loader!less-loader"
7375
}
7476
}
7577
}
7678
},
7779
{
7880
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
7981
use: {
80-
loader: 'url-loader',
82+
loader: "url-loader",
8183
query: {
8284
limit: 10000,
83-
name: 'imgs/[name]--[folder].[ext]'
85+
name: "imgs/[name]--[folder].[ext]"
8486
}
8587
}
8688
},
8789
{
8890
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
89-
loader: 'url-loader',
91+
loader: "url-loader",
9092
options: {
9193
limit: 10000,
92-
name: 'media/[name]--[folder].[ext]'
94+
name: "media/[name]--[folder].[ext]"
9395
}
9496
},
9597
{
9698
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
9799
use: {
98-
loader: 'url-loader',
100+
loader: "url-loader",
99101
query: {
100102
limit: 10000,
101-
name: 'fonts/[name]--[folder].[ext]'
103+
name: "fonts/[name]--[folder].[ext]"
102104
}
103105
}
104106
}
105107
]
106108
},
107109
node: {
108-
__dirname: process.env.NODE_ENV !== 'production',
109-
__filename: process.env.NODE_ENV !== 'production'
110+
__dirname: process.env.NODE_ENV !== "production",
111+
__filename: process.env.NODE_ENV !== "production"
110112
},
111113
plugins: [
112114
new VueLoaderPlugin(),
113-
new MiniCssExtractPlugin({filename: 'styles.css'}),
115+
new MiniCssExtractPlugin({ filename: "styles.css" }),
114116
new HtmlWebpackPlugin({
115-
filename: 'index.html',
116-
template: path.resolve(__dirname, '../src/index.ejs'),
117+
filename: "index.html",
118+
template: path.resolve(__dirname, "../src/index.ejs"),
117119
minify: {
118120
collapseWhitespace: true,
119121
removeAttributeQuotes: true,
120122
removeComments: true
121123
},
122-
nodeModules: process.env.NODE_ENV !== 'production'
123-
? path.resolve(__dirname, '../node_modules')
124-
: false
124+
nodeModules:
125+
process.env.NODE_ENV !== "production"
126+
? path.resolve(__dirname, "../node_modules")
127+
: false
125128
}),
126129
new webpack.HotModuleReplacementPlugin(),
127130
new webpack.NoEmitOnErrorsPlugin()
128131
],
129132
output: {
130-
filename: '[name].js',
131-
libraryTarget: 'commonjs2',
132-
path: path.join(__dirname, '../dist/electron')
133+
filename: "[name].js",
134+
libraryTarget: "commonjs2",
135+
path: path.join(__dirname, "../dist/electron")
133136
},
134137
resolve: {
135138
alias: {
136-
'@': path.join(__dirname, '../src/renderer'),
137-
'vue$': 'vue/dist/vue.esm.js'
139+
"@": path.join(__dirname, "../src/renderer"),
140+
vue$: "vue/dist/vue.esm.js"
138141
},
139-
extensions: ['.js', '.vue', '.json', '.css', '.node']
142+
extensions: [".js", ".vue", ".json", ".css", ".node"]
140143
},
141-
target: 'electron-renderer'
142-
}
144+
target: "electron-renderer"
145+
};
143146

144147
/**
145148
* Adjust rendererConfig for development settings
146149
*/
147-
if (process.env.NODE_ENV !== 'production') {
150+
if (process.env.NODE_ENV !== "production") {
148151
rendererConfig.plugins.push(
149152
new webpack.DefinePlugin({
150-
'__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`
153+
__static: `"${path.join(__dirname, "../static").replace(/\\/g, "\\\\")}"`
151154
})
152-
)
155+
);
153156
}
154157

155158
/**
156159
* Adjust rendererConfig for production settings
157160
*/
158-
if (process.env.NODE_ENV === 'production') {
159-
rendererConfig.devtool = ''
161+
if (process.env.NODE_ENV === "production") {
162+
rendererConfig.devtool = "";
160163

161164
rendererConfig.plugins.push(
162165
new BabiliWebpackPlugin(),
163166
new CopyWebpackPlugin([
164167
{
165-
from: path.join(__dirname, '../static'),
166-
to: path.join(__dirname, '../dist/electron/static'),
167-
ignore: ['.*']
168+
from: path.join(__dirname, "../static"),
169+
to: path.join(__dirname, "../dist/electron/static"),
170+
ignore: [".*"]
168171
}
169172
]),
170173
new webpack.DefinePlugin({
171-
'process.env.NODE_ENV': '"production"'
174+
"process.env.NODE_ENV": '"production"'
172175
}),
173176
new webpack.LoaderOptionsPlugin({
174177
minimize: true
175178
})
176-
)
179+
);
177180
}
178181

179-
module.exports = rendererConfig
182+
module.exports = rendererConfig;

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
"rss-parser": "^3.5.3",
5656
"vue": "^2.5.16",
5757
"vue-electron": "^1.0.6",
58+
"vue-notification": "^1.3.13",
5859
"vue-router": "^3.0.1",
5960
"vuetify": "^1.3.8",
6061
"vuex": "^3.0.1",

src/main/index.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { fetchFeed } from "./feeds.js";
33
import { resolve } from "url";
44
import { __await } from "tslib";
55
import "../renderer/store";
6+
var fs = require("fs");
7+
68
/**
79
* Set `__static` path to static files in production
810
* https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html
@@ -42,7 +44,11 @@ function createWindow() {
4244
mainWindow = null;
4345
});
4446
mainWindow.webContents.on("did-finish-load", () => {
45-
mainWindow.webContents.send("ping", "whoooooooh!");
47+
var path = app.getPath("userData") + "/electron-rss-saved/";
48+
if (!fs.existsSync(path)) {
49+
fs.mkdirSync(path);
50+
}
51+
mainWindow.webContents.send("ping", path);
4652
});
4753
mainWindow.on("resize", () => {
4854
mainWindow.webContents.send("resize", mainWindow.getSize());

src/renderer/components/index.vue

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
<v-divider v-if="index + 1 < acticles.length" :key="`divider-${index}`"></v-divider>
3131
</template>
3232
</v-list>
33-
<webview id="foo" :src="webViewSrc" autosize="on" @did-finish-load="didfinishload"></webview>
33+
<webview ref="webView" id="foo" :src="webViewSrc" autosize="on" @did-finish-load="didfinishload"></webview>
3434
<v-speed-dial id="floatBtn" v-model="fab" :top="true" :bottom="false" :right="true" :left="false" direction="left" :open-on-hover="true" transition="slide-x-reverse-transition">
3535
<v-btn slot="activator" v-model="fab" color="blue darken-2" dark fab>
3636
<v-icon>account_circle</v-icon>
@@ -39,22 +39,26 @@
3939
<v-btn fab dark small color="green">
4040
<v-icon>edit</v-icon>
4141
</v-btn>
42-
<v-btn fab dark small color="indigo">
43-
<v-icon>add</v-icon>
42+
43+
<v-btn fab dark small color="indigo" @click="saveHtml">
44+
<v-icon>save</v-icon>
4445
</v-btn>
4546
<v-btn fab dark small color="red">
4647
<v-icon>delete</v-icon>
4748
</v-btn>
4849
</v-speed-dial>
49-
50+
<notifications group="foo" position="bottom right" />
5051
</v-layout>
5152
</v-container>
53+
5254
</v-content>
5355
<v-progress-linear v-show="this.$store.getters.isLoading" id="loadbar" :indeterminate="true" height="5"></v-progress-linear>
56+
5457
</v-app>
5558
</template>
5659
<script>
5760
import { mapActions } from "vuex";
61+
import Vue from "vue";
5862
export default {
5963
name: "landing-page",
6064
data() {
@@ -93,11 +97,41 @@ export default {
9397
acticles: [],
9498
listHeight: "760px",
9599
curFeed: "",
96-
feedCount: {}
100+
feedCount: {},
101+
appPath: ""
97102
};
98103
},
99104
methods: {
100105
...mapActions(["setLoadingState"]),
106+
saveHtml() {
107+
var path =
108+
this.appPath +
109+
this.$refs.webView
110+
.getURL()
111+
.replace(/^.*?:\/\//, "")
112+
.replace(/\//g, "_") +
113+
".mhtml";
114+
console.log(path);
115+
var res = this.$refs.webView
116+
.getWebContents()
117+
.savePage(path, "MHTML", function(error) {
118+
var text = "";
119+
var type = "";
120+
if (error) {
121+
text = error;
122+
type = "error";
123+
} else {
124+
text = "save complete";
125+
type = "success";
126+
}
127+
Vue.notify({
128+
group: "foo",
129+
title: "savePage",
130+
text: text,
131+
type: type
132+
});
133+
});
134+
},
101135
didfinishload() {
102136
// console.log("didfinishload");
103137
this.setLoadingState(false);
@@ -122,6 +156,7 @@ export default {
122156
},
123157
created() {
124158
this.$electron.ipcRenderer.on("ping", (e, data) => {
159+
this.appPath = data;
125160
this.$electron.ipcRenderer.send("pong", "pong from render");
126161
});
127162
this.$electron.ipcRenderer.on("feed", (e, data) => {

src/renderer/main.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import App from "./App";
55
import router from "./router";
66
import store from "./store";
77
import "./plugins/vuetify.js";
8+
import "./plugins/notifications.js";
89

910
if (!process.env.IS_WEB) Vue.use(require("vue-electron"));
1011
Vue.http = Vue.prototype.$http = axios;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import Vue from "vue";
2+
import Notifications from "vue-notification";
3+
Vue.use(Notifications);

0 commit comments

Comments
 (0)