line-detector 0.1 → 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/line-detector.rb +63 -20
  3. data/lib/version.rb +1 -1
  4. metadata +1 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2cb9c2cf09d692bc7f86377e5968e9d84dec521e
4
- data.tar.gz: 0a2a951cdc2d1ccb5b4448a2d84f1178597da4c4
3
+ metadata.gz: cc7429071fc4b90421939e9f2efa635af6706ffd
4
+ data.tar.gz: 62d454bedea6b374d17ff18aa29aa5b7148ca624
5
5
  SHA512:
6
- metadata.gz: dcc51273493ad34388934add829d171db2d2c3f34ad5a5637e161c9c6b88e606d9f1949d54a5a4468317e24f06b835143c27346f3deeafaa656fd6d3db47d30f
7
- data.tar.gz: e98a57f9fa0f44f05a3987551ebaf95890db6e7318418e13e27ad97f8e46a65e01a8101a2f5efa46ce2af2ec094bc404804fecc8a3cb405c5160440b76506181
6
+ metadata.gz: d1ef12f759a63cf88182305b5eb334d7fff9accf0fe08968084e7ac9a35be8844962a7ab473793b741477dc26b4887dc59b714255a8fd8ec5c78c343448834ed
7
+ data.tar.gz: 0097e756cd16d68987f7a56fabb23f4cde41050de9d63dc86408f97d8b86c6634a35654cb423311c06b9188c07a39b3b79f2a2cd5d32e228a38287ffe95d110a
@@ -1,5 +1,4 @@
1
1
  require 'rubygems'
2
- require 'ptools'
3
2
 
4
3
  require 'version'
5
4
 
@@ -7,34 +6,78 @@ require 'version'
7
6
  # LineDetector - line ending detector
8
7
  #
9
8
  module LineDetector
10
- # Assumes input is not multi-line
11
- def self.detect_line_ending_of_line(line)
12
- if line =~ /\r\n/
13
- :crlf
14
- elsif line =~ /\n/
15
- :lf
16
- elsif line =~ /\r/
17
- :cr
18
- else
19
- :none
20
- end
21
- end
9
+ EOL_CHARACTERS = [
10
+ "\r",
11
+ "\n",
12
+ "\v",
13
+ "\f",
14
+ "\u2028",
15
+ "\u2029",
16
+ "\u0085"
17
+ ]
18
+
19
+ EOL2NAME = {
20
+ "\r\n" => :crlf,
21
+ "\n\r" => :lfcr,
22
+ "\n" => :lf,
23
+ "\r" => :cr,
24
+ "\v" => :vt,
25
+ "\f" => :ff,
26
+ "\u2028" => :ls,
27
+ "\u2029" => :ps,
28
+ "\u0085" => :nel
29
+ }
30
+
31
+ NAME2EOL = EOL2NAME.invert
22
32
 
33
+ #
34
+ # Detect line ending format of arbitrary text
35
+ #
36
+ # If text uses multiple line ending formats,
37
+ # Returns :mix.
38
+ #
23
39
  def self.detect_line_ending_of_text(text)
24
- line_endings = text.each_line.map do |line|
25
- detect_line_ending_of_line(line)
26
- end.uniq
40
+ line_endings = text.split(/[^#{EOL_CHARACTERS.join('')}]/)
41
+ .reject { |ending| ending == '' }
42
+ .map { |ending| ending.gsub(/(.+?)(\1)+/m, '\1') }
43
+ .uniq
27
44
 
28
- if line_endings == []
45
+ len = line_endings.length
46
+
47
+ if len == 0
29
48
  :none
30
- elsif line_endings.length == 1
31
- line_endings.first
49
+ elsif len == 1
50
+ EOL2NAME[line_endings.first] || :unknown
32
51
  else
33
52
  :mix
34
53
  end
35
54
  end
36
55
 
56
+ #
57
+ # Detect line ending format of a file
58
+ #
59
+ # Assumes file is a text file.
60
+ #
37
61
  def self.detect_line_ending_of_file(filename)
38
- detect_line_ending_of_text(open(filename))
62
+ detect_line_ending_of_text(open(filename).read)
63
+ end
64
+
65
+ #
66
+ # A more capable version of String#lines,
67
+ # that handles some of the more obscure line ending formats.
68
+ #
69
+ # If line ending format cannot be determined,
70
+ # returns :unknown.
71
+ #
72
+ def self.lines(text)
73
+ line_ending = detect_line_ending_of_text(text)
74
+
75
+ if line_ending == :unknown
76
+ line_ending
77
+ elsif line_ending == :none
78
+ [text]
79
+ else
80
+ text.split(NAME2EOL[line_ending])
81
+ end
39
82
  end
40
83
  end
@@ -2,5 +2,5 @@
2
2
  # LineDetector
3
3
  #
4
4
  module LineDetector
5
- VERSION = '0.1'
5
+ VERSION = '0.2'
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: line-detector
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Pennebaker
@@ -10,20 +10,6 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2014-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: ptools
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '1.2'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- version: '1.2'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rake
29
15
  requirement: !ruby/object:Gem::Requirement