fix viewer backend for convenitnt test and do some frontend work
@ -1,10 +1,18 @@
 | 
			
		||||
import locale
 | 
			
		||||
 | 
			
		||||
# encoding list
 | 
			
		||||
# https://docs.python.org/3/library/codecs.html#standard-encodings
 | 
			
		||||
database_encoding = locale.getpreferredencoding()
 | 
			
		||||
export_db = "export.db"
 | 
			
		||||
decorated_db = "decorate.db"
 | 
			
		||||
env_db = "env.db"
 | 
			
		||||
force_regenerate = False
 | 
			
		||||
class DatabaseType:
 | 
			
		||||
    SQLite = 0
 | 
			
		||||
    MySQL = 1
 | 
			
		||||
 | 
			
		||||
database_type = DatabaseType.SQLite
 | 
			
		||||
sqlite_path = "decorated.db"
 | 
			
		||||
 | 
			
		||||
'''
 | 
			
		||||
database_type = DatabaseType.MySQL
 | 
			
		||||
mysql_url = "http://yyc.bkt.moe:10000"
 | 
			
		||||
mysql_username = "test"
 | 
			
		||||
mysql_password = "test"
 | 
			
		||||
mysql_database = "test_database"
 | 
			
		||||
'''
 | 
			
		||||
 | 
			
		||||
debug_mode = False
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								SuperScriptViewer/Database.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,11 @@
 | 
			
		||||
import CustomConfig
 | 
			
		||||
 | 
			
		||||
class EmptyDatabase:
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
def CreateDatabase():
 | 
			
		||||
    return EmptyDatabase()
 | 
			
		||||
 | 
			
		||||
def CloseDatabase(db):
 | 
			
		||||
    pass
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
import CustomConfig
 | 
			
		||||
import Database
 | 
			
		||||
 | 
			
		||||
from flask import Flask
 | 
			
		||||
from flask import g
 | 
			
		||||
@ -8,228 +9,93 @@ from flask import request
 | 
			
		||||
from flask import abort
 | 
			
		||||
from flask import redirect
 | 
			
		||||
 | 
			
		||||
from functools import reduce
 | 
			
		||||
import sqlite3
 | 
			
		||||
import json
 | 
			
		||||
import ServerStruct as ss
 | 
			
		||||
 | 
			
		||||
app = Flask(__name__)
 | 
			
		||||
 | 
			
		||||
# =============================================database
 | 
			
		||||
def get_db():
 | 
			
		||||
    db = getattr(g, '_database', None)
 | 
			
		||||
    if db is None:
 | 
			
		||||
        db = g._database = sqlite3.connect(CustomConfig.decorated_db)
 | 
			
		||||
        db = g._database = Database.CreateDatabase()
 | 
			
		||||
    return db
 | 
			
		||||
 | 
			
		||||
def get_env():
 | 
			
		||||
    env = getattr(g, '_envDatabase', None)
 | 
			
		||||
    if env is None:
 | 
			
		||||
        env = g._envDatabase = sqlite3.connect(CustomConfig.env_db)
 | 
			
		||||
        env.text_factory = lambda x: x.decode(CustomConfig.database_encoding, errors="ignore")
 | 
			
		||||
    return env
 | 
			
		||||
 | 
			
		||||
@app.teardown_appcontext
 | 
			
		||||
def close_connection(exception):
 | 
			
		||||
    db = getattr(g, '_database', None)
 | 
			
		||||
    if db is not None:
 | 
			
		||||
        db.close()
 | 
			
		||||
 | 
			
		||||
# =============================================template func
 | 
			
		||||
@app.template_global(name = 'pinDecoder')
 | 
			
		||||
def block_pin_decoder(target):
 | 
			
		||||
    return json.loads(target)
 | 
			
		||||
 | 
			
		||||
@app.template_global(name = 'pinDecoder2')
 | 
			
		||||
def block_pin_decoder2(target):
 | 
			
		||||
    vab = json.loads(target)
 | 
			
		||||
    return [vab['name'], vab['type']]
 | 
			
		||||
        Database.CloseDatabase(db)
 | 
			
		||||
 | 
			
		||||
# =============================================route
 | 
			
		||||
 | 
			
		||||
# =========== default
 | 
			
		||||
 | 
			
		||||
@app.route('/', methods=['GET'])
 | 
			
		||||
def nospecHandle():
 | 
			
		||||
    return redirect(url_for('indexHandle'))
 | 
			
		||||
def handle_nospec():
 | 
			
		||||
    return redirect(url_for('handle_index'))
 | 
			
		||||
 | 
			
		||||
# =========== misc page
 | 
			
		||||
 | 
			
		||||
@app.route('/help', methods=['GET'])
 | 
			
		||||
def helpMainHandle():
 | 
			
		||||
    return render_template("help.html")
 | 
			
		||||
 | 
			
		||||
@app.route('/about', methods=['GET'])
 | 
			
		||||
def aboutHandle():
 | 
			
		||||
    return render_template("about.html", static_icon = url_for('static', filename='icon.png'))
 | 
			
		||||
 | 
			
		||||
# =========== help page
 | 
			
		||||
 | 
			
		||||
@app.route('/help/<path:scriptPath>', methods=['GET'])
 | 
			
		||||
def helpHandle(scriptPath):
 | 
			
		||||
    if scriptPath == 'converter':
 | 
			
		||||
        return render_template("help/converter.html",
 | 
			
		||||
                        tabcontrol_css = url_for('static', filename='tabcontrol.css'),
 | 
			
		||||
                        tabcontrol_js = url_for('static', filename='tabcontrol.js'),
 | 
			
		||||
                        converter_js = url_for('static', filename='converter.js'))
 | 
			
		||||
    elif scriptPath == 'env':
 | 
			
		||||
        return render_template("help/env.html",
 | 
			
		||||
                        tabcontrol_css = url_for('static', filename='tabcontrol.css'),
 | 
			
		||||
                        tabcontrol_js = url_for('static', filename='tabcontrol.js'),
 | 
			
		||||
                        env_js = url_for('static', filename='env.js'),
 | 
			
		||||
                        env_css = url_for('static', filename='env.css'),
 | 
			
		||||
                        database_data = ss.envDatabaseList)
 | 
			
		||||
    elif scriptPath == 'legend':
 | 
			
		||||
        return render_template("help/legend.html")
 | 
			
		||||
    else:
 | 
			
		||||
        abort(404)
 | 
			
		||||
 | 
			
		||||
@app.route('/help/env', methods=['POST'])
 | 
			
		||||
def envQueryHandle():
 | 
			
		||||
    basicReturn = {
 | 
			
		||||
        "status": False,
 | 
			
		||||
        "overflow": False,
 | 
			
		||||
        "data": []
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # check tag
 | 
			
		||||
    queryTag = request.form['tag'];
 | 
			
		||||
    if queryTag not in ss.legalEnvQueryKey:
 | 
			
		||||
        return basicReturn
 | 
			
		||||
 | 
			
		||||
    cur = get_env().cursor()
 | 
			
		||||
    #try:
 | 
			
		||||
    readyData = json.loads(request.form['data'])
 | 
			
		||||
    fieldLength = len(readyData.keys())
 | 
			
		||||
    if fieldLength == 0:
 | 
			
		||||
        cur.execute("SELECT * FROM {}".format(queryTag))
 | 
			
		||||
    else:
 | 
			
		||||
        whereStatement = 'AND'.join(map(lambda x: "([" + x + "] = ?)", readyData.keys()))
 | 
			
		||||
        cur.execute("SELECT * FROM {} WHERE ({})".format(queryTag, whereStatement), list(readyData.values()))
 | 
			
		||||
        
 | 
			
		||||
    # iterate
 | 
			
		||||
    counter = 0
 | 
			
		||||
    for i in cur.fetchall():
 | 
			
		||||
        if counter == 100:
 | 
			
		||||
            basicReturn['overflow'] = True
 | 
			
		||||
            break
 | 
			
		||||
        basicReturn['data'].append(i)
 | 
			
		||||
        counter+=1
 | 
			
		||||
 | 
			
		||||
    basicReturn['status'] = True
 | 
			
		||||
    #except Exception as ex:
 | 
			
		||||
    #    basicReturn['status'] = False
 | 
			
		||||
    #    basicReturn['overflow'] = False
 | 
			
		||||
    #    basicReturn['data'] = []
 | 
			
		||||
 | 
			
		||||
    return basicReturn
 | 
			
		||||
 | 
			
		||||
# =========== index
 | 
			
		||||
# =========== basic pages
 | 
			
		||||
 | 
			
		||||
@app.route('/index', methods=['GET'])
 | 
			
		||||
def indexHandle():
 | 
			
		||||
    cur = get_db().cursor()
 | 
			
		||||
    cur.execute("SELECT [graph], [graph_name], [belong_to] FROM graph WHERE [index] != -1 ORDER BY [belong_to], [index] ASC;")
 | 
			
		||||
    data = {}
 | 
			
		||||
    for i in cur.fetchall():
 | 
			
		||||
        if i[2] not in data.keys():
 | 
			
		||||
            data[i[2]] = [ss.ScriptItem(i[1], i[0])]
 | 
			
		||||
        else:
 | 
			
		||||
            data[i[2]].append(ss.ScriptItem(i[1], i[0]))
 | 
			
		||||
def handle_index():
 | 
			
		||||
    return app.send_static_file("html/index.html")
 | 
			
		||||
 | 
			
		||||
    return render_template('index.html', scripts = data)
 | 
			
		||||
@app.route('/script', methods=['GET'])
 | 
			
		||||
def handle_script():
 | 
			
		||||
    return redirect(url_for('handle_index'))
 | 
			
		||||
 | 
			
		||||
@app.route('/array', methods=['GET'])
 | 
			
		||||
def handle_array():
 | 
			
		||||
    return redirect(url_for('handle_index'))
 | 
			
		||||
    
 | 
			
		||||
@app.route('/environment', methods=['GET'])
 | 
			
		||||
def handle_environment():
 | 
			
		||||
    return redirect(url_for('handle_index'))
 | 
			
		||||
 | 
			
		||||
@app.route('/help', methods=['GET'])
 | 
			
		||||
def handle_help():
 | 
			
		||||
    return app.send_static_file("html/help.html")
 | 
			
		||||
 | 
			
		||||
@app.route('/about', methods=['GET'])
 | 
			
		||||
def handle_about():
 | 
			
		||||
    return app.send_static_file("html/about.html")
 | 
			
		||||
 | 
			
		||||
# =========== viewer
 | 
			
		||||
# script and array should have at least 2 items splitted by slash(/)
 | 
			
		||||
# the first one is document id and the second one is the real CK_ID of viewing object.
 | 
			
		||||
# however, environment do not have this, environment only allow one item, the id of environment.
 | 
			
		||||
 | 
			
		||||
@app.route('/script/<path:script_path>', methods=['GET'])
 | 
			
		||||
def handle_script_viewer(script_path):
 | 
			
		||||
    # check invalid url
 | 
			
		||||
    if len(script_path.split('/')) < 2:
 | 
			
		||||
        return redirect(url_for('handle_index'))
 | 
			
		||||
    return app.send_static_file("html/viewer_script.html")
 | 
			
		||||
 | 
			
		||||
@app.route('/array/<path:array_path>', methods=['GET'])
 | 
			
		||||
def handle_array_viewer(array_path):
 | 
			
		||||
    # check invalid url
 | 
			
		||||
    if len(script_path.split('/')) < 2:
 | 
			
		||||
        return redirect(url_for('handle_index'))
 | 
			
		||||
    return app.send_static_file("html/viewer_array.html")
 | 
			
		||||
 | 
			
		||||
@app.route('/environment/<path:environment_path>', methods=['GET'])
 | 
			
		||||
def handle_environment_viewer(environment_path):
 | 
			
		||||
    # check invalid url
 | 
			
		||||
    if len(script_path.split('/')) > 1:
 | 
			
		||||
        return redirect(url_for('handle_index'))
 | 
			
		||||
    return app.send_static_file("html/viewer_environment.html")
 | 
			
		||||
 | 
			
		||||
# =========== viewer
 | 
			
		||||
 | 
			
		||||
@app.route('/viewer/<path:scriptPath>', methods=['GET'])
 | 
			
		||||
def viewerHandle(scriptPath):
 | 
			
		||||
 | 
			
		||||
    # comput hamburger
 | 
			
		||||
    pathSlice = scriptPath.split('/')
 | 
			
		||||
    cur = get_db().cursor()
 | 
			
		||||
    cur.execute("SELECT [graph], [graph_name] FROM graph WHERE [graph] IN ({});".format(','.join(pathSlice)))
 | 
			
		||||
    hamburgerMap = {}
 | 
			
		||||
    hamburger = []
 | 
			
		||||
    for i in cur.fetchall():
 | 
			
		||||
        hamburgerMap[str(i[0])] = i[1]
 | 
			
		||||
    currentHamburger = hamburgerMap[pathSlice[-1]]
 | 
			
		||||
    
 | 
			
		||||
    for i in range(len(pathSlice) - 1):
 | 
			
		||||
        hamburger.append(ss.HamburgerItem(hamburgerMap[pathSlice[i]], reduce(lambda x,y: x + '/' + y, pathSlice[0:i + 1], '')))
 | 
			
		||||
 | 
			
		||||
    # gei w/h
 | 
			
		||||
    cur.execute('SELECT [width], [height] FROM graph WHERE [graph] == ?', (pathSlice[-1], ))
 | 
			
		||||
    cache = cur.fetchone()
 | 
			
		||||
    width = cache[0]
 | 
			
		||||
    height = cache[1]
 | 
			
		||||
 | 
			
		||||
    # get blocks
 | 
			
		||||
    cur.execute('SELECT * FROM block WHERE [belong_to_graph] == ?', (pathSlice[-1], ))
 | 
			
		||||
    dbBlocks = cur.fetchall()
 | 
			
		||||
 | 
			
		||||
    # get cells
 | 
			
		||||
    cur.execute("SELECT * FROM cell WHERE [belong_to_graph] == ?", (pathSlice[-1], ))
 | 
			
		||||
    dbCells = cur.fetchall()
 | 
			
		||||
 | 
			
		||||
    # get links
 | 
			
		||||
    cur.execute("SELECT * FROM link WHERE [belong_to_graph] == ?", (pathSlice[-1], ))
 | 
			
		||||
    dbLinks = cur.fetchall()
 | 
			
		||||
 | 
			
		||||
    # render
 | 
			
		||||
    return render_template('viewer.html',
 | 
			
		||||
                    currentPath = scriptPath,
 | 
			
		||||
                    gWidth = width,
 | 
			
		||||
                    gHeight = height,
 | 
			
		||||
                    hamburgerHistory = hamburger,
 | 
			
		||||
                    viewer_css = url_for('static', filename='viewer.css'),
 | 
			
		||||
                    tabcontrol_css = url_for('static', filename='tabcontrol.css'),
 | 
			
		||||
                    viewer_js = url_for('static', filename='viewer.js'),
 | 
			
		||||
                    tabcontrol_js = url_for('static', filename='tabcontrol.js'),
 | 
			
		||||
                    hamburgerCurrent = currentHamburger,
 | 
			
		||||
                    blocks = dbBlocks,
 | 
			
		||||
                    cells = dbCells,
 | 
			
		||||
                    links = dbLinks)
 | 
			
		||||
 | 
			
		||||
@app.route('/viewer/<path:scriptPath>', methods=['POST'])
 | 
			
		||||
def actionHandle(scriptPath):
 | 
			
		||||
    cache = request.form['operation']
 | 
			
		||||
    if cache == "info":
 | 
			
		||||
        return infoHandle(request.form['target'], request.form['tag'])
 | 
			
		||||
    elif cache == "move":
 | 
			
		||||
        return moveHandle(request.form['target'])
 | 
			
		||||
    else:
 | 
			
		||||
        abort(400)
 | 
			
		||||
 | 
			
		||||
def infoHandle(target, tag):
 | 
			
		||||
    cur = get_db().cursor()
 | 
			
		||||
 | 
			
		||||
    data = {}
 | 
			
		||||
    existedSet = set()
 | 
			
		||||
    if tag == '0':
 | 
			
		||||
        # call from cell
 | 
			
		||||
        cur.execute("SELECT * FROM info WHERE [target] == ?", (target, ))
 | 
			
		||||
    elif tag == '1':
 | 
			
		||||
        # call from bb
 | 
			
		||||
        cur.execute("SELECT * FROM info WHERE [attach_bb] == ?", (target, ))
 | 
			
		||||
    else:
 | 
			
		||||
        return {}
 | 
			
		||||
    # get data
 | 
			
		||||
    for i in cur.fetchall():
 | 
			
		||||
        if i[0] in existedSet:
 | 
			
		||||
            data[i[0]]['data'].append((i[4], i[5]))
 | 
			
		||||
        else:
 | 
			
		||||
            existedSet.add(i[0])
 | 
			
		||||
            data[i[0]] = {
 | 
			
		||||
                'name': i[3],
 | 
			
		||||
                'is_setting': True if i[2] != 0 else False,
 | 
			
		||||
                'data': [(i[4], i[5])]
 | 
			
		||||
@app.route('/api/index/getList', methods=['POST'])
 | 
			
		||||
def handle_api_index_getList(scriptPath):
 | 
			
		||||
    return {
 | 
			
		||||
        "document": [],
 | 
			
		||||
        "script": [],
 | 
			
		||||
        "array": [],
 | 
			
		||||
        "environment": []
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return data
 | 
			
		||||
 | 
			
		||||
def moveHandle(target):
 | 
			
		||||
    return {}
 | 
			
		||||
 | 
			
		||||
# =========== startup     
 | 
			
		||||
def run():
 | 
			
		||||
    app.run()
 | 
			
		||||
    
 | 
			
		||||
@ -1,82 +0,0 @@
 | 
			
		||||
class ScriptItem(object):
 | 
			
		||||
    def __init__(self, name, id):
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.id = id
 | 
			
		||||
 | 
			
		||||
class HamburgerItem(object):
 | 
			
		||||
    def __init__(self, name, path):
 | 
			
		||||
        self.name = name
 | 
			
		||||
        self.path = path
 | 
			
		||||
 | 
			
		||||
envDatabaseList = (
 | 
			
		||||
    {"name": "Attribute",
 | 
			
		||||
     "queryKey": "attr",
 | 
			
		||||
     "data": (("index", "0", "(Integer) Attribute index"),
 | 
			
		||||
              ("name", "Floor", "(String) Attribute name"),
 | 
			
		||||
              ("category_index", "0", "(Integer) The category index of this attribute"),
 | 
			
		||||
              ("category_name", "3DXML", "(String) The category name of this attribute"),
 | 
			
		||||
              ("flags", "44", "(Integer) Attribute flags"),
 | 
			
		||||
              ("param_index", "85", "(Integer) Corresponding parameter index"),
 | 
			
		||||
              ("compatible_classid", "41", "(Integer) Compatible class id"),
 | 
			
		||||
              ("default_id", "1;NULL", "(String) Default value"))},
 | 
			
		||||
    {"name": "Message",
 | 
			
		||||
     "queryKey": "msg",
 | 
			
		||||
     "data": (("index", "0", "(Integer) Message index"),
 | 
			
		||||
              ("name", "OnClick", "(String) Message name"))},
 | 
			
		||||
    {"name": "Operation",
 | 
			
		||||
     "queryKey": "op",
 | 
			
		||||
     "data": (("funcptr", "615841344", "(Integer) Operation function memory location"),
 | 
			
		||||
              ("in1_guid", "1910468930,-1003023558", "(String) Input parameter 1 guid"),
 | 
			
		||||
              ("in2_guid", "-1411304621,-1568456412", "(String) Input parameter 2 guid"),
 | 
			
		||||
              ("out_guid", "450177678,1584666912", "(String) Output parameter guid"),
 | 
			
		||||
              ("op_guid", "869034825,898181163", "(String) Operation guid"),
 | 
			
		||||
              ("op_name", "Addition", "(String) Operation name"),
 | 
			
		||||
              ("op_code", "51", "(Integer) Operation code"))},
 | 
			
		||||
    {"name": "Parameter",
 | 
			
		||||
     "queryKey": "param",
 | 
			
		||||
     "data": (("index", "0", "(Integer) Parameter index"),
 | 
			
		||||
              ("guid", "481363808,1100959941", "(String) Parameter guid"),
 | 
			
		||||
              ("derived_from", "0,0", "(String) The parameter guid deriving this parameter"),
 | 
			
		||||
              ("type_name", "None", "(String) Parameter name"),
 | 
			
		||||
              ("default_size", "4", "(Integer) Default size"),
 | 
			
		||||
              ("func_CreateDefault", "604002966", "(Integer) CreateDefault function memory location"),
 | 
			
		||||
              ("func_Delete", "604003366", "(Integer) Delete function memory location"),
 | 
			
		||||
              ("func_SaveLoad", "603996047", "(Integer) SaveLoad function memory location"),
 | 
			
		||||
              ("func_Check", "0", "(Integer) Check function memory location"),
 | 
			
		||||
              ("func_Copy", "604002468", "(Integer) Copy function memory location"),
 | 
			
		||||
              ("func_String", "0", "(Integer) String function memory location"),
 | 
			
		||||
              ("func_UICreator", "619055248", "(Integer) UICreator function memory location"),
 | 
			
		||||
              ("creator_dll_index", "-1", "(Integer) The id of the dll defining this parameter"),
 | 
			
		||||
              ("creator_plugin_index", "-1", "(Integer) The id of the plugin defining this parameter"),
 | 
			
		||||
              ("dw_param", "0", "(Integer) An application reserved DWORD for placing parameter type specific data"),
 | 
			
		||||
              ("dw_flags", "133", "(Integer) Flags specifying special settings for this parameter type"),
 | 
			
		||||
              ("cid", "0", "(Integer) Special case for parameter types that refer to CKObjects => corresponding class ID of the object"),
 | 
			
		||||
              ("saver_manager", "1181355948,0", "(String) Int Manager guid"))},
 | 
			
		||||
    {"name": "Plugin",
 | 
			
		||||
     "queryKey": "plugin",
 | 
			
		||||
     "data": (("dll_index", "18", "(Integer) Dll index"),
 | 
			
		||||
              ("dll_name", "E:\\Virtools\\Plugins\\ImageReader.dll", "(String) Dll name"),
 | 
			
		||||
              ("plugin_index", "2", "(Integer) Plugin index"),
 | 
			
		||||
              ("category", "Bitmap Readers", "(String) Plugin category"),
 | 
			
		||||
              ("active", "1", "(Integer) For manager and Render engines TRUE if a manager was created, for other plugins this value is not used"),
 | 
			
		||||
              ("needed_by_file", "0", "(Integer) When saving a file TRUE if at least one object needs this plugin"),
 | 
			
		||||
              ("guid", "1632248895,1132147523", "(String) Plugin guid"),
 | 
			
		||||
              ("desc", "Windows Bitmap", "(String) Plugin description"),
 | 
			
		||||
              ("author", "Virtools", "(String) Plugin author"),
 | 
			
		||||
              ("summary", "Windows Bitmap", "(String) Plugin summary"),
 | 
			
		||||
              ("version", "1", "(Integer) Plugin version"),
 | 
			
		||||
              ("func_init", "103354496", "(Integer) Init function memory location"),
 | 
			
		||||
              ("func_exit", "624432336", "(Integer) Exit function memory location"))},
 | 
			
		||||
    {"name": "Variable",
 | 
			
		||||
     "queryKey": "variable",
 | 
			
		||||
     "data": (("name", "3D XML/ExportVersion", "(String) Variable name"),
 | 
			
		||||
              ("description", "Version of exported 3DXML", "(String) Variable description"),
 | 
			
		||||
              ("flags", "4", "(Integer) Variable flags"),
 | 
			
		||||
              ("type", "1", "(Integer) Variable type"),
 | 
			
		||||
              ("representation", "enum:0= 3DXML 3.0; 1= 3DXML 4.0", "(String) The representation (ie the input format) of a variable type"),
 | 
			
		||||
              ("data", " 3DXML 3.0", "(String) Variable data"))}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
legalEnvQueryKey = list(map(lambda x: x['queryKey'], envDatabaseList))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								SuperScriptViewer/static/css/global.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,16 @@
 | 
			
		||||
body {
 | 
			
		||||
    background: silver;
 | 
			
		||||
    font-size: 1rem;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.simple-menu {
 | 
			
		||||
    display: flex; 
 | 
			
		||||
    flex-flow: row;
 | 
			
		||||
}
 | 
			
		||||
div.simple-menu > p {
 | 
			
		||||
    margin: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1 {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										39
									
								
								SuperScriptViewer/static/html/about.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,39 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>About - SuperScriptMaterializer</title>
 | 
			
		||||
    <link rel="shortcut icon" type="image/jpg" href="/static/imgs/icon.jpg" />
 | 
			
		||||
 | 
			
		||||
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/static/js/global.js"/></script>
 | 
			
		||||
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xp.css@0.3.0/dist/98.css">
 | 
			
		||||
    <link rel="stylesheet" href="/static/css/global.css">
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
<h1><img src="/static/imgs/icon.jpg" width="64" height="64" style="margin: 0 10px 0 10px;"/>Super Script Materializer</h1>
 | 
			
		||||
<p>There are no secret script behind Virtools. Super Script Materializer will destroy all locks and show you the real code.<br />
 | 
			
		||||
But Super Script Materializer only show you code. It couldn't analyse the result and touch author's heart and intention. This is your work.<br />
 | 
			
		||||
So, let we crack all scripts and destroy close-source illusion.</p>
 | 
			
		||||
 | 
			
		||||
<p><a href="https://github.com/yyc12345/SuperScriptMaterializer">SuperScriptMaterializer</a>. All codes are under GPLv3.<br />
 | 
			
		||||
Web frontend is powered by <a href="https://gulpjs.com/">gulp</a>, <a href="https://jquery.com/">jQuery</a>, <a href="https://www.jsviews.com/">JsRender/JsViews</a> and <a href="https://botoxparty.github.io/XP.css/">98.css</a>.<br />
 | 
			
		||||
Web backend is powered by <a href="https://github.com/pallets/flask">Flask</a>.<br />
 | 
			
		||||
Ancestor projects: <a href="https://github.com/BearKidsTeam/VirtoolsScriptDeobfuscation">BearKidsTeam/VirtoolsScriptDeobfuscation</a> and <a href="https://github.com/BearKidsTeam/Script-Materializer">BearKidsTeam/Script-Materializer</a>.<br />
 | 
			
		||||
Thank <a href="https://github.com/chirs241097">chirs241097</a> and <a href="https://github.com/instr3">2jjy</a>.<br />
 | 
			
		||||
Icon is created by <a href="https://github.com/ShadowPower">ShadowPower</a> via diffusion.</p>
 | 
			
		||||
 | 
			
		||||
<p>Super Script Materializer version: 2.0</p>
 | 
			
		||||
 | 
			
		||||
<div class="simple-menu">
 | 
			
		||||
    <p><a href="/index">Hierarchy</a></p>
 | 
			
		||||
    <p>|</p>
 | 
			
		||||
    <p><a href="/help">Help</a></p>
 | 
			
		||||
    <p>|</p>
 | 
			
		||||
    <p><a href="/about">About</a></p>
 | 
			
		||||
</div>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										173
									
								
								SuperScriptViewer/static/html/help.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,173 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>Help - SuperScriptMaterializer</title>
 | 
			
		||||
    <link rel="shortcut icon" type="image/jpg" href="/static/imgs/icon.jpg" />
 | 
			
		||||
    
 | 
			
		||||
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/static/js/global.js"/></script>
 | 
			
		||||
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xp.css@0.3.0/dist/98.css">
 | 
			
		||||
    <link rel="stylesheet" href="/static/css/global.css">
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
<h1>Help Center</h1>
 | 
			
		||||
<div class="simple-menu">
 | 
			
		||||
    <p><a href="/index">Hierarchy</a></p>
 | 
			
		||||
    <p>|</p>
 | 
			
		||||
    <p><a href="/help">Help</a></p>
 | 
			
		||||
    <p>|</p>
 | 
			
		||||
    <p><a href="/about">About</a></p>
 | 
			
		||||
</div>
 | 
			
		||||
<p>This page is help center, providing useful link for some detailed help page. Choose what you want to use and enter corresponding tabs.</p>
 | 
			
		||||
 | 
			
		||||
<section class="tabs">
 | 
			
		||||
    <menu role="tablist" aria-label="help-tab">
 | 
			
		||||
        <button role="tab" aria-selected="true" aria-controls="tab-legend">Legend</button>
 | 
			
		||||
        <button role="tab" aria-controls="tab-misc1">Misc Help</button>
 | 
			
		||||
        <button role="tab" aria-controls="tab-misc2">Misc Help2</button>
 | 
			
		||||
    </menu>
 | 
			
		||||
    <!-- the tab content -->
 | 
			
		||||
    <article role="tabpanel" id="tab-legend">
 | 
			
		||||
 | 
			
		||||
        <h2>Layout</h2>
 | 
			
		||||
        <p>In viewer page, it can be divided into 3 panels:</p>
 | 
			
		||||
        <table border="1">
 | 
			
		||||
        <tr style="height: 50px;">
 | 
			
		||||
            <td style="width: 200px;">Navigation panel</td>
 | 
			
		||||
            <td style="width: 100px;" rowspan="2">Information & tools panel</td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr style="height: 50px;">
 | 
			
		||||
            <td>Graph panel</td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        </table>
 | 
			
		||||
        <ul>
 | 
			
		||||
            <li><b>Navigation panel</b>: Display current script's hierarchy. And you can click all layers which located in this panel to jump into it.</li>
 | 
			
		||||
            <li><b>Information & tools panel</b>: Provide property data, display configuration and some useful tools.</li>
 | 
			
		||||
            <li><b>Graph panel</b>: Core panel. Display current browsing behavior graph's data. Some legend will be desscribe in the follwing sector.</li>
 | 
			
		||||
        </ul>
 | 
			
		||||
        
 | 
			
		||||
        <h2>Graph legend</h2>
 | 
			
		||||
        <h3>Block</h3>
 | 
			
		||||
        <div style="background: #7f7f7f; padding: 20px;">
 | 
			
		||||
        <div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
            <div style="height: 5px; width: 15px;background: #8f8f8f;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
            <div style="margin-left: 10px;">pLocal (including arrtibute) (ParameterLocal abbr.)</div>
 | 
			
		||||
            </div>
 | 
			
		||||
        <div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
            <div style="height: 5px; width: 15px;background: purple;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
            <div style="margin-left: 10px;">Shortcut (Only shortcut output)</div>
 | 
			
		||||
        </div>    
 | 
			
		||||
        <div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
            <div style="height: 6px; width: 6px;background: yellow;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
            <div style="margin-left: 10px;">bIn / bOut (BehaviorIn / BehaviorOut abbr.)</div>
 | 
			
		||||
        </div>    
 | 
			
		||||
        <div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
            <div style="height: 6px; width: 6px;background: blue;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
            <div style="margin-left: 10px;">pIn / pOut (ParameterIn / ParameterOut abbr.)</div>
 | 
			
		||||
        </div>   
 | 
			
		||||
        <div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
            <div style="height: 6px; width: 6px;background: green;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
            <div style="margin-left: 10px;">pTarget (ParameterTarget abbr.)</div>
 | 
			
		||||
        </div>   
 | 
			
		||||
        </div>
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
        <h3>Building block</h3>
 | 
			
		||||
        
 | 
			
		||||
        <p>Building block (abbr. BB)</p>
 | 
			
		||||
        <p>All building block can be devided into 2 types: prototype building block and behavior graph</p>
 | 
			
		||||
        
 | 
			
		||||
        <div style="background: #7f7f7f; padding: 20px; width: 500px;">
 | 
			
		||||
            <div style="height: 72.0px; width: 104.0px;background: #8f8f8f;border: 1px solid #cfcfcf;position: relative; top: 0; left: 0;">
 | 
			
		||||
                                
 | 
			
		||||
                <div class="block-target" style="height: 6px; width: 6px; top: 0; left: 0;position: absolute;background: green;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 0; left: 20px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 0; left: 46px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; bottom: 0; left: 20px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 10px; left: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 10px; right: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 36px; right: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
                
 | 
			
		||||
                <p style="top: 10px; left: 20px;position: absolute;margin: 0;padding: 0;font-size: 12px;color: black;">Get Cell</p>
 | 
			
		||||
                <p style="top: 24px; left: 20px;position: absolute; margin: 0;padding: 0;font-size: 9px;color: white;">Get Cell</p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <p>This is a typical prototype building block. Some port are attached into this building block.<br />
 | 
			
		||||
        pIn and pTarget are at the top, pOut are at the bottom, bIn are on the left, and bOut are on the right.<br />
 | 
			
		||||
        In the middle of building block, the name of this building block is written in black font, and the name of this building block's prototype is written in white font.</p>
 | 
			
		||||
        
 | 
			
		||||
        <div style="background: #7f7f7f; padding: 20px; width: 500px;">
 | 
			
		||||
            <div class="block-body" style="height: 72.0px; width: 196.0px;background: #8f8f8f;border: 1px solid #cfcfcf;position: relative; top: 0; left: 0;">
 | 
			
		||||
                
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 0; left: 20px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 0; left: 46px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 0; left: 72px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 0; left: 98px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 0; left: 124px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 0; left: 150px;position: absolute;background: blue;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 10px; left: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 10px; right: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
                <div style="height: 6px; width: 6px; top: 36px; right: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
                
 | 
			
		||||
                <p style="top: 10px; left: 20px;position: absolute;margin: 0;padding: 0;font-size: 12px;color: black;"><a href="/help/legend">vt2obj</a></p>
 | 
			
		||||
                <p style="top: 24px; left: 20px;position: absolute; margin: 0;padding: 0;font-size: 9px;color: white;"></p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <p>This is a typical behavior graph. It is very similar to prototype building block.<br />
 | 
			
		||||
        It don't have the name of prototype. Instead, you can click on the name to see what is inside this graph(jump into this graph).</p>
 | 
			
		||||
        
 | 
			
		||||
        <h3>Link</h3>
 | 
			
		||||
        
 | 
			
		||||
        <svg version="1.1" width="500px" height="350px" style="position: relative; top: 0; left: 0;background: #7f7f7f; padding: 20px;">
 | 
			
		||||
            <line x1="0" y1="20" x2="100" y2="20" stroke="black" stroke-width="1px"></line>
 | 
			
		||||
            <text x="50" y="20" fill="black" style="font-size: 12px; color: black;">0</text>
 | 
			
		||||
            <text x="120" y="20" fill="black">bLink (BehaviorLink)</text>
 | 
			
		||||
            <line x1="0" y1="70" x2="100" y2="70" stroke="blue" stroke-width="1px" stroke-dasharray="5, 1"></line>
 | 
			
		||||
            <text x="120" y="70" fill="black">pLink (ParameterLink)</text>
 | 
			
		||||
            <line x1="0" y1="120" x2="100" y2="120" stroke="cyan" stroke-width="1px" stroke-dasharray="5, 1"></line>
 | 
			
		||||
            <text x="120" y="120" fill="black">eLink (ExportParameterLink)</text>
 | 
			
		||||
        
 | 
			
		||||
            <line x1="0" y1="170" x2="100" y2="170" stroke="yellow" stroke-width="1px"></line>
 | 
			
		||||
            <text x="50" y="170" fill="yellow" style="font-size: 12px;">0</text>
 | 
			
		||||
            <text x="120" y="170" fill="black">Highlight bLink</text>
 | 
			
		||||
            <line x1="0" y1="220" x2="100" y2="220" stroke="orange" stroke-width="1px" stroke-dasharray="5, 1"></line>
 | 
			
		||||
            <text x="120" y="220" fill="black">Highlight pLink</text>
 | 
			
		||||
            <line x1="0" y1="270" x2="100" y2="270" stroke="orangered" stroke-width="1px" stroke-dasharray="5, 1"></line>
 | 
			
		||||
            <text x="120" y="270" fill="black">Highlight eLink</text>
 | 
			
		||||
        </svg>
 | 
			
		||||
        
 | 
			
		||||
        <h3>Operation</h3>
 | 
			
		||||
        <ul>
 | 
			
		||||
            <li>You can highlight the associated links by clicking Block or BB, and click again to cancel the highlight.</li>
 | 
			
		||||
            <li>You can double-click Block or prototoye BB to get the properties associated with it.</li>
 | 
			
		||||
            <li>You can hover over the Block to view its name and type through tooltip.</li>
 | 
			
		||||
        </ul>
 | 
			
		||||
        
 | 
			
		||||
        <h2>Properties</h2>
 | 
			
		||||
        <p>Properties can be visited in Information & tools panel. It can display the information of the object currently being double-clicked.</p>
 | 
			
		||||
        
 | 
			
		||||
        <div style="margin: 5px;border: 1px solid gray;border-radius: 2px;padding: 5px; width: 400px;">
 | 
			
		||||
            <p><code style="border: 1px solid black; border-radius: 2px;padding: 5px;margin: 5px;background: gray;color: white;">S</code><b>Rectangle/Box Mode</b><i>(176)</i></p>
 | 
			
		||||
            <p>dump.data</p>
 | 
			
		||||
            <pre style="border: 1px solid black;border-radius: 2px;padding: 5px;background: #3f3f3f;color: white;white-space: pre-wrap;word-wrap: break-word;">0x01, 0x00, 0x00, 0x00</pre>
 | 
			
		||||
            <p>dump.length</p>
 | 
			
		||||
            <pre style="border: 1px solid black;border-radius: 2px;padding: 5px;background: #3f3f3f;color: white;white-space: pre-wrap;word-wrap: break-word;">4</pre>
 | 
			
		||||
        </div>
 | 
			
		||||
        <p>This is a typical property unit. You may see more than 1 property unit in property list. A property unit may contain more than 1 key-value pair to describe it.<br />
 | 
			
		||||
        In the first line, the name of the current property unit (actually a pLocal) will be displayed. The number in brackets is CK_ID. If an S is displayed in front of it (as shown in the figure above), then it is also a setting.</p>
 | 
			
		||||
        
 | 
			
		||||
    </article>
 | 
			
		||||
    <article role="tabpanel" hidden id="tab-misc1">
 | 
			
		||||
        <p>No Content</p>
 | 
			
		||||
    </article>
 | 
			
		||||
    <article role="tabpanel" hidden id="tab-misc2">
 | 
			
		||||
        <p>No Content</p>
 | 
			
		||||
    </article>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										32
									
								
								SuperScriptViewer/static/html/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,32 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>Hierarchy - SuperScriptMaterializer</title>
 | 
			
		||||
    <link rel="shortcut icon" type="image/jpg" href="/static/imgs/icon.jpg" />
 | 
			
		||||
 | 
			
		||||
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.js"></script>
 | 
			
		||||
    <script type="text/javascript" src="/static/js/global.js"/></script>
 | 
			
		||||
    <script type="text/javascript" src="/static/js/index.js"/></script>
 | 
			
		||||
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xp.css@0.3.0/dist/98.css">
 | 
			
		||||
    <link rel="stylesheet" href="/static/css/global.css">
 | 
			
		||||
    <link rel="stylesheet" href="/static/css/index.css">
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
<h1>Hierarchy</h1>
 | 
			
		||||
<p>Choose a script to read it.</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>Generated by SuperScriptMaterializer</p>
 | 
			
		||||
<div class="simple-menu">
 | 
			
		||||
    <p><a href="/index">Hierarchy</a></p>
 | 
			
		||||
    <p>|</p>
 | 
			
		||||
    <p><a href="/help">Help</a></p>
 | 
			
		||||
    <p>|</p>
 | 
			
		||||
    <p><a href="/about">About</a></p>
 | 
			
		||||
</div>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1.7 KiB  | 
							
								
								
									
										3
									
								
								SuperScriptViewer/static/imgs/document.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,3 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
 | 
			
		||||
   <path fill="#000000" d="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" />
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 184 B  | 
							
								
								
									
										3
									
								
								SuperScriptViewer/static/imgs/environment.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,3 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
 | 
			
		||||
   <path fill="#000000" d="M18 2H12V9L9.5 7.5L7 9V2H6C4.9 2 4 2.9 4 4V20C4 21.1 4.9 22 6 22H18C19.1 22 20 21.1 20 20V4C20 2.89 19.1 2 18 2M17.68 18.41C17.57 18.5 16.47 19.25 16.05 19.5C15.63 19.79 14 20.72 14.26 18.92C14.89 15.28 16.11 13.12 14.65 14.06C14.27 14.29 14.05 14.43 13.91 14.5C13.78 14.61 13.79 14.6 13.68 14.41S13.53 14.23 13.67 14.13C13.67 14.13 15.9 12.34 16.72 12.28C17.5 12.21 17.31 13.17 17.24 13.61C16.78 15.46 15.94 18.15 16.07 18.54C16.18 18.93 17 18.31 17.44 18C17.44 18 17.5 17.93 17.61 18.05C17.72 18.22 17.83 18.3 17.68 18.41M16.97 11.06C16.4 11.06 15.94 10.6 15.94 10.03C15.94 9.46 16.4 9 16.97 9C17.54 9 18 9.46 18 10.03C18 10.6 17.54 11.06 16.97 11.06Z" />
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 752 B  | 
							
								
								
									
										3
									
								
								SuperScriptViewer/static/imgs/folder.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,3 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
 | 
			
		||||
   <path fill="#000000" d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" />
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 192 B  | 
							
								
								
									
										
											BIN
										
									
								
								SuperScriptViewer/static/imgs/icon.jpg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										3
									
								
								SuperScriptViewer/static/imgs/script.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,3 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
 | 
			
		||||
   <path fill="#000000" d="M17.8,20C17.4,21.2 16.3,22 15,22H5C3.3,22 2,20.7 2,19V18H5L14.2,18C14.6,19.2 15.7,20 17,20H17.8M19,2H8C6.3,2 5,3.3 5,5V16H16V17C16,17.6 16.4,18 17,18H18V5C18,4.4 18.4,4 19,4C19.6,4 20,4.4 20,5V6H22V5C22,3.3 20.7,2 19,2Z" />
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 318 B  | 
							
								
								
									
										3
									
								
								SuperScriptViewer/static/imgs/table.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,3 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
 | 
			
		||||
   <path fill="#000000" d="M5,4H19A2,2 0 0,1 21,6V18A2,2 0 0,1 19,20H5A2,2 0 0,1 3,18V6A2,2 0 0,1 5,4M5,8V12H11V8H5M13,8V12H19V8H13M5,14V18H11V14H5M13,14V18H19V14H13Z" />
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 238 B  | 
							
								
								
									
										12
									
								
								SuperScriptViewer/static/js/global.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,12 @@
 | 
			
		||||
// tab switcher
 | 
			
		||||
$(document).ready(function() {
 | 
			
		||||
    // References
 | 
			
		||||
    // https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Tab_Role
 | 
			
		||||
    $('[role="tab"]').click(function() {
 | 
			
		||||
        $('[aria-selected="true"]').attr('aria-selected', false);
 | 
			
		||||
        $(this).attr('aria-selected', true);
 | 
			
		||||
        $('[role="tabpanel"]').attr('hidden', true);
 | 
			
		||||
        $(`#${$(this).attr('aria-controls')}`).removeAttr('hidden');
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								SuperScriptViewer/static/templates/help/legend.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,18 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>Help - Viewer legend</title>、
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
<h1>Viewer legend</h1>
 | 
			
		||||
<p>This page introduce how to use viewer page.</p>
 | 
			
		||||
<br />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										8
									
								
								SuperScriptViewer/static/templates/index_entry.tmpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,8 @@
 | 
			
		||||
{% for key, value in scripts.items() %}
 | 
			
		||||
<h2>{{ key|e }}</h2>
 | 
			
		||||
<ol>
 | 
			
		||||
    {% for i in value %}
 | 
			
		||||
    <li><a href="{{ "/viewer/%s"|format(i.id) }}">{{ i.name }}</a></li>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
</ol>
 | 
			
		||||
{% endfor %}
 | 
			
		||||
@ -1,147 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>Help - Viewer legend</title>、
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
<h1>Viewer legend</h1>
 | 
			
		||||
<p>This page introduce how to use viewer page.</p>
 | 
			
		||||
<br />
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h2>Layout</h2>
 | 
			
		||||
<p>In viewer page, it can be divided into 3 panels:</p>
 | 
			
		||||
<table border="1">
 | 
			
		||||
<tr style="height: 50px;">
 | 
			
		||||
    <td style="width: 200px;">Navigation panel</td>
 | 
			
		||||
    <td style="width: 100px;" rowspan="2">Information & tools panel</td>
 | 
			
		||||
</tr>
 | 
			
		||||
<tr style="height: 50px;">
 | 
			
		||||
    <td>Graph panel</td>
 | 
			
		||||
</tr>
 | 
			
		||||
</table>
 | 
			
		||||
<ul>
 | 
			
		||||
    <li><b>Navigation panel</b>: Display current script's hierarchy. And you can click all layers which located in this panel to jump into it.</li>
 | 
			
		||||
    <li><b>Information & tools panel</b>: Provide property data, display configuration and some useful tools.</li>
 | 
			
		||||
    <li><b>Graph panel</b>: Core panel. Display current browsing behavior graph's data. Some legend will be desscribe in the follwing sector.</li>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h2>Graph legend</h2>
 | 
			
		||||
<h3>Block</h3>
 | 
			
		||||
<div style="background: #7f7f7f; padding: 20px;">
 | 
			
		||||
<div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
    <div style="height: 5px; width: 15px;background: #8f8f8f;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
    <div style="margin-left: 10px;">pLocal (including arrtibute) (ParameterLocal abbr.)</div>
 | 
			
		||||
    </div>
 | 
			
		||||
<div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
    <div style="height: 5px; width: 15px;background: purple;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
    <div style="margin-left: 10px;">Shortcut (Only shortcut output)</div>
 | 
			
		||||
</div>    
 | 
			
		||||
<div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
    <div style="height: 6px; width: 6px;background: yellow;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
    <div style="margin-left: 10px;">bIn / bOut (BehaviorIn / BehaviorOut abbr.)</div>
 | 
			
		||||
</div>    
 | 
			
		||||
<div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
    <div style="height: 6px; width: 6px;background: blue;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
    <div style="margin-left: 10px;">pIn / pOut (ParameterIn / ParameterOut abbr.)</div>
 | 
			
		||||
</div>   
 | 
			
		||||
<div style="display: flex; flex-flow: row; align-items: center; margin-top: 10px; margin-bottom: 10px;">
 | 
			
		||||
    <div style="height: 6px; width: 6px;background: green;border: 1px solid #cfcfcf;"></div>
 | 
			
		||||
    <div style="margin-left: 10px;">pTarget (ParameterTarget abbr.)</div>
 | 
			
		||||
</div>   
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3>Building block</h3>
 | 
			
		||||
 | 
			
		||||
<p>Building block (abbr. BB)</p>
 | 
			
		||||
<p>All building block can be devided into 2 types: prototype building block and behavior graph</p>
 | 
			
		||||
 | 
			
		||||
<div style="background: #7f7f7f; padding: 20px; width: 500px;">
 | 
			
		||||
    <div style="height: 72.0px; width: 104.0px;background: #8f8f8f;border: 1px solid #cfcfcf;position: relative; top: 0; left: 0;">
 | 
			
		||||
                        
 | 
			
		||||
        <div class="block-target" style="height: 6px; width: 6px; top: 0; left: 0;position: absolute;background: green;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 0; left: 20px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 0; left: 46px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; bottom: 0; left: 20px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 10px; left: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 10px; right: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 36px; right: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
        
 | 
			
		||||
        <p style="top: 10px; left: 20px;position: absolute;margin: 0;padding: 0;font-size: 12px;color: black;">Get Cell</p>
 | 
			
		||||
        <p style="top: 24px; left: 20px;position: absolute; margin: 0;padding: 0;font-size: 9px;color: white;">Get Cell</p>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
<p>This is a typical prototype building block. Some port are attached into this building block.<br />
 | 
			
		||||
pIn and pTarget are at the top, pOut are at the bottom, bIn are on the left, and bOut are on the right.<br />
 | 
			
		||||
In the middle of building block, the name of this building block is written in black font, and the name of this building block's prototype is written in white font.</p>
 | 
			
		||||
 | 
			
		||||
<div style="background: #7f7f7f; padding: 20px; width: 500px;">
 | 
			
		||||
    <div class="block-body" style="height: 72.0px; width: 196.0px;background: #8f8f8f;border: 1px solid #cfcfcf;position: relative; top: 0; left: 0;">
 | 
			
		||||
        
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 0; left: 20px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 0; left: 46px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 0; left: 72px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 0; left: 98px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 0; left: 124px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 0; left: 150px;position: absolute;background: blue;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 10px; left: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 10px; right: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
        <div style="height: 6px; width: 6px; top: 36px; right: 0;position: absolute;background: yellow;"></div>
 | 
			
		||||
        
 | 
			
		||||
        <p style="top: 10px; left: 20px;position: absolute;margin: 0;padding: 0;font-size: 12px;color: black;"><a href="/help/legend">vt2obj</a></p>
 | 
			
		||||
        <p style="top: 24px; left: 20px;position: absolute; margin: 0;padding: 0;font-size: 9px;color: white;"></p>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
<p>This is a typical behavior graph. It is very similar to prototype building block.<br />
 | 
			
		||||
It don't have the name of prototype. Instead, you can click on the name to see what is inside this graph(jump into this graph).</p>
 | 
			
		||||
 | 
			
		||||
<h3>Link</h3>
 | 
			
		||||
 | 
			
		||||
<svg version="1.1" width="500px" height="350px" style="position: relative; top: 0; left: 0;background: #7f7f7f; padding: 20px;">
 | 
			
		||||
    <line x1="0" y1="20" x2="100" y2="20" stroke="black" stroke-width="1px"></line>
 | 
			
		||||
    <text x="50" y="20" fill="black" style="font-size: 12px; color: black;">0</text>
 | 
			
		||||
    <text x="120" y="20" fill="black">bLink (BehaviorLink)</text>
 | 
			
		||||
    <line x1="0" y1="70" x2="100" y2="70" stroke="blue" stroke-width="1px" stroke-dasharray="5, 1"></line>
 | 
			
		||||
    <text x="120" y="70" fill="black">pLink (ParameterLink)</text>
 | 
			
		||||
    <line x1="0" y1="120" x2="100" y2="120" stroke="cyan" stroke-width="1px" stroke-dasharray="5, 1"></line>
 | 
			
		||||
    <text x="120" y="120" fill="black">eLink (ExportParameterLink)</text>
 | 
			
		||||
 | 
			
		||||
    <line x1="0" y1="170" x2="100" y2="170" stroke="yellow" stroke-width="1px"></line>
 | 
			
		||||
    <text x="50" y="170" fill="yellow" style="font-size: 12px;">0</text>
 | 
			
		||||
    <text x="120" y="170" fill="black">Highlight bLink</text>
 | 
			
		||||
    <line x1="0" y1="220" x2="100" y2="220" stroke="orange" stroke-width="1px" stroke-dasharray="5, 1"></line>
 | 
			
		||||
    <text x="120" y="220" fill="black">Highlight pLink</text>
 | 
			
		||||
    <line x1="0" y1="270" x2="100" y2="270" stroke="orangered" stroke-width="1px" stroke-dasharray="5, 1"></line>
 | 
			
		||||
    <text x="120" y="270" fill="black">Highlight eLink</text>
 | 
			
		||||
</svg>
 | 
			
		||||
 | 
			
		||||
<h3>Operation</h3>
 | 
			
		||||
<ul>
 | 
			
		||||
    <li>You can highlight the associated links by clicking Block or BB, and click again to cancel the highlight.</li>
 | 
			
		||||
    <li>You can double-click Block or prototoye BB to get the properties associated with it.</li>
 | 
			
		||||
    <li>You can hover over the Block to view its name and type through tooltip.</li>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<h2>Properties</h2>
 | 
			
		||||
<p>Properties can be visited in Information & tools panel. It can display the information of the object currently being double-clicked.</p>
 | 
			
		||||
 | 
			
		||||
<div style="margin: 5px;border: 1px solid gray;border-radius: 2px;padding: 5px; width: 400px;">
 | 
			
		||||
    <p><code style="border: 1px solid black; border-radius: 2px;padding: 5px;margin: 5px;background: gray;color: white;">S</code><b>Rectangle/Box Mode</b><i>(176)</i></p>
 | 
			
		||||
    <p>dump.data</p>
 | 
			
		||||
    <pre style="border: 1px solid black;border-radius: 2px;padding: 5px;background: #3f3f3f;color: white;white-space: pre-wrap;word-wrap: break-word;">0x01, 0x00, 0x00, 0x00</pre>
 | 
			
		||||
    <p>dump.length</p>
 | 
			
		||||
    <pre style="border: 1px solid black;border-radius: 2px;padding: 5px;background: #3f3f3f;color: white;white-space: pre-wrap;word-wrap: break-word;">4</pre>
 | 
			
		||||
</div>
 | 
			
		||||
<p>This is a typical property unit. You may see more than 1 property unit in property list. A property unit may contain more than 1 key-value pair to describe it.<br />
 | 
			
		||||
In the first line, the name of the current property unit (actually a pLocal) will be displayed. The number in brackets is CK_ID. If an S is displayed in front of it (as shown in the figure above), then it is also a setting.</p>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
@ -1,32 +0,0 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <title>Script Hierarchy</title>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
<h1>Script Hierarchy</h1>
 | 
			
		||||
<p>Choose a script to read it.</p>
 | 
			
		||||
<br />
 | 
			
		||||
<br />
 | 
			
		||||
{% for key, value in scripts.items() %}
 | 
			
		||||
<h2>{{ key|e }}</h2>
 | 
			
		||||
<ol>
 | 
			
		||||
    {% for i in value %}
 | 
			
		||||
    <li><a href="{{ "/viewer/%s"|format(i.id) }}">{{ i.name }}</a></li>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
</ol>
 | 
			
		||||
{% endfor %}
 | 
			
		||||
<br />
 | 
			
		||||
<br />
 | 
			
		||||
<p>Generated by SuperScriptMaterializer</p>
 | 
			
		||||
<div style="display: flex; flex-flow: row; height: 50px;">
 | 
			
		||||
    <p style="margin: 5px;"><a href="/help">Help</a></p>
 | 
			
		||||
    <p style="margin: 5px;">|</p>
 | 
			
		||||
    <p style="margin: 5px;"><a href="/about">About</a></p>
 | 
			
		||||
</div>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||