summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/compare.sh11
-rwxr-xr-xtools/compare2.sh51
-rw-r--r--tools/toc.py89
3 files changed, 151 insertions, 0 deletions
diff --git a/tools/compare.sh b/tools/compare.sh
new file mode 100755
index 000000000..d013a88ab
--- /dev/null
+++ b/tools/compare.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+# Compares baserom.gbc and pokecrystal.gbc
+
+# create baserom.txt if necessary
+if [ ! -f baserom.txt ]; then
+ hexdump -C baserom.gbc > baserom.txt
+fi
+
+hexdump -C pokecrystal.gbc > pokecrystal.txt
+
+diff -u baserom.txt pokecrystal.txt | less
diff --git a/tools/compare2.sh b/tools/compare2.sh
new file mode 100755
index 000000000..64695229e
--- /dev/null
+++ b/tools/compare2.sh
@@ -0,0 +1,51 @@
+#!/bin/sh
+# Compares baserom.gbc and pokecrystal.gbc
+
+# create baserom.txt if necessary
+crystal_md5=9f2922b235a5eeb78d65594e82ef5dde
+if [ ! -f baserom.gbc ]; then
+ echo "FATAL: Baserom not found"
+ exit 1
+fi
+
+if [ $1 ]; then
+ if [ $1 == "-v" ]; then
+ verbose=1
+ else
+ verbose = 0
+ fi
+else
+ verbose=0
+fi
+
+base_md5=`md5sum baserom.gbc | cut -d' ' -f1`
+if [ $verbose == 1 ]; then
+ echo "baserom.gbc: $base_md5"
+fi
+if [ $base_md5 != $crystal_md5 ]; then
+ echo "FATAL: Baserom is incorrect"
+ exit 1
+fi
+
+built_md5=`md5sum pokecrystal.gbc | cut -d' ' -f1`
+if [ $verbose == 1 ]; then
+ echo "pokecrystal.gbc: $built_md5"
+fi
+if [ $built_md5 != $crystal_md5 ]
+then
+ if [ $verbose == 1 ]; then
+ echo "Checksums do not match, here's where the ROMs differ..."
+ fi
+ if [ ! -f baserom.txt ]; then
+ hexdump -C baserom.gbc > baserom.txt
+ fi
+
+ hexdump -C pokecrystal.gbc > pokecrystal.txt
+
+ diff -u baserom.txt pokecrystal.txt | less
+else
+ if [ $verbose == 1 ]; then
+ echo "Checksums match! :D"
+ fi
+fi
+
diff --git a/tools/toc.py b/tools/toc.py
new file mode 100644
index 000000000..9bdc8cca6
--- /dev/null
+++ b/tools/toc.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+"""
+Usage: python3 toc.py [-n] files.md...
+Replace a "## TOC" heading in a Markdown file with a table of contents,
+generated from the other headings in the file. Supports multiple files.
+Headings must start with "##" signs to be detected.
+"""
+
+import sys
+import re
+from collections import namedtuple
+
+toc_name = 'Contents'
+valid_toc_headings = {'## TOC', '##TOC'}
+
+TocItem = namedtuple('TocItem', ['name', 'anchor', 'level'])
+punctuation_regexp = re.compile(r'[^\w\- ]+')
+
+def name_to_anchor(name):
+ # GitHub's algorithm for generating anchors from headings
+ # https://github.com/jch/html-pipeline/blob/master/lib/html/pipeline/toc_filter.rb
+ anchor = name.strip().lower() # lowercase
+ anchor = re.sub(punctuation_regexp, '', anchor) # remove punctuation
+ anchor = anchor.replace(' ', '-') # replace spaces with dash
+ return anchor
+
+def get_toc_index(lines):
+ toc_index = None
+ for i, line in enumerate(lines):
+ if line.rstrip() in valid_toc_headings:
+ toc_index = i
+ break
+ return toc_index
+
+def get_toc_items(lines, toc_index):
+ for i, line in enumerate(lines):
+ if i <= toc_index:
+ continue
+ if line.startswith('##'):
+ name = line.lstrip('#')
+ level = len(line) - len(name) - len('##')
+ name = name.strip()
+ anchor = name_to_anchor(name)
+ yield TocItem(name, anchor, level)
+
+def toc_string(toc_items):
+ lines = ['## %s' % toc_name, '']
+ for name, anchor, level in toc_items:
+ padding = ' ' * level
+ line = '%s- [%s](#%s)' % (padding, name, anchor)
+ lines.append(line)
+ return '\n'.join(lines) + '\n'
+
+def add_toc(filename):
+ with open(filename, 'r', encoding='utf-8') as f:
+ lines = f.readlines()
+ toc_index = get_toc_index(lines)
+ if toc_index is None:
+ return None # no TOC heading
+ toc_items = list(get_toc_items(lines, toc_index))
+ if not toc_items:
+ return False # no content headings
+ with open(filename, 'w', encoding='utf-8') as f:
+ for i, line in enumerate(lines):
+ if i == toc_index:
+ f.write(toc_string(toc_items))
+ else:
+ f.write(line)
+ return True # OK
+
+def main():
+ if len(sys.argv) < 2:
+ print('*** ERROR: No filenames specified')
+ print(__doc__)
+ exit(1)
+ for filename in sys.argv[1:]:
+ print(filename)
+ result = add_toc(filename)
+ if result is None:
+ print('*** WARNING: No "## TOC" heading found')
+ elif result is False:
+ print('*** WARNING: No content headings found')
+ else:
+ print('OK')
+
+if __name__ == '__main__':
+ main()