summary refs log tree commit diff
path: root/pkgs/tools/typesetting/tex/texlive/tl2nix.sed
blob: 244f8fbcc15f7f541bc40228ac512d1bd8577b64 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# wrap whole file into an attrset
1i{ # no indentation
$a}

# extract repository metadata
/^name 00texlive\.config$/,/^$/{
  s/^name (.*)$/"\1" = {/p
  /^$/,1i};

  s!^depend frozen/0$!  frozen = false;!p
  s!^depend frozen/1$!  frozen = true;!p
  s!^depend release/(.*)$!  year = \1;!p
  s!^depend revision/(.*)$!  revision = \1;!p
}

# form an attrmap per package
# ignore packages whose name contains "." (such as binaries) except for texlive.infra
/^name ([^.]+|texlive\.infra)$/,/^$/{
  # quote invalid names
  s/^name ([0-9].*|texlive\.infra)$/"\1" = {/p
  s/^name (.*)$/\1 = {/p

  # extract revision
  s/^revision ([0-9]*)$/  revision = \1;/p

  # extract hashes of *.tar.xz
  s/^containerchecksum (.*)/  sha512.run = "\1";/p
  s/^doccontainerchecksum (.*)/  sha512.doc = "\1";/p
  s/^srccontainerchecksum (.*)/  sha512.source = "\1";/p

  # number of path components to strip, defaulting to 1 ("texmf-dist/")
  /^relocated 1/i\  stripPrefix = 0;

  # extract version and clean unwanted chars from it
  /^catalogue-version/y/ \/~/_--/
  /^catalogue-version/s/[\#,:\(\)]//g
  s/^catalogue-version_(.*)/  version = "\1";/p

  /^catalogue-license/{
    # wrap licenses in quotes
    s/ ([^ ]+)/ "\1"/g
    # adjust naming as in nixpkgs, the full texts of the licenses are available at https://www.ctan.org/license/${licenseName}
    s/"(cc-by(-sa)?-[1-4])"/"\10"/g
    s/"apache2"/"asl20"/g
    s/"artistic"/"artistic1-cl8"/g
    s/"bsd"/"bsd3"/g          # license text does not match exactly, but is pretty close
    s/"bsd4"/"bsdOriginal"/g
    s/"collection"/"free"/g   # used for collections of individual packages with distinct licenses. As TeXlive only contains free software, we can use "free" as a catchall
    s/"fdl"/"fdl13Only"/g
    s/"gpl1?"/"gpl1Only"/g
    s/"gpl2\+"/"gpl2Plus"/g
    s/"gpl3\+"/"gpl3Plus"/g
    s/"lgpl"/"lgpl2"/g
    s/"lgpl2\.1"/"lgpl21"/g
    s/"lppl"/"lppl13c"/g      # not used consistently, sometimes "lppl" refers to an older version of the license
    s/"lppl1\.2"/"lppl12"/g
    s/"lppl1\.3"/"lppl13c"/g  # If a work refers to LPPL 1.3 as its license, this is interpreted as the latest version of the 1.3 license (https://www.latex-project.org/lppl/)
    s/"lppl1\.3a"/"lppl13a"/g
    s/"lppl1\.3c"/"lppl13c"/g
    s/"other-free"/"free"/g
    s/"opl"/"opubl"/g
    s/"pd"/"publicDomain"/g

    s/^catalogue-license (.*)/  license = [ \1 ];/p
  }

  # extract deps
  /^depend ([^.]+|texlive\.infra)$/{
    # open a list
    i\  deps = [

    # loop through following depend lines
    :next-dep
      s/^\n?depend ([^.]+|texlive\.infra)$/    "\1"/p # print dep
      s/^.*$//                                        # clear pattern space
      N; /^\ndepend /b next-dep

    # close the list
    i\  ];
    D # restart cycle from the current line
  }

  # detect presence of notable files
  /^docfiles /{
    s/^.*$//  # ignore the first line

    # read all files
    :next-doc
      N
      s/\n / /   # remove newline
      t next-doc # loop if the previous lines matched

    / (texmf-dist|RELOC)\/doc\/man\//i\  hasManpages = true;
    / (texmf-dist|RELOC)\/doc\/info\//i\  hasInfo = true;

    D # restart cycle
  }

  /^runfiles /{
    s/^.*$//  # ignore the first line

    # read all files
    :next-file
      N
      s/\n / /    # remove newline
      t next-file # loop if previous line matched
    s/\n/ \n/     # add space before last newline for accurate matching below

    / (RELOC|texmf-dist)\//i\  hasRunfiles = true;
    / tlpkg\//i\  hasTlpkg = true;

    # extract script extensions
    / texmf-dist\/scripts\/.*\.(jar|lua|py|rb|sno|tcl|texlua|tlu) /{
      i\  scriptExts = [
        / texmf-dist\/scripts\/.*\.jar /i\    "jar"
        / texmf-dist\/scripts\/.*\.lua /i\    "lua"
        / texmf-dist\/scripts\/.*\.py /i\    "py"
        / texmf-dist\/scripts\/.*\.rb /i\    "rb"
        / texmf-dist\/scripts\/.*\.sno /i\    "sno"
        / texmf-dist\/scripts\/.*\.tcl /i\    "tcl"
        / texmf-dist\/scripts\/.*\.texlua /i\    "texlua"
        / texmf-dist\/scripts\/.*\.tlu /i\    "tlu"
      i\  ];
    }

    D # restart cycle from the current line
  }

  # extract postaction scripts (right now, at most one per package, so a string suffices)
  s/^postaction script file=(.*)$/  postactionScript = "\1";/p

  # extract hyphenation patterns and formats
  # (this may create duplicate lines, use uniq to remove them)
  /^execute\sAddHyphen/i\  hasHyphens = true;

  # extract format details
  /^execute\sAddFormat\s/{
    # open a list
    i\  formats = [

    # create one attribute set per format
    # note that format names are not unique

    # plain keys: name, engine, patterns
    # optionally double quoted key: options
    # boolean key: mode (enabled/disabled)
    # comma-separated lists: fmttriggers, patterns
    :next-fmt
      s/(^|\n)execute\sAddFormat/    {/
      s/\s+options="([^"]+)"/\n      options = "\1";/
      s/\s+(name|engine|options)=([^ \t\n]+)/\n      \1 = "\2";/g
      s/\s+mode=enabled//
      s/\s+mode=disabled/\n      enabled = false;/
      s/\s+(fmttriggers|patterns)=([^ \t\n]+)/\n      \1 = [ "\2" ];/g
      s/$/\n    }/

      :split-triggers
        s/"([^,]+),([^"]+)" ]/"\1" "\2" ]/;
        t split-triggers   # repeat until there are no commas

      p
      s/^.*$// # clear pattern space
      N
      /^\nexecute\sAddFormat\s/b next-fmt

    # close the list
    i\  ];
    D # restart cycle from the current line
  }

  # close attrmap
  /^$/i};
}

# add list of binaries from one of the architecture-specific packages
/^name ([^.]+|texlive\.infra)\.x86_64-linux$/,/^$/{
  s/^name ([0-9].*|texlive\.infra)\.x86_64-linux$/"\1".binfiles = [/p
  s/^name (.*)\.x86_64-linux$/\1.binfiles = [/p
  s!^ bin/x86_64-linux/(.+)$!  "\1"!p
  /^$/i];
}