Add support for XPM. (#3706)

* .xpm and .pm extensions associated with XPM.

* .pm is disambiguated by searching the /* XPM */ string.
  This is how `file` performs detection and should work with
  every XPM3 file (most XPM generated by software later than 1991).

Added XPM samples:

* stick-unfocus.xpm: extracted from Fluxbox (MIT License)
  0c13ddc0c8/data/styles/Emerge/pixmaps/stick-unfocus.xpm

* cc-public_domain_mark_white.pm: public domain image from
  https://commons.wikimedia.org/wiki/File:Cc-public_domain_mark_white.svg
  converted to XPM with ImageMagick (convert input.svg output.xpm).
This commit is contained in:
Santiago M. Mola
2017-07-22 15:19:22 +02:00
committed by Colin Seymour
parent e60384b018
commit 085604948e
6 changed files with 131 additions and 3 deletions

View File

@@ -349,6 +349,8 @@ module Linguist
Language["Perl 6"]
elsif /\buse\s+(?:strict\b|v?5\.)/.match(data)
Language["Perl"]
elsif /^\s*\/\* XPM \*\//.match(data)
Language["XPM"]
end
end

View File

@@ -4891,6 +4891,14 @@ XML:
- Web.config
- packages.config
language_id: 399
XPM:
type: data
extensions:
- ".xpm"
- ".pm"
ace_mode: c_cpp
tm_scope: source.c
language_id: 781846279
XPages:
type: programming
extensions:

View File

@@ -0,0 +1,76 @@
/* XPM */
static char *cc_public_domain_mark_white[] = {
/* columns rows colors chars-per-pixel */
"52 53 17 1 ",
" c black",
". c #111111111111",
"X c #222222222222",
"o c gray20",
"O c #444444444444",
"+ c #555555555555",
"@ c gray40",
"# c #777777777777",
"$ c #888888888888",
"% c gray60",
"& c #AAAAAAAAAAAA",
"* c #BBBBBBBBBBBB",
"= c gray80",
"- c #DDDDDDDDDDDD",
"; c #EEEEEEEEEEEE",
": c white",
"> c None",
/* pixels */
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",
">>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>",
">>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>",
">>>>>>>>>>>>>> >>>>>>>>>>>>>>>",
">>>>>>>>>>>> >>>>>>>>>>>>>",
">>>>>>>>>>> .OOOOX >>>>>>>>>>>",
">>>>>>>>> .@&-:::::::;%@. >>>>>>>>>>",
">>>>>>>> X%:::::::::::::::&O >>>>>>>>>",
">>>>>>> .%:::::::::::::::::::%X >>>>>>>>",
">>>>>> +;::::::::::::::::::::::# >>>>>>>",
">>>>> $:::::::::::::::::::::::::%. >>>>>>",
">>>>> %:::::::::::::::::::::::::::=. >>>>>",
">>>> %:::::::::::::::::::::::::::::=. >>>>>",
">>> $:::::::::::;$@Oo XO#&::::::::::% >>>>",
">>> +::::::::::=+ X$:::::::::# >>>>",
">> .#-:::::::$. O-::::::::X >>>",
">> @=::::@ .=::::::::% >>>",
">> O&:% .=::::::::::O >>",
"> X o .=:::::::::::& >>",
"> X #;::*o.=:::::::::::::. >>",
"> o:%O &::::::-::::::::::::::@ >",
" #:::*@ X*:::::::::::::::::::::% >",
" &:::::-#. X%:::::::::::::::::::; >",
" -:::::::; .#;::::::::::::::::: >",
" ::::::::* @-:::::::::::::::X >",
" ::::::::* +*:::::::::::::O >",
" ::::::::* X. o%:::::::::::O >",
" ::::::::* #;#X X#;::::::::o >",
" ;:::::::- +:::%o .@-:::::: >",
" *:::::::: .:::::*+ +*:::; >",
" &::::::::X %::::::-@. o%:* >",
" @::::::::# X;:::::::;#X X@ >",
"> .::::::::= o;::::-O=::%o >",
"> =::::::::O .#*&@. X;:::*+ >>",
"> @::::::::- o:::::-@. >>",
">> -::::::::% @::::::;#X >>",
">> @:::::::::% *::::::::@ >>>",
">> =:::::::::*X .$::::::::;. >>>",
">>> o;:::::::::;$X .@-:::::::::+ >>>>",
">>> +::::::::::::=$@OO+#&;::::::::::$ >>>>",
">>>> #:::::::::::::::::::::::::::::% >>>>>",
">>>>> #:::::::::::::::::::::::::::% >>>>>>",
">>>>>> +;::::::::::::::::::::::::$ >>>>>>",
">>>>>> o=:::::::::::::::::::::;O >>>>>>>",
">>>>>>> @-:::::::::::::::::;#. >>>>>>>>",
">>>>>>>> @=:::::::::::::-#. >>>>>>>>>",
">>>>>>>>>> .@&*;::::;&#o >>>>>>>>>>",
">>>>>>>>>>> >>>>>>>>>>>>",
">>>>>>>>>>>> >>>>>>>>>>>>>",
">>>>>>>>>>>>>> >>>>>>>>>>>>>>>",
">>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>",
">>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>",
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
};

View File

@@ -0,0 +1,40 @@
/* XPM */
static char * stick_unfocus_xpm[] = {
"20 17 20 1",
" c None",
". c #EBEBEB",
"+ c #E9E9E9",
"@ c #E6E6E6",
"# c #E5E5E5",
"$ c #E2E2E2",
"% c #DFDFDF",
"& c #DEDEDE",
"* c #FEFEFE",
"= c #C4C4C4",
"- c #898989",
"; c #B7B7B7",
"> c #6A6A6A",
", c #B9B9B9",
"' c #E4E4E4",
") c #686868",
"! c #E0E0E0",
"~ c #666666",
"{ c #E8E8E8",
"] c #E1E1E1",
"....................",
"....................",
".....+@#$%&%$#@+....",
"....+*********=&+...",
"....@*********-=#...",
"....#**;;;;;**>,'...",
"....$**;**;;**);$...",
"....%**;;;;;**>;&...",
"....&**;***;**>;&...",
"....&**;;;;;**>;&...",
"....!*********~;!...",
"....!*********>,&...",
"....@=->)>>>)>-=#...",
"....+&=,;;;;;,=&+...",
".....{]%%&&&&%@+....",
"....................",
"...................."};

View File

@@ -221,11 +221,12 @@ class TestHeuristcs < Minitest::Test
})
end
# Candidate languages = ["Perl", "Perl 6"]
def test_pm_perl_by_heuristics
# Candidate languages = ["Perl", "Perl 6", "XPM"]
def test_pm_by_heuristics
assert_heuristics({
"Perl" => all_fixtures("Perl", "*.pm"),
"Perl 6" => all_fixtures("Perl 6", "*.pm")
"Perl 6" => all_fixtures("Perl 6", "*.pm"),
"XPM" => all_fixtures("XPM", "*.pm")
})
end

View File

@@ -63,6 +63,7 @@ class TestLanguage < Minitest::Test
assert_equal Language['Vim script'], Language.find_by_alias('vim')
assert_equal Language['Vim script'], Language.find_by_alias('viml')
assert_equal Language['reStructuredText'], Language.find_by_alias('rst')
assert_equal Language['XPM'], Language.find_by_alias('xpm')
assert_equal Language['YAML'], Language.find_by_alias('yml')
assert_nil Language.find_by_alias(nil)
end