<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://anrc.otherworldly.live/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js</id>
	<title>MediaWiki:Common.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://anrc.otherworldly.live/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ACommon.js"/>
	<link rel="alternate" type="text/html" href="https://anrc.otherworldly.live/index.php?title=MediaWiki:Common.js&amp;action=history"/>
	<updated>2026-07-26T22:14:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://anrc.otherworldly.live/index.php?title=MediaWiki:Common.js&amp;diff=1183&amp;oldid=prev</id>
		<title>Amythebunni: Removed JavaScript file.</title>
		<link rel="alternate" type="text/html" href="https://anrc.otherworldly.live/index.php?title=MediaWiki:Common.js&amp;diff=1183&amp;oldid=prev"/>
		<updated>2026-02-03T16:14:30Z</updated>

		<summary type="html">&lt;p&gt;Removed JavaScript file.&lt;/p&gt;
&lt;a href=&quot;https://anrc.otherworldly.live/index.php?title=MediaWiki:Common.js&amp;amp;diff=1183&amp;amp;oldid=1178&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Amythebunni</name></author>
	</entry>
	<entry>
		<id>https://anrc.otherworldly.live/index.php?title=MediaWiki:Common.js&amp;diff=1178&amp;oldid=prev</id>
		<title>Amythebunni: Created page with &quot;import MarkdownIt from &#039;./markdown-it.js&#039;  var self = new Hyperdrive(location) var pathname = location.pathname.endsWith(&#039;/&#039;) ? location.pathname + &#039;index.md&#039; : location.pathname var isEditing = location.search === &#039;?edit&#039;  function h (tag, attrs, ...children) {   var el = document.createElement(tag)   for (let k in attrs) {     if (k === &#039;cls&#039;) el.className = attrs[k]     else el.setAttribute(k, attrs[k])   }   for (let child of children) el.append(child)   return el }...&quot;</title>
		<link rel="alternate" type="text/html" href="https://anrc.otherworldly.live/index.php?title=MediaWiki:Common.js&amp;diff=1178&amp;oldid=prev"/>
		<updated>2026-02-03T16:02:50Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;import MarkdownIt from &amp;#039;./markdown-it.js&amp;#039;  var self = new Hyperdrive(location) var pathname = location.pathname.endsWith(&amp;#039;/&amp;#039;) ? location.pathname + &amp;#039;index.md&amp;#039; : location.pathname var isEditing = location.search === &amp;#039;?edit&amp;#039;  function h (tag, attrs, ...children) {   var el = document.createElement(tag)   for (let k in attrs) {     if (k === &amp;#039;cls&amp;#039;) el.className = attrs[k]     else el.setAttribute(k, attrs[k])   }   for (let child of children) el.append(child)   return el }...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;import MarkdownIt from &amp;#039;./markdown-it.js&amp;#039;&lt;br /&gt;
&lt;br /&gt;
var self = new Hyperdrive(location)&lt;br /&gt;
var pathname = location.pathname.endsWith(&amp;#039;/&amp;#039;) ? location.pathname + &amp;#039;index.md&amp;#039; : location.pathname&lt;br /&gt;
var isEditing = location.search === &amp;#039;?edit&amp;#039;&lt;br /&gt;
&lt;br /&gt;
function h (tag, attrs, ...children) {&lt;br /&gt;
  var el = document.createElement(tag)&lt;br /&gt;
  for (let k in attrs) {&lt;br /&gt;
    if (k === &amp;#039;cls&amp;#039;) el.className = attrs[k]&lt;br /&gt;
    else el.setAttribute(k, attrs[k])&lt;br /&gt;
  }&lt;br /&gt;
  for (let child of children) el.append(child)&lt;br /&gt;
  return el&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
async function ensureParentDir (p) {&lt;br /&gt;
  let parts = p.split(&amp;#039;/&amp;#039;).slice(0, -1)&lt;br /&gt;
  let acc = []&lt;br /&gt;
  for (let part of parts) {&lt;br /&gt;
    acc.push(part)&lt;br /&gt;
    await self.mkdir(acc.join(&amp;#039;/&amp;#039;)).catch(e =&amp;gt; undefined)&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
customElements.define(&amp;#039;wiki-header&amp;#039;, class extends HTMLElement {&lt;br /&gt;
  constructor () {&lt;br /&gt;
    super()&lt;br /&gt;
    this.load()&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  async load () {&lt;br /&gt;
    this.info = await self.getInfo()&lt;br /&gt;
    this.render()&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  render () {&lt;br /&gt;
    this.append(h(&amp;#039;h1&amp;#039;, {}, h(&amp;#039;a&amp;#039;, {href: &amp;#039;/&amp;#039;}, this.info.title)))&lt;br /&gt;
    if (this.info.description) {&lt;br /&gt;
      this.append(h(&amp;#039;p&amp;#039;, {}, this.info.description))&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (this.info.writable) {&lt;br /&gt;
      let buttons = []&lt;br /&gt;
&lt;br /&gt;
      if (!isEditing) {&lt;br /&gt;
        let newPage = h(&amp;#039;button&amp;#039;, {}, &amp;#039;New Page&amp;#039;)&lt;br /&gt;
        newPage.addEventListener(&amp;#039;click&amp;#039;, async (e) =&amp;gt; {&lt;br /&gt;
          var newPathname = prompt(&amp;#039;Enter the path of the new page&amp;#039;)&lt;br /&gt;
          if (!newPathname) return&lt;br /&gt;
          if (!newPathname.endsWith(&amp;#039;.md&amp;#039;)) newPathname += &amp;#039;.md&amp;#039;&lt;br /&gt;
          await ensureParentDir(newPathname)&lt;br /&gt;
          if ((await self.stat(newPathname).catch(e =&amp;gt; undefined)) === undefined) {&lt;br /&gt;
            await self.writeFile(newPathname, `# ${newPathname}`)&lt;br /&gt;
          }&lt;br /&gt;
          location = newPathname + &amp;#039;?edit&amp;#039;&lt;br /&gt;
        })&lt;br /&gt;
        buttons.push(newPage)&lt;br /&gt;
&lt;br /&gt;
        if (/\.(png|jpe?g|gif|mp4|mp3|ogg|webm|mov)$/.test(pathname) === false) {&lt;br /&gt;
          let editPage = h(&amp;#039;button&amp;#039;, {}, &amp;#039;Edit Page&amp;#039;)&lt;br /&gt;
          editPage.addEventListener(&amp;#039;click&amp;#039;, async (e) =&amp;gt; {&lt;br /&gt;
            location.search = &amp;#039;?edit&amp;#039;&lt;br /&gt;
          })&lt;br /&gt;
          buttons.push(editPage)&lt;br /&gt;
        }&lt;br /&gt;
      } else {&lt;br /&gt;
        let savePage = h(&amp;#039;button&amp;#039;, {cls: &amp;#039;primary&amp;#039;}, &amp;#039;Save Page&amp;#039;)&lt;br /&gt;
        savePage.addEventListener(&amp;#039;click&amp;#039;, async (e) =&amp;gt; {&lt;br /&gt;
          let value = document.body.querySelector(&amp;#039;textarea.editor&amp;#039;).value&lt;br /&gt;
          await self.writeFile(pathname, value)&lt;br /&gt;
          location.search = &amp;#039;&amp;#039;&lt;br /&gt;
        })&lt;br /&gt;
        buttons.push(savePage)&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      let deletePage = h(&amp;#039;button&amp;#039;, {}, &amp;#039;Delete Page&amp;#039;)&lt;br /&gt;
      deletePage.addEventListener(&amp;#039;click&amp;#039;, async (e) =&amp;gt; {&lt;br /&gt;
        if (!confirm(&amp;#039;Delete this page?&amp;#039;)) return&lt;br /&gt;
        await self.unlink(pathname)&lt;br /&gt;
        if (isEditing) location.search = &amp;#039;&amp;#039;&lt;br /&gt;
        else location.reload()&lt;br /&gt;
      })&lt;br /&gt;
      buttons.push(deletePage)&lt;br /&gt;
&lt;br /&gt;
      let editProps = h(&amp;#039;button&amp;#039;, {}, &amp;#039;Edit Drive Properties&amp;#039;)&lt;br /&gt;
      editProps.addEventListener(&amp;#039;click&amp;#039;, async (e) =&amp;gt; {&lt;br /&gt;
        await navigator.drivePropertiesDialog(self.url)&lt;br /&gt;
        if (!isEditing) location.reload()&lt;br /&gt;
      })&lt;br /&gt;
      buttons.push(editProps)&lt;br /&gt;
&lt;br /&gt;
      this.append(h(&amp;#039;div&amp;#039;, {cls: &amp;#039;admin&amp;#039;}, ...buttons))&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
customElements.define(&amp;#039;wiki-nav&amp;#039;, class extends HTMLElement {&lt;br /&gt;
  constructor () {&lt;br /&gt;
    super()&lt;br /&gt;
    this.load()&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  async load () {&lt;br /&gt;
    this.files = await self.readdir(&amp;#039;/&amp;#039;, {recursive: true})&lt;br /&gt;
    this.files = this.files.filter(file =&amp;gt; file.endsWith(&amp;#039;.md&amp;#039;))&lt;br /&gt;
    this.files.sort()&lt;br /&gt;
    this.render()&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  render () {&lt;br /&gt;
    for (let file of this.files) {&lt;br /&gt;
      let href = `/${file}`&lt;br /&gt;
      let cls = pathname === href ? &amp;#039;active&amp;#039; : &amp;#039;&amp;#039;&lt;br /&gt;
      this.append(h(&amp;#039;a&amp;#039;, {href, cls}, file.slice(0, -3)))&lt;br /&gt;
    }&lt;br /&gt;
    if (this.files.length === 0) {&lt;br /&gt;
      this.append(h(&amp;#039;div&amp;#039;, {cls: &amp;#039;empty&amp;#039;}, &amp;#039;This Wiki has no pages&amp;#039;))&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
customElements.define(&amp;#039;wiki-page&amp;#039;, class extends HTMLElement {&lt;br /&gt;
  constructor () {&lt;br /&gt;
    super()&lt;br /&gt;
    this.render()&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  async render () {&lt;br /&gt;
    // check existence&lt;br /&gt;
    let stat = await self.stat(pathname).catch(e =&amp;gt; undefined)&lt;br /&gt;
    if (!stat) {&lt;br /&gt;
      // 404&lt;br /&gt;
      let canEdit = (await self.getInfo()).writable&lt;br /&gt;
      if (canEdit) {&lt;br /&gt;
        let btn = h(&amp;#039;button&amp;#039;, {}, &amp;#039;Create Page&amp;#039;)&lt;br /&gt;
        btn.addEventListener(&amp;#039;click&amp;#039;, async (e) =&amp;gt; {&lt;br /&gt;
          await ensureParentDir(pathname)&lt;br /&gt;
          await self.writeFile(pathname, `# ${pathname}`)&lt;br /&gt;
          location.search = &amp;#039;?edit&amp;#039;&lt;br /&gt;
        })&lt;br /&gt;
        this.append(h(&amp;#039;div&amp;#039;, {cls: &amp;#039;empty&amp;#039;}, h(&amp;#039;h2&amp;#039;, {}, &amp;#039;This Page Does Not Exist&amp;#039;), btn))&lt;br /&gt;
      } else {&lt;br /&gt;
        this.append(h(&amp;#039;div&amp;#039;, {cls: &amp;#039;empty&amp;#039;}, h(&amp;#039;h2&amp;#039;, {}, &amp;#039;This Page Does Not Exist&amp;#039;)))&lt;br /&gt;
      }&lt;br /&gt;
      return&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // embed content&lt;br /&gt;
    if (/\.(png|jpe?g|gif)$/i.test(pathname)) {&lt;br /&gt;
      this.append(h(&amp;#039;img&amp;#039;, {src: pathname}))&lt;br /&gt;
    } else if (/\.(mp4|webm|mov)/i.test(pathname)) {&lt;br /&gt;
      this.append(h(&amp;#039;video&amp;#039;, {controls: true}, h(&amp;#039;source&amp;#039;, {src: pathname})))&lt;br /&gt;
    } else if (/\.(mp3|ogg)/i.test(pathname)) {&lt;br /&gt;
      this.append(h(&amp;#039;audio&amp;#039;, {controls: true}, h(&amp;#039;source&amp;#039;, {src: pathname})))&lt;br /&gt;
    } else {&lt;br /&gt;
      let content = await self.readFile(pathname)&lt;br /&gt;
      if (isEditing) {&lt;br /&gt;
        // render editor&lt;br /&gt;
        let textarea = h(&amp;#039;textarea&amp;#039;, {cls: &amp;#039;editor&amp;#039;}, content)&lt;br /&gt;
        this.append(textarea)&lt;br /&gt;
      } else {&lt;br /&gt;
        // render content&lt;br /&gt;
        if (/\.(md|html)$/i.test(pathname)) {&lt;br /&gt;
          if (pathname.endsWith(&amp;#039;.md&amp;#039;)) {&lt;br /&gt;
            let md = new MarkdownIt()&lt;br /&gt;
            content = md.render(content)&lt;br /&gt;
          }&lt;br /&gt;
          let contentEl = h(&amp;#039;div&amp;#039;, {cls: &amp;#039;content&amp;#039;})&lt;br /&gt;
          contentEl.innerHTML = content&lt;br /&gt;
          this.append(contentEl)&lt;br /&gt;
        } else {&lt;br /&gt;
          this.append(h(&amp;#039;pre&amp;#039;, {cls: &amp;#039;content&amp;#039;}, content))&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
})&lt;/div&gt;</summary>
		<author><name>Amythebunni</name></author>
	</entry>
</feed>