github-linguist 9.5.0 → 9.7.0

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 (157) hide show
  1. checksums.yaml +4 -4
  2. data/grammars/etc.json +1 -1
  3. data/grammars/gno.mod.json +1 -0
  4. data/grammars/markdown.mojo.codeblock.json +1 -0
  5. data/grammars/markdown.move.codeblock.json +1 -1
  6. data/grammars/source.4dm.json +1 -1
  7. data/grammars/source.abl.json +1 -1
  8. data/grammars/source.aleo.json +1 -0
  9. data/grammars/source.apex.json +1 -1
  10. data/grammars/source.astro.json +1 -1
  11. data/grammars/source.baml.json +1 -0
  12. data/grammars/source.bb.json +1 -1
  13. data/grammars/source.bird2.json +1 -0
  14. data/grammars/source.blueprint.json +1 -0
  15. data/grammars/source.bnd.json +1 -1
  16. data/grammars/source.brs.embedded.xml.json +1 -0
  17. data/grammars/source.bsl.json +1 -1
  18. data/grammars/source.c++.json +1 -1
  19. data/grammars/source.c.json +1 -1
  20. data/grammars/source.c3.json +1 -1
  21. data/grammars/source.carbon.json +1 -0
  22. data/grammars/source.cel.json +1 -0
  23. data/grammars/source.cl.json +1 -1
  24. data/grammars/source.clar.json +1 -1
  25. data/grammars/source.cmake.json +1 -1
  26. data/grammars/source.cmd.json +1 -1
  27. data/grammars/source.comment-string.wesl.json +1 -1
  28. data/grammars/source.comment-string.wgsl.json +1 -1
  29. data/grammars/source.cs.json +1 -1
  30. data/grammars/source.csswg.json +1 -1
  31. data/grammars/source.csv.json +1 -1
  32. data/grammars/source.curlrc.json +1 -1
  33. data/grammars/source.dart.json +1 -1
  34. data/grammars/source.daslang.json +1 -1
  35. data/grammars/source.data-weave.json +1 -1
  36. data/grammars/source.dds.dspf.json +1 -1
  37. data/grammars/source.dds.icff.json +1 -1
  38. data/grammars/source.dds.lf.json +1 -1
  39. data/grammars/source.dds.pf.json +1 -1
  40. data/grammars/source.dds.prtf.json +1 -1
  41. data/grammars/source.deq.json +1 -0
  42. data/grammars/source.emacs.lisp.json +1 -1
  43. data/grammars/source.fift.json +1 -0
  44. data/grammars/source.flix.json +1 -1
  45. data/grammars/source.fpp.json +1 -0
  46. data/grammars/source.func.json +1 -0
  47. data/grammars/source.gdscript.json +1 -1
  48. data/grammars/source.gedcom.json +1 -1
  49. data/grammars/source.gimprc.json +1 -0
  50. data/grammars/source.gimpres.json +1 -0
  51. data/grammars/source.gitconfig.json +1 -1
  52. data/grammars/source.gno.json +1 -0
  53. data/grammars/source.graphql.json +1 -1
  54. data/grammars/source.gtkrc.json +1 -0
  55. data/grammars/source.hack.json +1 -1
  56. data/grammars/source.hosts.json +1 -1
  57. data/grammars/source.hx.json +1 -1
  58. data/grammars/source.hxml.json +1 -1
  59. data/grammars/source.il.json +1 -0
  60. data/grammars/source.interp.json +1 -0
  61. data/grammars/source.jac.json +1 -1
  62. data/grammars/source.jactoml.json +1 -0
  63. data/grammars/source.jai.json +1 -1
  64. data/grammars/source.jass.json +1 -0
  65. data/grammars/source.julia.json +1 -1
  66. data/grammars/source.just.json +1 -1
  67. data/grammars/source.kcl.json +1 -1
  68. data/grammars/source.koka.json +1 -1
  69. data/grammars/source.lean4.markdown.json +1 -1
  70. data/grammars/source.leo.json +1 -1
  71. data/grammars/source.lobster.json +1 -0
  72. data/grammars/source.logos.json +1 -1
  73. data/grammars/source.luau.json +1 -1
  74. data/grammars/source.m2.json +1 -1
  75. data/grammars/source.m3u.json +1 -1
  76. data/grammars/source.matlab.json +1 -1
  77. data/grammars/source.mdx.astro.json +1 -1
  78. data/grammars/source.mi.json +1 -1
  79. data/grammars/source.mo.json +1 -1
  80. data/grammars/source.mojo.json +1 -1
  81. data/grammars/source.moonbit.config.json +1 -0
  82. data/grammars/source.moonbit.json +1 -1
  83. data/grammars/source.move.json +1 -1
  84. data/grammars/source.ms.json +1 -0
  85. data/grammars/source.nim.json +1 -1
  86. data/grammars/source.openqasm.json +1 -1
  87. data/grammars/source.opy.json +1 -0
  88. data/grammars/source.paperspecs.json +1 -0
  89. data/grammars/source.pic.json +1 -1
  90. data/grammars/source.pkgconf.json +1 -0
  91. data/grammars/source.pl.json +1 -0
  92. data/grammars/source.pnlgrp.json +1 -1
  93. data/grammars/source.powerquery.json +1 -0
  94. data/grammars/source.powershell.json +1 -1
  95. data/grammars/source.prisma.json +1 -1
  96. data/grammars/source.qsharp.json +1 -1
  97. data/grammars/source.quint.json +1 -0
  98. data/grammars/source.rarlist.json +1 -0
  99. data/grammars/source.rascript.json +1 -1
  100. data/grammars/source.record-jar.json +1 -1
  101. data/grammars/source.redscript.json +1 -0
  102. data/grammars/source.rego.json +1 -1
  103. data/grammars/source.rhai.json +1 -0
  104. data/grammars/source.rpg.json +1 -1
  105. data/grammars/source.rpgle.json +1 -1
  106. data/grammars/source.rust.json +1 -1
  107. data/grammars/source.scala.json +1 -1
  108. data/grammars/source.slang.json +1 -1
  109. data/grammars/source.slint.json +1 -1
  110. data/grammars/source.smithy.json +1 -1
  111. data/grammars/source.soql.json +1 -1
  112. data/grammars/source.spicedb-yaml.json +1 -0
  113. data/grammars/source.spicedb.json +1 -0
  114. data/grammars/source.stan.json +1 -1
  115. data/grammars/source.stim.json +1 -0
  116. data/grammars/source.surrealql.json +1 -1
  117. data/grammars/source.swift.json +1 -1
  118. data/grammars/source.tasm.json +1 -0
  119. data/grammars/source.tlb.json +1 -0
  120. data/grammars/source.tolk.json +1 -0
  121. data/grammars/source.ucode-template.json +1 -0
  122. data/grammars/source.ucode.json +1 -0
  123. data/grammars/source.uri-list.json +1 -0
  124. data/grammars/source.v.json +1 -1
  125. data/grammars/source.vento.json +1 -1
  126. data/grammars/source.verse.json +1 -0
  127. data/grammars/source.vespaSchema.json +1 -0
  128. data/grammars/source.vhs.json +1 -0
  129. data/grammars/source.wgsl.json +1 -1
  130. data/grammars/source.yaml.salt.json +1 -1
  131. data/grammars/spicedb-yaml.injection.json +1 -0
  132. data/grammars/text.bbcode.json +1 -0
  133. data/grammars/text.cachedir.json +1 -0
  134. data/grammars/text.cookie-jar.json +1 -0
  135. data/grammars/text.html.handlebars.json +1 -1
  136. data/grammars/text.html.vue.json +1 -1
  137. data/grammars/text.mac-tts.json +1 -0
  138. data/grammars/text.recfile.json +1 -0
  139. data/grammars/text.roff.json +1 -1
  140. data/grammars/version +1 -1
  141. data/lib/linguist/VERSION +1 -1
  142. data/lib/linguist/blob_helper.rb +19 -0
  143. data/lib/linguist/classifier.rb +2 -1
  144. data/lib/linguist/generated.rb +40 -0
  145. data/lib/linguist/generic.yml +3 -0
  146. data/lib/linguist/heuristics.yml +97 -5
  147. data/lib/linguist/language.rb +13 -9
  148. data/lib/linguist/languages.yml +368 -37
  149. data/lib/linguist/languages_data.rb +7663 -0
  150. data/lib/linguist/lazy_blob.rb +25 -2
  151. data/lib/linguist/samples.rb +4 -10
  152. data/lib/linguist/samples_data.rb +196100 -0
  153. data/lib/linguist/vendor.yml +3 -0
  154. metadata +54 -18
  155. data/grammars/markdown.bicep.codeblock.json +0 -1
  156. data/lib/linguist/languages.json +0 -1
  157. data/lib/linguist/samples.json +0 -1
data/grammars/version CHANGED
@@ -1 +1 @@
1
- 9.5.0
1
+ 9.7.0
data/lib/linguist/VERSION CHANGED
@@ -1 +1 @@
1
- 9.5.0
1
+ 9.7.0
@@ -119,6 +119,24 @@ module Linguist
119
119
  @detect_encoding ||= CharlockHolmes::EncodingDetector.new.detect(data) if data
120
120
  end
121
121
 
122
+ # Public: Is the blob content a Git LFS pointer file?
123
+ #
124
+ # Return true or false
125
+ def lfs_pointer?
126
+ return false unless data
127
+
128
+ data.start_with?("version https://git-lfs.github.com/spec/v1\n") &&
129
+ data.include?("\noid sha256:") &&
130
+ data.match?(/\nsize \d+\n?\z/)
131
+ end
132
+
133
+ # Public: Is the blob path tracked by Git LFS?
134
+ #
135
+ # Return true or false
136
+ def lfs_tracked?
137
+ false
138
+ end
139
+
122
140
  # Public: Is the blob binary?
123
141
  #
124
142
  # Return true or false
@@ -380,6 +398,7 @@ module Linguist
380
398
  !vendored? &&
381
399
  !documentation? &&
382
400
  !generated? &&
401
+ !(lfs_tracked? && lfs_pointer?) &&
383
402
  language && ( defined?(detectable?) && !detectable?.nil? ?
384
403
  detectable? :
385
404
  DETECTABLE_TYPES.include?(language.type)
@@ -136,7 +136,8 @@ module Linguist
136
136
 
137
137
  scores = {}
138
138
  languages.each do |language|
139
- centroid = @centroids[language]
139
+ fs_name = Language.find_by_name(language).fs_name
140
+ centroid = @centroids[fs_name || language]
140
141
  score = Classifier.similarity(vec, centroid)
141
142
  if score > 0.0
142
143
  scores[language] = score
@@ -92,11 +92,15 @@ module Linguist
92
92
  pipenv_lock? ||
93
93
  gradle_wrapper? ||
94
94
  maven_wrapper? ||
95
+ mise_lock? ||
96
+ secrets_baseline? ||
97
+ julia_manifest? ||
95
98
  generated_go? ||
96
99
  generated_protocol_buffer_from_go? ||
97
100
  generated_protocol_buffer? ||
98
101
  generated_javascript_protocol_buffer? ||
99
102
  generated_typescript_protocol_buffer? ||
103
+ generated_twirp_ruby? ||
100
104
  generated_apache_thrift? ||
101
105
  generated_jni_header? ||
102
106
  vcr_cassette? ||
@@ -398,6 +402,21 @@ module Linguist
398
402
  return lines[0].include?("Code generated by protoc-gen-ts_proto. DO NOT EDIT.")
399
403
  end
400
404
 
405
+ # Internal: Is the blob a Ruby source file generated by the
406
+ # protoc-gen-twirp_ruby plugin?
407
+ #
408
+ # Files generated by protoc-gen-twirp_ruby start with a header like:
409
+ #
410
+ # # Code generated by protoc-gen-twirp_ruby 1.14.1, DO NOT EDIT.
411
+ #
412
+ # Returns true or false.
413
+ def generated_twirp_ruby?
414
+ return false unless extname == ".rb"
415
+ return false unless lines.count > 1
416
+
417
+ return lines.first(3).any? { |l| l.include?("Code generated by protoc-gen-twirp_ruby") && l.include?("DO NOT EDIT.") }
418
+ end
419
+
401
420
  APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php']
402
421
 
403
422
  # Internal: Is the blob generated by Apache Thrift compiler?
@@ -582,6 +601,27 @@ module Linguist
582
601
  !!name.match(/(?:^|\/)mvnw(?:\.cmd)?$/i)
583
602
  end
584
603
 
604
+ # Internal: Is the blob a mise-en-place lock file?
605
+ #
606
+ # Returns true or false.
607
+ def mise_lock?
608
+ !!name.match(/(?:^|\/)mise(?:\.[^\/]+)?\.lock$/)
609
+ end
610
+
611
+ # Internal: Is the blob a detect-secrets baseline file?
612
+ #
613
+ # Returns true or false.
614
+ def secrets_baseline?
615
+ !!name.match(/(?:^|\/)\.secrets\.baseline$/)
616
+ end
617
+
618
+ # Internal: Is the blob a Julia Manifest.toml file?
619
+ #
620
+ # Returns true or false.
621
+ def julia_manifest?
622
+ !!name.match(/(?:^|\/)(Julia)?Manifest(-v\d+\.\d+)?\.toml$/)
623
+ end
624
+
585
625
  # Is the blob a VCR Cassette file?
586
626
  #
587
627
  # Returns true or false
@@ -19,9 +19,12 @@ extensions:
19
19
  - ".app"
20
20
  - ".cmp"
21
21
  - ".msg"
22
+ - ".network"
22
23
  - ".resource"
24
+ - ".sd"
23
25
  - ".sol"
24
26
  - ".srv"
25
27
  - ".stl"
26
28
  - ".tag"
29
+ - ".target"
27
30
  - ".url"
@@ -65,8 +65,20 @@ disambiguations:
65
65
  rules:
66
66
  # AL pattern source from https://github.com/microsoft/AL/blob/master/grammar/alsyntax.tmlanguage - keyword.other.applicationobject.al
67
67
  - language: AL
68
- and:
69
- - pattern: '\b(?i:(CODEUNIT|PAGE|PAGEEXTENSION|PAGECUSTOMIZATION|DOTNET|ENUM|ENUMEXTENSION|VALUE|QUERY|REPORT|TABLE|TABLEEXTENSION|XMLPORT|PROFILE|CONTROLADDIN|REPORTEXTENSION|INTERFACE|PERMISSIONSET|PERMISSIONSETEXTENSION|ENTITLEMENT))\b'
68
+ pattern:
69
+ # An object declaration, "<kind> <id> <name>", starting a line, with the
70
+ # name required. The anchor matters: page and table are common Perl
71
+ # variable names and "Table of contents" is ordinary prose, so matching
72
+ # these keywords anywhere would claim Perl AutoLoader chunks.
73
+ # AL tooling commonly writes a UTF-8 BOM. It cannot be matched as bytes
74
+ # here: blob data is ASCII-8BIT, and a pattern containing the BOM bytes
75
+ # compiles to a UTF-8 Regexp, which raises Encoding::CompatibilityError.
76
+ # \A\W{0,3} skips it, the same way the B4X rule below does.
77
+ - '(?:\A\W{0,3}|^)\s*(?i:(CODEUNIT|PAGE|PAGEEXTENSION|PAGECUSTOMIZATION|ENUM|ENUMEXTENSION|QUERY|REPORT|REPORTEXTENSION|TABLE|TABLEEXTENSION|XMLPORT|PROFILE|PROFILEEXTENSION|CONTROLADDIN|INTERFACE|PERMISSIONSET|PERMISSIONSETEXTENSION|ENTITLEMENT))\b\s+(?:\d|"|[A-Z])'
78
+ # DotNet alias objects are a bare keyword on their own line
79
+ - '(?:\A\W{0,3}|^)\s*(?i:DOTNET)\s*$'
80
+ # Namespace and using declarations, always terminated with a semicolon
81
+ - '(?:\A\W{0,3}|^)\s*(?i:(NAMESPACE|USING))\s+[\w.]+\s*;'
70
82
  # Open-ended fallback to Perl AutoLoader
71
83
  - language: Perl
72
84
  - extensions: ['.alg']
@@ -107,6 +119,15 @@ disambiguations:
107
119
  - language: LTspice Symbol
108
120
  pattern: '^SymbolType[ \t]'
109
121
  - language: Asymptote
122
+ - extensions: ['.b']
123
+ rules:
124
+ - language: B
125
+ pattern: '^\s*(?:extrn|auto|goto)\b'
126
+ negative_pattern: '^\s*(?:implement|include|load|ref)\b'
127
+ - language: Brainfuck
128
+ pattern: '(>\+>|>\+<)'
129
+ - language: Limbo
130
+ pattern: '(?:^\w+\s*:\s*module\s*\{)|(implement \w+;)'
110
131
  - extensions: ['.bas']
111
132
  rules:
112
133
  - language: B4X
@@ -209,6 +230,14 @@ disambiguations:
209
230
  rules:
210
231
  - language: Gerber Image
211
232
  pattern: '^[DGMT][0-9]{2}\*(?:\r?\n|\r)'
233
+ - extensions: ['.container', '.mount', '.network', '.service', '.socket', '.target', '.timer']
234
+ rules:
235
+ - language: INI
236
+ and:
237
+ # e.g., "[foobar]" or "# [commented out]"
238
+ - pattern: '^[#\s]*\[[^\]]+\]\s*$'
239
+ - named_pattern: key_equals_value
240
+ - negative_pattern: '^[^#;=\[]+[^ \r\n=]$'
212
241
  - extensions: ['.cs']
213
242
  rules:
214
243
  - language: Smalltalk
@@ -272,6 +301,11 @@ disambiguations:
272
301
  pattern: '^\s*(?:%%|main\s*\(.*?\)\s*->)'
273
302
  - language: JavaScript
274
303
  pattern: '\/\/|["'']use strict["'']|export\s+default\s|\/\*(?:.|[\r\n])*?\*\/'
304
+ - extensions: ['.eslintrc']
305
+ rules:
306
+ - language: YAML
307
+ named_pattern: yaml
308
+ - language: JSON with Comments
275
309
  - extensions: ['.ex']
276
310
  rules:
277
311
  - language: Elixir
@@ -295,6 +329,15 @@ disambiguations:
295
329
  pattern: '^: '
296
330
  - language: Fortran
297
331
  named_pattern: fortran
332
+ - extensions: ['.fpp']
333
+ rules:
334
+ - language: FPP
335
+ pattern:
336
+ - '^\s*(active|passive|queued)\s+component\s'
337
+ - '^\s*(module|topology|struct|enum|port|interface)\s+[A-Za-z_$][A-Za-z0-9_]*\s*\{'
338
+ - '^\s*instance\s+[A-Za-z_$][A-Za-z0-9_]*\s*:'
339
+ - language: Fortran
340
+ named_pattern: fortran
298
341
  - extensions: ['.fr']
299
342
  rules:
300
343
  - language: Forth
@@ -434,6 +477,17 @@ disambiguations:
434
477
  pattern:
435
478
  - '^(?i)[^"m]*mov\s+[^\s]+,'
436
479
  - '^\s+(?i)db\s+[a-z\d]'
480
+ - extensions: ['.j']
481
+ rules:
482
+ - language: Jasmin
483
+ pattern: '^\s*\.(?:class|super|method|end\s+method|limit|field|source|bytecode)\b'
484
+ - language: Objective-J
485
+ pattern: '^\s*@(?:import|implementation|protocol|interface|typedef|end)\b'
486
+ - language: JASS
487
+ pattern:
488
+ - '^\s*(?:constant\s+)?(?:function|native)\s+\w+\s+takes\b'
489
+ - '^\s*end(?:function|globals|loop)\s*$'
490
+ - '^\s*(?:call|set|local|exitwhen)\s+\S'
437
491
  - extensions: ['.json']
438
492
  rules:
439
493
  - language: OASv2-json
@@ -472,7 +526,7 @@ disambiguations:
472
526
  - extensions: ['.lp']
473
527
  rules:
474
528
  - language: Lambdapi
475
- pattern: '(?:^|\s)symbol(?:$|\s)|(?:^|\s)rule(?:$|\s)'
529
+ pattern: '^\s*(?:opaque\s+symbol|symbol|rule|notation|constant|injective|require(?:\s+open)?|open|type|assert(?:not)?|compute)\b'
476
530
  - language: Linear Programming
477
531
  pattern: '(?i)^\s*(?:minimize|minimum|min|maximize|maximum|max)(?:\s+multi-objectives)?\s*$'
478
532
  - language: Answer Set Programming
@@ -572,6 +626,8 @@ disambiguations:
572
626
  and:
573
627
  - negative_pattern: '/\*'
574
628
  - pattern: '^\s*\.(?:include\s|globa?l\s|[A-Za-z][_A-Za-z0-9]*:)'
629
+ - language: MiniScript
630
+ pattern: '^\s*\bend (?:function|while|if|for)\b|\s\b(?:isa)\b\s'
575
631
  - language: MAXScript
576
632
  - extensions: ['.msg']
577
633
  rules:
@@ -637,6 +693,15 @@ disambiguations:
637
693
  pattern:
638
694
  - '(?i)\bDEFINE\s+(?:VARIABLE|TEMP-TABLE|BUFFER|QUERY|INPUT\s+PARAMETER|OUTPUT\s+PARAMETER)\b'
639
695
  - '(?i)\bEND(?:\s+(?:PROCEDURE|FUNCTION|DO|FOR\s+EACH))?\.'
696
+ - extensions: ['.pc']
697
+ rules:
698
+ - language: Pro*C
699
+ pattern: '^\s*EXEC\s+SQL\s'
700
+ - language: pkg-config
701
+ and:
702
+ - pattern: '^Name:[ \t]+\S'
703
+ - pattern: '^Description:[ \t]+\S'
704
+ - pattern: '^Version:[ \t]+\S'
640
705
  - extensions: ['.php']
641
706
  rules:
642
707
  - language: Hack
@@ -749,6 +814,11 @@ disambiguations:
749
814
  pattern:
750
815
  - '^\s*#(?:(?:if|ifdef|define|pragma)\s+\w|\s*include\s+<[^>]+>)'
751
816
  - '^\s*template\s*<'
817
+ - extensions: ['.releaserc']
818
+ rules:
819
+ - language: YAML
820
+ named_pattern: yaml
821
+ - language: JSON
752
822
  - extensions: ['.res']
753
823
  rules:
754
824
  - language: ReScript
@@ -819,6 +889,15 @@ disambiguations:
819
889
  - '\(#[\w-]+[!\?]'
820
890
  - '(?:[\)\]]\s*[\*\+\?](?:\s|$))'
821
891
  - '@[\w.-]+(?:\)\s|$)'
892
+ - extensions: ['.sd']
893
+ rules:
894
+ - language: Vespa Schema Definition
895
+ pattern: '^[ \t]*(?:schema|search|document)[ \t]+[\w.\/-]+[ \t]*(?:inherits[ \t][^{\n]*)?\{'
896
+ - extensions: ['.sip']
897
+ rules:
898
+ - language: Quartus Simulation IP
899
+ pattern: '^[ \t]*set_global_assignment\b'
900
+ - language: SIP
822
901
  - extensions: ['.sol']
823
902
  rules:
824
903
  - language: Solidity
@@ -829,7 +908,7 @@ disambiguations:
829
908
  rules:
830
909
  # Postgres
831
910
  - language: PLpgSQL
832
- pattern: '(?i:^\\i\b|AS\s+\$\$|LANGUAGE\s+''?plpgsql''?|BEGIN(\s+WORK)?\s*;)'
911
+ pattern: '(?i:^\\i\b|^\s*DO\s+\$|LANGUAGE\s+''?plpgsql''?|BEGIN(\s+WORK)?\s*;)'
833
912
  # IBM db2
834
913
  - language: SQLPL
835
914
  pattern: '(?i:ALTER\s+MODULE|MODE\s+DB2SQL|\bSYS(CAT|PROC)\.|ASSOCIATE\s+RESULT\s+SET|\bEND!\s*$)'
@@ -1002,6 +1081,11 @@ disambiguations:
1002
1081
  - language: Typst
1003
1082
  pattern: '^#(import|show|let|set)'
1004
1083
  - language: XML
1084
+ - extensions: ['.uc']
1085
+ rules:
1086
+ - language: ucode
1087
+ named_pattern: ucode
1088
+ - language: UnrealScript
1005
1089
  - extensions: ['.url']
1006
1090
  rules:
1007
1091
  - language: INI
@@ -1016,7 +1100,7 @@ disambiguations:
1016
1100
  pattern: '\$(?:if|else)[ \t]|^[ \t]*fn\s+[^\s()]+\(.*?\).*?\{|^[ \t]*for\s*\{'
1017
1101
  - extensions: ['.vba']
1018
1102
  rules:
1019
- - language: Vim Script
1103
+ - language: Vim script
1020
1104
  pattern: '^UseVimball'
1021
1105
  - language: VBA
1022
1106
  - extensions: ['.vcf']
@@ -1120,6 +1204,13 @@ named_patterns:
1120
1204
  - '(?i)^[ ]*\$(CONSOLE|CHECKING):'
1121
1205
  - '(?i)^[ ]*\$(FULLSCREEN|RESIZE|STATIC|DYNAMIC|NOPREFIX|SCREENSHOW|SCREENHIDE|EXEICON)\b'
1122
1206
  raku: '^\s*(?:use\s+v6\b|\bmodule\b|\b(?:my\s+)?class\b)'
1207
+ ucode:
1208
+ - '^#!.*\bucode\b'
1209
+ - '^\s*[''"]use strict[''"];'
1210
+ - '^[ \t]*(?:export|import)\b'
1211
+ - '\b(?:require|include)\s*\(\s*[''"]'
1212
+ - '^\s*let\s+\w+'
1213
+ - '\b(?:printf|sprintf)\s*\('
1123
1214
  vb-class: '^[ ]*VERSION [0-9]\.[0-9] CLASS'
1124
1215
  vb-form: '^[ ]*VERSION [0-9]\.[0-9]{2}'
1125
1216
  vb-module: '^[ ]*Attribute VB_Name = '
@@ -1139,3 +1230,4 @@ named_patterns:
1139
1230
  # Excel objects
1140
1231
  - '\b(?:(?:This|Active)?Workbooks?|Worksheets?|Active(?:Sheet|Chart|Cell)|WorksheetFunction)\b'
1141
1232
  - '\b(?:Range\(".*|Cells\([0-9a-zA-Z_]*, (?:[0-9a-zA-Z_]*|"[a-zA-Z]{1,3}"))\)'
1233
+ yaml: '^[ \t]*(?:#|(?:[^/"\s:{}\[\]]|\/[^/*:\n])[^:\n]*:)'
@@ -1,10 +1,5 @@
1
1
  require 'cgi'
2
2
  require 'yaml'
3
- begin
4
- require 'yajl'
5
- rescue LoadError
6
- require 'json'
7
- end
8
3
 
9
4
  require 'linguist/classifier'
10
5
  require 'linguist/heuristics'
@@ -60,6 +55,14 @@ module Linguist
60
55
  # Language name index
61
56
  @index[language.name.downcase] = @name_index[language.name.downcase] = language
62
57
 
58
+ # Index filesystem name if defined
59
+ if language.fs_name
60
+ if @name_index.key?(language.fs_name)
61
+ raise ArgumentError "Duplicate language name: #{language.fs_name}"
62
+ end
63
+ @index[language.fs_name.downcase] = @name_index[language.fs_name.downcase] = language
64
+ end
65
+
63
66
  language.aliases.each do |name|
64
67
  # All Language aliases should be unique. Raise if there is a duplicate.
65
68
  if @alias_index.key?(name)
@@ -493,11 +496,12 @@ module Linguist
493
496
  popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
494
497
 
495
498
  languages_yml = File.expand_path("../languages.yml", __FILE__)
496
- languages_json = File.expand_path("../languages.json", __FILE__)
499
+ languages_rb = File.expand_path("../languages_data.rb", __FILE__)
497
500
 
498
- if File.exist?(languages_json)
499
- serializer = defined?(Yajl) ? Yajl : JSON
500
- languages = serializer.load(File.read(languages_json))
501
+ if File.exist?(languages_rb)
502
+ mod = Module.new
503
+ load(languages_rb, mod)
504
+ languages = mod::DATA
501
505
  else
502
506
  languages = YAML.load_file(languages_yml)
503
507
  end