line-detector 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
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