diff options
Diffstat (limited to 'src/LexYAML.cxx')
-rw-r--r-- | src/LexYAML.cxx | 314 |
1 files changed, 0 insertions, 314 deletions
diff --git a/src/LexYAML.cxx b/src/LexYAML.cxx deleted file mode 100644 index 99f34da88..000000000 --- a/src/LexYAML.cxx +++ /dev/null @@ -1,314 +0,0 @@ -// Scintilla source code edit control -/** @file LexYAML.cxx - ** Lexer for YAML. - **/ -// Copyright 2003- by Sean O'Dell <sean@celsoft.com> -// The License.txt file describes the conditions under which this software may be distributed. - -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <stdio.h> -#include <stdarg.h> - -#include "Platform.h" - -#include "PropSet.h" -#include "Accessor.h" -#include "StyleContext.h" -#include "KeyWords.h" -#include "Scintilla.h" -#include "SciLexer.h" - -#ifdef SCI_NAMESPACE -using namespace Scintilla; -#endif - -static const char * const yamlWordListDesc[] = { - "Keywords", - 0 -}; - -static inline bool AtEOL(Accessor &styler, unsigned int i) { - return (styler[i] == '\n') || - ((styler[i] == '\r') && (styler.SafeGetCharAt(i + 1) != '\n')); -} - -static unsigned int SpaceCount(char* lineBuffer) { - if (lineBuffer == NULL) - return 0; - - char* headBuffer = lineBuffer; - - while (*headBuffer == ' ') - headBuffer++; - - return headBuffer - lineBuffer; -} - -#define YAML_STATE_BITSIZE 16 -#define YAML_STATE_MASK (0xFFFF0000) -#define YAML_STATE_DOCUMENT (1 << YAML_STATE_BITSIZE) -#define YAML_STATE_VALUE (2 << YAML_STATE_BITSIZE) -#define YAML_STATE_COMMENT (3 << YAML_STATE_BITSIZE) -#define YAML_STATE_TEXT_PARENT (4 << YAML_STATE_BITSIZE) -#define YAML_STATE_TEXT (5 << YAML_STATE_BITSIZE) - -static void ColouriseYAMLLine( - char *lineBuffer, - unsigned int currentLine, - unsigned int lengthLine, - unsigned int startLine, - unsigned int endPos, - WordList &keywords, - Accessor &styler) { - - unsigned int i = 0; - bool bInQuotes = false; - unsigned int indentAmount = SpaceCount(lineBuffer); - - if (currentLine > 0) { - int parentLineState = styler.GetLineState(currentLine - 1); - - if ((parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT || (parentLineState&YAML_STATE_MASK) == YAML_STATE_TEXT_PARENT) { - unsigned int parentIndentAmount = parentLineState&(~YAML_STATE_MASK); - if (indentAmount > parentIndentAmount) { - styler.SetLineState(currentLine, YAML_STATE_TEXT | parentIndentAmount); - styler.ColourTo(endPos, SCE_YAML_TEXT); - return; - } - } - } - styler.SetLineState(currentLine, 0); - if (strncmp(lineBuffer, "---", 3) == 0) { // Document marker - styler.SetLineState(currentLine, YAML_STATE_DOCUMENT); - styler.ColourTo(endPos, SCE_YAML_DOCUMENT); - return; - } - // Skip initial spaces - while ((i < lengthLine) && lineBuffer[i] == ' ') { // YAML always uses space, never TABS or anything else - i++; - } - if (lineBuffer[i] == '\t') { // if we skipped all spaces, and we are NOT inside a text block, this is wrong - styler.ColourTo(endPos, SCE_YAML_ERROR); - return; - } - if (lineBuffer[i] == '#') { // Comment - styler.SetLineState(currentLine, YAML_STATE_COMMENT); - styler.ColourTo(endPos, SCE_YAML_COMMENT); - return; - } - while (i < lengthLine) { - if (lineBuffer[i] == '\'' || lineBuffer[i] == '\"') { - bInQuotes = !bInQuotes; - } else if (lineBuffer[i] == ':' && !bInQuotes) { - styler.ColourTo(startLine + i - 1, SCE_YAML_IDENTIFIER); - styler.ColourTo(startLine + i, SCE_YAML_OPERATOR); - // Non-folding scalar - i++; - while ((i < lengthLine) && isspacechar(lineBuffer[i])) - i++; - unsigned int endValue = lengthLine - 1; - while ((endValue >= i) && isspacechar(lineBuffer[endValue])) - endValue--; - lineBuffer[endValue + 1] = '\0'; - if (lineBuffer[i] == '|' || lineBuffer[i] == '>') { - i++; - if (lineBuffer[i] == '+' || lineBuffer[i] == '-') - i++; - while ((i < lengthLine) && isspacechar(lineBuffer[i])) - i++; - if (lineBuffer[i] == '\0') { - styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount); - styler.ColourTo(endPos, SCE_YAML_DEFAULT); - return; - } else if (lineBuffer[i] == '#') { - styler.SetLineState(currentLine, YAML_STATE_TEXT_PARENT | indentAmount); - styler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT); - styler.ColourTo(endPos, SCE_YAML_COMMENT); - return; - } else { - styler.ColourTo(endPos, SCE_YAML_ERROR); - return; - } - } else if (lineBuffer[i] == '#') { - styler.ColourTo(startLine + i - 1, SCE_YAML_DEFAULT); - styler.ColourTo(endPos, SCE_YAML_COMMENT); - return; - } - styler.SetLineState(currentLine, YAML_STATE_VALUE); - if (lineBuffer[i] == '&' || lineBuffer[i] == '*') { - styler.ColourTo(endPos, SCE_YAML_REFERENCE); - return; - } - if (keywords.InList(&lineBuffer[i])) { // Convertible value (true/false, etc.) - styler.ColourTo(endPos, SCE_YAML_KEYWORD); - return; - } else { - unsigned int i2 = i; - while ((i < lengthLine) && lineBuffer[i]) { - if (!(isascii(lineBuffer[i]) && isdigit(lineBuffer[i])) && lineBuffer[i] != '-' && lineBuffer[i] != '.' && lineBuffer[i] != ',') { - styler.ColourTo(endPos, SCE_YAML_DEFAULT); - return; - } - i++; - } - if (i > i2) { - styler.ColourTo(endPos, SCE_YAML_NUMBER); - return; - } - } - break; // shouldn't get here, but just in case, the rest of the line is coloured the default - } - i++; - } - styler.ColourTo(endPos, SCE_YAML_DEFAULT); -} - -static void ColouriseYAMLDoc(unsigned int startPos, int length, int, WordList *keywordLists[], Accessor &styler) { - char lineBuffer[1024]; - styler.StartAt(startPos); - styler.StartSegment(startPos); - unsigned int linePos = 0; - unsigned int startLine = startPos; - unsigned int endPos = startPos + length; - unsigned int maxPos = styler.Length(); - unsigned int lineCurrent = styler.GetLine(startPos); - - for (unsigned int i = startPos; i < maxPos && i < endPos; i++) { - lineBuffer[linePos++] = styler[i]; - if (AtEOL(styler, i) || (linePos >= sizeof(lineBuffer) - 1)) { - // End of line (or of line buffer) met, colourise it - lineBuffer[linePos] = '\0'; - ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, i, *keywordLists[0], styler); - linePos = 0; - startLine = i + 1; - lineCurrent++; - } - } - if (linePos > 0) { // Last line does not have ending characters - ColouriseYAMLLine(lineBuffer, lineCurrent, linePos, startLine, startPos + length - 1, *keywordLists[0], styler); - } -} - -static bool IsCommentLine(int line, Accessor &styler) { - int pos = styler.LineStart(line); - if (styler[pos] == '#') - return true; - return false; -} - -static void FoldYAMLDoc(unsigned int startPos, int length, int /*initStyle - unused*/, - WordList *[], Accessor &styler) { - const int maxPos = startPos + length; - const int maxLines = styler.GetLine(maxPos - 1); // Requested last line - const int docLines = styler.GetLine(styler.Length() - 1); // Available last line - const bool foldComment = styler.GetPropertyInt("fold.comment.yaml") != 0; - - // Backtrack to previous non-blank line so we can determine indent level - // for any white space lines - // and so we can fix any preceding fold level (which is why we go back - // at least one line in all cases) - int spaceFlags = 0; - int lineCurrent = styler.GetLine(startPos); - int indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL); - while (lineCurrent > 0) { - lineCurrent--; - indentCurrent = styler.IndentAmount(lineCurrent, &spaceFlags, NULL); - if (!(indentCurrent & SC_FOLDLEVELWHITEFLAG) && - (!IsCommentLine(lineCurrent, styler))) - break; - } - int indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; - - // Set up initial loop state - int prevComment = 0; - if (lineCurrent >= 1) - prevComment = foldComment && IsCommentLine(lineCurrent - 1, styler); - - // Process all characters to end of requested range - // or comment that hangs over the end of the range. Cap processing in all cases - // to end of document (in case of unclosed comment at end). - while ((lineCurrent <= docLines) && ((lineCurrent <= maxLines) || prevComment)) { - - // Gather info - int lev = indentCurrent; - int lineNext = lineCurrent + 1; - int indentNext = indentCurrent; - if (lineNext <= docLines) { - // Information about next line is only available if not at end of document - indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); - } - const int comment = foldComment && IsCommentLine(lineCurrent, styler); - const int comment_start = (comment && !prevComment && (lineNext <= docLines) && - IsCommentLine(lineNext, styler) && (lev > SC_FOLDLEVELBASE)); - const int comment_continue = (comment && prevComment); - if (!comment) - indentCurrentLevel = indentCurrent & SC_FOLDLEVELNUMBERMASK; - if (indentNext & SC_FOLDLEVELWHITEFLAG) - indentNext = SC_FOLDLEVELWHITEFLAG | indentCurrentLevel; - - if (comment_start) { - // Place fold point at start of a block of comments - lev |= SC_FOLDLEVELHEADERFLAG; - } else if (comment_continue) { - // Add level to rest of lines in the block - lev = lev + 1; - } - - // Skip past any blank lines for next indent level info; we skip also - // comments (all comments, not just those starting in column 0) - // which effectively folds them into surrounding code rather - // than screwing up folding. - - while ((lineNext < docLines) && - ((indentNext & SC_FOLDLEVELWHITEFLAG) || - (lineNext <= docLines && IsCommentLine(lineNext, styler)))) { - - lineNext++; - indentNext = styler.IndentAmount(lineNext, &spaceFlags, NULL); - } - - const int levelAfterComments = indentNext & SC_FOLDLEVELNUMBERMASK; - const int levelBeforeComments = Platform::Maximum(indentCurrentLevel,levelAfterComments); - - // Now set all the indent levels on the lines we skipped - // Do this from end to start. Once we encounter one line - // which is indented more than the line after the end of - // the comment-block, use the level of the block before - - int skipLine = lineNext; - int skipLevel = levelAfterComments; - - while (--skipLine > lineCurrent) { - int skipLineIndent = styler.IndentAmount(skipLine, &spaceFlags, NULL); - - if ((skipLineIndent & SC_FOLDLEVELNUMBERMASK) > levelAfterComments) - skipLevel = levelBeforeComments; - - int whiteFlag = skipLineIndent & SC_FOLDLEVELWHITEFLAG; - - styler.SetLevel(skipLine, skipLevel | whiteFlag); - } - - // Set fold header on non-comment line - if (!comment && !(indentCurrent & SC_FOLDLEVELWHITEFLAG) ) { - if ((indentCurrent & SC_FOLDLEVELNUMBERMASK) < (indentNext & SC_FOLDLEVELNUMBERMASK)) - lev |= SC_FOLDLEVELHEADERFLAG; - } - - // Keep track of block comment state of previous line - prevComment = comment_start || comment_continue; - - // Set fold level for this line and move to next line - styler.SetLevel(lineCurrent, lev); - indentCurrent = indentNext; - lineCurrent = lineNext; - } - - // NOTE: Cannot set level of last line here because indentCurrent doesn't have - // header flag set; the loop above is crafted to take care of this case! - //styler.SetLevel(lineCurrent, indentCurrent); -} - -LexerModule lmYAML(SCLEX_YAML, ColouriseYAMLDoc, "yaml", FoldYAMLDoc, yamlWordListDesc); |