<cad>
<partdef class="pcb" allow-empty="yes">
  <part class="component" number="*" external="yes">
  </part>

  <doc class="bom" name="bom">
    <insert chunk="data:chunk" as="part:component" >
      <link src="data:Designators" from="text" set="name"></link>
      <link src="data:Designators" repo="data:stdelec/data:designator"></link>
      <link src="data:Manufacturer" repo="data:vendor/data:pulled-mfg" condition="pull_only"></link>
      <link src="data:Manufacturer" repo="data:vendor/data:manufacturer" condition="push_only"></link>
      <link src="data:Manufacture Part Number" repo="data:vendor/data:partnumber"></link>
      <link src="data:Description" repo="data:vendor/data:pulled-desc" condition="pull_only"></link>
      <link src="data:Description" repo="data:stdelec/data:description" condition="push_only"></link>
      <link src="data:Package" repo="data:stdelec/data:footprint" condition="push_only"></link>
      <link src="data:Value" repo="data:stdelec/data:value"></link>
      <link src="data:Mouser Reference" repo="data:vendor/data:mouser/data:mouser-pn"></link>
      <link src="data:Digikey Reference" repo="data:vendor/data:digikey/data:digikey-pn"></link>
      <link src="data:Newark Reference" repo="data:vendor/data:newark/data:newark-pn"></link>
      <link src="data:Notes" repo="data:notes"></link>

      <insert chunk="data:chunk" as="data:unfiltered-footprints/data:string" fetch="footprint-filter">
	<link src="data:Package" from="text" set="text"></link>
	<link src="data:Package" from="pulled_from" set="name"></link>
      </insert>

    </insert>
  </doc>

  <doc class="eagle-sch" name="schematic">
    <insert chunk="data:eagle-partlist" as="part:component" 
	    condition="(
		       {'action'=> 'exclude', 'chunk'=>'data:package', 'regex'=>'^\s*$'}
		       )">
      <link src="data:part" from="text" set="name"></link>
      <link src="data:part" repo="data:stdelec/data:designator"></link>
      <link src="data:value" repo="data:stdelec/data:value"></link>

      <insert chunk="data:chunk" as="data:unfiltered-footprints/data:string" fetch="footprint-filter">
	<link src="data:package" from="text" set="text"></link>
	<link src="data:package" from="pulled_from" set="name"></link>
      </insert>

    </insert>
  </doc>

  <doc class="mouser-ordersheet">
   <insert chunk="data:chunk" as="part:component" 
	   condition="(                                                          
		      {'action'=>'do-not-push', 'repo'=>'data:vendor/data:mouser/data:mouser-pn','regex'=>'^\s*$'},
		      )">                                                            
<!-- you still need to link the chunk, even though you aren't -->
<!-- going to have the designator in the bom -->
      <link src="data:designator" from="text" set="name"></link>
      <link src="data:designator" repo="data:stdelec/data:designator"></link>
      <link src="data:mouser" repo="data:vendor/data:mouser/data:mouser-pn"></link>
    </insert>
  </doc>

  <doc class="digikey-ordersheet">
   <insert chunk="data:chunk" as="part:component" 
	   condition="(                                                          
		      {'action'=>'do-not-push', 'repo'=>'data:vendor/data:digikey/data:digikey-pn','regex'=>'^\s*$'},
                      {'action'=>'do-not-push', 'repo'=>'data:vendor/data:mouser/data:mouser-pn','regex'=>'\S+'},
		      )">                                                            
<!-- you still need to link the chunk, even though you aren't -->
<!-- going to have the designator in the bom -->
      <link src="data:designator" from="text" set="name"></link>
      <link src="data:designator" repo="data:stdelec/data:designator"></link>
      <link src="data:digikey" repo="data:vendor/data:digikey/data:digikey-pn"></link>
    </insert>
  </doc>

</partdef>

<partdef class="component">

<!-- copies the first non-empty key -->
<!--
  <fetch class="copy" name="stuff-fetch-dsc" key="('data:vendor/data:mouser/data:description','data:vendor/data:digikey/data:description')">
    <link src="data:value" repo="data:vendor/data:fetch-desc"/>
  </fetch>
-->

  <fetch class="copy-with-override" name="stuff-fetch-dsc" 
	 key="('data:vendor/data:mouser/data:description','data:vendor/data:digikey/data:description')"
	 triggers="('data:vendor/data:fetch-pref')"
	 aliases="('mouser'=>'1', 'digikey'=>'2')"
	 pref="data:vendor/data:fetch-pref">
    <link src="data:value" repo="data:vendor/data:fetch-desc"/>
  </fetch>

  <fetch class="copy" name="stuff-desc" key="('data:vendor/data:pulled-desc','data:vendor/data:fetch-desc')">
    <link src="data:value" repo="data:stdelec/data:description"/>
  </fetch>

  <fetch class="copy-with-override" name="stuff-fetch-mfg" 
	 key="('data:vendor/data:mouser/data:mfg','data:vendor/data:digikey/data:mfg')"
	 triggers="('data:vendor/data:fetch-pref')"
	 aliases="('mouser'=>'1', 'digikey'=>'2')"
	 pref="data:vendor/data:fetch-pref">
    <link src="data:value" repo="data:vendor/data:fetch-mfg"/>
  </fetch>

  <fetch class="copy" name="stuff-mfg" key="('data:vendor/data:pulled-mfg','data:vendor/data:fetch-mfg')">
    <link src="data:value" repo="data:vendor/data:manufacturer"/>
  </fetch>

  <fetch class="mfgpn-map" name="fetch-pref" key="('data:vendor/data:partnumber')">
    <link src="data:fetchpref" repo="data:vendor/data:fetch-pref"/>
  </fetch>

  <fetch class="filter" name="footprint-filter">
    <link src="data:footprint" repo="data:stdelec/data:footprint"/>
  </fetch>

  <fetch class="mouser" name="mouser-pn" key="('data:vendor/data:mouser/data:mouser-pn')">
    <link src="data:manufacturer" repo="data:vendor/data:mouser/data:mfg"/>
    <link src="data:manufacturer-pn" repo="data:vendor/data:partnumber"/>
    <link src="data:description" repo="data:vendor/data:mouser/data:description"/>
    <insert chunk="data:pricebreak" as="data:vendor/data:mouser/data:pricebreaks/data:pricebreak">
      <link src="data:qty" from="text" set="name"></link>
      <link src="data:qty" repo="data:qty"></link>
      <link src="data:unitprice" repo="data:unitprice"></link>
    </insert>
  </fetch>

  <fetch class="digikey" name="digikey-pn" key="('data:vendor/data:digikey/data:digikey-pn')">
    <link src="data:manufacturer" repo="data:vendor/data:digikey/data:mfg"/>
    <link src="data:manufacturer-pn" repo="data:vendor/data:partnumber"/>
    <link src="data:description" repo="data:vendor/data:digikey/data:description"/>
    <insert chunk="data:pricebreak" as="data:vendor/data:digikey/data:pricebreaks/data:pricebreak">
      <link src="data:qty" from="text" set="name"></link>
      <link src="data:qty" repo="data:qty"></link>
      <link src="data:unitprice" repo="data:unitprice"></link>
    </insert>
  </fetch>
  <data class="stdelec" required="no"></data>
  <data class="vendor" required="no"></data>
  <data class="unfiltered-footprints"></data>
  <data class="string" name="notes"></data>

</partdef>

<datadef class="stdelec">
  <data name="designator" class="string"></data>
  <data name="value" class="string"></data>
  <data name="description" class="string"></data>
  <data name="footprint" class="string"></data>
</datadef>


<datadef class="vendor">
  <data name="manufacturer" class="string"></data>
  <data name="partnumber" class="string"></data>
  <data name="fetch-pref" class="string"/>
  <data name="fetch-desc" class="string"/>
  <data name="pulled-desc" class="string"/>
  <data name="fetch-mfg" class="string"/>
  <data name="pulled-mfg" class="string"/>
  <data name="mouser" class="mouser"></data>
  <data name="digikey" class="digikey"></data>
  <data name="newark" class="newark"></data>
  <data name="stdprice" class="stdprice"></data>
</datadef>

<datadef class="mouser">

  <fetch class="minqty" name="mouser-minqty" key="('data:pricebreaks')">
    <link src="data:minqty" repo="data:minqty"/>
  </fetch>

<data name="mfg" class="string"></data>  
<data name="description" class="string"></data>
<data name="mouser-pn" class="string"></data>
<data class="pricebreaks" required="no"></data>
<data name="minqty" class="string"></data>
</datadef>

<datadef class="digikey">
  
  <fetch class="minqty" name="digikey-minqty" key="('data:pricebreaks')">
    <link src="data:minqty" repo="data:minqty"/>
  </fetch>

  <data name="mfg" class="string"></data>  
  <data name="description" class="string"></data>  
  <data name="digikey-pn" class="string"></data>
  <data class="pricebreaks" required="no"></data>
  <data name="minqty" class="string"></data>
</datadef>

<datadef class="newark">
  <data name="mfg" class="string"></data>  
  <data name="description" class="string"></data>  
  <data name="newark-pn" class="string"></data>
  <data class="pricebreaks" required="no"></data>
  <data name="minqty" class="string"></data>
</datadef>

<datadef class="unfiltered-footprints">
  <data class="string" fetch="footprint-filter" number="*"></data>
</datadef>

<!-- fetch will need insert rule similar to component -->
<!-- to set the name of the pricebreak records -->
<datadef class="pricebreaks">
<data class="pricebreak" number="*"></data>
</datadef>

<datadef class="pricebreak">
<data name="qty" class="number"></data>
<data name="unitprice" class="number"></data>
</datadef>

<datadef class="stdprice">
<data name="price-1" class="number" />
<data name="price-10" class="number" />
<data name="price-100" class="number" />
<data name="price-1000" class="number" />
</datadef>

 
<fetchdef class="mouser" handler="CAD::Fetch::Mouser" options="( 
							       'no-auto'=>0,
							       'cache'=>1
							       )">
</fetchdef>

<fetchdef class="digikey" handler="CAD::Fetch::Digikey" options="( 
							       'no-auto'=>0,
							       'cache'=>1
							       )">
</fetchdef>

<fetchdef class="mfgpn-map" handler="CAD::Fetch::CSV">
  <data name="filename" class="string">mfgpn-map.csv</data>
</fetchdef>

<!-- normally fetch will return a blank entry if the key isn't found -->
<!-- setting pass-through will return the key when this isn't found -->
<!-- which is useful for filters -->
<fetchdef class="filter" handler="CAD::Fetch::CSV" options="(
						     'pass-through'=>1,
						     'append-pulled-from'=>1,
						     )">
  <data name="filename" class="string">filter.csv</data>
</fetchdef>

<fetchdef class="minqty" handler="CAD::Fetch::Execute">{ 
#_print("in fetch::execute::minqty"); 
my $minqty;
my $qty;
foreach my $pb ($tag->children('data[@class="pricebreak"]')) {
#_print($pb->sprint);
$qty = $pb->first_child('data[@name="qty"]');
$qty = $qty->text;
#_print($qty);
#_print($minqty);
if(!defined($minqty) || ($qty &lt; $minqty)) { $minqty = $qty;}
}
_print("minqty: setting minqty to $minqty");
my %ret;
$ret{'minqty'} = $minqty;
return %ret;
}
</fetchdef>



<fetchdef class="copy-if-empty" handler="CAD::Fetch::Execute">{ 
#_print("in fetch::execute::copy-if-empty"); 
#_print($context->sprint);
#_print(to_xpath($args));
#_print($tag->text);

my $args = scalar($atts('args'));
my %ret;

my ($dest) = $context-&gt;get_xpath(to_xpath($args));

if(!($dest-&gt;text =~ /^\s*$/)) {
_print("copy-if-empty: destination $args not empty, with value from " . $dest-&gt;att('pulled_from') . " will not copy " . $tag-&gt;text);
} else {
#_print("copy-if-empty: setting $args to " . $tag-&gt;text);
$ret{'value'} = scalar($tag-&gt;text);
}

return %ret;
}
</fetchdef>


<!-- so if override equals 1, then the first element after the override source is used -->
<!-- if override equals 2 then the second is used -->
<!-- aliases is a hash that translates override source data into numbers -->
<fetchdef class="copy-with-override" handler="CAD::Fetch::Execute">{ 
#_print("in fetch::execute::copy-with-override"); 
#_print($context->sprint);

my %aliases = eval($atts{'aliases'});
#_print($aliases{'digikey'});
#_print($aliases{'mouser'});

my @keylist = eval($atts{'key'});
#_print("@keylist");

my $prefpath = $atts{'pref'};
#_print("$prefpath");

my %ret;
my $dest;
my $pref_idx;

my ($pref) = $context-&gt;get_xpath(to_xpath($prefpath));

#if(defined($pref)) { _print($pref-&gt;text); }

if(defined($pref)  &amp;&amp; !($pref-&gt;text =~ /^\s*$/)) {

#  _print("pref " . $pref-&gt;text);
  $pref_idx = $aliases{$pref-&gt;text}-1;
#  _print("$pref_idx");

  ($dest) = $context-&gt;get_xpath(to_xpath($keylist[$pref_idx]));
  if(defined($dest) &amp;&amp; !($dest-&gt;text =~ /^\s*$/)) {
#  _print("set dest override");
   $ret{'value'} = scalar($dest-&gt;text);
   return %ret;
  }

}

foreach my $key (@keylist) {
#_print($key);
($dest) = $context-&gt;get_xpath(to_xpath($key));
#if(defined($dest)) { _print($dest-&gt;sprint); }
if(defined($dest) &amp;&amp; !($dest-&gt;text =~ /^\s*$/)) {
#  _print("set dest");
  $ret{'value'} = scalar($dest-&gt;text);
  last;
}
}

return %ret;
}
</fetchdef>

<fetchdef class="copy" handler="CAD::Fetch::Execute">{ 
#_print("in fetch::execute::copy"); 
#_print($context->sprint);

my @keylist = eval($atts{'key'});
#_print("@keylist");

my %ret;

foreach my $key (@keylist) {
#_print($key);
my ($dest) = $context-&gt;get_xpath(to_xpath($key));
#if(defined($dest)) { _print($dest-&gt;sprint); }
if(defined($dest) &amp;&amp; !($dest-&gt;text =~ /^\s*$/)) {
#  _print("set dest");
 $ret{'value'} = scalar($dest-&gt;text);
#  _print($ret{'value'});
#  _print($dest-&gt;sprint);
  last;
}
}

return %ret;
}
</fetchdef>

<docdef class="bom" io="CAD::IO::bom" cfg="'format'=>'csv',
					   'chunker'=>'Designators',
					   'qty'=>'Qty',
					   'delim'=>' '">
  <data name="filename" class="string"></data>
</docdef>

<docdef class="mouser-ordersheet" io="CAD::IO::bom" 
	cfg="(
	     'format'=>'csv',
	     'chunker'=>'designator',
	     'default-header'=>'mouser,qty',
	     'no-header'=>1,
	     'multiply-qty'=>'data:order-qty',
	     'minqty'=>'data:vendor/data:mouser/data:minqty'
	     )" 
	options="(
		 'push-only'=>1,
		 )">
  <data name="filename" class="string"></data>
  <data name="order-qty" class="number"></data>
</docdef>


<docdef class="digikey-ordersheet" io="CAD::IO::bom" 
	cfg="(
	     'format'=>'csv',
	     'chunker'=>'designator',
	     'default-header'=>'qty,digikey',
	     'no-header'=>1,
	     'multiply-qty'=>'data:order-qty',
	     'minqty'=>'data:vendor/data:digikey/data:minqty'
	     )" 
	options="(
		 'push-only'=>1,
		 )">
  <data name="filename" class="string"></data>
  <data name="order-qty" class="number"></data>
</docdef>

<docdef class="eagle-sch" io="CAD::IO::eagle">
  <data name="filename" class="string"></data>
</docdef>

</cad>
