From de1806ab2d900c4b96302d506f3f288f01c6e36f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frank=20Wikstr=C3=B6m?= Date: Wed, 12 Dec 2018 23:29:48 +0100 Subject: [PATCH] Initial commit --- .gitignore | 3 + CHANGELOG.md | 3 + LICENSE.md | 20 +++++ README.md | 52 +++++++++++ keymaps/latex-helper.json | 8 ++ lib/latex-helper.js | 66 ++++++++++++++ menus/latex-helper.json | 26 ++++++ package.json | 23 +++++ snippets/latex-helper.cson | 179 +++++++++++++++++++++++++++++++++++++ spec/latex-helper-spec.js | 73 +++++++++++++++ 10 files changed, 453 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 keymaps/latex-helper.json create mode 100644 lib/latex-helper.js create mode 100644 menus/latex-helper.json create mode 100644 package.json create mode 100644 snippets/latex-helper.cson create mode 100644 spec/latex-helper-spec.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ade14b9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +npm-debug.log +node_modules diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..c3d858c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.1.0 - First Release +* Every feature added +* Every bug fixed diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..34f61cb --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,20 @@ +Copyright (c) 2018 + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4269ce6 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# latex-helper package + +Extra LaTeX functionality in Atom + +Commands: + +* (cmd-l ,) "latex-helper:mathify-comma-list" + Split a comma list, wrapping each element in $ $. +* (cmd-l m) "latex-helper:convert-to-display-math" + Wrap selected text in display math \[ \] tags, + removing all $ from the selection. +* (cmd-l a") "latex-helper:convert-to-abs" + Wrap selected text in a \abs{} tag, removing any |, \mid + commands from the selection. (Written for editing Beta.) +* (, ,): "latex-helper:insert-backslash-comma" + Inserts \, when user types ,, + + +Snippets: + +* m -- \[ .. \] +* n -- $ .. $ +* ba -- \begin{align} .. \end{align} +* bal -- \begin{aligned} .. \end{aligned} +* be -- \begin{equation} .. \end{equation} +* tabu -- Beta table template +* tikz -- \begin{tikzpicture} .. \end{tikzpicture} +* marginfigure -- \begin{marginfigure} .. \end{marginfigure} +* axis -- Std TikZ axis drawing commands +* theorem -- \begin{theorem} .. \end{theorem} +* remark -- \begin{remark} .. \end{remark} +* definition -- \begin{definition} .. \end{definition} +* figure -- \begin{figure} .. \end{figure} +* frac -- \frac{}{} +* sum -- \sum_{}^{} +* prod -- \prod_{}^{} +* matrix -- \begin{matrix} .. \end{matrix} +* binom -- \binom{}{} +* chap -- \chapter{}\label{chap:} +* s -- \section{}\label{sec:} +* ss -- \subsection{}\label{ssec:} +* partial -- \frac{\partial }{\partial } +* set -- \set{ \where } +* labelled -- \begin{labelled} \item[] \end{labelled} +* item -- \item[] +* node -- \node at () { $$ }; +* big( -- \big( \big) +* Big( -- \Big( \Big) +* bigg( -- \bigg( \bigg) +* big[ -- \big[ \big] +* Big[ -- \Big[ \Big] +* bigg[ -- \bigg( \bigg] diff --git a/keymaps/latex-helper.json b/keymaps/latex-helper.json new file mode 100644 index 0000000..5170bbe --- /dev/null +++ b/keymaps/latex-helper.json @@ -0,0 +1,8 @@ +{ + "atom-text-editor[data-grammar='text tex latex']": { + "cmd-l ,": "latex-helper:mathify-comma-list", + "cmd-l m": "latex-helper:convert-to-display-math", + "cmd-l a": "latex-helper:convert-to-abs", + ", ,": "latex-helper:insert-backslash-comma" + } +} diff --git a/lib/latex-helper.js b/lib/latex-helper.js new file mode 100644 index 0000000..e037896 --- /dev/null +++ b/lib/latex-helper.js @@ -0,0 +1,66 @@ +'use babel'; + +import { CompositeDisposable } from 'atom'; + +export default { + + subscriptions: null, + + activate(state) { + + // Events subscribed to in atom's system can be easily cleaned up with a CompositeDisposable + this.subscriptions = new CompositeDisposable(); + + // Register command that toggles this view + this.subscriptions.add(atom.commands.add('atom-workspace', { + 'latex-helper:convert-to-display-math': () => this.convertToDisplayMath(), + 'latex-helper:convert-to-abs': () => this.convertToAbs(), + 'latex-helper:mathify-comma-list': () => this.mathifyList(), + 'latex-helper:insert-backslash-comma': () => this.insertBackslashComma(), + })); + }, + + deactivate() { + this.subscriptions.dispose(); + }, + + + convertToDisplayMath() { + const editor = atom.workspace.getActiveTextEditor() + if (editor) { + const selection = editor.getSelectedText() + const strippedText = selection.replace(/\$/g, '') + editor.insertText("\\[\n" + strippedText.trim() + "\n\\]") + } + }, + + convertToAbs() { + const editor = atom.workspace.getActiveTextEditor() + if (editor) { + const selection = editor.getSelectedText() + const strippedText = selection + .replace(/\\mid/g, '') + .replace(/\|/g,'') + .replace(/\\left/g,'') + .replace(/\\right/g,'') + editor.insertText("\\abs{" + strippedText.trim() + "}") + } + }, + + mathifyList() { + const editor = atom.workspace.getActiveTextEditor() + if (editor) { + const selection = editor.getSelectedText() + const items = selection.replace('$','').split(',').map((item) => item.trim()) + editor.insertText("$" + items.join('$, $') + "$") + } + }, + + insertBackslashComma() { + const editor = atom.workspace.getActiveTextEditor() + if (editor) { + editor.insertText('\\,') + } + }, + +}; diff --git a/menus/latex-helper.json b/menus/latex-helper.json new file mode 100644 index 0000000..12adb4a --- /dev/null +++ b/menus/latex-helper.json @@ -0,0 +1,26 @@ +{ + "context-menu": { + "atom-text-editor": [ + { + "label": "Toggle latex-helper", + "command": "latex-helper:toggle" + } + ] + }, + "menu": [ + { + "label": "Packages", + "submenu": [ + { + "label": "latex-helper", + "submenu": [ + { + "label": "Toggle", + "command": "latex-helper:toggle" + } + ] + } + ] + } + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a1f7e4d --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "latex-helper", + "main": "./lib/latex-helper", + "version": "0.0.0", + "description": "A short description of your package", + "keywords": [ + ], + "activationCommands": { + "atom-workspace": [ + "latex-helper:convert-to-display-math", + "latex-helper:insert-backslash-comma", + "latex-helper:mathify-comma-list", + "latex-helper:convert-to-abs" + ] + }, + "repository": "https://github.com/atom/latex-helper", + "license": "MIT", + "engines": { + "atom": ">=1.0.0 <2.0.0" + }, + "dependencies": { + } +} diff --git a/snippets/latex-helper.cson b/snippets/latex-helper.cson new file mode 100644 index 0000000..20aaf8c --- /dev/null +++ b/snippets/latex-helper.cson @@ -0,0 +1,179 @@ +'.text.tex.latex': + 'Insert display math': + 'prefix': 'm' + 'body': """ + \\\\[ + $1 + \\\\] + $2 + """ + 'Insert inline math': + 'prefix': 'n' + 'body': '\$$1\$ $2' + 'align environment': + 'prefix': 'ba' + 'body': """ + \\\\begin{align${1:*}} + $2 + \\\\end{align${1:*}} + $3 + """ + 'aligned environment': + 'prefix': 'bal' + 'body': """ + \\\\begin{aligned}${1:[t]} + $2 + \\\\end{aligned} + $3 + """ + 'Equations': + 'prefix': 'be' + 'body': """ + \\\\begin{equation${1:*}} + $2 + \\\\end{equation${1:*}} + $3 + """ + 'Tabu (beta)': + 'prefix': 'tabu' + 'body': """ + \\\\begingroup + \\\\pretable + \\\\begin{tabu}{$1} + \\\\tablehead + $2 + \\\\tablemain + $3 + \\\\tablebottom + \\\\end{tabu} + \\\\endgroup + """ + 'Insert TikZ picture:': + 'prefix': 'tikz', + 'body': """ + \\\\begin{tikzpicture} + $1 + \\\\end{tikzpicture} + """ + 'Insert marginfigure:': + 'prefix': 'marginfigure', + 'body': """ + \\\\begin{marginfigure} + $1 + \\\\end{marginfigure} + """ + 'Insert axis into TikZ picture': + 'prefix': 'axis', + 'body': """ + \\\\draw[-stealth] (${1:-1},0) -- (${2:3},0) node[above] {$x$}; + \\\\draw[-stealth] (0,${1:-1}) -- (${2:3},0) node[left] {$y$}; + $3 + """ + 'LaTeX theorem': + 'prefix': 'theorem', + 'body': """ + \\\\begin{theorem}\\\\label{thm:$1} + $2 + \\\\end{theorem}$3 + """ + 'LaTeX remark': + 'prefix': 'remark', + 'body': """ + \\\\begin{remark}\\\\label{remark:$1} + $2 + \\\\end{remark}$3 + """ + 'LaTeX definition': + 'prefix': 'definition', + 'body': """ + \\\\begin{definition}\\\\label{def:$1} + $2 + \\\\end{definition} + """ + 'LaTeX figure': + 'prefix': 'figure', + 'body': """ + \\\\begin{figure} + \\\\includegraphics{$1} + \\\\caption{$2}\\\\label{fig:$3} + \\\\end{figure}$4 + """ + 'LaTeX table (beta)': + 'prefix': 'table', + 'body': """ + \\\\begin{table} + \\\\pretable + \\\\caption{$1}\\\\label{table:$2} + \\\\begin{tabu}{$3} + \\\\tablehead + $4 + \\\\tablemain + $5 + \\\\tablebottom + \\\\end{tabu} + \\\\end{table} + """ + 'LaTeX fraction': + 'prefix': 'frac' + 'body': '\\\\frac{$1}{$2}$3' + 'LaTeX sum': + 'prefix': 'sum' + 'body': '\\\\sum_{${1:k=0}^{${2:\infty}} $3' + 'LaTeX product': + 'prefix': 'prod' + 'body': '\\\\prod{${1:k=0}^{${2:\infty}} $3' + 'LaTeX matrix': + 'prefix': 'matrix' + 'body': '\\\\begin{${1:b}matrix} $2 \\\\end{${1:b}matrix}' + 'LaTeX binomial': + 'prefix': 'binom' + 'body': '\\\\binom{$1}{$2}$3' + 'LaTeX chapter': + 'prefix': 'chapt' + 'body': '\\\\chapter{$1}\\\\label{chap:$1}$2' + 'LaTeX section': + 'prefix': 's' + 'body': '\\\\section{$1}\\\\label{sec:$1}$2' + 'LaTeX subsection': + 'prefix': 'ss' + 'body': '\\\\subsection{$1}\\\\label{subsec:$1}$2' + 'LaTeX partial derivative': + 'prefix': 'partial' + 'body': '\\\\frac{\\\\partial $1}{\\\\partial $2}$3' + 'LaTeX set builder (custom command)': + 'prefix': 'set' + 'body': '\\\\set{$1 \\\\where $2}$3' + 'width=marginparwidth': + 'prefix': 'ww' + 'body': '[width=\\\\marginparwidth]' + 'Labelled list (beta)': + 'prefix': 'labelled', + 'body':""" + \\\\begin{labelled}{${1:itlabel}} + \item[$2:] $3 + \\\\end{labelled} + """ + 'Insert item': + 'prefix': 'item', + 'body': '\\\\item[$1] $2' + 'TikZ node': + 'prefix': 'node', + 'body': '\\\\node ${1:(name)} at ($2) { $$3$ };$4' + 'Latex big ()': + 'prefix': 'big(', + 'body': '\\\\big( $1 \\\\big' + 'Latex big []': + 'prefix': 'big[', + 'body': '\\\\big[ $1 \\\\big' + 'Latex bigg ()': + 'prefix': 'bigg(', + 'body': '\\\\bigg( $1 \\\\bigg' + 'Latex bigg []': + 'prefix': 'bigg[', + 'body': '\\\\bigg[ $1 \\\\bigg' + 'Latex Big ()': + 'prefix': 'Big(', + 'body': '\\\\Big( $1 \\\\Big' + 'Latex big []': + 'prefix': 'Big[', + 'body': '\\\\Big[ $1 \\\\Big' diff --git a/spec/latex-helper-spec.js b/spec/latex-helper-spec.js new file mode 100644 index 0000000..045c7d7 --- /dev/null +++ b/spec/latex-helper-spec.js @@ -0,0 +1,73 @@ +'use babel'; + +import LatexHelper from '../lib/latex-helper'; + +// Use the command `window:run-package-specs` (cmd-alt-ctrl-p) to run specs. +// +// To run a specific `it` or `describe` block add an `f` to the front (e.g. `fit` +// or `fdescribe`). Remove the `f` to unfocus the block. + +describe('LatexHelper', () => { + let workspaceElement, activationPromise; + + beforeEach(() => { + workspaceElement = atom.views.getView(atom.workspace); + activationPromise = atom.packages.activatePackage('latex-helper'); + }); + + describe('when the latex-helper:toggle event is triggered', () => { + it('hides and shows the modal panel', () => { + // Before the activation event the view is not on the DOM, and no panel + // has been created + expect(workspaceElement.querySelector('.latex-helper')).not.toExist(); + + // This is an activation event, triggering it will cause the package to be + // activated. + atom.commands.dispatch(workspaceElement, 'latex-helper:toggle'); + + waitsForPromise(() => { + return activationPromise; + }); + + runs(() => { + expect(workspaceElement.querySelector('.latex-helper')).toExist(); + + let latexHelperElement = workspaceElement.querySelector('.latex-helper'); + expect(latexHelperElement).toExist(); + + let latexHelperPanel = atom.workspace.panelForItem(latexHelperElement); + expect(latexHelperPanel.isVisible()).toBe(true); + atom.commands.dispatch(workspaceElement, 'latex-helper:toggle'); + expect(latexHelperPanel.isVisible()).toBe(false); + }); + }); + + it('hides and shows the view', () => { + // This test shows you an integration test testing at the view level. + + // Attaching the workspaceElement to the DOM is required to allow the + // `toBeVisible()` matchers to work. Anything testing visibility or focus + // requires that the workspaceElement is on the DOM. Tests that attach the + // workspaceElement to the DOM are generally slower than those off DOM. + jasmine.attachToDOM(workspaceElement); + + expect(workspaceElement.querySelector('.latex-helper')).not.toExist(); + + // This is an activation event, triggering it causes the package to be + // activated. + atom.commands.dispatch(workspaceElement, 'latex-helper:toggle'); + + waitsForPromise(() => { + return activationPromise; + }); + + runs(() => { + // Now we can test for view visibility + let latexHelperElement = workspaceElement.querySelector('.latex-helper'); + expect(latexHelperElement).toBeVisible(); + atom.commands.dispatch(workspaceElement, 'latex-helper:toggle'); + expect(latexHelperElement).not.toBeVisible(); + }); + }); + }); +});