123456789101112131415161718192021222324252627282930313233343536373839404142openAstringopenOdoc_modelopenOdoc_model.NamesopenOr_errormoduleId=Paths.Identifierletcheck_is_child_of_parentsiblingsroot_name=letcheck_child=function|Lang.Page.Source_tree_childn->root_name=n|Page_child_|Asset_child_|Module_child_->falseinifList.existscheck_childsiblingsthenOk()elseError(`Msg"Specified parent is not a parent of this file")(** Each path is represented as a list of segments. Order is not preserved. *)letparse_input_fileinput=letparse_pathp=Fs.File.of_stringp|>Fs.File.segsinletis_sep=function'\n'|'\r'->true|_->falseinFs.File.readinput>>=funcontent->Ok(Digest.file(Fpath.to_stringinput),String.fields~empty:false~is_sepcontent|>List.rev_mapparse_path)letsource_child_idparentsegs=Id.Mk.source_page(parent,segs)letcompile~resolver~parent~output~warnings_options:_input=letroot_name=Compile.name_of_output~prefix:"src-"outputinletpage_name=PageName.make_stdroot_nameinCompile.resolve_parent_pageresolverparent>>=fun(parent,siblings)->letid=Id.Mk.page(Someparent,page_name)incheck_is_child_of_parentsiblingsroot_name>>=fun()->parse_input_fileinput>>=fun(digest,source_tree)->letroot=letfile=Root.Odoc_file.create_pageroot_namein{Root.id=(id:>Id.OdocId.t);file;digest}inletsource_children=List.rev_map(source_child_idid)source_treeinletpage=Lang.SourceTree.{name=(id:>Id.Page.t);root;source_children;digest}inOdoc_file.save_source_treeoutput~warnings:[]page;Ok()