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 }