diff --git a/lib/main.js b/lib/main.js index 72e089e..828b32f 100644 --- a/lib/main.js +++ b/lib/main.js @@ -1,5 +1,3 @@ -// @ts-check -/// 'use babel'; const { CompositeDisposable, Disposable } = require('atom'); @@ -25,7 +23,11 @@ module.exports = { if (!this.signatureHelpManager) this.signatureHelpManager = new SignatureHelpManager(); this.subscriptions.add(this.signatureHelpManager); - this.signatureHelpManager.initialize(); + + require('atom-package-deps').install('atom-ide-signature-help') + .then(function() { + console.log('All dependencies installed, good to go') + }); }, deactivate() { @@ -43,5 +45,9 @@ module.exports = { return (provider) => { return this.signatureHelpManager.addProvider(provider); } + }, + + consumeMarkdownRenderer(renderer) { + this.signatureHelpManager.initialize(renderer); } }; diff --git a/lib/signature-help-manager.js b/lib/signature-help-manager.js index 4d45c9c..583a834 100644 --- a/lib/signature-help-manager.js +++ b/lib/signature-help-manager.js @@ -1,5 +1,3 @@ -// @ts-check -/// 'use babel'; const { CompositeDisposable, Disposable, Point, Range, TextEditor } = require('atom'); @@ -49,12 +47,15 @@ module.exports = class SignatureHelpManager { * @type {Boolean} */ this.showSignatureHelpOnTyping = false; + + this.renderer = null; } - initialize() { + initialize(renderer) { this.subscriptions = new CompositeDisposable(); this.providerRegistry = new ProviderRegistry(); this.watchedEditors = new WeakSet(); + this.renderer = renderer; this.subscriptions.add( atom.workspace.observeTextEditors(editor => { @@ -121,9 +122,9 @@ module.exports = class SignatureHelpManager { if (editorView.hasFocus()) { this.updateCurrentEditor(editor); } - let focusListener = (element) => this.updateCurrentEditor(editor); + let focusListener = () => this.updateCurrentEditor(editor); editorView.addEventListener('focus', focusListener); - let blurListener = (element) => this.hideDataTip(); + let blurListener = () => this.hideDataTip(); editorView.addEventListener('blur', blurListener); let disposable = new Disposable(() => { @@ -225,11 +226,27 @@ module.exports = class SignatureHelpManager { if ((result === null) || (result.signatures.length === 0)) { return; } + console.log(result); + const index = result.activeSignature || 0; const signature = result.signatures[index]; - const signatureHelpView = new SignatureHelpView({ signature: signature, grammar: editor.getGrammar() }); - this.signatureHelpDisposables = this.mountSignatureHelp(editor, position, signatureHelpView); - }) + + let markedString = new Array(); + markedString.push(`
${signature.label}
`); + + if (signature.documentation) { + const markdownDoc = signature.documentation.kind ? signature.documentation.value : signature.documentation; + markedString.push(markdownDoc); + } + + const s = markedString.join('\r\n'); + this.renderer.render(s).then((html) => { + const signatureHelpView = new SignatureHelpView({ htmlView: html }); + this.signatureHelpDisposables = this.mountSignatureHelp(editor, position, signatureHelpView); + }).catch((err) => console.log(err)); + }); + + console.log() } /** @@ -241,7 +258,6 @@ module.exports = class SignatureHelpManager { */ mountSignatureHelp(editor, position, view) { let disposables = new CompositeDisposable(); - const overlayMarker = editor.markBufferRange(new Range(position, position), { invalidate: 'never', }); @@ -254,7 +270,7 @@ module.exports = class SignatureHelpManager { }); view.element.style.display = 'block'; - // move box above the current editing line + // move box above the current editing line setTimeout(() => { view.element.style.bottom = editor.getLineHeightInPixels() + view.element.getBoundingClientRect().height + 'px'; }, 100); diff --git a/lib/signature-help-view.js b/lib/signature-help-view.js index 2ebeaa7..31491ce 100644 --- a/lib/signature-help-view.js +++ b/lib/signature-help-view.js @@ -1,101 +1,22 @@ 'use babel'; /** @jsx etch.dom */ -const etch = require('etch') -const marked = require('marked') -const createDOMPurify = require('dompurify') +const ReactDOMServer = require('react-dom/server'); +const etch = require('etch'); +const createDOMPurify = require('dompurify'); /** * [domPurify description] * @type {DOMPurify} */ const domPurify = createDOMPurify(); -class SnippetView { - constructor({ snippet, grammar }) { - this.rootElement = document.createElement("div"); - this.rootElement.className = "datatip-container"; - if (snippet) { - this.refreshRootElement(snippet, grammar); - } - } - - update({ snippet, grammar }) { - this.refreshRootElement(snippet, grammar); - } - - refreshRootElement(snippet, grammar) { - const wrapper = document.createElement("div"); - wrapper.className = "datatip-marked-text-editor"; - if (snippet) { - const regExpLSPPrefix = /^\((method|property|parameter)\)\W/; - snippet = snippet.replace(regExpLSPPrefix, ''); - if (grammar) { - const atomElem = atom.workspace.buildTextEditor({ - lineNumberGutterVisible: false, - readonly: true, - keyboardInputEnabled: false, - showInvisibles: false, - tabLength: atom.config.get("editor.tabLength") - }); - atomElem.setGrammar(grammar); - atomElem.setText(snippet); - const atomView = atom.views.getView(atomElem); - atomView.setUpdatedSynchronously(true); - atomView.style.pointerEvents = "none" - atomView.style.position = "absolute"; - atomView.style.width = "0px"; - atomView.style.height = "1px"; - atom.views.getView(atom.workspace).appendChild(atomView); - this.editorTokenized(atomElem).then(() => { - const html = Array.from(atomView.querySelectorAll(".line:not(.dummy)")); - wrapper.innerHTML = domPurify.sanitize(html.map(x => x.innerHTML).join("\n"), { breaks: true }); - atomView.remove(); - }).catch(() => { - atomView.remove(); - }) - } - } - this.rootElement.appendChild(wrapper); - } - - get element() { - return this.rootElement; - } - - /** - * [editorTokenized description] - * @param {TextEditor} editor [description] - * @return {Promise} [description] - */ - editorTokenized(editor) { - return new Promise(resolve => { - if (editor.getBuffer().getLanguageMode().fullyTokenized) { - resolve() - } else { - const disp = editor.onDidTokenize(() => { - disp.dispose() - resolve() - }) - } - }) - } -} - -class MarkdownView { - constructor({ markedString }) { - this.markedString = markedString; +class HtmlView { + constructor({ html }) { this.rootElement = document.createElement('div'); this.rootElement.className = "datatip-marked-container"; this.rootElement.addEventListener("wheel", this.onMouseWheel, { passive: true }); - - if (this.markedString) { - this.rootElement.innerHTML = domPurify.sanitize(marked(this.markedString, { breaks: true })); - } - } - update({ markedString }) { - this.markedString = markedString; - if (this.markedString) { - this.rootElement.innerHTML = domPurify.sanitize(marked(this.markedString, { breaks: true })); + if (html){ + this.rootElement.innerHTML = domPurify.sanitize(html); } } @@ -112,6 +33,19 @@ class MarkdownView { } } +class ReactView { + constructor({ component }) { + this.rootElement = document.createElement('span') + if (component) { + this.rootElement.innerHTML = domPurify.sanitize(ReactDOMServer.renderToStaticMarkup(component())) + } + } + + get element() { + return this.rootElement + } +} + module.exports = class SignatureHelpView { // Required: Define an ordinary constructor to initialize your component. constructor(properties) { @@ -120,13 +54,27 @@ module.exports = class SignatureHelpView { } render() { - const documentation = this.properties.signature.documentation.value || this.properties.signature.documentation || null; - return ( -
- - -
- ); + if (this.properties.reactView) { + return ( +
+ +
+ ); + } + else if (this.properties.htmlView) { + return ( +
+ +
+ ); + } + else { + return ( +
+ { this.children } +
+ ); + } } update(props, children) { diff --git a/package-lock.json b/package-lock.json index 3603ee5..c1fb7b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3749,12 +3749,6 @@ "@types/node": "*" } }, - "@types/marked": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.6.0.tgz", - "integrity": "sha512-TxwhgR9VsIfRDJ3WwFokG8Xu+ea0nYGDRHdI783WJ983uffatz0ytIeUEIBOwPvRy241KRSNVyywQltuTqDh0w==", - "dev": true - }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -3768,15 +3762,15 @@ "dev": true }, "@types/prop-types": { - "version": "15.5.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.8.tgz", - "integrity": "sha512-3AQoUxQcQtLHsK25wtTWIoIpgYjH3vSDroZOUr7PpCHw/jLY1RB9z9E8dBT/OSmwStVgkRNvdh+ZHNiomRieaw==", + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.0.tgz", + "integrity": "sha512-eItQyV43bj4rR3JPV0Skpl1SncRCdziTEK9/v8VwXmV6d/qOUO8/EuWeHBbCZcsfSHfzI5UyMJLCSXtxxznyZg==", "dev": true }, "@types/react": { - "version": "16.7.21", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.21.tgz", - "integrity": "sha512-8BPxwygC83LgaIjOVVLrzB4mpP2u1ih01fbfy76L3h9OgKN+fNyMVPXj/0mGpWnxImjiM/2lqb3YOeT2Ca+NYQ==", + "version": "16.8.8", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.8.tgz", + "integrity": "sha512-xwEvyet96u7WnB96kqY0yY7qxx/pEpU51QeACkKFtrgjjXITQn0oO1iwPEraXVgh10ZFPix7gs1R4OJXF7P5sg==", "dev": true, "requires": { "@types/prop-types": "*", @@ -3784,9 +3778,9 @@ } }, "@types/react-dom": { - "version": "16.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.11.tgz", - "integrity": "sha512-x6zUx9/42B5Kl2Vl9HlopV8JF64wLpX3c+Pst9kc1HgzrsH+mkehe/zmHMQTplIrR48H2gpU7ZqurQolYu8XBA==", + "version": "16.8.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.8.2.tgz", + "integrity": "sha512-MX7n1wq3G/De15RGAAqnmidzhr2Y9O/ClxPxyqaNg96pGyeXUYPSvujgzEVpLo9oIP4Wn1UETl+rxTN02KEpBw==", "dev": true, "requires": { "@types/react": "*" @@ -3953,6 +3947,15 @@ "vscode-languageserver-types": "3.12.0" } }, + "atom-package-deps": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/atom-package-deps/-/atom-package-deps-5.0.0.tgz", + "integrity": "sha512-C5Z2V68GuZvuLowrqQ8O8+BE8P4Elhxuc6eZiZ0770CH2e2R/Ausz5VebbDxVOSedFwAaz3CzQJYHayqZ5wKQg==", + "requires": { + "sb-fs": "^3.0.0", + "semver": "^5.6.0" + } + }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", @@ -4246,6 +4249,18 @@ "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + } } }, "code-point-at": { @@ -4458,9 +4473,9 @@ } }, "csstype": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.1.tgz", - "integrity": "sha512-wv7IRqCGsL7WGKB8gPvrl+++HlFM9kxAM6jL1EXNPNTshEJYilMkbfS2SnuHha77uosp/YVK0wAp2jmlBzn1tg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.3.tgz", + "integrity": "sha512-rINUZXOkcBmoHWEyu7JdHu5JMzkGRoMX4ov9830WNgxf5UYxcBUO0QTKAqeJ5EZfSdlrcJYkC8WwfVW7JYi4yg==", "dev": true }, "currently-unhandled": { @@ -4595,9 +4610,9 @@ } }, "dompurify": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-1.0.8.tgz", - "integrity": "sha512-vetRFbN1SXSPfP3ClIiYnxTrXquSqakBEOoB5JESn0SVcSYzpu6ougjakpKnskGctYdlNpwf+riUHSkG7d4XUw==" + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-1.0.10.tgz", + "integrity": "sha512-huhl3DSWX5LaA7jDtnj3XQdJgWW1wYouNW7N0drGzQa4vEUSVWyeFN+Atx6HP4r5cang6oQytMom6I4yhGJj5g==" }, "dot-prop": { "version": "3.0.0", @@ -4617,6 +4632,12 @@ "readable-stream": "^2.0.2" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -4989,9 +5010,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stdin": { @@ -5665,6 +5686,11 @@ "text-extensions": "^1.0.0" } }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5708,6 +5734,11 @@ "integrity": "sha512-CpKJh9VRNhS+XqZtg1UMejETGEiqwCGDC/uwPEEQwc2nfdbSm73SIE29TplG2gLYuBOOTNDqxzG6A9NtEPLt0w==", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "js-yaml": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", @@ -5867,6 +5898,14 @@ "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", "dev": true }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -5924,9 +5963,10 @@ } }, "marked": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.0.tgz", - "integrity": "sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.1.tgz", + "integrity": "sha512-+H0L3ibcWhAZE02SKMqmvYsErLo4EAVJxu5h3bHBBDvvjeWXtl92rGUSBYHL2++5Y+RSNgl8dYOAXcYe7lp1fA==", + "dev": true }, "marked-terminal": { "version": "3.2.0", @@ -5956,13 +5996,13 @@ } }, "mem": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", - "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz", + "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", + "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" } }, @@ -6017,9 +6057,9 @@ "dev": true }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz", + "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==", "dev": true }, "minimatch": { @@ -9633,6 +9673,11 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -10014,6 +10059,16 @@ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -10054,6 +10109,33 @@ "strip-json-comments": "~2.0.1" } }, + "react": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.4.tgz", + "integrity": "sha512-0GQ6gFXfUH7aZcjGVymlPOASTuSjlQL4ZtVC5YKH+3JL6bBLCVO21DknzmaPlI90LN253ojj02nsapy+j7wIjg==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.4" + } + }, + "react-dom": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.4.tgz", + "integrity": "sha512-Ob2wK7XG2tUDt7ps7LtLzGYYB6DXMCLj0G5fO6WeEICtT4/HdpOi7W/xLzZnR6RCG1tYza60nMdqtxzA8FaPJQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.4" + } + }, + "react-is": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==" + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -10160,9 +10242,9 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve": { @@ -10254,10 +10336,33 @@ "ret": "~0.1.10" } }, + "sb-fs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sb-fs/-/sb-fs-3.0.0.tgz", + "integrity": "sha1-+9zdMBDoChuOJ0kM7zNgZJdCA7g=", + "requires": { + "sb-promisify": "^2.0.1", + "strip-bom-buf": "^1.0.0" + } + }, + "sb-promisify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz", + "integrity": "sha1-QnelR1RIiqlnXYhuNU24lMm9yYE=" + }, + "scheduler": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.4.tgz", + "integrity": "sha512-cvSOlRPxOHs5dAhP9yiS/6IDmVAVxmk33f0CtTJRkmUWcb1Us+t7b1wqdzoC0REw2muC9V5f1L/w5R5uKGaepA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, "semantic-release": { - "version": "15.13.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.13.3.tgz", - "integrity": "sha512-cax0xPPTtsxHlrty2HxhPql2TTvS74Ni2O8BzwFHxNY/mviVKEhI4OxHzBYJkpVxx1fMVj36+oH7IlP+SJtPNA==", + "version": "15.13.7", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-15.13.7.tgz", + "integrity": "sha512-5O+MulYrnjNOs3F0y5XQoyWqURGsR1w7R5sa/zOktsFHeJ0g1Cb2O4CIpKzkeBxVWXuPXhIuKrAw3dhHbE/gLQ==", "dev": true, "requires": { "@semantic-release/commit-analyzer": "^6.1.0", @@ -10272,20 +10377,20 @@ "execa": "^1.0.0", "figures": "^2.0.0", "find-versions": "^3.0.0", - "get-stream": "^4.0.0", + "get-stream": "^5.0.0", "git-log-parser": "^1.2.0", "hook-std": "^1.1.0", "hosted-git-info": "^2.7.1", "lodash": "^4.17.4", "marked": "^0.6.0", "marked-terminal": "^3.2.0", - "p-locate": "^3.0.0", - "p-reduce": "^1.0.0", + "p-locate": "^4.0.0", + "p-reduce": "^2.0.0", "read-pkg-up": "^4.0.0", "resolve-from": "^4.0.0", "semver": "^5.4.1", "signale": "^1.2.1", - "yargs": "^12.0.0" + "yargs": "^13.1.0" }, "dependencies": { "cosmiconfig": { @@ -10327,6 +10432,17 @@ "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } } }, "find-up": { @@ -10339,9 +10455,9 @@ } }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.0.0.tgz", + "integrity": "sha512-frc9F97ehylll1YI31eJRw5M21M86GCItj5U3S3hOEUa6JG6LtcvRKYDAtV/9E5lVasY8QJSPVsrMg/mbCSP5w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -10373,6 +10489,17 @@ "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" + }, + "dependencies": { + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + } } }, "p-limit": { @@ -10385,14 +10512,20 @@ } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.0.0.tgz", + "integrity": "sha512-IvOiDT1hbCdrsFKKXs8AGjxouEfn9VVdz/edtT08IDr+RIn2U/o3Xx+Agx455+CkSRdomMs3EN5BgR2Q0LZX0g==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, + "p-reduce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.0.0.tgz", + "integrity": "sha512-VcNNEqiYIkRCGeUHELY5dUrnQHCRwL6eIH/L9oSbl/PsvyHQXD1ws/MFwuEb+6dgH/URCfROVUqOYL37eHi2kQ==", + "dev": true + }, "p-try": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", @@ -10414,8 +10547,7 @@ "semver": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-compare": { "version": "1.0.0", @@ -10759,13 +10891,31 @@ } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", + "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "string_decoder": { @@ -10792,6 +10942,14 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, + "strip-bom-buf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", + "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=", + "requires": { + "is-utf8": "^0.2.1" + } + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -11231,23 +11389,22 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", "dev": true, "requires": { "cliui": "^4.0.0", - "decamelize": "^1.2.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" }, "dependencies": { "camelcase": { @@ -11300,9 +11457,9 @@ "dev": true }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/package.json b/package.json index 41b21e8..63df8f0 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "atom-ide-signature-help", + "main": "./lib/main.js", "version": "0.2.0", "description": "A replacement of the SignatureHelp functionality from the original Atom-IDE / Nuclide package developed by Facebook.", - "main": "./lib/main.js", "keywords": [ "atom-package", "atom-ide", @@ -13,10 +13,16 @@ "engines": { "atom": ">=1.0.0 <2.0.0" }, + "package-deps": [ + "atom-ide-markdown-service", + "busy-signal" + ], "dependencies": { - "dompurify": "^1.0.8", + "atom-package-deps": "^5.0.0", + "dompurify": "^1.0.10", "etch": "^0.14.0", - "marked": "^0.6.0" + "react": "^16.8.4", + "react-dom": "^16.8.4" }, "devDependencies": { "@commitlint/cli": "^7.5.2", @@ -25,15 +31,14 @@ "@semantic-release/apm-config": "^6.0.1", "@types/atom": "^1.31.1", "@types/dompurify": "0.0.32", - "@types/marked": "^0.6.0", "@types/node": "^10.12.18", - "@types/react": "^16.7.21", - "@types/react-dom": "^16.0.11", + "@types/react": "^16.8.8", + "@types/react-dom": "^16.8.2", "atom-languageclient": "^0.9.9", "commitlint": "^7.5.2", "husky": "^1.3.1", "prettier": "1.16.4", - "semantic-release": "^15.13.3" + "semantic-release": "^15.13.7" }, "release": { "extends": "@semantic-release/apm-config" @@ -62,5 +67,12 @@ "0.1.0": "provideSignatureHelp" } } + }, + "consumedServices": { + "markdown-renderer": { + "versions": { + "0.1.0": "consumeMarkdownRenderer" + } + } } } diff --git a/styles/atom-ide-signature-help-marked.less b/styles/atom-ide-signature-help-marked.less index 18ed63e..0ac3b2d 100644 --- a/styles/atom-ide-signature-help-marked.less +++ b/styles/atom-ide-signature-help-marked.less @@ -7,8 +7,8 @@ .datatip-marked-container { color: @syntax-text-color; - font-family: @font-family; - max-height: 300px; + font-family: var(--editor-font-family); + font-size: max(var(--editor-font-size), 0.9rem); max-width: 750px; overflow: auto; padding: 8px; @@ -22,31 +22,8 @@ :last-child { margin-bottom: 0; } -} - -.datatip-marked-text-editor-container { - padding: 2px 0 2px 4px; -} - -.datatip-marked-text-editor { - max-width: 500px; - max-height: 300px; - overflow: auto; -} - -.datatip-marked-text-editor atom-text-editor { - background-color: transparent; - min-width: 1em; // Hack to force the AtomTextEditor to properly size itself - - .editor-contents--private { - cursor: inherit!important; // Let the enclosing datatip override the cursor. - } - - // Prevent forced scroll bar in Atom 1.9.x - .scroll-view .horizontal-scrollbar { - display: none; - } - .scrollbar-corner { - display: none; + pre { + font-family: var(--editor-font-family); + font-size: max(var(--editor-font-size), 0.9rem); } } diff --git a/styles/atom-ide-signature-help.less b/styles/atom-ide-signature-help.less index 03424ae..eb91193 100644 --- a/styles/atom-ide-signature-help.less +++ b/styles/atom-ide-signature-help.less @@ -5,11 +5,13 @@ background: @app-background-color; box-shadow: 0px 1px 4px 0px rgba(0,0,0,1); color: @syntax-text-color; - font-family: Menlo, Monaco, Consolas, monospace; + font-size: 1rem; // some themes set font sizes on the root node margin-top: -2px; // Compensate for shadow position: relative; white-space: normal; pointer-events: all; + max-width: 800px; + overflow: none; } .datatip-overlay { @@ -23,10 +25,12 @@ background-color: @syntax-background-color; display: flex; position: relative; - max-width: 750px; - padding-left: 5px; - padding-right: 5px; + max-width: 800px; transition: background-color 0.15s ease; + padding: 8px; + white-space: pre-wrap; + font-family: var(--editor-font-family); + font-size: max(var(--editor-font-size), 0.9rem); &:hover { background-color: mix(@syntax-background-color, @syntax-selection-color, 50%); } @@ -46,31 +50,8 @@ } .datatip-marked-text-editor { + flex-grow: 1; .cursors { display: none; } } - -atom-text-editor { - - .datatip-highlight-region > .region { - // Use a faded version of the cursor color so as to have a distinction when - // overlapping with a selection (`@syntax-selection-color`). This element is - // on top of the selection element, so that will show through. - background: fade(@syntax-cursor-color, 10%); - } - - .datatip-highlight-region-active > .region { - // Animations such as `RotatingBackground` must be defined in a `*.atom-text-editor.less` file. - animation: RotatingBackground 1s ease-in-out infinite reverse; - background: linear-gradient( - 90deg, - @syntax-selection-color, - @syntax-background-color, - @syntax-selection-color, - @syntax-background-color - ); - background-size: 300% 100%; - } - -}