1 /* 2 * DocumentMode.java 3 * 4 * Copyright (C) 2021 by RStudio, PBC 5 * 6 * Unless you have received this program directly from RStudio pursuant 7 * to the terms of a commercial license agreement with RStudio, then 8 * this program is licensed to you under the terms of version 3 of the 9 * GNU Affero General Public License. This program is distributed WITHOUT 10 * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, 11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the 12 * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. 13 * 14 */ 15 package org.rstudio.studio.client.common.filetypes; 16 17 import org.rstudio.studio.client.workbench.views.source.editors.text.DocDisplay; 18 import org.rstudio.studio.client.workbench.views.source.editors.text.ace.Position; 19 20 public class DocumentMode 21 { 22 public enum Mode 23 { 24 R, 25 PYTHON, 26 C_CPP, 27 MARKDOWN, 28 SQL, 29 STAN, 30 TEX, 31 UNKNOWN 32 } 33 getModeForPosition(DocDisplay docDisplay, Position position)34 public static Mode getModeForPosition(DocDisplay docDisplay, 35 Position position) 36 { 37 if (isPositionInRMode(docDisplay, position)) 38 return Mode.R; 39 else if (isPositionInPythonMode(docDisplay, position)) 40 return Mode.PYTHON; 41 else if (isPositionInCppMode(docDisplay, position)) 42 return Mode.C_CPP; 43 else if (isPositionInMarkdownMode(docDisplay, position)) 44 return Mode.MARKDOWN; 45 else if (isPositionInTexMode(docDisplay, position)) 46 return Mode.TEX; 47 else if (isPositionInSqlMode(docDisplay, position)) 48 return Mode.SQL; 49 else if (isPositionInStanMode(docDisplay, position)) 50 return Mode.STAN; 51 else 52 return Mode.UNKNOWN; 53 } 54 getModeForCursorPosition(DocDisplay docDisplay)55 public static Mode getModeForCursorPosition(DocDisplay docDisplay) 56 { 57 return getModeForPosition(docDisplay, docDisplay.getCursorPosition()); 58 } 59 isPositionInMode(DocDisplay docDisplay, Position position, String modeString)60 private static boolean isPositionInMode(DocDisplay docDisplay, 61 Position position, 62 String modeString) 63 { 64 String m = docDisplay.getLanguageMode(position); 65 return m != null && m.equals(modeString); 66 } 67 68 // Markdown Mode isPositionInMarkdownMode(DocDisplay docDisplay, Position position)69 public static boolean isPositionInMarkdownMode(DocDisplay docDisplay, 70 Position position) 71 { 72 if (docDisplay.getFileType().isPlainMarkdown()) 73 return true; 74 75 return isPositionInMode( 76 docDisplay, 77 position, 78 FileType.MARKDOWN_LANG_MODE); 79 80 } 81 isCursorInMarkdownMode(DocDisplay docDisplay)82 public static boolean isCursorInMarkdownMode(DocDisplay docDisplay) 83 { 84 return isPositionInMarkdownMode( 85 docDisplay, 86 docDisplay.getCursorPosition()); 87 } 88 isSelectionInMarkdownMode(DocDisplay docDisplay)89 public static boolean isSelectionInMarkdownMode(DocDisplay docDisplay) 90 { 91 return isPositionInMarkdownMode( 92 docDisplay, 93 docDisplay.getSelectionStart()) && 94 isPositionInMarkdownMode( 95 docDisplay, 96 docDisplay.getSelectionEnd()); 97 } 98 99 // R Mode isPositionInRMode(DocDisplay docDisplay, Position position)100 public static boolean isPositionInRMode(DocDisplay docDisplay, 101 Position position) 102 { 103 if (docDisplay.getFileType().isR()) 104 return true; 105 106 return isPositionInMode( 107 docDisplay, 108 position, 109 FileType.R_LANG_MODE); 110 111 } isCursorInRMode(DocDisplay docDisplay)112 public static boolean isCursorInRMode(DocDisplay docDisplay) 113 { 114 return isPositionInRMode( 115 docDisplay, 116 docDisplay.getCursorPosition()); 117 } 118 isSelectionInRMode(DocDisplay docDisplay)119 public static boolean isSelectionInRMode(DocDisplay docDisplay) 120 { 121 return isPositionInRMode(docDisplay, docDisplay.getSelectionStart()) && 122 isPositionInRMode(docDisplay, docDisplay.getSelectionEnd()); 123 } 124 125 // C++ Mode isPositionInCppMode(DocDisplay docDisplay, Position position)126 public static boolean isPositionInCppMode(DocDisplay docDisplay, 127 Position position) 128 { 129 return isPositionInMode( 130 docDisplay, 131 position, 132 FileType.C_CPP_LANG_MODE); 133 } 134 isCursorInCppMode(DocDisplay docDisplay)135 public static boolean isCursorInCppMode(DocDisplay docDisplay) 136 { 137 return isPositionInCppMode(docDisplay, docDisplay.getCursorPosition()); 138 } 139 isSelectionInCppMode(DocDisplay docDisplay)140 public static boolean isSelectionInCppMode(DocDisplay docDisplay) 141 { 142 return isPositionInCppMode(docDisplay, docDisplay.getSelectionStart()) && 143 isPositionInCppMode(docDisplay, docDisplay.getSelectionEnd()); 144 } 145 146 // TeX Mode isPositionInTexMode(DocDisplay docDisplay, Position position)147 public static boolean isPositionInTexMode(DocDisplay docDisplay, 148 Position position) 149 { 150 TextFileType fileType = docDisplay.getFileType(); 151 if (fileType.canCompilePDF()) 152 { 153 if (fileType.isRnw()) 154 { 155 return FileType.TEX_LANG_MODE.equals( 156 docDisplay.getLanguageMode(position)); 157 } 158 else 159 { 160 return true; 161 } 162 } 163 else 164 { 165 return false; 166 } 167 168 } 169 isCursorInTexMode(DocDisplay docDisplay)170 public static boolean isCursorInTexMode(DocDisplay docDisplay) 171 { 172 return isPositionInTexMode(docDisplay, docDisplay.getCursorPosition()); 173 } 174 isSelectionInTexMode(DocDisplay docDisplay)175 public static boolean isSelectionInTexMode(DocDisplay docDisplay) 176 { 177 return isPositionInTexMode(docDisplay, docDisplay.getSelectionStart()) && 178 isPositionInTexMode(docDisplay, docDisplay.getSelectionEnd()); 179 } 180 181 // Python Mode isPositionInPythonMode(DocDisplay docDisplay, Position position)182 public static boolean isPositionInPythonMode(DocDisplay docDisplay, 183 Position position) 184 { 185 if (docDisplay.getFileType().isPython()) 186 return true; 187 188 return isPositionInMode( 189 docDisplay, 190 position, 191 FileType.PYTHON_LANG_MODE); 192 193 } 194 isCursorInPythonMode(DocDisplay docDisplay)195 public static boolean isCursorInPythonMode(DocDisplay docDisplay) 196 { 197 return isPositionInPythonMode( 198 docDisplay, 199 docDisplay.getCursorPosition()); 200 } 201 isSelectionInPythonMode(DocDisplay docDisplay)202 public static boolean isSelectionInPythonMode(DocDisplay docDisplay) 203 { 204 return isPositionInPythonMode(docDisplay, docDisplay.getSelectionStart()) && 205 isPositionInPythonMode(docDisplay, docDisplay.getSelectionEnd()); 206 } 207 isPositionInSqlMode(DocDisplay docDisplay, Position position)208 public static boolean isPositionInSqlMode(DocDisplay docDisplay, 209 Position position) 210 { 211 if (docDisplay.getFileType().isSql()) 212 return true; 213 214 return isPositionInMode(docDisplay, position, FileType.SQL_LANG_MODE); 215 } 216 217 // Stan Mode isPositionInStanMode(DocDisplay docDisplay, Position position)218 public static boolean isPositionInStanMode(DocDisplay docDisplay, 219 Position position) 220 { 221 if (docDisplay.getFileType().isStan()) 222 return true; 223 224 return isPositionInMode( 225 docDisplay, 226 position, 227 FileType.STAN_LANG_MODE); 228 229 } 230 isCursorInStanMode(DocDisplay docDisplay)231 public static boolean isCursorInStanMode(DocDisplay docDisplay) 232 { 233 return isPositionInStanMode( 234 docDisplay, 235 docDisplay.getCursorPosition()); 236 } 237 isSelectionInStanMode(DocDisplay docDisplay)238 public static boolean isSelectionInStanMode(DocDisplay docDisplay) 239 { 240 return isPositionInStanMode(docDisplay, docDisplay.getSelectionStart()) && 241 isPositionInStanMode(docDisplay, docDisplay.getSelectionEnd()); 242 } 243 244 }