<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.seculargames.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AMageloImport.js</id>
	<title>MediaWiki:MageloImport.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.seculargames.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AMageloImport.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.seculargames.org/index.php?title=MediaWiki:MageloImport.js&amp;action=history"/>
	<updated>2026-07-29T05:22:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.seculargames.org/index.php?title=MediaWiki:MageloImport.js&amp;diff=45803&amp;oldid=prev</id>
		<title>imported&gt;Loramin at 16:28, 21 February 2021</title>
		<link rel="alternate" type="text/html" href="https://wiki.seculargames.org/index.php?title=MediaWiki:MageloImport.js&amp;diff=45803&amp;oldid=prev"/>
		<updated>2021-02-21T16:28:47Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;var allSlots = [&lt;br /&gt;
  &amp;#039;Neck&amp;#039;, &amp;#039;Head&amp;#039;, &amp;#039;Ears1&amp;#039;, &amp;#039;Ears2&amp;#039;, &amp;#039;Face&amp;#039;, &amp;#039;Chest&amp;#039;, &amp;#039;Arms&amp;#039;, &amp;#039;Back&amp;#039;, &amp;#039;Waist&amp;#039;, &amp;#039;Shoulders&amp;#039;,&lt;br /&gt;
  &amp;#039;Wrists1&amp;#039;, &amp;#039;Wrists2&amp;#039;, &amp;#039;Legs&amp;#039;, &amp;#039;Hands&amp;#039;, &amp;#039;Fingers1&amp;#039;, &amp;#039;Fingers2&amp;#039;, &amp;#039;Feet&amp;#039;, &amp;#039;Primary&amp;#039;,&lt;br /&gt;
  &amp;#039;Secondary&amp;#039;, &amp;#039;Range&amp;#039;, &amp;#039;Ammo&amp;#039;, &amp;#039;Inv1&amp;#039;, &amp;#039;Inv2&amp;#039;, &amp;#039;Inv3&amp;#039;, &amp;#039;Inv4&amp;#039;, &amp;#039;Inv5&amp;#039;, &amp;#039;Inv6&amp;#039;, &amp;#039;Inv7&amp;#039;, &amp;#039;Inv8&amp;#039;,&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// Account for differences in slot names between output file and wiki&lt;br /&gt;
var convertSlot = function (rows, slot) {&lt;br /&gt;
  if (slot === &amp;#039;Ear&amp;#039;) return &amp;#039;Ears&amp;#039; + (rows.Ears1 ? 2 : 1);&lt;br /&gt;
  if (slot === &amp;#039;Fingers&amp;#039;) return rows.Fingers1 ? &amp;#039;Fingers2&amp;#039; : &amp;#039;Fingers1&amp;#039;;&lt;br /&gt;
  if (slot === &amp;#039;Wrist&amp;#039;) return rows.Wrists1 ? &amp;#039;Wrists2&amp;#039; : &amp;#039;Wrists1&amp;#039;;&lt;br /&gt;
  if (slot.substr(0, 7) === &amp;#039;General&amp;#039;) {&lt;br /&gt;
    var index = slot.substr(7, 8);&lt;br /&gt;
    var isBagSlot = &amp;#039;-&amp;#039; === slot.substr(8, 9);&lt;br /&gt;
    if (!isBagSlot) return &amp;#039;Inv&amp;#039; + index;&lt;br /&gt;
  }&lt;br /&gt;
  return slot;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Convert output file text rows into an object of slot =&amp;gt; item&lt;br /&gt;
// (but with a bunch of garbage values also)&lt;br /&gt;
var parseRows = function (eqText) {&lt;br /&gt;
  var rows = eqText.split(&amp;#039;\n&amp;#039;);&lt;br /&gt;
  return rows.reduce(function (memo, row) {&lt;br /&gt;
    var slot = convertSlot(memo, row.split(&amp;#039;	&amp;#039;)[0]);&lt;br /&gt;
    var value = row.split(&amp;#039;	&amp;#039;)[1];&lt;br /&gt;
    memo[slot] = value === &amp;#039;Empty&amp;#039; ? &amp;#039;&amp;#039; : value;&lt;br /&gt;
    return memo;&lt;br /&gt;
  }, {});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Take *only* the relevant values from parsed item rows and build a &lt;br /&gt;
// new object with just those properties&lt;br /&gt;
var buildItemsBySlot = function (itemRows) {&lt;br /&gt;
  return allSlots.reduce(function (itemsBySlot, slot) {&lt;br /&gt;
    itemsBySlot[slot] = itemRows[slot];&lt;br /&gt;
    return itemsBySlot;&lt;br /&gt;
  }, {});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Takes outputfile text, returns parsed object with relevant values only&lt;br /&gt;
var parseEqText = function (eqText) {&lt;br /&gt;
  var itemRows = parseRows(eqText);&lt;br /&gt;
  return buildItemsBySlot(itemRows);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// NOTE: These are for Magelo Import; for item ID generation&lt;br /&gt;
&lt;br /&gt;
var buildItemIdMap = function(rows) {&lt;br /&gt;
  return rows.reduce(function(idMap, row) {&lt;br /&gt;
    var rowParts = row.split(&amp;#039;\t&amp;#039;);&lt;br /&gt;
    var name = rowParts[1];&lt;br /&gt;
    var id = rowParts[2];&lt;br /&gt;
    if (name === &amp;#039;Empty&amp;#039; || name === &amp;#039;Name&amp;#039;) return idMap; // Ignore empty item slots&lt;br /&gt;
    var newItem = {};&lt;br /&gt;
    newItem[name] = id;&lt;br /&gt;
    return Object.assign(idMap, newItem);&lt;br /&gt;
  }, {})&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var convertObjectToUl = function(data, containerId, includeCheckbox) {&lt;br /&gt;
  Object.entries(data).forEach(function(entry) {&lt;br /&gt;
    var checkboxHtml = includeCheckbox ? &amp;#039;&amp;lt;input data-item-id=&amp;quot;&amp;#039; + entry[1] + &amp;#039;&amp;quot; type=&amp;quot;checkbox&amp;quot; checked id=&amp;quot;&amp;#039; +entry[0]+&amp;#039;&amp;quot;/&amp;gt;&amp;#039; : &amp;#039;&amp;#039;;&lt;br /&gt;
    $(containerId).append(&amp;#039;&amp;lt;li&amp;gt;&amp;lt;label&amp;gt;&amp;#039; + entry[0] + &amp;#039; (&amp;#039; + entry[1] + &amp;#039;) &amp;#039; + checkboxHtml + &amp;#039;&amp;lt;/label&amp;gt;&amp;lt;/li&amp;gt;&amp;#039;);&lt;br /&gt;
  })&lt;br /&gt;
  addCheckboxUi();&lt;br /&gt;
  $(&amp;#039;#output-caption&amp;#039;).text(&amp;#039;Your Item\&amp;#039;s (Hexadecimal) Links&amp;#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var reset = function() {&lt;br /&gt;
  $(&amp;#039;#item-checkboxes, #checkbox-ui&amp;#039;).empty();&lt;br /&gt;
  $(&amp;#039;#eq-inventory-input&amp;#039;).val(&amp;#039;&amp;#039;);&lt;br /&gt;
  $(&amp;#039;#output-caption&amp;#039;).text(&amp;#039;Your Item\&amp;#039;s IDs&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var convertArrayToUl = function(data) {&lt;br /&gt;
  $(&amp;#039;#item-checkboxes&amp;#039;).empty();&lt;br /&gt;
  data.forEach(function(entry) {&lt;br /&gt;
    $(&amp;#039;&amp;lt;li&amp;gt;&amp;#039;).text(entry).appendTo(&amp;#039;#item-checkboxes&amp;#039;);&lt;br /&gt;
  })&lt;br /&gt;
  $(&amp;#039;#checkbox-ui&amp;#039;).html(&amp;#039;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Reset&amp;quot; onClick=&amp;quot;reset()&amp;quot; /&amp;gt;&amp;#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var parseEqTextIntoIds = function(eqText) {&lt;br /&gt;
  var rows = eqText.split(&amp;#039;\n&amp;#039;);&lt;br /&gt;
  var idMap = buildItemIdMap(rows);&lt;br /&gt;
  convertObjectToUl(idMap, &amp;#039;#item-checkboxes&amp;#039;, true);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Format the object with data into wiki code&lt;br /&gt;
var makeMageloCode = function(eqText) {&lt;br /&gt;
  var parsed = parseEqText(eqText);&lt;br /&gt;
  var mageloCode = allSlots.map(function (slot) {&lt;br /&gt;
    // Wiki has newlines before these two &amp;quot;slots&amp;quot;&lt;br /&gt;
    var newLine = slot === &amp;#039;Primary&amp;#039; || slot === &amp;#039;Inv1&amp;#039; ? &amp;#039;\n&amp;#039; : &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    return newLine + &amp;#039;* &amp;#039; + slot + &amp;#039;: &amp;#039; + (parsed[slot] || &amp;#039;&amp;#039;);&lt;br /&gt;
  })&lt;br /&gt;
  .join(&amp;#039;\n&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
  $(&amp;#039;#magelo-text-output&amp;#039;).text(mageloCode);&lt;br /&gt;
&lt;br /&gt;
  // Not sure timeout is necessary, but want to be sure text is on page&lt;br /&gt;
  // before we try to copy it (so wait 1ms)&lt;br /&gt;
  window.setTimeout(function() {&lt;br /&gt;
    copyMageloCode(message)&lt;br /&gt;
  });&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Once we&amp;#039;ve updated the page with the new Magelo code, this&lt;br /&gt;
// function adds it to the clipboard (or at least tries)&lt;br /&gt;
var copyMageloCode = function () {&lt;br /&gt;
  try {&lt;br /&gt;
      var copyText = $(&amp;#039;#magelo-text-output&amp;#039;)[0];&lt;br /&gt;
&lt;br /&gt;
      /* Select the text field */&lt;br /&gt;
      copyText.select();&lt;br /&gt;
      copyText.setSelectionRange(0, 99999); /*For mobile devices*/&lt;br /&gt;
&lt;br /&gt;
      /* Copy the text inside the text field */&lt;br /&gt;
    if (!document.execCommand(&amp;#039;copy&amp;#039;)) throw new Error(&amp;#039;copy failed&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    alert(&amp;#039;Your Magelo code has been copied.  You can now paste in your Magelo profile, in &amp;#039; +&lt;br /&gt;
          &amp;#039;place of your current equipment section.&amp;#039;);&lt;br /&gt;
  } catch (err) {&lt;br /&gt;
    console.error(err);&lt;br /&gt;
    alert(&amp;#039;Failed to copy code :( Please select and copy the code yourself.&amp;#039;);&lt;br /&gt;
  } finally {&lt;br /&gt;
    window.getSelection().removeAllRanges();&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// When someone adds their outputfile code, trigger the whole process&lt;br /&gt;
var buildOnTextareaChange = function(parse) {&lt;br /&gt;
  return function (e) {&lt;br /&gt;
    var eqText = $(e.target).val();&lt;br /&gt;
    if (!eqText) return;&lt;br /&gt;
&lt;br /&gt;
    parse(eqText);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var paddWithZerosUpTo45 = function(numberString) {&lt;br /&gt;
  while(numberString.length &amp;lt; 45) {&lt;br /&gt;
    numberString += &amp;#039;0&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return numberString;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var dc2 = &amp;#039;\u0012&amp;#039;;&lt;br /&gt;
var convertCheckedToHex = function() {&lt;br /&gt;
  var hexMapped = $(&amp;#039;:checked&amp;#039;).toArray().map(function(checkbox){&lt;br /&gt;
    var $checkbox = $(checkbox);&lt;br /&gt;
    var name = $checkbox.attr(&amp;#039;id&amp;#039;);&lt;br /&gt;
    var id = $checkbox.data(&amp;#039;item-id&amp;#039;);&lt;br /&gt;
    var hex = &amp;#039;00&amp;#039; + id.toString(16);&lt;br /&gt;
    var paddedHex = paddWithZerosUpTo45(hex);&lt;br /&gt;
    var withDc2 = dc2 + paddedHex + &amp;#039;      &amp;#039; + name + &amp;#039; &amp;#039;+ dc2;&lt;br /&gt;
    return withDc2;&lt;br /&gt;
  });&lt;br /&gt;
  convertArrayToUl(hexMapped);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var addCheckboxUi = function() {&lt;br /&gt;
  $(&amp;#039;#checkbox-ui&amp;#039;).html(&lt;br /&gt;
    &amp;#039;&amp;lt;a onClick=&amp;quot;$(\&amp;#039;:checkbox\&amp;#039;).attr(\&amp;#039;checked\&amp;#039;, true)&amp;quot;&amp;gt;Check all&amp;lt;/a&amp;gt; | &amp;#039; +&lt;br /&gt;
    &amp;#039;&amp;lt;a onClick=&amp;quot;$(\&amp;#039;:checkbox\&amp;#039;).attr(\&amp;#039;checked\&amp;#039;, false)&amp;quot;&amp;gt;Uncheck all&amp;lt;/a&amp;gt; | &amp;#039; +&lt;br /&gt;
    &amp;#039;&amp;lt;input onClick=&amp;quot;convertCheckedToHex()&amp;quot; type=&amp;quot;submit&amp;quot; value=&amp;quot;Convert to Hexadecimal&amp;quot;/&amp;gt;&amp;#039;&lt;br /&gt;
  );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Wiki won&amp;#039;t let us have form HTML, so we need to bring it in via JS onLoad&lt;br /&gt;
// (this whole file is brought in &amp;quot;onLoad&amp;quot;, so no need for event listener)&lt;br /&gt;
$(&amp;#039;#magelo-import-placeholder&amp;#039;).replaceWith(&lt;br /&gt;
  &amp;#039;&amp;lt;h3&amp;gt;Add Your Output File Code Below&amp;lt;h3&amp;gt;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;lt;textarea id=&amp;quot;eq-text-input&amp;quot; style=&amp;quot;min-height: 6em; max-width:50em&amp;quot;&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;lt;h3 style=&amp;quot;margin-top:1em&amp;quot;&amp;gt;Your Wiki Magelo Code&amp;lt;h3&amp;gt;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;lt;textarea id=&amp;quot;magelo-text-output&amp;quot; &amp;#039; +&lt;br /&gt;
  &amp;#039;style=&amp;quot;border: 2px dashed lightBlue; min-height: 10em; min-width: 20em; max-width:50em&amp;quot;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
$(&amp;#039;#eq-text-input&amp;#039;).change(buildOnTextareaChange(makeMageloCode));&lt;br /&gt;
&lt;br /&gt;
// Similar code for id generator&lt;br /&gt;
$(&amp;#039;#item-id-generator-placeholder&amp;#039;).replaceWith(&lt;br /&gt;
  &amp;#039;&amp;lt;h3&amp;gt;Add Your Inventory Output File Code Below&amp;lt;h3&amp;gt;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;lt;textarea id=&amp;quot;eq-inventory-input&amp;quot; style=&amp;quot;min-height: 6em; max-width:50em&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;lt;h3 style=&amp;quot;margin-top:1em&amp;quot; id=&amp;quot;output-caption&amp;quot;&amp;gt;Your Item\&amp;#039;s IDs&amp;lt;h3&amp;gt;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;lt;ul id=&amp;quot;item-checkboxes&amp;quot; &amp;#039; +&lt;br /&gt;
  &amp;#039;style=&amp;quot;border: 2px dashed lightBlue; min-height: 10em; min-width: 20em; max-width:50em; list-style-type: none; padding: 1em;&amp;quot;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;gt;&amp;lt;/ul&amp;gt;&amp;#039; +&lt;br /&gt;
  &amp;#039;&amp;lt;p id=&amp;quot;checkbox-ui&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$(&amp;#039;#eq-inventory-input&amp;#039;).change(buildOnTextareaChange(parseEqTextIntoIds));&lt;/div&gt;</summary>
		<author><name>imported&gt;Loramin</name></author>
	</entry>
</feed>