diff options
author | Ralph Amissah <ralph@amissah.com> | 2012-05-01 23:37:43 -0400 |
---|---|---|
committer | Ralph Amissah <ralph@amissah.com> | 2012-05-01 23:38:37 -0400 |
commit | f297b90d4089b5bfe2f63010a6800e8d52047771 (patch) | |
tree | aa44d4253e8cb6ef615fc21428343f5b93bdb9d2 | |
parent | v3: misc, minor (diff) |
v3: hub (seek finer grained control over what happens when; causes breakage)sisu_3.2.6
* (primarily) cycle files then options (instead of options then files)
* manifest re-run on (currently generated) translated files if any
-rw-r--r-- | data/doc/sisu/CHANGELOG_v3 | 6 | ||||
-rw-r--r-- | lib/sisu/v3/hub.rb | 403 | ||||
-rw-r--r-- | lib/sisu/v3/options.rb | 28 |
3 files changed, 261 insertions, 176 deletions
diff --git a/data/doc/sisu/CHANGELOG_v3 b/data/doc/sisu/CHANGELOG_v3 index 9482c8cb..f5e56046 100644 --- a/data/doc/sisu/CHANGELOG_v3 +++ b/data/doc/sisu/CHANGELOG_v3 @@ -21,12 +21,16 @@ http://www.jus.uio.no/sisu/pkg/src/sisu_3.2.6.orig.tar.xz sisu_3.2.6-1.dsc sisu_3.2.6-1.debian.tar.gz -* v3: harvest +* v3: harvest (metadata, site/document summary) fixes * harvest_topics, sort fix * harvest_authors, minor fix * sst content parsing lang dir * output file location, currently works for (by?) :language & :filetype +* v3: hub (seek finer grained control over what happens when; causes breakage) + * (primarily) cycle files then options (instead of options then files) + * manifest re-run on (currently generated) translated files if any + %% 3.2.5.orig.tar.xz (2012-04-22:16/7) http://git.sisudoc.org/?p=code/sisu.git;a=log;h=refs/tags/sisu_3.2.5 http://git.sisudoc.org/?p=code/sisu.git;a=log;h=refs/tags/debian/sisu_3.2.5-1 diff --git a/lib/sisu/v3/hub.rb b/lib/sisu/v3/hub.rb index 241d1538..ce8446e5 100644 --- a/lib/sisu/v3/hub.rb +++ b/lib/sisu/v3/hub.rb @@ -62,6 +62,64 @@ module SiSU require_relative 'sysenv' # sysenv.rb include SiSU_Screen @@pwd_the=Dir.pwd + class OptionLoopFiles + def initialize(opt) + @opt=opt + end + def loop_files_on_given_option + @opt.files.each_with_index do |fns,i| + @opt.fns=fns + @opt.f_pth=@opt.f_pths[i] + if fns !~/\.-sst$/ + @opt.pth=@opt.paths[i] + @opt.lng=@opt.lngs[i] + else + @opt.pth=Dir.pwd + @opt.lng='en' + end + @@pwd=@opt.pth + Dir.chdir(@opt.pth) #watch + @env=SiSU_Env::InfoEnv.new(fns) + yield + end + end + def manifest_on_files_translated + r=Px[:lng_lst].join('|') + number_of_files={} + @opt.files.each_with_index do |fns,i| + fn=fns.gsub(/(?:\.#{r})?\.ss[tm]$/,'') + if number_of_files[fn].class == Array + number_of_files[fn] << i + else + number_of_files = { fn => [i] } + end + end + files_translated_idx=[] + number_of_files.each do |x| + if x[1].length > 1 + files_translated_idx << x[1] + end + end + if files_translated_idx.flatten.length > 1 + SiSU_Screen::Ansi.new(@opt.cmd,'Manifest re-run on (currently generated) tranlated files',"").grey_title_hi unless @opt.cmd =~/q/ + files_translated_idx.flatten.each do |i| + @opt.fns=@opt.files[i] + @opt.f_pth=@opt.f_pths[i] + if @opt.fns !~/\.-sst$/ + @opt.pth=@opt.paths[i] + @opt.lng=@opt.lngs[i] + else + @opt.pth=Dir.pwd + @opt.lng='en' + end + @@pwd=@opt.pth + Dir.chdir(@opt.pth) #watch + @env=SiSU_Env::InfoEnv.new(@opt.fns) + yield + end + end + end + end class Op @@env=SiSU_Env::InfoEnv.new def initialize(opt,req,message) @@ -124,9 +182,6 @@ module SiSU end def select require_relative @req - if @req =~/^conf$/ # -C - SiSU_Initialize::Source.new(@opt).read - end if not @opt.files.empty? @opt.files.each_with_index do |fns,i| env=SiSU_Env::InfoEnv.new(fns) @@ -177,64 +232,9 @@ module SiSU and @req =~ /^po4a$/ require_relative 'composite' # composite.rb #pre-processing SiSU_Po4a::Source.new(@opt).read # -P po4a.rb - elsif @req=~/^dal$/ \ - and FileTest.file?(@opt.fns) \ - and @opt.fns =~ /\.(?:(?:-|ssm\.)?sst|ssm)$/ - if fns =~ /\.ssm$/ - require_relative 'composite' # composite.rb #pre-processing - SiSU_Assemble::Composite.new(@opt).read - @opt.fns=fns.gsub(/\.ssm$/,'.ssm.sst') - end - SiSU_DAL::Source.new(@opt).read # -m - elsif FileTest.file?(env.source_file_with_path) - case @opt.fns - when /\.(?:(?:-|ssm\.)?sst|ssm)$/ - case @req - when /^dal$/ - if fns =~ /\.ssm$/ - require_relative 'composite' # composite.rb #pre-processing - SiSU_Assemble::Composite.new(@opt).read - @opt.fns=fns.gsub(/\.ssm$/,'.ssm.sst') - end - SiSU_DAL::Source.new(@opt).read # -m dal.rb - when /^git$/; SiSU_Git::Source.new(@opt).read # -g git.rb - when /^concordance$/; SiSU_Concordance::Source.new(@opt).read # -w concordance.rb - when /^share_src$/; SiSU_Markup::Source.new(@opt).read # -s share_src.rb - when /^sisupod_make$/; SiSU_Doc::Source.new(@opt).read # -S sisupod_make.rb -# when /^source_kdissert$/; SiSU_KdiSource::Source.new(@opt).read # -S share_src_kdissert.rb - when /^digests$/; SiSU_DigestView::Source.new(@opt).read # -N digests.rb - when /^plaintext$/; SiSU_Plaintext::Source.new(@opt).read # -t -a plaintext.rb - when /^po4a$/; SiSU_Po4a::Source.new(@opt).read # -P po4a.rb - #when /^wikispeak$/; SiSU_Wikispeak::Source.new(@opt).read # -g - when /^epub$/; SiSU_EPUB::Source.new(@opt).read # -e epub.rb - when /^odf$/; SiSU_ODF::Source.new(@opt).read # -o odf.rb - when /^xml_md_oai_pmh_dc$/; SiSU_XML_Metadata::OAI_PMH.new(@opt).read # -O - when /^texpdf$/; SiSU_TeX::Source.new(@opt).read # -p texpdf.rb - when /^manpage$/; SiSU_Manpage::Source.new(@opt).read # -i manpage.rb - when /^texinfo$/; SiSU_TexInfo::Source.new(@opt).read # -I texinfo.rb - when /^html$/; SiSU_HTML::Source.new(@opt).read # -h -H html.rb - when /^xhtml$/; SiSU_XHTML::Source.new(@opt).read # -b xhtml.rb - when /^xml$/; SiSU_XML_SAX::Source.new(@opt).read # -x xml.rb - when /^xml_dom$/; SiSU_XML_DOM::Source.new(@opt).read # -X xml_dom.rb - when /^shared_images$/; SiSU_Images::Source.new(@opt).read # -j shared_images.rb - #when /^xml_fictionbook$/; SiSU_XML_Fictionbook::Source.new(@opt).read # -f - when /^xml_scaffold$/; SiSU_XML_Scaffold::Source.new(@opt).read # -k xml_scaffold.rb - when /^embedded$/; SiSU_Embedded::Source.new(@opt).read # -m embedded.rb (image and other content) #check - when /^manifest$/; SiSU_Manifest::Source.new(@opt).read # -y manifest.rb - when /^qrcode$/; SiSU_QRcode::Source.new(@opt).read # -Q qrcode.rb - when /^sitemaps$/; SiSU_Sitemaps::Source.new(@opt).read # -Y sitemaps.rb - when /^zap$/; SiSU_Zap::Source.new(@opt).read # -Z zap.rb - when /^dbi$/; SiSU_DBI::SQL.new(@opt).connect # -D -d dbi.rb - when /^dbi_discreet$/; SiSU_DBI_Discreet::SQL.new(@opt).build # -d dbi_discreet.rb - end - @n_do=@n_do+1 - SiSU_Screen::Ansi.new(@opt.cmd,@n_do,"#{@req.upcase} processed").files_processed if @opt.cmd =~/[MVv]/ - ObjectSpace.garbage_collect - else #print "not processed --> ", fns, "\n" - end else - if @req !~/^conf$/ \ - and @opt.fns !~/http:\/\// + if @req !~/^conf$/ \ + and @opt.fns !~/http:\/\// SiSU::Operations.new(@opt).not_found end end @@ -256,8 +256,8 @@ module SiSU end end end - elsif @req =~/^dbi$/; SiSU_DBI::SQL.new(@opt).connect # -D -d - elsif @req=~/^sisupod_make$/; SiSU_Doc::Source.new(@opt).read # -S + #elsif @req =~/^dbi$/; SiSU_DBI::SQL.new(@opt).connect # -D -d + #elsif @req=~/^sisupod_make$/; SiSU_Doc::Source.new(@opt).read # -S end SiSU::Operations.new.counter end @@ -429,9 +429,6 @@ p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ if @opt.cmd =~/Z/ #% -Z wipe previous output clean op('zap','Zap, deletions') end - if @opt.act[:share_source][:bool] - op('share_src','SiSU markup source') - end if @opt.act[:dal][:bool] @retry_count= -1 begin @@ -477,119 +474,185 @@ p "here #{__FILE__} #{__LINE__}" if @opt =~/M/ retry unless @retry_count > 1 ensure end - @opt.files=@opt.files.collect {|x| x=x.gsub(/(?:https?|file):\/\/\S+\/(\S+)\.sst$/,'\1.-sst') } - end - if @opt.act[:dal][:bool] #%--dal, -m - op('dal','dal') - end - @opt.files=@opt.files.collect {|x| x=x.gsub(/\.ssm$/,'.ssm.sst') } - if @opt.act[:sisupod][:bool] #% --sisupod, -S make sisupod - op('sisupod_make','sisupod (txz)') - if @opt.fns=~/\.kdi._sst/ - op('share_src_kdissert','kdissert (kdi)') #% -S share kdissert source + #@opt.files=@opt.files.collect {|x| x=x.gsub(/(?:https?|file):\/\/\S+\/(\S+)\.sst$/,'\1.-sst') } + end + #@opt.files_mod=@opt.files.collect {|x| x=x.gsub(/\.ssm$/,'.ssm.sst') } + def requires(req) + require_relative req + end + def each_file_loop_options + @opt.files.each_with_index do |fno,i| + @opt.fno=fno + @opt.fns=fno.gsub(/(?:https?|file):\/\/\S+\/(\S+)\.sst$/,'\1.-sst'). + gsub(/\.ssm$/,'.ssm.sst') + @opt.f_pth=@opt.f_pths[i] + if @opt.fns !~/\.-sst$/ + @opt.pth=@opt.paths[i] + @opt.lng=@opt.lngs[i] + else + @opt.pth=Dir.pwd + @opt.lng='en' + end + @@pwd=@opt.pth + Dir.chdir(@opt.pth) #watch + @env=SiSU_Env::InfoEnv.new(@opt.fns) + if @opt.act[:dal][:bool] #% --dal, -m + if @opt.fno =~ /\.ssm$/ + require_relative 'composite' # composite.rb #pre-processing + SiSU_Assemble::Composite.new(@opt).read + end + requires('dal') # -m dal.rb + SiSU_DAL::Source.new(@opt).read + end + if @opt.act[:share_source][:bool] + requires('share_src') # -s share_src.rb + SiSU_Markup::Source.new(@opt).read + end + if @opt.act[:sisupod][:bool] #% --sisupod, -S make sisupod + requires('sisupod_make') # -S sisupod_make.rb + SiSU_Doc::Source.new(@opt).read + end + if @opt.act[:qrcode][:bool] #% --qrcode, -Q + requires('qrcode') # -Q qrcode.rb + SiSU_QRcode::Source.new(@opt).read + end + if @opt.act[:hash_digests][:bool] #% --hash-digests, -N digest tree + requires('digests') # -N digests.rb + SiSU_DigestView::Source.new(@opt).read + end + if @opt.act[:txt][:bool] #% --txt, -t -a + requires('plaintext') # -t -a plaintext.rb + SiSU_Plaintext::Source.new(@opt).read + end + if @opt.act[:html][:bool] #% --html, -h + requires('html') # -h -H html.rb + SiSU_HTML::Source.new(@opt).read + end + if @opt.act[:concordance][:bool] #% --concordance, -w + requires('concordance') # -w concordance.rb + SiSU_Concordance::Source.new(@opt).read + end + if @opt.act[:epub][:bool] #% --epub, -e + requires('epub') # -e epub.rb + SiSU_EPUB::Source.new(@opt).read + end + if @opt.act[:odt][:bool] #% --odt, -o opendocument + requires('odf') # -o odf.rb + SiSU_ODF::Source.new(@opt).read + end + if @opt.act[:xhtml][:bool] #% --xhtml, -b xhtml + requires('xhtml') # -b xhtml.rb + SiSU_XHTML::Source.new(@opt).read + end + if @opt.act[:xml_sax][:bool] #% --xml-sax, -x xml sax type + requires('xml') # -x xml.rb + SiSU_XML_SAX::Source.new(@opt).read + end + if @opt.act[:xml_dom][:bool] #% --xml-dom, -x xml dom type + requires('xml_dom') # -X xml_dom.rb + SiSU_XML_DOM::Source.new(@opt).read + end + if @opt.act[:pdf][:bool] #% --pdf, -p latex/ texpdf + requires('texpdf') # -p texpdf.rb + SiSU_TeX::Source.new(@opt).read + end + if @opt.act[:manpage][:bool] #% --manpage, -i + requires('manpage') # -i manpage.rb + SiSU_Manpage::Source.new(@opt).read + end + if @opt.act[:texinfo][:bool] #% --texinfo, -I + requires('texinfo') # -I texinfo.rb + SiSU_TexInfo::Source.new(@opt).read + end + if @opt.act[:sqlite_discreet][:bool] #% --sqlite, -d DB sqlite + requires('dbi_discreet') # -d dbi_discreet.rb + SiSU_DBI_Discreet::SQL.new(@opt).build + end + if @opt.act[:manifest][:bool] #% --manifest, -y + requires('manifest') # -y manifest.rb + SiSU_Manifest::Source.new(@opt).read + end end end - if @opt.act[:qrcode][:bool] #% --qrcode, -Q - op('qrcode','QRcode') - end - if @opt.act[:hash_digests][:bool] #% --hash-digests, -N digest tree - op('digests','digests') - end - if @opt.act[:html][:bool] #% --html, -h - op('html','html') - end - if @opt.act[:txt][:bool] #% --txt, -t -a - #-A -f -e -E plaintext -a creates ms-dos type; -A creates unix type, plaintext file - op('plaintext','plaintext') - end - if @opt.act[:epub][:bool] #% --epub, -e - op('epub','ePub') - end - if @opt.act[:odt][:bool] #% --odt, -o opendocument - op('odf','OpenDocument') - end - if @opt.act[:xml_sax][:bool] #% --xml-sax, -x xml sax type - op('xml','xml sax') - end - if @opt.act[:xml_dom][:bool] #% --xml-dom, -x xml dom type - op('xml_dom','xml dom') - end - #if @opt.act[:fictionbook] #% --fictionbook, -f fictionbook xml - # op('xml_fictionbook','xml fictionbook') - #end - if @opt.act[:xhtml][:bool] #% --xhtml, -b xhtml - op('xhtml','xhtml sax') - end - if @opt.act[:images][:bool] #% --images, -j - op('shared_images','images') - end - if @opt.act[:concordance][:bool] #% --concordance, -w - op('concordance','Concordance') - end - if @opt.cmd =~/O/ #% -O open archive initiative, metadata harvesting - op('xml_md_oai_pmh_dc','OAI PMH') - end - if @opt.act[:po4a][:bool] #% --po4a, -P - op('po4a','po4a') - end - if @opt.act[:git][:bool] #% --git, -g sisu git - op('git','SiSU Git') - end - if @opt.cmd =~/T/ #% -T termsheet/standard form - SiSU_Help::Help.new('termsheet').help_request - @opt.files.each do |fns| - if FileTest.file?(fns) - @opt.fns=fns - case @opt.fns - when /\.(termsheet.rb)$/ - SiSU::Operations.new(@opt).termsheet - else #print "not processed --> ", fns, "\n" + def loop_files_on_given_option_do + if @opt.act[:images][:bool] #% --images, -j + OptionLoopFiles.new(@opt).loop_files_on_given_option do + requires('shared_images') + SiSU_Images::Source.new(@opt).read # -j shared_images.rb + end + end + if @opt.cmd =~/O/ #% -O open archive initiative, metadata harvesting + op('xml_md_oai_pmh_dc','OAI PMH') + end + if @opt.act[:po4a][:bool] #% --po4a, -P + OptionLoopFiles.new(@opt).loop_files_on_given_option do + requires('po4a') + SiSU_Po4a::Source.new(@opt).read # -P po4a.rb + end + end + if @opt.act[:git][:bool] #% --git, -g sisu git + OptionLoopFiles.new(@opt).loop_files_on_given_option do + #requires('git') + #fix + end + end + if @opt.cmd =~/T/ #% -T termsheet/standard form + SiSU_Help::Help.new('termsheet').help_request + @opt.files.each do |fns| + if FileTest.file?(fns) + @opt.fns=fns + case @opt.fns + when /\.(termsheet.rb)$/ + SiSU::Operations.new(@opt).termsheet + else #print "not processed --> ", fns, "\n" + end + else SiSU::Operations.new(@opt).not_found end - else SiSU::Operations.new(@opt).not_found end + SiSU::Operations.new.counter end - SiSU::Operations.new.counter - end - if @opt.cmd =~/k/ #% -T temporary tests - op('xml_scaffold','XML scaffold') - end - if @opt.act[:pdf][:bool] #% --pdf, -p latex/ texpdf - op('texpdf','LaTeX pdf') - end - if @opt.act[:manpage][:bool] #% --manpage, -i - op('manpage','manpage') - end - if @opt.act[:texinfo][:bool] #% --texinfo, -I - op('texinfo','TeX Info') - end - if @opt.act[:psql][:bool] #% --pg, -D DB postgresql - op('dbi','postgresql') - end - if @opt.act[:sqlite_discreet][:bool] #% --sqlite, -d DB sqlite - op('dbi_discreet','sqlite') - end - if @opt.act[:sqlite][:bool] #% --sqlite, -d DB sqlite - op('dbi','sqlite') - end - if @opt.act[:dal][:bool] #% --dal, -m embedded content - op('embedded','Embedded Content') - end - if @opt.act[:manifest][:bool] #% --manifest, -y - op('manifest','Manifest') - end - if @opt.act[:sitemap][:bool] #% --sitemap, -Y - op('sitemaps','Sitemap') - end - if @opt.mod.inspect !~/--harvest/ - if @opt.act[:scp][:bool] #% -r copy to remote server - op('remote','scp') + if @opt.cmd =~/k/ #% -T temporary tests + OptionLoopFiles.new(@opt).loop_files_on_given_option do + #requires('xml_scaffold') + #fix + end end - if @opt.act[:rsync][:bool] #% -R copy to remote server - op('remote','rsync') + if @opt.act[:psql][:bool] #% --pg, -D DB postgresql + op('dbi','postgresql') end - else + if @opt.act[:sqlite][:bool] #% --sqlite, -d DB sqlite + op('dbi','sqlite') + end + if @opt.act[:manifest][:bool] #% --manifest, -y + OptionLoopFiles.new(@opt).manifest_on_files_translated do + requires('manifest') + SiSU_Manifest::Source.new(@opt).read # -y manifest.rb + end + end + if @opt.act[:sitemap][:bool] #% --sitemap, -Y + OptionLoopFiles.new(@opt).loop_files_on_given_option do + requires('sitemaps') + SiSU_Sitemaps::Source.new(@opt).read # -Y sitemaps.rb + end + end + if @opt.mod.inspect !~/--harvest/ + if @opt.act[:scp][:bool] #% -r copy to remote server + op('remote','scp') + end + if @opt.act[:rsync][:bool] #% -R copy to remote server + op('remote','rsync') + end + else + end + op('urls','urls') + end + #if @opt.mod=~/^conf$/ # -C + if @opt.cmd=~/C/ # -C + requires('conf') # -s conf.rb + SiSU_Initialize::Source.new(@opt).read end - op('urls','urls') + each_file_loop_options + loop_files_on_given_option_do @msg,@msgs="\tsisu -W [to start ruby web-server on output directory]\n",nil unless @opt.cmd =~/q/ @tell.call.print_brown if @opt.cmd =~/[uUvVM]/ unless @opt.files.join.empty? if defined? @@env.processing_path.processing \ diff --git a/lib/sisu/v3/options.rb b/lib/sisu/v3/options.rb index 3db80231..0876604d 100644 --- a/lib/sisu/v3/options.rb +++ b/lib/sisu/v3/options.rb @@ -62,10 +62,10 @@ module SiSU_Commandline require_relative 'sysenv' # sysenv.rb @@base_path=nil class Options - attr_accessor :cmd,:mod,:act,:dir_structure_by,:f_pths,:files,:base_path,:base_stub,:sub_location,:paths,:lngs,:f_pth,:pth,:fns,:fnb,:fnc,:fncb,:lng,:lng_base,:what + attr_accessor :cmd,:mod,:act,:dir_structure_by,:f_pths,:files,:files_mod,:base_path,:base_stub,:sub_location,:paths,:lngs,:f_pth,:pth,:fno,:fns,:fnb,:fnc,:fncb,:lng,:lng_base,:what def initialize(a) - @cmd,@f_pth,@pth,@fns,@fnb,@fnc,@fncb,@what,@lng,@lng_base,@base_path,@base_stub,@sub_location='','','','','','','','','','','','','' - @f_pths,@files,@paths,@mod,@act=Array.new(5){[]} + @cmd,@f_pth,@pth,@fno,@fns,@fnb,@fnc,@fncb,@what,@lng,@lng_base,@base_path,@base_stub,@sub_location='','','','','','','','','','','','','','' + @f_pths,@files,@files_mod,@paths,@mod,@act=Array.new(5){[]} @env=SiSU_Env::InfoEnv.new @lng_base=@env.language_default_set @dir_structure_by=SiSU_Env::EnvCall.new.output_dir_structure.by? @@ -448,6 +448,14 @@ module SiSU_Commandline else { bool: false, set: :na, inst: '' } end + act[:processing_path]=if mod.inspect =~/"--processing-path=/ + base_pth=mod.join(';').gsub(/^.*--processing-path=['"]?(.+?)(?:['"]?;.+)?$/,'\1') + { bool: true, set: :on, inst: base_pth } + elsif mod.inspect =~/"--processing-path/ + { bool: true, set: :on, inst: @base_path } + else + { bool: false, set: :na, inst: nil } + end act[:dump]=if mod.inspect =~/"--dump=/ base_pth=mod.join(';').gsub(/^.*--dump=['"]?(.+?)(?:['"]?;.+)?$/,'\1') { bool: true, set: :on, inst: base_pth } @@ -753,6 +761,11 @@ module SiSU_Commandline def act @act end + def files_mod + files_mod=files + @files_mod=files_mod + @files_mod + end def f_pth @f_pth end @@ -768,6 +781,9 @@ module SiSU_Commandline def lng_base @lng_base end + def fno + @fno + end def fns @fns end @@ -780,12 +796,14 @@ module SiSU_Commandline end end def fnc - @fnc=if @fns =~/\.(?:ssm\.sst|ssm)$/; fnb + '.ssm.sst' + @fnc=if @fns =~/\.(?:ssm\.sst|ssm)$/ + fnb + '.ssm.sst' else @fns end end def fncb - @fncb=if @fns =~/(?:\~\S{2,3})?\.(?:ssm\.sst|ssm)$/; fnb + '.ssm.sst' + @fncb=if @fns =~/(?:\~\S{2,3})?\.(?:ssm\.sst|ssm)$/ + fnb + '.ssm.sst' else @fns.gsub(/(?:\~\S{2,3})?(\.sst)$/,'\1') end end |