07ff8b611dc5a6b0b3df6a8d154bb165f06b7f15
[idea/community.git] / python / src / com / jetbrains / python / documentation / PyDocumentationSettings.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.jetbrains.python.documentation;
17
18 import com.intellij.openapi.components.PersistentStateComponent;
19 import com.intellij.openapi.components.State;
20 import com.intellij.openapi.components.Storage;
21 import com.intellij.openapi.components.StoragePathMacros;
22 import com.intellij.openapi.module.Module;
23 import com.intellij.openapi.module.ModuleServiceManager;
24 import com.intellij.openapi.util.text.StringUtil;
25 import com.intellij.psi.PsiFile;
26 import com.intellij.util.xmlb.XmlSerializerUtil;
27 import com.intellij.util.xmlb.annotations.OptionTag;
28 import com.intellij.util.xmlb.annotations.Transient;
29 import com.jetbrains.python.PyNames;
30 import com.jetbrains.python.documentation.docstrings.DocStringFormat;
31 import com.jetbrains.python.psi.PyFile;
32 import com.jetbrains.python.psi.PyTargetExpression;
33 import com.jetbrains.python.psi.impl.PyPsiUtils;
34 import org.jetbrains.annotations.NotNull;
35 import org.jetbrains.annotations.Nullable;
36
37 import java.util.List;
38
39 /**
40  * @author yole
41  */
42 @State(
43   name = "PyDocumentationSettings",
44   storages = @Storage(StoragePathMacros.MODULE_FILE)
45 )
46 public class PyDocumentationSettings implements PersistentStateComponent<PyDocumentationSettings> {
47   public static final DocStringFormat DEFAULT_DOCSTRING_FORMAT = DocStringFormat.REST;
48
49   public static PyDocumentationSettings getInstance(@NotNull Module module) {
50     return ModuleServiceManager.getService(module, PyDocumentationSettings.class);
51   }
52
53   @NotNull private DocStringFormat myDocStringFormat = DEFAULT_DOCSTRING_FORMAT;
54   private boolean myAnalyzeDoctest = true;
55
56   public boolean isNumpyFormat(PsiFile file) {
57     return isFormat(file, DocStringFormat.NUMPY);
58   }
59
60   public boolean isPlain(PsiFile file) {
61     return isFormat(file, DocStringFormat.PLAIN);
62   }
63
64   private boolean isFormat(@Nullable PsiFile file, @NotNull DocStringFormat format) {
65     return file instanceof PyFile ? getFormatForFile(file) == format : myDocStringFormat == format;
66   }
67
68   @NotNull
69   public DocStringFormat getFormatForFile(@NotNull PsiFile file) {
70     final DocStringFormat fileFormat = getFormatFromDocformatAttribute(file);
71     return fileFormat != null && fileFormat != DocStringFormat.PLAIN ? fileFormat : myDocStringFormat;
72   }
73
74   @Nullable
75   public static DocStringFormat getFormatFromDocformatAttribute(@NotNull PsiFile file) {
76     if (file instanceof PyFile) {
77       final PyTargetExpression expr = ((PyFile)file).findTopLevelAttribute(PyNames.DOCFORMAT);
78       if (expr != null) {
79         final String docformat = PyPsiUtils.strValue(expr.findAssignedValue());
80         if (docformat != null) {
81           final List<String> words = StringUtil.split(docformat, " ");
82           if (words.size() > 0) {
83             final DocStringFormat fileFormat = DocStringFormat.fromName(words.get(0));
84             if (fileFormat != null) {
85               return fileFormat;
86             }
87           }
88         }
89       }
90     }
91     return null;
92   }
93
94   @Transient
95   @NotNull
96   public DocStringFormat getFormat() {
97     return myDocStringFormat;
98   }
99
100   public void setFormat(@NotNull DocStringFormat format) {
101     myDocStringFormat = format;
102   }
103
104   // Legacy name of the field to preserve settings format
105   @SuppressWarnings("unused")
106   @OptionTag("myDocStringFormat")
107   @NotNull
108   public String getFormatName() {
109     return myDocStringFormat.getName();
110   }
111
112   @SuppressWarnings("unused")
113   public void setFormatName(@NotNull String name) {
114     myDocStringFormat = DocStringFormat.fromNameOrPlain(name);
115   }
116
117   public boolean isAnalyzeDoctest() {
118     return myAnalyzeDoctest;
119   }
120
121   public void setAnalyzeDoctest(boolean analyze) {
122     myAnalyzeDoctest = analyze;
123   }
124
125   @Override
126   public PyDocumentationSettings getState() {
127     return this;
128   }
129
130   @Override
131   public void loadState(PyDocumentationSettings state) {
132     XmlSerializerUtil.copyBean(state, this);
133   }
134 }