diff --git a/js/widget.js b/js/widget.js index 0a4bafa..fca6ff0 100644 --- a/js/widget.js +++ b/js/widget.js @@ -205,18 +205,19 @@ function signatureValueChanged() { function updateLineNumbers() { const linesSignature = mySignatureCodeMirror.state.doc.toString().split('\n').length; - const linesDocstring = myDocstringCodeMirror.state.doc.toString().split('\n').length; + const docstring = myDocstringCodeMirror.state.doc.toString(); + const linesDocstring = docstring == "" ? 0 : docstring.split('\n').length; // increment line numbers in docstring text area by the number of lines in the signature myDocstringCodeMirror.dispatch({ - effects: guttercomp.reconfigure( - lineNumbers({ formatNumber: n=>linesSignature+n })) + effects: guttercomp.reconfigure( + lineNumbers({ formatNumber: n=> linesDocstring == 0 ? "" : linesSignature+n })) }); myBodyCodeMirror.dispatch({ - effects: guttercomp.reconfigure( - lineNumbers({ formatNumber: n=>linesSignature+linesDocstring+n})) + effects: guttercomp.reconfigure( + lineNumbers({ formatNumber: n=>linesSignature+linesDocstring+n})) }); } @@ -225,7 +226,7 @@ function signatureValueChanged() { // Set the value from python into the CodeMirror widget in the // frontend. - const newDocstring = '"""' + model.get('docstring') + '"""'; + const newDocstring = model.get('docstring'); if (newDocstring !== myDocstringCodeMirror.state.doc.toString()) { myDocstringCodeMirror.dispatch({ diff --git a/src/widget_code_input/__init__.py b/src/widget_code_input/__init__.py index f1458f5..fb88249 100644 --- a/src/widget_code_input/__init__.py +++ b/src/widget_code_input/__init__.py @@ -62,8 +62,6 @@ def _valid_docstring(self, docstring): """ Validate that the docstring do not contain triple double quotes """ - if '"""' in docstring['value']: - raise TraitError('The docstring cannot contain triple double quotes (""")') return docstring['value'] @@ -73,7 +71,7 @@ def __init__( # pylint: disable=too-many-arguments self, function_name, function_parameters="", - docstring="\n", + docstring=None, function_body="", code_theme="basicLight", ): @@ -94,7 +92,18 @@ def __init__( # pylint: disable=too-many-arguments self.function_name = function_name self.function_parameters = function_parameters - self.docstring = docstring + if docstring is None: + # we cannot store docstring as None so we use + # a variable to signify that it was None + self.docstring = "" + self._display_docstring = False + elif docstring.startswith("\"") and docstring.endswith("\""): + # assume the quotation marks have been added so we do not need to add them + self.docstring = docstring + self._display_docstring = True + else: + self.docstring = f"\"\"\"{docstring}\"\"\"" + self._display_docstring = True self.function_body = function_body self.code_theme = code_theme self.widget_instance_count_trait=f"{WidgetCodeInput.widget_instance_count}" @@ -114,7 +123,7 @@ def full_function_code(self): including signature, docstring and body """ return build_function( - self.function_signature, self.docstring, self.function_body + self.function_signature, self.docstring if self._display_docstring else None, self.function_body ) @property diff --git a/src/widget_code_input/utils.py b/src/widget_code_input/utils.py index 1189de7..6af837c 100644 --- a/src/widget_code_input/utils.py +++ b/src/widget_code_input/utils.py @@ -47,12 +47,11 @@ def build_pre_body(signature, docstring, indent_level=4): :param docstring: the (unindented) docstring :param indent_level: integer number of spaces to prepend to the docstring """ - if '"""' in docstring: - raise ValueError('Triple double quotes (""") not allowed in docstring') return "{}\n{}".format( signature, - prepend_indent('"""{}"""'.format(docstring), indent_level=indent_level), + prepend_indent('' if docstring is None else docstring, + indent_level=indent_level), )