1 /*
2  * RWebContentFileType.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 com.google.gwt.resources.client.ImageResource;
18 import org.rstudio.core.client.command.AppCommand;
19 import org.rstudio.core.client.regex.Pattern;
20 import org.rstudio.studio.client.RStudioGinjector;
21 import org.rstudio.studio.client.common.reditor.EditorLanguage;
22 import org.rstudio.studio.client.workbench.commands.Commands;
23 
24 import java.util.HashSet;
25 
26 public class RWebContentFileType extends TextFileType
27 {
RWebContentFileType(String id, String label, EditorLanguage editorLanguage, String defaultExtension, ImageResource icon, boolean isMarkdown)28    RWebContentFileType(String id,
29                        String label,
30                        EditorLanguage editorLanguage,
31                        String defaultExtension,
32                        ImageResource icon,
33                        boolean isMarkdown)
34    {
35       this(id, label, editorLanguage, defaultExtension, icon, isMarkdown, true);
36    }
37 
RWebContentFileType(String id, String label, EditorLanguage editorLanguage, String defaultExtension, ImageResource icon, boolean isMarkdown, boolean previewIsKnit)38    RWebContentFileType(String id,
39          String label,
40          EditorLanguage editorLanguage,
41          String defaultExtension,
42          ImageResource icon,
43          boolean isMarkdown,
44          boolean previewIsKnit)
45    {
46       this(id, label, editorLanguage, defaultExtension, icon, isMarkdown, previewIsKnit, false);
47    }
48 
RWebContentFileType(String id, String label, EditorLanguage editorLanguage, String defaultExtension, ImageResource icon, boolean isMarkdown, boolean previewIsKnit, boolean sourceOnSave)49    RWebContentFileType(String id,
50                        String label,
51                        EditorLanguage editorLanguage,
52                        String defaultExtension,
53                        ImageResource icon,
54                        boolean isMarkdown,
55                        boolean previewIsKnit,
56                        boolean sourceOnSave)
57    {
58       super(id,
59             label,
60             editorLanguage,
61             defaultExtension,
62             icon,
63             true,    // word-wrap
64             sourceOnSave,
65             true,
66             true,
67             false,
68             !previewIsKnit,    // preview-html
69             previewIsKnit,     // knit-html
70             false,
71             true,
72             false,
73             true,
74             true,
75             false);
76 
77       isMarkdown_ = isMarkdown;
78    }
79 
80    @Override
getSupportedCommands(Commands commands)81    public HashSet<AppCommand> getSupportedCommands(Commands commands)
82    {
83       HashSet<AppCommand> result = super.getSupportedCommands(commands);
84       result.add(commands.jumpTo());
85       result.add(commands.jumpToMatching());
86       result.add(commands.goToHelp());
87       result.add(commands.goToDefinition());
88       result.add(commands.insertRoxygenSkeleton());
89       return result;
90    }
91 
92    @Override
getWordWrap()93    public boolean getWordWrap()
94    {
95       return RStudioGinjector.INSTANCE.getUserPrefs().softWrapRmdFiles().getValue();
96    }
97 
98    @Override
getRnwStartPatternBegin()99    public Pattern getRnwStartPatternBegin()
100    {
101       if (isMarkdown_)
102          return RNW_START_PATTERN_MD;
103       else
104          return RNW_START_PATTERN_HTML;
105    }
106 
107    @Override
getRnwStartPatternEnd()108    public Pattern getRnwStartPatternEnd()
109    {
110       return null;
111    }
112 
113    private final boolean isMarkdown_;
114 
115    private static final Pattern RNW_START_PATTERN_MD =
116                                        Pattern.create("^`{3,}\\s*\\{r");
117    private static final Pattern RNW_START_PATTERN_HTML =
118                                 Pattern.create("^\\<!--\\s*begin.rcode\\s*");
119 
120 }
121