#!/bin/perl
## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##     http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.

# Grammar HTML to a form of HTML suitable for cut&paste as fragments.

# Remove definition links.
# In <code class="gRuleHead">
# <a id="XXX" name="XXX"> ==> <a href="#XXX"> or id="fragXXX"
#
# ??
# In <code class="gRuleBody">
# <a href="#XXX"> => <a href="#fragXXX">

$DOC = 1 ;

if ( $DOC )
{
    print <<'EOF'
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
  <title>SPARQL Grammar Fragments</title>
  <link rel="stylesheet" type="text/css" href="http://www.w3.org/StyleSheets/TR/base.css" />
  <link rel="stylesheet" type="text/css" href="http://www.w3.org/2001/sw/DataAccess/rq23/local.css" />
  </head>
<body>
EOF
}

while(<>)
{
    s/\<a id="([^=\"]*)" name="([^=\"]*)"\>/<a href="#$1">/ ;
    print ;
}

if ( $DOC )
{
    print <<'EOF'
</body>
</html>
EOF
}
