diff options
Diffstat (limited to 'kate/scripts/script-indent-c-test.js')
-rw-r--r-- | kate/scripts/script-indent-c-test.js | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/kate/scripts/script-indent-c-test.js b/kate/scripts/script-indent-c-test.js new file mode 100644 index 000000000..5d506ca67 --- /dev/null +++ b/kate/scripts/script-indent-c-test.js @@ -0,0 +1,180 @@ +/**KATE + *NAME: C style indenter + *COPYRIGHT: + *Based on work Copyright 2005 by Dominik Haumann + *Copyright 2005 by Joseph Wenninger + *Here will be the license text, Dominik has to choose + * The following line is not empty + * + *An empty line ends this block + * + *VERSION: 0.1 + *ANUNKNOWNKEYWORD: Version has to be in the format major.minor (both numbers) + *IGNOREALSO: All keywords, except COPYRIGHT are expected to have their data on one line + *UNKNOWN: unknown keywords are simply ignored from the information parser + *CURRENTLY_KNOWN_KEYWORDS: NAME,VERSION, COPYRIGHT + *INFORMATION: This block has to begin in the first line at the first character position + *INFORMATION: It is optional, but at least all files within the kde cvs, + *INFORMATION: which are ment for publishing are supposed to have at least the + *INFORMATION: COPYRIGHT block + *INFORMATION: These files have to be stored as UTF8 + **/ + +/* +function indentChar() // also possible +{*/ + +function indentChar(c) +{ + var tabWidth = 4; + var spaceIndent = true; + var indentWidth = 4; + + + var line = view.cursorLine(); + var col = view.cursorColumn(); + + var textLine = document.textLine( line ); + var prevLine = document.textLine( line - 1 ); + + var prevIndent = prevLine.match(/^\s*/); + var addIndent = ""; + + function unindent() + { + // if ( + } + + // unindent } and {, if not in a comment + if ( textLine.search( /^\s*\/\// ) == -1 ) + { + if ( /*textLine.charAt( col-1 )*/ c == '}' || /*textLine.c( col-1 )*/ c == '{') + { + if ( textLine.search(/^\s\s\s\s/) != -1) + { + document.removeText( line, 0, line, tabWidth ); + view.setCursorPositionReal( line, col - tabWidth ); + } + } + } + +} + + +function firstNonSpace( _text ) +{ + for( _i=0; _i < _text.length; _i++ ) + { + _ch = _text.charAt( _i ); + if( _ch != ' ' && _ch != '\t' ) + return _i; + } + + return -1; +} + +function lastNonSpace( _text ) +{ + for( _i=_text.length - 1; _i >= 0; _i-- ) + { + _ch = _text.charAt( _i ); + if( _ch != ' ' && _ch != '\t' ) + return _i; + } + + return -1; +} + +function indentNewLine() +{ + var tabWidth = 4; + var spaceIndent = true; + var indentWidth = 4; + + var strIndentCharacters = " "; + var strIndentFiller = ""; + + var intStartLine = view.cursorLine(); + var intStartColumn = view.cursorColumn(); + + var strTextLine = document.textLine( intStartLine ); + var strPrevLine = document.textLine( intStartLine - 1 ); + + var addIndent = ""; + // if previous line ends with a '{' increase indent level + // if ( prevLine.search( /{\s*$/ ) != -1 ) + // { + // if ( spaceIndent ) + // addIndent = " "; + // else + // addIndent = "\t"; + // } + // else + { + var intCurrentLine = intStartLine; + var openParenCount = 0; + var openBraceCount = 0; + + label_while: + while ( intCurrentLine > 0 ) + { + intCurrentLine--; + + strCurrentLine = document.textLine( intCurrentLine ); + intLastChar = lastNonSpace( strCurrentLine ); + intFirstChar = firstNonSpace( strCurrentLine ) ; + + if ( strCurrentLine.search( /\/\// ) == -1 ) + { + + // look through line backwards for interesting characters + for( intCurrentChar = intLastChar; intCurrentChar >= intFirstChar; --intCurrentChar ) + { + ch = strCurrentLine.charAt( intCurrentChar ); + switch( ch ) + { + case '(': case '[': + if( ++openParenCount > 0 ) + break label_while; //return calcIndentInBracket( begin, cur, pos ); + break; + case ')': case ']': openParenCount--; break; + case '{': + if( ++openBraceCount > 0 ) + break label_while; //return calcIndentInBrace( begin, cur, pos ); + break; + case '}': openBraceCount--; lookingForScopeKeywords = false; break; + case ';': + if( openParenCount == 0 ) + lookingForScopeKeywords = false; + break; + } + } + } + } + + strIndentFiller += strCurrentLine.match(/^\s+/); + if ( strIndentFiller == "null" ) + strIndentFiller = ""; + + debug( "line: " + intCurrentLine); + debug( openParenCount + ", " + openBraceCount); + + while( openParenCount > 0 ) + { + openParenCount--; + strIndentFiller += strIndentCharacters; + } + + while( openBraceCount > 0 ) + { + openBraceCount--; + strIndentFiller += strIndentCharacters; + } + } + + document.insertText( intStartLine, 0, strIndentFiller ); + view.setCursorPositionReal( intStartLine, document.textLine( intStartLine ).length ); +} + +indenter.onchar=indentChar +indenter.onnewline=indentNewLine
\ No newline at end of file |