-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c8648d4
commit 1f5aa55
Showing
17 changed files
with
776 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
"mountPointSelector": "#footer-info,.page-info", | ||
"version": "0.1" | ||
} |