사용자:낙엽1124/스크립트/한줄인용 정리

최근 편집: 2020년 3월 3일 (화) 23:08

브라우저에서 페:한줄인용을 연 후 디버그 콘솔창에 붙여넣으면 바로 저장까지 되는 스크립트입니다. ES6 문법을 사용하고 있어 미디어위키 소도구나 사용자 스크립트로는 아직 사용할 수 없습니다(T75714).

  • 문단 제목의 링크가 넘겨주기라면 수정합니다.
  • 문단 순서를 수정합니다.
let helper = async () => {
  const api = new mw.Api();

  const titles = Array.from(document.querySelectorAll(".mw-redirect"))
    .map(node => node.innerText)
    .join("|");

  const redirectionMap = {};

  let data = await api.get({
    action: "query",
    prop: "links",
    titles: titles
  });
  let redirects = data.query.pages;
  let plcontinue = data.continue && data.continue.plcontinue;

  for (const k in redirects) {
    if (redirects[k].links === undefined) {
      break;
    }
    redirectionMap[redirects[k].title] = new mw.Title(
      redirects[k].links[0].title,
      redirects[k].links[0].ns
    ).getPrefixedText();
  }
  while (plcontinue) {
    data = await api.get({
      action: "query",
      prop: "links",
      titles: titles,
      plcontinue: plcontinue
    });
    redirects = data.query.pages;
    plcontinue = data.continue && data.continue.plcontinue;

    for (const k in redirects) {
      if (redirects[k].links === undefined) {
        break;
      }
      redirectionMap[redirects[k].title] = new mw.Title(
        redirects[k].links[0].title,
        redirects[k].links[0].ns
      ).getPrefixedText();
    }
  }

  let wikitext = (await api.get({
    action: "parse",
    page: "페:한줄인용",
    prop: "wikitext"
  })).parse.wikitext["*"];

  const sectionRegExp = /^=+\s*\[*([^=\]\[]+)\]*\s*=+$\n+((?:^\*.+\n)+)/gm;

  const sections = [];
  let match;
  while ((match = sectionRegExp.exec(wikitext)) != null) {
    const keys = Object.keys(redirectionMap);
    let i = keys.indexOf(match[1]);
    let title = i >= 0 ? redirectionMap[keys[i]] : match[1];
    sections.push([title, match[2]]);
  }

  sections.sort((a, b) => {
    return a[0].replace(" ", "").localeCompare(b[0].replace(" ", ""), "ko");
  });

  wikitext = wikitext.replace(
    /^=(.+\n+)+/m,
    sections
      .map(s => {
        return `== [[${s[0]}]] ==\n${s[1]}`;
      })
      .join("\n")
  );

  api.edit("페:한줄인용", () => {
    return { summary: "정렬 및 넘겨주기 링크 수정([[특수:넘겨주기/page/36286|스크립트]] 사용)", text: wikitext };
  });
};

helper();