This file is indexed.

/usr/lib/ocaml/rss/rss.mli is in librss-ocaml-dev 2.2.1-3build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
(******************************************************************************)
(*               OCamlrss                                                     *)
(*                                                                            *)
(*   Copyright (C) 2004-2013 Institut National de Recherche en Informatique   *)
(*   et en Automatique. All rights reserved.                                  *)
(*                                                                            *)
(*   This program is free software; you can redistribute it and/or modify     *)
(*   it under the terms of the GNU Lesser General Public License version      *)
(*   3 as published by the Free Software Foundation.                          *)
(*                                                                            *)
(*   This program is distributed in the hope that it will be useful,          *)
(*   but WITHOUT ANY WARRANTY; without even the implied warranty of           *)
(*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *)
(*   GNU Library General Public License for more details.                     *)
(*                                                                            *)
(*   You should have received a copy of the GNU Library General Public        *)
(*   License along with this program; if not, write to the Free Software      *)
(*   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA                 *)
(*   02111-1307  USA                                                          *)
(*                                                                            *)
(*   Contact: Maxence.Guesdon@inria.fr                                        *)
(*                                                                            *)
(*                                                                            *)
(******************************************************************************)

(** The RSS library to read and write RSS 2.0 files.

    Reference:
    {{:http://www.rssboard.org/rss-specification}RSS
    2.0 specification}. *)

(** {2 Types} *)

type date = Netdate.t

val string_of_date : ?fmt: string -> date -> string
(** Format a date/time record as a string according to the format
    string [fmt].

    @param fmt The format string.  It consists of zero or more
    conversion specifications and ordinary characters.  All ordinary
    characters are kept as such in the final string.  A conversion
    specification consists of the '%' character and one other
    character.  See [Netdate.format_to] for more details.
    Default: ["%d %b %Y"].
 *)

type email = string (** can be, for example: foo\@bar.com (Mr Foo Bar) *)
type pics_rating = string
type skip_hours = int list (** 0 .. 23 *)
type skip_days = int list (** 0 is Sunday, 1 is Monday, ... *)

type url = Neturl.url

type category =
  {
    cat_name : string ;
    (** A forward-slash-separated string that identifies a hierarchic
        location in the indicated taxonomy. *)
    cat_domain : url option ;
    (** Identifies a categorization taxonomy. *)
  }

type image =
  {
    image_url : url ;
    (** The URL of a GIF, JPEG or PNG image that represents the channel. *)
    image_title : string ;
    (** Description of the image, it's used in the ALT attribute of
        the HTML <img> tag when the channel is rendered in HTML.  *)
    image_link : url ;
    (** The URL of the site, when the channel is rendered, the image
        is a link to the site. (Note, in practice the [image_title]
        and [image_link] should have the same value as the {!channel}'s
        [ch_title] and [ch_link].)  *)
    image_height : int option ;
    (** Height of the image, in pixels. *)
    image_width : int option ;
    (** Width of the image, in pixels. *)
    image_desc : string option ;
    (** Text to be included in the "title" attribute of the link formed
        around the image in the HTML rendering. *)
  }

type text_input =
    {
      ti_title : string ;
      (** The label of the Submit button in the text input area. *)
      ti_desc : string ;
      (** Explains the text input area. *)
      ti_name : string ;
      (** The name of the text object in the text input area. *)
      ti_link : url ;
      (** The URL of the CGI script that processes text input requests. *)
    }

type enclosure =
  {
    encl_url : url ; (** URL of the enclosure *)
    encl_length : int ; (** size in bytes *)
    encl_type : string ; (** MIME type *)
  }

type guid =
  | Guid_permalink of url (** A permanent URL pointing to the story. *)
  | Guid_name of string   (** A string that uniquely identifies the item.  *)

type source =
    {
      src_name : string ;
      src_url : url ;
    }

(** See {{:http://cyber.law.harvard.edu/rss/soapMeetsRss.html#rsscloudInterface} specification} *)
type cloud = {
    cloud_domain : string ;
    cloud_port : int ;
    cloud_path : string ;
    cloud_register_procedure : string ;
    cloud_protocol : string ;
  }

(** An item may represent a "story".  Its description is a synopsis of
    the story (or sometimes the full story), and the link points to
    the full story. *)
type 'a item_t =
  {
    item_title : string option; (** Optional title *)
    item_link : url option; (** Optional link *)
    item_desc : string option; (** Optional description *)
    item_pubdate : date option ; (** Date of publication *)
    item_author : email option ;
    (** The email address of the author of the item. *)
    item_categories : category list ;
    (** Categories for the item.  See the field {!category}. *)
    item_comments : url option ; (** Url of comments about this item *)
    item_enclosure : enclosure option ;
    item_guid : guid option ;
    (** A globally unique identifier for the item. *)
    item_source : source option ;
    item_data : 'a option ;
    (** Additional data, since RSS can be extended with namespace-prefixed nodes.*)
  }

(** A namespace is a pair (name, url). *)
type namespace = string * string

type ('a, 'b) channel_t =
  {
    ch_title : string ;
    (** Mandatory.  The name of the channel, for example the title of
        your web site. *)
    ch_link : url ;
    (** Mandatory.  The URL to the HTML website corresponding to the channel. *)
    ch_desc : string ;
    (** Mandatory.  A sentence describing the channel. *)
    ch_language : string option ;
    (** Language of the news, e.g. "en".  See the W3C
        {{:http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes}
        language codes}. *)
    ch_copyright : string option ; (** Copyright notice. *)
    ch_managing_editor : email option ;
    (** Managing editor of the news. *)
    ch_webmaster : email option ;
    (** The address of the webmasterof the site. *)
    ch_pubdate : date option ;
    (** Publication date of the channel. *)
    ch_last_build_date : date option ;
    (** When the channel content changed for the last time. *)
    ch_categories : category list ;
    (** Categories for the channel.  See the field {!category}. *)
    ch_generator : string option ;
    (** The tool used to generate this channel. *)
    ch_cloud : cloud option ;
    (** Allows processes to register with a cloud to be notified of updates to the channel. *)
    ch_docs : url option ; (** An url to a RSS format reference. *)
    ch_ttl : int option ;
    (** Time to live, in minutes.  It indicates how long a channel can
        be cached before refreshing from the source. *)
    ch_image : image option ;
    ch_rating : pics_rating option;
    (** The PICS rating for the channel. *)
    ch_text_input : text_input option ;
    ch_skip_hours : skip_hours option ;
    (** A hint for aggregators telling them which hours they can skip.*)
    ch_skip_days : skip_days option ;
    (** A hint for aggregators telling them which days they can skip. *)
    ch_items : 'b item_t list ;
    ch_data : 'a option ;
        (** Additional data, since RSS can be extended with namespace-prefixed nodes.*)
    ch_namespaces : namespace list ;
  }

type item = unit item_t
type channel = (unit, unit) channel_t

(** {2 Building items and channels} *)

val item :
  ?title: string ->
  ?link: url ->
  ?desc: string ->
  ?pubdate: date ->
  ?author: email ->
  ?cats: category list ->
  ?comments: url ->
  ?encl: enclosure ->
  ?guid: guid ->
  ?source: source ->
  ?data: 'a ->
  unit ->
  'a item_t
(** [item()] creates a new item with all fields set to [None].  Use the
    optional parameters to set fields. *)

val channel :
  title: string ->
  link: url ->
  desc: string ->
  ?language: string ->
  ?copyright: string ->
  ?managing_editor: email ->
  ?webmaster: email ->
  ?pubdate: date ->
  ?last_build_date: date ->
  ?cats: category list ->
  ?generator: string ->
  ?cloud: cloud ->
  ?docs: url ->
  ?ttl: int ->
  ?image: image ->
  ?rating: pics_rating ->
  ?text_input: text_input ->
  ?skip_hours: skip_hours ->
  ?skip_days: skip_days ->
  ?data: 'a ->
  ?namespaces: namespace list ->
  'b item_t list ->
  ('a, 'b) channel_t
(** [channel items] creates a new channel containing [items].  Other
    fields are set to [None] unless the corresponding optional
    parameter is used. *)

val compare_item : ?comp_data: ('a -> 'a -> int) -> 'a item_t -> 'a item_t -> int

val copy_item : 'a item_t -> 'a item_t
val copy_channel : ('a, 'b) channel_t -> ('a, 'b) channel_t


(** {2 Manipulating channels} *)

val keep_n_items : int -> ('a, 'b) channel_t -> ('a, 'b) channel_t
(** [keep_n_items n ch] returns a copy of the channel, keeping only
    [n] items maximum. *)

val sort_items_by_date : 'a item_t list -> 'a item_t list
(** Sort items by date, older last. *)

val merge_channels : ('a, 'b) channel_t -> ('a, 'b) channel_t -> ('a, 'b) channel_t
(** [merge_channels c1 c2] merges the given channels in a new channel,
    sorting items using {!sort_items_by_date}. Channel information are
    copied from the first channel [c1]. *)


(** {2 Reading channels} *)

(** This represents XML trees. Such XML trees are given to
  functions provided to read additional data from RSS channels and items. *)
type xmltree =
    E of Xmlm.tag * xmltree list
  | D of string

(** Read an XML tree from a source.
   @raise Failure in case of error.*)
val xml_of_source : Xmlm.source -> xmltree

(** Use this exception to indicate an error is functions given to [make_opts] used
  to read additional data from prefixed XML nodes. *)
exception Error of string

(** Options used when reading source. *)
type ('a, 'b) opts

(** See Neturl documentation for [schemes] and [base_syntax] options.
  They are used to parse URLs.
  @param read_channel_data provides a way to read additional information from the
  subnodes of the channels. All these subnodes are prefixed by an expanded namespace.
  @param read_item_data is the equivalent of [read_channel_data] parameter but
  is called of each item with its prefixed subnodes.
  *)
val make_opts :
  ?schemes: (string, Neturl.url_syntax) Hashtbl.t ->
  ?base_syntax: Neturl.url_syntax ->
  ?read_channel_data: (xmltree list -> 'a option) ->
  ?read_item_data: (xmltree list -> 'b option) ->
  unit -> ('a, 'b) opts

val default_opts : (unit, unit) opts

(** [channel_[t_]of_X] returns the parsed channel and a list of encountered errors.
  Note that only namespaces declared in the root not of the XML tree are added to [ch_namespaces] field.
  @raise Failure if the channel could not be parsed.
*)
val channel_t_of_file : ('a, 'b) opts -> string -> (('a, 'b) channel_t * string list)
val channel_t_of_string : ('a, 'b) opts -> string -> (('a, 'b) channel_t * string list)
val channel_t_of_channel : ('a, 'b) opts -> in_channel -> (('a, 'b) channel_t * string list)

(** Read a channel from XML trees. These trees correspond to nodes under the ["channel"] XML node
 of a reguler RSS document. *)
val channel_t_of_xmls : ('a, 'b) opts -> xmltree list -> (('a, 'b) channel_t * string list)

val channel_of_file : string -> (channel * string list)
val channel_of_string : string -> (channel * string list)
val channel_of_channel : in_channel -> (channel * string list)

(** {2 Writing channels} *)

type 'a data_printer = 'a -> xmltree list

val print_channel :
  ?channel_data_printer: 'a data_printer ->
  ?item_data_printer: 'b data_printer ->
  ?indent: int -> ?date_fmt: string -> ?encoding: string ->
    Format.formatter -> ('a, 'b) channel_t -> unit

val print_file :
  ?channel_data_printer: 'a data_printer ->
  ?item_data_printer: 'b data_printer ->
    ?indent: int -> ?date_fmt: string -> ?encoding: string ->
    string -> ('a, 'b) channel_t -> unit