Переглядати та "вирізати" тільки з джерельного коду цієї сторінки!

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 20060223 wiki2man.py hse@ukr.net http://docs.linux.org.ua/dlou/index.php/Man
############################################################################
#    Copyright © 2005 by hse                                               #
#    hse@ukr.net                                                           #
#                                                                          #
#    This program is free software; you can redistribute it and#or modify  #
#    it under the terms of the GNU General Public License as published by  #
#    the Free Software Foundation; either version 2 of the License, or     #
#    (at your option) any later version.                                   #
#                                                                          #
#    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 General Public License for more details.                          #
#                                                                          #
#    You should have received a copy of the GNU 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.             #
############################################################################
#
# Script convert wiki formated text to roff format used by man pages.
# You can chose encoding of output roff file to suite any
# GNU/Linux distributions and yours native language.
# For convenient usage use makeman.sh instead of running this script directly.
# 
# version - 0.2.4
# 
# ХАЙ UNIX ЗАГОВОРИТЬ УКРАЇНСЬКОЮ!!!
#

# For convenient usage use makeman.sh instead of running this script directly.

########## Read command line arguments ##########

# 1 - language;
# 2 - directory of wiki formated man page;
# 3 - output directory;
# 4 - name of file as you type to man command;
# 5 - man number 1-8;
# 6 - last modification time or version of wiki file;
# 7 - release version;
# 8 - list of manual page encoding "utf8 koi8-u ...".
import sys
lang=sys.argv[1]; DirIn=sys.argv[2]; DirOut=sys.argv[3]; File=sys.argv[4]; man=sys.argv[5]; date=sys.argv[6]; release=sys.argv[7]; manencoding=sys.argv[8:]
FileName=File+'.'+man; PathIn=DirIn+FileName


########## Define some functions ##########

def SH (i):
    """reformatting .SH"""
    string = WorkList [i]; l = len(string)-2; r = 0
    while string [0] == '=' and string [l] == '=':
        WorkList [i] = string [1:l]
        string = WorkList [i]; l=len(string)-1; r=r+1
    if r == 2:
        WorkList [i] = '\n.SH "'+string+'"\n.PP\n'
    else:
        WorkList [i] = '\n.SS "'+string+'"\n.PP\n'

def TP (i):
    """reformatting .TP"""
    string = WorkList [i]
    l=0; string1 = WorkList [i+l]
    while string1[0] == ';':
        j=0; finish=0; nexcl=1; s=0
        while len(string) > j and finish == 0:
            if string [j:j+8] == '<nowiki>':
                nexcl=0; j=j+7
            elif string [j:j+9] == '':
                nexcl=1; j=j+8
            elif string [j:j+4] == '<!--':
                nexcl=0; j=j+3
            elif string [j:j+3] == '-->':
                nexcl=1; j=j+2
            if string [j] == ':':
                s=1
            finish=nexcl*s; s=0; j=j+1
        if len(string) == j:
            WorkList [i] = '.TP\n.B '+string[1:]
        elif string [j-1] == ':':
            WorkList [i] = '.TP\n.B '+string[1:j-1]+'\n'+string[j:]
        l=l+1; string1 = WorkList [i+l]
    while string1[0] == ':':
        WorkList [i+l] = '.br\n'+string1[1:]
        l=l+1; string1 = WorkList [i+l]


########## Read wiki formated file ##########

FileIn=open(PathIn, 'r')

string='\n'
string=unicode(string, 'utf-8')
WorkList = [ string ]

# variable WorkList has list of elements of lines from wiki file
string='F'; i=0
while string!='':
    string=FileIn.readline()
    string=unicode(string, 'utf-8')
    WorkList.append(string)

FileIn.close()


########## Reformatting from wiki to roff ##########

# TH:
string = WorkList[1]; title=date; version=date
if len(string) > 2 and string[0] != '=' and string[:4] != '<!--':
    i=0
    while len(string) > i and string[i] != '(':
        i=i+1
    title=string[:i-1]
    if i <= len(string)-1:
        version=string[i+1:len(string)-2]+' '+date
    WorkList.pop(1)
WorkList.pop(0)

i=0; tabacc=-1; tab=0; tab2=0; col=0; nf=0; excl=0; nowiki=0
while len(WorkList) > i:
    string = WorkList [i]
    if len(string) > 1:
        # reformatting "nowiki"
        if string [:9] == '</nowiki>':
            WorkList [i] = string[9:]
            nowiki=0

        if nowiki == 0:
            # reformatting "pre"
            if string [:6] == '

': WorkList [i] ='\n.fi\n'+string[6:] nf=0

        # reformatting "tt"
        if string[:4] == '`':
            WorkList[i]='\n.nf\n'+string[4:]
            nf=2
        elif string[:5] == '`':
            WorkList[i]='\n.fi\n'+string[5:]
            nf=0

        # reformatting " "
        if string [0] == ' ':
            if nf == 0:
                nf=1; WorkList [i] ='\n.nf\n'+string
            elif nf == 1:
                WorkList [i] =string
        else:
            if nf == 1:
                nf=0; WorkList [i] = '\n.fi\n'
                WorkList.insert (i+1, string)

    string = WorkList [i]
    if nf != 2 and nowiki == 0:
        # reformatting excluded text 
        if excl == 1:
            WorkList[i] ='.\" '+string[0:]
            string = WorkList [i]

        if nf == 0:
            # format titles
            if string [0] == '=' and string[len(string)-2] == '=':
                SH(i)

            # format descriptions
            elif string [0] == ';':
                TP(i)

            # format descriptions
            elif string [0] == ':':
                WorkList[i] = '.br\n    '+string [1:];

            # format descriptions
            elif string [0] == '*':
                WorkList[i] = '.br\n  * '+string [1:];

            # format tables 2
            elif string [:2] == '{|':
                if tab2 > 0:
                    WorkList[i] = '.RS\n'; tab2=tab2+1; col=0
                else:
                    WorkList[i] = _; tab2=1_

            elif string [:2] == '|-' and tab2 > 0:
                WorkList[i] = _; col=0_

            elif string [:2] == '|}':
                if tab2 == 1:
                    WorkList[i] = '.SS\n'; col=0; tab2=0
                elif tab2 > 1:
                    WorkList[i] = '.RE\n'; col=0; tab2=tab2-1

            elif string [:8] == '|valign=' and tab2 > 0:
                j=9
                while len(string) > j and string[j]!='|':
                    j=j+1
                if string [j] == '|':
                    if col == 0:
                        WorkList[i]='.TP\n'+string[j+1:]; col=1
                    elif col > 0:
                        WorkList[i]=string[j+1:]; col=2
                    elif col > 1:
                        WorkList[i]='.PP\n'+string[j+1:]; col=col+1

            elif string [:1] == '|' and tab2 > 0:
                if col == 0:
                    WorkList[i]='.TP\n'+string[1:]; col=1
                elif col == 1:
                    WorkList[i]=string[1:]; col=col+1
                elif col > 1:
                    WorkList[i]='.PP\n'+string[1:]; col=col+1

            # delete wiki "Category:"
            elif string [:11] == '[[Category:':
                WorkList [i] = 
                #WorkList.pop(i)
                #break

    string = WorkList[i];
    j=0; B=-1; I=-1; U=-1; K=-1; K1=-1
    while len(string) > j:
        # reformatting excluded text 
        if string [j:j+4] == _:_
            string=string[:j]+'\n'+string[j+3:]
            excl=0; j=j-1

        if excl == 0:
            # Change some symbols: — « » — © "   & < > 
            if string [j:j+8] == '—':
                string=string[:j]+unicode('—', 'utf-8')+string[j+8:]
            elif string [j:j+7] == '«':
                string=string[:j]+unicode('«', 'utf-8')+string[j+7:]
            elif string [j:j+7] == '»':
                string=string[:j]+unicode('»', 'utf-8')+string[j+7:]
            elif string [j:j+7] == '—':
                string=string[:j]+unicode('—', 'utf-8')+string[j+7:]
            elif string [j:j+6] == '©':
                string=string[:j]+unicode('©', 'utf-8')+string[j+6:]
            elif string [j:j+6] == '"':
                string=string[:j]+unicode('"', 'utf-8')+string[j+6:]
            elif string [j:j+6] == ' ':
                string=string[:j]+unicode(' ', 'utf-8')+string[j+6:]
            elif string [j:j+5] == '&':
                string=string[:j]+unicode('&', 'utf-8')+string[j+5:]
            elif string [j:j+4] == '<':
                string=string[:j]+unicode('<', 'utf-8')+string[j+4:]
            elif string [j:j+4] == '>':
                string=string[:j]+unicode('>', 'utf-8')+string[j+4:]

            # reformatting "-" or "\"
            elif string[j:j+1] == '-':
                string=string[0:j] + '\\' + string[j:]
                j=j+1
            elif string[j:j+1] == '\\':
                string=string[0:j] + '\e' + string[j+1:]
                j=j+1

            # reformatting "nowiki"
            elif string [j:j+8] == '':
                nowiki=1
                if nf != 2:
                    string=string[:j]+string[j+8:]
                    j=j
            elif string [j:j+9] == '':
                nowiki=0
                if nf != 2:
                    string=string[:j]+string[j+9:]
                    j=j

            if nowiki == 0:
                if string[j:j+5] == "'":
                    if B != -1 and I == -1 :
                        if tabacc == 1:
                            string=string[:B]+'"'+string[B+3:j]+'"'+string[j+3:]
                            j=j-4; B=-1
                        else:
                            string=string[:B]+'\\fB'+string[B+3:j]+'\\fR'+string[j+3:]
                            j=j+1; B=-1
                    if I != -1 and B == -1:
                            string=string[:I]+'\\fI'+string[I+2:j]+'\\fR'+string[j+2:]
                            j=j+2; I=-1

                # reformatting boolean text 1
                elif string[j:j+3] == "**":**
                    if B == -1:
                        B=j
                    else:
                        if tabacc == 1:
                            string=string[:B]+'"'+string[B+3:j]+'"'+string[j+3:]
                            j=j-4; B=-1
                        elif j+3-B > 5:
                            string=string[:B]+'\\fB'+string[B+3:j]+'\\fR'+string[j+3:]
                            j=j+1; B=-1

                # reformatting italic text 1
                elif string[j:j+2] == "_" and B == -1:_
                    if I == -1:
                        I=j
                    else:
                        if j+3-I > 2:
                            string=string[:I]+'\\fI'+string[I+2:j]+'\\fR'+string[j+2:]
                            j=j+2; I=-1

                # reformatting "pre"
                elif string [j:j+5] == '
':
                        string=string[:j]+'\n.nf\n'+string[j+5:]
                        nf=2; j=j+3
                    elif string [j:j+6] == '

': string=string[:j]+'\n.fi\n'+string[j+6:] nf=0; j=j+3

                # reformatting "code"
                elif string [j:j+6] == '`':
                    string=string[:j]+'\n.nf\n'+string[j+6:]
                    nf=2; j=j+3
                elif string [j:j+7] == '`':
                    string=string[:j]+'\n.fi\n'+string[j+7:]
                    nf=0; j=j+3

                if  nf == 0:
                    # reformatting boolean text 2
                    if string[j:j+3] == '**':
                        string=string[:j]+'\\fB'+string[j+3:]
                        j=j+2
                    elif string[j:j+4] == '**':
                        string=string[:j]+'\\fR'+string[j+4:]
                        j=j+2

                    # reformatting italic text 2
                    elif string[j:j+3] == '_':
                        string=string[:j]+'\\fI'+string[j+3:]
                        j=j+2
                    elif string[j:j+4] == '_':
                        string=string[:j]+'\\fR'+string[j+4:]
                        j=j+2

                    # format undelined text
                    elif string[j:j+3] == '<u>':
                        U=j

                    elif string[j:j+4] == '</u>' and U != -1:
                        string=string[:U]+'\\fB\\fI'+string[U+3:j]+'\\fB\\fR'+string[j+4:]
                        j=j+7; U=-1

                    # brack line 1
                    elif string[j:j+4] == '<br />':
                        string=string[0:j] + '\n.br ' + string[j+4:]; j=j+2

                    # brack line 2
                    elif string[j:j+6] == '<br />':
                        string=string[0:j] + '\n.PP\n' + string[j+6:]; j=j+2

                    # format tables 1
                    elif string [j:j+6] == '
j and string[j]!='>': j=j+1 if string [j] == '>': tabacc=tabacc+1 if tabacc == 1: string=string[:Ktab]+string[j+1:] j=Ktab-1 else: string=string[:Ktab]+'\n.PP\n'+string[j+1:] j=Ktab+3 else: j=Ktab elif string [j:j+4] == '

j and string[j]!='>': j=j+1 if string [j] == '>': tabacc=0 string=string[:Ktab]+'\n.SS '+string[j+1:] j=Ktab+4 else: j=Ktab

                    elif string [j:j+4] == ' j and string[j]!='>':
                            j=j+1
                        if string [j] == '>':
                            string=string[:Ktab]+string[j+1:]
                            j=Ktab-1
                        else:
                            j=Ktab

                    elif string [j:j+7] == ' j and string[j] != '>':
                            j=j+1
                        if string [j] == '>':
                            string=string[:tab]+string[j+1:]
                            j=tab-1; tab=0
                        else:
                            j=tab; tab=1

                    # format tabel 2 {| |- | || |}
                    elif string [j:j+2] == '||' and tab2 > 0 and col > 0:
                        string=string[:j]+'\n'+string[j+2:]; col=col+1

                    # format div ????
                    elif string [j:j+4] == '
j and string[j] != '>': j=j+1 if string [j] == '>': string=string[:div]+string[j+1:] j=div-1 else: j=div elif string [j:j+5] == '

j and string[j] != '>': j=j+1 if string [j] == '>': string=string[:div]+string[j+1:] j=div-1 else: j=div

                    # format internal links
                    elif string[j:j+2] == '[[':
                        K=j
                    elif string[j] == '|':
                        if K != -1:
                            K1=j
                    elif string[j:j+2] == ']]':
                        if K != -1 and K1 != -1:
                            string=string[:K]+string[K1+1:j]+string[j+2:]
                            j=j-K1+K-2; K=-1; K1=-1
                        elif K != -1 and K1 == -1:
                            string=string[:K]+string[K+2:j]+string[j+2:]
                            j=j-4; K=-1
        j=j+1
WorkList[i]= string
i=i+1
  1. Make title

string='.\" '+unicode('©', 'utf-8')+' 2005 DLOU docs@linux.org.ua\n.\" URL <http://docs.linux.org.ua/dlou/index.php/Man\n.>"\n.\" Permission is granted to copy, distribute and/or modify this document\n.\" under the terms of the GNU Free Documentation License, Version 1.2\n.\" or any later version published by the Free Software Foundation;\n.\" with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. \n.\"\n.\" A copy of the license is included as a file called COPYING in the\n.\" main directory of the manpeges-* source package.\n.\"\n.\" This manpage has been automatically generated by wiki2man.py\n.\" This tool can be found at:\n.\" <http://docs.linux.org.ua/dlou/index.php/'+unicode('Редагування сторінок підручника', 'utf-8')+'#wiki_to_man>\n.\" Please send any bug reports, improvements, comments, patches, etc. to hse@ukr.net.\n\n.TH "'+File+'" "'+man+'" "'+version+'" "'+unicode('©', 'utf-8')+' 2006 DLOU, GNU FDL" "'+title+'"\n' string=string.encode('utf-8') string=unicode(string, 'utf-8') WorkList.insert(0,string)

  1. Output roff formatted file ##########

  2. Output Unicode cod to standart out:

  3. print WorkList[0:]

  4. Output encoded symbols:

string= for i in range(len(WorkList)): string =string + WorkList[i]

  1. Delete empty lines and some think else..., just for making roff code beter:

i=0 while len(string) > i: if string[i:i+6] == '\n.SS \n': string=string[:i+5]+string[i+6:] if string[i:i+5] == '\n\n\n\n\n': string=string[:i]+string[i+3:] if string[i:i+4] == '\n\n\n\n': string=string[:i]+string[i+2:] if string[i:i+3] == '\n\n\n': string=string[:i]+string[i+1:] if string[i:i+2] == '\n\n': string=string[:i]+string[i+0:] if string[i:i+2] == '\n\n': string=string[:i]+string[i+0:] i=i+1

for i in manencoding: # Output to standart out: #print string.encode(i)

# Output to file:
PathOut=DirOut+'/manpages-'+lang+'-'+i+'-'+release+'/man'+man+'/'+FileName
FileOut = open(PathOut, 'w')
StringOut = string.encode(i)
FileOut.write(StringOut)
FileOut.close()
[l_sp_9] [Tankless](http://top20man.in.ua/tankless.htm) [Heater Water](http://top20man.in.ua/heater-water.htm) [Heater Tankless Water](http://top20man.in.ua/heater-tankless-water.htm) [Heater Hot Water](http://top20man.in.ua/heater-hot-water.htm) [Heater Hot Tankless Water](http://top20man.in.ua/heater-hot-tankless-water.htm) [Electric Heater Tankless Water](http://top20man.in.ua/electric-heater-tankless-water.htm) [Electric Heater Water](http://top20man.in.ua/electric-heater-water.htm) [Heater Solar Water](http://top20man.in.ua/heater-solar-water.htm) [Gas Heater Water](http://top20man.in.ua/gas-heater-water.htm) [Gas Heater Hot Water](http://top20man.in.ua/gas-heater-hot-water.htm) [Bosch Heater Tankless Water](http://top20man.in.ua/bosch-heater-tankless-water.htm) [Heater Rheem Water](http://top20man.in.ua/heater-rheem-water.htm) [Electric Heater Hot Water](http://top20man.in.ua/electric-heater-hot-water.htm) [Bed Heater Water](http://top20man.in.ua/bed-heater-water.htm) [Heater Rinnai Tankless Water](http://top20man.in.ua/heater-rinnai-tankless-water.htm) [Gas Heater Tankless Water](http://top20man.in.ua/gas-heater-tankless-water.htm) [Demand Heater Water](http://top20man.in.ua/demand-heater-water.htm) [Heater Richmond Water](http://top20man.in.ua/heater-richmond-water.htm) [Heater Services Water](http://top20man.in.ua/heater-services-water.htm) [Heater State Water](http://top20man.in.ua/heater-state-water.htm) [Heater Rinnai Water](http://top20man.in.ua/heater-rinnai-water.htm) [Bosch Heater Water](http://top20man.in.ua/bosch-heater-water.htm) [Ao Heater Smith Water](http://top20man.in.ua/ao-heater-smith-water.htm) [Heater Water Whirlpool](http://top20man.in.ua/heater-water-whirlpool.htm) [Bradford Heater Water White](http://top20man.in.ua/bradford-heater-water-white.htm) [Heater Repair Water](http://top20man.in.ua/heater-repair-water.htm) [Electric Heater Hot Tankless Water](http://top20man.in.ua/electric-heater-hot-tankless-water.htm) [Gas Heater Hot Tankless Water](http://top20man.in.ua/gas-heater-hot-tankless-water.htm) [Dealer Heater Water](http://top20man.in.ua/dealer-heater-water.htm) [40 Electric Gal Heater Water](http://top20man.in.ua/40-electric-gal-heater-water.htm) [Heater Hot Instant Water](http://top20man.in.ua/heater-hot-instant-water.htm) [American Heater Water](http://top20man.in.ua/american-heater-water.htm) [Heater O Smith Water](http://top20man.in.ua/heater-o-smith-water.htm) [Ge Heater Water](http://top20man.in.ua/ge-heater-water.htm) [Heater Hot Solar Water](http://top20man.in.ua/heater-hot-solar-water.htm) [Demand Heater Hot Water](http://top20man.in.ua/demand-heater-hot-water.htm) [Heater Rv Water](http://top20man.in.ua/heater-rv-water.htm) [Heater Paloma Tankless Water](http://top20man.in.ua/heater-paloma-tankless-water.htm) [Heater Instant Water](http://top20man.in.ua/heater-instant-water.htm) [Heater Paloma Water](http://top20man.in.ua/heater-paloma-water.htm) [Heater Propane Water](http://top20man.in.ua/heater-propane-water.htm) [Atwood Heater Water](http://top20man.in.ua/atwood-heater-water.htm) [Heater Noritz Water](http://top20man.in.ua/heater-noritz-water.htm) [Heater Hot Rheem Water](http://top20man.in.ua/heater-hot-rheem-water.htm) [Commercial Heater Water](http://top20man.in.ua/commercial-heater-water.htm) [Heater Rheem Tankless Water](http://top20man.in.ua/heater-rheem-tankless-water.htm) [Heater Noritz Tankless Water](http://top20man.in.ua/heater-noritz-tankless-water.htm) [Heater Marathon Water](http://top20man.in.ua/heater-marathon-water.htm) [Gas Heater Natural Water](http://top20man.in.ua/gas-heater-natural-water.htm) [Heater Review Tankless Water](http://top20man.in.ua/heater-review-tankless-water.htm) [Heater Polaris Water](http://top20man.in.ua/heater-polaris-water.htm) [Heater Installation Water](http://top20man.in.ua/heater-installation-water.htm) [Heater Indirect Water](http://top20man.in.ua/heater-indirect-water.htm) [Heater Hot Price Water](http://top20man.in.ua/heater-hot-price-water.htm) [Heater Reliance Water](http://top20man.in.ua/heater-reliance-water.htm) [Heat Heater Pump Water](http://top20man.in.ua/heat-heater-pump-water.htm) [Demand Electric Heater Water](http://top20man.in.ua/demand-electric-heater-water.htm) [Heater Part Water](http://top20man.in.ua/heater-part-water.htm) [Heater Hot Rinnai Water](http://top20man.in.ua/heater-hot-rinnai-water.htm) [A O Heater Smith Water](http://top20man.in.ua/a-o-heater-smith-water.htm) [Heater Tankless Titan Water](http://top20man.in.ua/heater-tankless-titan-water.htm) [Heater Lochinvar Water](http://top20man.in.ua/heater-lochinvar-water.htm) [Heater Suburban Water](http://top20man.in.ua/heater-suburban-water.htm) [Heater Problem Water](http://top20man.in.ua/heater-problem-water.htm) [Heater Hot Rv Water](http://top20man.in.ua/heater-hot-rv-water.htm) [Gas Heater Natural Tankless Water](http://top20man.in.ua/gas-heater-natural-tankless-water.htm) [Heater Renco Tankless Water](http://top20man.in.ua/heater-renco-tankless-water.htm) [Heater Takagi Tankless Water](http://top20man.in.ua/heater-takagi-tankless-water.htm) [Heater Hot Repair Water](http://top20man.in.ua/heater-hot-repair-water.htm) [Heater Hot Rinnai Tankless Water](http://top20man.in.ua/heater-hot-rinnai-tankless-water.htm) [Heater Timer Water](http://top20man.in.ua/heater-timer-water.htm) [Heater Hot Water Whirlpool](http://top20man.in.ua/heater-hot-water-whirlpool.htm) [Heater Point Use Water](http://top20man.in.ua/heater-point-use-water.htm) [Bosch Electric Heater Tankless Water](http://top20man.in.ua/bosch-electric-heater-tankless-water.htm) [Heater Titan Water](http://top20man.in.ua/heater-titan-water.htm) [Electric Heater Powerstar Tankless Water](http://top20man.in.ua/electric-heater-powerstar-tankless-water.htm) [Bradford Heater Hot Water White](http://top20man.in.ua/bradford-heater-hot-water-white.htm) [Heater Select State Water](http://top20man.in.ua/heater-select-state-water.htm) [Heater Ruud Water](http://top20man.in.ua/heater-ruud-water.htm) [Heater Sears Water](http://top20man.in.ua/heater-sears-water.htm) [Heater Takagi Water](http://top20man.in.ua/heater-takagi-water.htm) [Ariston Heater Water](http://top20man.in.ua/ariston-heater-water.htm) [Bosch Heater Hot Tankless Water](http://top20man.in.ua/bosch-heater-hot-tankless-water.htm) [Heater Instantaneous Water](http://top20man.in.ua/heater-instantaneous-water.htm) [Heater Price Water](http://top20man.in.ua/heater-price-water.htm) [Heater Power Vent Water](http://top20man.in.ua/heater-power-vent-water.htm) [Heater Install Water](http://top20man.in.ua/heater-install-water.htm) [Bosch Gas Heater Tankless Water](http://top20man.in.ua/bosch-gas-heater-tankless-water.htm) [Heater Portable Water](http://top20man.in.ua/heater-portable-water.htm) [Heater Home Mobile Water](http://top20man.in.ua/heater-home-mobile-water.htm) [Build Heater Solar Water](http://top20man.in.ua/build-heater-solar-water.htm) [Fired Heater Water Wood](http://top20man.in.ua/fired-heater-water-wood.htm) [Drain Heater Water](http://top20man.in.ua/drain-heater-water.htm) [Heater Renai Tankless Water](http://top20man.in.ua/heater-renai-tankless-water.htm) [Heater Hot Problem Water](http://top20man.in.ua/heater-hot-problem-water.htm) [Heater Propane Tankless Water](http://top20man.in.ua/heater-propane-tankless-water.htm) [Baseboard Heater Hot Water](http://top20man.in.ua/baseboard-heater-hot-water.htm) [Heater Maintenance Water](http://top20man.in.ua/heater-maintenance-water.htm) [Heater Review Water](http://top20man.in.ua/heater-review-water.htm) [Gas Heater Rheem Water](http://top20man.in.ua/gas-heater-rheem-water.htm) [Bosch Heater Hot Water](http://top20man.in.ua/bosch-heater-hot-water.htm)