pax_global_header00006660000000000000000000000064126753657530014535gustar00rootroot0000000000000052 comment=490eaf5c51a665ab3ff92862e22c085b54b7641e line-column-1.0.2/000077500000000000000000000000001267536575300137575ustar00rootroot00000000000000line-column-1.0.2/.editorconfig000066400000000000000000000003141267536575300164320ustar00rootroot00000000000000root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.md] indent_size = 4 trim_trailing_whitespace = false line-column-1.0.2/.gitignore000066400000000000000000000011361267536575300157500ustar00rootroot00000000000000# Created by https://www.gitignore.io/api/node ### Node ### # Logs logs *.log npm-debug.log* # Runtime data pids *.pid *.seed # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules jspm_packages # Optional npm cache directory .npm # Optional REPL history .node_repl_history line-column-1.0.2/.travis.yml000066400000000000000000000001221267536575300160630ustar00rootroot00000000000000sudo: false language: node_js script: gulp coverage after_success: gulp coveralls line-column-1.0.2/LICENSE000066400000000000000000000020671267536575300147710ustar00rootroot00000000000000Copyright (c) 2016 IRIDE Monad 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. line-column-1.0.2/README.md000066400000000000000000000102271267536575300152400ustar00rootroot00000000000000# line-column [![Build Status](https://travis-ci.org/io-monad/line-column.svg?branch=master)](https://travis-ci.org/io-monad/line-column) [![Coverage Status](https://coveralls.io/repos/github/io-monad/line-column/badge.svg?branch=master)](https://coveralls.io/github/io-monad/line-column?branch=master) [![npm version](https://badge.fury.io/js/line-column.svg)](https://badge.fury.io/js/line-column) Node module to convert efficiently index to/from line-column in a string. ## Install npm install line-column ## Usage ### lineColumn(str, options = {}) Returns a `LineColumnFinder` instance for given string `str`. #### Options | Key | Description | Default | | ------- | ----------- | ------- | | `origin` | The origin value of line number and column number | `1` | ### lineColumn(str, index) This is just a shorthand for `lineColumn(str).fromIndex(index)`. ### LineColumnFinder#fromIndex(index) Find line and column from index in the string. Parameters: - `index` - `number` Index in the string. (0-origin) Returns: - `{ line: x, col: y }` Found line number and column number. - `null` if the given index is out of range. ### LineColumnFinder#toIndex(line, column) Find index from line and column in the string. Parameters: - `line` - `number` Line number in the string. - `column` - `number` Column number in the string. or - `{ line: x, col: y }` - `Object` line and column numbers in the string.
A key name `column` can be used instead of `col`. or - `[ line, col ]` - `Array` line and column numbers in the string. Returns: - `number` Found index in the string. - `-1` if the given line or column is out of range. ## Example ```js var lineColumn = require("line-column"); var testString = [ "ABCDEFG\n", // line:0, index:0 "HIJKLMNOPQRSTU\n", // line:1, index:8 "VWXYZ\n", // line:2, index:23 "日本語の文字\n", // line:3, index:29 "English words" // line:4, index:36 ].join(""); // length:49 lineColumn(testString).fromIndex(3) // { line: 1, col: 4 } lineColumn(testString).fromIndex(33) // { line: 4, col: 5 } lineColumn(testString).toIndex(1, 4) // 3 lineColumn(testString).toIndex(4, 5) // 33 // Shorthand of .fromIndex (compatible with find-line-column) lineColumn(testString, 33) // { line:4, col: 5 } // Object or Array is also acceptable lineColumn(testString).toIndex({ line: 4, col: 5 }) // 33 lineColumn(testString).toIndex({ line: 4, column: 5 }) // 33 lineColumn(testString).toIndex([4, 5]) // 33 // You can cache it for the same string. It is so efficient. (See benchmark) var finder = lineColumn(testString); finder.fromIndex(33) // { line: 4, column: 5 } finder.toIndex(4, 5) // 33 // For 0-origin line and column numbers var oneOrigin = lineColumn(testString, { origin: 0 }); oneOrigin.fromIndex(33) // { line: 3, column: 4 } oneOrigin.toIndex(3, 4) // 33 ``` ## Testing npm test ## Benchmark The popular package [find-line-column](https://www.npmjs.com/package/find-line-column) provides the same "index to line-column" feature. Here is some benchmarking on `line-column` vs `find-line-column`. You can run this benchmark by `npm run benchmark`. See [benchmark/](benchmark/) for the source code. ``` long text + line-column (not cached) x 72,989 ops/sec ±0.83% (89 runs sampled) long text + line-column (cached) x 13,074,242 ops/sec ±0.32% (89 runs sampled) long text + find-line-column x 33,887 ops/sec ±0.54% (84 runs sampled) short text + line-column (not cached) x 1,636,766 ops/sec ±0.77% (82 runs sampled) short text + line-column (cached) x 21,699,686 ops/sec ±1.04% (82 runs sampled) short text + find-line-column x 382,145 ops/sec ±1.04% (85 runs sampled) ``` As you might have noticed, even not cached version of `line-column` is 2x - 4x faster than `find-line-column`, and cached version of `line-column` is remarkable 50x - 380x faster. ## Contributing 1. Fork it! 2. Create your feature branch: `git checkout -b my-new-feature` 3. Commit your changes: `git commit -am 'Add some feature'` 4. Push to the branch: `git push origin my-new-feature` 5. Submit a pull request :D ## License MIT (See LICENSE) line-column-1.0.2/benchmark/000077500000000000000000000000001267536575300157115ustar00rootroot00000000000000line-column-1.0.2/benchmark/benchmark.js000066400000000000000000000030071267536575300202010ustar00rootroot00000000000000"use strict"; var Benchmark = require("benchmark"); var findLineColumn = require("find-line-column"); var lineColumn = require("../lib/line-column"); var fs = require("fs"); var longText = fs.readFileSync(__dirname + "/long.txt").toString(); var shortText = fs.readFileSync(__dirname + "/short.txt").toString(); var cachedLineColumn1; var cachedLineColumn2; suite .add("long text + line-column (not cached)", function () { var index = Math.floor(Math.random() * longText.length); lineColumn(longText).fromIndex(index); }) .add("long text + line-column (cached)", function () { if (!cachedLineColumn1) cachedLineColumn1 = lineColumn(longText); var index = Math.floor(Math.random() * longText.length); cachedLineColumn1.fromIndex(index); }) .add("long text + find-line-column", function () { var index = Math.floor(Math.random() * longText.length); findLineColumn(longText, index); }) .add("short text + line-column (not cached)", function () { var index = Math.floor(Math.random() * shortText.length); lineColumn(shortText).fromIndex(index); }) .add("short text + line-column (cached)", function () { if (!cachedLineColumn2) cachedLineColumn2 = lineColumn(shortText); var index = Math.floor(Math.random() * shortText.length); cachedLineColumn2.fromIndex(index); }) .add("short text + find-line-column", function () { var index = Math.floor(Math.random() * shortText.length); findLineColumn(shortText, index); }) .on("cycle", function(event) { console.log(event.target.toString()); }) .run({ async: true }); line-column-1.0.2/benchmark/long.txt000066400000000000000000000450611267536575300174170ustar00rootroot00000000000000Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer eget nisi nec risus lacinia finibus vel in ligula. Suspendisse cursus eros nec suscipit tincidunt. Mauris eget ligula et justo lobortis gravida id sed nisi. Integer cursus elit non metus dictum iaculis. Morbi nec magna eget quam eleifend dignissim a id tortor. Nullam feugiat erat nec placerat blandit. In at erat viverra, gravida elit vitae, lacinia mauris. Vivamus quis erat nec ipsum malesuada malesuada ac et magna. Nullam tincidunt nunc ac pellentesque molestie. Sed vel lectus eget libero molestie feugiat a a ligula. Integer id urna at ex egestas suscipit ultricies id quam. Pellentesque tincidunt tellus non odio hendrerit, ac elementum nunc lacinia. Duis semper massa sit amet enim feugiat mattis. Maecenas maximus leo et facilisis bibendum. Phasellus in velit ut neque facilisis pretium. Sed id ex a tellus dignissim vulputate. Quisque vitae urna aliquam enim ultrices pellentesque eget eu purus. Nullam ultricies tortor et laoreet scelerisque. Duis sed orci ac sapien placerat dignissim. Quisque sit amet nibh ac eros tincidunt scelerisque nec vitae ipsum. Praesent id nisi nec orci malesuada vehicula. Mauris id nisi placerat, tempor lectus at, suscipit erat. Phasellus in tortor ac nibh viverra cursus quis non sem. Donec sit amet lacus at ante egestas tristique. Etiam nec leo et eros efficitur lobortis ut eu ex. Sed tincidunt eros sed eros sodales varius. Duis tristique ex nec massa mollis egestas. Integer ut felis sed lacus pharetra dapibus in ac nibh. Morbi id justo ut magna porta egestas a ac augue. Duis at ligula et urna convallis fringilla sit amet sit amet ipsum. Integer euismod enim in scelerisque viverra. Sed maximus tellus a lacus rutrum, molestie viverra dolor imperdiet. Suspendisse eu velit quis mauris iaculis condimentum. Pellentesque ultrices eros ac orci sodales malesuada. Donec viverra erat a dignissim dignissim. Donec luctus lorem vitae magna consequat accumsan. Fusce tempor tortor ut malesuada blandit. Cras id lacus porttitor, consequat nulla id, dapibus purus. Nunc pellentesque neque eu volutpat euismod. Quisque sed ipsum non ex viverra ultrices vitae ut neque. Integer ultricies eros sed ipsum commodo imperdiet. Ut at lectus pretium arcu ornare placerat eu ac magna. Nunc in quam dictum, cursus dui eget, ornare sem. Pellentesque id urna ac eros tincidunt gravida. Phasellus sollicitudin ante nec sem lacinia fringilla. Aenean scelerisque elit ac eros imperdiet volutpat. In vitae magna elementum, eleifend leo eget, pellentesque quam. Suspendisse condimentum lacus eget libero fringilla, in sagittis nunc rutrum. Nulla sed turpis vel dolor tristique pharetra. Aliquam finibus lorem vitae purus tristique, vel placerat nunc feugiat. Phasellus sit amet magna in arcu convallis ullamcorper. Aliquam ornare metus quis semper sollicitudin. Mauris cursus enim nec ex pulvinar, ut commodo est finibus. Aenean scelerisque nunc non odio gravida, eu posuere risus bibendum. Quisque venenatis ex vel ante ultrices bibendum. Pellentesque sit amet purus vel ex finibus vehicula. Etiam nec purus non elit feugiat consequat in bibendum nisi. Curabitur ullamcorper nunc fringilla porttitor congue. Praesent nec diam id mauris euismod aliquam. Maecenas fringilla tortor nec ipsum ultrices sodales. Fusce ut odio sed mi convallis semper nec id tortor. Donec dapibus neque in euismod ultricies. Duis posuere metus vitae urna egestas pretium. In eget lacus id velit molestie imperdiet id et felis. Curabitur efficitur dui eu enim ornare porttitor. Donec posuere nisi egestas, blandit risus eget, porttitor leo. Proin condimentum dolor a ex porttitor convallis. Sed pellentesque ex vitae facilisis blandit. In semper libero quis tempor sollicitudin. Suspendisse convallis dui ut nibh tempus scelerisque. Mauris nec lacus efficitur, tempor enim sit amet, tristique nisl. Quisque et ante sit amet dui scelerisque suscipit eget vel magna. Sed suscipit orci nec aliquet fermentum. Donec volutpat quam nec tincidunt convallis. In et urna quis nunc gravida consectetur ut quis odio. Nullam id urna quis elit hendrerit posuere et a nisi. Aliquam ultricies neque sed libero rutrum dignissim. Ut convallis quam vel elit tempus volutpat. Pellentesque porttitor purus et molestie fringilla. In tempor leo ut ex condimentum cursus. In eget neque ut eros bibendum fringilla facilisis in est. Sed euismod augue volutpat, aliquam tellus ac, sagittis sem. Praesent placerat justo porta dolor euismod, eget tincidunt lectus posuere. Praesent efficitur eros eget nibh auctor accumsan. Aenean egestas nulla id felis varius, in vehicula libero posuere. Pellentesque id tellus quis urna pharetra volutpat vel ut leo. Fusce sodales diam nec molestie laoreet. Praesent pretium ex sagittis nisi egestas pulvinar. Pellentesque ut magna porta, viverra tellus quis, suscipit velit. Donec vitae augue ac quam fringilla tempor. Pellentesque sit amet nulla ac leo dictum convallis vel at libero. Nullam aliquam est vel ligula mattis, sed semper ante aliquam. Nulla maximus quam sit amet elit hendrerit, vitae viverra turpis scelerisque. Fusce fringilla tellus eget leo pretium sollicitudin. Nullam a quam at sapien bibendum mattis nec id nunc. Sed at quam ut dolor tincidunt malesuada malesuada nec ante. Fusce aliquam odio sodales sem malesuada, dapibus iaculis purus rutrum. Proin id ante sit amet augue commodo imperdiet rutrum a odio. Quisque tempor mi ut ex dignissim vulputate. Phasellus non urna eget quam aliquet interdum in sit amet orci. Praesent mattis metus at vestibulum mattis. Curabitur dictum nisl ut leo volutpat, vel aliquet lacus elementum. Mauris et nunc sit amet neque semper lobortis ac in nulla. Suspendisse et mi at magna placerat tristique vel sit amet leo. Vestibulum vel ligula sed metus tristique laoreet. Proin quis justo quis metus eleifend pretium et vitae nulla. Sed interdum nunc sed ex porta, quis semper eros lobortis. Fusce non metus convallis, euismod est id, eleifend odio. Phasellus ut tellus placerat, euismod nulla in, lacinia nibh. Sed pellentesque mi a arcu mollis, vel accumsan massa rutrum. Etiam consectetur nulla in sollicitudin suscipit. Mauris et diam ut arcu vulputate aliquet. Phasellus malesuada libero et fringilla consectetur. Donec in odio eget velit scelerisque efficitur at non tellus. Curabitur a nibh mattis, viverra eros vel, condimentum metus. Sed nec augue ac lorem consectetur bibendum. Cras in ipsum scelerisque augue vulputate scelerisque id ut neque. Morbi aliquam mauris porttitor elit consectetur, sit amet varius ex mollis. Nunc semper metus quis lacus auctor, a ultrices sapien dignissim. Curabitur sed leo vitae dolor commodo accumsan ac vitae dui. Cras sed leo id arcu rutrum volutpat id a risus. Vestibulum ac arcu ornare, tincidunt tortor vel, sagittis neque. Phasellus lacinia augue at mauris varius, eget viverra lacus ullamcorper. Praesent feugiat purus et quam pulvinar scelerisque. Praesent eleifend ipsum ac sapien dignissim interdum. Etiam eu eros sed nisl luctus finibus. Morbi nec nunc lacinia, eleifend libero euismod, mollis lacus. Nam ac nunc at est laoreet bibendum quis eget ex. Nullam a risus id metus dictum vehicula. Suspendisse eget tortor eleifend, euismod dui eget, mattis metus. Morbi vitae velit vel magna dignissim tincidunt ac eget nisl. Nunc malesuada felis ac cursus volutpat. Mauris id nisl in mauris tincidunt vehicula eu eu nisl. Curabitur dapibus tellus eu neque maximus, nec vestibulum tellus blandit. Vestibulum eleifend quam at sem sagittis, laoreet porttitor massa euismod. Donec sagittis enim in nibh dapibus consequat. Vivamus scelerisque lacus commodo massa condimentum, eget tempor quam pretium. Duis vitae odio nec mi auctor volutpat vel sit amet lorem. Aliquam ac orci bibendum, posuere metus sit amet, mattis mauris. Aliquam non turpis vulputate tellus iaculis aliquet quis sit amet orci. Praesent quis risus non nisl ultrices accumsan id at est. Integer vitae orci vel lectus accumsan placerat. Fusce convallis arcu sit amet velit cursus, eu elementum nisl iaculis. Donec sit amet mi sit amet erat tristique dictum. In dapibus felis non fermentum dapibus. Aliquam et purus egestas, cursus turpis at, convallis libero. Ut in arcu ac elit iaculis ultricies vel vel augue. Vivamus ac libero id velit interdum vehicula non sit amet leo. Nunc mattis justo vel mollis pulvinar. Duis in diam eu nibh sollicitudin pharetra a vitae ante. Cras tempor est eget accumsan iaculis. Curabitur fringilla dolor et mauris laoreet, in bibendum erat tempus. Praesent nec diam iaculis odio consequat tempus. Integer sit amet diam non diam convallis interdum. Fusce vitae nunc maximus, malesuada orci nec, vestibulum velit. Nulla auctor est ut ex convallis, nec mattis orci lobortis. Suspendisse semper metus ac ex pellentesque, et ullamcorper augue lacinia. Quisque vel libero ornare, ornare augue faucibus, cursus sem. Cras gravida metus at ipsum laoreet pulvinar laoreet quis ante. Proin fringilla libero nec diam pharetra interdum. Suspendisse feugiat erat nec facilisis vulputate. Nunc cursus est eu purus gravida iaculis. Integer ut augue gravida elit sollicitudin hendrerit ac non ex. Donec consequat massa sed maximus tincidunt. Duis auctor elit ac turpis aliquam, eu finibus libero vestibulum. Fusce tristique diam et risus elementum, ut sagittis tortor mattis. In aliquam enim in malesuada iaculis. Ut et lacus et justo sagittis elementum. Nunc consectetur sem eget sapien fermentum viverra. Phasellus id libero at nibh ultricies elementum. Vestibulum at dui eu neque imperdiet laoreet ac in felis. Nullam dictum velit a iaculis aliquam. Duis ac risus non dui placerat lobortis. Sed sit amet urna et justo ultricies pellentesque sit amet tempus mi. Nam ac urna id orci sollicitudin eleifend eu in massa. Quisque condimentum turpis quis arcu dignissim, vel pretium nulla blandit. Integer lacinia erat a arcu lobortis dictum. Maecenas non nibh a ante porta euismod et ac urna. Nam venenatis ligula vitae justo efficitur malesuada. Pellentesque ut sem vitae sem egestas iaculis non sit amet neque. Proin at arcu eu mi ullamcorper maximus. Pellentesque ultrices risus sed diam viverra, quis ornare elit elementum. Donec commodo ex sed velit venenatis, vel efficitur turpis euismod. Ut sed lorem hendrerit, venenatis ex nec, congue massa. Duis efficitur lectus nec facilisis feugiat. Duis et dui id justo volutpat efficitur nec cursus tortor. Etiam ac augue vel metus rutrum posuere quis vel ipsum. Maecenas vitae urna sed sem elementum malesuada suscipit at augue. Morbi ultricies sapien quis dolor ultrices, ut semper dui suscipit. Suspendisse quis mi at erat sollicitudin luctus quis eu quam. Sed porta nulla sed tortor egestas blandit. Curabitur non est eget sapien venenatis vulputate quis at ipsum. Proin volutpat orci et nibh mattis, ut luctus metus pretium. Donec ut metus porttitor, aliquam quam ac, euismod lacus. Praesent nec felis rutrum mauris tempor pretium ut et ex. Nullam fringilla nulla molestie maximus lacinia. Sed vel nisi aliquet quam sagittis faucibus sit amet non massa. Morbi aliquam diam nec tincidunt posuere. Suspendisse id urna in mauris viverra euismod. Donec interdum tortor vitae dolor faucibus hendrerit. Curabitur fermentum mauris at euismod hendrerit. Vestibulum ac augue rhoncus, facilisis felis id, imperdiet erat. Sed et diam facilisis, maximus lacus id, vulputate lorem. Vivamus eget dui ornare, facilisis dui et, varius erat. Pellentesque ultricies elit vel gravida convallis. Duis dignissim nulla id varius semper. Pellentesque a felis efficitur, euismod lorem a, consectetur elit. Curabitur eleifend nibh sed mi scelerisque, quis condimentum turpis scelerisque. Integer eget sapien viverra, ullamcorper nibh sit amet, placerat orci. Nulla consectetur mi sit amet massa commodo, ultrices rutrum nulla euismod. Mauris eu nulla sollicitudin, dapibus est et, mattis ipsum. Proin ultricies nisl quis arcu rhoncus, sit amet tempor ligula tincidunt. Mauris bibendum purus non pretium tincidunt. Nunc varius nunc non ultrices auctor. Quisque gravida libero at est ultrices, a interdum eros consequat. Curabitur dapibus libero id elit aliquet, eu feugiat massa gravida. Curabitur in diam tincidunt arcu vulputate bibendum. Duis scelerisque sem pellentesque, congue diam in, efficitur diam. Fusce et elit finibus sem ultricies aliquam vitae vel massa. Suspendisse lobortis neque eget mauris volutpat sollicitudin. Nullam lobortis enim non erat sodales, ac aliquet ligula varius. Aenean ullamcorper diam vel enim feugiat bibendum sed in arcu. Aliquam at leo tristique, pharetra massa et, porttitor augue. Proin pellentesque metus in felis feugiat maximus. Mauris et ante quis lectus efficitur mattis. Donec sed ligula tempus, rutrum turpis non, pellentesque nunc. Fusce vitae nibh accumsan libero tristique egestas eu eget lorem. Nunc sit amet justo eget ligula suscipit porta. In eget magna ultricies, lobortis arcu id, pharetra magna. Donec id turpis ut lorem tristique vestibulum. Cras tristique nibh et dapibus molestie. Nulla nec lectus at orci cursus aliquet ut nec ex. Aenean tincidunt dolor at nisi efficitur, in tincidunt dui bibendum. Donec vestibulum nisi at laoreet malesuada. Duis aliquet odio a porta semper. Ut id odio vitae dolor dapibus ornare. Praesent mattis nulla vestibulum metus tincidunt, at porta enim condimentum. Nam sed orci at turpis suscipit consequat ac in leo. Aenean ut justo id ligula gravida luctus nec vel elit. Pellentesque ornare ante in suscipit euismod. Cras ut nunc vitae eros facilisis consequat. Suspendisse pretium dui id lectus aliquet vehicula. Donec posuere mauris vitae quam tempor molestie. Donec dapibus magna eget lectus posuere pulvinar. Morbi sed ante faucibus, molestie risus a, aliquet magna. Fusce quis purus tristique purus venenatis consectetur. Suspendisse rutrum nisl ornare nisi pharetra gravida. Fusce rhoncus ante vestibulum, porta arcu sit amet, hendrerit mauris. Aenean malesuada dolor a nunc sagittis, quis commodo nunc dapibus. Fusce nec augue tristique, efficitur nibh vitae, bibendum ligula. Fusce aliquam turpis sed tincidunt venenatis. Sed nec nisi eget justo scelerisque feugiat. Ut lacinia turpis sit amet tristique vehicula. Etiam et arcu vel risus pulvinar faucibus. Sed convallis felis non lectus euismod, sed feugiat ligula dapibus. Suspendisse rutrum velit consectetur, tempor dolor in, congue eros. Duis vel mi maximus elit faucibus pretium. Curabitur eu erat viverra, tristique elit quis, auctor neque. Praesent quis ipsum condimentum, pellentesque tellus nec, venenatis tellus. Vestibulum facilisis ex vel nunc placerat, vitae pulvinar libero viverra. Aliquam suscipit neque at eros tincidunt, aliquam elementum ligula viverra. Mauris consequat quam elementum metus euismod, sit amet interdum felis elementum. Etiam posuere lectus et nisi sagittis, id rutrum metus porttitor. Vivamus malesuada elit vitae orci sodales, ac lobortis elit suscipit. Mauris blandit justo sed est convallis, vel dapibus felis pellentesque. Sed dapibus enim eget elit scelerisque, eget accumsan augue consectetur. In accumsan magna vitae erat egestas, ut eleifend enim efficitur. Morbi at nibh non leo suscipit dapibus. Vestibulum et metus nec quam tincidunt rutrum non quis lacus. In vel nisi fermentum nisi rhoncus rhoncus a sit amet massa. Nullam cursus risus in orci lacinia accumsan. Quisque fermentum felis vel justo vehicula, quis tristique dolor tristique. Etiam interdum neque imperdiet eros ultricies, id bibendum lacus rutrum. Vivamus sit amet ligula ac dolor tincidunt vehicula. Proin sit amet metus tincidunt, viverra velit sit amet, scelerisque enim. Duis tristique augue et ipsum sagittis lacinia. Donec sagittis justo quis odio lobortis, quis consequat sem malesuada. Fusce sed mi non arcu accumsan fringilla ut nec mauris. Proin a elit dictum, cursus diam vitae, semper turpis. Nulla ultricies sapien eu odio malesuada, in pharetra tellus pharetra. Donec quis ligula in dolor posuere fringilla. Nam aliquam nunc in quam eleifend auctor. Cras ac tellus nec augue auctor tristique et nec turpis. Ut sit amet sapien nec erat congue ornare non ut massa. Mauris pulvinar nisl ut ligula interdum sodales. Phasellus semper lacus in sem pretium mattis. Maecenas quis dui sit amet mi malesuada euismod at id tellus. Cras blandit arcu ut felis sollicitudin accumsan. Suspendisse efficitur arcu id ullamcorper sollicitudin. Vestibulum at ex eu metus imperdiet posuere. Sed tristique erat eget ligula varius, eget pellentesque leo viverra. Pellentesque nec dolor vulputate, pretium felis vel, bibendum nisl. Morbi at nisi luctus, laoreet orci nec, pulvinar metus. Donec lobortis diam at urna commodo, consequat maximus nisl fringilla. Ut mattis mi id lorem pretium aliquam. Ut vitae mauris eget est mattis ultricies sed ut velit. Nulla tempor arcu a fermentum pharetra. Aliquam cursus urna nec purus eleifend, at ullamcorper eros egestas. Nulla lobortis purus eget dolor gravida ornare. Maecenas egestas arcu ut dolor sodales, vel tincidunt enim suscipit. Suspendisse id purus eu odio feugiat mollis. Aliquam ut ante interdum, dignissim nulla condimentum, eleifend nisl. Morbi commodo sapien eu dapibus sodales. Nulla vitae lectus ac est lobortis sollicitudin. Nullam varius risus quis tortor fermentum aliquet. Aenean eleifend elit ac varius dictum. Nullam non sapien volutpat, venenatis quam et, bibendum magna. Ut dapibus felis non fringilla bibendum. Nam tempor lorem ut tempus convallis. Phasellus vestibulum tortor sed tellus condimentum, ut lobortis turpis dapibus. Nunc vel augue eleifend, fringilla nulla a, lobortis justo. Nunc malesuada enim quis dui venenatis scelerisque. Sed quis sem id ante cursus malesuada eu dignissim risus. Cras ac arcu ac nulla molestie varius. Curabitur vestibulum orci nec suscipit ornare. Proin in sapien in lorem porttitor condimentum id ac risus. Praesent vehicula ipsum id nisi aliquet, vel consequat urna vehicula. Nulla a nisi ac elit scelerisque placerat. Maecenas suscipit massa sit amet metus aliquet, et suscipit ante efficitur. Nam ut ipsum at diam auctor lacinia. Vestibulum non nibh id ipsum placerat ornare. Etiam consectetur lorem sit amet quam pharetra scelerisque. Mauris mattis neque sagittis, tristique leo ac, pretium massa. Nam sit amet augue rutrum, interdum mi et, aliquam leo. Cras accumsan mauris mattis erat rutrum maximus. Morbi condimentum ante mattis, lacinia metus et, pellentesque nulla. Vestibulum suscipit risus et enim sollicitudin, nec suscipit nibh eleifend. Phasellus congue urna ut neque ornare rutrum. In non mauris ut ligula elementum sodales molestie a tortor. Nunc tincidunt elit eget libero blandit pulvinar. Nunc dictum lorem id varius convallis. Fusce tristique urna quis fermentum eleifend. Vestibulum consectetur odio eu eros dictum dictum. Curabitur aliquam ipsum quis commodo tempor. Proin fringilla eros pretium, fermentum ligula eget, dapibus metus. Pellentesque lobortis sem sed velit euismod interdum. Donec convallis justo id tempor pulvinar. line-column-1.0.2/benchmark/short.txt000066400000000000000000000007121267536575300176110ustar00rootroot00000000000000Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed consectetur ante non ipsum congue, eget pellentesque magna euismod. Maecenas in mi at nisi semper pellentesque. Donec vel nunc posuere, efficitur felis eu, suscipit sapien. Quisque ut nulla non dui dignissim tristique. Maecenas at mi sodales augue tincidunt sagittis ut porttitor ipsum. Proin venenatis risus sed velit congue molestie eget nec lorem. Mauris scelerisque odio vel ornare vestibulum.line-column-1.0.2/gulpfile.js000066400000000000000000000017141267536575300161270ustar00rootroot00000000000000"use strict"; var gulp = require("gulp"); var plumber = require("gulp-plumber"); var mocha = require("gulp-mocha"); var istanbul = require("gulp-istanbul"); var coveralls = require("gulp-coveralls"); gulp.task("default", ["coverage"]); gulp.task("watch", function () { gulp.watch(["lib/**", "test/**"], ["test"]); }); gulp.task("test", function () { return gulp.src("test/**/*.js", { read: false }) .pipe(mocha()); }); gulp.task("pre-coverage", function () { return gulp.src("lib/**/*.js") .pipe(istanbul()) .pipe(istanbul.hookRequire()); }); gulp.task("coverage", ["pre-coverage"], function (cb) { var mochaError; gulp.src("test/**/*.js", { read: false }) .pipe(plumber()) .pipe(mocha()) .on("error", function (err) { mochaError = err }) .pipe(istanbul.writeReports()) .on("end", function () { cb(mochaError) }); }); gulp.task("coveralls", function () { return gulp.src("coverage/lcov.info") .pipe(coveralls()); }); line-column-1.0.2/lib/000077500000000000000000000000001267536575300145255ustar00rootroot00000000000000line-column-1.0.2/lib/line-column.js000066400000000000000000000105121267536575300173040ustar00rootroot00000000000000/** * line-column - Convert efficiently index to/from line-column in a string * @module lineColumn * @license MIT */ "use strict"; var isArray = require("isarray"); var isObject = require("isobject"); var slice = Array.prototype.slice; module.exports = LineColumnFinder; /** * Finder for index and line-column from given string. * * You can call this without `new` operator as it returns an instance anyway. * * @class * @param {string} str - A string to be parsed. * @param {Object|number} [options] - Options. * This can be an index in the string for shorthand of `lineColumn(str, index)`. * @param {number} [options.origin=1] - The origin value of line and column. */ function LineColumnFinder(str, options) { if (!(this instanceof LineColumnFinder)) { if (typeof options === "number") { return (new LineColumnFinder(str)).fromIndex(options); } return new LineColumnFinder(str, options); } this.str = str || ""; this.lineToIndex = buildLineToIndex(this.str); options = options || {}; this.origin = typeof options.origin === "undefined" ? 1 : options.origin; } /** * Find line and column from index in the string. * * @param {number} index - Index in the string. (0-origin) * @return {Object|null} * Found line number and column number in object `{ line: X, col: Y }`. * If the given index is out of range, it returns `null`. */ LineColumnFinder.prototype.fromIndex = function (index) { if (index < 0 || index >= this.str.length || isNaN(index)) { return null; } var line = findLowerIndexInRangeArray(index, this.lineToIndex); return { line: line + this.origin, col: index - this.lineToIndex[line] + this.origin }; } /** * Find index from line and column in the string. * * @param {number|Object|Array} line - Line number in the string. * This can be an Object of `{ line: X, col: Y }`, or * an Array of `[line, col]`. * @param {number} [column] - Column number in the string. * This must be omitted or undefined when Object or Array is given * to the first argument. * @return {number} * Found index in the string. (always 0-origin) * If the given line or column is out of range, it returns `-1`. */ LineColumnFinder.prototype.toIndex = function (line, column) { if (typeof column === "undefined") { if (isArray(line) && line.length >= 2) { return this.toIndex(line[0], line[1]); } if (isObject(line) && "line" in line && ("col" in line || "column" in line)) { return this.toIndex(line.line, ("col" in line ? line.col : line.column)); } return -1; } if (isNaN(line) || isNaN(column)) { return -1; } line -= this.origin; column -= this.origin; if (line >= 0 && column >= 0 && line < this.lineToIndex.length) { var lineIndex = this.lineToIndex[line]; var nextIndex = ( line === this.lineToIndex.length - 1 ? this.str.length : this.lineToIndex[line + 1] ); if (column < nextIndex - lineIndex) { return lineIndex + column; } } return -1; } /** * Build an array of indexes of each line from a string. * * @private * @param str {string} An input string. * @return {number[]} Built array of indexes. The key is line number. */ function buildLineToIndex(str) { var lines = str.split("\n"), lineToIndex = new Array(lines.length), index = 0; for (var i = 0, l = lines.length; i < l; i++) { lineToIndex[i] = index; index += lines[i].length + /* "\n".length */ 1; } return lineToIndex; } /** * Find a lower-bound index of a value in a sorted array of ranges. * * Assume `arr = [0, 5, 10, 15, 20]` and * this returns `1` for `value = 7` (5 <= value < 10), * and returns `3` for `value = 18` (15 <= value < 20). * * @private * @param arr {number[]} An array of values representing ranges. * @param value {number} A value to be searched. * @return {number} Found index. If not found `-1`. */ function findLowerIndexInRangeArray(value, arr) { if (value >= arr[arr.length - 1]) { return arr.length - 1; } var min = 0, max = arr.length - 2, mid; while (min < max) { mid = min + ((max - min) >> 1); if (value < arr[mid]) { max = mid - 1; } else if (value >= arr[mid + 1]) { min = mid + 1; } else { // value >= arr[mid] && value < arr[mid + 1] min = mid; break; } } return min; } line-column-1.0.2/package.json000066400000000000000000000020721267536575300162460ustar00rootroot00000000000000{ "name": "line-column", "version": "1.0.2", "description": "Convert efficiently index to/from line-column in a string", "author": "IRIDE Monad ", "license": "MIT", "repository": "io-monad/line-column", "homepage": "https://github.com/io-monad/line-column", "bugs": { "url": "https://github.com/io-monad/line-column/issues" }, "keywords": [ "string", "index", "line", "column", "linecol", "position" ], "main": "lib/line-column.js", "files": [ "lib" ], "scripts": { "test": "gulp test", "watch": "gulp watch", "benchmark": "node benchmark/benchmark.js" }, "devDependencies": { "benchmark": "^2.1.0", "find-line-column": "^0.5.2", "gulp": "^3.9.1", "gulp-coveralls": "^0.1.4", "gulp-istanbul": "^0.10.3", "gulp-mocha": "^2.2.0", "gulp-plumber": "^1.1.0", "intelli-espower-loader": "^1.0.1", "istanbul": "^0.4.2", "mocha": "^2.4.5", "power-assert": "^1.3.1" }, "dependencies": { "isarray": "^1.0.0", "isobject": "^2.0.0" } } line-column-1.0.2/test/000077500000000000000000000000001267536575300147365ustar00rootroot00000000000000line-column-1.0.2/test/line-column-test.js000066400000000000000000000207001267536575300204720ustar00rootroot00000000000000"use strict"; var LineColumnFinder = require("../lib/line-column"); var assert = require("power-assert"); var testString = [ "ABCDEFG\n", // line:0, index:0 "HIJKLMNOPQRSTU\n", // line:1, index:8 "VWXYZ\n", // line:2, index:23 "日本語の文字\n", // line:3, index:29 "English words" // line:4, index:36 ].join(""); // length:49 describe("LineColumnFinder", function () { describe("#constructor", function () { it("can be called with new operator", function () { assert(new LineColumnFinder("TEST") instanceof LineColumnFinder); }); it("can be called without new operator", function () { assert(LineColumnFinder("TEST") instanceof LineColumnFinder); }); it("builds lineToIndex properly", function () { assert.deepEqual( LineColumnFinder(testString).lineToIndex, [0, 8, 23, 29, 36] ); }); it("can be shorthand for #fromIndex", function () { assert.deepEqual(LineColumnFinder(testString, 15), { line: 2, col: 8 }); }); it("can be called without arguments", function () { assert(LineColumnFinder() instanceof LineColumnFinder); }); }); describe("#fromIndex", function () { context("with 1-origin", function () { var lineColumn = LineColumnFinder(testString); it("returns line-column for the first line", function () { assert.deepEqual(lineColumn.fromIndex(3), { line: 1, col: 4 }); }); it("returns line-column for the middle line", function () { assert.deepEqual(lineColumn.fromIndex(15), { line: 2, col: 8 }); }); it("returns line-column for the line containing wide chars", function () { assert.deepEqual(lineColumn.fromIndex(33), { line: 4, col: 5 }); }); it("returns line-column for the last line", function () { assert.deepEqual(lineColumn.fromIndex(43), { line: 5, col: 8 }); }); it("returns line-column for the last character", function () { assert.deepEqual(lineColumn.fromIndex(48), { line: 5, col: 13 }); }); it("returns null for an index < 1", function () { assert(lineColumn.fromIndex(-1) === null); }); it("returns null for an index >= str.length", function () { assert(lineColumn.fromIndex(49) === null); }); it("returns null for a NaN index", function () { assert(lineColumn.fromIndex(NaN) === null); }); }); context("with 0-origin", function () { var lineColumn = LineColumnFinder(testString, { origin: 0 }); it("returns line-column for the first line", function () { assert.deepEqual(lineColumn.fromIndex(3), { line: 0, col: 3 }); }); it("returns line-column for the middle line", function () { assert.deepEqual(lineColumn.fromIndex(15), { line: 1, col: 7 }); }); it("returns line-column for the line containing wide chars", function () { assert.deepEqual(lineColumn.fromIndex(33), { line: 3, col: 4 }); }); it("returns line-column for the last line", function () { assert.deepEqual(lineColumn.fromIndex(43), { line: 4, col: 7 }); }); it("returns line-column for the last character", function () { assert.deepEqual(lineColumn.fromIndex(48), { line: 4, col: 12 }); }); it("returns null for an index < 0", function () { assert(lineColumn.fromIndex(-1) === null); }); it("returns null for an index >= str.length", function () { assert(lineColumn.fromIndex(49) === null); }); it("returns null for a NaN index", function () { assert(lineColumn.fromIndex(NaN) === null); }); }); }); describe("#toIndex", function () { context("with 1-origin", function () { var lineColumn = LineColumnFinder(testString); it("returns an index for the first line", function () { assert(lineColumn.toIndex(1, 4) === 3); }); it("returns an index for the middle line", function () { assert(lineColumn.toIndex(2, 8) === 15); }); it("returns an index for the line containing wide chars", function () { assert(lineColumn.toIndex(4, 5) === 33); }); it("returns an index for the last line", function () { assert(lineColumn.toIndex(5, 8) === 43); }); it("returns an index for the last character", function () { assert(lineColumn.toIndex(5, 13) === 48); }); it("allows column == line.length", function () { assert(lineColumn.toIndex(1, 8) === 7); }); it("accepts an Object of { line, col }", function () { assert(lineColumn.toIndex({ line: 2, col: 8 }) === 15); }); it("accepts an Object of { line, column }", function () { assert(lineColumn.toIndex({ line: 2, column: 8 }) === 15); }); it("accepts an Array of [ line, col ]", function () { assert(lineColumn.toIndex([2, 8]) === 15); }); it("returns -1 for line < 1", function () { assert(lineColumn.toIndex(0, 4) === -1); }); it("returns -1 for column < 1", function () { assert(lineColumn.toIndex(2, 0) === -1); }); it("returns -1 for line >= lines.length", function () { assert(lineColumn.toIndex(6, 1) === -1); }); it("returns -1 for column >= line.length", function () { assert(lineColumn.toIndex(1, 9) === -1); }); it("returns -1 for line + column >= str.length", function () { assert(lineColumn.toIndex(5, 14) === -1); }); it("returns -1 for missing column", function () { assert(lineColumn.toIndex(1) === -1); }); it("returns -1 for NaN line", function () { assert(lineColumn.toIndex(NaN, 1) === -1); }); it("returns -1 for NaN column", function () { assert(lineColumn.toIndex(1, NaN) === -1); }); }); context("with 0-origin", function () { var lineColumn = LineColumnFinder(testString, { origin: 0 }); it("returns an index for the first line", function () { assert(lineColumn.toIndex(0, 3) === 3); }); it("returns an index for the middle line", function () { assert(lineColumn.toIndex(1, 7) === 15); }); it("returns an index for the line containing wide chars", function () { assert(lineColumn.toIndex(3, 4) === 33); }); it("returns an index for the last line", function () { assert(lineColumn.toIndex(4, 7) === 43); }); it("returns an index for the first character", function () { assert(lineColumn.toIndex(0, 0) === 0); }); it("returns an index for the last character", function () { assert(lineColumn.toIndex(4, 12) === 48); }); it("allows column == line.length", function () { assert(lineColumn.toIndex(0, 7) === 7); }); it("accepts an Object of { line, col }", function () { assert(lineColumn.toIndex({ line: 1, col: 7 }) === 15); }); it("accepts an Object of { line, column }", function () { assert(lineColumn.toIndex({ line: 1, column: 7 }) === 15); }); it("accepts an Array of [ line, col ]", function () { assert(lineColumn.toIndex([1, 7]) === 15); }); it("returns an index for { line: 0, col: 0 }", function () { assert(lineColumn.toIndex({ line: 0, col: 0 }) === 0); }); it("returns an index for { line: 0, column: 0 }", function () { assert(lineColumn.toIndex({ line: 0, column: 0 }) === 0); }); it("returns an index for [ 0, 0 ]", function () { assert(lineColumn.toIndex([0, 0]) === 0); }); it("returns -1 for line < 0", function () { assert(lineColumn.toIndex(-1, 3) === -1); }); it("returns -1 for column < 0", function () { assert(lineColumn.toIndex(1, -1) === -1); }); it("returns -1 for line >= lines.length", function () { assert(lineColumn.toIndex(5, 0) === -1); }); it("returns -1 for column >= line.length", function () { assert(lineColumn.toIndex(0, 8) === -1); }); it("returns -1 for line + column >= str.length", function () { assert(lineColumn.toIndex(4, 13) === -1); }); it("returns -1 for missing column", function () { assert(lineColumn.toIndex(1) === -1); }); it("returns -1 for NaN line", function () { assert(lineColumn.toIndex(NaN, 1) === -1); }); it("returns -1 for NaN column", function () { assert(lineColumn.toIndex(1, NaN) === -1); }); }); }); }); line-column-1.0.2/test/mocha.opts000066400000000000000000000000401267536575300167260ustar00rootroot00000000000000--require intelli-espower-loader