Initial native OpenSim viewer prototype
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"config": {
|
||||
"MD001": true, // header levels increment by 1
|
||||
"MD002": true, // first header should be a top level header
|
||||
"MD003": { "style": "atx" }, // header style
|
||||
"MD004": { "style": "dash" }, // unordered list style - dash
|
||||
// "MD005": false, // inconsistent indentation handled by prettier
|
||||
"MD006": true, // bulleted lists at beginning of line
|
||||
// "MD007": { "indent": 2 }, // handled by prettier
|
||||
"MD009": true, // no trailing spaces
|
||||
"MD010": true, // no hard tabs
|
||||
"MD011": true, // reversed link syntax
|
||||
"MD012": true, // multiple consecutive blank lines
|
||||
"MD013": false, // line length ignored
|
||||
// "MD014": false, // command syntax ignored
|
||||
"MD018": true, // space after header style
|
||||
"MD019": true, // no multiple spaces after header style
|
||||
"MD020": true, // no spaces inside hashes
|
||||
"MD021": true, // no spaces inside closing hashes
|
||||
"MD022": true, // headers surrounded by blank lines
|
||||
"MD023": true, // headers start at beginning of line
|
||||
"MD024": { "siblings_only": true,"allow_different_nesting": true }, // duplicate headers allowed in different nests
|
||||
"MD025": true, // only one H1
|
||||
"MD026": { "punctuation": ".,;:" }, // no trailing punctuation
|
||||
"MD027": true, // multiple spaces after blockquote
|
||||
"MD028": true, // no blank lines inside blockquote
|
||||
// "MD029": { "style": "ordered" }, // prettier handles numbering
|
||||
// "MD030": { "ul_single": 1, "ol_single": 1, "ul_multi": 1, "ol_multi": 3 }, // prettier handles spacing
|
||||
"MD031": true, // fenced code blocks surrounded by blank lines
|
||||
// "MD032": false, // lists surrounded by blank lines, prettier handles
|
||||
// "MD033": { "allowed_elements": "a, em, strong, code, del, ins, sup, sub" }, // inline HTML exceptions
|
||||
"MD033": false,
|
||||
// "MD034": false, // raw URLs allowed
|
||||
"MD035": { "style": "---" }, // horizontal rule style
|
||||
// "MD036": false, // strong vs emphasis ignored
|
||||
"MD037": true, // no spaces inside emphasis
|
||||
"MD038": true, // no spaces inside code spans
|
||||
"MD039": true, // no spaces inside link text
|
||||
"MD040": true, // require fenced language
|
||||
"MD041": true, // first line is top-level header
|
||||
// "MD042": false, // empty link disabled
|
||||
"MD046": { "style": "fenced" }, // code block style
|
||||
"MD047": true, // single newline at end
|
||||
"MD048": true, // code fence style consistency ignored
|
||||
// Newly enabled rules for testing:
|
||||
"MD044": {
|
||||
// proper names; empty list means default names only
|
||||
"names": []
|
||||
},
|
||||
"MD049": { "style": "consistent" }, // emphasis style
|
||||
"MD050": { "style": "consistent" }, // strong style
|
||||
"MD051": true, // valid link fragments
|
||||
"MD052": true, // reference links/images must use defined labels
|
||||
"MD053": true, // flag unused or undefined link references
|
||||
|
||||
// Table-related rules: enable if you use tables
|
||||
"MD055": true, // consistent pipe style
|
||||
"MD056": true, // consistent column counts
|
||||
"MD058": true // blank lines around tables
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
base_path = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
|
||||
config_h = os.path.join(base_path, "include", "CLI", "Version.hpp")
|
||||
data = {"MAJOR": 0, "MINOR": 0, "PATCH": 0}
|
||||
reg = re.compile(r"^\s*#define\s+CLI11_VERSION_([A-Z]+)\s+([0-9]+).*$")
|
||||
|
||||
with open(config_h, "r") as fp:
|
||||
for l in fp:
|
||||
m = reg.match(l)
|
||||
if m:
|
||||
data[m.group(1)] = int(m.group(2))
|
||||
|
||||
print("{}.{}.{}".format(data["MAJOR"], data["MINOR"], data["PATCH"]))
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from __future__ import print_function, unicode_literals
|
||||
|
||||
import os
|
||||
import re
|
||||
import argparse
|
||||
from subprocess import Popen, PIPE
|
||||
import warnings
|
||||
|
||||
tag_str = r"""
|
||||
^ # Begin of line
|
||||
[/\s]+ # Whitespace or comment // chars
|
||||
\[ # A literal [
|
||||
{tag}: # The tag
|
||||
(?P<name>[\w_]+) # name: group name
|
||||
: # Colon
|
||||
(?P<action>[\w_]+) # action: type of include
|
||||
\] # A literal ]
|
||||
\s* # Whitespace
|
||||
$ # End of a line
|
||||
|
||||
(?P<content>.*) # All
|
||||
|
||||
^ # Begin of line
|
||||
[/\s]+ # Whitespace or comment // chars
|
||||
\[ # A literal [
|
||||
{tag}: # The tag
|
||||
(?P=name) # Repeated name
|
||||
: # Colon
|
||||
end # Literal "end"
|
||||
\] # A literal ]
|
||||
\s* # Whitespace
|
||||
$ # End of a line
|
||||
"""
|
||||
|
||||
DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
class HeaderGroups(dict):
|
||||
def __init__(self, tag):
|
||||
"""
|
||||
A dictionary that also can read headers given a tag expression.
|
||||
|
||||
TODO: might have gone overboard on this one, could maybe be two functions.
|
||||
"""
|
||||
self.re_matcher = re.compile(
|
||||
tag_str.format(tag=tag), re.MULTILINE | re.DOTALL | re.VERBOSE
|
||||
)
|
||||
super(HeaderGroups, self).__init__()
|
||||
|
||||
def read_header(self, filename):
|
||||
"""
|
||||
Read a header file in and add items to the dict, based on the item's action.
|
||||
"""
|
||||
with open(filename) as f:
|
||||
inner = f.read()
|
||||
|
||||
matches = self.re_matcher.findall(inner)
|
||||
|
||||
if not matches:
|
||||
warnings.warn(
|
||||
"Failed to find any matches in {filename}".format(filename=filename)
|
||||
)
|
||||
|
||||
for name, action, content in matches:
|
||||
if action == "verbatim":
|
||||
assert (
|
||||
name not in self
|
||||
), "{name} read in more than once! Quitting.".format(name=name)
|
||||
self[name] = content
|
||||
elif action == "set":
|
||||
self[name] = self.get(name, set()) | set(content.strip().splitlines())
|
||||
else:
|
||||
raise RuntimeError("Action not understood, must be verbatim or set")
|
||||
|
||||
def post_process(self):
|
||||
"""
|
||||
Turn sets into multiple line strings.
|
||||
"""
|
||||
for key in self:
|
||||
if isinstance(self[key], set):
|
||||
self[key] = "\n".join(sorted(self[key]))
|
||||
|
||||
|
||||
def make_header(output, main_header, files, tag, namespace, macro=None, version=None):
|
||||
"""
|
||||
Makes a single header given a main header template and a list of files.
|
||||
"""
|
||||
groups = HeaderGroups(tag)
|
||||
|
||||
# Set tag if possible to class variable
|
||||
try:
|
||||
proc = Popen(
|
||||
["git", "describe", "--tags", "--always"], cwd=str(DIR), stdout=PIPE
|
||||
)
|
||||
out, _ = proc.communicate()
|
||||
groups["git"] = out.decode("utf-8").strip() if proc.returncode == 0 else ""
|
||||
except OSError:
|
||||
groups["git"] = ""
|
||||
|
||||
for f in files:
|
||||
if os.path.isdir(f):
|
||||
continue
|
||||
groups.read_header(f)
|
||||
|
||||
groups["namespace"] = namespace
|
||||
groups["version"] = version or groups["git"]
|
||||
|
||||
groups.post_process()
|
||||
|
||||
with open(main_header) as f:
|
||||
single_header = f.read().format(**groups)
|
||||
|
||||
if macro is not None:
|
||||
before, after = macro
|
||||
print("Converting macros", before, "->", after)
|
||||
single_header.replace(before, after)
|
||||
|
||||
new_namespace = namespace + "::"
|
||||
single_header = re.sub(r"\bCLI::\b", new_namespace, single_header)
|
||||
|
||||
if output is not None:
|
||||
with open(output, "w") as f:
|
||||
f.write(single_header)
|
||||
|
||||
print("Created", output)
|
||||
else:
|
||||
print(single_header)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(
|
||||
usage="Convert source to single header include. Can optionally add namespace and search-replace replacements (for macros).",
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
)
|
||||
parser.add_argument("--output", default=None, help="Single header file output")
|
||||
parser.add_argument(
|
||||
"--main",
|
||||
default="single-include/CLI11.hpp.in",
|
||||
help="The main include file that defines the other files",
|
||||
)
|
||||
parser.add_argument("files", nargs="+", help="The header files")
|
||||
parser.add_argument("--namespace", default="CLI", help="Set the namespace")
|
||||
parser.add_argument("--tag", default="CLI11", help="Tag to look up")
|
||||
parser.add_argument(
|
||||
"--macro", nargs=2, help="Replaces OLD_PREFIX_ with NEW_PREFIX_"
|
||||
)
|
||||
parser.add_argument("--version", help="Include this version in the generated file")
|
||||
args = parser.parse_args()
|
||||
|
||||
make_header(
|
||||
args.output,
|
||||
args.main,
|
||||
args.files,
|
||||
args.tag,
|
||||
args.namespace,
|
||||
args.macro,
|
||||
args.version,
|
||||
)
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env sh
|
||||
set -evx
|
||||
|
||||
clang-format --version
|
||||
|
||||
git ls-files -- '*.cpp' '*.hpp' | xargs clang-format -sort-includes -i -style=file
|
||||
|
||||
git diff --exit-code --color
|
||||
|
||||
set +evx
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
# Also good but untagged: CLANG_FORMAT=unibeautify/clang-format
|
||||
# This might provide more control in the future: silkeh/clang:8 (etc)
|
||||
CLANG_FORMAT=saschpe/clang-format:5.0.1
|
||||
|
||||
set -evx
|
||||
|
||||
docker run --rm ${CLANG_FORMAT} --version
|
||||
docker run --rm --user $(id -u):$(id -g) -v "$(pwd)":/workdir -w /workdir ${CLANG_FORMAT} -style=file -sort-includes -i $(git ls-files -- '*.cpp' '*.hpp')
|
||||
|
||||
git diff --exit-code --color
|
||||
|
||||
set +evx
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# To use:
|
||||
# ln -s scripts/clang-format.hook .git/hooks/pre-commit
|
||||
|
||||
# Based loosely on https://github.com/andrewseidl/githook-clang-format
|
||||
|
||||
format_file() {
|
||||
file="${1}"
|
||||
case "$file" in
|
||||
*.hpp | *.cpp | .c | *.cc | *.cu | *.h )
|
||||
if [ -f "${1}" ] ; then
|
||||
clang-format -i -style=file -sort-includes "${1}"
|
||||
if git diff-files --quiet -- "${1}" ; then
|
||||
echo "Already nicely formatted: ${1}"
|
||||
else
|
||||
git add "${1}"
|
||||
echo "Reformatting file: ${1}"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
case "${1}" in
|
||||
--about )
|
||||
echo "Runs clang-format on source files"
|
||||
;;
|
||||
* )
|
||||
for file in `git diff-index --cached --name-only HEAD` ; do
|
||||
format_file "${file}"
|
||||
done
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user