Skip to content

Commit

Permalink
feat(add): add EasyArchive-New
Browse files Browse the repository at this point in the history
  • Loading branch information
WaitSpringQW committed Jul 20, 2024
1 parent c8648d4 commit 1f5aa55
Show file tree
Hide file tree
Showing 17 changed files with 776 additions and 0 deletions.
428 changes: 428 additions & 0 deletions dist/EasyArchive-New/EasyArchive-New.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dist/definition.txt
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
* DisamAssist[ResourceLoader|dependencies=ext.gadget.Util,mediawiki.api,mediawiki.Title|rights=skipcaptcha|requiresES6]|DisamAssist.js|DisamAssist.css
* DisambigLinks[ResourceLoader|requiresES6]|DisambigLinks.css
* EasyArchive[ResourceLoader|actions=view|dependencies=ext.gadget.i18n,ext.gadget.React,ext.gadget.Toastify,ext.gadget.Util,mediawiki.Title|rights=skipcaptcha|requiresES6]|EasyArchive.js|EasyArchive.css
* EasyArchive-New[ResourceLoader|actions=view|dependencies=ext.gadget.i18n,ext.gadget.React,ext.gadget.Toastify,ext.gadget.Util,mediawiki.Title|rights=skipcaptcha|requiresES6]|EasyArchive-New.js
* Edit0[ResourceLoader|actions=view|dependencies=ext.gadget.i18n,ext.gadget.Util,mediawiki.Uri|rights=edit|requiresES6]|Edit0.js|Edit0.css
* EditConflict[ResourceLoader|actions=edit,submit|default|dependencies=ext.gadget.i18n,ext.gadget.React,ext.gadget.Toastify,ext.gadget.Util,mediawiki.api|requiresES6]|EditConflict.js
* EditCount[ResourceLoader|skins=gongbi,vector,vector-2022|requiresES6]|EditCount.js
Expand Down
22 changes: 22 additions & 0 deletions dist/store.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3276,6 +3276,17 @@
"MediaWiki:Gadget-DisambigLinks/zh-sg",
"MediaWiki:Gadget-DisambigLinks/zh-tw",
"MediaWiki:Gadget-EasyArchive",
"MediaWiki:Gadget-EasyArchive-New",
"MediaWiki:Gadget-EasyArchive-New.js",
"MediaWiki:Gadget-EasyArchive-New/zh",
"MediaWiki:Gadget-EasyArchive-New/zh-cn",
"MediaWiki:Gadget-EasyArchive-New/zh-hans",
"MediaWiki:Gadget-EasyArchive-New/zh-hant",
"MediaWiki:Gadget-EasyArchive-New/zh-hk",
"MediaWiki:Gadget-EasyArchive-New/zh-mo",
"MediaWiki:Gadget-EasyArchive-New/zh-my",
"MediaWiki:Gadget-EasyArchive-New/zh-sg",
"MediaWiki:Gadget-EasyArchive-New/zh-tw",
"MediaWiki:Gadget-EasyArchive.css",
"MediaWiki:Gadget-EasyArchive.js",
"MediaWiki:Gadget-EasyArchive/zh",
Expand Down Expand Up @@ -4776,6 +4787,17 @@
"MediaWiki:Gadget-DisambigLinks/zh-sg",
"MediaWiki:Gadget-DisambigLinks/zh-tw",
"MediaWiki:Gadget-EasyArchive",
"MediaWiki:Gadget-EasyArchive-New",
"MediaWiki:Gadget-EasyArchive-New.js",
"MediaWiki:Gadget-EasyArchive-New/zh",
"MediaWiki:Gadget-EasyArchive-New/zh-cn",
"MediaWiki:Gadget-EasyArchive-New/zh-hans",
"MediaWiki:Gadget-EasyArchive-New/zh-hant",
"MediaWiki:Gadget-EasyArchive-New/zh-hk",
"MediaWiki:Gadget-EasyArchive-New/zh-mo",
"MediaWiki:Gadget-EasyArchive-New/zh-my",
"MediaWiki:Gadget-EasyArchive-New/zh-sg",
"MediaWiki:Gadget-EasyArchive-New/zh-tw",
"MediaWiki:Gadget-EasyArchive.css",
"MediaWiki:Gadget-EasyArchive.js",
"MediaWiki:Gadget-EasyArchive/zh",
Expand Down
61 changes: 61 additions & 0 deletions src/EasyArchive-New/EasyArchive-New.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import {emptyElement, onClickWrap, pipeElement} from './modules/react';
import {archive} from './modules/archive';
import {getSections} from './modules/parse';
import {getSettings} from './modules/settings';
import {remove} from './modules/remove';

const main = async () => {
const {arcLevel, arcLoc, secArc, secDel} = getSettings();

if (!arcLoc) {
return;
}

const {wgPageName} = mw.config.get();
const sectionsToArchive = await getSections(wgPageName);

const headings = document.querySelectorAll(`h${arcLevel}`);
const headlines = [];
const headingIndices = [];

for (const heading of headings) {
const headline = heading.querySelector('.mw-headline');
headlines[headlines.length] = headline?.id;
}

for (const section of sectionsToArchive) {
if (section.level !== arcLevel) {
continue;
}

if (headlines.includes(section.anchor)) {
headingIndices[headingIndices.length] = {
index: section.index,
id: section.anchor,
};
}
}

for (const {index, id} of headingIndices) {
// eslint-disable-next-line unicorn/prefer-query-selector
const heading = document.getElementById(id);

if (heading) {
heading.after(
secArc === '1'
? onClickWrap('存档', () => {
void archive(index, id, arcLoc);
})
: emptyElement(),
secArc === '1' && secDel === '1' ? pipeElement() : emptyElement(),
secDel === '1'
? onClickWrap('删除', () => {
void remove(index, id);
})
: emptyElement()
);
}
}
};

void main();
14 changes: 14 additions & 0 deletions src/EasyArchive-New/definition.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"enable": true,
"description": "<span id=\"Gadget-EasyArchive-New\"></span> [[Help:Easy Archive|快速存档]] <small>一键存档讨论页(测试版)</small>",
"section": "edit",
"actions": ["view"],
"dependencies": [
"ext.gadget.i18n",
"ext.gadget.React",
"ext.gadget.Toastify",
"ext.gadget.Util",
"mediawiki.Title"
],
"rights": ["skipcaptcha"]
}
6 changes: 6 additions & 0 deletions src/EasyArchive-New/modules/api.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import * as OPTIONS from '../options.json';
import {initMwApi} from 'ext.gadget.Util';

const api: mw.Api = initMwApi(`EasyAchive/${OPTIONS.version}`);

export {api};
24 changes: 24 additions & 0 deletions src/EasyArchive-New/modules/archive.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import {archiveSection} from './archiveSection';
import {checkIfSectionExist} from './checkIfSectionExist';
import {deleteSection} from './deleteSection';
import {getSectionContent} from './getSectionContent';

const archive = async (index: string, anchor: string, archiveTo: string) => {
const {wgPageName} = mw.config.get();
const ifSectionExist = await checkIfSectionExist(index, anchor);

if (ifSectionExist !== true) {
return;
}

const content = await getSectionContent(wgPageName, index);

if (content === null) {
return;
}

await archiveSection(archiveTo, content);
await deleteSection(wgPageName, index, '存档内容');
};

export {archive};
25 changes: 25 additions & 0 deletions src/EasyArchive-New/modules/archiveSection.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import {api} from './api';
import {checkIfPageExist} from './checkIfPageExist';

const archiveSection = async (archiveTo: string, text: string) => {
const pageExist = await checkIfPageExist(archiveTo);
if (!pageExist) {
await api.create(
archiveTo,
{
summary: '新建存档页面',
minor: true,
},
'{{talkarchive}}'
);
}
await api.edit(archiveTo, () => {
return {
appendtext: text,
summary: '存档内容',
minor: true,
};
});
};

export {archiveSection};
20 changes: 20 additions & 0 deletions src/EasyArchive-New/modules/checkIfPageExist.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import {api} from './api';

const checkIfPageExist = async (archiveTo: string) => {
const params: ApiQueryInfoParams = {
action: 'query',
format: 'json',
formatversion: '2',
prop: 'info',
titles: archiveTo,
};

const response = await api.get(params);

if (response['pages'][0].missing === true) {
return false;
}
return true;
};

export {checkIfPageExist};
16 changes: 16 additions & 0 deletions src/EasyArchive-New/modules/checkIfSectionExist.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import {getSections} from './parse';

const checkIfSectionExist = async (index: string, anchor: string) => {
const {wgPageName} = mw.config.get();
const sections = await getSections(wgPageName);

let ifSectionExist = false;
for (const section of sections) {
if (index === section.index && anchor === section.anchor) {
ifSectionExist = true;
}
}
return ifSectionExist;
};

export {checkIfSectionExist};
14 changes: 14 additions & 0 deletions src/EasyArchive-New/modules/deleteSection.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import {api} from './api';

const deleteSection = async (title: string, section: string, summary?: string) => {
await api.edit(title, () => {
return {
section,
text: '',
summary: summary ?? '删除内容',
minor: true,
};
});
};

export {deleteSection};
20 changes: 20 additions & 0 deletions src/EasyArchive-New/modules/getSectionContent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import {api} from './api';

const getSectionContent = async (title: string, section: string): Promise<string | null> => {
const params: ApiQueryRevisionsParams = {
action: 'query',
prop: ['revisions'],
rvprop: 'content',
format: 'json',
formatversion: '2',
titles: title,
rvsection: section,
};

const {query} = await api.postWithEditToken(params);

// eslint-disable-next-line @typescript-eslint/no-unsafe-return
return query.pages[0].revisions[0].content ?? null;
};

export {getSectionContent};
43 changes: 43 additions & 0 deletions src/EasyArchive-New/modules/parse.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import {api} from './api';

const getSections = async (title: string) => {
const params: ApiParseParams = {
action: 'parse',
format: 'json',
formatversion: '2',
page: title,
prop: 'sections',
};

const {parse} = await api.get(params);
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const {
sections,
}: {
sections: {
level: string;
index: string;
anchor: string;
}[];
} = parse;

const sectionsToArchive = [];

for (const section of sections) {
const {level, index, anchor} = section;

if (index.startsWith('T-')) {
continue;
}

sectionsToArchive[sectionsToArchive.length] = {
level,
index,
anchor,
};
}

return sectionsToArchive;
};

export {getSections};
43 changes: 43 additions & 0 deletions src/EasyArchive-New/modules/react.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import React, {ReactElement} from 'ext.gadget.React';

const elementWrap = (id: string, innerElement: ReactElement) => {
const {skin} = mw.config.get();

if (skin === 'citizen') {
return (
<section className={['page-info__item']} id={id}>
{innerElement}
</section>
);
} else if (['vector', 'vector-2022', 'gongbi'].includes(skin) || document.querySelector('ul#footer-info')) {
return <li id={id}>{innerElement}</li>;
}
return <div id={id}>{innerElement}</div>;
};

const emptyElement = () => <></>;

const linkWrap = (textContent: string, href: string) => <a href={href} textContent={textContent} />;

const onClickWrap = (textContent: string, onClick: () => void, dataActual?: string, dataNominal?: string) => (
<a
class={['easy-archive-link', `easy-archive-link-${dataActual}-${dataNominal}`]}
onClick={onClick}
textContent={textContent}
data-section-id={dataActual}
href="#"
/>
);

const pipeElement = () => <span class="mw-editsection-divider" textContent={'|'} />;

const sectionIdSpanElement = (id: string) => (
<span
class={['easy-archive-section-id-span', `easy-archive-section-id-span-order-${id}`]}
style={{display: 'none'}}
/>
);

const span = (innerHTML: string) => <span innerHTML={innerHTML} />;

export {elementWrap, emptyElement, linkWrap, onClickWrap, pipeElement, sectionIdSpanElement, span};
22 changes: 22 additions & 0 deletions src/EasyArchive-New/modules/remove.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import {checkIfSectionExist} from './checkIfSectionExist';
import {deleteSection} from './deleteSection';
import {getSectionContent} from './getSectionContent';

const remove = async (index: string, anchor: string) => {
const {wgPageName} = mw.config.get();
const ifSectionExist = await checkIfSectionExist(index, anchor);

if (ifSectionExist !== true) {
return;
}

const content = await getSectionContent(wgPageName, index);

if (content === null) {
return;
}

await deleteSection(wgPageName, index);
};

export {remove};
13 changes: 13 additions & 0 deletions src/EasyArchive-New/modules/settings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const getSettings = () => {
const settings = document.querySelector('.easy_archive_data_point_collection') as HTMLElement;
const {dataset} = settings;
const {arcLevel, arcLoc, secArc, secDel} = dataset;
return {
arcLevel: arcLevel ?? '2',
arcLoc: arcLoc ?? null,
secArc: secArc ?? '1',
secDel: secDel ?? '1',
};
};

export {getSettings};
4 changes: 4 additions & 0 deletions src/EasyArchive-New/options.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"mountPointSelector": "#footer-info,.page-info",
"version": "0.1"
}

0 comments on commit 1f5aa55

Please sign in to comment.