├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── grammars └── diff.cson ├── package.json ├── settings └── language-diff.cson ├── spec ├── diff-spec.coffee └── settings-spec.coffee └── styles └── diff.less /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | ### Project specific config ### 2 | language: generic 3 | 4 | env: 5 | global: 6 | - APM_TEST_PACKAGES="" 7 | - ATOM_LINT_WITH_BUNDLED_NODE="true" 8 | 9 | matrix: 10 | - ATOM_CHANNEL=stable 11 | - ATOM_CHANNEL=beta 12 | 13 | os: 14 | - linux 15 | - osx 16 | 17 | ### Generic setup follows ### 18 | script: 19 | - curl -s -O https://raw.githubusercontent.com/atom/ci/master/build-package.sh 20 | - chmod u+x build-package.sh 21 | - ./build-package.sh 22 | 23 | notifications: 24 | email: 25 | on_success: never 26 | on_failure: change 27 | 28 | branches: 29 | only: 30 | - master 31 | 32 | git: 33 | depth: 10 34 | 35 | sudo: false 36 | 37 | dist: trusty 38 | 39 | addons: 40 | apt: 41 | packages: 42 | - build-essential 43 | - fakeroot 44 | - git 45 | - libsecret-1-dev 46 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # v.0.8.0 / Unreleased 2 | 3 | * [ENHANCEMENT] Update tests to support Atom 1.19 async methods 4 | * [ENHANCEMENT] Update CI suite from atom/ci 5 | 6 | # v.0.7.0 / 2017-01-11 7 | 8 | * [ENHANCEMENT] Remove deprecated Shadow DOM selectors, [#8][] [@Alhadis][] 9 | 10 | # v0.6.0 / 2016-10-09 11 | 12 | * [FEATURE] Prevent whitespace trimming during save, [#6][] [@FlorianFranzen][] 13 | * [ENHANCEMENT] Add spec testing suite via Travis, [@miketheman][] 14 | 15 | # v0.5.0 / 2016-10-01 16 | 17 | * [FEATURE] Highlight "Only in" lines, [@miketheman][] 18 | 19 | # v0.4.0 / 2015-11-11 20 | 21 | * [FEATURE] Adapt to syntax theme, [#4][] [@hironytic][] 22 | 23 | # v0.3.1 / 2015-08-13 24 | 25 | * [BUGFIX] Remove conflict with Atom CSS class, [#2][] [@mdeaudelin][] 26 | 27 | # v0.3.0 / 2015-03-01 28 | 29 | * [FEATURE] Add color styling, [#1][] [@silvenon][] 30 | 31 | # v0.2.0 / 2014-02-28 32 | 33 | * Initial Release 34 | 35 | # v0.1.0 / unreleased 36 | 37 | Initial commit 38 | 39 | 40 | [#1]: https://github.com/miketheman/language-diff/issues/1 41 | [#2]: https://github.com/miketheman/language-diff/issues/2 42 | [#4]: https://github.com/miketheman/language-diff/issues/4 43 | [#6]: https://github.com/miketheman/language-diff/issues/6 44 | [#8]: https://github.com/miketheman/language-diff/issues/8 45 | [@Alhadis]: https://github.com/Alhadis 46 | [@FlorianFranzen]: https://github.com/FlorianFranzen 47 | [@hironytic]: https://github.com/hironytic 48 | [@mdeaudelin]: https://github.com/mdeaudelin 49 | [@miketheman]: https://github.com/miketheman 50 | [@silvenon]: https://github.com/silvenon 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # language-diff package 2 | 3 | [![Build Status](https://travis-ci.org/miketheman/language-diff.svg?branch=master)](https://travis-ci.org/miketheman/language-diff) 4 | [![GitHub forks](https://img.shields.io/github/forks/miketheman/language-diff.svg)](https://github.com/miketheman/language-diff/network) 5 | [![GitHub stars](https://img.shields.io/github/stars/miketheman/language-diff.svg)](https://github.com/miketheman/language-diff/stargazers) 6 | [![GitHub issues](https://img.shields.io/github/issues/miketheman/language-diff.svg)](https://github.com/miketheman/language-diff/issues) 7 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmiketheman%2Flanguage-diff.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmiketheman%2Flanguage-diff?ref=badge_shield) 8 | 9 | Origin: Conversion of Textmate [`diff` bundle](https://github.com/textmate/diff.tmbundle) 10 | 11 | See [CHANGELOG.md](https://github.com/miketheman/language-diff/blob/master/CHANGELOG.md) for details. 12 | 13 | 14 | ## License 15 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fmiketheman%2Flanguage-diff.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fmiketheman%2Flanguage-diff?ref=badge_large) -------------------------------------------------------------------------------- /grammars/diff.cson: -------------------------------------------------------------------------------- 1 | 'fileTypes': [ 2 | 'diff' 3 | 'patch' 4 | 'rej' 5 | ] 6 | 'firstLineMatch': '(?x)^\n\t\t(===\\ modified\\ file\n\t\t|==== \\s* // .+ \\s - \\s .+ \\s+ ====\n\t\t|Index:\\ \n\t\t|---\\ [^%\\n]\n\t\t|\\*\\*\\*.*\\d{4}\\s*$\n\t\t|\\d+(,\\d+)* (a|d|c) \\d+(,\\d+)* $\n\t\t|diff\\ --git\\ \n\t\t|commit\\ [0-9a-f]{40}$\n\t\t)' 7 | 'name': 'Diff' 8 | 'patterns': [ 9 | { 10 | 'captures': 11 | '1': 12 | 'name': 'punctuation.definition.separator.diff' 13 | 'match': '^((\\*{15})|(={67})|(-{3}))$\\n?' 14 | 'name': 'meta.separator.diff' 15 | } 16 | { 17 | 'match': '^\\d+(,\\d+)*(a|d|c)\\d+(,\\d+)*$\\n?' 18 | 'name': 'meta.diff.range.normal' 19 | } 20 | { 21 | 'captures': 22 | '1': 23 | 'name': 'punctuation.definition.range.diff' 24 | '2': 25 | 'name': 'meta.toc-list.coordinates.diff' 26 | '3': 27 | 'name': 'punctuation.definition.range.diff' 28 | 'match': '^(@@)\\s*(.+?)\\s*(@@)($\\n?)?' 29 | 'name': 'meta.diff.range.unified' 30 | } 31 | { 32 | 'captures': 33 | '3': 34 | 'name': 'punctuation.definition.range.diff' 35 | '4': 36 | 'name': 'punctuation.definition.range.diff' 37 | '6': 38 | 'name': 'punctuation.definition.range.diff' 39 | '7': 40 | 'name': 'punctuation.definition.range.diff' 41 | 'match': '^(((\\-{3}) .+ (\\-{4}))|((\\*{3}) .+ (\\*{4})))$\\n?' 42 | 'name': 'meta.diff.range.context' 43 | } 44 | { 45 | 'match': '^diff --git a/.*$\\n?' 46 | 'name': 'meta.diff.header.git' 47 | } 48 | { 49 | 'match': '^diff (-|\\S+\\s+\\S+).*$\\n?' 50 | 'name': 'meta.diff.header.command' 51 | } 52 | { 53 | 'captures': 54 | '4': 55 | 'name': 'punctuation.definition.from-file.diff' 56 | '6': 57 | 'name': 'punctuation.definition.from-file.diff' 58 | '7': 59 | 'name': 'punctuation.definition.from-file.diff' 60 | 'match': '(^(((-{3}) .+)|((\\*{3}) .+))$\\n?|^(={4}) .+(?= - ))' 61 | 'name': 'meta.diff.header.from-file' 62 | } 63 | { 64 | 'captures': 65 | '2': 66 | 'name': 'punctuation.definition.to-file.diff' 67 | '3': 68 | 'name': 'punctuation.definition.to-file.diff' 69 | '4': 70 | 'name': 'punctuation.definition.to-file.diff' 71 | 'match': '(^(\\+{3}) .+$\\n?| (-) .* (={4})$\\n?)' 72 | 'name': 'meta.diff.header.to-file' 73 | } 74 | { 75 | 'captures': 76 | '3': 77 | 'name': 'punctuation.definition.inserted.diff' 78 | '6': 79 | 'name': 'punctuation.definition.inserted.diff' 80 | 'match': '^(((>)( .*)?)|((\\+).*))$\\n?' 81 | 'name': 'markup.inserted.diff' 82 | } 83 | { 84 | 'captures': 85 | '1': 86 | 'name': 'punctuation.definition.changed.diff' 87 | 'match': '^(!).*$\\n?' 88 | 'name': 'markup.changed.diff' 89 | } 90 | { 91 | 'captures': 92 | '3': 93 | 'name': 'punctuation.definition.deleted.diff' 94 | '6': 95 | 'name': 'punctuation.definition.deleted.diff' 96 | 'match': '^(((<)( .*)?)|((-).*))$\\n?' 97 | 'name': 'markup.deleted.diff' 98 | } 99 | { 100 | 'match': '^index [0-9a-f]{7,40}\\.\\.[0-9a-f]{7,40}.*$\\n?' 101 | 'name': 'meta.diff.index.git' 102 | } 103 | { 104 | 'captures': 105 | '1': 106 | 'name': 'punctuation.separator.key-value.diff' 107 | '2': 108 | 'name': 'meta.toc-list.file-name.diff' 109 | 'match': '^Index(:) (.+)$\\n?' 110 | 'name': 'meta.diff.index' 111 | } 112 | { 113 | 'match': '^Only in .*: .*$\\n?' 114 | 'name': 'meta.diff.only-in' 115 | } 116 | ] 117 | 'scopeName': 'source.diff' 118 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "language-diff", 3 | "version": "0.7.0", 4 | "private": true, 5 | "description": "Interact with *.diff files", 6 | "repository": "https://github.com/miketheman/language-diff", 7 | "license": "MIT", 8 | "engines": { 9 | "atom": ">=1.19.0 <2.0.0" 10 | }, 11 | "dependencies": {}, 12 | "devDependencies": { 13 | "temp": "^0.8.3" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /settings/language-diff.cson: -------------------------------------------------------------------------------- 1 | '.source.diff': 2 | whitespace: 3 | removeTrailingWhitespace: false 4 | -------------------------------------------------------------------------------- /spec/diff-spec.coffee: -------------------------------------------------------------------------------- 1 | describe 'Diff grammar', -> 2 | grammar = null 3 | 4 | beforeEach -> 5 | waitsForPromise -> 6 | atom.packages.activatePackage('language-diff') 7 | 8 | runs -> 9 | grammar = atom.grammars.grammarForScopeName('source.diff') 10 | 11 | it 'parses the grammar', -> 12 | expect(grammar).toBeDefined() 13 | expect(grammar.scopeName).toBe 'source.diff' 14 | 15 | it 'tokenizes spaces', -> 16 | {tokens} = grammar.tokenizeLine(' ') 17 | expect(tokens[0]).toEqual value: ' ', scopes: ['source.diff'] 18 | 19 | it 'tokenizes separators', -> 20 | {tokens} = grammar.tokenizeLine('***************') 21 | expect(tokens[0]).toEqual value: '***************', scopes: [ 22 | 'source.diff', 'meta.separator.diff', 'punctuation.definition.separator.diff' 23 | ] 24 | 25 | {tokens} = grammar.tokenizeLine('===================================================================') 26 | expect(tokens[0]).toEqual value: '===================================================================', scopes: [ 27 | 'source.diff', 'meta.separator.diff', 'punctuation.definition.separator.diff' 28 | ] 29 | 30 | {tokens} = grammar.tokenizeLine('---') 31 | expect(tokens[0]).toEqual value: '---', scopes: [ 32 | 'source.diff', 'meta.separator.diff', 'punctuation.definition.separator.diff' 33 | ] 34 | 35 | it 'tokenizes entries `Only in`', -> 36 | {tokens} = grammar.tokenizeLine('Only in new_version: a.txt') 37 | expect(tokens[0]).toEqual value: 'Only in new_version: a.txt', scopes: [ 38 | 'source.diff', 'meta.diff.only-in' 39 | ] 40 | -------------------------------------------------------------------------------- /spec/settings-spec.coffee: -------------------------------------------------------------------------------- 1 | path = require 'path' 2 | temp = require 'temp' 3 | 4 | describe 'Settings', -> 5 | editor = [] 6 | 7 | beforeEach -> 8 | directory = temp.mkdirSync() 9 | atom.project.setPaths([directory]) 10 | filePath = path.join(directory, 'atom.diff') 11 | 12 | waitsForPromise -> 13 | atom.workspace.open(filePath).then (o) -> editor = o 14 | waitsForPromise -> 15 | atom.packages.activatePackage('whitespace') 16 | waitsForPromise -> 17 | atom.packages.activatePackage('language-diff') 18 | 19 | it 'loads both packages', -> 20 | expect(atom.packages.isPackageActive('whitespace')).toBe true 21 | expect(atom.packages.isPackageActive('language-diff')).toBe true 22 | 23 | it 'sets the grammar', -> 24 | expect(editor.getGrammar().name).toBe 'Diff' 25 | 26 | it 'sets the whitespace config to false', -> 27 | expect(atom.config.get('whitespace.removeTrailingWhitespace', scope: ['.source.diff'])).toBe false 28 | 29 | it 'does not trim trailing whitespace', -> 30 | editor.insertText "+def fib(n, sequence = [1]) \n" 31 | waitsForPromise -> 32 | editor.save().then -> 33 | expect(editor.getText()).toBe "+def fib(n, sequence = [1]) \n" 34 | -------------------------------------------------------------------------------- /styles/diff.less: -------------------------------------------------------------------------------- 1 | @import "syntax-variables"; 2 | atom-text-editor { 3 | .syntax--diff { 4 | &.syntax--inserted { 5 | color: @syntax-color-added; 6 | } 7 | 8 | &.syntax--changed { 9 | color: @syntax-color-modified; 10 | } 11 | 12 | &.syntax--deleted { 13 | color: @syntax-color-removed; 14 | } 15 | 16 | &.syntax--only-in { 17 | // we don't have any methods in diff, so we can safely use this color 18 | color: @syntax-color-method; 19 | font-weight: bold; 20 | } 21 | } 22 | } 23 | --------------------------------------------------------------------------------