/*******************************************************************************
* Copyright (c) 2016 Pivotal, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.editor.support.yaml.completions;
/**
* @author Kris De Volder
*/
public class YamlUtil {
/**
* If any one of these is found at the start of a string then the string requires
* to be escaped.
*/
private static final String[] SPECIAL_START = {
//This list is probably not complete.
"!",
"#",
"&",
"*",
">",
"|",
"?",
"{",
"}",
"[",
"]",
",",
"\"",
"'",
"`",
"@",
"- ",
"\t",
" ",
// "\n", //also included in 'special content' so no need to check at start specifically.
// "\r"
};
/**
* If any of these is found at the end of a string then the string requires to be
* escaped.
*/
private static final String[] SPECIAL_END = {
"\t",
" "
// "\n", //also included in 'special content' so no need to check at start specifically.
// "\r"
};
/**
* If any of these is found inside a string then the string requires to be escaped.
*/
private static final String[] SPECIAL_CONTENT = {
": ", " #", "\n", "\r"
};
/**
* Given a string value convert it into a format that can be inserted into a yml file.
*/
public static String stringEscape(String value) {
if (canInsertAsIs(value)) {
return value;
}
//TODO: this does not properly handle values that contain line-breaks (linebreaks are no alowed in single-line stirngs, such as may
// be used for 'keys' in yaml. And although they are allowed in mult-line strings, they will be subject to new end-of-line folding
// this processing of newlines by yaml parser will mean that the value is not the same when parsed.
//For string like that we probably need to resort to double-quoted strings using escape sequences using '\'.
//These cases are rare and not yet implemented here.
return "'"+value.replace("'", "''")+"'";
}
private static boolean canInsertAsIs(String value) {
//See http://www.activestate.com/blog/2014/07/yaml-pro
// section: "Don't Over-quote your Strings"
for (String special : SPECIAL_START) {
if (value.startsWith(special)) {
return false;
}
}
for (String special : SPECIAL_END) {
if (value.endsWith(special)) {
return false;
}
}
for (String special : SPECIAL_CONTENT) {
if (value.contains(special)) {
return false;
}
}
//Nothing special. Safe to include verbatim.
return true;
}
}