|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- function TypeDictionnary(m_name)
- {
- this.m_name = m_name;
- this.m_cmds = new Array();
- this.m_vars = new Array();
- }
-
- //-----------------------------------------------------------------------------
- //Command Var object
- //-----------------------------------------------------------------------------
- function CmdVarObj() { }
- function CmdVar(m_type, m_syntax)
- {
- var current_mesh_dict = GetCmdDictionnary();
- new_obj = new CmdVarObj();
- new_obj.m_type = m_type;
- new_obj.m_syntax = m_syntax;
- new_obj.ToString = function()
- {
- var res = m_type + ' ';
- if (m_syntax != undefined)
- for (var i = 0; i < m_syntax.length; i++)
- res += m_syntax[i] + ' ';
- }
- current_mesh_dict.m_vars[current_mesh_dict.m_vars.length] = new_obj;
- }
-
- //-----------------------------------------------------------------------------
- //Command Argument object
- //-----------------------------------------------------------------------------
- function CmdArgObj() { }
- function CmdArg(m_type, m_name, m_optional)
- {
- new_obj = new CmdArgObj();
- new_obj.m_type = m_type;
- new_obj.m_name = m_name;
- new_obj.m_optional = m_optional;
- new_obj.ToString = function()
- {
- if (m_optional != undefined)
- return m_type + ' ' + m_name + ' = ' + m_optional;
- return m_type + ' ' + m_name;
- }
- return new_obj;
- }
-
- //-----------------------------------------------------------------------------
- //Command Typing object
- //-----------------------------------------------------------------------------
- function CmdTypeObj() { }
- function CmdType(m_name, m_comment, m_arg)
- {
- var current_mesh_dict = GetCmdDictionnary();
- new_obj = new CmdTypeObj();
- new_obj.m_name = m_name;
- new_obj.m_comment = m_comment;
- new_obj.m_arg = m_arg;
- new_obj.ToString = function()
- {
- var str = m_name.toString() + ' [' + m_comment + ']';
- if (m_arg != undefined)
- {
- str += '{';
- var found_optional = false;
- for (var vi = 0; vi < m_arg.length; vi++)
- {
- if (m_arg[vi].m_optional != undefined && found_optional == false)
- {
- str += ' [';
- found_optional = true;
- }
- if (vi != 0)
- str += ', ';
- str += m_arg[vi].ToString();
- }
- if (found_optional == true)
- str += ']';
- str += '}';
- }
- return str;
- }
- new_obj.CheckCommand = function(check_name)
- {
- if (m_name != undefined && check_name.length > 0)
- {
- for (var i = 0; i < m_name.length; i++)
- {
- if (m_name[i] != undefined)
- {
- var pattern = new RegExp("^[ ]*" + check_name + "[a-z]*");
- if (pattern.test(m_name[i]))
- return true;
- }
- }
- }
- return false;
- }
- current_mesh_dict.m_cmds[current_mesh_dict.m_cmds.length] = new_obj;
- }
-
- //-----------------------------------------------------------------------------
- //Tries to find a matching command in the dictionnary based on the current cursor location in the given TextArea.
- //-----------------------------------------------------------------------------
- function FindMatchingCommand(src_text_area)
- {
- if (src_text_area != undefined)
- {
- var current_mesh_dict = GetCmdDictionnary();
- var found_match = "";
- var check = true;
- var cursor = Math.min(src_text_area.selectionStart, src_text_area.value.length - 1);
- //Weird test to ensure we don't start searching on the next line or on the next word.
- if (!src_text_area.value[cursor].match(/^[ \n]$/))
- cursor++;
- cursor = Math.min(cursor, src_text_area.value.length - 1);
-
- var o = 0;
- while (check && o < 10)
- {
- //Move backward to find the first letter on this line
- for (; cursor > 0; cursor--)
- if (src_text_area.value[cursor].match(/^[a-z\n]+$/))
- break;
-
- //Move backward to find the start of the command
- for (; cursor > 0; cursor--)
- if (!src_text_area.value[cursor - 1].match(/^[#0-9a-z]+$/))
- break;
-
- //If the cursor is on a "#" and the previous is a " ", we're on a color, repeat the operation
- if (cursor > 0 && src_text_area.value[cursor - 1].match(/[ ]/) &&
- src_text_area.value[cursor].match(/[#]/))
- check = true;
- else
- check = false;
- o++;
- }
-
- //Move forward to find the end of the word
- for (; cursor < src_text_area.value.length; cursor++)
- {
- if (src_text_area.value[cursor].match(/^[a-z]+$/))
- found_match += src_text_area.value[cursor];
- else
- break;
- }
-
- //Try to match the command with the dictionnary
- var match_data = new Object();
- match_data.match = found_match;
- match_data.match_list = new Array();
- for (cursor = 0; cursor < current_mesh_dict.m_cmds.length; cursor++)
- if (current_mesh_dict.m_cmds[cursor].CheckCommand(found_match))
- match_data.match_list[match_data.match_list.length] = cursor;
-
- return match_data;
- }
- }
|