#31 - Better change detection

This commit is contained in:
Elio Struyf
2021-08-09 14:46:30 +02:00
parent c88d6be1d7
commit 32aa8f4223
3 changed files with 48 additions and 14 deletions
+31 -1
View File
@@ -1,4 +1,4 @@
import { SETTING_MODIFIED_FIELD, SETTING_SLUG_UPDATE_FILE_NAME, SETTING_TEMPLATES_PREFIX } from './../constants/settings';
import { SETTING_AUTO_UPDATE_DATE, SETTING_MODIFIED_FIELD, SETTING_SLUG_UPDATE_FILE_NAME, SETTING_TEMPLATES_PREFIX } from './../constants/settings';
import * as vscode from 'vscode';
import { TaxonomyType } from "../models";
import { CONFIG_KEY, SETTING_DATE_FORMAT, SETTING_SLUG_PREFIX, SETTING_SLUG_SUFFIX, SETTING_DATE_FIELD } from "../constants/settings";
@@ -10,6 +10,7 @@ import { extname, basename } from 'path';
export class Article {
private static prevContent = "";
/**
* Insert taxonomy
@@ -221,6 +222,35 @@ export class Article {
ArticleHelper.update(editor, article);
}
/**
* Article auto updater
* @param fileChanges
*/
public static async autoUpdate(fileChanges: vscode.TextDocumentChangeEvent) {
const txtChanges = fileChanges.contentChanges.map(c => c.text);
const editor = vscode.window.activeTextEditor;
if (txtChanges.length > 0 && editor) {
const config = vscode.workspace.getConfiguration(CONFIG_KEY);
const autoUpdate = config.get(SETTING_AUTO_UPDATE_DATE);
if (autoUpdate) {
const article = ArticleHelper.getFrontMatter(editor);
if (!article) {
return;
}
if (article.content === Article.prevContent) {
return;
}
Article.prevContent = article.content;
Article.setLastModifiedDate();
}
}
}
/**
* Update the article date and return it
* @param article
+1 -8
View File
@@ -1,9 +1,8 @@
import { SETTING_AUTO_UPDATE_DATE, SETTING_SEO_DESCRIPTION_FIELD, SETTING_SEO_DESCRIPTION_LENGTH, SETTING_SEO_TITLE_LENGTH } from './../constants/settings';
import { SETTING_SEO_DESCRIPTION_FIELD, SETTING_SEO_DESCRIPTION_LENGTH, SETTING_SEO_TITLE_LENGTH } from './../constants/settings';
import * as vscode from 'vscode';
import { CONFIG_KEY } from '../constants';
import { ArticleHelper, SeoHelper } from '../helpers';
import { ExplorerView } from '../webview/ExplorerView';
import { Article } from '.';
export class StatusListener {
@@ -16,7 +15,6 @@ export class StatusListener {
public static async verify(frontMatterSB: vscode.StatusBarItem, collection: vscode.DiagnosticCollection) {
const draftMsg = "in draft";
const publishMsg = "to publish";
const config = vscode.workspace.getConfiguration(CONFIG_KEY);
let editor = vscode.window.activeTextEditor;
if (editor && ArticleHelper.isMarkdownDile()) {
@@ -53,11 +51,6 @@ export class StatusListener {
SeoHelper.checkLength(editor, collection, article, fieldName, descLength);
}
}
const autoUpdate = config.get(SETTING_AUTO_UPDATE_DATE);
if (autoUpdate) {
Article.setLastModifiedDate();
}
const panel = ExplorerView.getInstance();
if (panel && panel.visible) {
+16 -5
View File
@@ -9,7 +9,8 @@ import { TagType } from './viewpanel/TagType';
import { ExplorerView } from './webview/ExplorerView';
let frontMatterStatusBar: vscode.StatusBarItem;
let debouncer: { (fnc: any, time: number): void; };
let statusDebouncer: { (fnc: any, time: number): void; };
let editDebounce: { (fnc: any, time: number): void; };
let collection: vscode.DiagnosticCollection;
export async function activate({ subscriptions, extensionUri }: vscode.ExtensionContext) {
@@ -98,13 +99,19 @@ export async function activate({ subscriptions, extensionUri }: vscode.Extension
frontMatterStatusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
frontMatterStatusBar.command = toggleDraftCommand;
subscriptions.push(frontMatterStatusBar);
debouncer = debounceShowDraftTrigger();
statusDebouncer = debounceCallback();
// Register listeners that make sure the status bar updates
subscriptions.push(vscode.window.onDidChangeActiveTextEditor(triggerShowDraftStatus));
subscriptions.push(vscode.window.onDidChangeTextEditorSelection(triggerShowDraftStatus));
// Automatically run the command
triggerShowDraftStatus();
// Listener for file edit changes
editDebounce = debounceCallback();
subscriptions.push(vscode.workspace.onDidChangeTextDocument(triggerFileChange));
// Subscribe all commands
subscriptions.push(
insertTags,
@@ -128,11 +135,15 @@ export async function activate({ subscriptions, extensionUri }: vscode.Extension
export function deactivate() {}
const triggerShowDraftStatus = () => {
debouncer(() => { StatusListener.verify(frontMatterStatusBar, collection); }, 1000);
const triggerFileChange = (e: vscode.TextDocumentChangeEvent) => {
editDebounce(() => Article.autoUpdate(e), 1000);
};
const debounceShowDraftTrigger = () => {
const triggerShowDraftStatus = () => {
statusDebouncer(() => { StatusListener.verify(frontMatterStatusBar, collection); }, 1000);
};
const debounceCallback = () => {
let timeout: NodeJS.Timeout;
return (fnc: any, time: number) => {