📄 parsingutils.java
字号:
return i;
}
public static void removeCommentsWhitespacesAndLiterals(StringBuffer buf) {
removeCommentsWhitespacesAndLiterals(buf, true);
}
/**
* Removes all the comments, whitespaces and literals from a stringbuffer (might be useful when
* just finding matches for something).
*
* NOTE: the literals and the comments are changed for spaces (if we don't remove them too)
*
* @param buf the buffer from where things should be removed.
* @param whitespacesToo: are you sure about the whitespaces?
*/
public static void removeCommentsWhitespacesAndLiterals(StringBuffer buf, boolean whitespacesToo) {
for (int i = 0; i < buf.length(); i++) {
char ch = buf.charAt(i);
if(ch == '#'){
int j = i;
while(j < buf.length() && ch != '\n' && ch != '\r'){
ch = buf.charAt(j);
j++;
}
buf.delete(i, j);
}
if(ch == '\'' || ch == '"'){
int j = getLiteralEnd(buf, i, ch);
if(whitespacesToo){
buf.delete(i, j+1);
}else{
for (int k = 0; i+k < j+1; k++) {
buf.replace(i+k, i+k+1, " ");
}
}
}
}
if(whitespacesToo){
int length = buf.length();
for (int i = length -1; i >= 0; i--) {
char ch = buf.charAt(i);
if(Character.isWhitespace(ch)){
buf.deleteCharAt(i);
}
}
}
}
public static void removeLiterals(StringBuffer buf) {
for (int i = 0; i < buf.length(); i++) {
char ch = buf.charAt(i);
if(ch == '#'){
//just past through comments
while(i < buf.length() && ch != '\n' && ch != '\r'){
ch = buf.charAt(i);
i++;
}
}
if(ch == '\'' || ch == '"'){
int j = getLiteralEnd(buf, i, ch);
for (int k = 0; i+k < j+1; k++) {
buf.replace(i+k, i+k+1, " ");
}
}
}
}
public static Iterator<String> getNoLiteralsOrCommentsIterator(IDocument doc) {
return new PyDocIterator(doc);
}
public static void removeCommentsAndWhitespaces(StringBuffer buf) {
for (int i = 0; i < buf.length(); i++) {
char ch = buf.charAt(i);
if(ch == '#'){
int j = i;
while(j < buf.length() -1 && ch != '\n' && ch != '\r'){
j++;
ch = buf.charAt(j);
}
buf.delete(i, j);
}
}
int length = buf.length();
for (int i = length -1; i >= 0; i--) {
char ch = buf.charAt(i);
if(Character.isWhitespace(ch)){
buf.deleteCharAt(i);
}
}
}
public static void removeToClosingPar(StringBuffer buf) {
int length = buf.length();
for (int i = length -1; i >= 0; i--) {
char ch = buf.charAt(i);
if(ch != ')'){
buf.deleteCharAt(i);
}else{
buf.deleteCharAt(i);
return;
}
}
}
/**
* @param initial the document
* @param currPos the offset we're interested in
* @return the content type of the current position
*
* The version with the IDocument as a parameter should be preffered, as
* this one can be much slower (still, it is an alternative in tests or
* other places that do not have document access), but keep in mind
* that it may be slow.
*/
public static String getContentType(String initial, int currPos) {
StringBuffer buf = new StringBuffer(initial);
String curr = PY_DEFAULT;
for (int i = 0; i < buf.length() && i < currPos; i++) {
char ch = buf.charAt(i);
curr = PY_DEFAULT;
if(ch == '#'){
curr = PY_COMMENT;
int j = i;
while(j < buf.length()-1 && ch != '\n' && ch != '\r'){
j++;
ch = buf.charAt(j);
}
i = j;
}
if(i >= currPos){
return curr;
}
if(ch == '\'' || ch == '"'){
curr = PY_SINGLELINE_STRING1;
if(ch == '"'){
curr = PY_SINGLELINE_STRING2;
}
i = getLiteralEnd(buf, i, ch);
}
}
return curr;
}
/**
* @param document the document we want to get info on
* @param i the document offset we're interested in
* @return the content type at that position (according to IPythonPartitions)
*
* Uses the default if the partitioner is not set in the document (for testing purposes)
*/
public static String getContentType(IDocument document, int i) {
IDocumentExtension3 docExtension= (IDocumentExtension3) document;
IDocumentPartitioner partitioner = docExtension.getDocumentPartitioner(IPythonPartitions.PYTHON_PARTITION_TYPE);
if(partitioner != null){
return partitioner.getContentType(i);
}
return getContentType(document.get(), i);
}
public static String makePythonParseable(String code, String delimiter) {
return makePythonParseable(code, delimiter, new StringBuffer());
}
/**
* Ok, this method will get some code and make it suitable for putting at a shell
* @param code the initial code we'll make parseable
* @param delimiter the delimiter we should use
* @return a String that can be passed to the shell
*/
public static String makePythonParseable(String code, String delimiter, StringBuffer lastLine) {
StringBuffer buffer = new StringBuffer();
StringBuffer currLine = new StringBuffer();
//we may have line breaks with \r\n, or only \n or \r
boolean foundNewLine = false;
boolean foundNewLineAtChar;
boolean lastWasNewLine = false;
if(lastLine.length() > 0){
lastWasNewLine = true;
}
for (int i = 0; i < code.length(); i++) {
foundNewLineAtChar = false;
char c = code.charAt(i);
if(c == '\r'){
if(i +1 < code.length() && code.charAt(i+1) == '\n'){
i++; //skip the \n
}
foundNewLineAtChar = true;
}else if(c == '\n'){
foundNewLineAtChar = true;
}
if(!foundNewLineAtChar){
if(lastWasNewLine && !Character.isWhitespace(c)){
if(lastLine.length() > 0 && Character.isWhitespace(lastLine.charAt(0))){
buffer.append(delimiter);
}
}
currLine.append(c);
lastWasNewLine = false;
}else{
lastWasNewLine = true;
}
if(foundNewLineAtChar || i == code.length()-1){
if(!PySelection.containsOnlyWhitespaces(currLine.toString())){
buffer.append(currLine);
lastLine = currLine;
currLine = new StringBuffer();
buffer.append(delimiter);
foundNewLine = true;
}else{ //found a line only with whitespaces
currLine = new StringBuffer();
}
}
}
if(!foundNewLine){
buffer.append(delimiter);
}else{
if(!WordUtils.endsWith(buffer, '\r') && !WordUtils.endsWith(buffer, '\n')){
buffer.append(delimiter);
}
if(lastLine.length() > 0 && Character.isWhitespace(lastLine.charAt(0)) &&
(code.indexOf('\r') != -1 || code.indexOf('\n') != -1)){
buffer.append(delimiter);
}
}
return buffer.toString();
}
public static String getLastLine(String code) {
int i = code.lastIndexOf('\r');
int j = code.lastIndexOf('\n');
if(i == -1 && j == -1){
return code;
}
char toSplit = '\n';
if(i > j){
toSplit = '\r';
}
String[] strings = FullRepIterable.split(code, toSplit);
return strings[strings.length-1];
}
public static String removeComments(String line) {
int i = line.indexOf('#');
if(i != -1){
return line.substring(0, i);
}
return line;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -